ZGlmZiAtLWdpdCBhL2xpYm0vQW5kcm9pZC5tayBiL2xpYm0vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjA5MjJkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTg5IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworbGlibV9jb21tb25fc3JjX2ZpbGVzOj0gXAorCWlzaW5mLmMgIFwKKyAgICAgICAgZnBjbGFzc2lmeS5jIFwKKwlic2RzcmMvYl9leHAuYyBcCisJYnNkc3JjL2JfbG9nLmMgXAorCWJzZHNyYy9iX3RnYW1tYS5jIFwKKwlzcmMvZV9hY29zLmMgXAorCXNyYy9lX2Fjb3NmLmMgXAorCXNyYy9lX2Fjb3NoLmMgXAorCXNyYy9lX2Fjb3NoZi5jIFwKKwlzcmMvZV9hc2luLmMgXAorCXNyYy9lX2FzaW5mLmMgXAorCXNyYy9lX2F0YW4yLmMgXAorCXNyYy9lX2F0YW4yZi5jIFwKKwlzcmMvZV9hdGFuaC5jIFwKKwlzcmMvZV9hdGFuaGYuYyBcCisJc3JjL2VfY29zaC5jIFwKKwlzcmMvZV9jb3NoZi5jIFwKKwlzcmMvZV9leHAuYyBcCisJc3JjL2VfZXhwZi5jIFwKKwlzcmMvZV9mbW9kLmMgXAorCXNyYy9lX2Ztb2RmLmMgXAorCXNyYy9lX2dhbW1hLmMgXAorCXNyYy9lX2dhbW1hX3IuYyBcCisJc3JjL2VfZ2FtbWFmLmMgXAorCXNyYy9lX2dhbW1hZl9yLmMgXAorCXNyYy9lX2h5cG90LmMgXAorCXNyYy9lX2h5cG90Zi5jIFwKKwlzcmMvZV9qMC5jIFwKKwlzcmMvZV9qMGYuYyBcCisJc3JjL2VfajEuYyBcCisJc3JjL2VfajFmLmMgXAorCXNyYy9lX2puLmMgXAorCXNyYy9lX2puZi5jIFwKKwlzcmMvZV9sZ2FtbWEuYyBcCisJc3JjL2VfbGdhbW1hX3IuYyBcCisJc3JjL2VfbGdhbW1hZi5jIFwKKwlzcmMvZV9sZ2FtbWFmX3IuYyBcCisJc3JjL2VfbG9nLmMgXAorCXNyYy9lX2xvZzEwLmMgXAorCXNyYy9lX2xvZzEwZi5jIFwKKwlzcmMvZV9sb2dmLmMgXAorCXNyYy9lX3Bvdy5jIFwKKwlzcmMvZV9wb3dmLmMgXAorCXNyYy9lX3JlbV9waW8yLmMgXAorCXNyYy9lX3JlbV9waW8yZi5jIFwKKwlzcmMvZV9yZW1haW5kZXIuYyBcCisJc3JjL2VfcmVtYWluZGVyZi5jIFwKKwlzcmMvZV9zY2FsYi5jIFwKKwlzcmMvZV9zY2FsYmYuYyBcCisJc3JjL2Vfc2luaC5jIFwKKwlzcmMvZV9zaW5oZi5jIFwKKwlzcmMvZV9zcXJ0LmMgXAorCXNyYy9lX3NxcnRmLmMgXAorCWFybS9mZW52LmMgXAorCXNyYy9rX2Nvcy5jIFwKKwlzcmMva19jb3NmLmMgXAorCXNyYy9rX3JlbV9waW8yLmMgXAorCXNyYy9rX3Npbi5jIFwKKwlzcmMva19zaW5mLmMgXAorCXNyYy9rX3Rhbi5jIFwKKwlzcmMva190YW5mLmMgXAorCXNyYy9zX2FzaW5oLmMgXAorCXNyYy9zX2FzaW5oZi5jIFwKKwlzcmMvc19hdGFuLmMgXAorCXNyYy9zX2F0YW5mLmMgXAorCXNyYy9zX2NicnQuYyBcCisJc3JjL3NfY2JydGYuYyBcCisJc3JjL3NfY2VpbC5jIFwKKwlzcmMvc19jZWlsZi5jIFwKKwlzcmMvc19jZWlsbC5jIFwKKwlzcmMvc19jb3B5c2lnbi5jIFwKKwlzcmMvc19jb3B5c2lnbmYuYyBcCisJc3JjL3NfY29zLmMgXAorCXNyYy9zX2Nvc2YuYyBcCisJc3JjL3NfZXJmLmMgXAorCXNyYy9zX2VyZmYuYyBcCisJc3JjL3NfZXhwMi5jIFwKKwlzcmMvc19leHAyZi5jIFwKKwlzcmMvc19leHBtMS5jIFwKKwlzcmMvc19leHBtMWYuYyBcCisJc3JjL3NfZmFic2YuYyBcCisJc3JjL3NfZmRpbS5jIFwKKwlzcmMvc19maW5pdGUuYyBcCisJc3JjL3NfZmluaXRlZi5jIFwKKwlzcmMvc19mbG9vci5jIFwKKwlzcmMvc19mbG9vcmYuYyBcCisJc3JjL3NfZmxvb3JsLmMgXAorCXNyYy9zX2ZtYS5jIFwKKwlzcmMvc19mbWFmLmMgXAorCXNyYy9zX2ZtYXguYyBcCisJc3JjL3NfZm1heGYuYyBcCisJc3JjL3NfZm1heGwuYyBcCisJc3JjL3NfZm1pbi5jIFwKKwlzcmMvc19mbWluZi5jIFwKKwlzcmMvc19mbWlubC5jIFwKKwlzcmMvc19mcmV4cGYuYyBcCisJc3JjL3NfaWxvZ2IuYyBcCisJc3JjL3NfaWxvZ2JmLmMgXAorCXNyYy9zX2lsb2dibC5jIFwKKwlzcmMvc19pc2Zpbml0ZS5jIFwKKwlzcmMvc19pc25vcm1hbC5jIFwKKwlzcmMvc19sbHJpbnQuYyBcCisJc3JjL3NfbGxyaW50Zi5jIFwKKwlzcmMvc19sbHJvdW5kLmMgXAorCXNyYy9zX2xscm91bmRmLmMgXAorCXNyYy9zX2xscm91bmRsLmMgXAorCXNyYy9zX2xvZzFwLmMgXAorCXNyYy9zX2xvZzFwZi5jIFwKKwlzcmMvc19sb2diLmMgXAorCXNyYy9zX2xvZ2JmLmMgXAorCXNyYy9zX2xyaW50LmMgXAorCXNyYy9zX2xyaW50Zi5jIFwKKwlzcmMvc19scm91bmQuYyBcCisJc3JjL3NfbHJvdW5kZi5jIFwKKwlzcmMvc19scm91bmRsLmMgXAorCXNyYy9zX21vZGZmLmMgXAorCXNyYy9zX25lYXJieWludC5jIFwKKwlzcmMvc19uZXh0YWZ0ZXIuYyBcCisJc3JjL3NfbmV4dGFmdGVyZi5jIFwKKwlzcmMvc19uZXh0dG93YXJkZi5jIFwKKwlzcmMvc19yZW1xdW8uYyBcCisJc3JjL3NfcmVtcXVvZi5jIFwKKwlzcmMvc19yaW50LmMgXAorCXNyYy9zX3JpbnRmLmMgXAorCXNyYy9zX3JvdW5kLmMgXAorCXNyYy9zX3JvdW5kZi5jIFwKKwlzcmMvc19yb3VuZGwuYyBcCisJc3JjL3Nfc2NhbGJsbi5jIFwKKwlzcmMvc19zY2FsYm4uYyBcCisJc3JjL3Nfc2NhbGJuZi5jIFwKKwlzcmMvc19zaWduYml0LmMgXAorCXNyYy9zX3NpZ25nYW0uYyBcCisJc3JjL3Nfc2lnbmlmaWNhbmQuYyBcCisJc3JjL3Nfc2lnbmlmaWNhbmRmLmMgXAorCXNyYy9zX3Npbi5jIFwKKwlzcmMvc19zaW5mLmMgXAorCXNyYy9zX3Rhbi5jIFwKKwlzcmMvc190YW5mLmMgXAorCXNyYy9zX3RhbmguYyBcCisJc3JjL3NfdGFuaGYuYyBcCisJc3JjL3NfdHJ1bmMuYyBcCisJc3JjL3NfdHJ1bmNmLmMgXAorCXNyYy9zX3RydW5jbC5jIFwKKwlzcmMvd19kcmVtLmMgXAorCXNyYy93X2RyZW1mLmMgXAorCXNyYy9zX2NvcHlzaWdubC5jIFwKKwlzcmMvc19mYWJzbC5jIFwKKwlzcmMvc19mYWJzLmMgXAorCXNyYy9zX2ZyZXhwLmMgXAorCXNyYy9zX2lzbmFuLmMgXAorCXNyYy9zX21vZGYuYworCisjIGxpYm0uYQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAkKGxpYm1fY29tbW9uX3NyY19maWxlcykKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvYXJtCisKK0xPQ0FMX01PRFVMRTo9IGxpYm0KKworTE9DQUxfU1lTVEVNX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYworCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKKyMgbGlibS5zbworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAkKGxpYm1fY29tbW9uX3NyY19maWxlcykKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS9hcm0KKworTE9DQUxfTU9EVUxFOj0gbGlibQorCitMT0NBTF9TWVNURU1fU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2xpYm0vTU9EVUxFX0xJQ0VOU0VfQlNEX0xJS0UgYi9saWJtL01PRFVMRV9MSUNFTlNFX0JTRF9MSUtFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL01PRFVMRV9MSUNFTlNFX0JTRF9MSUtFCmRpZmYgLS1naXQgYS9saWJtL01ha2VmaWxlLW9yaWcgYi9saWJtL01ha2VmaWxlLW9yaWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZkZDA5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vTWFrZWZpbGUtb3JpZwpAQCAtMCwwICsxLDE1OCBAQAorIyAgQCgjKU1ha2VmaWxlIDUuMWJldGEgOTMvMDkvMjQKKyMgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9NYWtlZmlsZSx2IDEuNzQgMjAwNS8xMS8wNiAxNzo1OTo0MCBiZGUgRXhwICQKKyMKKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjICBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisjICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisjICBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorIyAgaXMgcHJlc2VydmVkLgorIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIworCisuaWYgJHtNQUNISU5FX0FSQ0h9ID09ICJpMzg2IgorQVJDSF9TVUJESVI9IGkzODcKKy5lbHNlCitBUkNIX1NVQkRJUj0gJHtNQUNISU5FX0FSQ0h9CisuZW5kaWYKKworLmluY2x1ZGUgIiR7QVJDSF9TVUJESVJ9L01ha2VmaWxlLmluYyIKKworLlBBVEg6CSR7LkNVUkRJUn0vYnNkc3JjCisuUEFUSDoJJHsuQ1VSRElSfS9tYW4KKy5QQVRIOgkkey5DVVJESVJ9L3NyYworCitMSUI9CW0KK1NITElCRElSPz0gL2xpYgorU0hMSUJfTUFKT1I9IDQKK0NPTU1PTl9TUkNTPSBiX2V4cC5jIGJfbG9nLmMgYl90Z2FtbWEuYyBcCisJZV9hY29zLmMgZV9hY29zZi5jIGVfYWNvc2guYyBlX2Fjb3NoZi5jIGVfYXNpbi5jIGVfYXNpbmYuYyBcCisJZV9hdGFuMi5jIGVfYXRhbjJmLmMgZV9hdGFuaC5jIGVfYXRhbmhmLmMgZV9jb3NoLmMgZV9jb3NoZi5jIGVfZXhwLmMgXAorCWVfZXhwZi5jIGVfZm1vZC5jIGVfZm1vZGYuYyBlX2dhbW1hLmMgZV9nYW1tYV9yLmMgZV9nYW1tYWYuYyBcCisJZV9nYW1tYWZfci5jIGVfaHlwb3QuYyBlX2h5cG90Zi5jIGVfajAuYyBlX2owZi5jIGVfajEuYyBlX2oxZi5jIFwKKwllX2puLmMgZV9qbmYuYyBlX2xnYW1tYS5jIGVfbGdhbW1hX3IuYyBlX2xnYW1tYWYuYyBlX2xnYW1tYWZfci5jIFwKKwllX2xvZy5jIGVfbG9nMTAuYyBlX2xvZzEwZi5jIGVfbG9nZi5jIGVfcG93LmMgZV9wb3dmLmMgZV9yZW1fcGlvMi5jIFwKKwllX3JlbV9waW8yZi5jIGVfcmVtYWluZGVyLmMgZV9yZW1haW5kZXJmLmMgZV9zY2FsYi5jIGVfc2NhbGJmLmMgXAorCWVfc2luaC5jIGVfc2luaGYuYyBlX3NxcnQuYyBlX3NxcnRmLmMgZmVudi5jIFwKKwlrX2Nvcy5jIGtfY29zZi5jIGtfcmVtX3BpbzIuYyBrX3Npbi5jIGtfc2luZi5jIFwKKwlrX3Rhbi5jIGtfdGFuZi5jIFwKKwlzX2FzaW5oLmMgc19hc2luaGYuYyBzX2F0YW4uYyBzX2F0YW5mLmMgc19jYnJ0LmMgc19jYnJ0Zi5jIFwKKwlzX2NlaWwuYyBzX2NlaWxmLmMgc19jZWlsbC5jIFwKKwlzX2NvcHlzaWduLmMgc19jb3B5c2lnbmYuYyBzX2Nvcy5jIHNfY29zZi5jIHNfZXJmLmMgc19lcmZmLmMgXAorCXNfZXhwMi5jIHNfZXhwMmYuYyBzX2V4cG0xLmMgc19leHBtMWYuYyBzX2ZhYnNmLmMgc19mZGltLmMgXAorCXNfZmluaXRlLmMgc19maW5pdGVmLmMgXAorCXNfZmxvb3IuYyBzX2Zsb29yZi5jIHNfZmxvb3JsLmMgc19mbWEuYyBzX2ZtYWYuYyBcCisJc19mbWF4LmMgc19mbWF4Zi5jIHNfZm1heGwuYyBzX2ZtaW4uYyBcCisJc19mbWluZi5jIHNfZm1pbmwuYyBzX2ZyZXhwLmMgc19mcmV4cGYuYyBzX2lsb2diLmMgc19pbG9nYmYuYyBcCisJc19pbG9nYmwuYyBzX2lzZmluaXRlLmMgc19pc25hbi5jIHNfaXNub3JtYWwuYyBcCisJc19sbHJpbnQuYyBzX2xscmludGYuYyBzX2xscm91bmQuYyBzX2xscm91bmRmLmMgc19sbHJvdW5kbC5jIFwKKwlzX2xvZzFwLmMgc19sb2cxcGYuYyBzX2xvZ2IuYyBzX2xvZ2JmLmMgc19scmludC5jIHNfbHJpbnRmLmMgXAorCXNfbHJvdW5kLmMgc19scm91bmRmLmMgc19scm91bmRsLmMgc19tb2RmZi5jIFwKKwlzX25lYXJieWludC5jIHNfbmV4dGFmdGVyLmMgc19uZXh0YWZ0ZXJmLmMgXAorCXNfbmV4dHRvd2FyZGYuYyBzX3JlbXF1by5jIHNfcmVtcXVvZi5jIFwKKwlzX3JpbnQuYyBzX3JpbnRmLmMgc19yb3VuZC5jIHNfcm91bmRmLmMgc19yb3VuZGwuYyBcCisJc19zY2FsYmxuLmMgc19zY2FsYm4uYyBzX3NjYWxibmYuYyBzX3NpZ25iaXQuYyBcCisJc19zaWduZ2FtLmMgc19zaWduaWZpY2FuZC5jIHNfc2lnbmlmaWNhbmRmLmMgc19zaW4uYyBzX3NpbmYuYyBzX3Rhbi5jIFwKKwlzX3RhbmYuYyBzX3RhbmguYyBzX3RhbmhmLmMgc190cnVuYy5jIHNfdHJ1bmNmLmMgc190cnVuY2wuYyBcCisJd19jYWJzLmMgd19jYWJzZi5jIHdfZHJlbS5jIHdfZHJlbWYuYworCisjIExvY2F0aW9uIG9mIGZwbWF0aC5oIGFuZCBfZnBtYXRoLmgKK0xJQkNESVI9CSR7LkNVUkRJUn0vLi4vbGliYworQ0ZMQUdTKz0JLUkke0xJQkNESVJ9L2luY2x1ZGUgLUkke0xJQkNESVJ9LyR7TUFDSElORV9BUkNIfQorCisjIEM5OSBsb25nIGRvdWJsZSBmdW5jdGlvbnMKK0NPTU1PTl9TUkNTKz0Jc19jb3B5c2lnbmwuYyBzX2ZhYnNsLmMKKy5pZiAke0xEQkxfUFJFQ30gIT0gNTMKKyMgSWYgbG9uZyBkb3VibGUgIT0gZG91YmxlIHVzZSB0aGVzZTsgb3RoZXJ3aXNlLCB3ZSBhbGlhcyB0aGUgZG91YmxlIHZlcnNpb25zLgorQ09NTU9OX1NSQ1MrPQlzX2ZtYWwuYyBzX2ZyZXhwbC5jIHNfbmV4dGFmdGVybC5jIHNfbmV4dHRvd2FyZC5jIHNfc2NhbGJubC5jCisuZW5kaWYKKworIyBDOTkgY29tcGxleCBmdW5jdGlvbnMKK0NPTU1PTl9TUkNTKz0Jc19jaW1hZy5jIHNfY2ltYWdmLmMgc19jaW1hZ2wuYyBzX2NvbmouYyBzX2NvbmpmLmMgc19jb25qbC5jIFwKKwlzX2NyZWFsLmMgc19jcmVhbGYuYyBzX2NyZWFsbC5jCisKKyMgRnJlZUJTRCdzIEMgbGlicmFyeSBzdXBwbGllcyB0aGVzZSBmdW5jdGlvbnM6CisjQ09NTU9OX1NSQ1MrPQlzX2ZhYnMuYyBzX2ZyZXhwLmMgc19pc25hbi5jIHNfbGRleHAuYyBzX21vZGYuYworCisjIEV4Y2x1ZGUgdGhlIGdlbmVyaWMgdmVyc2lvbnMgb2Ygd2hhdCB3ZSBwcm92aWRlIGluIHRoZSBNRCBhcmVhLgorLlBBVEg6CSR7LkNVUkRJUn0vJHtBUkNIX1NVQkRJUn0KKy5pZiBkZWZpbmVkKEFSQ0hfU1JDUykKKy5mb3IgaSBpbiAke0FSQ0hfU1JDU30KK0NPTU1PTl9TUkNTOj0gICR7Q09NTU9OX1NSQ1M6TiR7aTpSfS5jfQorLmVuZGZvcgorLmVuZGlmCisKK1NSQ1M9CSR7Q09NTU9OX1NSQ1N9ICR7QVJDSF9TUkNTfQorCitJTkNTPQlmZW52LmggbWF0aC5oCisKK01BTj0JYWNvcy4zIGFjb3NoLjMgYXNpbi4zIGFzaW5oLjMgYXRhbi4zIGF0YW4yLjMgYXRhbmguMyBjZWlsLjMgXAorCWNpbWFnLjMgY29weXNpZ24uMyBjb3MuMyBjb3NoLjMgZXJmLjMgZXhwLjMgZmFicy4zIGZkaW0uMyBcCisJZmVjbGVhcmV4Y2VwdC4zIGZlZW5hYmxlZXhjZXB0LjMgZmVnZXRlbnYuMyBcCisJZmVnZXRyb3VuZC4zIGZlbnYuMyBmbG9vci4zIFwKKwlmbWEuMyBmbWF4LjMgZm1vZC4zIGh5cG90LjMgaWVlZS4zIGllZWVfdGVzdC4zIGlsb2diLjMgajAuMyBcCisJbGdhbW1hLjMgbHJpbnQuMyBscm91bmQuMyBtYXRoLjMgbmV4dGFmdGVyLjMgcmVtYWluZGVyLjMgcmludC4zIFwKKwlyb3VuZC4zIHNjYWxibi4zIHNpZ25iaXQuMyBzaW4uMyBzaW5oLjMgc3FydC4zIHRhbi4zIHRhbmguMyB0cnVuYy4zCisKK01MSU5LUys9YWNvcy4zIGFjb3NmLjMKK01MSU5LUys9YWNvc2guMyBhY29zaGYuMworTUxJTktTKz1hc2luLjMgYXNpbmYuMworTUxJTktTKz1hc2luaC4zIGFzaW5oZi4zCitNTElOS1MrPWF0YW4uMyBhdGFuZi4zCitNTElOS1MrPWF0YW5oLjMgYXRhbmhmLjMKK01MSU5LUys9YXRhbjIuMyBhdGFuMmYuMworTUxJTktTKz1jZWlsLjMgY2VpbGYuMyBjZWlsLjMgY2VpbGwuMworTUxJTktTKz1jaW1hZy4zIGNpbWFnZi4zIGNpbWFnLjMgY2ltYWdsLjMgXAorCWNpbWFnLjMgY29uai4zIGNpbWFnLjMgY29uamYuMyBjaW1hZy4zIGNvbmpsLjMgXAorCWNpbWFnLjMgY3JlYWwuMyBjaW1hZy4zIGNyZWFsZi4zIGNpbWFnLjMgY3JlYWxsLjMKK01MSU5LUys9Y29weXNpZ24uMyBjb3B5c2lnbmYuMyBjb3B5c2lnbi4zIGNvcHlzaWdubC4zCitNTElOS1MrPWNvcy4zIGNvc2YuMworTUxJTktTKz1jb3NoLjMgY29zaGYuMworTUxJTktTKz1lcmYuMyBlcmZjLjMgZXJmLjMgZXJmZi4zIGVyZi4zIGVyZmNmLjMKK01MSU5LUys9ZXhwLjMgZXhwbTEuMyBleHAuMyBsb2cuMyBleHAuMyBsb2cxMC4zIGV4cC4zIGxvZzFwLjMgZXhwLjMgcG93LjMgXAorCWV4cC4zIGV4cDIuMyBleHAuMyBleHAyZi4zIGV4cC4zIGV4cGYuMyBcCisJZXhwLjMgZXhwbTFmLjMgZXhwLjMgbG9nZi4zIGV4cC4zIHBvd2YuMyBcCisJZXhwLjMgbG9nMTBmLjMgZXhwLjMgbG9nMXBmLjMKK01MSU5LUys9ZmFicy4zIGZhYnNmLjMgZmFicy4zIGZhYnNsLjMKK01MSU5LUys9ZmRpbS4zIGZkaW1mLjMgZmRpbS4zIGZkaW1sLjMKK01MSU5LUys9ZmVjbGVhcmV4Y2VwdC4zIGZlZ2V0ZXhjZXB0ZmxhZy4zIGZlY2xlYXJleGNlcHQuMyBmZXJhaXNlZXhjZXB0LjMgXAorCWZlY2xlYXJleGNlcHQuMyBmZXNldGV4Y2VwdGZsYWcuMyBmZWNsZWFyZXhjZXB0LjMgZmV0ZXN0ZXhjZXB0LjMKK01MSU5LUys9ZmVlbmFibGVleGNlcHQuMyBmZWRpc2FibGVleGNlcHQuMyBmZWVuYWJsZWV4Y2VwdC4zIGZlZ2V0ZXhjZXB0LjMKK01MSU5LUys9ZmVnZXRlbnYuMyBmZWhvbGRleGNlcHQuMyBmZWdldGVudi4zIGZlc2V0ZW52LjMgXAorCWZlZ2V0ZW52LjMgZmV1cGRhdGVlbnYuMworTUxJTktTKz1mZWdldHJvdW5kLjMgZmVzZXRyb3VuZC4zCitNTElOS1MrPWZsb29yLjMgZmxvb3JmLjMgZmxvb3IuMyBmbG9vcmwuMworTUxJTktTKz1mbWEuMyBmbWFmLjMgZm1hLjMgZm1hbC4zCitNTElOS1MrPWZtYXguMyBmbWF4Zi4zIGZtYXguMyBmbWF4bC4zIFwKKwlmbWF4LjMgZm1pbi4zIGZtYXguMyBmbWluZi4zIGZtYXguMyBmbWlubC4zCitNTElOS1MrPWZtb2QuMyBmbW9kZi4zCitNTElOS1MrPWh5cG90LjMgY2Ficy4zIGh5cG90LjMgY2Fic2YuMyBoeXBvdC4zIGh5cG90Zi4zCitNTElOS1MrPWllZWVfdGVzdC4zIHNjYWxiLjMgaWVlZV90ZXN0LjMgc2NhbGJmLjMKK01MSU5LUys9aWVlZV90ZXN0LjMgc2lnbmlmaWNhbmQuMyBpZWVlX3Rlc3QuMyBzaWduaWZpY2FuZGYuMworTUxJTktTKz1pbG9nYi4zIGlsb2diZi4zIGlsb2diLjMgaWxvZ2JsLjMgXAorCWlsb2diLjMgbG9nYi4zIGlsb2diLjMgbG9nYmYuMworTUxJTktTKz1qMC4zIGoxLjMgajAuMyBqbi4zIGowLjMgeTAuMyBqMC4zIHkxLjMgajAuMyB5MWYuMyBqMC4zIHluLjMKK01MSU5LUys9ajAuMyBqMGYuMyBqMC4zIGoxZi4zIGowLjMgam5mLjMgajAuMyB5MGYuMyBqMC4zIHluZi4zCitNTElOS1MrPWxnYW1tYS4zIGdhbW1hLjMgbGdhbW1hLjMgZ2FtbWFmLjMgbGdhbW1hLjMgbGdhbW1hZi4zIGxnYW1tYS4zIHRnYW1tYS4zCitNTElOS1MrPWxyaW50LjMgbGxyaW50LjMgbHJpbnQuMyBsbHJpbnRmLjMgbHJpbnQuMyBscmludGYuMworTUxJTktTKz1scm91bmQuMyBsbHJvdW5kLjMgbHJvdW5kLjMgbGxyb3VuZGYuMyBscm91bmQuMyBsbHJvdW5kbC4zIFwKKwlscm91bmQuMyBscm91bmRmLjMgbHJvdW5kLjMgbHJvdW5kbC4zCitNTElOS1MrPW5leHRhZnRlci4zIG5leHRhZnRlcmYuMyBuZXh0YWZ0ZXIuMyBuZXh0YWZ0ZXJsLjMKK01MSU5LUys9bmV4dGFmdGVyLjMgbmV4dHRvd2FyZC4zIG5leHRhZnRlci4zIG5leHR0b3dhcmRmLjMKK01MSU5LUys9bmV4dGFmdGVyLjMgbmV4dHRvd2FyZGwuMworTUxJTktTKz1yZW1haW5kZXIuMyByZW1haW5kZXJmLjMKK01MSU5LUys9cmVtYWluZGVyLjMgcmVtcXVvLjMgcmVtYWluZGVyLjMgcmVtcXVvZi4zCitNTElOS1MrPXJpbnQuMyByaW50Zi4zIHJpbnQuMyBuZWFyYnlpbnQuMyByaW50LjMgbmVhcmJ5aW50Zi4zCitNTElOS1MrPXJvdW5kLjMgcm91bmRmLjMgcm91bmQuMyByb3VuZGwuMworTUxJTktTKz1zY2FsYm4uMyBzY2FsYmxuLjMgc2NhbGJuLjMgc2NhbGJsbmYuMyBzY2FsYm4uMyBzY2FsYmxubC4zCitNTElOS1MrPXNjYWxibi4zIHNjYWxibmYuMyBzY2FsYm4uMyBzY2FsYm5sLjMKK01MSU5LUys9c2luLjMgc2luZi4zCitNTElOS1MrPXNpbmguMyBzaW5oZi4zCitNTElOS1MrPXNxcnQuMyBjYnJ0LjMgc3FydC4zIGNicnRmLjMgc3FydC4zIHNxcnRmLjMKK01MSU5LUys9dGFuLjMgdGFuZi4zCitNTElOS1MrPXRhbmguMyB0YW5oZi4zCitNTElOS1MrPXRydW5jLjMgdHJ1bmNmLjMgdHJ1bmMuMyB0cnVuY2wuMworCisuaW5jbHVkZSA8YnNkLmxpYi5taz4KZGlmZiAtLWdpdCBhL2xpYm0vTk9USUNFIGIvbGlibS9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwMTcxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vTk9USUNFCkBAIC0wLDAgKzEsMzU3IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMywgU3RldmVuIEcuIEthcmdsCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSB1bm1vZGlmaWVkLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWlrZSBCYXJjcm9mdCA8bWlrZUBGcmVlQlNELm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMyBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBTdGVmYW4gRmFyZmVsZWRlcgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzIERhZy1FcmxpbmcgQ2/vZGFuIFNt+HJncmF2CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogICAgaW4gdGhpcyBwb3NpdGlvbiBhbmQgdW5jaGFuZ2VkLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYgVGhlIE5ldEJTRCBGb3VuZGF0aW9uLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gVGhlIE5ldEJTRCBGb3VuZGF0aW9uCisgKiBieSBKLlQuIENvbmtsaW4uCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBOZXRCU0QKKyAqICAgICAgICBGb3VuZGF0aW9uLCBJbmMuIGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTmV0QlNEIEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE5FVEJTRCBGT1VOREFUSU9OLCBJTkMuIEFORCBDT05UUklCVVRPUlMKKyAqIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorICogVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgRk9VTkRBVElPTiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTg1LCAxOTkzCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5OTMKKyAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLDk0IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAxOTk0IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBPcHRpbWl6ZWQgYnkgQnJ1Y2UgRC4gRXZhbnMuCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAwNCBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAqIEJhc2VkIG9uIGNvZGUgd3JpdHRlbiBieSBKLlQuIENvbmtsaW4gPGp0Y0BuZXRic2Qub3JnPi4KKyAqIFB1YmxpYyBkb21haW4uCisgKi8KKworLyoKKyAqIFdyaXR0ZW4gYnkgSi5ULiBDb25rbGluIDxqdGNAbmV0YnNkLm9yZz4uCisgKiBQdWJsaWMgZG9tYWluLgorICovCisKKy5cIiBDb3B5cmlnaHQgKGMpIDIwMDQgU3RlZmFuIEZhcmZlbGVkZXIKKy5cIiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0Qub3JnPgorLlwiIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5vcmc+CisuXCIgQ29weXJpZ2h0IChjKSAyMDAzIE1pa2UgQmFyY3JvZnQgPG1pa2VARnJlZUJTRC5vcmc+CisuXCIgQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELm9yZz4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisKKy5cIiBDb3B5cmlnaHQgKGMpIDIwMDMsIFN0ZXZlbiBHLiBLYXJnbAorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorCisuXCIgQ29weXJpZ2h0IChjKSAxOTkxIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKy5cIiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorLlwiCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorLlwiIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisuXCIgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisuXCIgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorCmRpZmYgLS1naXQgYS9saWJtL2FscGhhL01ha2VmaWxlLmluYyBiL2xpYm0vYWxwaGEvTWFrZWZpbGUuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NWFjZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2FscGhhL01ha2VmaWxlLmluYwpAQCAtMCwwICsxLDEwIEBACisjICRGcmVlQlNEOiBzcmMvbGliL21zdW4vYWxwaGEvTWFrZWZpbGUuaW5jLHYgMS4yIDIwMDUvMDMvMDcgMDQ6NTM6MzUgZGFzIEV4cCAkCisKK0FSQ0hfU1JDUyA9IHNfY29weXNpZ24uUyBzX2NvcHlzaWduZi5TCitMREJMX1BSRUMgPSA1MworCisjIFhYWCBDb21tZW50IGZyb20gTmV0QlNEL0FscGhhOgorIyBYWFggTElOVCBTSUdGUEVzIGluIGVfZXhwLmMncyBzdHJ0b2QoKS4gIEZQIHVuZGVyZmxvdy9kZW5vcm0gc29mdHdhcmUKKyMgaGFuZGxpbmcgaXMgYnJva2VuIChkb2Vzbid0IGV4aXN0ISkgb24gdGhlIEFscGhhIHBvcnQuCisjIFN0b2NrIGdjYyAyLjcuMi4xIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGVzZSBvcHRpb25zLgorI0NGTEFHUyArPSAtbXRyYXAtcHJlY2lzaW9uPWkgLW1mcC10cmFwLW1vZGU9c3UKZGlmZiAtLWdpdCBhL2xpYm0vYWxwaGEvX2ZwbWF0aC5oIGIvbGlibS9hbHBoYS9fZnBtYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZhMjM1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYWxwaGEvX2ZwbWF0aC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzIERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbGliYy9hbHBoYS9fZnBtYXRoLmgsdiAxLjYgMjAwNS8wMy8wNyAwNDo1NToyMSBkYXMgRXhwICQKKyAqLworCit1bmlvbiBJRUVFbDJiaXRzIHsKKwlsb25nIGRvdWJsZQllOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGludAltYW5sCTozMjsKKwkJdW5zaWduZWQgaW50CW1hbmgJOjIwOworCQl1bnNpZ25lZCBpbnQJZXhwCToxMTsKKwkJdW5zaWduZWQgaW50CXNpZ24JOjE7CisJfSBiaXRzOworfTsKKworI2RlZmluZQltYXNrX25iaXRfbCh1KQkoKHZvaWQpMCkKKyNkZWZpbmUJTERCTF9JTVBMSUNJVF9OQklUCisjZGVmaW5lCUxEQkxfTkJJVAkwCisKKyNkZWZpbmUJTERCTF9NQU5IX1NJWkUJMjAKKyNkZWZpbmUJTERCTF9NQU5MX1NJWkUJMzIKKworI2RlZmluZQlMREJMX1RPX0FSUkFZMzIodSwgYSkgZG8gewkJCVwKKwkoYSlbMF0gPSAodWludDMyX3QpKHUpLmJpdHMubWFubDsJCVwKKwkoYSlbMV0gPSAodWludDMyX3QpKHUpLmJpdHMubWFuaDsJCVwKK30gd2hpbGUoMCkKZGlmZiAtLWdpdCBhL2xpYm0vYWxwaGEvZmVudi5jIGIvbGlibS9hbHBoYS9mZW52LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThhYjIwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYWxwaGEvZmVudi5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9hbHBoYS9mZW52LmMsdiAxLjIgMjAwNS8wMy8xNiAxOTowMzo0NCBkYXMgRXhwICQKKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8bWFjaGluZS9zeXNhcmNoLmg+CisjaW5jbHVkZSA8ZmVudi5oPgorCitjb25zdCBmZW52X3QgX19mZV9kZmxfZW52ID0gMHg2ODBlMDAwMDAwMDAwMDAwVUxMOworCitzdHJ1Y3QgbWFza19hcmdzIHsKKwlmZW52X3QgbWFzazsKK307CisKKy8qCisgKiBUaGUgbG93ZXIgNDkgYml0cyBvZiB0aGUgRlBDUiBhcmUgdW51c2VkIGJ5IHRoZSBoYXJkd2FyZSwgc28gd2UgdXNlCisgKiB0aGUgbG93ZXIgb3JkZXIgYml0cyB0byBzdG9yZSB0aGUga2VybmVsJ3MgaWRlYSBvZiB0aGUgRlAgbWFzayBhcworICogZGVzY3JpYmVkIGluIHRoZSBBbHBoYSBBcmNoaXRlY3R1cmUgTWFudWFsLgorICovCitpbnQKK2ZlZ2V0ZW52KGZlbnZfdCAqZW52cCkKK3sKKwlzdHJ1Y3QgbWFza19hcmdzIHA7CisJdW5pb24gX19mcGNyIHI7CisKKwkvKgorCSAqIFRoZSBzeXNjYWxsIGFjdHMgYXMgYW4gaW1wbGljaXQgZXhjZXB0aW9uIGJhcnJpZXIsIHNvIHdlCisJICogb25seSBuZWVkIHRvIGlzc3VlIGFuIGV4Y2IgYWZ0ZXIgdGhlIG1mX2ZwY3IgdG8gZW5zdXJlIHRoYXQKKwkgKiB0aGUgcmVhZCBpcyBleGVjdXRlZCBiZWZvcmUgYW55IHN1YnNlcXVlbnQgRlAgb3BzLgorCSAqLworCXN5c2FyY2goQUxQSEFfR0VUX0ZQTUFTSywgKGNoYXIgKikmcCk7CisJX19tZl9mcGNyKCZyLl9fZCk7CisJKmVudnAgPSByLl9fYml0cyB8IHAubWFzazsKKwlfX2V4Y2IoKTsKKwlyZXR1cm4gKDApOworfQorCitpbnQKK2ZlaG9sZGV4Y2VwdChmZW52X3QgKmVudnApCit7CisJc3RydWN0IG1hc2tfYXJncyBwOworCXVuaW9uIF9fZnBjciByOworCisJc3lzYXJjaChBTFBIQV9HRVRfRlBNQVNLLCAoY2hhciAqKSZwKTsKKwlfX21mX2ZwY3IoJnIuX19kKTsKKwkqZW52cCA9IHIuX19iaXRzIHwgcC5tYXNrOworCXIuX19iaXRzICY9IH4oKGZlbnZfdClGRV9BTExfRVhDRVBUIDw8IF9GUFVTV19TSElGVCk7CisJX19tdF9mcGNyKHIuX19kKTsKKwlpZiAocC5tYXNrICYgRkVfQUxMX0VYQ0VQVCkgeworCQlwLm1hc2sgPSAwOworCQlzeXNhcmNoKEFMUEhBX1NFVF9GUE1BU0ssICZwKTsKKwl9CisJX19leGNiKCk7CisJcmV0dXJuICgwKTsKK30KKworaW50CitmZXNldGVudihjb25zdCBmZW52X3QgKmVudnApCit7CisJc3RydWN0IG1hc2tfYXJncyBwOworCXVuaW9uIF9fZnBjciByOworCisJcC5tYXNrID0gKmVudnAgJiBGRV9BTExfRVhDRVBUOworCXN5c2FyY2goQUxQSEFfU0VUX0ZQTUFTSywgJnApOworCXIuX19iaXRzID0gKmVudnAgJiB+RkVfQUxMX0VYQ0VQVDsKKwlfX210X2ZwY3Ioci5fX2QpOworCV9fZXhjYigpOworCXJldHVybiAoMCk7Cit9CisKK2ludAorZmV1cGRhdGVlbnYoY29uc3QgZmVudl90ICplbnZwKQoreworCXN0cnVjdCBtYXNrX2FyZ3MgcDsKKwl1bmlvbiBfX2ZwY3Igb2xkciwgbmV3cjsKKworCXAubWFzayA9ICplbnZwICYgRkVfQUxMX0VYQ0VQVDsKKwlzeXNhcmNoKEFMUEhBX1NFVF9GUE1BU0ssICZwKTsKKwlfX21mX2ZwY3IoJm9sZHIuX19kKTsKKwluZXdyLl9fYml0cyA9ICplbnZwICYgfkZFX0FMTF9FWENFUFQ7CisJX19leGNiKCk7CisJX19tdF9mcGNyKG5ld3IuX19kKTsKKwlmZXJhaXNlZXhjZXB0KChvbGRyLl9fYml0cyA+PiBfRlBVU1dfU0hJRlQpICYgRkVfQUxMX0VYQ0VQVCk7CisJcmV0dXJuICgwKTsgCit9CisKK2ludAorX19mZWVuYWJsZWV4Y2VwdChpbnQgbWFzaykKK3sKKwlzdHJ1Y3QgbWFza19hcmdzIHA7CisKKwlzeXNhcmNoKEFMUEhBX0dFVF9GUE1BU0ssICZwKTsKKwlwLm1hc2sgfD0gKG1hc2sgJiBGRV9BTExfRVhDRVBUKTsKKwlzeXNhcmNoKEFMUEhBX1NFVF9GUE1BU0ssICZwKTsKKwlyZXR1cm4gKHAubWFzayk7Cit9CisKK2ludAorX19mZWRpc2FibGVleGNlcHQoaW50IG1hc2spCit7CisJc3RydWN0IG1hc2tfYXJncyBwOworCisJc3lzYXJjaChBTFBIQV9HRVRfRlBNQVNLLCAmcCk7CisJcC5tYXNrICY9IH4obWFzayAmIEZFX0FMTF9FWENFUFQpOworCXN5c2FyY2goQUxQSEFfU0VUX0ZQTUFTSywgJnApOworCXJldHVybiAocC5tYXNrKTsKK30KKworaW50CitfX2ZlZ2V0ZXhjZXB0KHZvaWQpCit7CisJc3RydWN0IG1hc2tfYXJncyBwOworCisJc3lzYXJjaChBTFBIQV9HRVRfRlBNQVNLLCAmcCk7CisJcmV0dXJuIChwLm1hc2spOworfQorCitfX3dlYWtfcmVmZXJlbmNlKF9fZmVlbmFibGVleGNlcHQsIGZlZW5hYmxlZXhjZXB0KTsKK19fd2Vha19yZWZlcmVuY2UoX19mZWRpc2FibGVleGNlcHQsIGZlZGlzYWJsZWV4Y2VwdCk7CitfX3dlYWtfcmVmZXJlbmNlKF9fZmVnZXRleGNlcHQsIGZlZ2V0ZXhjZXB0KTsKZGlmZiAtLWdpdCBhL2xpYm0vYWxwaGEvZmVudi5oIGIvbGlibS9hbHBoYS9mZW52LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3YmNiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYWxwaGEvZmVudi5oCkBAIC0wLDAgKzEsMTg1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9hbHBoYS9mZW52LmgsdiAxLjMgMjAwNS8wMy8xNiAxOTowMzo0NCBkYXMgRXhwICQKKyAqLworCisjaWZuZGVmCV9GRU5WX0hfCisjZGVmaW5lCV9GRU5WX0hfCisKKyNpbmNsdWRlIDxzeXMvX3R5cGVzLmg+CisKK3R5cGVkZWYJX191aW50NjRfdAlmZW52X3Q7Cit0eXBlZGVmCV9fdWludDE2X3QJZmV4Y2VwdF90OworCisvKiBFeGNlcHRpb24gZmxhZ3MgKi8KKyNkZWZpbmUJRkVfSU5WQUxJRAkweDAyCisjZGVmaW5lCUZFX0RJVkJZWkVSTwkweDA0CisjZGVmaW5lCUZFX09WRVJGTE9XCTB4MDgKKyNkZWZpbmUJRkVfVU5ERVJGTE9XCTB4MTAKKyNkZWZpbmUJRkVfSU5FWEFDVAkweDIwCisjZGVmaW5lCUZFX0lOVE9WRgkweDQwCS8qIG5vdCBtYXNrYWJsZSAqLworI2RlZmluZQlGRV9BTExfRVhDRVBUCShGRV9ESVZCWVpFUk8gfCBGRV9JTkVYQUNUIHwgRkVfSU5UT1ZGIHwgXAorCQkJIEZFX0lOVkFMSUQgfCBGRV9PVkVSRkxPVyB8IEZFX1VOREVSRkxPVykKKworLyogUm91bmRpbmcgbW9kZXMgKi8KKyNkZWZpbmUJRkVfVE9XQVJEWkVSTwkweDAwCisjZGVmaW5lCUZFX0RPV05XQVJECTB4MDEKKyNkZWZpbmUJRkVfVE9ORUFSRVNUCTB4MDIKKyNkZWZpbmUJRkVfVVBXQVJECTB4MDMKKyNkZWZpbmUJX1JPVU5EX01BU0sJKEZFX1RPTkVBUkVTVCB8IEZFX0RPV05XQVJEIHwgXAorCQkJIEZFX1VQV0FSRCB8IEZFX1RPV0FSRFpFUk8pCisjZGVmaW5lCV9ST1VORF9TSElGVAk1OAorCisjZGVmaW5lCV9GUFVTV19TSElGVAk1MQorCisjZGVmaW5lCV9fZXhjYigpCV9fYXNtIF9fdm9sYXRpbGUoImV4Y2IiKQorI2RlZmluZQlfX21mX2ZwY3IoX19jdykJX19hc20gX192b2xhdGlsZSgibWZfZnBjciAlMCIgOiAiPWYiICgqKF9fY3cpKSkKKyNkZWZpbmUJX19tdF9mcGNyKF9fY3cpCV9fYXNtIF9fdm9sYXRpbGUoIm10X2ZwY3IgJTAiIDogOiAiZiIgKF9fY3cpKQorCit1bmlvbiBfX2ZwY3IgeworCWRvdWJsZSBfX2Q7CisJZmVudl90IF9fYml0czsKK307CisKK19fQkVHSU5fREVDTFMKKworLyogRGVmYXVsdCBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCAqLworZXh0ZXJuIGNvbnN0IGZlbnZfdAlfX2ZlX2RmbF9lbnY7CisjZGVmaW5lCUZFX0RGTF9FTlYJKCZfX2ZlX2RmbF9lbnYpCisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlY2xlYXJleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwl1bmlvbiBfX2ZwY3IgX19yOworCisJX19leGNiKCk7CisJX19tZl9mcGNyKCZfX3IuX19kKTsKKwlfX3IuX19iaXRzICY9IH4oKGZlbnZfdClfX2V4Y2VwdHMgPDwgX0ZQVVNXX1NISUZUKTsKKwlfX210X2ZwY3IoX19yLl9fZCk7CisJX19leGNiKCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRleGNlcHRmbGFnKGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwl1bmlvbiBfX2ZwY3IgX19yOworCisJX19leGNiKCk7CisJX19tZl9mcGNyKCZfX3IuX19kKTsKKwlfX2V4Y2IoKTsKKwkqX19mbGFncCA9IChfX3IuX19iaXRzID4+IF9GUFVTV19TSElGVCkgJiBfX2V4Y2VwdHM7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRleGNlcHRmbGFnKGNvbnN0IGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwl1bmlvbiBfX2ZwY3IgX19yOworCWZlbnZfdCBfX3hmbGFnLCBfX3hleGNlcHRzOworCisJX194ZmxhZyA9IChmZW52X3QpKl9fZmxhZ3AgPDwgX0ZQVVNXX1NISUZUOworCV9feGV4Y2VwdHMgPSAoZmVudl90KV9fZXhjZXB0cyA8PCBfRlBVU1dfU0hJRlQ7CisJX19leGNiKCk7CisJX19tZl9mcGNyKCZfX3IuX19kKTsKKwlfX3IuX19iaXRzICY9IH5fX3hleGNlcHRzOworCV9fci5fX2JpdHMgfD0gX194ZmxhZyAmIF9feGV4Y2VwdHM7CisJX19tdF9mcGNyKF9fci5fX2QpOworCV9fZXhjYigpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlcmFpc2VleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKworCS8qCisJICogWFhYIEdlbmVyYXRpbmcgZXhjZXB0aW9ucyB0aGlzIHdheSBkb2VzIG5vdCBhY3R1YWxseSBpbnZva2UKKwkgKiBhIHVzZXJsYW5kIHRyYXAgaGFuZGxlciB3aGVuIGVuYWJsZWQsIGJ1dCBuZWl0aGVyIGRvCisJICogYXJpdGhtZXRpYyBvcGVyYXRpb25zIGFzIGZhciBhcyBJIGNhbiB0ZWxsLiAgUGVyaGFwcyB0aGVyZQorCSAqIGFyZSBtb3JlIGJ1Z3MgaW4gdGhlIGtlcm5lbCB0cmFwIGhhbmRsZXIuCisJICovCisJZmV4Y2VwdF90IF9fZXggPSBfX2V4Y2VwdHM7CisJZmVzZXRleGNlcHRmbGFnKCZfX2V4LCBfX2V4Y2VwdHMpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZldGVzdGV4Y2VwdChpbnQgX19leGNlcHRzKQoreworCXVuaW9uIF9fZnBjciBfX3I7CisKKwlfX2V4Y2IoKTsKKwlfX21mX2ZwY3IoJl9fci5fX2QpOworCV9fZXhjYigpOworCXJldHVybiAoKF9fci5fX2JpdHMgPj4gX0ZQVVNXX1NISUZUKSAmIF9fZXhjZXB0cyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0cm91bmQodm9pZCkKK3sKKwl1bmlvbiBfX2ZwY3IgX19yOworCisJLyoKKwkgKiBObyBleGNlcHRpb24gYmFycmllcnMgc2hvdWxkIGJlIHJlcXVpcmVkIGhlcmUgaWYgd2UgYXNzdW1lCisJICogdGhhdCBvbmx5IGZlc2V0cm91bmQoKSBjYW4gY2hhbmdlIHRoZSByb3VuZGluZyBtb2RlLgorCSAqLworCV9fbWZfZnBjcigmX19yLl9fZCk7CisJcmV0dXJuICgoaW50KShfX3IuX19iaXRzID4+IF9ST1VORF9TSElGVCkgJiBfUk9VTkRfTUFTSyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2Zlc2V0cm91bmQoaW50IF9fcm91bmQpCit7CisJdW5pb24gX19mcGNyIF9fcjsKKworCWlmIChfX3JvdW5kICYgfl9ST1VORF9NQVNLKQorCQlyZXR1cm4gKC0xKTsKKwlfX2V4Y2IoKTsKKwlfX21mX2ZwY3IoJl9fci5fX2QpOworCV9fci5fX2JpdHMgJj0gfigoZmVudl90KV9ST1VORF9NQVNLIDw8IF9ST1VORF9TSElGVCk7CisJX19yLl9fYml0cyB8PSAoZmVudl90KV9fcm91bmQgPDwgX1JPVU5EX1NISUZUOworCV9fbXRfZnBjcihfX3IuX19kKTsKKwlfX2V4Y2IoKTsKKwlyZXR1cm4gKDApOworfQorCitpbnQJZmVnZXRlbnYoZmVudl90ICpfX2VudnApOworaW50CWZlaG9sZGV4Y2VwdChmZW52X3QgKl9fZW52cCk7CitpbnQJZmVzZXRlbnYoY29uc3QgZmVudl90ICpfX2VudnApOworaW50CWZldXBkYXRlZW52KGNvbnN0IGZlbnZfdCAqX19lbnZwKTsKKworI2lmIF9fQlNEX1ZJU0lCTEUKKworaW50CWZlZW5hYmxlZXhjZXB0KGludCBfX21hc2spOworaW50CWZlZGlzYWJsZWV4Y2VwdChpbnQgX19tYXNrKTsKK2ludAlmZWdldGV4Y2VwdCh2b2lkKTsKKworI2VuZGlmIC8qIF9fQlNEX1ZJU0lCTEUgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qICFfRkVOVl9IXyAqLwpkaWZmIC0tZ2l0IGEvbGlibS9hbHBoYS9zX2NvcHlzaWduLlMgYi9saWJtL2FscGhhL3NfY29weXNpZ24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjM4MWJiCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9hbHBoYS9zX2NvcHlzaWduLlMKQEAgLTAsMCArMSw0NSBAQAorLyogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9hbHBoYS9zX2NvcHlzaWduLlMsdiAxLjIgMTk5OS8wOC8yOCAwMDowNjowNyBwZXRlciBFeHAgJCAqLworLyoJRnJvbTogTmV0QlNEOiBzX2NvcHlzaWduLlMsdiAxLjMgMTk5Ny8wNy8zMCAyMzo1ODozOCBqdGMgRXhwCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTk2IFRoZSBOZXRCU0QgRm91bmRhdGlvbiwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIFRoZSBOZXRCU0QgRm91bmRhdGlvbgorICogYnkgSi5ULiBDb25rbGluLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgTmV0QlNECisgKiAgICAgICAgRm91bmRhdGlvbiwgSW5jLiBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIE5ldEJTRCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBORVRCU0QgRk9VTkRBVElPTiwgSU5DLiBBTkQgQ09OVFJJQlVUT1JTCisgKiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAqIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEZPVU5EQVRJT04gT1IgQ09OVFJJQlVUT1JTIAorICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKK0xFQUYoY29weXNpZ24sIDIpCisJY3B5cwlmYTEsIGZhMCwgZnYwCisJUkVUCitFTkQoY29weXNpZ24pCmRpZmYgLS1naXQgYS9saWJtL2FscGhhL3NfY29weXNpZ25mLlMgYi9saWJtL2FscGhhL3NfY29weXNpZ25mLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1ZWRhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYWxwaGEvc19jb3B5c2lnbmYuUwpAQCAtMCwwICsxLDQ1IEBACisvKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2FscGhhL3NfY29weXNpZ25mLlMsdiAxLjIgMTk5OS8wOC8yOCAwMDowNjowOCBwZXRlciBFeHAgJCAqLworLyoJRnJvbTogTmV0QlNEOiBzX2NvcHlzaWduZi5TLHYgMS4zIDE5OTcvMDcvMzAgMjM6NTg6NDEganRjIEV4cCAqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5NiBUaGUgTmV0QlNEIEZvdW5kYXRpb24sIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBUaGUgTmV0QlNEIEZvdW5kYXRpb24KKyAqIGJ5IEouVC4gQ29ua2xpbi4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE5ldEJTRAorICogICAgICAgIEZvdW5kYXRpb24sIEluYy4gYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBOZXRCU0QgRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTkVUQlNEIEZPVU5EQVRJT04sIElOQy4gQU5EIENPTlRSSUJVVE9SUworICogYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECisgKiBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBGT1VOREFUSU9OIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKK0xFQUYoY29weXNpZ25mLCAyKQorCWNweXMJZmExLCBmYTAsIGZ2MAorCVJFVAorRU5EKGNvcHlzaWduZikKZGlmZiAtLWdpdCBhL2xpYm0vYW1kNjQvTWFrZWZpbGUuaW5jIGIvbGlibS9hbWQ2NC9NYWtlZmlsZS5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkYTc3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYW1kNjQvTWFrZWZpbGUuaW5jCkBAIC0wLDAgKzEsNSBAQAorIyAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2FtZDY0L01ha2VmaWxlLmluYyx2IDEuNCAyMDA1LzA0LzE2IDIxOjEyOjU1IGRhcyBFeHAgJAorCitBUkNIX1NSQ1MgPSBlX3NxcnQuUyBlX3NxcnRmLlMgc19sbHJpbnQuUyBzX2xscmludGYuUyBzX2xyaW50LlMgc19scmludGYuUyBcCisJICAgIHNfcmVtcXVvLlMgc19yZW1xdW9mLlMgc19zY2FsYm4uUyBzX3NjYWxibmYuUyBzX3NjYWxibmwuUworTERCTF9QUkVDID0gNjQKZGlmZiAtLWdpdCBhL2xpYm0vYW1kNjQvX2ZwbWF0aC5oIGIvbGlibS9hbWQ2NC9fZnBtYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAxZWM4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYW1kNjQvX2ZwbWF0aC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzIERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbGliYy9hbWQ2NC9fZnBtYXRoLmgsdiAxLjYgMjAwNS8wMy8wNyAwNDo1NToyMSBkYXMgRXhwICQKKyAqLworCit1bmlvbiBJRUVFbDJiaXRzIHsKKwlsb25nIGRvdWJsZQllOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGludAltYW5sCTozMjsKKwkJdW5zaWduZWQgaW50CW1hbmgJOjMyOworCQl1bnNpZ25lZCBpbnQJZXhwCToxNTsKKwkJdW5zaWduZWQgaW50CXNpZ24JOjE7CisJCXVuc2lnbmVkIGludAlqdW5rbAk6MTY7CisJCXVuc2lnbmVkIGludAlqdW5raAk6MzI7CisJfSBiaXRzOworfTsKKworI2RlZmluZQlMREJMX05CSVQJMHg4MDAwMDAwMAorI2RlZmluZQltYXNrX25iaXRfbCh1KQkoKHUpLmJpdHMubWFuaCAmPSB+TERCTF9OQklUKQorCisjZGVmaW5lCUxEQkxfTUFOSF9TSVpFCTMyCisjZGVmaW5lCUxEQkxfTUFOTF9TSVpFCTMyCisKKyNkZWZpbmUJTERCTF9UT19BUlJBWTMyKHUsIGEpIGRvIHsJCQlcCisJKGEpWzBdID0gKHVpbnQzMl90KSh1KS5iaXRzLm1hbmw7CQlcCisJKGEpWzFdID0gKHVpbnQzMl90KSh1KS5iaXRzLm1hbmg7CQlcCit9IHdoaWxlKDApCmRpZmYgLS1naXQgYS9saWJtL2FtZDY0L2Vfc3FydC5TIGIvbGlibS9hbWQ2NC9lX3NxcnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDI5Y2NlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9hbWQ2NC9lX3NxcnQuUwpAQCAtMCwwICsxLDMzIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vYW1kNjQvZV9zcXJ0LlMsdiAxLjIgMjAwNS8wMi8wNCAxNDowODozMiBkYXMgRXhwICQiKQorCQorRU5UUlkoc3FydCkKKwlzcXJ0c2QJJXhtbTAsICV4bW0wCisJcmV0CisKZGlmZiAtLWdpdCBhL2xpYm0vYW1kNjQvZV9zcXJ0Zi5TIGIvbGlibS9hbWQ2NC9lX3NxcnRmLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcxZmE2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYW1kNjQvZV9zcXJ0Zi5TCkBAIC0wLDAgKzEsMzIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9hbWQ2NC9lX3NxcnRmLlMsdiAxLjEgMjAwNS8wNC8xNiAyMToxMjo1NSBkYXMgRXhwICQiKQorCQorRU5UUlkoc3FydGYpCisJc3FydHNzCSV4bW0wLCAleG1tMAorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9hbWQ2NC9mZW52LmMgYi9saWJtL2FtZDY0L2ZlbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjQzNjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9hbWQ2NC9mZW52LmMKQEAgLTAsMCArMSwxNDggQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2FtZDY0L2ZlbnYuYyx2IDEuMyAyMDA1LzAzLzE2IDE5OjAzOjQ1IGRhcyBFeHAgJAorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL2ZwdS5oPgorI2luY2x1ZGUgPGZlbnYuaD4KKworY29uc3QgZmVudl90IF9fZmVfZGZsX2VudiA9IHsKKwl7IDB4ZmZmZjAwMDAgfCBfX0lOSVRJQUxfRlBVQ1dfXywKKwkgIDB4ZmZmZjAwMDAsCisJICAweGZmZmZmZmZmLAorCSAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmIH0KKwl9LAorCV9fSU5JVElBTF9NWENTUl9fCit9OworCitpbnQKK2Zlc2V0ZXhjZXB0ZmxhZyhjb25zdCBmZXhjZXB0X3QgKmZsYWdwLCBpbnQgZXhjZXB0cykKK3sKKwlmZW52X3QgZW52OworCisJX19mbnN0ZW52KCZlbnYuX194ODcpOworCWVudi5fX3g4Ny5fX3N0YXR1cyAmPSB+ZXhjZXB0czsKKwllbnYuX194ODcuX19zdGF0dXMgfD0gKmZsYWdwICYgZXhjZXB0czsKKwlfX2ZsZGVudihlbnYuX194ODcpOworCisJX19zdG14Y3NyKCZlbnYuX19teGNzcik7CisJZW52Ll9fbXhjc3IgJj0gfmV4Y2VwdHM7CisJZW52Ll9fbXhjc3IgfD0gKmZsYWdwICYgZXhjZXB0czsKKwlfX2xkbXhjc3IoZW52Ll9fbXhjc3IpOworCisJcmV0dXJuICgwKTsKK30KKworaW50CitmZXJhaXNlZXhjZXB0KGludCBleGNlcHRzKQoreworCWZleGNlcHRfdCBleCA9IGV4Y2VwdHM7CisKKwlmZXNldGV4Y2VwdGZsYWcoJmV4LCBleGNlcHRzKTsKKwlfX2Z3YWl0KCk7CisJcmV0dXJuICgwKTsKK30KKworaW50CitmZWdldGVudihmZW52X3QgKmVudnApCit7CisJaW50IGNvbnRyb2w7CisKKwkvKgorCSAqIGZuc3RlbnYgbWFza3MgYWxsIGV4Y2VwdGlvbnMsIHNvIHdlIG5lZWQgdG8gc2F2ZSBhbmQKKwkgKiByZXN0b3JlIHRoZSBjb250cm9sIHdvcmQgdG8gYXZvaWQgdGhpcyBzaWRlIGVmZmVjdC4KKwkgKi8KKwlfX2Zuc3RjdygmY29udHJvbCk7CisJX19mbnN0ZW52KCZlbnZwLT5fX3g4Nyk7CisJX19zdG14Y3NyKCZlbnZwLT5fX214Y3NyKTsKKwlfX2ZsZGN3KGNvbnRyb2wpOworCXJldHVybiAoMCk7Cit9CisKK2ludAorZmVob2xkZXhjZXB0KGZlbnZfdCAqZW52cCkKK3sKKwlpbnQgbXhjc3I7CisKKwlfX3N0bXhjc3IoJm14Y3NyKTsKKwlfX2Zuc3RlbnYoJmVudnAtPl9feDg3KTsKKwlfX2ZuY2xleCgpOworCWVudnAtPl9fbXhjc3IgPSBteGNzcjsKKwlteGNzciAmPSB+RkVfQUxMX0VYQ0VQVDsKKwlteGNzciB8PSBGRV9BTExfRVhDRVBUIDw8IF9TU0VfRU1BU0tfU0hJRlQ7CisJX19sZG14Y3NyKG14Y3NyKTsKKwlyZXR1cm4gKDApOworfQorCitpbnQKK2ZldXBkYXRlZW52KGNvbnN0IGZlbnZfdCAqZW52cCkKK3sKKwlpbnQgbXhjc3IsIHN0YXR1czsKKworCV9fZm5zdHN3KCZzdGF0dXMpOworCV9fc3RteGNzcigmbXhjc3IpOworCWZlc2V0ZW52KGVudnApOworCWZlcmFpc2VleGNlcHQoKG14Y3NyIHwgc3RhdHVzKSAmIEZFX0FMTF9FWENFUFQpOworCXJldHVybiAoMCk7Cit9CisKK2ludAorX19mZWVuYWJsZWV4Y2VwdChpbnQgbWFzaykKK3sKKwlpbnQgbXhjc3IsIGNvbnRyb2wsIG9tYXNrOworCisJbWFzayAmPSBGRV9BTExfRVhDRVBUOworCV9fZm5zdGN3KCZjb250cm9sKTsKKwlfX3N0bXhjc3IoJm14Y3NyKTsKKwlvbWFzayA9IChjb250cm9sIHwgbXhjc3IgPj4gX1NTRV9FTUFTS19TSElGVCkgJiBGRV9BTExfRVhDRVBUOworCWNvbnRyb2wgJj0gfm1hc2s7CisJX19mbGRjdyhjb250cm9sKTsKKwlteGNzciAmPSB+KG1hc2sgPDwgX1NTRV9FTUFTS19TSElGVCk7CisJX19sZG14Y3NyKG14Y3NyKTsKKwlyZXR1cm4gKH5vbWFzayk7Cit9CisKK2ludAorX19mZWRpc2FibGVleGNlcHQoaW50IG1hc2spCit7CisJaW50IG14Y3NyLCBjb250cm9sLCBvbWFzazsKKworCW1hc2sgJj0gRkVfQUxMX0VYQ0VQVDsKKwlfX2Zuc3RjdygmY29udHJvbCk7CisJX19zdG14Y3NyKCZteGNzcik7CisJb21hc2sgPSAoY29udHJvbCB8IG14Y3NyID4+IF9TU0VfRU1BU0tfU0hJRlQpICYgRkVfQUxMX0VYQ0VQVDsKKwljb250cm9sIHw9IG1hc2s7CisJX19mbGRjdyhjb250cm9sKTsKKwlteGNzciB8PSBtYXNrIDw8IF9TU0VfRU1BU0tfU0hJRlQ7CisJX19sZG14Y3NyKG14Y3NyKTsKKwlyZXR1cm4gKH5vbWFzayk7Cit9CisKK19fd2Vha19yZWZlcmVuY2UoX19mZWVuYWJsZWV4Y2VwdCwgZmVlbmFibGVleGNlcHQpOworX193ZWFrX3JlZmVyZW5jZShfX2ZlZGlzYWJsZWV4Y2VwdCwgZmVkaXNhYmxlZXhjZXB0KTsKZGlmZiAtLWdpdCBhL2xpYm0vYW1kNjQvZmVudi5oIGIvbGlibS9hbWQ2NC9mZW52LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRmOTQzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYW1kNjQvZmVudi5oCkBAIC0wLDAgKzEsMjAzIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9hbWQ2NC9mZW52LmgsdiAxLjUgMjAwNS8wMy8xNiAyMjozNDoxNCBkYXMgRXhwICQKKyAqLworCisjaWZuZGVmCV9GRU5WX0hfCisjZGVmaW5lCV9GRU5WX0hfCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxzeXMvX3R5cGVzLmg+CisKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgeworCQlfX3VpbnQzMl90CV9fY29udHJvbDsKKwkJX191aW50MzJfdAlfX3N0YXR1czsKKwkJX191aW50MzJfdAlfX3RhZzsKKwkJY2hhcgkJX19vdGhlclsxNl07CisJfSBfX3g4NzsKKwlfX3VpbnQzMl90CQlfX214Y3NyOworfSBmZW52X3Q7CisKK3R5cGVkZWYJX191aW50MTZfdAlmZXhjZXB0X3Q7CisKKy8qIEV4Y2VwdGlvbiBmbGFncyAqLworI2RlZmluZQlGRV9JTlZBTElECTB4MDEKKyNkZWZpbmUJRkVfREVOT1JNQUwJMHgwMgorI2RlZmluZQlGRV9ESVZCWVpFUk8JMHgwNAorI2RlZmluZQlGRV9PVkVSRkxPVwkweDA4CisjZGVmaW5lCUZFX1VOREVSRkxPVwkweDEwCisjZGVmaW5lCUZFX0lORVhBQ1QJMHgyMAorI2RlZmluZQlGRV9BTExfRVhDRVBUCShGRV9ESVZCWVpFUk8gfCBGRV9ERU5PUk1BTCB8IEZFX0lORVhBQ1QgfCBcCisJCQkgRkVfSU5WQUxJRCB8IEZFX09WRVJGTE9XIHwgRkVfVU5ERVJGTE9XKQorCisvKiBSb3VuZGluZyBtb2RlcyAqLworI2RlZmluZQlGRV9UT05FQVJFU1QJMHgwMDAwCisjZGVmaW5lCUZFX0RPV05XQVJECTB4MDQwMAorI2RlZmluZQlGRV9VUFdBUkQJMHgwODAwCisjZGVmaW5lCUZFX1RPV0FSRFpFUk8JMHgwYzAwCisjZGVmaW5lCV9ST1VORF9NQVNLCShGRV9UT05FQVJFU1QgfCBGRV9ET1dOV0FSRCB8IFwKKwkJCSBGRV9VUFdBUkQgfCBGRV9UT1dBUkRaRVJPKQorCisvKgorICogQXMgY29tcGFyZWQgdG8gdGhlIHg4NyBjb250cm9sIHdvcmQsIHRoZSBTU0UgdW5pdCdzIGNvbnRyb2wgd29yZAorICogaGFzIHRoZSByb3VuZGluZyBjb250cm9sIGJpdHMgb2Zmc2V0IGJ5IDMgYW5kIHRoZSBleGNlcHRpb24gbWFzaworICogYml0cyBvZmZzZXQgYnkgNy4KKyAqLworI2RlZmluZQlfU1NFX1JPVU5EX1NISUZUCTMKKyNkZWZpbmUJX1NTRV9FTUFTS19TSElGVAk3CisKK19fQkVHSU5fREVDTFMKKworLyogRGVmYXVsdCBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCAqLworZXh0ZXJuIGNvbnN0IGZlbnZfdAlfX2ZlX2RmbF9lbnY7CisjZGVmaW5lCUZFX0RGTF9FTlYJKCZfX2ZlX2RmbF9lbnYpCisKKyNkZWZpbmUJX19mbGRjdyhfX2N3KQkJX19hc20gX192b2xhdGlsZSgiZmxkY3cgJTAiIDogOiAibSIgKF9fY3cpKQorI2RlZmluZQlfX2ZsZGVudihfX2VudikJCV9fYXNtIF9fdm9sYXRpbGUoImZsZGVudiAlMCIgOiA6ICJtIiAoX19lbnYpKQorI2RlZmluZQlfX2ZuY2xleCgpCQlfX2FzbSBfX3ZvbGF0aWxlKCJmbmNsZXgiKQorI2RlZmluZQlfX2Zuc3RlbnYoX19lbnYpCV9fYXNtIF9fdm9sYXRpbGUoImZuc3RlbnYgJTAiIDogIj1tIiAoKihfX2VudikpKQorI2RlZmluZQlfX2Zuc3RjdyhfX2N3KQkJX19hc20gX192b2xhdGlsZSgiZm5zdGN3ICUwIiA6ICI9bSIgKCooX19jdykpKQorI2RlZmluZQlfX2Zuc3RzdyhfX3N3KQkJX19hc20gX192b2xhdGlsZSgiZm5zdHN3ICUwIiA6ICI9YW0iICgqKF9fc3cpKSkKKyNkZWZpbmUJX19md2FpdCgpCQlfX2FzbSBfX3ZvbGF0aWxlKCJmd2FpdCIpCisjZGVmaW5lCV9fbGRteGNzcihfX2NzcikJX19hc20gX192b2xhdGlsZSgibGRteGNzciAlMCIgOiA6ICJtIiAoX19jc3IpKQorI2RlZmluZQlfX3N0bXhjc3IoX19jc3IpCV9fYXNtIF9fdm9sYXRpbGUoInN0bXhjc3IgJTAiIDogIj1tIiAoKihfX2NzcikpKQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWNsZWFyZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJZmVudl90IF9fZW52OworCisJaWYgKF9fZXhjZXB0cyA9PSBGRV9BTExfRVhDRVBUKSB7CisJCV9fZm5jbGV4KCk7CisJfSBlbHNlIHsKKwkJX19mbnN0ZW52KCZfX2Vudi5fX3g4Nyk7CisJCV9fZW52Ll9feDg3Ll9fc3RhdHVzICY9IH5fX2V4Y2VwdHM7CisJCV9fZmxkZW52KF9fZW52Ll9feDg3KTsKKwl9CisJX19zdG14Y3NyKCZfX2Vudi5fX214Y3NyKTsKKwlfX2Vudi5fX214Y3NyICY9IH5fX2V4Y2VwdHM7CisJX19sZG14Y3NyKF9fZW52Ll9fbXhjc3IpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZXhjZXB0ZmxhZyhmZXhjZXB0X3QgKl9fZmxhZ3AsIGludCBfX2V4Y2VwdHMpCit7CisJaW50IF9fbXhjc3IsIF9fc3RhdHVzOworCisJX19zdG14Y3NyKCZfX214Y3NyKTsKKwlfX2Zuc3RzdygmX19zdGF0dXMpOworCSpfX2ZsYWdwID0gKF9fbXhjc3IgfCBfX3N0YXR1cykgJiBfX2V4Y2VwdHM7CisJcmV0dXJuICgwKTsKK30KKworaW50IGZlc2V0ZXhjZXB0ZmxhZyhjb25zdCBmZXhjZXB0X3QgKl9fZmxhZ3AsIGludCBfX2V4Y2VwdHMpOworaW50IGZlcmFpc2VleGNlcHQoaW50IF9fZXhjZXB0cyk7CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZldGVzdGV4Y2VwdChpbnQgX19leGNlcHRzKQoreworCWludCBfX214Y3NyLCBfX3N0YXR1czsKKworCV9fc3RteGNzcigmX19teGNzcik7CisJX19mbnN0c3coJl9fc3RhdHVzKTsKKwlyZXR1cm4gKChfX3N0YXR1cyB8IF9fbXhjc3IpICYgX19leGNlcHRzKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRyb3VuZCh2b2lkKQoreworCWludCBfX2NvbnRyb2w7CisKKwkvKgorCSAqIFdlIGFzc3VtZSB0aGF0IHRoZSB4ODcgYW5kIHRoZSBTU0UgdW5pdCBhZ3JlZSBvbiB0aGUKKwkgKiByb3VuZGluZyBtb2RlLiAgUmVhZGluZyB0aGUgY29udHJvbCB3b3JkIG9uIHRoZSB4ODcgdHVybnMKKwkgKiBvdXQgdG8gYmUgYWJvdXQgNSB0aW1lcyBmYXN0ZXIgdGhhbiByZWFkaW5nIGl0IG9uIHRoZSBTU0UKKwkgKiB1bml0IG9uIGFuIE9wdGVyb24gMjQ0LgorCSAqLworCV9fZm5zdGN3KCZfX2NvbnRyb2wpOworCXJldHVybiAoX19jb250cm9sICYgX1JPVU5EX01BU0spOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldHJvdW5kKGludCBfX3JvdW5kKQoreworCWludCBfX214Y3NyLCBfX2NvbnRyb2w7CisKKwlpZiAoX19yb3VuZCAmIH5fUk9VTkRfTUFTSykKKwkJcmV0dXJuICgtMSk7CisKKwlfX2Zuc3RjdygmX19jb250cm9sKTsKKwlfX2NvbnRyb2wgJj0gfl9ST1VORF9NQVNLOworCV9fY29udHJvbCB8PSBfX3JvdW5kOworCV9fZmxkY3coX19jb250cm9sKTsKKworCV9fc3RteGNzcigmX19teGNzcik7CisJX19teGNzciAmPSB+KF9ST1VORF9NQVNLIDw8IF9TU0VfUk9VTkRfU0hJRlQpOworCV9fbXhjc3IgfD0gX19yb3VuZCA8PCBfU1NFX1JPVU5EX1NISUZUOworCV9fbGRteGNzcihfX214Y3NyKTsKKworCXJldHVybiAoMCk7Cit9CisKK2ludCBmZWdldGVudihmZW52X3QgKl9fZW52cCk7CitpbnQgZmVob2xkZXhjZXB0KGZlbnZfdCAqX19lbnZwKTsKKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRlbnYoY29uc3QgZmVudl90ICpfX2VudnApCit7CisKKwlfX2ZsZGVudihfX2VudnAtPl9feDg3KTsKKwlfX2xkbXhjc3IoX19lbnZwLT5fX214Y3NyKTsKKwlyZXR1cm4gKDApOworfQorCitpbnQgZmV1cGRhdGVlbnYoY29uc3QgZmVudl90ICpfX2VudnApOworCisjaWYgX19CU0RfVklTSUJMRQorCitpbnQgZmVlbmFibGVleGNlcHQoaW50IF9fbWFzayk7CitpbnQgZmVkaXNhYmxlZXhjZXB0KGludCBfX21hc2spOworCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldGV4Y2VwdCh2b2lkKQoreworCWludCBfX2NvbnRyb2w7CisKKwkvKgorCSAqIFdlIGFzc3VtZSB0aGF0IHRoZSBtYXNrcyBmb3IgdGhlIHg4NyBhbmQgdGhlIFNTRSB1bml0IGFyZQorCSAqIHRoZSBzYW1lLgorCSAqLworCV9fZm5zdGN3KCZfX2NvbnRyb2wpOworCXJldHVybiAofl9fY29udHJvbCAmIEZFX0FMTF9FWENFUFQpOworfQorCisjZW5kaWYgLyogX19CU0RfVklTSUJMRSAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogIV9GRU5WX0hfICovCmRpZmYgLS1naXQgYS9saWJtL2FtZDY0L3NfbGxyaW50LlMgYi9saWJtL2FtZDY0L3NfbGxyaW50LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxYzczYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYW1kNjQvc19sbHJpbnQuUwpAQCAtMCwwICsxLDYgQEAKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vYW1kNjQvc19sbHJpbnQuUyx2IDEuMSAyMDA1LzAxLzE1IDAzOjMyOjI4IGRhcyBFeHAgJCIpCisJCisvKiBzaXplb2YobG9uZykgPT0gc2l6ZW9mKGxvbmcgbG9uZykgKi8KKyNkZWZpbmUJZm4JbGxyaW50CisjaW5jbHVkZSAic19scmludC5TIgpkaWZmIC0tZ2l0IGEvbGlibS9hbWQ2NC9zX2xscmludGYuUyBiL2xpYm0vYW1kNjQvc19sbHJpbnRmLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYyY2ZjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYW1kNjQvc19sbHJpbnRmLlMKQEAgLTAsMCArMSw2IEBACisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2FtZDY0L3NfbGxyaW50Zi5TLHYgMS4xIDIwMDUvMDQvMTYgMjE6MTI6NTUgZGFzIEV4cCAkIikKKwkKKy8qIHNpemVvZihsb25nKSA9PSBzaXplb2YobG9uZyBsb25nKSAqLworI2RlZmluZQlmbglsbHJpbnRmCisjaW5jbHVkZSAic19scmludGYuUyIKZGlmZiAtLWdpdCBhL2xpYm0vYW1kNjQvc19scmludC5TIGIvbGlibS9hbWQ2NC9zX2xyaW50LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxYjczMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYW1kNjQvc19scmludC5TCkBAIC0wLDAgKzEsMzYgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKKyNpZm5kZWYgZm4KK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2FtZDY0L3NfbHJpbnQuUyx2IDEuMSAyMDA1LzAxLzE1IDAzOjMyOjI4IGRhcyBFeHAgJCIpCisjZGVmaW5lCWZuCWxyaW50CisjZW5kaWYKKworRU5UUlkoZm4pCisJY3Z0c2Qyc2kgJXhtbTAsICVyYXgKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vYW1kNjQvc19scmludGYuUyBiL2xpYm0vYW1kNjQvc19scmludGYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDZlODM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9hbWQ2NC9zX2xyaW50Zi5TCkBAIC0wLDAgKzEsMzYgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKKyNpZm5kZWYgZm4KK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2FtZDY0L3NfbHJpbnRmLlMsdiAxLjEgMjAwNS8wNC8xNiAyMToxMjo1NSBkYXMgRXhwICQiKQorI2RlZmluZQlmbglscmludGYKKyNlbmRpZgorCitFTlRSWShmbikKKwljdnRzczJzaSAleG1tMCwgJXJheAorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9hbWQ2NC9zX3JlbXF1by5TIGIvbGlibS9hbWQ2NC9zX3JlbXF1by5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZjNiNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2FtZDY0L3NfcmVtcXVvLlMKQEAgLTAsMCArMSw2NSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogQmFzZWQgb24gcHVibGljLWRvbWFpbiByZW1haW5kZXIgcm91dGluZSBieSBKLlQuIENvbmtsaW4gPGp0Y0BOZXRCU0Qub3JnPi4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2FtZDY0L3NfcmVtcXVvLlMsdiAxLjEgMjAwNS8wMy8yNSAwNDo0MDo0NCBkYXMgRXhwICQiKTsgCisJCitFTlRSWShyZW1xdW8pCisJbW92c2QJJXhtbTAsLTgoJXJzcCkKKwltb3ZzZAkleG1tMSwtMTYoJXJzcCkKKwlmbGRsCS0xNiglcnNwKQorCWZsZGwJLTgoJXJzcCkKKzE6CWZwcmVtMQorCWZzdHN3CSVheAorCWJ0dwkkMTAsJWF4CisJamMJMWIKKwlmc3RwCSVzdCgxKQorLyogRXh0cmFjdCB0aGUgdGhyZWUgbG93LW9yZGVyIGJpdHMgb2YgdGhlIHF1b3RpZW50IGZyb20gQzAsQzMsQzEuICovCisJc2hybAkkNiwlZWF4CisJbW92bAklZWF4LCVlY3gKKwlhbmRsCSQweDEwOCwlZWF4CisJcm9ybAkkNywlZWF4CisJb3JsCSVlYXgsJWVjeAorCXJvbGwJJDQsJWVheAorCW9ybAklZWN4LCVlYXgKKwlhbmRsCSQ3LCVlYXgKKy8qIE5lZ2F0ZSB0aGUgcXVvdGllbnQgYml0cyBpZiB4Knk8MC4gIEF2b2lkIHVzaW5nIGFuIHVucHJlZGljdGFibGUgYnJhbmNoLiAqLworCW1vdmwJLTEyKCVyc3ApLCVlY3gKKwl4b3JsCS00KCVyc3ApLCVlY3gKKwlzYXJsCSQxNiwlZWN4CisJc2FybAkkMTYsJWVjeAorCXhvcmwJJWVjeCwlZWF4CisJYW5kbAkkMSwlZWN4CisJYWRkbAklZWN4LCVlYXgKKy8qIFN0b3JlIHRoZSBxdW90aWVudCBhbmQgcmV0dXJuLiAqLworCW1vdmwJJWVheCwoJXJkaSkKKwlmc3RwbAktOCglcnNwKQorCW1vdnNkCS04KCVyc3ApLCV4bW0wCisJcmV0CmRpZmYgLS1naXQgYS9saWJtL2FtZDY0L3NfcmVtcXVvZi5TIGIvbGlibS9hbWQ2NC9zX3JlbXF1b2YuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmI2MDRmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9hbWQ2NC9zX3JlbXF1b2YuUwpAQCAtMCwwICsxLDY1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBCYXNlZCBvbiBwdWJsaWMtZG9tYWluIHJlbWFpbmRlciByb3V0aW5lIGJ5IEouVC4gQ29ua2xpbiA8anRjQE5ldEJTRC5vcmc+LgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vYW1kNjQvc19yZW1xdW9mLlMsdiAxLjEgMjAwNS8wMy8yNSAwNDo0MDo0NCBkYXMgRXhwICQiKTsgCisJCitFTlRSWShyZW1xdW9mKQorCW1vdnNzCSV4bW0wLC00KCVyc3ApCisJbW92c3MJJXhtbTEsLTgoJXJzcCkKKwlmbGRzCS04KCVyc3ApCisJZmxkcwktNCglcnNwKQorMToJZnByZW0xCisJZnN0c3cJJWF4CisJYnR3CSQxMCwlYXgKKwlqYwkxYgorCWZzdHAJJXN0KDEpCisvKiBFeHRyYWN0IHRoZSB0aHJlZSBsb3ctb3JkZXIgYml0cyBvZiB0aGUgcXVvdGllbnQgZnJvbSBDMCxDMyxDMS4gKi8KKwlzaHJsCSQ2LCVlYXgKKwltb3ZsCSVlYXgsJWVjeAorCWFuZGwJJDB4MTA4LCVlYXgKKwlyb3JsCSQ3LCVlYXgKKwlvcmwJJWVheCwlZWN4CisJcm9sbAkkNCwlZWF4CisJb3JsCSVlY3gsJWVheAorCWFuZGwJJDcsJWVheAorLyogTmVnYXRlIHRoZSBxdW90aWVudCBiaXRzIGlmIHgqeTwwLiAgQXZvaWQgdXNpbmcgYW4gdW5wcmVkaWN0YWJsZSBicmFuY2guICovCisJbW92bAktOCglcnNwKSwlZWN4CisJeG9ybAktNCglcnNwKSwlZWN4CisJc2FybAkkMTYsJWVjeAorCXNhcmwJJDE2LCVlY3gKKwl4b3JsCSVlY3gsJWVheAorCWFuZGwJJDEsJWVjeAorCWFkZGwJJWVjeCwlZWF4CisvKiBTdG9yZSB0aGUgcXVvdGllbnQgYW5kIHJldHVybi4gKi8KKwltb3ZsCSVlYXgsKCVyZGkpCisJZnN0cHMJLTQoJXJzcCkKKwltb3ZzcwktNCglcnNwKSwleG1tMAorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9hbWQ2NC9zX3NjYWxibi5TIGIvbGlibS9hbWQ2NC9zX3NjYWxibi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NDJlMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2FtZDY0L3Nfc2NhbGJuLlMKQEAgLTAsMCArMSwzOSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2FtZDY0L3Nfc2NhbGJuLlMsdiAxLjEgMjAwNS8wNC8xNiAyMToxMjo1NSBkYXMgRXhwICQiKQorCitFTlRSWShzY2FsYm4pCisJbW92c2QJJXhtbTAsLTgoJXJzcCkKKwltb3ZsCSVlZGksLTEyKCVyc3ApCisJZmlsZGwJLTEyKCVyc3ApCisJZmxkbAktOCglcnNwKQorCWZzY2FsZQorCWZzdHAJJXN0KDEpCisJZnN0cGwJLTgoJXJzcCkKKwltb3ZzZAktOCglcnNwKSwleG1tMAorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9hbWQ2NC9zX3NjYWxibmYuUyBiL2xpYm0vYW1kNjQvc19zY2FsYm5mLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiOWFiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYW1kNjQvc19zY2FsYm5mLlMKQEAgLTAsMCArMSw0MiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2FtZDY0L3Nfc2NhbGJuZi5TLHYgMS4yIDIwMDUvMDkvMTIgMjA6NTQ6MDAgZGFzIEV4cCAkIikKKworRU5UUlkoc2NhbGJuZikKKwltb3ZzcwkleG1tMCwtOCglcnNwKQorCW1vdmwJJWVkaSwtNCglcnNwKQorCWZpbGRsCS00KCVyc3ApCisJZmxkcwktOCglcnNwKQorCWZzY2FsZQorCWZzdHAJJXN0KDEpCisJZnN0cHMJLTgoJXJzcCkKKwltb3ZzcwktOCglcnNwKSwleG1tMAorCXJldAorCisuZ2xvYmwgQ05BTUUobGRleHBmKQorLnNldAlDTkFNRShsZGV4cGYpLENOQU1FKHNjYWxibmYpCmRpZmYgLS1naXQgYS9saWJtL2FtZDY0L3Nfc2NhbGJubC5TIGIvbGlibS9hbWQ2NC9zX3NjYWxibmwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzYyOWE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9hbWQ2NC9zX3NjYWxibmwuUwpAQCAtMCwwICsxLDE5IEBACisvKgorICogQmFzZWQgb24gY29kZSB3cml0dGVuIGJ5IEouVC4gQ29ua2xpbiA8anRjQG5ldGJzZC5vcmc+LgorICogUHVibGljIGRvbWFpbi4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2FtZDY0L3Nfc2NhbGJubC5TLHYgMS4xIDIwMDUvMDQvMTYgMjE6MTI6NTUgZGFzIEV4cCAkIikKKy8qIFJDU0lEKCIkTmV0QlNEOiBzX3NjYWxibmYuUyx2IDEuNCAxOTk5LzAxLzAyIDA1OjE1OjQwIGtyaXN0ZXJ3IEV4cCAkIikgKi8KKworRU5UUlkoc2NhbGJubCkKKwltb3ZsCSVlZGksLTQoJXJzcCkKKwlmaWxkbAktNCglcnNwKQorCWZsZHQJOCglcnNwKQorCWZzY2FsZQorCWZzdHAJJXN0KDEpCisJcmV0CisKKy5nbG9ibAlDTkFNRShsZGV4cGwpCisuc2V0CUNOQU1FKGxkZXhwbCksQ05BTUUoc2NhbGJubCkKZGlmZiAtLWdpdCBhL2xpYm0vYXJtL01ha2VmaWxlLmluYyBiL2xpYm0vYXJtL01ha2VmaWxlLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTU5Y2MzCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9hcm0vTWFrZWZpbGUuaW5jCkBAIC0wLDAgKzEsMyBAQAorIyAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2FybS9NYWtlZmlsZS5pbmMsdiAxLjEgMjAwNS8wMy8wNyAwNDo1MzozNSBkYXMgRXhwICQKKworTERCTF9QUkVDID0gNTMKZGlmZiAtLWdpdCBhL2xpYm0vYXJtL19mcG1hdGguaCBiL2xpYm0vYXJtL19mcG1hdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWU0MzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9hcm0vX2ZwbWF0aC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzIERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbGliYy9hcm0vX2ZwbWF0aC5oLHYgMS40IDIwMDUvMDMvMjAgMDA6NTM6NTIgY29nbmV0IEV4cCAkCisgKi8KKwordW5pb24gSUVFRWwyYml0cyB7CisJbG9uZyBkb3VibGUJZTsKKwlzdHJ1Y3QgeworI2lmbmRlZiBfX0FSTUVCX18KKwkJdW5zaWduZWQgaW50CW1hbmwJOjMyOworCQl1bnNpZ25lZCBpbnQJbWFuaAk6MjA7CisJCXVuc2lnbmVkIGludAlleHAJOjExOworCQl1bnNpZ25lZCBpbnQJc2lnbgk6MTsKKyNlbHNlCisJCXVuc2lnbmVkIGludAkJc2lnbgk6MTsKKwkJdW5zaWduZWQgaW50CQlleHAJOjExOworCQl1bnNpZ25lZCBpbnQJCW1hbmgJOjIwOworCQl1bnNpZ25lZCBpbnQJCW1hbmwJOjMyOworI2VuZGlmCisJfSBiaXRzOworfTsKKworI2RlZmluZQlMREJMX05CSVQJMAorI2RlZmluZQltYXNrX25iaXRfbCh1KQkoKHZvaWQpMCkKKworI2RlZmluZQlMREJMX01BTkhfU0laRQkzMgorI2RlZmluZQlMREJMX01BTkxfU0laRQkzMgorCisjZGVmaW5lCUxEQkxfVE9fQVJSQVkzMih1LCBhKSBkbyB7CQkJXAorCShhKVswXSA9ICh1aW50MzJfdCkodSkuYml0cy5tYW5sOwkJXAorCShhKVsxXSA9ICh1aW50MzJfdCkodSkuYml0cy5tYW5oOwkJXAorfSB3aGlsZSgwKQpkaWZmIC0tZ2l0IGEvbGlibS9hcm0vZmVudi5jIGIvbGlibS9hcm0vZmVudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OWYxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2FybS9mZW52LmMKQEAgLTAsMCArMSwzNSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2FybS9mZW52LmMsdiAxLjEgMjAwNC8wNi8wNiAxMDowMzo1OSBkYXMgRXhwICQKKyAqLworCisjaW5jbHVkZSA8ZmVudi5oPgorCisvKgorICogSG9wZWZ1bGx5IHRoZSBzeXN0ZW0gSUQgYnl0ZSBpcyBpbW11dGFibGUsIHNvIGl0J3MgdmFsaWQgdG8gdXNlCisgKiB0aGlzIGFzIGEgZGVmYXVsdCBlbnZpcm9ubWVudC4KKyAqLworY29uc3QgZmVudl90IF9fZmVfZGZsX2VudiA9IDA7CmRpZmYgLS1naXQgYS9saWJtL2FybS9mZW52LmggYi9saWJtL2FybS9mZW52LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkzYTU5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYXJtL2ZlbnYuaApAQCAtMCwwICsxLDIxNyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vYXJtL2ZlbnYuaCx2IDEuNSAyMDA1LzAzLzE2IDE5OjAzOjQ1IGRhcyBFeHAgJAorICovCisKKyNpZm5kZWYJX0ZFTlZfSF8KKyNkZWZpbmUJX0ZFTlZfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCit0eXBlZGVmCXVpbnQzMl90CWZlbnZfdDsKK3R5cGVkZWYJdWludDMyX3QJZmV4Y2VwdF90OworCisvKiBFeGNlcHRpb24gZmxhZ3MgKi8KKyNkZWZpbmUJRkVfSU5WQUxJRAkweDAwMDEKKyNkZWZpbmUJRkVfRElWQllaRVJPCTB4MDAwMgorI2RlZmluZQlGRV9PVkVSRkxPVwkweDAwMDQKKyNkZWZpbmUJRkVfVU5ERVJGTE9XCTB4MDAwOAorI2RlZmluZQlGRV9JTkVYQUNUCTB4MDAxMAorI2RlZmluZQlGRV9BTExfRVhDRVBUCShGRV9ESVZCWVpFUk8gfCBGRV9JTkVYQUNUIHwgXAorCQkJIEZFX0lOVkFMSUQgfCBGRV9PVkVSRkxPVyB8IEZFX1VOREVSRkxPVykKKworLyogUm91bmRpbmcgbW9kZXMgKi8KKyNkZWZpbmUJRkVfVE9ORUFSRVNUCTB4MDAwMAorI2RlZmluZQlGRV9UT1dBUkRaRVJPCTB4MDAwMQorI2RlZmluZQlGRV9VUFdBUkQJMHgwMDAyCisjZGVmaW5lCUZFX0RPV05XQVJECTB4MDAwMworI2RlZmluZQlfUk9VTkRfTUFTSwkoRkVfVE9ORUFSRVNUIHwgRkVfRE9XTldBUkQgfCBcCisJCQkgRkVfVVBXQVJEIHwgRkVfVE9XQVJEWkVSTykKKy8qIF9fQkVHSU5fREVDTFMgKi8KKworLyogRGVmYXVsdCBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCAqLworZXh0ZXJuIGNvbnN0IGZlbnZfdAlfX2ZlX2RmbF9lbnY7CisjZGVmaW5lCUZFX0RGTF9FTlYJKCZfX2ZlX2RmbF9lbnYpCisKKy8qIFdlIG5lZWQgdG8gYmUgYWJsZSB0byBtYXAgc3RhdHVzIGZsYWcgcG9zaXRpb25zIHRvIG1hc2sgZmxhZyBwb3NpdGlvbnMgKi8KKyNkZWZpbmUgX0ZQVVNXX1NISUZUCTE2CisjZGVmaW5lCV9FTkFCTEVfTUFTSwkoRkVfQUxMX0VYQ0VQVCA8PCBfRlBVU1dfU0hJRlQpCisKKyNpZmRlZglBUk1fSEFSRF9GTE9BVAorI2RlZmluZQlfX3JmcyhfX2Zwc3IpCV9fYXNtIF9fdm9sYXRpbGUoInJmcyAlMCIgOiAiPXIiICgqKF9fZnBzcikpKQorI2RlZmluZQlfX3dmcyhfX2Zwc3IpCV9fYXNtIF9fdm9sYXRpbGUoIndmcyAlMCIgOiA6ICJyIiAoX19mcHNyKSkKKyNlbHNlCisjZGVmaW5lIF9fcmZzKF9fZnBzcikKKyNkZWZpbmUgX193ZnMoX19mcHNyKQorI2VuZGlmCisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlY2xlYXJleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwlmZXhjZXB0X3QgX19mcHNyOworCisJX19yZnMoJl9fZnBzcik7CisJX19mcHNyICY9IH5fX2V4Y2VwdHM7CisJX193ZnMoX19mcHNyKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldGV4Y2VwdGZsYWcoZmV4Y2VwdF90ICpfX2ZsYWdwLCBpbnQgX19leGNlcHRzKQoreworCWZleGNlcHRfdCBfX2Zwc3I7CisKKwlfX3JmcygmX19mcHNyKTsKKwkqX19mbGFncCA9IF9fZnBzciAmIF9fZXhjZXB0czsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldGV4Y2VwdGZsYWcoY29uc3QgZmV4Y2VwdF90ICpfX2ZsYWdwLCBpbnQgX19leGNlcHRzKQoreworCWZleGNlcHRfdCBfX2Zwc3I7CisKKwlfX3JmcygmX19mcHNyKTsKKwlfX2Zwc3IgJj0gfl9fZXhjZXB0czsKKwlfX2Zwc3IgfD0gKl9fZmxhZ3AgJiBfX2V4Y2VwdHM7CisJX193ZnMoX19mcHNyKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXJhaXNlZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJZmV4Y2VwdF90IF9fZXggPSBfX2V4Y2VwdHM7CisKKwlmZXNldGV4Y2VwdGZsYWcoJl9fZXgsIF9fZXhjZXB0cyk7CS8qIFhYWCAqLworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZldGVzdGV4Y2VwdChpbnQgX19leGNlcHRzKQoreworCWZleGNlcHRfdCBfX2Zwc3I7CisKKwlfX3JmcygmX19mcHNyKTsKKwlyZXR1cm4gKF9fZnBzciAmIF9fZXhjZXB0cyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0cm91bmQodm9pZCkKK3sKKworCS8qCisJICogQXBwYXJlbnRseSwgdGhlIHJvdW5kaW5nIG1vZGUgaXMgc3BlY2lmaWVkIGFzIHBhcnQgb2YgdGhlCisJICogaW5zdHJ1Y3Rpb24gZm9ybWF0IG9uIEFSTSwgc28gdGhlIGR5bmFtaWMgcm91bmRpbmcgbW9kZSBpcworCSAqIGluZGV0ZXJtaW5hdGUuICBTb21lIEZQVXMgbWF5IGRpZmZlci4KKwkgKi8KKwlyZXR1cm4gKC0xKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRyb3VuZChpbnQgX19yb3VuZCkKK3sKKworCXJldHVybiAoLTEpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldGVudihmZW52X3QgKl9fZW52cCkKK3sKKworCV9fcmZzKF9fZW52cCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVob2xkZXhjZXB0KGZlbnZfdCAqX19lbnZwKQoreworCWZlbnZfdCBfX2VudjsKKworCV9fcmZzKCZfX2Vudik7CisJKl9fZW52cCA9IF9fZW52OworCV9fZW52ICY9IH4oRkVfQUxMX0VYQ0VQVCB8IF9FTkFCTEVfTUFTSyk7CisJX193ZnMoX19lbnYpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2Zlc2V0ZW52KGNvbnN0IGZlbnZfdCAqX19lbnZwKQoreworCisJX193ZnMoKl9fZW52cCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmV1cGRhdGVlbnYoY29uc3QgZmVudl90ICpfX2VudnApCit7CisJZmV4Y2VwdF90IF9fZnBzcjsKKworCV9fcmZzKCZfX2Zwc3IpOworCV9fd2ZzKCpfX2VudnApOworCWZlcmFpc2VleGNlcHQoX19mcHNyICYgRkVfQUxMX0VYQ0VQVCk7CisJcmV0dXJuICgwKTsKK30KKworI2lmIF9fQlNEX1ZJU0lCTEUKKworc3RhdGljIF9faW5saW5lIGludAorZmVlbmFibGVleGNlcHQoaW50IF9fbWFzaykKK3sKKwlmZW52X3QgX19vbGRfZnBzciwgX19uZXdfZnBzcjsKKworCV9fcmZzKCZfX29sZF9mcHNyKTsKKwlfX25ld19mcHNyID0gX19vbGRfZnBzciB8IChfX21hc2sgJiBGRV9BTExfRVhDRVBUKSA8PCBfRlBVU1dfU0hJRlQ7CisJX193ZnMoX19uZXdfZnBzcik7CisJcmV0dXJuICgoX19vbGRfZnBzciA+PiBfRlBVU1dfU0hJRlQpICYgRkVfQUxMX0VYQ0VQVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZGlzYWJsZWV4Y2VwdChpbnQgX19tYXNrKQoreworCWZlbnZfdCBfX29sZF9mcHNyLCBfX25ld19mcHNyOworCisJX19yZnMoJl9fb2xkX2Zwc3IpOworCV9fbmV3X2Zwc3IgPSBfX29sZF9mcHNyICYgfigoX19tYXNrICYgRkVfQUxMX0VYQ0VQVCkgPDwgX0ZQVVNXX1NISUZUKTsKKwlfX3dmcyhfX25ld19mcHNyKTsKKwlyZXR1cm4gKChfX29sZF9mcHNyID4+IF9GUFVTV19TSElGVCkgJiBGRV9BTExfRVhDRVBUKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRleGNlcHQodm9pZCkKK3sKKwlmZW52X3QgX19mcHNyOworCisJX19yZnMoJl9fZnBzcik7CisJcmV0dXJuICgoX19mcHNyICYgX0VOQUJMRV9NQVNLKSA+PiBfRlBVU1dfU0hJRlQpOworfQorCisjZW5kaWYgLyogX19CU0RfVklTSUJMRSAqLworCisvKiBfX0VORF9ERUNMUyAqLworCisjZW5kaWYJLyogIV9GRU5WX0hfICovCmRpZmYgLS1naXQgYS9saWJtL2JzZHNyYy9iX2V4cC5jIGIvbGlibS9ic2RzcmMvYl9leHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjg3M2I5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9ic2RzcmMvYl9leHAuYwpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4NSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHNjY3NpZFtdID0gIkAoIylleHAuYwk4LjEgKEJlcmtlbGV5KSA2LzQvOTMiOworI2VuZGlmIC8qIG5vdCBsaW50ICovCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9ic2RzcmMvYl9leHAuYyx2IDEuNyAyMDA0LzEyLzE2IDIwOjQwOjM3IGRhcyBFeHAgJCIpOyAqLworCisKKy8qIEVYUChYKQorICogUkVUVVJOIFRIRSBFWFBPTkVOVElBTCBPRiBYCisgKiBET1VCTEUgUFJFQ0lTSU9OIChJRUVFIDUzIGJpdHMsIFZBWCBEIEZPUk1BVCA1NiBCSVRTKQorICogQ09ERUQgSU4gQyBCWSBLLkMuIE5HLCAxLzE5Lzg1OworICogUkVWSVNFRCBCWSBLLkMuIE5HIG9uIDIvNi84NSwgMi8xNS84NSwgMy83Lzg1LCAzLzI0Lzg1LCA0LzE2Lzg1LCA2LzE0Lzg2LgorICoKKyAqIFJlcXVpcmVkIHN5c3RlbSBzdXBwb3J0ZWQgZnVuY3Rpb25zOgorICoJc2NhbGIoeCxuKQorICoJY29weXNpZ24oeCx5KQorICoJZmluaXRlKHgpCisgKgorICogTWV0aG9kOgorICoJMS4gQXJndW1lbnQgUmVkdWN0aW9uOiBnaXZlbiB0aGUgaW5wdXQgeCwgZmluZCByIGFuZCBpbnRlZ2VyIGsgc3VjaAorICoJICAgdGhhdAorICoJICAgICAgICAgICAgICAgICAgIHggPSBrKmxuMiArIHIsICB8cnwgPD0gMC41KmxuMiAuCisgKgkgICByIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgciA6PSB6K2MgZm9yIGJldHRlciBhY2N1cmFjeS4KKyAqCisgKgkyLiBDb21wdXRlIGV4cChyKSBieQorICoKKyAqCQlleHAocikgPSAxICsgciArIHIqUjEvKDItUjEpLAorICoJICAgd2hlcmUKKyAqCQlSMSA9IHggLSB4XjIqKHAxK3heMioocDIreF4yKihwMyt4XjIqKHA0K3A1KnheMikpKSkuCisgKgorICoJMy4gZXhwKHgpID0gMl5rICogZXhwKHIpIC4KKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICoJZXhwKElORikgaXMgSU5GLCBleHAoTmFOKSBpcyBOYU47CisgKglleHAoLUlORik9ICAwOworICoJZm9yIGZpbml0ZSBhcmd1bWVudCwgb25seSBleHAoMCk9MSBpcyBleGFjdC4KKyAqCisgKiBBY2N1cmFjeToKKyAqCWV4cCh4KSByZXR1cm5zIHRoZSBleHBvbmVudGlhbCBvZiB4IG5lYXJseSByb3VuZGVkLiBJbiBhIHRlc3QgcnVuCisgKgl3aXRoIDEsMTU2LDAwMCByYW5kb20gYXJndW1lbnRzIG9uIGEgVkFYLCB0aGUgbWF4aW11bSBvYnNlcnZlZAorICoJZXJyb3Igd2FzIDAuODY5IHVscHMgKHVuaXRzIGluIHRoZSBsYXN0IHBsYWNlKS4KKyAqLworCisjaW5jbHVkZSAibWF0aGltcGwuaCIKKworY29uc3Qgc3RhdGljIGRvdWJsZSBwMSA9IDB4MS41NTU1NTU1NTU1NTNlcC0zOworY29uc3Qgc3RhdGljIGRvdWJsZSBwMiA9IC0weDEuNmMxNmMxNmJlYmQ5M3AtOTsKK2NvbnN0IHN0YXRpYyBkb3VibGUgcDMgPSAweDEuMTU2NmFhZjI1ZGUyY3AtMTQ7Citjb25zdCBzdGF0aWMgZG91YmxlIHA0ID0gLTB4MS5iYmQ0MWM1ZDI2YmYxcC0yMDsKK2NvbnN0IHN0YXRpYyBkb3VibGUgcDUgPSAweDEuNjM3Njk3MmJlYTRkMHAtMjU7Citjb25zdCBzdGF0aWMgZG91YmxlIGxuMmhpID0gMHgxLjYyZTQyZmVlMDAwMDBwLTE7Citjb25zdCBzdGF0aWMgZG91YmxlIGxuMmxvID0gMHgxLmEzOWVmMzU3OTNjNzZwLTMzOworY29uc3Qgc3RhdGljIGRvdWJsZSBsbmh1Z2UgPSAweDEuNjYwMmIxNWI3ZWNmMnA5OworY29uc3Qgc3RhdGljIGRvdWJsZSBsbnRpbnkgPSAtMHgxLjc3YWY4ZWJlYWUzNTRwOTsKK2NvbnN0IHN0YXRpYyBkb3VibGUgaW52bG4yID0gMHgxLjcxNTQ3NjUyYjgyZmVwMDsKKworI2lmIDAKK2RvdWJsZSBleHAoeCkKK2RvdWJsZSB4OworeworCWRvdWJsZSAgeixoaSxsbyxjOworCWludCBrOworCisjaWYgIWRlZmluZWQodmF4KSYmIWRlZmluZWQodGFob2UpCisJaWYoeCE9eCkgcmV0dXJuKHgpOwkvKiB4IGlzIE5hTiAqLworI2VuZGlmCS8qICFkZWZpbmVkKHZheCkmJiFkZWZpbmVkKHRhaG9lKSAqLworCWlmKCB4IDw9IGxuaHVnZSApIHsKKwkJaWYoIHggPj0gbG50aW55ICkgeworCisJCSAgICAvKiBhcmd1bWVudCByZWR1Y3Rpb24gOiB4IC0tPiB4IC0gaypsbjIgKi8KKworCQkJaz1pbnZsbjIqeCtjb3B5c2lnbigwLjUseCk7CS8qIGs9TklOVCh4L2xuMikgKi8KKworCQkgICAgLyogZXhwcmVzcyB4LWsqbG4yIGFzIGhpLWxvIGFuZCBsZXQgeD1oaS1sbyByb3VuZGVkICovCisKKwkJCWhpPXgtaypsbjJoaTsKKwkJCXg9aGktKGxvPWsqbG4ybG8pOworCisJCSAgICAvKiByZXR1cm4gMl5rKlsxK3greCpjLygyK2MpXSAgKi8KKwkJCXo9eCp4OworCQkJYz0geCAtIHoqKHAxK3oqKHAyK3oqKHAzK3oqKHA0K3oqcDUpKSkpOworCQkJcmV0dXJuICBzY2FsYigxLjArKGhpLShsby0oeCpjKS8oMi4wLWMpKSksayk7CisKKwkJfQorCQkvKiBlbmQgb2YgeCA+IGxudGlueSAqLworCisJCWVsc2UKKwkJICAgICAvKiBleHAoLWJpZyMpIHVuZGVyZmxvd3MgdG8gemVybyAqLworCQkgICAgIGlmKGZpbml0ZSh4KSkgIHJldHVybihzY2FsYigxLjAsLTUwMDApKTsKKworCQkgICAgIC8qIGV4cCgtSU5GKSBpcyB6ZXJvICovCisJCSAgICAgZWxzZSByZXR1cm4oMC4wKTsKKwl9CisJLyogZW5kIG9mIHggPCBsbmh1Z2UgKi8KKworCWVsc2UKKwkvKiBleHAoSU5GKSBpcyBJTkYsIGV4cCgrYmlnIykgb3ZlcmZsb3dzIHRvIElORiAqLworCSAgICByZXR1cm4oIGZpbml0ZSh4KSA/ICBzY2FsYigxLjAsNTAwMCkgIDogeCk7Cit9CisjZW5kaWYKKworLyogcmV0dXJucyBleHAociA9IHggKyBjKSBmb3IgfGN8IDwgfHh8IHdpdGggbm8gb3ZlcmxhcC4gICovCisKK2RvdWJsZSBfX2V4cF9fRCh4LCBjKQorZG91YmxlIHgsIGM7Cit7CisJZG91YmxlICB6LGhpLGxvOworCWludCBrOworCisJaWYgKHggIT0geCkJLyogeCBpcyBOYU4gKi8KKwkJcmV0dXJuKHgpOworCWlmICggeCA8PSBsbmh1Z2UgKSB7CisJCWlmICggeCA+PSBsbnRpbnkgKSB7CisKKwkJICAgIC8qIGFyZ3VtZW50IHJlZHVjdGlvbiA6IHggLS0+IHggLSBrKmxuMiAqLworCQkJeiA9IGludmxuMip4OworCQkJayA9IHogKyBjb3B5c2lnbiguNSwgeCk7CisKKwkJICAgIC8qIGV4cHJlc3MgKHgrYyktaypsbjIgYXMgaGktbG8gYW5kIGxldCB4PWhpLWxvIHJvdW5kZWQgKi8KKworCQkJaGk9KHgtaypsbjJoaSk7CQkJLyogRXhhY3QuICovCisJCQl4PSBoaSAtIChsbyA9IGsqbG4ybG8tYyk7CisJCSAgICAvKiByZXR1cm4gMl5rKlsxK3greCpjLygyK2MpXSAgKi8KKwkJCXo9eCp4OworCQkJYz0geCAtIHoqKHAxK3oqKHAyK3oqKHAzK3oqKHA0K3oqcDUpKSkpOworCQkJYyA9ICh4KmMpLygyLjAtYyk7CisKKwkJCXJldHVybiAgc2NhbGIoMS4rKGhpLShsbyAtIGMpKSwgayk7CisJCX0KKwkJLyogZW5kIG9mIHggPiBsbnRpbnkgKi8KKworCQllbHNlCisJCSAgICAgLyogZXhwKC1iaWcjKSB1bmRlcmZsb3dzIHRvIHplcm8gKi8KKwkJICAgICBpZihmaW5pdGUoeCkpICByZXR1cm4oc2NhbGIoMS4wLC01MDAwKSk7CisKKwkJICAgICAvKiBleHAoLUlORikgaXMgemVybyAqLworCQkgICAgIGVsc2UgcmV0dXJuKDAuMCk7CisJfQorCS8qIGVuZCBvZiB4IDwgbG5odWdlICovCisKKwllbHNlCisJLyogZXhwKElORikgaXMgSU5GLCBleHAoK2JpZyMpIG92ZXJmbG93cyB0byBJTkYgKi8KKwkgICAgcmV0dXJuKCBmaW5pdGUoeCkgPyAgc2NhbGIoMS4wLDUwMDApICA6IHgpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9ic2RzcmMvYl9sb2cuYyBiL2xpYm0vYnNkc3JjL2JfbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRlNWY2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYnNkc3JjL2JfbG9nLmMKQEAgLTAsMCArMSw0NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciBzY2NzaWRbXSA9ICJAKCMpbG9nLmMJOC4yIChCZXJrZWxleSkgMTEvMzAvOTMiOworI2VuZGlmIC8qIG5vdCBsaW50ICovCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9ic2RzcmMvYl9sb2cuYyx2IDEuOCAyMDA1LzA5LzE5IDExOjI4OjE5IGJkZSBFeHAgJCIpOyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJtYXRoaW1wbC5oIgorCisvKiBUYWJsZS1kcml2ZW4gbmF0dXJhbCBsb2dhcml0aG0uCisgKgorICogVGhpcyBjb2RlIHdhcyBkZXJpdmVkLCB3aXRoIG1pbm9yIG1vZGlmaWNhdGlvbnMsIGZyb206CisgKglQZXRlciBUYW5nLCAiVGFibGUtRHJpdmVuIEltcGxlbWVudGF0aW9uIG9mIHRoZQorICoJTG9nYXJpdGhtIGluIElFRUUgRmxvYXRpbmctUG9pbnQgYXJpdGhtZXRpYy4iIEFDTSBUcmFucy4KKyAqCU1hdGggU29mdHdhcmUsIHZvbCAxNi4gbm8gNCwgcHAgMzc4LTQwMCwgRGVjIDE5OTApLgorICoKKyAqIENhbGN1bGF0ZXMgbG9nKDJebSpGKigxK2YvRikpLCB8Zi9qfCA8PSAxLzI1NiwKKyAqIHdoZXJlIEYgPSBqLzEyOCBmb3IgaiBhbiBpbnRlZ2VyIGluIFswLCAxMjhdLgorICoKKyAqIGxvZygyXm0pID0gbG9nMl9oaSptICsgbG9nMl90YWlsKm0KKyAqIHNpbmNlIG0gaXMgYW4gaW50ZWdlciwgdGhlIGRvbWluYW50IHRlcm0gaXMgZXhhY3QuCisgKiBtIGhhcyBhdCBtb3N0IDEwIGRpZ2l0cyAoZm9yIHN1Ym5vcm1hbCBudW1iZXJzKSwKKyAqIGFuZCBsb2cyX2hpIGhhcyAxMSB0cmFpbGluZyB6ZXJvIGJpdHMuCisgKgorICogbG9nKEYpID0gbG9nRl9oaVtqXSArIGxvZ0ZfbG9bal0gaXMgaW4gdGFidWxhciBmb3JtIGluIGxvZ190YWJsZS5oCisgKiBsb2dGX2hpW10gKyA1MTIgaXMgZXhhY3QuCisgKgorICogbG9nKDErZi9GKSA9IDIqZi8oMipGICsgZikgKyAxLzEyICogKDIqZi8oMipGICsgZikpKiozICsgLi4uCisgKiB0aGUgbGVhZGluZyB0ZXJtIGlzIGNhbGN1bGF0ZWQgdG8gZXh0cmEgcHJlY2lzaW9uIGluIHR3bworICogcGFydHMsIHRoZSBsYXJnZXIgb2Ygd2hpY2ggYWRkcyBleGFjdGx5IHRvIHRoZSBkb21pbmFudAorICogbSBhbmQgRiB0ZXJtcy4KKyAqIFRoZXJlIGFyZSB0d28gY2FzZXM6CisgKgkxLiB3aGVuIG0sIGogYXJlIG5vbi16ZXJvIChtIHwgaiksIHVzZSBhYnNvbHV0ZQorICoJICAgcHJlY2lzaW9uIGZvciB0aGUgbGVhZGluZyB0ZXJtLgorICoJMi4gd2hlbiBtID0gaiA9IDAsIHwxLXh8IDwgMS8yNTYsIGFuZCBsb2coeCkgfj0gKHgtMSkuCisgKgkgICBJbiB0aGlzIGNhc2UsIHVzZSBhIHJlbGF0aXZlIHByZWNpc2lvbiBvZiAyNCBiaXRzLgorICogKFRoaXMgaXMgZG9uZSBkaWZmZXJlbnRseSBpbiB0aGUgb3JpZ2luYWwgcGFwZXIpCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqCTAJcmV0dXJuIHNpZ25hbGxpbmcgLUluZgorICoJbmVnCXJldHVybiBzaWduYWxsaW5nIE5hTgorICoJK0luZglyZXR1cm4gK0luZgorKi8KKworI2RlZmluZSBOIDEyOAorCisvKiBUYWJsZSBvZiBsb2coRmopID0gbG9nRl9oZWFkW2pdICsgbG9nRl90YWlsW2pdLCBmb3IgRmogPSAxK2ovMTI4LgorICogVXNlZCBmb3IgZ2VuZXJhdGlvbiBvZiBleHRlbmQgcHJlY2lzaW9uIGxvZ2FyaXRobXMuCisgKiBUaGUgY29uc3RhbnQgMzUxODQzNzIwODg4MzIgaXMgMl40NSwgc28gdGhlIGRpdmlkZSBpcyBleGFjdC4KKyAqIEl0IGVuc3VyZXMgY29ycmVjdCByZWFkaW5nIG9mIGxvZ0ZfaGVhZCwgZXZlbiBmb3IgaW5hY2N1cmF0ZQorICogZGVjaW1hbC10by1iaW5hcnkgY29udmVyc2lvbiByb3V0aW5lcy4gIChFdmVyeWJvZHkgZ2V0cyB0aGUKKyAqIHJpZ2h0IGFuc3dlciBmb3IgaW50ZWdlcnMgbGVzcyB0aGFuIDJeNTMuKQorICogVmFsdWVzIGZvciBsb2coRikgd2VyZSBnZW5lcmF0ZWQgdXNpbmcgZXJyb3IgPCAxMF4tNTcgYWJzb2x1dGUKKyAqIHdpdGggdGhlIGJjIC1sIHBhY2thZ2UuCisqLworc3RhdGljIGRvdWJsZQlBMSA9IAkgIC4wODMzMzMzMzMzMzMzMzE3ODgyNzsKK3N0YXRpYyBkb3VibGUJQTIgPSAJICAuMDEyNTAwMDAwMDAzNzcxNzQ5MjM7CitzdGF0aWMgZG91YmxlCUEzID0JIC4wMDIyMzIxMzk5ODc5MTk0NDc4MDk7CitzdGF0aWMgZG91YmxlCUE0ID0JLjAwMDQzNDg4Nzc3NzcwNzYxNDU3NDI7CisKK3N0YXRpYyBkb3VibGUgbG9nRl9oZWFkW04rMV0gPSB7CisJMC4sCisJLjAwNzc4MjE0MDQ0MjA2MDM4MTI0NiwKKwkuMDE1NTA0MTg2NTM1OTYzNTI2Njk0LAorCS4wMjMxNjcwNTkyODE1NDc2MDg0MDYsCisJLjAzMDc3MTY1ODY2Njc2NTIzMzY0NywKKwkuMDM4MzE4ODY0MzAyMTQxMjY0NDg4LAorCS4wNDU4MDk1MzYwMzEyNDI3MTQ2NzAsCisJLjA1MzI0NDUxNDUxODgzNzYwNDU1NSwKKwkuMDYwNjI0NjIxODE2NDg2OTc4Nzg2LAorCS4wNjc5NTA2NjE5MDg1MjU5NDQ0NTQsCisJLjA3NTIyMzQyMTIzNzUyNDIzNTAzOSwKKwkuMDgyNDQzNjY5MjEwOTg4NDQ2MTM4LAorCS4wODk2MTIxNTg2ODk3NjA2OTAzMjIsCisJLjA5NjcyOTYyNjQ1ODQ1NDczMTYxOCwKKwkuMTAzNzk2NzkzNjgxNTY3NTc4NDYwLAorCS4xMTA4MTQzNjYzNDAyNjQzMTQyMDMsCisJLjExNzc4MzAzNTY1NjQzMDAwMTgzNiwKKwkuMTI0NzAzNDc4NTAxMDMyODA1MDcwLAorCS4xMzE1NzYzNTc3ODg2MTczMTUyMzYsCisJLjEzODQwMjMyMjg1OTI5MjMyNjAyOSwKKwkuMTQ1MTgyMDA5ODQ0NTc1MDc3Mjk1LAorCS4xNTE5MTYwNDIwMjU3MzIxNjc1MzAsCisJLjE1ODYwNTAzMDE3NjY1OTA1NjQ1MSwKKwkuMTY1MjQ5NTcyODk1MzkwODgzNzg2LAorCS4xNzE4NTAyNTY5MjY1MTgzNDEwNjAsCisJLjE3ODQwNzY1NzQ3MjY4OTYwNjk0NywKKwkuMTg0OTIyMzM4NDkzODM0MTA0MTU2LAorCS4xOTEzOTQ4NTI5OTk1NjUwNDYwNDcsCisJLjE5NzgyNTc0MzMyOTc1ODU1MjEzNSwKKwkuMjA0MjE1NTQxNDI4NzY2MzAwNjY4LAorCS4yMTA1NjQ3NjkxMDczNTAwMDI3NDEsCisJLjIxNjg3MzkzODMwMDUyMzE1MDI0NiwKKwkuMjIzMTQzNTUxMzE0MDI0MDgwMDU2LAorCS4yMjkzNzQxMDEwNjQ4NzczMjI2NDIsCisJLjIzNTU2NjA3MTMxMjg2MDAwMzY3MiwKKwkuMjQxNzE5OTM2ODg2OTY2MDI0NzU4LAorCS4yNDc4MzYxNjM5MDQ1OTQyODY1NzcsCisJLjI1MzkxNTIwOTk4MDczMjQ3MDI4NSwKKwkuMjU5OTU3NTI0NDM2Njg2MDcxNTY3LAorCS4yNjU5NjM1NDg0OTY5ODQwMDM1NzcsCisJLjI3MTkzMzcxNTQ4NDAxMDQ2MzExNCwKKwkuMjc3ODY4NDUxMDAzMDg3MTAyNDM1LAorCS4yODM3NjgxNzMxMzA3Mzg0MzI1MTksCisJLjI4OTYzMzI5MjU4Mjk0ODM0Mjg5NiwKKwkuMjk1NDY0MjEyODkzNDIxMDYzMTk5LAorCS4zMDEyNjEzMzA1NzgxOTk3MDQxNzcsCisJLjMwNzAyNTAzNTI5NDgyNzgzMDUxMiwKKwkuMzEyNzU1NzEwMDA0MjM5NTE3NzI5LAorCS4zMTg0NTM3MzExMTgwOTc0OTM4OTAsCisJLjMyNDExOTQ2ODY1NDMxNjczMzU5MSwKKwkuMzI5NzUzMjg2MzcyNTc5MTY4NTI4LAorCS4zMzUzNTU1NDE5MjA3NjIzMzQ0ODQsCisJLjM0MDkyNjU4Njk3MDQ1NDA4MTg5MiwKKwkuMzQ2NDY2NzY3MzQ2MTAwODIzNDg4LAorCS4zNTE5NzY0MjMxNTY4ODQyNjYwNjMsCisJLjM1NzQ1NTg4ODkyMjIzMTY3OTMxNiwKKwkuMzYyOTA1NDkzNjg5MTQwNzEyMzc2LAorCS4zNjgzMjU1NjExNTg1OTkxNTczNTIsCisJLjM3MzcxNjQwOTc5MzgxNDgxODg0MCwKKwkuMzc5MDc4MzUyOTM0ODExODQ2MzUzLAorCS4zODQ0MTE2OTg5MTAyOTg1ODI2MzIsCisJLjM4OTcxNjc1MTE0MDQ0MDQ2NDk1MSwKKwkuMzk0OTkzODA4MjQwNTQyNDIxMTE3LAorCS40MDAyNDMxNjQxMjc0NTk3NDk1NzksCisJLjQwNTQ2NTEwODEwNzgxOTEwNTQ5OCwKKwkuNDEwNjU5OTI0OTg1MzM4ODc1NTU4LAorCS40MTU4Mjc4OTUxNDM1OTMxOTU4MjUsCisJLjQyMDk2OTI5NDY0NDIzNzM3OTU0MywKKwkuNDI2MDg0Mzk1MzEwNjgxNDI5NjkxLAorCS40MzExNzM0NjQ4MTgxMzAwMTQ0NjQsCisJLjQzNjIzNjc2Njc3NDUyNzQ5NTcyNiwKKwkuNDQxMjc0NTYwODA1MTQwOTM2MjgxLAorCS40NDYyODcxMDI2MjgwNDgxNjAxMTMsCisJLjQ1MTI3NDY0NDEzOTYzMDI1NDM1OCwKKwkuNDU2MjM3NDMzNDgxODc0MTc3MjMyLAorCS40NjExNzU3MTUxMjI0MDgyOTE3OTAsCisJLjQ2NjA4OTcyOTkyNDUzMzQ1Nzk2MCwKKwkuNDcwOTc5NzE1MjE5MDczMTEzOTg1LAorCS40NzU4NDU5MDQ4Njk4NTY4OTQ5NDcsCisJLjQ4MDY4ODUyOTM0NTU3MDcxNDIxMiwKKwkuNDg1NTA3ODE1NzgxNjAyNDAzMTQ5LAorCS40OTAzMDM5ODgwNDU1MjUzMjk2NTMsCisJLjQ5NTA3NzI2Njc5ODAzNDU0MzE3MSwKKwkuNDk5ODI3ODY5NTU2NjExNDAzODIyLAorCS41MDQ1NTYwMTA3NTE5MTIyNTM5MDgsCisJLjUwOTI2MTkwMTc5MDUyMzU1MjMzNSwKKwkuNTEzOTQ1NzUxMTAxMzQ2MTA0NDA1LAorCS41MTg2MDc3NjQyMDgzNTQ2Mzc5NTgsCisJLjUyMzI0ODE0Mzc2NTE1ODYwMjAzNiwKKwkuNTI3ODY3MDg5NjIwNDg1Nzg1NDE3LAorCS41MzI0NjQ3OTg4NjkxMTQwMTk5MDgsCisJLjUzNzA0MTQ2NTg5NzM0NTkxNTQzNiwKKwkuNTQxNTk3MjgyNDMyMTIxNTczOTQ3LAorCS41NDYxMzI0Mzc1OTc0MDcyNjA5MDksCisJLjU1MDY0NzExNzk1MjM5NDE4Mjc5MywKKwkuNTU1MTQxNTA3NTQwNjExMjAwOTY1LAorCS41NTk2MTU3ODc5MzUzOTk1NjY3NzcsCisJLjU2NDA3MDEzODI4NTM4NzY1NjY1MSwKKwkuNTY4NTA0NzM1MzUyNjg5NzQ5NTYxLAorCS41NzI5MTk3NTM1NjIwMTg3NDA5MjIsCisJLjU3NzMxNTM2NTAzNTI0Njk0MTI2MCwKKwkuNTgxNjkxNzM5NjM1MDYxODIxOTAwLAorCS41ODYwNDkwNDUwMDMxNjQ3OTI0MzMsCisJLjU5MDM4NzQ0NjYwMjEwNzk1NzAwNSwKKwkuNTk0NzA3MTA3NzQ2MjE2OTM0MTc0LAorCS41OTkwMDgxODk2NDUyNDY2MDI1OTQsCisJLjYwMzI5MDg1MTQzODk0MTg5OTY4NywKKwkuNjA3NTU1MjUwMjI0MzIyNjYyNjg4LAorCS42MTE4MDE1NDExMDY2MTUzMzE5NTUsCisJLjYxNjAyOTg3NzIxNTYyMzg1NTU5MCwKKwkuNjIwMjQwNDA5NzUxMjA0NDI0NTM3LAorCS42MjQ0MzMyODgwMTIzNjkzMDMwMzIsCisJLjYyODYwODY1OTQyMjc1MjY4MDI1NiwKKwkuNjMyNzY2NjY5NTcwNjI4NDM3MjEzLAorCS42MzY5MDc0NjIyMzYxOTQ5ODc3ODEsCisJLjY0MTAzMTE3OTQyMDY3OTEwOTE3MSwKKwkuNjQ1MTM3OTYxMzczNjIwNzgyOTc4LAorCS42NDkyMjc5NDY2MjU2MTUwMDQ0NTAsCisJLjY1MzMwMTI3MjAxMTk1ODY0NDcyNSwKKwkuNjU3MzU4MDcyNzA5MDMwMjM4OTExLAorCS42NjEzOTg0ODIyNDUyMDM5MjI1MDIsCisJLjY2NTQyMjYzMjU0NDUwNTE3NzA2NSwKKwkuNjY5NDMwNjUzOTQyOTgxNzM0ODcxLAorCS42NzM0MjI2NzUyMTIzNTA0NDExNDIsCisJLjY3NzM5ODgyMzU5MDkyMDA3MzkxMSwKKwkuNjgxMzU5MjI0ODA3MjM4MjA2MjY3LAorCS42ODUzMDQwMDMwOTgyODExMDAzOTIsCisJLjY4OTIzMzI4MTIzODU1NzUzODAxNywKKwkuNjkzMTQ3MTgwNTYwMTE3NzAzODYyCit9OworCitzdGF0aWMgZG91YmxlIGxvZ0ZfdGFpbFtOKzFdID0geworCTAuLAorCS0uMDAwMDAwMDAwMDAwMDA1NDMyMjk5Mzg0MjAwNDksCisJIC4wMDAwMDAwMDAwMDAwMDE3Mjc0NTY3NDk5NzA2MSwKKwktLjAwMDAwMDAwMDAwMDAxMzIzMDE3ODE4MjI5MjMzLAorCS0uMDAwMDAwMDAwMDAwMDExNTQ1Mjc2MjgyODk4NzIsCisJLS4wMDAwMDAwMDAwMDAwMDQ2NjUyOTQ2OTk1ODMwMCwKKwkgLjAwMDAwMDAwMDAwMDA1MTQ4ODQ5NTcyNjg1ODEwLAorCS0uMDAwMDAwMDAwMDAwMDI1MzIxNjg5NDMxMTc0NDUsCisJLS4wMDAwMDAwMDAwMDAwNTIxMzYyMDYzOTEzNjUwNCwKKwktLjAwMDAwMDAwMDAwMDAxODE5NTA2MDAzMDE2ODgxLAorCSAuMDAwMDAwMDAwMDAwMDYzMjkwNjU5NTg3MjQ1NDQsCisJIC4wMDAwMDAwMDAwMDAwODYxNDUxMjkzNjA4NzgxNCwKKwktLjAwMDAwMDAwMDAwMDA3MzU1NzcwMjE5NDM1MDI4LAorCSAuMDAwMDAwMDAwMDAwMDk2MzgwNjc2NTg1NTIyNzcsCisJIC4wMDAwMDAwMDAwMDAwNzU5ODYzNjU5NzE5NDE0MSwKKwkgLjAwMDAwMDAwMDAwMDAyNTc5OTk5MTI4MzA2OTkwLAorCS0uMDAwMDAwMDAwMDAwMDQ2NTQ3Mjk3NDc1OTg0NDQsCisJLS4wMDAwMDAwMDAwMDAwNzU1NjkyMDY4NzQ1MTMzNiwKKwkgLjAwMDAwMDAwMDAwMDEwMTk1NzM1MjIzNzA4NDcyLAorCS0uMDAwMDAwMDAwMDAwMTczMTkwMzQ0MDY0MjIzMDYsCisJLS4wMDAwMDAwMDAwMDAwNzcxODAwMTMzNjgyODA5OCwKKwkgLjAwMDAwMDAwMDAwMDEwOTgwNzU0MDk5ODU1MjM4LAorCS0uMDAwMDAwMDAwMDAwMDIwNDcyMzU3ODAwNDYxOTUsCisJLS4wMDAwMDAwMDAwMDAwODM3MjA5MTA5OTIzNTkxMiwKKwkgLjAwMDAwMDAwMDAwMDE0MDg4MTI3OTM3MTExMTM1LAorCSAuMDAwMDAwMDAwMDAwMTI4NjkwMTcxNTc1ODgyNTcsCisJIC4wMDAwMDAwMDAwMDAxNzc4ODg1MDc3ODE5ODEwNiwKKwkgLjAwMDAwMDAwMDAwMDA2NDQwODU2MTUwNjk2ODkxLAorCSAuMDAwMDAwMDAwMDAwMTYxMzI4MjI2NjcyNDA4MjIsCisJLS4wMDAwMDAwMDAwMDAwNzU0MDkxNjUxMTk1NjE4OCwKKwktLjAwMDAwMDAwMDAwMDAwMDM2NTA3MTg4ODMxNzkwLAorCSAuMDAwMDAwMDAwMDAwMDkxMjA5MzcyNDk5MTQ5ODQsCisJIC4wMDAwMDAwMDAwMDAxODU2NzU3MDk1OTc5NjAxMCwKKwktLjAwMDAwMDAwMDAwMDAzMTQ5MjY1MDY1MTkxNDgzLAorCS0uMDAwMDAwMDAwMDAwMDkzMDk0NTk0OTUxOTY4ODksCisJIC4wMDAwMDAwMDAwMDAxNzkxNDMzODYwMTMyOTExNywKKwktLjAwMDAwMDAwMDAwMDAxMzAyOTc5NzE3MzMwODY2LAorCSAuMDAwMDAwMDAwMDAwMjMwOTczODUyMTc1ODY5MzksCisJIC4wMDAwMDAwMDAwMDAyMzk5OTU0MDQ4NDIxMTczNywKKwkgLjAwMDAwMDAwMDAwMDE1MzkzNzc2MTc0NDU1NDA4LAorCS0uMDAwMDAwMDAwMDAwMzY4NzA0MjgzMTU4Mzc2NzgsCisJIC4wMDAwMDAwMDAwMDAzNjkyMDM3NTA4MjA4MDA4OSwKKwktLjAwMDAwMDAwMDAwMDA5MzgzNDE3MjIzNjYzNjk5LAorCSAuMDAwMDAwMDAwMDAwMDk0MzMzOTgxODk1MTI2OTAsCisJIC4wMDAwMDAwMDAwMDA0MTQ4MTMxODcwNDI1ODU2OCwKKwktLjAwMDAwMDAwMDAwMDAzNzkyMzE2NDgwMjA5MzE0LAorCSAuMDAwMDAwMDAwMDAwMDg0MDMxNTYzMDQ3OTI0MjQsCisJLS4wMDAwMDAwMDAwMDAzNDI2MjkzNDM0ODI4NTQyOSwKKwkgLjAwMDAwMDAwMDAwMDQzNzEyMTkxOTU3NDI5MTQ1LAorCS0uMDAwMDAwMDAwMDAwMTA0NzU3NTAwNTg3NzY1NDEsCisJLS4wMDAwMDAwMDAwMDAxMTExODY3MTM4OTU1OTMyMywKKwkgLjAwMDAwMDAwMDAwMDM3NTQ5NTc3MjU3MjU5ODUzLAorCSAuMDAwMDAwMDAwMDAwMTM5MTI4NDEyMTIxOTc1NjUsCisJIC4wMDAwMDAwMDAwMDAxMDc3NTc0MzAzNzU3MjY0MCwKKwkgLjAwMDAwMDAwMDAwMDI5MzkxODU5MTg3NjQ4MDAwLAorCS0uMDAwMDAwMDAwMDAwNDI3OTA1MDkwNjAwNjA3NzQsCisJIC4wMDAwMDAwMDAwMDAyMjc3NDA3NjExNDAzOTU1NSwKKwkgLjAwMDAwMDAwMDAwMDEwODQ5NTY5NjIyOTY3OTEyLAorCS0uMDAwMDAwMDAwMDAwMjMwNzM4MDE5NDU3MDU3NTgsCisJIC4wMDAwMDAwMDAwMDAxNTc2MTIwMzc3Mzk2OTQzNSwKKwkgLjAwMDAwMDAwMDAwMDAzMzQ1NzEwMjY5NTQ0MDgyLAorCS0uMDAwMDAwMDAwMDAwNDE1MjUxNTgwNjM0MzYxMjMsCisJIC4wMDAwMDAwMDAwMDAzMjY1NTY5ODg5NjkwNzE0NiwKKwktLjAwMDAwMDAwMDAwMDQ0NzA0MjY1MDEwNDUyNDQ2LAorCSAuMDAwMDAwMDAwMDAwMzQ1Mjc2NDc5NTIwMzk3NzIsCisJLS4wMDAwMDAwMDAwMDAwNzA0ODk2MjM5MjEwOTc0NiwKKwkgLjAwMDAwMDAwMDAwMDExNzc2OTc4NzUxMzY5MjE0LAorCS0uMDAwMDAwMDAwMDAwMTA3NzQzNDE0NjE2MDk1NzgsCisJIC4wMDAwMDAwMDAwMDAyMTg2MzM0MzI5MzIxNTkxMCwKKwkgLjAwMDAwMDAwMDAwMDI0MTMyNjM5NDkxMzMzMTMxLAorCSAuMDAwMDAwMDAwMDAwMzkwNTc0NjIyMDk4MzA3MDAsCisJLS4wMDAwMDAwMDAwMDAyNjU3MDY3OTIwMzU2MDc1MSwKKwkgLjAwMDAwMDAwMDAwMDM3MTM1MTQxOTE5NTkyMDIxLAorCS0uMDAwMDAwMDAwMDAwMTcxNjY5MjEzMzYwODI0MzEsCisJLS4wMDAwMDAwMDAwMDAyODY1ODI4NTE1NzkxNDM1MywKKwktLjAwMDAwMDAwMDAwMDIzODEyNTQyMjYzNDQ2ODA5LAorCSAuMDAwMDAwMDAwMDAwMDY1NzY2NTk3Njg1ODAwNjIsCisJLS4wMDAwMDAwMDAwMDAyODIxMDE0Mzg0NjE4MTI2NywKKwkgLjAwMDAwMDAwMDAwMDEwNzAxOTMxNzYyMTE0MjU0LAorCSAuMDAwMDAwMDAwMDAwMTgxMTkzNDYzNjY0NDExMTAsCisJIC4wMDAwMDAwMDAwMDAwOTg0MDQ2NTI3ODIzMjYyNywKKwktLjAwMDAwMDAwMDAwMDMzMTQ5MTUwMjgyNzUyNTQyLAorCS0uMDAwMDAwMDAwMDAwMTgzMDI4NTczNTYwNDE2NjgsCisJLS4wMDAwMDAwMDAwMDAxNjIwNzQwMDE1Njc0NDk0OSwKKwkgLjAwMDAwMDAwMDAwMDQ4MzAzMzE0OTQ5NTUzMjAxLAorCS0uMDAwMDAwMDAwMDAwNzE1NjA1NTMxNzIzODIxMTUsCisJIC4wMDAwMDAwMDAwMDA4ODgyMTIzOTUxODU3MTg1NSwKKwktLjAwMDAwMDAwMDAwMDMwOTAwNTgwNTEzMjM4MjQ0LAorCS0uMDAwMDAwMDAwMDAwNjEwNzY1NTE5NzI4NTE0OTYsCisJIC4wMDAwMDAwMDAwMDAzNTY1OTk2OTY2MzM0NzgzMCwKKwkgLjAwMDAwMDAwMDAwMDM1NzgyMzk2NTkxMjc2MzgzLAorCS0uMDAwMDAwMDAwMDAwNDYyMjYwODcwMDE1NDQ1NzgsCisJIC4wMDAwMDAwMDAwMDA2MjI3OTc2MjkxNzIyNTE1NiwKKwkgLjAwMDAwMDAwMDAwMDcyODM4OTQ3MjcyMDY1NzQxLAorCSAuMDAwMDAwMDAwMDAwMjY4MDk2NDY2MTUyMTE2NzMsCisJLS4wMDAwMDAwMDAwMDAxMDk2MDgyNTA0NjA1OTI3OCwKKwkgLjAwMDAwMDAwMDAwMDAyMzExOTQ5MzgzODAwNTM3LAorCS0uMDAwMDAwMDAwMDAwNTg0NjkwNTgwMDUyOTkyNDcsCisJLS4wMDAwMDAwMDAwMDAwMjEwMzc0ODI1MTE0NDQ5NCwKKwktLjAwMDAwMDAwMDAwMDIzMzIzMTgyOTQ1NTg3NDA4LAorCS0uMDAwMDAwMDAwMDAwNDIzMzM2OTQyODgxNDE5MTYsCisJLS4wMDAwMDAwMDAwMDA0MzkzMzkzNzk2OTczNzg0NCwKKwkgLjAwMDAwMDAwMDAwMDQxMzQxNjQ3MDczODM1NTY1LAorCSAuMDAwMDAwMDAwMDAwMDY4NDE3NjM2NDE1OTE0NjYsCisJIC4wMDAwMDAwMDAwMDA0NzU4NTUzNDAwNDQzMDY0MSwKKwkgLjAwMDAwMDAwMDAwMDgzNjc5Njc4Njc0NzU3Njk1LAorCS0uMDAwMDAwMDAwMDAwODU3NjM3MzQ2NDY2NTg2NDAsCisJIC4wMDAwMDAwMDAwMDAyMTkxMzI4MTIyOTM0MDA5MiwKKwktLjAwMDAwMDAwMDAwMDYyMjQyODQyNTM2NDMxMTQ4LAorCS0uMDAwMDAwMDAwMDAwMTA5ODM1OTQzMjU0Mzg0MzAsCisJIC4wMDAwMDAwMDAwMDA2NTMxMDQzMTM3NzYzMzY1MSwKKwktLjAwMDAwMDAwMDAwMDQ3NTgwMTk5MDIxNzEwNzY5LAorCS0uMDAwMDAwMDAwMDAwMzc4NTQyNTEyNjU0NTcwNDAsCisJIC4wMDAwMDAwMDAwMDA0MDkzOTIzMzIxODY3ODY2NCwKKwkgLjAwMDAwMDAwMDAwMDg3NDI0MzgzOTE0ODU4MjkxLAorCSAuMDAwMDAwMDAwMDAwMjUyMTgxODg0NTY4NDI4ODIsCisJLS4wMDAwMDAwMDAwMDAwMzYwODEzMTM2MDQyMjU1NywKKwktLjAwMDAwMDAwMDAwMDUwNTE4NTU1OTI0MjgwOTAyLAorCSAuMDAwMDAwMDAwMDAwNzg2OTk0MDMzMjMzNTUzMTcsCisJLS4wMDAwMDAwMDAwMDA2NzAyMDg3Njk2MTk0OTA2MCwKKwkgLjAwMDAwMDAwMDAwMDE2MTA4NTc1NzUzOTMyNDU4LAorCSAuMDAwMDAwMDAwMDAwNTg1MjcxODg0MzYyNTE1MDksCisJLS4wMDAwMDAwMDAwMDAzNTI0Njc1NzI5NzkwNDc5MSwKKwktLjAwMDAwMDAwMDAwMDE4MzcyMDg0NDk1NjI5MDU4LAorCSAuMDAwMDAwMDAwMDAwODg2MDY2ODk4MTM0OTQ5MTYsCisJIC4wMDAwMDAwMDAwMDA2NjQ4NjI2ODA3MTQ2ODcwMCwKKwkgLjAwMDAwMDAwMDAwMDYzODMxNjE1MTcwNjQ2NTE5LAorCSAuMDAwMDAwMDAwMDAwMjUxNDQyMzA3MjgzNzYwNzIsCisJLS4wMDAwMDAwMDAwMDAxNzIzOTQ0NDUyNTYxNDgzNAorfTsKKworI2lmIDAKK2RvdWJsZQorI2lmZGVmIF9BTlNJX1NPVVJDRQorbG9nKGRvdWJsZSB4KQorI2Vsc2UKK2xvZyh4KSBkb3VibGUgeDsKKyNlbmRpZgoreworCWludCBtLCBqOworCWRvdWJsZSBGLCBmLCBnLCBxLCB1LCB1MiwgdiwgemVybyA9IDAuMCwgb25lID0gMS4wOworCXZvbGF0aWxlIGRvdWJsZSB1MTsKKworCS8qIENhdGNoIHNwZWNpYWwgY2FzZXMgKi8KKwlpZiAoeCA8PSAwKQorCQlpZiAoeCA9PSB6ZXJvKQkvKiBsb2coMCkgPSAtSW5mICovCisJCQlyZXR1cm4gKC1vbmUvemVybyk7CisJCWVsc2UJCS8qIGxvZyhuZWcpID0gTmFOICovCisJCQlyZXR1cm4gKHplcm8vemVybyk7CisJZWxzZSBpZiAoIWZpbml0ZSh4KSkKKwkJcmV0dXJuICh4K3gpOwkJLyogeCA9IE5hTiwgSW5mICovCisKKwkvKiBBcmd1bWVudCByZWR1Y3Rpb246IDEgPD0gZyA8IDI7IHgvMl5tID0gZzsJKi8KKwkvKiB5ID0gRiooMSArIGYvRikgZm9yIHxmfCA8PSAyXi04CQkqLworCisJbSA9IGxvZ2IoeCk7CisJZyA9IGxkZXhwKHgsIC1tKTsKKwlpZiAobSA9PSAtMTAyMikgeworCQlqID0gbG9nYihnKSwgbSArPSBqOworCQlnID0gbGRleHAoZywgLWopOworCX0KKwlqID0gTiooZy0xKSArIC41OworCUYgPSAoMS4wL04pICogaiArIDE7CS8qIEYqMTI4IGlzIGFuIGludGVnZXIgaW4gWzEyOCwgNTEyXSAqLworCWYgPSBnIC0gRjsKKworCS8qIEFwcHJveGltYXRlIGV4cGFuc2lvbiBmb3IgbG9nKDErZi9GKSB+PSB1ICsgcSAqLworCWcgPSAxLygyKkYrZik7CisJdSA9IDIqZipnOworCXYgPSB1KnU7CisJcSA9IHUqdiooQTEgKyB2KihBMiArIHYqKEEzICsgdipBNCkpKTsKKworICAgIC8qIGNhc2UgMTogdTEgPSB1IHJvdW5kZWQgdG8gMl4tNDMgYWJzb2x1dGUuICBTaW5jZSB1IDwgMl4tOCwKKyAgICAgKiAJICAgICAgIHUxIGhhcyBhdCBtb3N0IDM1IGJpdHMsIGFuZCBGKnUxIGlzIGV4YWN0LCBhcyBGIGhhcyA8IDggYml0cy4KKyAgICAgKiAgICAgICAgIEl0IGFsc28gYWRkcyBleGFjdGx5IHRvIHxtKmxvZzJfaGkgKyBsb2dfRl9oZWFkW2pdIHwgPCA3NTAKKyAgICAqLworCWlmIChtIHwgaikKKwkJdTEgPSB1ICsgNTEzLCB1MSAtPSA1MTM7CisKKyAgICAvKiBjYXNlIDI6CXwxLXh8IDwgMS8yNTYuIFRoZSBtLSBhbmQgai0gZGVwZW5kZW50IHRlcm1zIGFyZSB6ZXJvOworICAgICAqIAkJdTEgPSB1IHRvIDI0IGJpdHMuCisgICAgKi8KKwllbHNlCisJCXUxID0gdSwgVFJVTkModTEpOworCXUyID0gKDIuMCooZiAtIEYqdTEpIC0gdTEqZikgKiBnOworCQkJLyogdTEgKyB1MiA9IDJmLygyRitmKSB0byBleHRyYSBwcmVjaXNpb24uCSovCisKKwkvKiBsb2coeCkgPSBsb2coMl5tKkYqKDErZi9GKSkgPQkJCQkqLworCS8qIChtKmxvZzJfaGkrbG9nRl9oZWFkW2pdK3UxKSArIChtKmxvZzJfbG8rbG9nRl90YWlsW2pdK3EpOwkqLworCS8qIChleGFjdCkgKyAodGlueSkJCQkJCQkqLworCisJdTEgKz0gbSpsb2dGX2hlYWRbTl0gKyBsb2dGX2hlYWRbal07CQkvKiBleGFjdCAqLworCXUyID0gKHUyICsgbG9nRl90YWlsW2pdKSArIHE7CQkJLyogdGlueSAqLworCXUyICs9IGxvZ0ZfdGFpbFtOXSptOworCXJldHVybiAodTEgKyB1Mik7Cit9CisjZW5kaWYKKworLyoKKyAqIEV4dHJhIHByZWNpc2lvbiB2YXJpYW50LCByZXR1cm5pbmcgc3RydWN0IHtkb3VibGUgYSwgYjt9OworICogbG9nKHgpID0gYStiIHRvIDYzIGJpdHMsIHdpdGggYSByb3VuZGVkIHRvIDI2IGJpdHMuCisgKi8KK3N0cnVjdCBEb3VibGUKKyNpZmRlZiBfQU5TSV9TT1VSQ0UKK19fbG9nX19EKGRvdWJsZSB4KQorI2Vsc2UKK19fbG9nX19EKHgpIGRvdWJsZSB4OworI2VuZGlmCit7CisJaW50IG0sIGo7CisJZG91YmxlIEYsIGYsIGcsIHEsIHUsIHYsIHUyOworCXZvbGF0aWxlIGRvdWJsZSB1MTsKKwlzdHJ1Y3QgRG91YmxlIHI7CisKKwkvKiBBcmd1bWVudCByZWR1Y3Rpb246IDEgPD0gZyA8IDI7IHgvMl5tID0gZzsJKi8KKwkvKiB5ID0gRiooMSArIGYvRikgZm9yIHxmfCA8PSAyXi04CQkqLworCisJbSA9IGxvZ2IoeCk7CisJZyA9IGxkZXhwKHgsIC1tKTsKKwlpZiAobSA9PSAtMTAyMikgeworCQlqID0gbG9nYihnKSwgbSArPSBqOworCQlnID0gbGRleHAoZywgLWopOworCX0KKwlqID0gTiooZy0xKSArIC41OworCUYgPSAoMS4wL04pICogaiArIDE7CisJZiA9IGcgLSBGOworCisJZyA9IDEvKDIqRitmKTsKKwl1ID0gMipmKmc7CisJdiA9IHUqdTsKKwlxID0gdSp2KihBMSArIHYqKEEyICsgdiooQTMgKyB2KkE0KSkpOworCWlmIChtIHwgaikKKwkJdTEgPSB1ICsgNTEzLCB1MSAtPSA1MTM7CisJZWxzZQorCQl1MSA9IHUsIFRSVU5DKHUxKTsKKwl1MiA9ICgyLjAqKGYgLSBGKnUxKSAtIHUxKmYpICogZzsKKworCXUxICs9IG0qbG9nRl9oZWFkW05dICsgbG9nRl9oZWFkW2pdOworCisJdTIgKz0gIGxvZ0ZfdGFpbFtqXTsgdTIgKz0gcTsKKwl1MiArPSBsb2dGX3RhaWxbTl0qbTsKKwlyLmEgPSB1MSArIHUyOwkJCS8qIE9ubHkgZGlmZmVyZW5jZSBpcyBoZXJlICovCisJVFJVTkMoci5hKTsKKwlyLmIgPSAodTEgLSByLmEpICsgdTI7CisJcmV0dXJuIChyKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vYnNkc3JjL2JfdGdhbW1hLmMgYi9saWJtL2JzZHNyYy9iX3RnYW1tYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNmM1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2JzZHNyYy9iX3RnYW1tYS5jCkBAIC0wLDAgKzEsMzE2IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHNjY3NpZFtdID0gIkAoIylnYW1tYS5jCTguMSAoQmVya2VsZXkpIDYvNC85MyI7CisjZW5kaWYgLyogbm90IGxpbnQgKi8KKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2JzZHNyYy9iX3RnYW1tYS5jLHYgMS43IDIwMDUvMDkvMTkgMTE6Mjg6MTkgYmRlIEV4cCAkIik7ICovCisKKy8qCisgKiBUaGlzIGNvZGUgYnkgUC4gTWNJbHJveSwgT2N0IDE5OTI7CisgKgorICogVGhlIGZpbmFuY2lhbCBzdXBwb3J0IG9mIFVVTkVUIENvbW11bmljYXRpb25zIFNlcnZpY2VzIGlzIGdyZWF0ZnVsbHkKKyAqIGFja25vd2xlZGdlZC4KKyAqLworCisvLyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYXRoLmgiCisjaW5jbHVkZSAibWF0aGltcGwuaCIKKyNpbmNsdWRlIDxlcnJuby5oPgorCisvKiBNRVRIT0Q6CisgKiB4IDwgMDogVXNlIHJlZmxlY3Rpb24gZm9ybXVsYSwgRyh4KSA9IHBpLyhzaW4ocGkqeCkqeCpHKHgpKQorICogCUF0IG5lZ2F0aXZlIGludGVnZXJzLCByZXR1cm4gK0luZiwgYW5kIHNldCBlcnJuby4KKyAqCisgKiB4IDwgNi41OgorICoJVXNlIGFyZ3VtZW50IHJlZHVjdGlvbiBHKHgrMSkgPSB4Ryh4KSB0byByZWFjaCB0aGUKKyAqCXJhbmdlIFsxLjA2NjEyNCwyLjA2NjEyNF0uICBVc2UgYSByYXRpb25hbAorICoJYXBwcm94aW1hdGlvbiBjZW50ZXJlZCBhdCB0aGUgbWluaW11bSAoeDArMSkgdG8KKyAqCWVuc3VyZSBtb25vdG9uaWNpdHkuCisgKgorICogeCA+PSA2LjU6IFVzZSB0aGUgYXN5bXB0b3RpYyBhcHByb3hpbWF0aW9uIChTdGlybGluZydzIGZvcm11bGEpCisgKglhZGp1c3RlZCBmb3IgZXF1YWwtcmlwcGxlczoKKyAqCisgKglsb2coRyh4KSkgfj0gKHgtLjUpKihsb2coeCktMSkgKyAuNShsb2coMipwaSktMSkgKyAxL3gqUCgxLyh4KngpKQorICoKKyAqCUtlZXAgZXh0cmEgcHJlY2lzaW9uIGluIG11bHRpcGx5aW5nICh4LS41KShsb2coeCktMSksIHRvCisgKglhdm9pZCBwcmVtYXR1cmUgcm91bmQtb2ZmLgorICoKKyAqIFNwZWNpYWwgdmFsdWVzOgorICoJbm9uLXBvc2l0aXZlIGludGVnZXI6CVNldCBvdmVyZmxvdyB0cmFwOyByZXR1cm4gK0luZjsKKyAqCXggPiAxNzEuNjM6CQlTZXQgb3ZlcmZsb3cgdHJhcDsgcmV0dXJuICtJbmY7CisgKglOYU46IAkJCVNldCBpbnZhbGlkIHRyYXA7ICByZXR1cm4gTmFOCisgKgorICogQWNjdXJhY3k6IEdhbW1hKHgpIGlzIGFjY3VyYXRlIHRvIHdpdGhpbgorICoJeCA+IDA6ICBlcnJvciBwcm92YWJseSA8IDAuOXVscC4KKyAqCU1heGltdW0gb2JzZXJ2ZWQgaW4gMSwwMDAsMDAwIHRyaWFscyB3YXMgLjg3dWxwLgorICoJeCA8IDA6CisgKglNYXhpbXVtIG9ic2VydmVkIGVycm9yIDwgNHVscCBpbiAxLDAwMCwwMDAgdHJpYWxzLgorICovCisKK3N0YXRpYyBkb3VibGUgbmVnX2dhbShkb3VibGUpOworc3RhdGljIGRvdWJsZSBzbWFsbF9nYW0oZG91YmxlKTsKK3N0YXRpYyBkb3VibGUgc21hbGxlcl9nYW0oZG91YmxlKTsKK3N0YXRpYyBzdHJ1Y3QgRG91YmxlIGxhcmdlX2dhbShkb3VibGUpOworc3RhdGljIHN0cnVjdCBEb3VibGUgcmF0ZnVuX2dhbShkb3VibGUsIGRvdWJsZSk7CisKKy8qCisgKiBSYXRpb25hbCBhcHByb3hpbWF0aW9uLCBBMCArIHgqeCpQKHgpL1EoeCksIG9uIHRoZSBpbnRlcnZhbAorICogWzEuMDY2Li4sIDIuMDY2Li5dIGFjY3VyYXRlIHRvIDQuMjVlLTE5LgorICovCisjZGVmaW5lIExFRlQgLS4zOTU1MDc4MTI1CS8qIGxlZnQgYm91bmRhcnkgZm9yIHJhdC4gYXBwcm94ICovCisjZGVmaW5lIHgwIC40NjE2MzIxNDQ5NjgzNjIzNTY3ODUJLyogeG1pbiAtIDEgKi8KKworI2RlZmluZSBhMF9oaSAwLjg4NTYwMzE5NDQxMDg4ODc0OTkyCisjZGVmaW5lIGEwX2xvIC0uMDAwMDAwMDAwMDAwMDAwMDQ5OTY0MjcwMzY0NjkwMTk2OTUKKyNkZWZpbmUgUDAJIDYuMjEzODk1NzE4MjE4MjA4NjMwMjkwMTc4MDA3MjdlLTAxCisjZGVmaW5lIFAxCSAyLjY1NzU3MTk4NjUxNTMzNDY2MTA0OTc5MTk3NTUzZS0wMQorI2RlZmluZSBQMgkgNS41Mzg1OTQ0NjQyOTkxNzQ2MTA2MzMwODA4MTc0OGUtMDMKKyNkZWZpbmUgUDMJIDEuMzg0NTY2OTgzMDQwOTY1NzM4ODcxNDUyODI4MTFlLTAzCisjZGVmaW5lIFA0CSAyLjQwNjU5OTUwMDMyNzExMzY1ODE5MzQ4OTY5ODA4ZS0wMworI2RlZmluZSBRMAkgMS40NTAxOTUzMTI1MDAwMDAwMDAwMDAwMDAwMDAwMGUrMDAKKyNkZWZpbmUgUTEJIDEuMDYyNTg1MjE5NDgwMTYxNzEzNDM0NTQwNjE1NzFlKzAwCisjZGVmaW5lIFEyCS0yLjA3NDc0NTYxOTQzODU5OTM2NDQxNDY5OTI2NjQ5ZS0wMQorI2RlZmluZSBRMwktMS40NjczNDEzMTc4MjAwNTQyMjUwNjI4NzU3MzAxNWUtMDEKKyNkZWZpbmUgUTQJIDMuMDc4NzgxNzYxNTYxNzU1MjAzNjE1NTc1NzM3NzllLTAyCisjZGVmaW5lIFE1CSA1LjEyNDQ5MzQ3OTgwNjY2MjIxMzM2MDU0NjMzMTg0ZS0wMworI2RlZmluZSBRNgktMS43NjAxMjc0MTQzMTY2Njk5NTAxOTIyMjg5ODgzM2UtMDMKKyNkZWZpbmUgUTcJIDkuMzUwMjEwMjM1NzM3ODg5MzUzNzIxNTMwMzA1NTZlLTA1CisjZGVmaW5lIFE4CSA2LjEzMjc1NTA3NDcyNDQzOTU4OTI0NzQ1NjUyMjM5ZS0wNgorLyoKKyAqIENvbnN0YW50cyBmb3IgbGFyZ2UgeCBhcHByb3hpbWF0aW9uICh4IGluIFs2LCBJbmZdKQorICogKEFjY3VyYXRlIHRvIDIuOCoxMF4tMTkgYWJzb2x1dGUpCisgKi8KKyNkZWZpbmUgbG5zMnBpX2hpIDAuNDE4OTQ1MzEyNTAwMDAwCisjZGVmaW5lIGxuczJwaV9sbyAtLjAwMDAwNjc3OTI5NTMyNzI1ODIxOTY3MDI2MzU5NQorI2RlZmluZSBQYTAJIDguMzMzMzMzMzMzMzMzMzMxNDgyOTYxNjI1NjI0NzRlLTAyCisjZGVmaW5lIFBhMQktMi43Nzc3Nzc3Nzc3NDU0ODEyMzU3OTM3ODk2NjQ5N2UtMDMKKyNkZWZpbmUgUGEyCSA3LjkzNjUwNzc4NzU0NDM1NjMxNDc2MjgyNzg2NDIzZS0wNAorI2RlZmluZSBQYTMJLTUuOTUyMzUwODI1NjY2NzI4NDc5NTA3MTcyNjIyMjJlLTA0CisjZGVmaW5lIFBhNAkgOC40MTQyODU2MDM0NjY1MzcwMjEzNTgyMTgwNjI1MmUtMDQKKyNkZWZpbmUgUGE1CS0xLjg5NzczNTI2NDYzODc5MjAwMzQ4ODcyMDg5NDIxZS0wMworI2RlZmluZSBQYTYJIDUuNjkzOTQ0NjM0Mzk0MTE2NDk0MDgwNTA2NjQwNzhlLTAzCisjZGVmaW5lIFBhNwktMS40NDcwNTU2MjQyMTQyODkxNTQ1Mzg4MDM5Mjc2MWUtMDIKKworc3RhdGljIGNvbnN0IGRvdWJsZSB6ZXJvID0gMC4sIG9uZSA9IDEuMCwgdGlueSA9IDFlLTMwMDsKKworZG91YmxlCit0Z2FtbWEoeCkKKwlkb3VibGUgeDsKK3sKKwlzdHJ1Y3QgRG91YmxlIHU7CisKKwlpZiAoeCA+PSA2KSB7CisJCWlmKHggPiAxNzEuNjMpCisJCQlyZXR1cm4ob25lL3plcm8pOworCQl1ID0gbGFyZ2VfZ2FtKHgpOworCQlyZXR1cm4oX19leHBfX0QodS5hLCB1LmIpKTsKKwl9IGVsc2UgaWYgKHggPj0gMS4wICsgTEVGVCArIHgwKQorCQlyZXR1cm4gKHNtYWxsX2dhbSh4KSk7CisJZWxzZSBpZiAoeCA+IDEuZS0xNykKKwkJcmV0dXJuIChzbWFsbGVyX2dhbSh4KSk7CisJZWxzZSBpZiAoeCA+IC0xLmUtMTcpIHsKKwkJaWYgKHggPT0gMC4wKQorCQkJcmV0dXJuIChvbmUveCk7CisJCW9uZSsxZS0yMDsJCS8qIFJhaXNlIGluZXhhY3QgZmxhZy4gKi8KKwkJcmV0dXJuIChvbmUveCk7CisJfSBlbHNlIGlmICghZmluaXRlKHgpKQorCQlyZXR1cm4gKHgqeCk7CQkvKiB4ID0gTmFOLCAtSW5mICovCisJZWxzZQorCQlyZXR1cm4gKG5lZ19nYW0oeCkpOworfQorLyoKKyAqIEFjY3VyYXRlIHRvIG1heCh1bHAoMS8xMjgpIGFic29sdXRlLCAyXi02NiByZWxhdGl2ZSkgZXJyb3IuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgRG91YmxlCitsYXJnZV9nYW0oeCkKKwlkb3VibGUgeDsKK3sKKwlkb3VibGUgeiwgcDsKKwlzdHJ1Y3QgRG91YmxlIHQsIHUsIHY7CisKKwl6ID0gb25lLyh4KngpOworCXAgPSBQYTAreiooUGExK3oqKFBhMit6KihQYTMreiooUGE0K3oqKFBhNSt6KihQYTYreipQYTcpKSkpKSk7CisJcCA9IHAveDsKKworCXUgPSBfX2xvZ19fRCh4KTsKKwl1LmEgLT0gb25lOworCXYuYSA9ICh4IC09IC41KTsKKwlUUlVOQyh2LmEpOworCXYuYiA9IHggLSB2LmE7CisJdC5hID0gdi5hKnUuYTsJCQkvKiB0ID0gKHgtLjUpKihsb2coeCktMSkgKi8KKwl0LmIgPSB2LmIqdS5hICsgeCp1LmI7CisJLyogcmV0dXJuIHQuYSArIHQuYiArIGxuczJwaV9oaSArIGxuczJwaV9sbyArIHAgKi8KKwl0LmIgKz0gbG5zMnBpX2xvOyB0LmIgKz0gcDsKKwl1LmEgPSBsbnMycGlfaGkgKyB0LmI7IHUuYSArPSB0LmE7CisJdS5iID0gdC5hIC0gdS5hOworCXUuYiArPSBsbnMycGlfaGk7IHUuYiArPSB0LmI7CisJcmV0dXJuICh1KTsKK30KKy8qCisgKiBHb29kIHRvIDwgMSB1bHAuICAocHJvdmFibHkgLjkwIHVscDsgLjg3IHVscCBvbiAxLDAwMCwwMDAgcnVucy4pCisgKiBJdCBhbHNvIGhhcyBjb3JyZWN0IG1vbm90b25pY2l0eS4KKyAqLworc3RhdGljIGRvdWJsZQorc21hbGxfZ2FtKHgpCisJZG91YmxlIHg7Cit7CisJZG91YmxlIHksIHltMSwgdDsKKwlzdHJ1Y3QgRG91YmxlIHl5LCByOworCXkgPSB4IC0gb25lOworCXltMSA9IHkgLSBvbmU7CisJaWYgKHkgPD0gMS4wICsgKExFRlQgKyB4MCkpIHsKKwkJeXkgPSByYXRmdW5fZ2FtKHkgLSB4MCwgMCk7CisJCXJldHVybiAoeXkuYSArIHl5LmIpOworCX0KKwlyLmEgPSB5OworCVRSVU5DKHIuYSk7CisJeXkuYSA9IHIuYSAtIG9uZTsKKwl5ID0geW0xOworCXl5LmIgPSByLmIgPSB5IC0geXkuYTsKKwkvKiBBcmd1bWVudCByZWR1Y3Rpb246IEcoeCsxKSA9IHgqRyh4KSAqLworCWZvciAoeW0xID0geS1vbmU7IHltMSA+IExFRlQgKyB4MDsgeSA9IHltMS0tLCB5eS5hLS0pIHsKKwkJdCA9IHIuYSp5eS5hOworCQlyLmIgPSByLmEqeXkuYiArIHkqci5iOworCQlyLmEgPSB0OworCQlUUlVOQyhyLmEpOworCQlyLmIgKz0gKHQgLSByLmEpOworCX0KKwkvKiBSZXR1cm4gcip0Z2FtbWEoeSkuICovCisJeXkgPSByYXRmdW5fZ2FtKHkgLSB4MCwgMCk7CisJeSA9IHIuYiooeXkuYSArIHl5LmIpICsgci5hKnl5LmI7CisJeSArPSB5eS5hKnIuYTsKKwlyZXR1cm4gKHkpOworfQorLyoKKyAqIEdvb2Qgb24gKDAsIDEreDArTEVGVF0uICBBY2N1cmF0ZSB0byAxdWxwLgorICovCitzdGF0aWMgZG91YmxlCitzbWFsbGVyX2dhbSh4KQorCWRvdWJsZSB4OworeworCWRvdWJsZSB0LCBkOworCXN0cnVjdCBEb3VibGUgciwgeHg7CisJaWYgKHggPCB4MCArIExFRlQpIHsKKwkJdCA9IHgsIFRSVU5DKHQpOworCQlkID0gKHQreCkqKHgtdCk7CisJCXQgKj0gdDsKKwkJeHguYSA9ICh0ICsgeCksIFRSVU5DKHh4LmEpOworCQl4eC5iID0geCAtIHh4LmE7IHh4LmIgKz0gdDsgeHguYiArPSBkOworCQl0ID0gKG9uZS14MCk7IHQgKz0geDsKKwkJZCA9IChvbmUteDApOyBkIC09IHQ7IGQgKz0geDsKKwkJeCA9IHh4LmEgKyB4eC5iOworCX0gZWxzZSB7CisJCXh4LmEgPSAgeCwgVFJVTkMoeHguYSk7CisJCXh4LmIgPSB4IC0geHguYTsKKwkJdCA9IHggLSB4MDsKKwkJZCA9ICgteDAgLXQpOyBkICs9IHg7CisJfQorCXIgPSByYXRmdW5fZ2FtKHQsIGQpOworCWQgPSByLmEveCwgVFJVTkMoZCk7CisJci5hIC09IGQqeHguYTsgci5hIC09IGQqeHguYjsgci5hICs9IHIuYjsKKwlyZXR1cm4gKGQgKyByLmEveCk7Cit9CisvKgorICogcmV0dXJucyAoeitjKV4yICogUCh6KS9RKHopICsgYTAKKyAqLworc3RhdGljIHN0cnVjdCBEb3VibGUKK3JhdGZ1bl9nYW0oeiwgYykKKwlkb3VibGUgeiwgYzsKK3sKKwlkb3VibGUgcCwgcTsKKwlzdHJ1Y3QgRG91YmxlIHIsIHQ7CisKKwlxID0gUTAgK3oqKFExK3oqKFEyK3oqKFEzK3oqKFE0K3oqKFE1K3oqKFE2K3oqKFE3K3oqUTgpKSkpKSkpOworCXAgPSBQMCArIHoqKFAxICsgeiooUDIgKyB6KihQMyArIHoqUDQpKSk7CisKKwkvKiByZXR1cm4gci5hICsgci5iID0gYTAgKyAoeitjKV4yKnAvcSwgd2l0aCByLmEgdHJ1bmNhdGVkIHRvIDI2IGJpdHMuICovCisJcCA9IHAvcTsKKwl0LmEgPSB6LCBUUlVOQyh0LmEpOwkJLyogdCB+PSB6ICsgYyAqLworCXQuYiA9ICh6IC0gdC5hKSArIGM7CisJdC5iICo9ICh0LmEgKyB6KTsKKwlxID0gKHQuYSAqPSB0LmEpOwkJLyogdCA9ICh6K2MpXjIgKi8KKwlUUlVOQyh0LmEpOworCXQuYiArPSAocSAtIHQuYSk7CisJci5hID0gcCwgVFJVTkMoci5hKTsJCS8qIHIgPSBQL1EgKi8KKwlyLmIgPSBwIC0gci5hOworCXQuYiA9IHQuYipwICsgdC5hKnIuYiArIGEwX2xvOworCXQuYSAqPSByLmE7CQkJLyogdCA9ICh6K2MpXjIqKFAvUSkgKi8KKwlyLmEgPSB0LmEgKyBhMF9oaSwgVFJVTkMoci5hKTsKKwlyLmIgPSAoKGEwX2hpLXIuYSkgKyB0LmEpICsgdC5iOworCXJldHVybiAocik7CQkJLyogciA9IGEwICsgdCAqLworfQorCitzdGF0aWMgZG91YmxlCituZWdfZ2FtKHgpCisJZG91YmxlIHg7Cit7CisJaW50IHNnbiA9IDE7CisJc3RydWN0IERvdWJsZSBsZywgbHNpbmU7CisJZG91YmxlIHksIHo7CisKKwl5ID0gZmxvb3IoeCArIC41KTsKKwlpZiAoeSA9PSB4KQkJLyogTmVnYXRpdmUgaW50ZWdlci4gKi8KKwkJcmV0dXJuIChvbmUvemVybyk7CisJeiA9IGZhYnMoeCAtIHkpOworCXkgPSAuNSpjZWlsKHgpOworCWlmICh5ID09IGNlaWwoeSkpCisJCXNnbiA9IC0xOworCWlmICh6IDwgLjI1KQorCQl6ID0gc2luKE1fUEkqeik7CisJZWxzZQorCQl6ID0gY29zKE1fUEkqKDAuNS16KSk7CisJLyogU3BlY2lhbCBjYXNlOiBHKDEteCkgPSBJbmY7IEcoeCkgbWF5IGJlIG5vbnplcm8uICovCisJaWYgKHggPCAtMTcwKSB7CisJCWlmICh4IDwgLTE5MCkKKwkJCXJldHVybiAoKGRvdWJsZSlzZ24qdGlueSp0aW55KTsKKwkJeSA9IG9uZSAtIHg7CQkvKiBleGFjdDogMTI4IDwgfHh8IDwgMjU1ICovCisJCWxnID0gbGFyZ2VfZ2FtKHkpOworCQlsc2luZSA9IF9fbG9nX19EKE1fUEkveik7CS8qID0gVFJVTkMobG9nKHUpKSArIHNtYWxsICovCisJCWxnLmEgLT0gbHNpbmUuYTsJCS8qIGV4YWN0IChvcHBvc2l0ZSBzaWducykgKi8KKwkJbGcuYiAtPSBsc2luZS5iOworCQl5ID0gLShsZy5hICsgbGcuYik7CisJCXogPSAoeSArIGxnLmEpICsgbGcuYjsKKwkJeSA9IF9fZXhwX19EKHksIHopOworCQlpZiAoc2duIDwgMCkgeSA9IC15OworCQlyZXR1cm4gKHkpOworCX0KKwl5ID0gb25lLXg7CisJaWYgKG9uZS15ID09IHgpCisJCXkgPSB0Z2FtbWEoeSk7CisJZWxzZQkJLyogMS14IGlzIGluZXhhY3QgKi8KKwkJeSA9IC14KnRnYW1tYSgteCk7CisJaWYgKHNnbiA8IDApIHkgPSAteTsKKwlyZXR1cm4gKE1fUEkgLyAoeSp6KSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL2JzZHNyYy9tYXRoaW1wbC5oIGIvbGlibS9ic2RzcmMvbWF0aGltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTNiMjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9ic2RzcmMvbWF0aGltcGwuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyltYXRoaW1wbC5oCTguMSAoQmVya2VsZXkpIDYvNC85MworICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9ic2RzcmMvbWF0aGltcGwuaCx2IDEuNyAyMDA1LzExLzE4IDA1OjAzOjEyIGJkZSBFeHAgJAorICovCisKKyNpZm5kZWYgX01BVEhJTVBMX0hfCisjZGVmaW5lCV9NQVRISU1QTF9IXworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiLi4vc3JjL21hdGhfcHJpdmF0ZS5oIgorCisvKgorICogVFJVTkMoKSBpcyBhIG1hY3JvIHRoYXQgc2V0cyB0aGUgdHJhaWxpbmcgMjcgYml0cyBpbiB0aGUgbWFudGlzc2Egb2YgYW4KKyAqIElFRUUgZG91YmxlIHZhcmlhYmxlIHRvIHplcm8uICBJdCBtdXN0IGJlIGV4cHJlc3Npb24tbGlrZSBmb3Igc3ludGFjdGljCisgKiByZWFzb25zLCBhbmQgd2UgaW1wbGVtZW50IHRoaXMgZXhwcmVzc2lvbiB1c2luZyBhbiBpbmxpbmUgZnVuY3Rpb24KKyAqIGluc3RlYWQgb2YgYSBwdXJlIG1hY3JvIHRvIGF2b2lkIGRlcGVuZGluZyBvbiB0aGUgZ2NjIGZlYXR1cmUgb2YKKyAqIHN0YXRlbWVudC1leHByZXNzaW9ucy4KKyAqLworI2RlZmluZQlUUlVOQyhkKQkoX2JfdHJ1bmMoJihkKSkpCisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitfYl90cnVuYyh2b2xhdGlsZSBkb3VibGUgKl9kcCkKK3sKKwl1aW50MzJfdCBfbHc7CisKKwlHRVRfTE9XX1dPUkQoX2x3LCAqX2RwKTsKKwlTRVRfTE9XX1dPUkQoKl9kcCwgX2x3ICYgMHhmODAwMDAwMCk7Cit9CisKK3N0cnVjdCBEb3VibGUgeworCWRvdWJsZQlhOworCWRvdWJsZQliOworfTsKKworLyoKKyAqIEZ1bmN0aW9ucyBpbnRlcm5hbCB0byB0aGUgbWF0aCBwYWNrYWdlLCB5ZXQgbm90IHN0YXRpYy4KKyAqLworZG91YmxlCV9fZXhwX19EKGRvdWJsZSwgZG91YmxlKTsKK3N0cnVjdCBEb3VibGUgX19sb2dfX0QoZG91YmxlKTsKKworI2VuZGlmIC8qICFfTUFUSElNUExfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYm0vZnBjbGFzc2lmeS5jIGIvbGlibS9mcGNsYXNzaWZ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmMTE2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vZnBjbGFzc2lmeS5jCkBAIC0wLDAgKzEsOTQgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pa2UgQmFyY3JvZnQgPG1pa2VARnJlZUJTRC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9saWJjL2dlbi9mcGNsYXNzaWZ5LmMsdiAxLjIgMjAwNS8wMi8wNiAwMzoyMzozMSBkYXMgRXhwICQKKyAqLworCisjaW5jbHVkZSA8c3lzL2VuZGlhbi5oPgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAic3JjL2ZwbWF0aC5oIgorCitpbnQKK19fZnBjbGFzc2lmeWYoZmxvYXQgZikKK3sKKwl1bmlvbiBJRUVFZjJiaXRzIHU7CisKKwl1LmYgPSBmOworCWlmICh1LmJpdHMuZXhwID09IDApIHsKKwkJaWYgKHUuYml0cy5tYW4gPT0gMCkKKwkJCXJldHVybiAoRlBfWkVSTyk7CisJCXJldHVybiAoRlBfU1VCTk9STUFMKTsKKwl9CisJaWYgKHUuYml0cy5leHAgPT0gMjU1KSB7CisJCWlmICh1LmJpdHMubWFuID09IDApCisJCQlyZXR1cm4gKEZQX0lORklOSVRFKTsKKwkJcmV0dXJuIChGUF9OQU4pOworCX0KKwlyZXR1cm4gKEZQX05PUk1BTCk7Cit9CisKK2ludAorX19mcGNsYXNzaWZ5ZChkb3VibGUgZCkKK3sKKwl1bmlvbiBJRUVFZDJiaXRzIHU7CisKKwl1LmQgPSBkOworCWlmICh1LmJpdHMuZXhwID09IDApIHsKKwkJaWYgKCh1LmJpdHMubWFubCB8IHUuYml0cy5tYW5oKSA9PSAwKQorCQkJcmV0dXJuIChGUF9aRVJPKTsKKwkJcmV0dXJuIChGUF9TVUJOT1JNQUwpOworCX0KKwlpZiAodS5iaXRzLmV4cCA9PSAyMDQ3KSB7CisJCWlmICgodS5iaXRzLm1hbmwgfCB1LmJpdHMubWFuaCkgPT0gMCkKKwkJCXJldHVybiAoRlBfSU5GSU5JVEUpOworCQlyZXR1cm4gKEZQX05BTik7CisJfQorCXJldHVybiAoRlBfTk9STUFMKTsKK30KKworaW50CitfX2ZwY2xhc3NpZnlsKGxvbmcgZG91YmxlIGUpCit7CisJdW5pb24gSUVFRWwyYml0cyB1OworCisJdS5lID0gZTsKKwlpZiAodS5iaXRzLmV4cCA9PSAwKSB7CisJCWlmICgodS5iaXRzLm1hbmwgfCB1LmJpdHMubWFuaCkgPT0gMCkKKwkJCXJldHVybiAoRlBfWkVSTyk7CisJCXJldHVybiAoRlBfU1VCTk9STUFMKTsKKwl9CisJbWFza19uYml0X2wodSk7CQkvKiBNYXNrIG5vcm1hbGl6YXRpb24gYml0IGlmIGFwcGxpY2FibGUuICovCisJaWYgKHUuYml0cy5leHAgPT0gMzI3NjcpIHsKKwkJaWYgKCh1LmJpdHMubWFubCB8IHUuYml0cy5tYW5oKSA9PSAwKQorCQkJcmV0dXJuIChGUF9JTkZJTklURSk7CisJCXJldHVybiAoRlBfTkFOKTsKKwl9CisJcmV0dXJuIChGUF9OT1JNQUwpOworfQorCmRpZmYgLS1naXQgYS9saWJtL2kzODYvX2ZwbWF0aC5oIGIvbGlibS9pMzg2L19mcG1hdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjcxOWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg2L19mcG1hdGguaApAQCAtMCwwICsxLDQ5IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMyBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL2xpYmMvaTM4Ni9fZnBtYXRoLmgsdiAxLjUgMjAwNS8wMy8wNyAwNDo1NToyMiBkYXMgRXhwICQKKyAqLworCit1bmlvbiBJRUVFbDJiaXRzIHsKKwlsb25nIGRvdWJsZQllOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGludAltYW5sCTozMjsKKwkJdW5zaWduZWQgaW50CW1hbmgJOjMyOworCQl1bnNpZ25lZCBpbnQJZXhwCToxNTsKKwkJdW5zaWduZWQgaW50CXNpZ24JOjE7CisJCXVuc2lnbmVkIGludAlqdW5rCToxNjsKKwl9IGJpdHM7Cit9OworCisjZGVmaW5lCUxEQkxfTkJJVAkweDgwMDAwMDAwCisjZGVmaW5lCW1hc2tfbmJpdF9sKHUpCSgodSkuYml0cy5tYW5oICY9IH5MREJMX05CSVQpCisKKyNkZWZpbmUJTERCTF9NQU5IX1NJWkUJMzIKKyNkZWZpbmUJTERCTF9NQU5MX1NJWkUJMzIKKworI2RlZmluZQlMREJMX1RPX0FSUkFZMzIodSwgYSkgZG8gewkJCVwKKwkoYSlbMF0gPSAodWludDMyX3QpKHUpLmJpdHMubWFubDsJCVwKKwkoYSlbMV0gPSAodWludDMyX3QpKHUpLmJpdHMubWFuaDsJCVwKK30gd2hpbGUoMCkKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9NYWtlZmlsZS5pbmMgYi9saWJtL2kzODcvTWFrZWZpbGUuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4M2E1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvTWFrZWZpbGUuaW5jCkBAIC0wLDAgKzEsMTggQEAKKyMgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L01ha2VmaWxlLmluYyx2IDEuNyAyMDA1LzA0LzE2IDIxOjEyOjU1IGRhcyBFeHAgJAorCitBUkNIX1NSQ1MgPSBlX2V4cC5TIGVfZm1vZC5TIGVfbG9nLlMgZV9sb2cxMC5TIFwKKwkgICAgZV9yZW1haW5kZXIuUyBlX3NjYWxiLlMgZV9zcXJ0LlMgc19jZWlsLlMgc19jb3B5c2lnbi5TIFwKKwkgICAgc19jb3MuUyBzX2Zpbml0ZS5TIHNfZmxvb3IuUyBzX2xscmludC5TIHNfbG9nYi5TIHNfbHJpbnQuUyBcCisJICAgIHNfcmVtcXVvLlMgc19yaW50LlMgc19zY2FsYm4uUyBzX3NpZ25pZmljYW5kLlMgc19zaW4uUyBzX3Rhbi5TIFwKKwkgICAgc190cnVuYy5TCisKKyMgZmxvYXQgY291bnRlcnBhcnRzCitBUkNIX1NSQ1MrPSBlX2xvZzEwZi5TIGVfbG9nZi5TIGVfcmVtYWluZGVyZi5TIGVfc2NhbGJmLlMgXAorCSAgICBlX3NxcnRmLlMgc19jZWlsZi5TIHNfY29weXNpZ25mLlMgc19mbG9vcmYuUyBcCisJICAgIHNfbGxyaW50Zi5TIHNfbG9nYmYuUyBzX2xyaW50Zi5TIFwKKwkgICAgc19yZW1xdW9mLlMgc19yaW50Zi5TIHNfc2NhbGJuZi5TIHNfc2lnbmlmaWNhbmRmLlMgc190cnVuY2YuUworCisjIGxvbmcgZG91YmxlIGNvdW50ZXJwYXJ0cworQVJDSF9TUkNTKz0gc19jZWlsbC5TIHNfY29weXNpZ25sLlMgc19mbG9vcmwuUyBzX3NjYWxibmwuUyBzX3RydW5jbC5TCisKK0xEQkxfUFJFQyA9IDY0CSMgWFhYIDY0LWJpdCBmb3JtYXQsIGJ1dCB0cnVuY2F0ZWQgdG8gNTMgYml0cwpkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L2VfZXhwLlMgYi9saWJtL2kzODcvZV9leHAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDhhNmUxCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L2VfZXhwLlMKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Myw5NCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBXcml0dGVuIGJ5OgorICoJSi5ULiBDb25rbGluIChqdGNAd2ltc2V5LmNvbSksIFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitSQ1NJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L2VfZXhwLlMsdiAxLjExIDIwMDUvMTAvMzAgMTI6MjE6MDIgYmRlIEV4cCAkIikKKworLyogZV54ID0gMl4oeCAqIGxvZzIoZSkpICovCitFTlRSWShleHApCisJLyoKKwkgKiBJZiB4IGlzICstSW5mLCB0aGVuIHRoZSBzdWJ0cmFjdGlvbiB3b3VsZCBnaXZlIEluZi1JbmYgPSBOYU4uCisJICogQXZvaWQgdGhpcy4gIEFsc28gYXZvaWQgaXQgaWYgeCBpcyBOYU4gZm9yIGNvbnZlbmllbmNlLgorCSAqLworCW1vdmwJOCglZXNwKSwlZWF4CisJYW5kbAkkMHg3ZmZmZmZmZiwlZWF4CisJY21wbAkkMHg3ZmYwMDAwMCwlZWF4CisJamFlCXhfSW5mX29yX05hTgorCisJZmxkbAk0KCVlc3ApCisKKwkvKgorCSAqIEV4dGVuZGVkIHByZWNpc2lvbiBpcyBuZWVkZWQgdG8gcmVkdWNlIHRoZSBtYXhpbXVtIGVycm9yIGZyb20KKwkgKiBodW5kcmVkcyBvZiB1bHBzIHRvIGxlc3MgdGhhbiAxIHVscC4gIFN3aXRjaCB0byBpdCBpZiBuZWNlc3NhcnkuCisJICogV2UgbWF5IGFzIHdlbGwgc2V0IHRoZSByb3VuZGluZyBtb2RlIHRvIHRvLW5lYXJlc3QgYW5kIG1hc2sgdHJhcHMKKwkgKiBpZiB3ZSBzd2l0Y2guCisJICovCisJZnN0Y3cJNCglZXNwKQorCW1vdmwJNCglZXNwKSwlZWF4CisJYW5kbAkkMHgwMzAwLCVlYXgKKwljbXBsCSQweDAzMDAsJWVheAkJLyogUkMgPT0gMCAmJiBQQyA9PSAzPyAqLworCWplCTFmCQkJLyoganVtcCBpZiBtb2RlIGlzIGdvb2QgKi8KKwltb3ZsCSQweDEzN2YsOCglZXNwKQorCWZsZGN3CTgoJWVzcCkKKzE6CisJZmxkbDJlCisJZm11bHAJCQkJLyogeCAqIGxvZzIoZSkgKi8KKwlmc3QJJXN0KDEpCisJZnJuZGludAkJCQkvKiBpbnQoeCAqIGxvZzIoZSkpICovCisJZnN0CSVzdCgyKQorCWZzdWJycAkJCQkvKiBmcmFjdCh4ICogbG9nMihlKSkgKi8KKwlmMnhtMQkJCQkvKiAyXihmcmFjdCh4ICogbG9nMihlKSkpIC0gMSAqLyAKKwlmbGQxCisJZmFkZHAJCQkJLyogMl4oZnJhY3QoeCAqIGxvZzIoZSkpKSAqLworCWZzY2FsZQkJCQkvKiBlXnggKi8KKwlmc3RwCSVzdCgxKQorCWplCTFmCisJZmxkY3cJNCglZXNwKQorMToKKwlyZXQKKworeF9JbmZfb3JfTmFOOgorCS8qCisJICogUmV0dXJuIDAgaWYgeCBpcyAtSW5mLiAgT3RoZXJ3aXNlIGp1c3QgcmV0dXJuIHg7IHdoZW4geCBpcyBJbmYKKwkgKiB0aGlzIGdpdmVzIEluZiwgYW5kIHdoZW4geCBpcyBhIE5hTiB0aGlzIGdpdmVzIHRoZSBzYW1lIHJlc3VsdAorCSAqIGFzICh4ICsgeCkgKHggcXVpZXRlZCkuCisJICovCisJY21wbAkkMHhmZmYwMDAwMCw4KCVlc3ApCisJam5lCXhfbm90X21pbnVzX0luZgorCWNtcGwJJDAsNCglZXNwKQorCWpuZQl4X25vdF9taW51c19JbmYKKwlmbGR6CisJcmV0CisKK3hfbm90X21pbnVzX0luZjoKKwlmbGRsCTQoJWVzcCkKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9lX2Ztb2QuUyBiL2xpYm0vaTM4Ny9lX2Ztb2QuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzM0NzZmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L2VfZm1vZC5TCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsOTQgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogV3JpdHRlbiBieToKKyAqCUouVC4gQ29ua2xpbiAoanRjQHdpbXNleS5jb20pLCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworUkNTSUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9lX2Ztb2QuUyx2IDEuOCAyMDA1LzAyLzA0IDE0OjA4OjMyIGRhcyBFeHAgJCIpCisKK0VOVFJZKGZtb2QpCisJZmxkbAkxMiglZXNwKQorCWZsZGwJNCglZXNwKQorMToJZnByZW0KKwlmc3RzdwklYXgKKwlzYWhmCisJanAJMWIKKwlmc3RwCSVzdCgxKQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L2VfbG9nLlMgYi9saWJtL2kzODcvZV9sb2cuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWFhYzg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L2VfbG9nLlMKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Myw5NCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBXcml0dGVuIGJ5OgorICoJSi5ULiBDb25rbGluIChqdGNAd2ltc2V5LmNvbSksIFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitSQ1NJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L2VfbG9nLlMsdiAxLjcgMjAwNS8wMi8wNCAxNDowODozMiBkYXMgRXhwICQiKQorCitFTlRSWShsb2cpCisJZmxkbG4yCisJZmxkbAk0KCVlc3ApCisJZnlsMngKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9lX2xvZzEwLlMgYi9saWJtL2kzODcvZV9sb2cxMC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OTVlZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvZV9sb2cxMC5TCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsOTQgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogV3JpdHRlbiBieToKKyAqCUouVC4gQ29ua2xpbiAoanRjQHdpbXNleS5jb20pLCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworUkNTSUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9lX2xvZzEwLlMsdiAxLjcgMjAwNS8wMi8wNCAxNDowODozMiBkYXMgRXhwICQiKQorCitFTlRSWShsb2cxMCkKKwlmbGRsZzIKKwlmbGRsCTQoJWVzcCkKKwlmeWwyeAorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L2VfbG9nMTBmLlMgYi9saWJtL2kzODcvZV9sb2cxMGYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGQ2NzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L2VfbG9nMTBmLlMKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgSi5ULiBDb25rbGluIDxqdGNAbmV0YnNkLm9yZz4uCisgKiBQdWJsaWMgZG9tYWluLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L2VfbG9nMTBmLlMsdiAxLjIgMjAwNS8wMi8wNCAxNDowODozMiBkYXMgRXhwICQiKTsKKy8qIFJDU0lEKCIkTmV0QlNEOiBlX2xvZzEwZi5TLHYgMS4xIDE5OTYvMDcvMDMgMTY6NTA6MjIganRjIEV4cCAkIikgKi8KKworRU5UUlkobG9nMTBmKQorCWZsZGxnMgorCWZsZHMJNCglZXNwKQorCWZ5bDJ4CisJcmV0CmRpZmYgLS1naXQgYS9saWJtL2kzODcvZV9sb2dmLlMgYi9saWJtL2kzODcvZV9sb2dmLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYzYmQwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9lX2xvZ2YuUwpAQCAtMCwwICsxLDE1IEBACisvKgorICogV3JpdHRlbiBieSBKLlQuIENvbmtsaW4gPGp0Y0BuZXRic2Qub3JnPi4KKyAqIFB1YmxpYyBkb21haW4uCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvZV9sb2dmLlMsdiAxLjIgMjAwNS8wMi8wNCAxNDowODozMiBkYXMgRXhwICQiKTsKKy8qIFJDU0lEKCIkTmV0QlNEOiBlX2xvZ2YuUyx2IDEuMiAxOTk2LzA3LzA2IDAwOjE1OjQ1IGp0YyBFeHAgJCIpICovCisKK0VOVFJZKGxvZ2YpCisJZmxkbG4yCisJZmxkcwk0KCVlc3ApCisJZnlsMngKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9lX3JlbWFpbmRlci5TIGIvbGlibS9pMzg3L2VfcmVtYWluZGVyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYwZDY3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9lX3JlbWFpbmRlci5TCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsOTQgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogV3JpdHRlbiBieToKKyAqCUouVC4gQ29ua2xpbiAoanRjQHdpbXNleS5jb20pLCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworUkNTSUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9lX3JlbWFpbmRlci5TLHYgMS44IDIwMDUvMDIvMDQgMTQ6MDg6MzIgZGFzIEV4cCAkIikKKworRU5UUlkocmVtYWluZGVyKQorCWZsZGwJMTIoJWVzcCkKKwlmbGRsCTQoJWVzcCkKKzE6CWZwcmVtMQorCWZzdHN3CSVheAorCXNhaGYKKwlqcAkxYgorCWZzdHAJJXN0KDEpCisJcmV0CmRpZmYgLS1naXQgYS9saWJtL2kzODcvZV9yZW1haW5kZXJmLlMgYi9saWJtL2kzODcvZV9yZW1haW5kZXJmLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQxY2E3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9lX3JlbWFpbmRlcmYuUwpAQCAtMCwwICsxLDE5IEBACisvKgorICogV3JpdHRlbiBieSBKLlQuIENvbmtsaW4gPGp0Y0BuZXRic2Qub3JnPi4KKyAqIFB1YmxpYyBkb21haW4uCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvZV9yZW1haW5kZXJmLlMsdiAxLjIgMjAwNS8wMi8wNCAxNDowODozMiBkYXMgRXhwICQiKTsKKy8qIFJDU0lEKCIkTmV0QlNEOiBlX3JlbWFpbmRlcmYuUyx2IDEuMiAxOTk1LzA1LzA4IDIzOjQ5OjQ3IGp0YyBFeHAgJCIpICovCisKK0VOVFJZKHJlbWFpbmRlcmYpCisJZmxkcwk4KCVlc3ApCisJZmxkcwk0KCVlc3ApCisxOglmcHJlbTEKKwlmc3RzdwklYXgKKwlzYWhmCisJanAJMWIKKwlmc3RwCSVzdCgxKQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L2Vfc2NhbGIuUyBiL2xpYm0vaTM4Ny9lX3NjYWxiLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4NjU3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9lX3NjYWxiLlMKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBXcml0dGVuIGJ5OgorICoJSi5ULiBDb25rbGluIChqdGNAd2ltc2V5LmNvbSksIFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitSQ1NJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L2Vfc2NhbGIuUyx2IDEuOCAyMDA1LzAyLzA0IDE0OjA4OjMyIGRhcyBFeHAgJCIpCisKK0VOVFJZKHNjYWxiKQorCWZsZGwJMTIoJWVzcCkKKwlmbGRsCTQoJWVzcCkKKwlmc2NhbGUKKwlmc3RwCSVzdCgxKQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L2Vfc2NhbGJmLlMgYi9saWJtL2kzODcvZV9zY2FsYmYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGUwZDcwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L2Vfc2NhbGJmLlMKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgSi5ULiBDb25rbGluIDxqdGNAbmV0YnNkLm9yZz4uCisgKiBQdWJsaWMgZG9tYWluLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L2Vfc2NhbGJmLlMsdiAxLjIgMjAwNS8wMi8wNCAxNDowODozMiBkYXMgRXhwICQiKTsKKy8qIFJDU0lEKCIkTmV0QlNEOiBlX3NjYWxiZi5TLHYgMS4xIDE5OTYvMDcvMDMgMTY6NTA6MjQganRjIEV4cCAkIikgKi8KKworRU5UUlkoc2NhbGJmKQorCWZsZHMJOCglZXNwKQorCWZsZHMJNCglZXNwKQorCWZzY2FsZQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L2Vfc3FydC5TIGIvbGlibS9pMzg3L2Vfc3FydC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZTk2MjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvZV9zcXJ0LlMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Myw5NCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBXcml0dGVuIGJ5OgorICoJSi5ULiBDb25rbGluIChqdGNAd2ltc2V5LmNvbSksIFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitSQ1NJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L2Vfc3FydC5TLHYgMS43IDIwMDUvMDIvMDQgMTQ6MDg6MzIgZGFzIEV4cCAkIikKKworRU5UUlkoc3FydCkKKwlmbGRsCTQoJWVzcCkKKwlmc3FydAorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L2Vfc3FydGYuUyBiL2xpYm0vaTM4Ny9lX3NxcnRmLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjNTZhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9lX3NxcnRmLlMKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgSi5ULiBDb25rbGluIDxqdGNAbmV0YnNkLm9yZz4uCisgKiBQdWJsaWMgZG9tYWluLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L2Vfc3FydGYuUyx2IDEuMiAyMDA1LzAyLzA0IDE0OjA4OjMyIGRhcyBFeHAgJCIpOworLyogUkNTSUQoIiROZXRCU0Q6IGVfc3FydGYuUyx2IDEuMiAxOTk1LzA1LzA4IDIzOjUwOjE0IGp0YyBFeHAgJCIpICovCisKK0VOVFJZKHNxcnRmKQorCWZsZHMJNCglZXNwKQorCWZzcXJ0CisJcmV0CmRpZmYgLS1naXQgYS9saWJtL2kzODcvZmVudi5jIGIvbGlibS9pMzg3L2ZlbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzBlMzhmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L2ZlbnYuYwpAQCAtMCwwICsxLDIxMSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9mZW52LmMsdiAxLjIgMjAwNS8wMy8xNyAyMjoyMTo0NiBkYXMgRXhwICQKKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bWFjaGluZS9ucHguaD4KKyNpbmNsdWRlICJmZW52LmgiCisKK2NvbnN0IGZlbnZfdCBfX2ZlX2RmbF9lbnYgPSB7CisJX19JTklUSUFMX05QWENXX18sCisJMHgwMDAwLAorCTB4MDAwMCwKKwkweDFmODAsCisJMHhmZmZmZmZmZiwKKwl7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmIH0KK307CisKK2VudW0gX19zc2Vfc3VwcG9ydCBfX2hhc19zc2UgPQorI2lmZGVmIF9fU1NFX18KKwlfX1NTRV9ZRVM7CisjZWxzZQorCV9fU1NFX1VOSzsKKyNlbmRpZgorCisjZGVmaW5lCWdldGZsKHgpCV9fYXNtIF9fdm9sYXRpbGUoInB1c2hmbFxuXHRwb3BsICUwIiA6ICI9bXIiICgqKHgpKSkKKyNkZWZpbmUJc2V0ZmwoeCkJX19hc20gX192b2xhdGlsZSgicHVzaGwgJTBcblx0cG9wZmwiIDogOiAiZyIgKHgpKQorI2RlZmluZQljcHVpZF9keCh4KQlfX2FzbSBfX3ZvbGF0aWxlKCJwdXNobCAlJWVieFxuXHRtb3ZsICQxLCAlJWVheFxuXHQiICBcCisJCQkJCSAiY3B1aWRcblx0cG9wbCAlJWVieCIJCSAgICAgIFwKKwkJCQkJOiAiPWQiICgqKHgpKSA6IDogImVheCIsICJlY3giKQorCisvKgorICogVGVzdCBmb3IgU1NFIHN1cHBvcnQgb24gdGhpcyBwcm9jZXNzb3IuICBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZQorICogd2UgbmVlZCB0byB1c2UgbGRteGNzci9zdG14Y3NyIHRvIGdldCBjb3JyZWN0IHJlc3VsdHMgaWYgYW55IHBhcnQKKyAqIG9mIHRoZSBwcm9ncmFtIHdhcyBjb21waWxlZCB0byB1c2UgU1NFIGZsb2F0aW5nLXBvaW50LCBidXQgd2UgY2FuJ3QKKyAqIHVzZSBTU0Ugb24gb2xkZXIgcHJvY2Vzc29ycy4KKyAqLworaW50CitfX3Rlc3Rfc3NlKHZvaWQpCit7CisJaW50IGZsYWcsIG5mbGFnOworCWludCBkeF9mZWF0dXJlczsKKworCS8qIEFtIEkgYSA0ODY/ICovCisJZ2V0ZmwoJmZsYWcpOworCW5mbGFnID0gZmxhZyBeIDB4MjAwMDAwOworCXNldGZsKG5mbGFnKTsKKwlnZXRmbCgmbmZsYWcpOworCWlmIChmbGFnICE9IG5mbGFnKSB7CisJCS8qIE5vdCBhIDQ4Niwgc28gQ1BVSUQgc2hvdWxkIHdvcmsuICovCisJCWNwdWlkX2R4KCZkeF9mZWF0dXJlcyk7CisJCWlmIChkeF9mZWF0dXJlcyAmIDB4MjAwMDAwMCkgeworCQkJX19oYXNfc3NlID0gX19TU0VfWUVTOworCQkJcmV0dXJuICgxKTsKKwkJfQorCX0KKwlfX2hhc19zc2UgPSBfX1NTRV9OTzsKKwlyZXR1cm4gKDApOworfQorCitpbnQKK2Zlc2V0ZXhjZXB0ZmxhZyhjb25zdCBmZXhjZXB0X3QgKmZsYWdwLCBpbnQgZXhjZXB0cykKK3sKKwlmZW52X3QgZW52OworCWludCBteGNzcjsKKworCV9fZm5zdGVudigmZW52KTsKKwllbnYuX19zdGF0dXMgJj0gfmV4Y2VwdHM7CisJZW52Ll9fc3RhdHVzIHw9ICpmbGFncCAmIGV4Y2VwdHM7CisJX19mbGRlbnYoZW52KTsKKworCWlmIChfX0hBU19TU0UoKSkgeworCQlfX3N0bXhjc3IoJm14Y3NyKTsKKwkJbXhjc3IgJj0gfmV4Y2VwdHM7CisJCW14Y3NyIHw9ICpmbGFncCAmIGV4Y2VwdHM7CisJCV9fbGRteGNzcihteGNzcik7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworaW50CitmZXJhaXNlZXhjZXB0KGludCBleGNlcHRzKQoreworCWZleGNlcHRfdCBleCA9IGV4Y2VwdHM7CisKKwlmZXNldGV4Y2VwdGZsYWcoJmV4LCBleGNlcHRzKTsKKwlfX2Z3YWl0KCk7CisJcmV0dXJuICgwKTsKK30KKworaW50CitmZWdldGVudihmZW52X3QgKmVudnApCit7CisJaW50IGNvbnRyb2wsIG14Y3NyOworCisJLyoKKwkgKiBmbnN0ZW52IG1hc2tzIGFsbCBleGNlcHRpb25zLCBzbyB3ZSBuZWVkIHRvIHNhdmUgYW5kCisJICogcmVzdG9yZSB0aGUgY29udHJvbCB3b3JkIHRvIGF2b2lkIHRoaXMgc2lkZSBlZmZlY3QuCisJICovCisJX19mbnN0Y3coJmNvbnRyb2wpOworCV9fZm5zdGVudihlbnZwKTsKKwlpZiAoX19IQVNfU1NFKCkpIHsKKwkJX19zdG14Y3NyKCZteGNzcik7CisJCV9fc2V0X214Y3NyKCplbnZwLCBteGNzcik7CisJfQorCV9fZmxkY3coY29udHJvbCk7CisJcmV0dXJuICgwKTsKK30KKworaW50CitmZWhvbGRleGNlcHQoZmVudl90ICplbnZwKQoreworCWludCBteGNzcjsKKworCV9fZm5zdGVudihlbnZwKTsKKwlfX2ZuY2xleCgpOworCWlmIChfX0hBU19TU0UoKSkgeworCQlfX3N0bXhjc3IoJm14Y3NyKTsKKwkJX19zZXRfbXhjc3IoKmVudnAsIG14Y3NyKTsKKwkJbXhjc3IgJj0gfkZFX0FMTF9FWENFUFQ7CisJCW14Y3NyIHw9IEZFX0FMTF9FWENFUFQgPDwgX1NTRV9FTUFTS19TSElGVDsKKwkJX19sZG14Y3NyKG14Y3NyKTsKKwl9CisJcmV0dXJuICgwKTsKK30KKworaW50CitmZXVwZGF0ZWVudihjb25zdCBmZW52X3QgKmVudnApCit7CisJaW50IG14Y3NyLCBzdGF0dXM7CisKKwlfX2Zuc3Rzdygmc3RhdHVzKTsKKwlpZiAoX19IQVNfU1NFKCkpCisJCV9fc3RteGNzcigmbXhjc3IpOworCWVsc2UKKwkJbXhjc3IgPSAwOworCWZlc2V0ZW52KGVudnApOworCWZlcmFpc2VleGNlcHQoKG14Y3NyIHwgc3RhdHVzKSAmIEZFX0FMTF9FWENFUFQpOworCXJldHVybiAoMCk7Cit9CisKK2ludAorX19mZWVuYWJsZWV4Y2VwdChpbnQgbWFzaykKK3sKKwlpbnQgbXhjc3IsIGNvbnRyb2wsIG9tYXNrOworCisJbWFzayAmPSBGRV9BTExfRVhDRVBUOworCV9fZm5zdGN3KCZjb250cm9sKTsKKwlpZiAoX19IQVNfU1NFKCkpCisJCV9fc3RteGNzcigmbXhjc3IpOworCWVsc2UKKwkJbXhjc3IgPSAwOworCW9tYXNrID0gKGNvbnRyb2wgfCBteGNzciA+PiBfU1NFX0VNQVNLX1NISUZUKSAmIEZFX0FMTF9FWENFUFQ7CisJY29udHJvbCAmPSB+bWFzazsKKwlfX2ZsZGN3KGNvbnRyb2wpOworCWlmIChfX0hBU19TU0UoKSkgeworCQlteGNzciAmPSB+KG1hc2sgPDwgX1NTRV9FTUFTS19TSElGVCk7CisJCV9fbGRteGNzcihteGNzcik7CisJfQorCXJldHVybiAofm9tYXNrKTsKK30KKworaW50CitfX2ZlZGlzYWJsZWV4Y2VwdChpbnQgbWFzaykKK3sKKwlpbnQgbXhjc3IsIGNvbnRyb2wsIG9tYXNrOworCisJbWFzayAmPSBGRV9BTExfRVhDRVBUOworCV9fZm5zdGN3KCZjb250cm9sKTsKKwlpZiAoX19IQVNfU1NFKCkpCisJCV9fc3RteGNzcigmbXhjc3IpOworCWVsc2UKKwkJbXhjc3IgPSAwOworCW9tYXNrID0gKGNvbnRyb2wgfCBteGNzciA+PiBfU1NFX0VNQVNLX1NISUZUKSAmIEZFX0FMTF9FWENFUFQ7CisJY29udHJvbCB8PSBtYXNrOworCV9fZmxkY3coY29udHJvbCk7CisJaWYgKF9fSEFTX1NTRSgpKSB7CisJCW14Y3NyIHw9IG1hc2sgPDwgX1NTRV9FTUFTS19TSElGVDsKKwkJX19sZG14Y3NyKG14Y3NyKTsKKwl9CisJcmV0dXJuICh+b21hc2spOworfQorCitfX3dlYWtfcmVmZXJlbmNlKF9fZmVlbmFibGVleGNlcHQsIGZlZW5hYmxlZXhjZXB0KTsKK19fd2Vha19yZWZlcmVuY2UoX19mZWRpc2FibGVleGNlcHQsIGZlZGlzYWJsZWV4Y2VwdCk7CmRpZmYgLS1naXQgYS9saWJtL2kzODcvZmVudi5oIGIvbGlibS9pMzg3L2ZlbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTI0MzY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L2ZlbnYuaApAQCAtMCwwICsxLDI0MCBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9mZW52LmgsdiAxLjQgMjAwNS8wMy8xNyAyMjoyMTo0NiBkYXMgRXhwICQKKyAqLworCisjaWZuZGVmCV9GRU5WX0hfCisjZGVmaW5lCV9GRU5WX0hfCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxzeXMvX3R5cGVzLmg+CisKKy8qICAgICAgICAgICAgICAgICAgIAorICogVG8gcHJlc2VydmUgYmluYXJ5IGNvbXBhdGliaWxpdHkgd2l0aCBGcmVlQlNEIDUuMywgd2UgcGFjayB0aGUKKyAqIG14Y3NyIGludG8gc29tZSByZXNlcnZlZCBmaWVsZHMsIHJhdGhlciB0aGFuIGNoYW5naW5nIHNpemVvZihmZW52X3QpLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJX191aW50MTZfdAlfX2NvbnRyb2w7CisJX191aW50MTZfdCAgICAgIF9fbXhjc3JfaGk7CisJX191aW50MTZfdAlfX3N0YXR1czsKKwlfX3VpbnQxNl90ICAgICAgX19teGNzcl9sbzsKKwlfX3VpbnQzMl90CV9fdGFnOworCWNoYXIJCV9fb3RoZXJbMTZdOworfSBmZW52X3Q7CisKKyNkZWZpbmUJX19nZXRfbXhjc3IoZW52KQkoKChlbnYpLl9fbXhjc3JfaGkgPDwgMTYpIHwJXAorCQkJCSAoKGVudikuX19teGNzcl9sbykpCisjZGVmaW5lCV9fc2V0X214Y3NyKGVudiwgeCkJZG8gewkJCQlcCisJKGVudikuX19teGNzcl9oaSA9IChfX3VpbnQzMl90KSh4KSA+PiAxNjsJCVwKKwkoZW52KS5fX214Y3NyX2xvID0gKF9fdWludDE2X3QpKHgpOwkJCVwKK30gd2hpbGUgKDApCisKK3R5cGVkZWYJX191aW50MTZfdAlmZXhjZXB0X3Q7CisKKy8qIEV4Y2VwdGlvbiBmbGFncyAqLworI2RlZmluZQlGRV9JTlZBTElECTB4MDEKKyNkZWZpbmUJRkVfREVOT1JNQUwJMHgwMgorI2RlZmluZQlGRV9ESVZCWVpFUk8JMHgwNAorI2RlZmluZQlGRV9PVkVSRkxPVwkweDA4CisjZGVmaW5lCUZFX1VOREVSRkxPVwkweDEwCisjZGVmaW5lCUZFX0lORVhBQ1QJMHgyMAorI2RlZmluZQlGRV9BTExfRVhDRVBUCShGRV9ESVZCWVpFUk8gfCBGRV9ERU5PUk1BTCB8IEZFX0lORVhBQ1QgfCBcCisJCQkgRkVfSU5WQUxJRCB8IEZFX09WRVJGTE9XIHwgRkVfVU5ERVJGTE9XKQorCisvKiBSb3VuZGluZyBtb2RlcyAqLworI2RlZmluZQlGRV9UT05FQVJFU1QJMHgwMDAwCisjZGVmaW5lCUZFX0RPV05XQVJECTB4MDQwMAorI2RlZmluZQlGRV9VUFdBUkQJMHgwODAwCisjZGVmaW5lCUZFX1RPV0FSRFpFUk8JMHgwYzAwCisjZGVmaW5lCV9ST1VORF9NQVNLCShGRV9UT05FQVJFU1QgfCBGRV9ET1dOV0FSRCB8IFwKKwkJCSBGRV9VUFdBUkQgfCBGRV9UT1dBUkRaRVJPKQorCisvKgorICogQXMgY29tcGFyZWQgdG8gdGhlIHg4NyBjb250cm9sIHdvcmQsIHRoZSBTU0UgdW5pdCdzIGNvbnRyb2wgd29yZAorICogaGFzIHRoZSByb3VuZGluZyBjb250cm9sIGJpdHMgb2Zmc2V0IGJ5IDMgYW5kIHRoZSBleGNlcHRpb24gbWFzaworICogYml0cyBvZmZzZXQgYnkgNy4KKyAqLworI2RlZmluZQlfU1NFX1JPVU5EX1NISUZUCTMKKyNkZWZpbmUJX1NTRV9FTUFTS19TSElGVAk3CisKKy8qIEFmdGVyIHRlc3RpbmcgZm9yIFNTRSBzdXBwb3J0IG9uY2UsIHdlIGNhY2hlIHRoZSByZXN1bHQgaW4gX19oYXNfc3NlLiAqLworZW51bSBfX3NzZV9zdXBwb3J0IHsgX19TU0VfWUVTLCBfX1NTRV9OTywgX19TU0VfVU5LIH07CitleHRlcm4gZW51bSBfX3NzZV9zdXBwb3J0IF9faGFzX3NzZTsKK2ludCBfX3Rlc3Rfc3NlKHZvaWQpOworI2lmZGVmIF9fU1NFX18KKyNkZWZpbmUJX19IQVNfU1NFKCkJMQorI2Vsc2UKKyNkZWZpbmUJX19IQVNfU1NFKCkJKF9faGFzX3NzZSA9PSBfX1NTRV9ZRVMgfHwJCQlcCisJCQkgKF9faGFzX3NzZSA9PSBfX1NTRV9VTksgJiYgX190ZXN0X3NzZSgpKSkKKyNlbmRpZgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIERlZmF1bHQgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQgKi8KK2V4dGVybiBjb25zdCBmZW52X3QJX19mZV9kZmxfZW52OworI2RlZmluZQlGRV9ERkxfRU5WCSgmX19mZV9kZmxfZW52KQorCisjZGVmaW5lCV9fZmxkY3coX19jdykJCV9fYXNtIF9fdm9sYXRpbGUoImZsZGN3ICUwIiA6IDogIm0iIChfX2N3KSkKKyNkZWZpbmUJX19mbGRlbnYoX19lbnYpCQlfX2FzbSBfX3ZvbGF0aWxlKCJmbGRlbnYgJTAiIDogOiAibSIgKF9fZW52KSkKKyNkZWZpbmUJX19mbmNsZXgoKQkJX19hc20gX192b2xhdGlsZSgiZm5jbGV4IikKKyNkZWZpbmUJX19mbnN0ZW52KF9fZW52KQlfX2FzbSBfX3ZvbGF0aWxlKCJmbnN0ZW52ICUwIiA6ICI9bSIgKCooX19lbnYpKSkKKyNkZWZpbmUJX19mbnN0Y3coX19jdykJCV9fYXNtIF9fdm9sYXRpbGUoImZuc3RjdyAlMCIgOiAiPW0iICgqKF9fY3cpKSkKKyNkZWZpbmUJX19mbnN0c3coX19zdykJCV9fYXNtIF9fdm9sYXRpbGUoImZuc3RzdyAlMCIgOiAiPWFtIiAoKihfX3N3KSkpCisjZGVmaW5lCV9fZndhaXQoKQkJX19hc20gX192b2xhdGlsZSgiZndhaXQiKQorI2RlZmluZQlfX2xkbXhjc3IoX19jc3IpCV9fYXNtIF9fdm9sYXRpbGUoImxkbXhjc3IgJTAiIDogOiAibSIgKF9fY3NyKSkKKyNkZWZpbmUJX19zdG14Y3NyKF9fY3NyKQlfX2FzbSBfX3ZvbGF0aWxlKCJzdG14Y3NyICUwIiA6ICI9bSIgKCooX19jc3IpKSkKKworc3RhdGljIF9faW5saW5lIGludAorZmVjbGVhcmV4Y2VwdChpbnQgX19leGNlcHRzKQoreworCWZlbnZfdCBfX2VudjsKKwlpbnQgX19teGNzcjsKKworCWlmIChfX2V4Y2VwdHMgPT0gRkVfQUxMX0VYQ0VQVCkgeworCQlfX2ZuY2xleCgpOworCX0gZWxzZSB7CisJCV9fZm5zdGVudigmX19lbnYpOworCQlfX2Vudi5fX3N0YXR1cyAmPSB+X19leGNlcHRzOworCQlfX2ZsZGVudihfX2Vudik7CisJfQorCWlmIChfX0hBU19TU0UoKSkgeworCQlfX3N0bXhjc3IoJl9fbXhjc3IpOworCQlfX214Y3NyICY9IH5fX2V4Y2VwdHM7CisJCV9fbGRteGNzcihfX214Y3NyKTsKKwl9CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRleGNlcHRmbGFnKGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwlpbnQgX19teGNzciwgX19zdGF0dXM7CisKKwlfX2Zuc3RzdygmX19zdGF0dXMpOworCWlmIChfX0hBU19TU0UoKSkKKwkJX19zdG14Y3NyKCZfX214Y3NyKTsKKwllbHNlCisJCV9fbXhjc3IgPSAwOworCSpfX2ZsYWdwID0gKF9fbXhjc3IgfCBfX3N0YXR1cykgJiBfX2V4Y2VwdHM7CisJcmV0dXJuICgwKTsKK30KKworaW50IGZlc2V0ZXhjZXB0ZmxhZyhjb25zdCBmZXhjZXB0X3QgKl9fZmxhZ3AsIGludCBfX2V4Y2VwdHMpOworaW50IGZlcmFpc2VleGNlcHQoaW50IF9fZXhjZXB0cyk7CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZldGVzdGV4Y2VwdChpbnQgX19leGNlcHRzKQoreworCWludCBfX214Y3NyLCBfX3N0YXR1czsKKworCV9fZm5zdHN3KCZfX3N0YXR1cyk7CisJaWYgKF9fSEFTX1NTRSgpKQorCQlfX3N0bXhjc3IoJl9fbXhjc3IpOworCWVsc2UKKwkJX19teGNzciA9IDA7CisJcmV0dXJuICgoX19zdGF0dXMgfCBfX214Y3NyKSAmIF9fZXhjZXB0cyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0cm91bmQodm9pZCkKK3sKKwlpbnQgX19jb250cm9sOworCisJLyoKKwkgKiBXZSBhc3N1bWUgdGhhdCB0aGUgeDg3IGFuZCB0aGUgU1NFIHVuaXQgYWdyZWUgb24gdGhlCisJICogcm91bmRpbmcgbW9kZS4gIFJlYWRpbmcgdGhlIGNvbnRyb2wgd29yZCBvbiB0aGUgeDg3IHR1cm5zCisJICogb3V0IHRvIGJlIGFib3V0IDUgdGltZXMgZmFzdGVyIHRoYW4gcmVhZGluZyBpdCBvbiB0aGUgU1NFCisJICogdW5pdCBvbiBhbiBPcHRlcm9uIDI0NC4KKwkgKi8KKwlfX2Zuc3RjdygmX19jb250cm9sKTsKKwlyZXR1cm4gKF9fY29udHJvbCAmIF9ST1VORF9NQVNLKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRyb3VuZChpbnQgX19yb3VuZCkKK3sKKwlpbnQgX19teGNzciwgX19jb250cm9sOworCisJaWYgKF9fcm91bmQgJiB+X1JPVU5EX01BU0spCisJCXJldHVybiAoLTEpOworCisJX19mbnN0Y3coJl9fY29udHJvbCk7CisJX19jb250cm9sICY9IH5fUk9VTkRfTUFTSzsKKwlfX2NvbnRyb2wgfD0gX19yb3VuZDsKKwlfX2ZsZGN3KF9fY29udHJvbCk7CisKKwlpZiAoX19IQVNfU1NFKCkpIHsKKwkJX19zdG14Y3NyKCZfX214Y3NyKTsKKwkJX19teGNzciAmPSB+KF9ST1VORF9NQVNLIDw8IF9TU0VfUk9VTkRfU0hJRlQpOworCQlfX214Y3NyIHw9IF9fcm91bmQgPDwgX1NTRV9ST1VORF9TSElGVDsKKwkJX19sZG14Y3NyKF9fbXhjc3IpOworCX0KKworCXJldHVybiAoMCk7Cit9CisKK2ludCBmZWdldGVudihmZW52X3QgKl9fZW52cCk7CitpbnQgZmVob2xkZXhjZXB0KGZlbnZfdCAqX19lbnZwKTsKKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRlbnYoY29uc3QgZmVudl90ICpfX2VudnApCit7CisJZmVudl90IF9fZW52ID0gKl9fZW52cDsKKwlpbnQgX19teGNzcjsKKworCV9fbXhjc3IgPSBfX2dldF9teGNzcihfX2Vudik7CisJX19zZXRfbXhjc3IoX19lbnYsIDB4ZmZmZmZmZmYpOworCV9fZmxkZW52KF9fZW52KTsKKwlpZiAoX19IQVNfU1NFKCkpCisJCV9fbGRteGNzcihfX214Y3NyKTsKKwlyZXR1cm4gKDApOworfQorCitpbnQgZmV1cGRhdGVlbnYoY29uc3QgZmVudl90ICpfX2VudnApOworCisjaWYgX19CU0RfVklTSUJMRQorCitpbnQgZmVlbmFibGVleGNlcHQoaW50IF9fbWFzayk7CitpbnQgZmVkaXNhYmxlZXhjZXB0KGludCBfX21hc2spOworCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldGV4Y2VwdCh2b2lkKQoreworCWludCBfX2NvbnRyb2w7CisKKwkvKgorCSAqIFdlIGFzc3VtZSB0aGF0IHRoZSBtYXNrcyBmb3IgdGhlIHg4NyBhbmQgdGhlIFNTRSB1bml0IGFyZQorCSAqIHRoZSBzYW1lLgorCSAqLworCV9fZm5zdGN3KCZfX2NvbnRyb2wpOworCXJldHVybiAofl9fY29udHJvbCAmIEZFX0FMTF9FWENFUFQpOworfQorCisjZW5kaWYgLyogX19CU0RfVklTSUJMRSAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogIV9GRU5WX0hfICovCmRpZmYgLS1naXQgYS9saWJtL2kzODcvc19jZWlsLlMgYi9saWJtL2kzODcvc19jZWlsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU3M2IzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX2NlaWwuUwpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLDk0IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFdyaXR0ZW4gYnk6CisgKglKLlQuIENvbmtsaW4gKGp0Y0B3aW1zZXkuY29tKSwgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKK1JDU0lEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvc19jZWlsLlMsdiAxLjcgMTk5OS8wOC8yOCAwMDowNjoxMSBwZXRlciBFeHAgJCIpCisKK0VOVFJZKGNlaWwpCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwlZWJwCisJc3VibAkkOCwlZXNwCisKKwlmc3RjdwktNCglZWJwKQkJLyogc3RvcmUgZnB1IGNvbnRyb2wgd29yZCAqLworCW1vdncJLTQoJWVicCksJWR4CisJb3J3CSQweDA4MDAsJWR4CQkvKiByb3VuZCB0b3dhcmRzICtvbyAqLworCWFuZHcJJDB4ZmJmZiwlZHgKKwltb3Z3CSVkeCwtOCglZWJwKQorCWZsZGN3CS04KCVlYnApCQkvKiBsb2FkIG1vZGZpZWQgY29udHJvbCB3b3JkICovCisKKwlmbGRsCTgoJWVicCk7CQkvKiByb3VuZCAqLworCWZybmRpbnQKKworCWZsZGN3CS00KCVlYnApCQkvKiByZXN0b3JlIG9yaWdpbmFsIGNvbnRyb2wgd29yZCAqLworCisJbGVhdmUKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX2NlaWxmLlMgYi9saWJtL2kzODcvc19jZWlsZi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MmNhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvc19jZWlsZi5TCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBXcml0dGVuIGJ5IEouVC4gQ29ua2xpbiA8anRjQG5ldGJzZC5vcmc+LgorICogUHVibGljIGRvbWFpbi4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9zX2NlaWxmLlMsdiAxLjIgMjAwNS8wNS8wNiAxNTo0NDoyMCBkZWlzY2hlbiBFeHAgJCIpOworLyogUkNTSUQoIiROZXRCU0Q6IHNfY2VpbGYuUyx2IDEuMyAxOTk1LzA1LzA4IDIzOjUyOjQ0IGp0YyBFeHAgJCIpICovCisKK0VOVFJZKGNlaWxmKQorCXB1c2hsCSVlYnAKKwltb3ZsCSVlc3AsJWVicAorCXN1YmwJJDgsJWVzcAorCisJZnN0Y3cJLTQoJWVicCkJCS8qIHN0b3JlIGZwdSBjb250cm9sIHdvcmQgKi8KKwltb3Z3CS00KCVlYnApLCVkeAorCW9ydwkkMHgwODAwLCVkeAkJLyogcm91bmQgdG93YXJkcyArb28gKi8KKwlhbmR3CSQweGZiZmYsJWR4CisJbW92dwklZHgsLTgoJWVicCkKKwlmbGRjdwktOCglZWJwKQkJLyogbG9hZCBtb2RmaWVkIGNvbnRyb2wgd29yZCAqLworCisJZmxkcwk4KCVlYnApOwkJLyogcm91bmQgKi8KKwlmcm5kaW50CisKKwlmbGRjdwktNCglZWJwKQkJLyogcmVzdG9yZSBvcmlnaW5hbCBjb250cm9sIHdvcmQgKi8KKworCWxlYXZlCisJcmV0CmRpZmYgLS1naXQgYS9saWJtL2kzODcvc19jZWlsbC5TIGIvbGlibS9pMzg3L3NfY2VpbGwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmMzYzQxCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L3NfY2VpbGwuUwpAQCAtMCwwICsxLDI3IEBACisvKgorICogQmFzZWQgb24gY29kZSB3cml0dGVuIGJ5IEouVC4gQ29ua2xpbiA8anRjQE5ldEJTRC5vcmc+LgorICogUHVibGljIGRvbWFpbi4KKyAqLworCQorI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfY2VpbGwuUyx2IDEuMSAyMDA1LzA0LzE2IDIxOjEyOjU1IGRhcyBFeHAgJCIpCisKK0VOVFJZKGNlaWxsKQorCXB1c2hsCSVlYnAKKwltb3ZsCSVlc3AsJWVicAorCXN1YmwJJDgsJWVzcAorCisJZnN0Y3cJLTQoJWVicCkJCS8qIHN0b3JlIGZwdSBjb250cm9sIHdvcmQgKi8KKwltb3Z3CS00KCVlYnApLCVkeAorCW9ydwkkMHgwODAwLCVkeAkJLyogcm91bmQgdG93YXJkcyArb28gKi8KKwlhbmR3CSQweGZiZmYsJWR4CisJbW92dwklZHgsLTgoJWVicCkKKwlmbGRjdwktOCglZWJwKQkJLyogbG9hZCBtb2RmaWVkIGNvbnRyb2wgd29yZCAqLworCisJZmxkdAk4KCVlYnApCQkJLyogcm91bmQgKi8KKwlmcm5kaW50CisKKwlmbGRjdwktNCglZWJwKQkJLyogcmVzdG9yZSBvcmlnaW5hbCBjb250cm9sIHdvcmQgKi8KKworCWxlYXZlCisJcmV0CmRpZmYgLS1naXQgYS9saWJtL2kzODcvc19jb3B5c2lnbi5TIGIvbGlibS9pMzg3L3NfY29weXNpZ24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWNjNzcwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L3NfY29weXNpZ24uUwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLDk0IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogV3JpdHRlbiBieToKKyAqCUouVC4gQ29ua2xpbiAoanRjQHdpbXNleS5jb20pLCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworUkNTSUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9zX2NvcHlzaWduLlMsdiAxLjYgMTk5OS8wOC8yOCAwMDowNjoxMSBwZXRlciBFeHAgJCIpCisKK0VOVFJZKGNvcHlzaWduKQorCW1vdmwJMTYoJWVzcCksJWVkeAorCWFuZGwJJDB4ODAwMDAwMDAsJWVkeAorCW1vdmwJOCglZXNwKSwlZWF4CisJYW5kbAkkMHg3ZmZmZmZmZiwlZWF4CisJb3JsCSVlZHgsJWVheAorCW1vdmwJJWVheCw4KCVlc3ApCisJZmxkbAk0KCVlc3ApCisJcmV0CmRpZmYgLS1naXQgYS9saWJtL2kzODcvc19jb3B5c2lnbmYuUyBiL2xpYm0vaTM4Ny9zX2NvcHlzaWduZi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZmM4OTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvc19jb3B5c2lnbmYuUwpAQCAtMCwwICsxLDE5IEBACisvKgorICogV3JpdHRlbiBieSBKLlQuIENvbmtsaW4gPGp0Y0BuZXRic2Qub3JnPi4KKyAqIFB1YmxpYyBkb21haW4uCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvc19jb3B5c2lnbmYuUyx2IDEuMSAyMDA1LzAxLzEzIDE4OjU4OjI1IGRhcyBFeHAgJCIpOworLyogUkNTSUQoIiROZXRCU0Q6IHNfY29weXNpZ25mLlMsdiAxLjMgMTk5NS8wNS8wOCAyMzo1MzoyNSBqdGMgRXhwICQiKSAqLworCitFTlRSWShjb3B5c2lnbmYpCisJbW92bAk4KCVlc3ApLCVlZHgKKwlhbmRsCSQweDgwMDAwMDAwLCVlZHgKKwltb3ZsCTQoJWVzcCksJWVheAorCWFuZGwJJDB4N2ZmZmZmZmYsJWVheAorCW9ybAklZWR4LCVlYXgKKwltb3ZsCSVlYXgsNCglZXNwKQorCWZsZHMJNCglZXNwKQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L3NfY29weXNpZ25sLlMgYi9saWJtL2kzODcvc19jb3B5c2lnbmwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzNhMzc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L3NfY29weXNpZ25sLlMKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIEJhc2VkIG9uIGNvZGUgd3JpdHRlbiBieSBKLlQuIENvbmtsaW4gPGp0Y0BOZXRCU0Qub3JnPi4KKyAqIFB1YmxpYyBkb21haW4uCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfY29weXNpZ25sLlMsdiAxLjEgMjAwNS8wNC8xNiAyMToxMjo1NSBkYXMgRXhwICQiKQorCitFTlRSWShjb3B5c2lnbmwpCisJbW92bAkyNCglZXNwKSwlZWR4CisJYW5kbAkkMHg4MDAwLCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlYXgKKwlhbmRsCSQweDdmZmYsJWVheAorCW9ybAklZWR4LCVlYXgKKwltb3ZsCSVlYXgsMTIoJWVzcCkKKwlmbGR0CTQoJWVzcCkKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX2Nvcy5TIGIvbGlibS9pMzg3L3NfY29zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM4Y2I3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX2Nvcy5TCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogV3JpdHRlbiBieToKKyAqCUouVC4gQ29ua2xpbiAoanRjQHdpbXNleS5jb20pLCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworUkNTSUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9zX2Nvcy5TLHYgMS42IDE5OTkvMDgvMjggMDA6MDY6MTIgcGV0ZXIgRXhwICQiKQorCitFTlRSWShjb3MpCisJZmxkbAk0KCVlc3ApCisJZmNvcworCWZuc3RzdwklYXgKKwlhbmR3CSQweDQwMCwlYXgKKwlqbnoJMWYKKwlyZXQJCisxOglmbGRwaQorCWZhZGQJJXN0KDApCisJZnhjaAklc3QoMSkKKzI6CWZwcmVtMQorCWZuc3RzdwklYXgKKwlhbmR3CSQweDQwMCwlYXgKKwlqbnoJMmIKKwlmc3RwCSVzdCgxKQorCWZjb3MKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX2Zpbml0ZS5TIGIvbGlibS9pMzg3L3NfZmluaXRlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzNWIwZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX2Zpbml0ZS5TCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsOTQgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBXcml0dGVuIGJ5OgorICoJSi5ULiBDb25rbGluIChqdGNAd2ltc2V5LmNvbSksIFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitSQ1NJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfZmluaXRlLlMsdiAxLjcgMTk5OS8wOC8yOCAwMDowNjoxMiBwZXRlciBFeHAgJCIpCisKK0VOVFJZKGZpbml0ZSkKKwltb3ZsCTgoJWVzcCksJWVheAorCWFuZGwJJDB4N2ZmMDAwMDAsICVlYXgKKwljbXBsCSQweDdmZjAwMDAwLCAlZWF4CisJc2V0bmViCSVhbAorCWFuZGwJJDB4MDAwMDAwZmYsICVlYXgKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX2Zsb29yLlMgYi9saWJtL2kzODcvc19mbG9vci5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMmY4M2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvc19mbG9vci5TCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsOTQgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogV3JpdHRlbiBieToKKyAqCUouVC4gQ29ua2xpbiAoanRjQHdpbXNleS5jb20pLCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworUkNTSUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9zX2Zsb29yLlMsdiAxLjcgMTk5OS8wOC8yOCAwMDowNjoxMiBwZXRlciBFeHAgJCIpCisKK0VOVFJZKGZsb29yKQorCXB1c2hsCSVlYnAKKwltb3ZsCSVlc3AsJWVicAorCXN1YmwJJDgsJWVzcAorCisJZnN0Y3cJLTQoJWVicCkJCS8qIHN0b3JlIGZwdSBjb250cm9sIHdvcmQgKi8KKwltb3Z3CS00KCVlYnApLCVkeAorCW9ydwkkMHgwNDAwLCVkeAkJLyogcm91bmQgdG93YXJkcyAtb28gKi8KKwlhbmR3CSQweGY3ZmYsJWR4CisJbW92dwklZHgsLTgoJWVicCkKKwlmbGRjdwktOCglZWJwKQkJLyogbG9hZCBtb2RmaWVkIGNvbnRyb2wgd29yZCAqLworCisJZmxkbAk4KCVlYnApOwkJLyogcm91bmQgKi8KKwlmcm5kaW50CisKKwlmbGRjdwktNCglZWJwKQkJLyogcmVzdG9yZSBvcmlnaW5hbCBjb250cm9sIHdvcmQgKi8KKworCWxlYXZlCisJcmV0CmRpZmYgLS1naXQgYS9saWJtL2kzODcvc19mbG9vcmYuUyBiL2xpYm0vaTM4Ny9zX2Zsb29yZi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMzlhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvc19mbG9vcmYuUwpAQCAtMCwwICsxLDI5IEBACisvKgorICogV3JpdHRlbiBieSBKLlQuIENvbmtsaW4gPGp0Y0BuZXRic2Qub3JnPi4KKyAqIFB1YmxpYyBkb21haW4uCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvc19mbG9vcmYuUyx2IDEuMiAyMDA1LzA1LzA2IDE1OjQ0OjIwIGRlaXNjaGVuIEV4cCAkIik7CisvKiBSQ1NJRCgiJE5ldEJTRDogc19mbG9vcmYuUyx2IDEuMyAxOTk1LzA1LzA5IDAwOjA0OjMyIGp0YyBFeHAgJCIpICovCisKK0VOVFJZKGZsb29yZikKKwlwdXNobAklZWJwCisJbW92bAklZXNwLCVlYnAKKwlzdWJsCSQ4LCVlc3AKKworCWZzdGN3CS00KCVlYnApCQkvKiBzdG9yZSBmcHUgY29udHJvbCB3b3JkICovCisJbW92dwktNCglZWJwKSwlZHgKKwlvcncJJDB4MDQwMCwlZHgJCS8qIHJvdW5kIHRvd2FyZHMgLW9vICovCisJYW5kdwkkMHhmN2ZmLCVkeAorCW1vdncJJWR4LC04KCVlYnApCisJZmxkY3cJLTgoJWVicCkJCS8qIGxvYWQgbW9kZmllZCBjb250cm9sIHdvcmQgKi8KKworCWZsZHMJOCglZWJwKTsJCS8qIHJvdW5kICovCisJZnJuZGludAorCisJZmxkY3cJLTQoJWVicCkJCS8qIHJlc3RvcmUgb3JpZ2luYWwgY29udHJvbCB3b3JkICovCisKKwlsZWF2ZQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L3NfZmxvb3JsLlMgYi9saWJtL2kzODcvc19mbG9vcmwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2RlMzM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L3NfZmxvb3JsLlMKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIEJhc2VkIG9uIGNvZGUgd3JpdHRlbiBieSBKLlQuIENvbmtsaW4gPGp0Y0BOZXRCU0Qub3JnPi4KKyAqIFB1YmxpYyBkb21haW4uCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfZmxvb3JsLlMsdiAxLjEgMjAwNS8wNC8xNiAyMToxMjo1NSBkYXMgRXhwICQiKQorCitFTlRSWShmbG9vcmwpCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwlZWJwCisJc3VibAkkOCwlZXNwCisKKwlmc3RjdwktNCglZWJwKQkJLyogc3RvcmUgZnB1IGNvbnRyb2wgd29yZCAqLworCW1vdncJLTQoJWVicCksJWR4CisJb3J3CSQweDA0MDAsJWR4CQkvKiByb3VuZCB0b3dhcmRzIC1vbyAqLworCWFuZHcJJDB4ZjdmZiwlZHgKKwltb3Z3CSVkeCwtOCglZWJwKQorCWZsZGN3CS04KCVlYnApCQkvKiBsb2FkIG1vZGZpZWQgY29udHJvbCB3b3JkICovCisKKwlmbGR0CTgoJWVicCkJCQkvKiByb3VuZCAqLworCWZybmRpbnQKKworCWZsZGN3CS00KCVlYnApCQkvKiByZXN0b3JlIG9yaWdpbmFsIGNvbnRyb2wgd29yZCAqLworCisJbGVhdmUKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX2xscmludC5TIGIvbGlibS9pMzg3L3NfbGxyaW50LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2NmU1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX2xscmludC5TCkBAIC0wLDAgKzEsMzYgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfbGxyaW50LlMsdiAxLjEgMjAwNS8wMS8xMSAyMzoxMDo1MyBkYXMgRXhwICQiKTsgCisJCitFTlRSWShsbHJpbnQpCisJZmxkbAk0KCVlc3ApCisJc3VibAkkOCwlZXNwCisJZmlzdHBsbAkoJWVzcCkKKwlwb3BsCSVlYXgKKwlwb3BsCSVlZHgKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX2xscmludGYuUyBiL2xpYm0vaTM4Ny9zX2xscmludGYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWVkYjA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L3NfbGxyaW50Zi5TCkBAIC0wLDAgKzEsMzYgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfbGxyaW50Zi5TLHYgMS4xIDIwMDUvMDQvMTYgMjE6MTI6NTUgZGFzIEV4cCAkIikKKwkKK0VOVFJZKGxscmludGYpCisJZmxkcwk0KCVlc3ApCisJc3VibAkkOCwlZXNwCisJZmlzdHBsbAkoJWVzcCkKKwlwb3BsCSVlYXgKKwlwb3BsCSVlZHgKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX2xvZ2IuUyBiL2xpYm0vaTM4Ny9zX2xvZ2IuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2Y4ZDlkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L3NfbG9nYi5TCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsOTQgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBXcml0dGVuIGJ5OgorICoJSi5ULiBDb25rbGluIChqdGNAd2ltc2V5LmNvbSksIFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitSQ1NJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfbG9nYi5TLHYgMS43IDIwMDAvMDYvMDYgMTI6MTI6MzYgYmRlIEV4cCAkIikKKworRU5UUlkobG9nYikKKwlmbGRsCTQoJWVzcCkKKwlmeHRyYWN0CisJZnN0cAklc3QKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX2xvZ2JmLlMgYi9saWJtL2kzODcvc19sb2diZi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YmM0ODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvc19sb2diZi5TCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBXcml0dGVuIGJ5IEouVC4gQ29ua2xpbiA8anRjQG5ldGJzZC5vcmc+LgorICogUHVibGljIGRvbWFpbi4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9zX2xvZ2JmLlMsdiAxLjEgMjAwNS8wMS8xMyAxODo1ODoyNSBkYXMgRXhwICQiKTsKKy8qIFJDU0lEKCIkTmV0QlNEOiBzX2xvZ2JmLlMsdiAxLjMgMTk5NS8wNS8wOSAwMDoxNToxMiBqdGMgRXhwICQiKSAqLworCitFTlRSWShsb2diZikKKwlmbGRzCTQoJWVzcCkKKwlmeHRyYWN0CisJZnN0cAklc3QKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX2xyaW50LlMgYi9saWJtL2kzODcvc19scmludC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMjc4M2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvc19scmludC5TCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfbHJpbnQuUyx2IDEuMSAyMDA1LzAxLzExIDIzOjEwOjUzIGRhcyBFeHAgJCIpOyAKKwkKK0VOVFJZKGxyaW50KQorCWZsZGwJNCglZXNwKQorCXN1YmwJJDQsJWVzcAorCWZpc3RwbAkoJWVzcCkKKwlwb3BsCSVlYXgKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX2xyaW50Zi5TIGIvbGlibS9pMzg3L3NfbHJpbnRmLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxMjZmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX2xyaW50Zi5TCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfbHJpbnRmLlMsdiAxLjEgMjAwNS8wNC8xNiAyMToxMjo1NSBkYXMgRXhwICQiKQorCQorRU5UUlkobHJpbnRmKQorCWZsZHMJNCglZXNwKQorCXN1YmwJJDQsJWVzcAorCWZpc3RwbAkoJWVzcCkKKwlwb3BsCSVlYXgKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX3JlbXF1by5TIGIvbGlibS9pMzg3L3NfcmVtcXVvLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc1MjgzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX3JlbXF1by5TCkBAIC0wLDAgKzEsNjIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIEJhc2VkIG9uIHB1YmxpYy1kb21haW4gcmVtYWluZGVyIHJvdXRpbmUgYnkgSi5ULiBDb25rbGluIDxqdGNATmV0QlNELm9yZz4uCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfcmVtcXVvLlMsdiAxLjEgMjAwNS8wMy8yNSAwNDo0MDo0NCBkYXMgRXhwICQiKTsgCisJCitFTlRSWShyZW1xdW8pCisJZmxkbAkxMiglZXNwKQorCWZsZGwJNCglZXNwKQorMToJZnByZW0xCisJZnN0c3cJJWF4CisJc2FoZgorCWpwCTFiCisJZnN0cAklc3QoMSkKKy8qIEV4dHJhY3QgdGhlIHRocmVlIGxvdy1vcmRlciBiaXRzIG9mIHRoZSBxdW90aWVudCBmcm9tIEMwLEMzLEMxLiAqLworCXNocmwJJDYsJWVheAorCW1vdmwJJWVheCwlZWN4CisJYW5kbAkkMHgxMDgsJWVheAorCXJvcmwJJDcsJWVheAorCW9ybAklZWF4LCVlY3gKKwlyb2xsCSQ0LCVlYXgKKwlvcmwJJWVjeCwlZWF4CisJYW5kbAkkNywlZWF4CisvKiBOZWdhdGUgdGhlIHF1b3RpZW50IGJpdHMgaWYgeCp5PDAuICBBdm9pZCB1c2luZyBhbiB1bnByZWRpY3RhYmxlIGJyYW5jaC4gKi8KKwltb3ZsCTE2KCVlc3ApLCVlY3gKKwl4b3JsCTgoJWVzcCksJWVjeAorCXNhcmwJJDE2LCVlY3gKKwlzYXJsCSQxNiwlZWN4CisJeG9ybAklZWN4LCVlYXgKKwlhbmRsCSQxLCVlY3gKKwlhZGRsCSVlY3gsJWVheAorLyogU3RvcmUgdGhlIHF1b3RpZW50IGFuZCByZXR1cm4uICovCisJbW92bAkyMCglZXNwKSwlZWN4CisJbW92bAklZWF4LCglZWN4KQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L3NfcmVtcXVvZi5TIGIvbGlibS9pMzg3L3NfcmVtcXVvZi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZDI0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvc19yZW1xdW9mLlMKQEAgLTAsMCArMSw2MiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogQmFzZWQgb24gcHVibGljLWRvbWFpbiByZW1haW5kZXIgcm91dGluZSBieSBKLlQuIENvbmtsaW4gPGp0Y0BOZXRCU0Qub3JnPi4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvc19yZW1xdW9mLlMsdiAxLjEgMjAwNS8wMy8yNSAwNDo0MDo0NCBkYXMgRXhwICQiKTsgCisJCitFTlRSWShyZW1xdW9mKQorCWZsZHMJOCglZXNwKQorCWZsZHMJNCglZXNwKQorMToJZnByZW0xCisJZnN0c3cJJWF4CisJc2FoZgorCWpwCTFiCisJZnN0cAklc3QoMSkKKy8qIEV4dHJhY3QgdGhlIHRocmVlIGxvdy1vcmRlciBiaXRzIG9mIHRoZSBxdW90aWVudCBmcm9tIEMwLEMzLEMxLiAqLworCXNocmwJJDYsJWVheAorCW1vdmwJJWVheCwlZWN4CisJYW5kbAkkMHgxMDgsJWVheAorCXJvcmwJJDcsJWVheAorCW9ybAklZWF4LCVlY3gKKwlyb2xsCSQ0LCVlYXgKKwlvcmwJJWVjeCwlZWF4CisJYW5kbAkkNywlZWF4CisvKiBOZWdhdGUgdGhlIHF1b3RpZW50IGJpdHMgaWYgeCp5PDAuICBBdm9pZCB1c2luZyBhbiB1bnByZWRpY3RhYmxlIGJyYW5jaC4gKi8KKwltb3ZsCTgoJWVzcCksJWVjeAorCXhvcmwJNCglZXNwKSwlZWN4CisJc2FybAkkMTYsJWVjeAorCXNhcmwJJDE2LCVlY3gKKwl4b3JsCSVlY3gsJWVheAorCWFuZGwJJDEsJWVjeAorCWFkZGwJJWVjeCwlZWF4CisvKiBTdG9yZSB0aGUgcXVvdGllbnQgYW5kIHJldHVybi4gKi8KKwltb3ZsCTEyKCVlc3ApLCVlY3gKKwltb3ZsCSVlYXgsKCVlY3gpCisJcmV0CmRpZmYgLS1naXQgYS9saWJtL2kzODcvc19yaW50LlMgYi9saWJtL2kzODcvc19yaW50LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkYTMxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX3JpbnQuUwpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLDk0IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFdyaXR0ZW4gYnk6CisgKglKLlQuIENvbmtsaW4gKGp0Y0B3aW1zZXkuY29tKSwgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKK1JDU0lEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvc19yaW50LlMsdiAxLjYgMTk5OS8wOC8yOCAwMDowNjoxMyBwZXRlciBFeHAgJCIpCisKK0VOVFJZKHJpbnQpCisJZmxkbAk0KCVlc3ApCisJZnJuZGludAorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L3NfcmludGYuUyBiL2xpYm0vaTM4Ny9zX3JpbnRmLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ0NTI2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX3JpbnRmLlMKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgSi5ULiBDb25rbGluIDxqdGNAbmV0YnNkLm9yZz4uCisgKiBQdWJsaWMgZG9tYWluLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfcmludGYuUyx2IDEuMSAyMDA1LzAxLzEzIDE4OjU4OjI1IGRhcyBFeHAgJCIpOworLyogUkNTSUQoIiROZXRCU0Q6IHNfcmludGYuUyx2IDEuMyAxOTk1LzA1LzA5IDAwOjE3OjIyIGp0YyBFeHAgJCIpICovCisKK0VOVFJZKHJpbnRmKQorCWZsZHMJNCglZXNwKQorCWZybmRpbnQKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX3NjYWxibi5TIGIvbGlibS9pMzg3L3Nfc2NhbGJuLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwMDYwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX3NjYWxibi5TCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogV3JpdHRlbiBieToKKyAqCUouVC4gQ29ua2xpbiAoanRjQHdpbXNleS5jb20pLCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworUkNTSUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9zX3NjYWxibi5TLHYgMS43IDE5OTkvMDgvMjggMDA6MDY6MTMgcGV0ZXIgRXhwICQiKQorCitFTlRSWShzY2FsYm4pCisJZmlsZGwJMTIoJWVzcCkKKwlmbGRsCTQoJWVzcCkKKwlmc2NhbGUKKwlmc3RwCSVzdCgxKQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L3Nfc2NhbGJuZi5TIGIvbGlibS9pMzg3L3Nfc2NhbGJuZi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMWFjNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvc19zY2FsYm5mLlMKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgSi5ULiBDb25rbGluIDxqdGNAbmV0YnNkLm9yZz4uCisgKiBQdWJsaWMgZG9tYWluLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3Nfc2NhbGJuZi5TLHYgMS4yIDIwMDUvMDMvMDcgMDQ6NTI6NDMgZGFzIEV4cCAkIik7CisvKiBSQ1NJRCgiJE5ldEJTRDogc19zY2FsYm5mLlMsdiAxLjQgMTk5OS8wMS8wMiAwNToxNTo0MCBrcmlzdGVydyBFeHAgJCIpICovCisKK0VOVFJZKHNjYWxibmYpCisJZmlsZGwJOCglZXNwKQorCWZsZHMJNCglZXNwKQorCWZzY2FsZQorCWZzdHAJJXN0KDEpCQkvKiBidWcgZml4IGZvciBmcCBzdGFjayBvdmVyZmxvdyAqLworCXJldAorCisuZ2xvYmwgQ05BTUUobGRleHBmKQorLnNldAlDTkFNRShsZGV4cGYpLENOQU1FKHNjYWxibmYpCmRpZmYgLS1naXQgYS9saWJtL2kzODcvc19zY2FsYm5sLlMgYi9saWJtL2kzODcvc19zY2FsYm5sLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyYWI2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX3NjYWxibmwuUwpAQCAtMCwwICsxLDE5IEBACisvKgorICogV3JpdHRlbiBieSBKLlQuIENvbmtsaW4gPGp0Y0BuZXRic2Qub3JnPi4KKyAqIFB1YmxpYyBkb21haW4uCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvc19zY2FsYm5sLlMsdiAxLjEgMjAwNS8wMy8wNyAwNDo1Mjo1NyBkYXMgRXhwICQiKTsKKy8qIFJDU0lEKCIkTmV0QlNEOiBzX3NjYWxibmYuUyx2IDEuNCAxOTk5LzAxLzAyIDA1OjE1OjQwIGtyaXN0ZXJ3IEV4cCAkIikgKi8KKworRU5UUlkoc2NhbGJubCkKKwlmaWxkbAkxNiglZXNwKQorCWZsZHQJNCglZXNwKQorCWZzY2FsZQorCWZzdHAJJXN0KDEpCisJcmV0CisKKy5nbG9ibCBDTkFNRShsZGV4cGwpCisuc2V0CUNOQU1FKGxkZXhwbCksQ05BTUUoc2NhbGJubCkKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX3NpZ25pZmljYW5kLlMgYi9saWJtL2kzODcvc19zaWduaWZpY2FuZC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZGJjODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvc19zaWduaWZpY2FuZC5TCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsOTQgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBXcml0dGVuIGJ5OgorICoJSi5ULiBDb25rbGluIChqdGNAd2ltc2V5LmNvbSksIFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitSQ1NJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3Nfc2lnbmlmaWNhbmQuUyx2IDEuNyAyMDAwLzA2LzA2IDEyOjEyOjM2IGJkZSBFeHAgJCIpCisKK0VOVFJZKHNpZ25pZmljYW5kKQorCWZsZGwJNCglZXNwKQorCWZ4dHJhY3QKKwlmc3RwCSVzdCgxKQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L3Nfc2lnbmlmaWNhbmRmLlMgYi9saWJtL2kzODcvc19zaWduaWZpY2FuZGYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDk2ZWYwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L3Nfc2lnbmlmaWNhbmRmLlMKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgSi5ULiBDb25rbGluIDxqdGNAbmV0YnNkLm9yZz4uCisgKiBQdWJsaWMgZG9tYWluLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3Nfc2lnbmlmaWNhbmRmLlMsdiAxLjEgMjAwNS8wMS8xMyAxODo1ODoyNSBkYXMgRXhwICQiKTsKKy8qIFJDU0lEKCIkTmV0QlNEOiBzX3NpZ25pZmljYW5kZi5TLHYgMS4zIDE5OTUvMDUvMDkgMDA6MjQ6MDcganRjIEV4cCAkIikgKi8KKworRU5UUlkoc2lnbmlmaWNhbmRmKQorCWZsZHMJNCglZXNwKQorCWZ4dHJhY3QKKwlmc3RwCSVzdCgxKQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L3Nfc2luLlMgYi9saWJtL2kzODcvc19zaW4uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2Q2NWZkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L3Nfc2luLlMKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBXcml0dGVuIGJ5OgorICoJSi5ULiBDb25rbGluIChqdGNAd2ltc2V5LmNvbSksIFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitSQ1NJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3Nfc2luLlMsdiAxLjYgMTk5OS8wOC8yOCAwMDowNjoxNCBwZXRlciBFeHAgJCIpCisKK0VOVFJZKHNpbikKKwlmbGRsCTQoJWVzcCkKKwlmc2luCisJZm5zdHN3CSVheAorCWFuZHcJJDB4NDAwLCVheAorCWpuegkxZgorCXJldAorMToJZmxkcGkKKwlmYWRkCSVzdCgwKQorCWZ4Y2gJJXN0KDEpCisyOglmcHJlbTEKKwlmbnN0c3cJJWF4CisJYW5kdwkkMHg0MDAsJWF4CisJam56CTJiCisJZnN0cAklc3QoMSkKKwlmc2luCisJcmV0CmRpZmYgLS1naXQgYS9saWJtL2kzODcvc190YW4uUyBiL2xpYm0vaTM4Ny9zX3Rhbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNWUxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvc190YW4uUwpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk0IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFdyaXR0ZW4gYnk6CisgKglKLlQuIENvbmtsaW4gKGp0Y0B3aW1zZXkuY29tKSwgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKK1JDU0lEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvc190YW4uUyx2IDEuNiAxOTk5LzA4LzI4IDAwOjA2OjE0IHBldGVyIEV4cCAkIikKKworRU5UUlkodGFuKQorCWZsZGwJNCglZXNwKQorCWZwdGFuCisJZm5zdHN3CSVheAorCWFuZHcJJDB4NDAwLCVheAorCWpuegkxZgorCWZzdHAJJXN0KDApCisJcmV0CisxOglmbGRwaQorCWZhZGQJJXN0KDApCisJZnhjaAklc3QoMSkKKzI6CWZwcmVtMQorCWZzdHN3CSVheAorCWFuZHcJJDB4NDAwLCVheAorCWpuegkyYgorCWZzdHAJJXN0KDEpCisJZnB0YW4KKwlmc3RwCSVzdCgwKQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L3NfdHJ1bmMuUyBiL2xpYm0vaTM4Ny9zX3RydW5jLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3OGUxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX3RydW5jLlMKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIEJhc2VkIG9uIGNvZGUgd3JpdHRlbiBieSBKLlQuIENvbmtsaW4gPGp0Y0BOZXRCU0Qub3JnPi4KKyAqIFB1YmxpYyBkb21haW4uCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfdHJ1bmMuUyx2IDEuMSAyMDA1LzA0LzE2IDIxOjEyOjU1IGRhcyBFeHAgJCIpCisKK0VOVFJZKHRydW5jKQorCXB1c2hsCSVlYnAKKwltb3ZsCSVlc3AsJWVicAorCXN1YmwJJDgsJWVzcAorCisJZnN0Y3cJLTQoJWVicCkJCS8qIHN0b3JlIGZwdSBjb250cm9sIHdvcmQgKi8KKwltb3Z3CS00KCVlYnApLCVkeAorCW9ydwkkMHgwYzAwLCVkeAkJLyogcm91bmQgdG93YXJkcyAtb28gKi8KKwltb3Z3CSVkeCwtOCglZWJwKQorCWZsZGN3CS04KCVlYnApCQkvKiBsb2FkIG1vZGZpZWQgY29udHJvbCB3b3JkICovCisKKwlmbGRsCTgoJWVicCkJCQkvKiByb3VuZCAqLworCWZybmRpbnQKKworCWZsZGN3CS00KCVlYnApCQkvKiByZXN0b3JlIG9yaWdpbmFsIGNvbnRyb2wgd29yZCAqLworCisJbGVhdmUKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX3RydW5jZi5TIGIvbGlibS9pMzg3L3NfdHJ1bmNmLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFmYWYzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX3RydW5jZi5TCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBCYXNlZCBvbiBjb2RlIHdyaXR0ZW4gYnkgSi5ULiBDb25rbGluIDxqdGNATmV0QlNELm9yZz4uCisgKiBQdWJsaWMgZG9tYWluLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9zX3RydW5jZi5TLHYgMS4yIDIwMDUvMDUvMDYgMTU6NDQ6MjAgZGVpc2NoZW4gRXhwICQiKQorCitFTlRSWSh0cnVuY2YpCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwlZWJwCisJc3VibAkkOCwlZXNwCisKKwlmc3RjdwktNCglZWJwKQkJLyogc3RvcmUgZnB1IGNvbnRyb2wgd29yZCAqLworCW1vdncJLTQoJWVicCksJWR4CisJb3J3CSQweDBjMDAsJWR4CQkvKiByb3VuZCB0b3dhcmRzIC1vbyAqLworCW1vdncJJWR4LC04KCVlYnApCisJZmxkY3cJLTgoJWVicCkJCS8qIGxvYWQgbW9kZmllZCBjb250cm9sIHdvcmQgKi8KKworCWZsZHMJOCglZWJwKQkJCS8qIHJvdW5kICovCisJZnJuZGludAorCisJZmxkY3cJLTQoJWVicCkJCS8qIHJlc3RvcmUgb3JpZ2luYWwgY29udHJvbCB3b3JkICovCisKKwlsZWF2ZQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L3NfdHJ1bmNsLlMgYi9saWJtL2kzODcvc190cnVuY2wuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDVkZjFjCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L3NfdHJ1bmNsLlMKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIEJhc2VkIG9uIGNvZGUgd3JpdHRlbiBieSBKLlQuIENvbmtsaW4gPGp0Y0BOZXRCU0Qub3JnPi4KKyAqIFB1YmxpYyBkb21haW4uCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfdHJ1bmNsLlMsdiAxLjEgMjAwNS8wNC8xNiAyMToxMjo1NSBkYXMgRXhwICQiKQorCitFTlRSWSh0cnVuY2wpCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwlZWJwCisJc3VibAkkOCwlZXNwCisKKwlmc3RjdwktNCglZWJwKQkJLyogc3RvcmUgZnB1IGNvbnRyb2wgd29yZCAqLworCW1vdncJLTQoJWVicCksJWR4CisJb3J3CSQweDBjMDAsJWR4CQkvKiByb3VuZCB0b3dhcmRzIC1vbyAqLworCW1vdncJJWR4LC04KCVlYnApCisJZmxkY3cJLTgoJWVicCkJCS8qIGxvYWQgbW9kZmllZCBjb250cm9sIHdvcmQgKi8KKworCWZsZHQJOCglZWJwKQkJCS8qIHJvdW5kICovCisJZnJuZGludAorCisJZmxkY3cJLTQoJWVicCkJCS8qIHJlc3RvcmUgb3JpZ2luYWwgY29udHJvbCB3b3JkICovCisKKwlsZWF2ZQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pYTY0L01ha2VmaWxlLmluYyBiL2xpYm0vaWE2NC9NYWtlZmlsZS5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmMjI2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaWE2NC9NYWtlZmlsZS5pbmMKQEAgLTAsMCArMSw0IEBACisjICRGcmVlQlNEOiBzcmMvbGliL21zdW4vaWE2NC9NYWtlZmlsZS5pbmMsdiAxLjIgMjAwNS8wMy8wNyAwNDo1NDowMiBkYXMgRXhwICQKKworQVJDSF9TUkNTID0gc19mbWEuUyBzX2ZtYWYuUyBzX2ZtYWwuUworTERCTF9QUkVDID0gNjQKZGlmZiAtLWdpdCBhL2xpYm0vaWE2NC9fZnBtYXRoLmggYi9saWJtL2lhNjQvX2ZwbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZTc1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2lhNjQvX2ZwbWF0aC5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pa2UgQmFyY3JvZnQgPG1pa2VARnJlZUJTRC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9saWJjL2lhNjQvX2ZwbWF0aC5oLHYgMS42IDIwMDUvMDMvMDcgMDQ6NTU6NDAgZGFzIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPHN5cy9lbmRpYW4uaD4KKwordW5pb24gSUVFRWwyYml0cyB7CisJbG9uZyBkb3VibGUJZTsKKwlzdHJ1Y3QgeworI2lmIF9CWVRFX09SREVSID09IF9MSVRUTEVfRU5ESUFOCisJCXVuc2lnbmVkIGludAltYW5sCTozMjsKKwkJdW5zaWduZWQgaW50CW1hbmgJOjMyOworCQl1bnNpZ25lZCBpbnQJZXhwCToxNTsKKwkJdW5zaWduZWQgaW50CXNpZ24JOjE7CisJCXVuc2lnbmVkIGxvbmcJanVuawk6NDg7CisjZWxzZSAvKiBfQklHX0VORElBTiAqLworCQl1bnNpZ25lZCBsb25nCWp1bmsJOjQ4OworCQl1bnNpZ25lZCBpbnQJc2lnbgk6MTsKKwkJdW5zaWduZWQgaW50CWV4cAk6MTU7CisJCXVuc2lnbmVkIGludAltYW5oCTozMjsKKwkJdW5zaWduZWQgaW50CW1hbmwJOjMyOworI2VuZGlmCisJfSBiaXRzOworfTsKKworI2lmIF9CWVRFX09SREVSID09IF9MSVRUTEVfRU5ESUFOCisjZGVmaW5lCUxEQkxfTkJJVAkweDgwMDAwMDAwCisjZGVmaW5lCW1hc2tfbmJpdF9sKHUpCSgodSkuYml0cy5tYW5oICY9IH5MREJMX05CSVQpCisjZWxzZSAvKiBfQklHX0VORElBTiAqLworLyoKKyAqIFhYWCBUaGlzIGRvZXNuJ3QgbG9vayByaWdodC4gIFZlcnkgZmV3IG1hY2hpbmVzIGhhdmUgYSBkaWZmZXJlbnQKKyAqICAgICBlbmRpYW5uZXNzIGZvciBpbnRlZ2VycyBhbmQgZmxvYXRpbmctcG9pbnQsIGFuZCBpbiBuZXh0YWZ0ZXJsKCkKKyAqICAgICB3ZSBhc3N1bWUgdGhhdCBub25lIGRvLiAgSWYgeW91IGhhdmUgYW4gZW52aXJvbm1lbnQgZm9yIHRlc3RpbmcKKyAqICAgICB0aGlzLCBwbGVhc2UgbGV0IG1lIGtub3cuIC0tZGFzCisgKi8KKyNkZWZpbmUJTERCTF9OQklUCTB4ODAKKyNkZWZpbmUJbWFza19uYml0X2wodSkJKCh1KS5iaXRzLm1hbmggJj0gfkxEQkxfTkJJVCkKKyNlbmRpZgorCisjZGVmaW5lCUxEQkxfTUFOSF9TSVpFCTMyCisjZGVmaW5lCUxEQkxfTUFOTF9TSVpFCTMyCisKKyNkZWZpbmUJTERCTF9UT19BUlJBWTMyKHUsIGEpIGRvIHsJCQlcCisJKGEpWzBdID0gKHVpbnQzMl90KSh1KS5iaXRzLm1hbmw7CQlcCisJKGEpWzFdID0gKHVpbnQzMl90KSh1KS5iaXRzLm1hbmg7CQlcCit9IHdoaWxlKDApCmRpZmYgLS1naXQgYS9saWJtL2lhNjQvZmVudi5jIGIvbGlibS9pYTY0L2ZlbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODJkMzdlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pYTY0L2ZlbnYuYwpAQCAtMCwwICsxLDQ5IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vaWE2NC9mZW52LmMsdiAxLjIgMjAwNC8wNi8xMSAwMjozNTozMCBkYXMgRXhwICQKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmVudi5oPgorCitjb25zdCBmZW52X3QgX19mZV9kZmxfZW52ID0gMHgwMDA5ODA0YzhhNzAwMzNmVUxMOworCisvKgorICogSXQgZG9lc24ndCBwYXkgdG8gaW5saW5lIGZldXBkYXRlZW52KCkgYmVjYXVzZSBpdCBpbmNsdWRlcyBvbmUgb2YKKyAqIHRoZSByYXJlIHVzZXMgb2YgZmVyYWlzZWV4Y2VwdCgpIHdoZXJlIHRoZSBhcmd1bWVudCBpcyBub3QgYQorICogY29uc3RhbnQuICBUaHVzLCBubyBkZWFkIGNvZGUgZWxpbWluYXRpb24gY2FuIG9jY3VyLCByZXN1bHRpbmcgaW4KKyAqIHNpZ25pZmljYW50IGJsb2F0LgorICovCitpbnQKK2ZldXBkYXRlZW52KGNvbnN0IGZlbnZfdCAqZW52cCkKK3sKKwlmZW52X3QgZnBzcjsKKworCV9fc3RmcHNyKCZmcHNyKTsKKwlfX2xkZnBzcigqZW52cCk7CisJZmVyYWlzZWV4Y2VwdCgoZnBzciA+PiBfRlBVU1dfU0hJRlQpICYgRkVfQUxMX0VYQ0VQVCk7CisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vaWE2NC9mZW52LmggYi9saWJtL2lhNjQvZmVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNmI2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2lhNjQvZmVudi5oCkBAIC0wLDAgKzEsMjQyIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pYTY0L2ZlbnYuaCx2IDEuNCAyMDA1LzAzLzE2IDE5OjAzOjQ1IGRhcyBFeHAgJAorICovCisKKyNpZm5kZWYJX0ZFTlZfSF8KKyNkZWZpbmUJX0ZFTlZfSF8KKworI2luY2x1ZGUgPHN5cy9fdHlwZXMuaD4KKwordHlwZWRlZglfX3VpbnQ2NF90CWZlbnZfdDsKK3R5cGVkZWYJX191aW50MTZfdAlmZXhjZXB0X3Q7CisKKy8qIEV4Y2VwdGlvbiBmbGFncyAqLworI2RlZmluZQlGRV9JTlZBTElECTB4MDEKKyNkZWZpbmUJRkVfREVOT1JNQUwJMHgwMgorI2RlZmluZQlGRV9ESVZCWVpFUk8JMHgwNAorI2RlZmluZQlGRV9PVkVSRkxPVwkweDA4CisjZGVmaW5lCUZFX1VOREVSRkxPVwkweDEwCisjZGVmaW5lCUZFX0lORVhBQ1QJMHgyMAorI2RlZmluZQlGRV9BTExfRVhDRVBUCShGRV9ESVZCWVpFUk8gfCBGRV9ERU5PUk1BTCB8IEZFX0lORVhBQ1QgfCBcCisJCQkgRkVfSU5WQUxJRCB8IEZFX09WRVJGTE9XIHwgRkVfVU5ERVJGTE9XKQorCisvKiBSb3VuZGluZyBtb2RlcyAqLworI2RlZmluZQlGRV9UT05FQVJFU1QJMHgwMDAwCisjZGVmaW5lCUZFX0RPV05XQVJECTB4MDQwMAorI2RlZmluZQlGRV9VUFdBUkQJMHgwODAwCisjZGVmaW5lCUZFX1RPV0FSRFpFUk8JMHgwYzAwCisjZGVmaW5lCV9ST1VORF9NQVNLCShGRV9UT05FQVJFU1QgfCBGRV9ET1dOV0FSRCB8IFwKKwkJCSBGRV9VUFdBUkQgfCBGRV9UT1dBUkRaRVJPKQorCitfX0JFR0lOX0RFQ0xTCisKKy8qIERlZmF1bHQgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQgKi8KK2V4dGVybiBjb25zdCBmZW52X3QJX19mZV9kZmxfZW52OworI2RlZmluZQlGRV9ERkxfRU5WCSgmX19mZV9kZmxfZW52KQorCisjZGVmaW5lCV9GUFVTV19TSElGVAkxMworCisjZGVmaW5lCV9fc3RmcHNyKF9fcikJX19hc20gX192b2xhdGlsZSgibW92ICUwPWFyLmZwc3IiIDogIj1yIiAoKihfX3IpKSkKKyNkZWZpbmUJX19sZGZwc3IoX19yKQlfX2FzbSBfX3ZvbGF0aWxlKCJtb3YgYXIuZnBzcj0lMDs7IiA6IDogInIiIChfX3IpKQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWNsZWFyZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJZmVudl90IF9fZnBzcjsKKworCV9fc3RmcHNyKCZfX2Zwc3IpOworCV9fZnBzciAmPSB+KChmZW52X3QpX19leGNlcHRzIDw8IF9GUFVTV19TSElGVCk7CisJX19sZGZwc3IoX19mcHNyKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldGV4Y2VwdGZsYWcoZmV4Y2VwdF90ICpfX2ZsYWdwLCBpbnQgX19leGNlcHRzKQoreworCWZlbnZfdCBfX2Zwc3I7CisKKwlfX3N0ZnBzcigmX19mcHNyKTsKKwkqX19mbGFncCA9IChmZXhjZXB0X3QpKF9fZnBzciA+PiBfRlBVU1dfU0hJRlQpICYgX19leGNlcHRzOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2Zlc2V0ZXhjZXB0ZmxhZyhjb25zdCBmZXhjZXB0X3QgKl9fZmxhZ3AsIGludCBfX2V4Y2VwdHMpCit7CisJZmVudl90IF9fZnBzcjsKKworCV9fc3RmcHNyKCZfX2Zwc3IpOworCV9fZnBzciAmPSB+KChmZW52X3QpX19leGNlcHRzIDw8IF9GUFVTV19TSElGVCk7CisJX19mcHNyIHw9IChmZW52X3QpKF9fZXhjZXB0cyAmICpfX2ZsYWdwKSA8PCBfRlBVU1dfU0hJRlQ7CisJX19sZGZwc3IoX19mcHNyKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogSXQgaXMgd29ydGh3aGlsZSB0byB1c2UgdGhlIGlubGluZSB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gaWZmIGl0CisgKiBpcyBjYWxsZWQgd2l0aCBhcmd1bWVudHMgdGhhdCBhcmUgY29tcGlsZS10aW1lIGNvbnN0YW50cyAoZHVlIHRvCisgKiBkZWFkIGNvZGUgZWxpbWluYXRpb24pLiAgVW5mb3J0dW5hdGVseSwgZ2NjIGlzbid0IHNtYXJ0IGVub3VnaCB0bworICogZmlndXJlIHRoaXMgb3V0IGF1dG9tYXRpY2FsbHksIGFuZCB0aGVyZSdzIG5vIHdheSB0byB0ZWxsIGl0LgorICogV2UgYXNzdW1lIHRoYXQgY29uc3RhbnQgYXJndW1lbnRzIHdpbGwgYmUgdGhlIGNvbW1vbiBjYXNlLgorICovCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXJhaXNlZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJdm9sYXRpbGUgZG91YmxlIGQ7CisKKwkvKgorCSAqIFdpdGggYSBjb21waWxlciB0aGF0IHN1cHBvcnRzIHRoZSBGRU5WX0FDQ0VTUyBwcmFnbWEKKwkgKiBwcm9wZXJseSwgc2ltcGxlIGV4cHJlc3Npb25zIGxpa2UgJzAuMCAvIDAuMCcgc2hvdWxkCisJICogYmUgc3VmZmljaWVudCB0byBnZW5lcmF0ZSB0cmFwcy4gIFVuZm9ydHVuYXRlbHksIHdlCisJICogbmVlZCB0byBicmluZyBhIHZvbGF0aWxlIHZhcmlhYmxlIGludG8gdGhlIGVxdWF0aW9uCisJICogdG8gcHJldmVudCBpbmNvcnJlY3Qgb3B0aW1pemF0aW9ucy4KKwkgKi8KKwlpZiAoX19leGNlcHRzICYgRkVfSU5WQUxJRCkgeworCQlkID0gMC4wOworCQlkID0gMC4wIC8gZDsKKwl9CisJaWYgKF9fZXhjZXB0cyAmIEZFX0RJVkJZWkVSTykgeworCQlkID0gMC4wOworCQlkID0gMS4wIC8gZDsKKwl9CisJaWYgKF9fZXhjZXB0cyAmIEZFX09WRVJGTE9XKSB7CisJCWQgPSAweDEuZmZwMTAyMzsKKwkJZCAqPSAyLjA7CisJfQorCWlmIChfX2V4Y2VwdHMgJiBGRV9VTkRFUkZMT1cpIHsKKwkJZCA9IDB4MXAtMTAyMjsKKwkJZCAvPSAweDFwMTAyMzsKKwl9CisJaWYgKF9fZXhjZXB0cyAmIEZFX0lORVhBQ1QpIHsKKwkJZCA9IDB4MXAtMTAyMjsKKwkJZCArPSAxLjA7CisJfQorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZldGVzdGV4Y2VwdChpbnQgX19leGNlcHRzKQoreworCWZlbnZfdCBfX2Zwc3I7CisKKwlfX3N0ZnBzcigmX19mcHNyKTsKKwlyZXR1cm4gKChfX2Zwc3IgPj4gX0ZQVVNXX1NISUZUKSAmIF9fZXhjZXB0cyk7Cit9CisKKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRyb3VuZCh2b2lkKQoreworCWZlbnZfdCBfX2Zwc3I7CisKKwlfX3N0ZnBzcigmX19mcHNyKTsKKwlyZXR1cm4gKF9fZnBzciAmIF9ST1VORF9NQVNLKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRyb3VuZChpbnQgX19yb3VuZCkKK3sKKwlmZW52X3QgX19mcHNyOworCisJaWYgKF9fcm91bmQgJiB+X1JPVU5EX01BU0spCisJCXJldHVybiAoLTEpOworCV9fc3RmcHNyKCZfX2Zwc3IpOworCV9fZnBzciAmPSB+X1JPVU5EX01BU0s7CisJX19mcHNyIHw9IF9fcm91bmQ7CisJX19sZGZwc3IoX19mcHNyKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldGVudihmZW52X3QgKl9fZW52cCkKK3sKKworCV9fc3RmcHNyKF9fZW52cCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVob2xkZXhjZXB0KGZlbnZfdCAqX19lbnZwKQoreworCWZlbnZfdCBfX2Zwc3I7CisKKwlfX3N0ZnBzcigmX19mcHNyKTsKKwkqX19lbnZwID0gX19mcHNyOworCV9fZnBzciAmPSB+KChmZW52X3QpRkVfQUxMX0VYQ0VQVCA8PCBfRlBVU1dfU0hJRlQpOworCV9fZnBzciB8PSBGRV9BTExfRVhDRVBUOworCV9fbGRmcHNyKF9fZnBzcik7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRlbnYoY29uc3QgZmVudl90ICpfX2VudnApCit7CisKKwlfX2xkZnBzcigqX19lbnZwKTsKKwlyZXR1cm4gKDApOworfQorCitpbnQgZmV1cGRhdGVlbnYoY29uc3QgZmVudl90ICpfX2VudnApOworCisjaWYgX19CU0RfVklTSUJMRQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWVuYWJsZWV4Y2VwdChpbnQgX19tYXNrKQoreworCWZlbnZfdCBfX25ld2Zwc3IsIF9fb2xkZnBzcjsKKworCV9fc3RmcHNyKCZfX29sZGZwc3IpOworCV9fbmV3ZnBzciA9IF9fb2xkZnBzciAmIH4oX19tYXNrICYgRkVfQUxMX0VYQ0VQVCk7CisJX19sZGZwc3IoX19uZXdmcHNyKTsKKwlyZXR1cm4gKH5fX29sZGZwc3IgJiBGRV9BTExfRVhDRVBUKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVkaXNhYmxlZXhjZXB0KGludCBfX21hc2spCit7CisJZmVudl90IF9fbmV3ZnBzciwgX19vbGRmcHNyOworCisJX19zdGZwc3IoJl9fb2xkZnBzcik7CisJX19uZXdmcHNyID0gX19vbGRmcHNyIHwgKF9fbWFzayAmIEZFX0FMTF9FWENFUFQpOworCV9fbGRmcHNyKF9fbmV3ZnBzcik7CisJcmV0dXJuICh+X19vbGRmcHNyICYgRkVfQUxMX0VYQ0VQVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZXhjZXB0KHZvaWQpCit7CisJZmVudl90IF9fZnBzcjsKKworCV9fc3RmcHNyKCZfX2Zwc3IpOworCXJldHVybiAofl9fZnBzciAmIEZFX0FMTF9FWENFUFQpOworfQorCisjZW5kaWYgLyogX19CU0RfVklTSUJMRSAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogIV9GRU5WX0hfICovCmRpZmYgLS1naXQgYS9saWJtL2lhNjQvc19mbWEuUyBiL2xpYm0vaWE2NC9zX2ZtYS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYTZjMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2lhNjQvc19mbWEuUwpAQCAtMCwwICsxLDM0IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaWE2NC9zX2ZtYS5TLHYgMS4xIDIwMDUvMDEvMjIgMDk6NTM6MTggZGFzIEV4cCAkIikKKworRU5UUlkoZm1hLCAzKQoreworCWZtYS5kCQlmOCA9IGY4LCBmOSwgZjEwCisJYnIucmV0LnNwdGsJYjAKK30KZGlmZiAtLWdpdCBhL2xpYm0vaWE2NC9zX2ZtYWYuUyBiL2xpYm0vaWE2NC9zX2ZtYWYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjAwNTFiCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pYTY0L3NfZm1hZi5TCkBAIC0wLDAgKzEsMzQgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pYTY0L3NfZm1hZi5TLHYgMS4xIDIwMDUvMDEvMjIgMDk6NTM6MTggZGFzIEV4cCAkIikKKworRU5UUlkoZm1hZiwgMykKK3sKKwlmbWEucwkJZjggPSBmOCwgZjksIGYxMAorCWJyLnJldC5zcHRrCWIwCit9CmRpZmYgLS1naXQgYS9saWJtL2lhNjQvc19mbWFsLlMgYi9saWJtL2lhNjQvc19mbWFsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I4YzQwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaWE2NC9zX2ZtYWwuUwpAQCAtMCwwICsxLDM0IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaWE2NC9zX2ZtYWwuUyx2IDEuMSAyMDA1LzAzLzA3IDA0OjUzOjExIGRhcyBFeHAgJCIpCisKK0VOVFJZKGZtYWwsIDMpCit7CisJZm1hCQlmOCA9IGY4LCBmOSwgZjEwCisJYnIucmV0LnNwdGsJYjAKK30KZGlmZiAtLWdpdCBhL2xpYm0vaW5jbHVkZS9hbHBoYS9mZW52LmggYi9saWJtL2luY2x1ZGUvYWxwaGEvZmVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjN2JjYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2luY2x1ZGUvYWxwaGEvZmVudi5oCkBAIC0wLDAgKzEsMTg1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9hbHBoYS9mZW52LmgsdiAxLjMgMjAwNS8wMy8xNiAxOTowMzo0NCBkYXMgRXhwICQKKyAqLworCisjaWZuZGVmCV9GRU5WX0hfCisjZGVmaW5lCV9GRU5WX0hfCisKKyNpbmNsdWRlIDxzeXMvX3R5cGVzLmg+CisKK3R5cGVkZWYJX191aW50NjRfdAlmZW52X3Q7Cit0eXBlZGVmCV9fdWludDE2X3QJZmV4Y2VwdF90OworCisvKiBFeGNlcHRpb24gZmxhZ3MgKi8KKyNkZWZpbmUJRkVfSU5WQUxJRAkweDAyCisjZGVmaW5lCUZFX0RJVkJZWkVSTwkweDA0CisjZGVmaW5lCUZFX09WRVJGTE9XCTB4MDgKKyNkZWZpbmUJRkVfVU5ERVJGTE9XCTB4MTAKKyNkZWZpbmUJRkVfSU5FWEFDVAkweDIwCisjZGVmaW5lCUZFX0lOVE9WRgkweDQwCS8qIG5vdCBtYXNrYWJsZSAqLworI2RlZmluZQlGRV9BTExfRVhDRVBUCShGRV9ESVZCWVpFUk8gfCBGRV9JTkVYQUNUIHwgRkVfSU5UT1ZGIHwgXAorCQkJIEZFX0lOVkFMSUQgfCBGRV9PVkVSRkxPVyB8IEZFX1VOREVSRkxPVykKKworLyogUm91bmRpbmcgbW9kZXMgKi8KKyNkZWZpbmUJRkVfVE9XQVJEWkVSTwkweDAwCisjZGVmaW5lCUZFX0RPV05XQVJECTB4MDEKKyNkZWZpbmUJRkVfVE9ORUFSRVNUCTB4MDIKKyNkZWZpbmUJRkVfVVBXQVJECTB4MDMKKyNkZWZpbmUJX1JPVU5EX01BU0sJKEZFX1RPTkVBUkVTVCB8IEZFX0RPV05XQVJEIHwgXAorCQkJIEZFX1VQV0FSRCB8IEZFX1RPV0FSRFpFUk8pCisjZGVmaW5lCV9ST1VORF9TSElGVAk1OAorCisjZGVmaW5lCV9GUFVTV19TSElGVAk1MQorCisjZGVmaW5lCV9fZXhjYigpCV9fYXNtIF9fdm9sYXRpbGUoImV4Y2IiKQorI2RlZmluZQlfX21mX2ZwY3IoX19jdykJX19hc20gX192b2xhdGlsZSgibWZfZnBjciAlMCIgOiAiPWYiICgqKF9fY3cpKSkKKyNkZWZpbmUJX19tdF9mcGNyKF9fY3cpCV9fYXNtIF9fdm9sYXRpbGUoIm10X2ZwY3IgJTAiIDogOiAiZiIgKF9fY3cpKQorCit1bmlvbiBfX2ZwY3IgeworCWRvdWJsZSBfX2Q7CisJZmVudl90IF9fYml0czsKK307CisKK19fQkVHSU5fREVDTFMKKworLyogRGVmYXVsdCBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCAqLworZXh0ZXJuIGNvbnN0IGZlbnZfdAlfX2ZlX2RmbF9lbnY7CisjZGVmaW5lCUZFX0RGTF9FTlYJKCZfX2ZlX2RmbF9lbnYpCisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlY2xlYXJleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwl1bmlvbiBfX2ZwY3IgX19yOworCisJX19leGNiKCk7CisJX19tZl9mcGNyKCZfX3IuX19kKTsKKwlfX3IuX19iaXRzICY9IH4oKGZlbnZfdClfX2V4Y2VwdHMgPDwgX0ZQVVNXX1NISUZUKTsKKwlfX210X2ZwY3IoX19yLl9fZCk7CisJX19leGNiKCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRleGNlcHRmbGFnKGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwl1bmlvbiBfX2ZwY3IgX19yOworCisJX19leGNiKCk7CisJX19tZl9mcGNyKCZfX3IuX19kKTsKKwlfX2V4Y2IoKTsKKwkqX19mbGFncCA9IChfX3IuX19iaXRzID4+IF9GUFVTV19TSElGVCkgJiBfX2V4Y2VwdHM7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRleGNlcHRmbGFnKGNvbnN0IGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwl1bmlvbiBfX2ZwY3IgX19yOworCWZlbnZfdCBfX3hmbGFnLCBfX3hleGNlcHRzOworCisJX194ZmxhZyA9IChmZW52X3QpKl9fZmxhZ3AgPDwgX0ZQVVNXX1NISUZUOworCV9feGV4Y2VwdHMgPSAoZmVudl90KV9fZXhjZXB0cyA8PCBfRlBVU1dfU0hJRlQ7CisJX19leGNiKCk7CisJX19tZl9mcGNyKCZfX3IuX19kKTsKKwlfX3IuX19iaXRzICY9IH5fX3hleGNlcHRzOworCV9fci5fX2JpdHMgfD0gX194ZmxhZyAmIF9feGV4Y2VwdHM7CisJX19tdF9mcGNyKF9fci5fX2QpOworCV9fZXhjYigpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlcmFpc2VleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKworCS8qCisJICogWFhYIEdlbmVyYXRpbmcgZXhjZXB0aW9ucyB0aGlzIHdheSBkb2VzIG5vdCBhY3R1YWxseSBpbnZva2UKKwkgKiBhIHVzZXJsYW5kIHRyYXAgaGFuZGxlciB3aGVuIGVuYWJsZWQsIGJ1dCBuZWl0aGVyIGRvCisJICogYXJpdGhtZXRpYyBvcGVyYXRpb25zIGFzIGZhciBhcyBJIGNhbiB0ZWxsLiAgUGVyaGFwcyB0aGVyZQorCSAqIGFyZSBtb3JlIGJ1Z3MgaW4gdGhlIGtlcm5lbCB0cmFwIGhhbmRsZXIuCisJICovCisJZmV4Y2VwdF90IF9fZXggPSBfX2V4Y2VwdHM7CisJZmVzZXRleGNlcHRmbGFnKCZfX2V4LCBfX2V4Y2VwdHMpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZldGVzdGV4Y2VwdChpbnQgX19leGNlcHRzKQoreworCXVuaW9uIF9fZnBjciBfX3I7CisKKwlfX2V4Y2IoKTsKKwlfX21mX2ZwY3IoJl9fci5fX2QpOworCV9fZXhjYigpOworCXJldHVybiAoKF9fci5fX2JpdHMgPj4gX0ZQVVNXX1NISUZUKSAmIF9fZXhjZXB0cyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0cm91bmQodm9pZCkKK3sKKwl1bmlvbiBfX2ZwY3IgX19yOworCisJLyoKKwkgKiBObyBleGNlcHRpb24gYmFycmllcnMgc2hvdWxkIGJlIHJlcXVpcmVkIGhlcmUgaWYgd2UgYXNzdW1lCisJICogdGhhdCBvbmx5IGZlc2V0cm91bmQoKSBjYW4gY2hhbmdlIHRoZSByb3VuZGluZyBtb2RlLgorCSAqLworCV9fbWZfZnBjcigmX19yLl9fZCk7CisJcmV0dXJuICgoaW50KShfX3IuX19iaXRzID4+IF9ST1VORF9TSElGVCkgJiBfUk9VTkRfTUFTSyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2Zlc2V0cm91bmQoaW50IF9fcm91bmQpCit7CisJdW5pb24gX19mcGNyIF9fcjsKKworCWlmIChfX3JvdW5kICYgfl9ST1VORF9NQVNLKQorCQlyZXR1cm4gKC0xKTsKKwlfX2V4Y2IoKTsKKwlfX21mX2ZwY3IoJl9fci5fX2QpOworCV9fci5fX2JpdHMgJj0gfigoZmVudl90KV9ST1VORF9NQVNLIDw8IF9ST1VORF9TSElGVCk7CisJX19yLl9fYml0cyB8PSAoZmVudl90KV9fcm91bmQgPDwgX1JPVU5EX1NISUZUOworCV9fbXRfZnBjcihfX3IuX19kKTsKKwlfX2V4Y2IoKTsKKwlyZXR1cm4gKDApOworfQorCitpbnQJZmVnZXRlbnYoZmVudl90ICpfX2VudnApOworaW50CWZlaG9sZGV4Y2VwdChmZW52X3QgKl9fZW52cCk7CitpbnQJZmVzZXRlbnYoY29uc3QgZmVudl90ICpfX2VudnApOworaW50CWZldXBkYXRlZW52KGNvbnN0IGZlbnZfdCAqX19lbnZwKTsKKworI2lmIF9fQlNEX1ZJU0lCTEUKKworaW50CWZlZW5hYmxlZXhjZXB0KGludCBfX21hc2spOworaW50CWZlZGlzYWJsZWV4Y2VwdChpbnQgX19tYXNrKTsKK2ludAlmZWdldGV4Y2VwdCh2b2lkKTsKKworI2VuZGlmIC8qIF9fQlNEX1ZJU0lCTEUgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qICFfRkVOVl9IXyAqLwpkaWZmIC0tZ2l0IGEvbGlibS9pbmNsdWRlL2FtZDY0L2ZlbnYuaCBiL2xpYm0vaW5jbHVkZS9hbWQ2NC9mZW52LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRmOTQzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaW5jbHVkZS9hbWQ2NC9mZW52LmgKQEAgLTAsMCArMSwyMDMgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2FtZDY0L2ZlbnYuaCx2IDEuNSAyMDA1LzAzLzE2IDIyOjM0OjE0IGRhcyBFeHAgJAorICovCisKKyNpZm5kZWYJX0ZFTlZfSF8KKyNkZWZpbmUJX0ZFTlZfSF8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPHN5cy9fdHlwZXMuaD4KKwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCB7CisJCV9fdWludDMyX3QJX19jb250cm9sOworCQlfX3VpbnQzMl90CV9fc3RhdHVzOworCQlfX3VpbnQzMl90CV9fdGFnOworCQljaGFyCQlfX290aGVyWzE2XTsKKwl9IF9feDg3OworCV9fdWludDMyX3QJCV9fbXhjc3I7Cit9IGZlbnZfdDsKKwordHlwZWRlZglfX3VpbnQxNl90CWZleGNlcHRfdDsKKworLyogRXhjZXB0aW9uIGZsYWdzICovCisjZGVmaW5lCUZFX0lOVkFMSUQJMHgwMQorI2RlZmluZQlGRV9ERU5PUk1BTAkweDAyCisjZGVmaW5lCUZFX0RJVkJZWkVSTwkweDA0CisjZGVmaW5lCUZFX09WRVJGTE9XCTB4MDgKKyNkZWZpbmUJRkVfVU5ERVJGTE9XCTB4MTAKKyNkZWZpbmUJRkVfSU5FWEFDVAkweDIwCisjZGVmaW5lCUZFX0FMTF9FWENFUFQJKEZFX0RJVkJZWkVSTyB8IEZFX0RFTk9STUFMIHwgRkVfSU5FWEFDVCB8IFwKKwkJCSBGRV9JTlZBTElEIHwgRkVfT1ZFUkZMT1cgfCBGRV9VTkRFUkZMT1cpCisKKy8qIFJvdW5kaW5nIG1vZGVzICovCisjZGVmaW5lCUZFX1RPTkVBUkVTVAkweDAwMDAKKyNkZWZpbmUJRkVfRE9XTldBUkQJMHgwNDAwCisjZGVmaW5lCUZFX1VQV0FSRAkweDA4MDAKKyNkZWZpbmUJRkVfVE9XQVJEWkVSTwkweDBjMDAKKyNkZWZpbmUJX1JPVU5EX01BU0sJKEZFX1RPTkVBUkVTVCB8IEZFX0RPV05XQVJEIHwgXAorCQkJIEZFX1VQV0FSRCB8IEZFX1RPV0FSRFpFUk8pCisKKy8qCisgKiBBcyBjb21wYXJlZCB0byB0aGUgeDg3IGNvbnRyb2wgd29yZCwgdGhlIFNTRSB1bml0J3MgY29udHJvbCB3b3JkCisgKiBoYXMgdGhlIHJvdW5kaW5nIGNvbnRyb2wgYml0cyBvZmZzZXQgYnkgMyBhbmQgdGhlIGV4Y2VwdGlvbiBtYXNrCisgKiBiaXRzIG9mZnNldCBieSA3LgorICovCisjZGVmaW5lCV9TU0VfUk9VTkRfU0hJRlQJMworI2RlZmluZQlfU1NFX0VNQVNLX1NISUZUCTcKKworX19CRUdJTl9ERUNMUworCisvKiBEZWZhdWx0IGZsb2F0aW5nLXBvaW50IGVudmlyb25tZW50ICovCitleHRlcm4gY29uc3QgZmVudl90CV9fZmVfZGZsX2VudjsKKyNkZWZpbmUJRkVfREZMX0VOVgkoJl9fZmVfZGZsX2VudikKKworI2RlZmluZQlfX2ZsZGN3KF9fY3cpCQlfX2FzbSBfX3ZvbGF0aWxlKCJmbGRjdyAlMCIgOiA6ICJtIiAoX19jdykpCisjZGVmaW5lCV9fZmxkZW52KF9fZW52KQkJX19hc20gX192b2xhdGlsZSgiZmxkZW52ICUwIiA6IDogIm0iIChfX2VudikpCisjZGVmaW5lCV9fZm5jbGV4KCkJCV9fYXNtIF9fdm9sYXRpbGUoImZuY2xleCIpCisjZGVmaW5lCV9fZm5zdGVudihfX2VudikJX19hc20gX192b2xhdGlsZSgiZm5zdGVudiAlMCIgOiAiPW0iICgqKF9fZW52KSkpCisjZGVmaW5lCV9fZm5zdGN3KF9fY3cpCQlfX2FzbSBfX3ZvbGF0aWxlKCJmbnN0Y3cgJTAiIDogIj1tIiAoKihfX2N3KSkpCisjZGVmaW5lCV9fZm5zdHN3KF9fc3cpCQlfX2FzbSBfX3ZvbGF0aWxlKCJmbnN0c3cgJTAiIDogIj1hbSIgKCooX19zdykpKQorI2RlZmluZQlfX2Z3YWl0KCkJCV9fYXNtIF9fdm9sYXRpbGUoImZ3YWl0IikKKyNkZWZpbmUJX19sZG14Y3NyKF9fY3NyKQlfX2FzbSBfX3ZvbGF0aWxlKCJsZG14Y3NyICUwIiA6IDogIm0iIChfX2NzcikpCisjZGVmaW5lCV9fc3RteGNzcihfX2NzcikJX19hc20gX192b2xhdGlsZSgic3RteGNzciAlMCIgOiAiPW0iICgqKF9fY3NyKSkpCisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlY2xlYXJleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwlmZW52X3QgX19lbnY7CisKKwlpZiAoX19leGNlcHRzID09IEZFX0FMTF9FWENFUFQpIHsKKwkJX19mbmNsZXgoKTsKKwl9IGVsc2UgeworCQlfX2Zuc3RlbnYoJl9fZW52Ll9feDg3KTsKKwkJX19lbnYuX194ODcuX19zdGF0dXMgJj0gfl9fZXhjZXB0czsKKwkJX19mbGRlbnYoX19lbnYuX194ODcpOworCX0KKwlfX3N0bXhjc3IoJl9fZW52Ll9fbXhjc3IpOworCV9fZW52Ll9fbXhjc3IgJj0gfl9fZXhjZXB0czsKKwlfX2xkbXhjc3IoX19lbnYuX19teGNzcik7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRleGNlcHRmbGFnKGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwlpbnQgX19teGNzciwgX19zdGF0dXM7CisKKwlfX3N0bXhjc3IoJl9fbXhjc3IpOworCV9fZm5zdHN3KCZfX3N0YXR1cyk7CisJKl9fZmxhZ3AgPSAoX19teGNzciB8IF9fc3RhdHVzKSAmIF9fZXhjZXB0czsKKwlyZXR1cm4gKDApOworfQorCitpbnQgZmVzZXRleGNlcHRmbGFnKGNvbnN0IGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cyk7CitpbnQgZmVyYWlzZWV4Y2VwdChpbnQgX19leGNlcHRzKTsKKworc3RhdGljIF9faW5saW5lIGludAorZmV0ZXN0ZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJaW50IF9fbXhjc3IsIF9fc3RhdHVzOworCisJX19zdG14Y3NyKCZfX214Y3NyKTsKKwlfX2Zuc3RzdygmX19zdGF0dXMpOworCXJldHVybiAoKF9fc3RhdHVzIHwgX19teGNzcikgJiBfX2V4Y2VwdHMpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldHJvdW5kKHZvaWQpCit7CisJaW50IF9fY29udHJvbDsKKworCS8qCisJICogV2UgYXNzdW1lIHRoYXQgdGhlIHg4NyBhbmQgdGhlIFNTRSB1bml0IGFncmVlIG9uIHRoZQorCSAqIHJvdW5kaW5nIG1vZGUuICBSZWFkaW5nIHRoZSBjb250cm9sIHdvcmQgb24gdGhlIHg4NyB0dXJucworCSAqIG91dCB0byBiZSBhYm91dCA1IHRpbWVzIGZhc3RlciB0aGFuIHJlYWRpbmcgaXQgb24gdGhlIFNTRQorCSAqIHVuaXQgb24gYW4gT3B0ZXJvbiAyNDQuCisJICovCisJX19mbnN0Y3coJl9fY29udHJvbCk7CisJcmV0dXJuIChfX2NvbnRyb2wgJiBfUk9VTkRfTUFTSyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2Zlc2V0cm91bmQoaW50IF9fcm91bmQpCit7CisJaW50IF9fbXhjc3IsIF9fY29udHJvbDsKKworCWlmIChfX3JvdW5kICYgfl9ST1VORF9NQVNLKQorCQlyZXR1cm4gKC0xKTsKKworCV9fZm5zdGN3KCZfX2NvbnRyb2wpOworCV9fY29udHJvbCAmPSB+X1JPVU5EX01BU0s7CisJX19jb250cm9sIHw9IF9fcm91bmQ7CisJX19mbGRjdyhfX2NvbnRyb2wpOworCisJX19zdG14Y3NyKCZfX214Y3NyKTsKKwlfX214Y3NyICY9IH4oX1JPVU5EX01BU0sgPDwgX1NTRV9ST1VORF9TSElGVCk7CisJX19teGNzciB8PSBfX3JvdW5kIDw8IF9TU0VfUk9VTkRfU0hJRlQ7CisJX19sZG14Y3NyKF9fbXhjc3IpOworCisJcmV0dXJuICgwKTsKK30KKworaW50IGZlZ2V0ZW52KGZlbnZfdCAqX19lbnZwKTsKK2ludCBmZWhvbGRleGNlcHQoZmVudl90ICpfX2VudnApOworCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldGVudihjb25zdCBmZW52X3QgKl9fZW52cCkKK3sKKworCV9fZmxkZW52KF9fZW52cC0+X194ODcpOworCV9fbGRteGNzcihfX2VudnAtPl9fbXhjc3IpOworCXJldHVybiAoMCk7Cit9CisKK2ludCBmZXVwZGF0ZWVudihjb25zdCBmZW52X3QgKl9fZW52cCk7CisKKyNpZiBfX0JTRF9WSVNJQkxFCisKK2ludCBmZWVuYWJsZWV4Y2VwdChpbnQgX19tYXNrKTsKK2ludCBmZWRpc2FibGVleGNlcHQoaW50IF9fbWFzayk7CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZXhjZXB0KHZvaWQpCit7CisJaW50IF9fY29udHJvbDsKKworCS8qCisJICogV2UgYXNzdW1lIHRoYXQgdGhlIG1hc2tzIGZvciB0aGUgeDg3IGFuZCB0aGUgU1NFIHVuaXQgYXJlCisJICogdGhlIHNhbWUuCisJICovCisJX19mbnN0Y3coJl9fY29udHJvbCk7CisJcmV0dXJuICh+X19jb250cm9sICYgRkVfQUxMX0VYQ0VQVCk7Cit9CisKKyNlbmRpZiAvKiBfX0JTRF9WSVNJQkxFICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiAhX0ZFTlZfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYm0vaW5jbHVkZS9hcm0vZmVudi5oIGIvbGlibS9pbmNsdWRlL2FybS9mZW52LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdhODg2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaW5jbHVkZS9hcm0vZmVudi5oCkBAIC0wLDAgKzEsMjE3IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9hcm0vZmVudi5oLHYgMS41IDIwMDUvMDMvMTYgMTk6MDM6NDUgZGFzIEV4cCAkCisgKi8KKworI2lmbmRlZglfRkVOVl9IXworI2RlZmluZQlfRkVOVl9IXworCisjaW5jbHVkZSA8c3lzL190eXBlcy5oPgorCit0eXBlZGVmCV9fdWludDMyX3QJZmVudl90OwordHlwZWRlZglfX3VpbnQzMl90CWZleGNlcHRfdDsKKworLyogRXhjZXB0aW9uIGZsYWdzICovCisjZGVmaW5lCUZFX0lOVkFMSUQJMHgwMDAxCisjZGVmaW5lCUZFX0RJVkJZWkVSTwkweDAwMDIKKyNkZWZpbmUJRkVfT1ZFUkZMT1cJMHgwMDA0CisjZGVmaW5lCUZFX1VOREVSRkxPVwkweDAwMDgKKyNkZWZpbmUJRkVfSU5FWEFDVAkweDAwMTAKKyNkZWZpbmUJRkVfQUxMX0VYQ0VQVAkoRkVfRElWQllaRVJPIHwgRkVfSU5FWEFDVCB8IFwKKwkJCSBGRV9JTlZBTElEIHwgRkVfT1ZFUkZMT1cgfCBGRV9VTkRFUkZMT1cpCisKKy8qIFJvdW5kaW5nIG1vZGVzICovCisjZGVmaW5lCUZFX1RPTkVBUkVTVAkweDAwMDAKKyNkZWZpbmUJRkVfVE9XQVJEWkVSTwkweDAwMDEKKyNkZWZpbmUJRkVfVVBXQVJECTB4MDAwMgorI2RlZmluZQlGRV9ET1dOV0FSRAkweDAwMDMKKyNkZWZpbmUJX1JPVU5EX01BU0sJKEZFX1RPTkVBUkVTVCB8IEZFX0RPV05XQVJEIHwgXAorCQkJIEZFX1VQV0FSRCB8IEZFX1RPV0FSRFpFUk8pCitfX0JFR0lOX0RFQ0xTCisKKy8qIERlZmF1bHQgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQgKi8KK2V4dGVybiBjb25zdCBmZW52X3QJX19mZV9kZmxfZW52OworI2RlZmluZQlGRV9ERkxfRU5WCSgmX19mZV9kZmxfZW52KQorCisvKiBXZSBuZWVkIHRvIGJlIGFibGUgdG8gbWFwIHN0YXR1cyBmbGFnIHBvc2l0aW9ucyB0byBtYXNrIGZsYWcgcG9zaXRpb25zICovCisjZGVmaW5lIF9GUFVTV19TSElGVAkxNgorI2RlZmluZQlfRU5BQkxFX01BU0sJKEZFX0FMTF9FWENFUFQgPDwgX0ZQVVNXX1NISUZUKQorCisjaWZkZWYJQVJNX0hBUkRfRkxPQVQKKyNkZWZpbmUJX19yZnMoX19mcHNyKQlfX2FzbSBfX3ZvbGF0aWxlKCJyZnMgJTAiIDogIj1yIiAoKihfX2Zwc3IpKSkKKyNkZWZpbmUJX193ZnMoX19mcHNyKQlfX2FzbSBfX3ZvbGF0aWxlKCJ3ZnMgJTAiIDogOiAiciIgKF9fZnBzcikpCisjZWxzZQorI2RlZmluZSBfX3JmcyhfX2Zwc3IpCisjZGVmaW5lIF9fd2ZzKF9fZnBzcikKKyNlbmRpZgorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWNsZWFyZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJZmV4Y2VwdF90IF9fZnBzcjsKKworCV9fcmZzKCZfX2Zwc3IpOworCV9fZnBzciAmPSB+X19leGNlcHRzOworCV9fd2ZzKF9fZnBzcik7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRleGNlcHRmbGFnKGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwlmZXhjZXB0X3QgX19mcHNyOworCisJX19yZnMoJl9fZnBzcik7CisJKl9fZmxhZ3AgPSBfX2Zwc3IgJiBfX2V4Y2VwdHM7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRleGNlcHRmbGFnKGNvbnN0IGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwlmZXhjZXB0X3QgX19mcHNyOworCisJX19yZnMoJl9fZnBzcik7CisJX19mcHNyICY9IH5fX2V4Y2VwdHM7CisJX19mcHNyIHw9ICpfX2ZsYWdwICYgX19leGNlcHRzOworCV9fd2ZzKF9fZnBzcik7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVyYWlzZWV4Y2VwdChpbnQgX19leGNlcHRzKQoreworCWZleGNlcHRfdCBfX2V4ID0gX19leGNlcHRzOworCisJZmVzZXRleGNlcHRmbGFnKCZfX2V4LCBfX2V4Y2VwdHMpOwkvKiBYWFggKi8KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXRlc3RleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwlmZXhjZXB0X3QgX19mcHNyOworCisJX19yZnMoJl9fZnBzcik7CisJcmV0dXJuIChfX2Zwc3IgJiBfX2V4Y2VwdHMpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldHJvdW5kKHZvaWQpCit7CisKKwkvKgorCSAqIEFwcGFyZW50bHksIHRoZSByb3VuZGluZyBtb2RlIGlzIHNwZWNpZmllZCBhcyBwYXJ0IG9mIHRoZQorCSAqIGluc3RydWN0aW9uIGZvcm1hdCBvbiBBUk0sIHNvIHRoZSBkeW5hbWljIHJvdW5kaW5nIG1vZGUgaXMKKwkgKiBpbmRldGVybWluYXRlLiAgU29tZSBGUFVzIG1heSBkaWZmZXIuCisJICovCisJcmV0dXJuICgtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2Zlc2V0cm91bmQoaW50IF9fcm91bmQpCit7CisKKwlyZXR1cm4gKC0xKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRlbnYoZmVudl90ICpfX2VudnApCit7CisKKwlfX3JmcyhfX2VudnApOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlaG9sZGV4Y2VwdChmZW52X3QgKl9fZW52cCkKK3sKKwlmZW52X3QgX19lbnY7CisKKwlfX3JmcygmX19lbnYpOworCSpfX2VudnAgPSBfX2VudjsKKwlfX2VudiAmPSB+KEZFX0FMTF9FWENFUFQgfCBfRU5BQkxFX01BU0spOworCV9fd2ZzKF9fZW52KTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldGVudihjb25zdCBmZW52X3QgKl9fZW52cCkKK3sKKworCV9fd2ZzKCpfX2VudnApOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZldXBkYXRlZW52KGNvbnN0IGZlbnZfdCAqX19lbnZwKQoreworCWZleGNlcHRfdCBfX2Zwc3I7CisKKwlfX3JmcygmX19mcHNyKTsKKwlfX3dmcygqX19lbnZwKTsKKwlmZXJhaXNlZXhjZXB0KF9fZnBzciAmIEZFX0FMTF9FWENFUFQpOworCXJldHVybiAoMCk7Cit9CisKKyNpZiBfX0JTRF9WSVNJQkxFCisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZW5hYmxlZXhjZXB0KGludCBfX21hc2spCit7CisJZmVudl90IF9fb2xkX2Zwc3IsIF9fbmV3X2Zwc3I7CisKKwlfX3JmcygmX19vbGRfZnBzcik7CisJX19uZXdfZnBzciA9IF9fb2xkX2Zwc3IgfCAoX19tYXNrICYgRkVfQUxMX0VYQ0VQVCkgPDwgX0ZQVVNXX1NISUZUOworCV9fd2ZzKF9fbmV3X2Zwc3IpOworCXJldHVybiAoKF9fb2xkX2Zwc3IgPj4gX0ZQVVNXX1NISUZUKSAmIEZFX0FMTF9FWENFUFQpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWRpc2FibGVleGNlcHQoaW50IF9fbWFzaykKK3sKKwlmZW52X3QgX19vbGRfZnBzciwgX19uZXdfZnBzcjsKKworCV9fcmZzKCZfX29sZF9mcHNyKTsKKwlfX25ld19mcHNyID0gX19vbGRfZnBzciAmIH4oKF9fbWFzayAmIEZFX0FMTF9FWENFUFQpIDw8IF9GUFVTV19TSElGVCk7CisJX193ZnMoX19uZXdfZnBzcik7CisJcmV0dXJuICgoX19vbGRfZnBzciA+PiBfRlBVU1dfU0hJRlQpICYgRkVfQUxMX0VYQ0VQVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZXhjZXB0KHZvaWQpCit7CisJZmVudl90IF9fZnBzcjsKKworCV9fcmZzKCZfX2Zwc3IpOworCXJldHVybiAoKF9fZnBzciAmIF9FTkFCTEVfTUFTSykgPj4gX0ZQVVNXX1NISUZUKTsKK30KKworI2VuZGlmIC8qIF9fQlNEX1ZJU0lCTEUgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qICFfRkVOVl9IXyAqLwpkaWZmIC0tZ2l0IGEvbGlibS9pbmNsdWRlL2kzODcvZmVudi5oIGIvbGlibS9pbmNsdWRlL2kzODcvZmVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMjQzNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2luY2x1ZGUvaTM4Ny9mZW52LmgKQEAgLTAsMCArMSwyNDAgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvZmVudi5oLHYgMS40IDIwMDUvMDMvMTcgMjI6MjE6NDYgZGFzIEV4cCAkCisgKi8KKworI2lmbmRlZglfRkVOVl9IXworI2RlZmluZQlfRkVOVl9IXworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL190eXBlcy5oPgorCisvKiAgICAgICAgICAgICAgICAgICAKKyAqIFRvIHByZXNlcnZlIGJpbmFyeSBjb21wYXRpYmlsaXR5IHdpdGggRnJlZUJTRCA1LjMsIHdlIHBhY2sgdGhlCisgKiBteGNzciBpbnRvIHNvbWUgcmVzZXJ2ZWQgZmllbGRzLCByYXRoZXIgdGhhbiBjaGFuZ2luZyBzaXplb2YoZmVudl90KS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCV9fdWludDE2X3QJX19jb250cm9sOworCV9fdWludDE2X3QgICAgICBfX214Y3NyX2hpOworCV9fdWludDE2X3QJX19zdGF0dXM7CisJX191aW50MTZfdCAgICAgIF9fbXhjc3JfbG87CisJX191aW50MzJfdAlfX3RhZzsKKwljaGFyCQlfX290aGVyWzE2XTsKK30gZmVudl90OworCisjZGVmaW5lCV9fZ2V0X214Y3NyKGVudikJKCgoZW52KS5fX214Y3NyX2hpIDw8IDE2KSB8CVwKKwkJCQkgKChlbnYpLl9fbXhjc3JfbG8pKQorI2RlZmluZQlfX3NldF9teGNzcihlbnYsIHgpCWRvIHsJCQkJXAorCShlbnYpLl9fbXhjc3JfaGkgPSAoX191aW50MzJfdCkoeCkgPj4gMTY7CQlcCisJKGVudikuX19teGNzcl9sbyA9IChfX3VpbnQxNl90KSh4KTsJCQlcCit9IHdoaWxlICgwKQorCit0eXBlZGVmCV9fdWludDE2X3QJZmV4Y2VwdF90OworCisvKiBFeGNlcHRpb24gZmxhZ3MgKi8KKyNkZWZpbmUJRkVfSU5WQUxJRAkweDAxCisjZGVmaW5lCUZFX0RFTk9STUFMCTB4MDIKKyNkZWZpbmUJRkVfRElWQllaRVJPCTB4MDQKKyNkZWZpbmUJRkVfT1ZFUkZMT1cJMHgwOAorI2RlZmluZQlGRV9VTkRFUkZMT1cJMHgxMAorI2RlZmluZQlGRV9JTkVYQUNUCTB4MjAKKyNkZWZpbmUJRkVfQUxMX0VYQ0VQVAkoRkVfRElWQllaRVJPIHwgRkVfREVOT1JNQUwgfCBGRV9JTkVYQUNUIHwgXAorCQkJIEZFX0lOVkFMSUQgfCBGRV9PVkVSRkxPVyB8IEZFX1VOREVSRkxPVykKKworLyogUm91bmRpbmcgbW9kZXMgKi8KKyNkZWZpbmUJRkVfVE9ORUFSRVNUCTB4MDAwMAorI2RlZmluZQlGRV9ET1dOV0FSRAkweDA0MDAKKyNkZWZpbmUJRkVfVVBXQVJECTB4MDgwMAorI2RlZmluZQlGRV9UT1dBUkRaRVJPCTB4MGMwMAorI2RlZmluZQlfUk9VTkRfTUFTSwkoRkVfVE9ORUFSRVNUIHwgRkVfRE9XTldBUkQgfCBcCisJCQkgRkVfVVBXQVJEIHwgRkVfVE9XQVJEWkVSTykKKworLyoKKyAqIEFzIGNvbXBhcmVkIHRvIHRoZSB4ODcgY29udHJvbCB3b3JkLCB0aGUgU1NFIHVuaXQncyBjb250cm9sIHdvcmQKKyAqIGhhcyB0aGUgcm91bmRpbmcgY29udHJvbCBiaXRzIG9mZnNldCBieSAzIGFuZCB0aGUgZXhjZXB0aW9uIG1hc2sKKyAqIGJpdHMgb2Zmc2V0IGJ5IDcuCisgKi8KKyNkZWZpbmUJX1NTRV9ST1VORF9TSElGVAkzCisjZGVmaW5lCV9TU0VfRU1BU0tfU0hJRlQJNworCisvKiBBZnRlciB0ZXN0aW5nIGZvciBTU0Ugc3VwcG9ydCBvbmNlLCB3ZSBjYWNoZSB0aGUgcmVzdWx0IGluIF9faGFzX3NzZS4gKi8KK2VudW0gX19zc2Vfc3VwcG9ydCB7IF9fU1NFX1lFUywgX19TU0VfTk8sIF9fU1NFX1VOSyB9OworZXh0ZXJuIGVudW0gX19zc2Vfc3VwcG9ydCBfX2hhc19zc2U7CitpbnQgX190ZXN0X3NzZSh2b2lkKTsKKyNpZmRlZiBfX1NTRV9fCisjZGVmaW5lCV9fSEFTX1NTRSgpCTEKKyNlbHNlCisjZGVmaW5lCV9fSEFTX1NTRSgpCShfX2hhc19zc2UgPT0gX19TU0VfWUVTIHx8CQkJXAorCQkJIChfX2hhc19zc2UgPT0gX19TU0VfVU5LICYmIF9fdGVzdF9zc2UoKSkpCisjZW5kaWYKKworX19CRUdJTl9ERUNMUworCisvKiBEZWZhdWx0IGZsb2F0aW5nLXBvaW50IGVudmlyb25tZW50ICovCitleHRlcm4gY29uc3QgZmVudl90CV9fZmVfZGZsX2VudjsKKyNkZWZpbmUJRkVfREZMX0VOVgkoJl9fZmVfZGZsX2VudikKKworI2RlZmluZQlfX2ZsZGN3KF9fY3cpCQlfX2FzbSBfX3ZvbGF0aWxlKCJmbGRjdyAlMCIgOiA6ICJtIiAoX19jdykpCisjZGVmaW5lCV9fZmxkZW52KF9fZW52KQkJX19hc20gX192b2xhdGlsZSgiZmxkZW52ICUwIiA6IDogIm0iIChfX2VudikpCisjZGVmaW5lCV9fZm5jbGV4KCkJCV9fYXNtIF9fdm9sYXRpbGUoImZuY2xleCIpCisjZGVmaW5lCV9fZm5zdGVudihfX2VudikJX19hc20gX192b2xhdGlsZSgiZm5zdGVudiAlMCIgOiAiPW0iICgqKF9fZW52KSkpCisjZGVmaW5lCV9fZm5zdGN3KF9fY3cpCQlfX2FzbSBfX3ZvbGF0aWxlKCJmbnN0Y3cgJTAiIDogIj1tIiAoKihfX2N3KSkpCisjZGVmaW5lCV9fZm5zdHN3KF9fc3cpCQlfX2FzbSBfX3ZvbGF0aWxlKCJmbnN0c3cgJTAiIDogIj1hbSIgKCooX19zdykpKQorI2RlZmluZQlfX2Z3YWl0KCkJCV9fYXNtIF9fdm9sYXRpbGUoImZ3YWl0IikKKyNkZWZpbmUJX19sZG14Y3NyKF9fY3NyKQlfX2FzbSBfX3ZvbGF0aWxlKCJsZG14Y3NyICUwIiA6IDogIm0iIChfX2NzcikpCisjZGVmaW5lCV9fc3RteGNzcihfX2NzcikJX19hc20gX192b2xhdGlsZSgic3RteGNzciAlMCIgOiAiPW0iICgqKF9fY3NyKSkpCisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlY2xlYXJleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwlmZW52X3QgX19lbnY7CisJaW50IF9fbXhjc3I7CisKKwlpZiAoX19leGNlcHRzID09IEZFX0FMTF9FWENFUFQpIHsKKwkJX19mbmNsZXgoKTsKKwl9IGVsc2UgeworCQlfX2Zuc3RlbnYoJl9fZW52KTsKKwkJX19lbnYuX19zdGF0dXMgJj0gfl9fZXhjZXB0czsKKwkJX19mbGRlbnYoX19lbnYpOworCX0KKwlpZiAoX19IQVNfU1NFKCkpIHsKKwkJX19zdG14Y3NyKCZfX214Y3NyKTsKKwkJX19teGNzciAmPSB+X19leGNlcHRzOworCQlfX2xkbXhjc3IoX19teGNzcik7CisJfQorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZXhjZXB0ZmxhZyhmZXhjZXB0X3QgKl9fZmxhZ3AsIGludCBfX2V4Y2VwdHMpCit7CisJaW50IF9fbXhjc3IsIF9fc3RhdHVzOworCisJX19mbnN0c3coJl9fc3RhdHVzKTsKKwlpZiAoX19IQVNfU1NFKCkpCisJCV9fc3RteGNzcigmX19teGNzcik7CisJZWxzZQorCQlfX214Y3NyID0gMDsKKwkqX19mbGFncCA9IChfX214Y3NyIHwgX19zdGF0dXMpICYgX19leGNlcHRzOworCXJldHVybiAoMCk7Cit9CisKK2ludCBmZXNldGV4Y2VwdGZsYWcoY29uc3QgZmV4Y2VwdF90ICpfX2ZsYWdwLCBpbnQgX19leGNlcHRzKTsKK2ludCBmZXJhaXNlZXhjZXB0KGludCBfX2V4Y2VwdHMpOworCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXRlc3RleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwlpbnQgX19teGNzciwgX19zdGF0dXM7CisKKwlfX2Zuc3RzdygmX19zdGF0dXMpOworCWlmIChfX0hBU19TU0UoKSkKKwkJX19zdG14Y3NyKCZfX214Y3NyKTsKKwllbHNlCisJCV9fbXhjc3IgPSAwOworCXJldHVybiAoKF9fc3RhdHVzIHwgX19teGNzcikgJiBfX2V4Y2VwdHMpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldHJvdW5kKHZvaWQpCit7CisJaW50IF9fY29udHJvbDsKKworCS8qCisJICogV2UgYXNzdW1lIHRoYXQgdGhlIHg4NyBhbmQgdGhlIFNTRSB1bml0IGFncmVlIG9uIHRoZQorCSAqIHJvdW5kaW5nIG1vZGUuICBSZWFkaW5nIHRoZSBjb250cm9sIHdvcmQgb24gdGhlIHg4NyB0dXJucworCSAqIG91dCB0byBiZSBhYm91dCA1IHRpbWVzIGZhc3RlciB0aGFuIHJlYWRpbmcgaXQgb24gdGhlIFNTRQorCSAqIHVuaXQgb24gYW4gT3B0ZXJvbiAyNDQuCisJICovCisJX19mbnN0Y3coJl9fY29udHJvbCk7CisJcmV0dXJuIChfX2NvbnRyb2wgJiBfUk9VTkRfTUFTSyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2Zlc2V0cm91bmQoaW50IF9fcm91bmQpCit7CisJaW50IF9fbXhjc3IsIF9fY29udHJvbDsKKworCWlmIChfX3JvdW5kICYgfl9ST1VORF9NQVNLKQorCQlyZXR1cm4gKC0xKTsKKworCV9fZm5zdGN3KCZfX2NvbnRyb2wpOworCV9fY29udHJvbCAmPSB+X1JPVU5EX01BU0s7CisJX19jb250cm9sIHw9IF9fcm91bmQ7CisJX19mbGRjdyhfX2NvbnRyb2wpOworCisJaWYgKF9fSEFTX1NTRSgpKSB7CisJCV9fc3RteGNzcigmX19teGNzcik7CisJCV9fbXhjc3IgJj0gfihfUk9VTkRfTUFTSyA8PCBfU1NFX1JPVU5EX1NISUZUKTsKKwkJX19teGNzciB8PSBfX3JvdW5kIDw8IF9TU0VfUk9VTkRfU0hJRlQ7CisJCV9fbGRteGNzcihfX214Y3NyKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCitpbnQgZmVnZXRlbnYoZmVudl90ICpfX2VudnApOworaW50IGZlaG9sZGV4Y2VwdChmZW52X3QgKl9fZW52cCk7CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2Zlc2V0ZW52KGNvbnN0IGZlbnZfdCAqX19lbnZwKQoreworCWZlbnZfdCBfX2VudiA9ICpfX2VudnA7CisJaW50IF9fbXhjc3I7CisKKwlfX214Y3NyID0gX19nZXRfbXhjc3IoX19lbnYpOworCV9fc2V0X214Y3NyKF9fZW52LCAweGZmZmZmZmZmKTsKKwlfX2ZsZGVudihfX2Vudik7CisJaWYgKF9fSEFTX1NTRSgpKQorCQlfX2xkbXhjc3IoX19teGNzcik7CisJcmV0dXJuICgwKTsKK30KKworaW50IGZldXBkYXRlZW52KGNvbnN0IGZlbnZfdCAqX19lbnZwKTsKKworI2lmIF9fQlNEX1ZJU0lCTEUKKworaW50IGZlZW5hYmxlZXhjZXB0KGludCBfX21hc2spOworaW50IGZlZGlzYWJsZWV4Y2VwdChpbnQgX19tYXNrKTsKKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRleGNlcHQodm9pZCkKK3sKKwlpbnQgX19jb250cm9sOworCisJLyoKKwkgKiBXZSBhc3N1bWUgdGhhdCB0aGUgbWFza3MgZm9yIHRoZSB4ODcgYW5kIHRoZSBTU0UgdW5pdCBhcmUKKwkgKiB0aGUgc2FtZS4KKwkgKi8KKwlfX2Zuc3RjdygmX19jb250cm9sKTsKKwlyZXR1cm4gKH5fX2NvbnRyb2wgJiBGRV9BTExfRVhDRVBUKTsKK30KKworI2VuZGlmIC8qIF9fQlNEX1ZJU0lCTEUgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qICFfRkVOVl9IXyAqLwpkaWZmIC0tZ2l0IGEvbGlibS9pbmNsdWRlL2lhNjQvZmVudi5oIGIvbGlibS9pbmNsdWRlL2lhNjQvZmVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNmI2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2luY2x1ZGUvaWE2NC9mZW52LmgKQEAgLTAsMCArMSwyNDIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2lhNjQvZmVudi5oLHYgMS40IDIwMDUvMDMvMTYgMTk6MDM6NDUgZGFzIEV4cCAkCisgKi8KKworI2lmbmRlZglfRkVOVl9IXworI2RlZmluZQlfRkVOVl9IXworCisjaW5jbHVkZSA8c3lzL190eXBlcy5oPgorCit0eXBlZGVmCV9fdWludDY0X3QJZmVudl90OwordHlwZWRlZglfX3VpbnQxNl90CWZleGNlcHRfdDsKKworLyogRXhjZXB0aW9uIGZsYWdzICovCisjZGVmaW5lCUZFX0lOVkFMSUQJMHgwMQorI2RlZmluZQlGRV9ERU5PUk1BTAkweDAyCisjZGVmaW5lCUZFX0RJVkJZWkVSTwkweDA0CisjZGVmaW5lCUZFX09WRVJGTE9XCTB4MDgKKyNkZWZpbmUJRkVfVU5ERVJGTE9XCTB4MTAKKyNkZWZpbmUJRkVfSU5FWEFDVAkweDIwCisjZGVmaW5lCUZFX0FMTF9FWENFUFQJKEZFX0RJVkJZWkVSTyB8IEZFX0RFTk9STUFMIHwgRkVfSU5FWEFDVCB8IFwKKwkJCSBGRV9JTlZBTElEIHwgRkVfT1ZFUkZMT1cgfCBGRV9VTkRFUkZMT1cpCisKKy8qIFJvdW5kaW5nIG1vZGVzICovCisjZGVmaW5lCUZFX1RPTkVBUkVTVAkweDAwMDAKKyNkZWZpbmUJRkVfRE9XTldBUkQJMHgwNDAwCisjZGVmaW5lCUZFX1VQV0FSRAkweDA4MDAKKyNkZWZpbmUJRkVfVE9XQVJEWkVSTwkweDBjMDAKKyNkZWZpbmUJX1JPVU5EX01BU0sJKEZFX1RPTkVBUkVTVCB8IEZFX0RPV05XQVJEIHwgXAorCQkJIEZFX1VQV0FSRCB8IEZFX1RPV0FSRFpFUk8pCisKK19fQkVHSU5fREVDTFMKKworLyogRGVmYXVsdCBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCAqLworZXh0ZXJuIGNvbnN0IGZlbnZfdAlfX2ZlX2RmbF9lbnY7CisjZGVmaW5lCUZFX0RGTF9FTlYJKCZfX2ZlX2RmbF9lbnYpCisKKyNkZWZpbmUJX0ZQVVNXX1NISUZUCTEzCisKKyNkZWZpbmUJX19zdGZwc3IoX19yKQlfX2FzbSBfX3ZvbGF0aWxlKCJtb3YgJTA9YXIuZnBzciIgOiAiPXIiICgqKF9fcikpKQorI2RlZmluZQlfX2xkZnBzcihfX3IpCV9fYXNtIF9fdm9sYXRpbGUoIm1vdiBhci5mcHNyPSUwOzsiIDogOiAiciIgKF9fcikpCisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlY2xlYXJleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwlmZW52X3QgX19mcHNyOworCisJX19zdGZwc3IoJl9fZnBzcik7CisJX19mcHNyICY9IH4oKGZlbnZfdClfX2V4Y2VwdHMgPDwgX0ZQVVNXX1NISUZUKTsKKwlfX2xkZnBzcihfX2Zwc3IpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZXhjZXB0ZmxhZyhmZXhjZXB0X3QgKl9fZmxhZ3AsIGludCBfX2V4Y2VwdHMpCit7CisJZmVudl90IF9fZnBzcjsKKworCV9fc3RmcHNyKCZfX2Zwc3IpOworCSpfX2ZsYWdwID0gKGZleGNlcHRfdCkoX19mcHNyID4+IF9GUFVTV19TSElGVCkgJiBfX2V4Y2VwdHM7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRleGNlcHRmbGFnKGNvbnN0IGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwlmZW52X3QgX19mcHNyOworCisJX19zdGZwc3IoJl9fZnBzcik7CisJX19mcHNyICY9IH4oKGZlbnZfdClfX2V4Y2VwdHMgPDwgX0ZQVVNXX1NISUZUKTsKKwlfX2Zwc3IgfD0gKGZlbnZfdCkoX19leGNlcHRzICYgKl9fZmxhZ3ApIDw8IF9GUFVTV19TSElGVDsKKwlfX2xkZnBzcihfX2Zwc3IpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBJdCBpcyB3b3J0aHdoaWxlIHRvIHVzZSB0aGUgaW5saW5lIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiBpZmYgaXQKKyAqIGlzIGNhbGxlZCB3aXRoIGFyZ3VtZW50cyB0aGF0IGFyZSBjb21waWxlLXRpbWUgY29uc3RhbnRzIChkdWUgdG8KKyAqIGRlYWQgY29kZSBlbGltaW5hdGlvbikuICBVbmZvcnR1bmF0ZWx5LCBnY2MgaXNuJ3Qgc21hcnQgZW5vdWdoIHRvCisgKiBmaWd1cmUgdGhpcyBvdXQgYXV0b21hdGljYWxseSwgYW5kIHRoZXJlJ3Mgbm8gd2F5IHRvIHRlbGwgaXQuCisgKiBXZSBhc3N1bWUgdGhhdCBjb25zdGFudCBhcmd1bWVudHMgd2lsbCBiZSB0aGUgY29tbW9uIGNhc2UuCisgKi8KK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlcmFpc2VleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwl2b2xhdGlsZSBkb3VibGUgZDsKKworCS8qCisJICogV2l0aCBhIGNvbXBpbGVyIHRoYXQgc3VwcG9ydHMgdGhlIEZFTlZfQUNDRVNTIHByYWdtYQorCSAqIHByb3Blcmx5LCBzaW1wbGUgZXhwcmVzc2lvbnMgbGlrZSAnMC4wIC8gMC4wJyBzaG91bGQKKwkgKiBiZSBzdWZmaWNpZW50IHRvIGdlbmVyYXRlIHRyYXBzLiAgVW5mb3J0dW5hdGVseSwgd2UKKwkgKiBuZWVkIHRvIGJyaW5nIGEgdm9sYXRpbGUgdmFyaWFibGUgaW50byB0aGUgZXF1YXRpb24KKwkgKiB0byBwcmV2ZW50IGluY29ycmVjdCBvcHRpbWl6YXRpb25zLgorCSAqLworCWlmIChfX2V4Y2VwdHMgJiBGRV9JTlZBTElEKSB7CisJCWQgPSAwLjA7CisJCWQgPSAwLjAgLyBkOworCX0KKwlpZiAoX19leGNlcHRzICYgRkVfRElWQllaRVJPKSB7CisJCWQgPSAwLjA7CisJCWQgPSAxLjAgLyBkOworCX0KKwlpZiAoX19leGNlcHRzICYgRkVfT1ZFUkZMT1cpIHsKKwkJZCA9IDB4MS5mZnAxMDIzOworCQlkICo9IDIuMDsKKwl9CisJaWYgKF9fZXhjZXB0cyAmIEZFX1VOREVSRkxPVykgeworCQlkID0gMHgxcC0xMDIyOworCQlkIC89IDB4MXAxMDIzOworCX0KKwlpZiAoX19leGNlcHRzICYgRkVfSU5FWEFDVCkgeworCQlkID0gMHgxcC0xMDIyOworCQlkICs9IDEuMDsKKwl9CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmV0ZXN0ZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJZmVudl90IF9fZnBzcjsKKworCV9fc3RmcHNyKCZfX2Zwc3IpOworCXJldHVybiAoKF9fZnBzciA+PiBfRlBVU1dfU0hJRlQpICYgX19leGNlcHRzKTsKK30KKworCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldHJvdW5kKHZvaWQpCit7CisJZmVudl90IF9fZnBzcjsKKworCV9fc3RmcHNyKCZfX2Zwc3IpOworCXJldHVybiAoX19mcHNyICYgX1JPVU5EX01BU0spOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldHJvdW5kKGludCBfX3JvdW5kKQoreworCWZlbnZfdCBfX2Zwc3I7CisKKwlpZiAoX19yb3VuZCAmIH5fUk9VTkRfTUFTSykKKwkJcmV0dXJuICgtMSk7CisJX19zdGZwc3IoJl9fZnBzcik7CisJX19mcHNyICY9IH5fUk9VTkRfTUFTSzsKKwlfX2Zwc3IgfD0gX19yb3VuZDsKKwlfX2xkZnBzcihfX2Zwc3IpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZW52KGZlbnZfdCAqX19lbnZwKQoreworCisJX19zdGZwc3IoX19lbnZwKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWhvbGRleGNlcHQoZmVudl90ICpfX2VudnApCit7CisJZmVudl90IF9fZnBzcjsKKworCV9fc3RmcHNyKCZfX2Zwc3IpOworCSpfX2VudnAgPSBfX2Zwc3I7CisJX19mcHNyICY9IH4oKGZlbnZfdClGRV9BTExfRVhDRVBUIDw8IF9GUFVTV19TSElGVCk7CisJX19mcHNyIHw9IEZFX0FMTF9FWENFUFQ7CisJX19sZGZwc3IoX19mcHNyKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldGVudihjb25zdCBmZW52X3QgKl9fZW52cCkKK3sKKworCV9fbGRmcHNyKCpfX2VudnApOworCXJldHVybiAoMCk7Cit9CisKK2ludCBmZXVwZGF0ZWVudihjb25zdCBmZW52X3QgKl9fZW52cCk7CisKKyNpZiBfX0JTRF9WSVNJQkxFCisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZW5hYmxlZXhjZXB0KGludCBfX21hc2spCit7CisJZmVudl90IF9fbmV3ZnBzciwgX19vbGRmcHNyOworCisJX19zdGZwc3IoJl9fb2xkZnBzcik7CisJX19uZXdmcHNyID0gX19vbGRmcHNyICYgfihfX21hc2sgJiBGRV9BTExfRVhDRVBUKTsKKwlfX2xkZnBzcihfX25ld2Zwc3IpOworCXJldHVybiAofl9fb2xkZnBzciAmIEZFX0FMTF9FWENFUFQpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWRpc2FibGVleGNlcHQoaW50IF9fbWFzaykKK3sKKwlmZW52X3QgX19uZXdmcHNyLCBfX29sZGZwc3I7CisKKwlfX3N0ZnBzcigmX19vbGRmcHNyKTsKKwlfX25ld2Zwc3IgPSBfX29sZGZwc3IgfCAoX19tYXNrICYgRkVfQUxMX0VYQ0VQVCk7CisJX19sZGZwc3IoX19uZXdmcHNyKTsKKwlyZXR1cm4gKH5fX29sZGZwc3IgJiBGRV9BTExfRVhDRVBUKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRleGNlcHQodm9pZCkKK3sKKwlmZW52X3QgX19mcHNyOworCisJX19zdGZwc3IoJl9fZnBzcik7CisJcmV0dXJuICh+X19mcHNyICYgRkVfQUxMX0VYQ0VQVCk7Cit9CisKKyNlbmRpZiAvKiBfX0JTRF9WSVNJQkxFICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiAhX0ZFTlZfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYm0vaW5jbHVkZS9tYXRoLmggYi9saWJtL2luY2x1ZGUvbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNmE5ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2luY2x1ZGUvbWF0aC5oCkBAIC0wLDAgKzEsNDg2IEBACisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qCisgKiBmcm9tOiBAKCMpZmRsaWJtLmggNS4xIDkzLzA5LzI0CisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9tYXRoLmgsdiAxLjYxIDIwMDUvMDQvMTYgMjE6MTI6NDcgZGFzIEV4cCAkCisgKi8KKworI2lmbmRlZiBfTUFUSF9IXworI2RlZmluZQlfTUFUSF9IXworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNkZWZpbmUgX19wdXJlMgorCisvKgorICogQU5TSS9QT1NJWAorICovCitleHRlcm4gY29uc3QgdW5pb24gX19pbmZpbml0eV91biB7CisJdW5zaWduZWQgY2hhcglfX3VjWzhdOworCWRvdWJsZQkJX191ZDsKK30gX19pbmZpbml0eTsKKworZXh0ZXJuIGNvbnN0IHVuaW9uIF9fbmFuX3VuIHsKKwl1bnNpZ25lZCBjaGFyCV9fdWNbc2l6ZW9mKGZsb2F0KV07CisJZmxvYXQJCV9fdWY7Cit9IF9fbmFuOworCisvKiAjaWYgX19HTlVDX1BSRVJFUV9fKDMsIDMpIHx8IChkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpICYmIF9fSU5URUxfQ09NUElMRVIgPj0gODAwKSAqLworI2lmIDEKKyNkZWZpbmUJX19NQVRIX0JVSUxUSU5fQ09OU1RBTlRTCisjZW5kaWYKKworLyogI2lmIF9fR05VQ19QUkVSRVFfXygzLCAwKSAmJiAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSAqLworI2lmIDEKKyNkZWZpbmUJX19NQVRIX0JVSUxUSU5fUkVMT1BTCisjZW5kaWYKKworLyogI2lmZGVmIF9fTUFUSF9CVUlMVElOX0NPTlNUQU5UUyAqLworI2lmIDEKKyNkZWZpbmUJSFVHRV9WQUwJX19idWlsdGluX2h1Z2VfdmFsKCkKKyNlbHNlCisjZGVmaW5lCUhVR0VfVkFMCShfX2luZmluaXR5Ll9fdWQpCisjZW5kaWYKKworLyogI2lmIF9fSVNPX0NfVklTSUJMRSA+PSAxOTk5ICovCisjaWYgMAorI2RlZmluZQlGUF9JTE9HQjAJKC1fX0lOVF9NQVgpCisjZGVmaW5lCUZQX0lMT0dCTkFOCV9fSU5UX01BWAorI2Vsc2UKKyNkZWZpbmUJRlBfSUxPR0IwCSgtSU5UX01BWCkKKyNkZWZpbmUJRlBfSUxPR0JOQU4JSU5UX01BWAorI2VuZGlmCisKKyNpZmRlZiBfX01BVEhfQlVJTFRJTl9DT05TVEFOVFMKKyNkZWZpbmUJSFVHRV9WQUxGCV9fYnVpbHRpbl9odWdlX3ZhbGYoKQorI2RlZmluZQlIVUdFX1ZBTEwJX19idWlsdGluX2h1Z2VfdmFsbCgpCisjZGVmaW5lCUlORklOSVRZCV9fYnVpbHRpbl9pbmYoKQorI2RlZmluZQlOQU4JCV9fYnVpbHRpbl9uYW4oIiIpCisjZWxzZQorI2RlZmluZQlIVUdFX1ZBTEYJKGZsb2F0KUhVR0VfVkFMCisjZGVmaW5lCUhVR0VfVkFMTAkobG9uZyBkb3VibGUpSFVHRV9WQUwKKyNkZWZpbmUJSU5GSU5JVFkJSFVHRV9WQUxGCisjZGVmaW5lCU5BTgkJKF9fbmFuLl9fdWYpCisjZW5kaWYgLyogX19NQVRIX0JVSUxUSU5fQ09OU1RBTlRTICovCisKKyNkZWZpbmUJTUFUSF9FUlJOTwkxCisjZGVmaW5lCU1BVEhfRVJSRVhDRVBUCTIKKyNkZWZpbmUJbWF0aF9lcnJoYW5kbGluZwlNQVRIX0VSUkVYQ0VQVAorCisvKiBYWFggV2UgbmVlZCBhIDxtYWNoaW5lL21hdGguaD4uICovCisjaWYgZGVmaW5lZChfX2lhNjRfXykgfHwgZGVmaW5lZChfX3NwYXJjNjRfXykKKyNkZWZpbmUJRlBfRkFTVF9GTUEKKyNlbmRpZgorI2lmZGVmIF9faWE2NF9fCisjZGVmaW5lCUZQX0ZBU1RfRk1BTAorI2VuZGlmCisjZGVmaW5lCUZQX0ZBU1RfRk1BRgorCisvKiBTeW1ib2xpYyBjb25zdGFudHMgdG8gY2xhc3NpZnkgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gKi8KKyNkZWZpbmUJRlBfSU5GSU5JVEUJMHgwMQorI2RlZmluZQlGUF9OQU4JCTB4MDIKKyNkZWZpbmUJRlBfTk9STUFMCTB4MDQKKyNkZWZpbmUJRlBfU1VCTk9STUFMCTB4MDgKKyNkZWZpbmUJRlBfWkVSTwkJMHgxMAorI2RlZmluZQlmcGNsYXNzaWZ5KHgpIFwKKyAgICAoKHNpemVvZiAoeCkgPT0gc2l6ZW9mIChmbG9hdCkpID8gX19mcGNsYXNzaWZ5Zih4KSBcCisgICAgOiAoc2l6ZW9mICh4KSA9PSBzaXplb2YgKGRvdWJsZSkpID8gX19mcGNsYXNzaWZ5ZCh4KSBcCisgICAgOiBfX2ZwY2xhc3NpZnlsKHgpKQorCisjZGVmaW5lCWlzZmluaXRlKHgpCQkJCQlcCisgICAgKChzaXplb2YgKHgpID09IHNpemVvZiAoZmxvYXQpKSA/IF9faXNmaW5pdGVmKHgpCVwKKyAgICA6IChzaXplb2YgKHgpID09IHNpemVvZiAoZG91YmxlKSkgPyBfX2lzZmluaXRlKHgpCVwKKyAgICA6IF9faXNmaW5pdGVsKHgpKQorI2RlZmluZQlpc2luZih4KQkJCQkJXAorICAgICgoc2l6ZW9mICh4KSA9PSBzaXplb2YgKGZsb2F0KSkgPyBfX2lzaW5mZih4KQlcCisgICAgOiAoc2l6ZW9mICh4KSA9PSBzaXplb2YgKGRvdWJsZSkpID8gX19pc2luZih4KQlcCisgICAgOiBfX2lzaW5mbCh4KSkKKyNkZWZpbmUJaXNuYW4oeCkJCQkJCVwKKyAgICAoKHNpemVvZiAoeCkgPT0gc2l6ZW9mIChmbG9hdCkpID8gaXNuYW5mKHgpCQlcCisgICAgOiAoc2l6ZW9mICh4KSA9PSBzaXplb2YgKGRvdWJsZSkpID8gaXNuYW4oeCkJXAorICAgIDogX19pc25hbmwoeCkpCisjZGVmaW5lCWlzbm9ybWFsKHgpCQkJCQlcCisgICAgKChzaXplb2YgKHgpID09IHNpemVvZiAoZmxvYXQpKSA/IF9faXNub3JtYWxmKHgpCVwKKyAgICA6IChzaXplb2YgKHgpID09IHNpemVvZiAoZG91YmxlKSkgPyBfX2lzbm9ybWFsKHgpCVwKKyAgICA6IF9faXNub3JtYWxsKHgpKQorCisjaWZkZWYgX19NQVRIX0JVSUxUSU5fUkVMT1BTCisjZGVmaW5lCWlzZ3JlYXRlcih4LCB5KQkJX19idWlsdGluX2lzZ3JlYXRlcigoeCksICh5KSkKKyNkZWZpbmUJaXNncmVhdGVyZXF1YWwoeCwgeSkJX19idWlsdGluX2lzZ3JlYXRlcmVxdWFsKCh4KSwgKHkpKQorI2RlZmluZQlpc2xlc3MoeCwgeSkJCV9fYnVpbHRpbl9pc2xlc3MoKHgpLCAoeSkpCisjZGVmaW5lCWlzbGVzc2VxdWFsKHgsIHkpCV9fYnVpbHRpbl9pc2xlc3NlcXVhbCgoeCksICh5KSkKKyNkZWZpbmUJaXNsZXNzZ3JlYXRlcih4LCB5KQlfX2J1aWx0aW5faXNsZXNzZ3JlYXRlcigoeCksICh5KSkKKyNkZWZpbmUJaXN1bm9yZGVyZWQoeCwgeSkJX19idWlsdGluX2lzdW5vcmRlcmVkKCh4KSwgKHkpKQorI2Vsc2UKKyNkZWZpbmUJaXNncmVhdGVyKHgsIHkpCQkoIWlzdW5vcmRlcmVkKCh4KSwgKHkpKSAmJiAoeCkgPiAoeSkpCisjZGVmaW5lCWlzZ3JlYXRlcmVxdWFsKHgsIHkpCSghaXN1bm9yZGVyZWQoKHgpLCAoeSkpICYmICh4KSA+PSAoeSkpCisjZGVmaW5lCWlzbGVzcyh4LCB5KQkJKCFpc3Vub3JkZXJlZCgoeCksICh5KSkgJiYgKHgpIDwgKHkpKQorI2RlZmluZQlpc2xlc3NlcXVhbCh4LCB5KQkoIWlzdW5vcmRlcmVkKCh4KSwgKHkpKSAmJiAoeCkgPD0gKHkpKQorI2RlZmluZQlpc2xlc3NncmVhdGVyKHgsIHkpCSghaXN1bm9yZGVyZWQoKHgpLCAoeSkpICYmIFwKKwkJCQkJKCh4KSA+ICh5KSB8fCAoeSkgPiAoeCkpKQorI2RlZmluZQlpc3Vub3JkZXJlZCh4LCB5KQkoaXNuYW4oeCkgfHwgaXNuYW4oeSkpCisjZW5kaWYgLyogX19NQVRIX0JVSUxUSU5fUkVMT1BTICovCisKKyNkZWZpbmUJc2lnbmJpdCh4KQkJCQkJXAorICAgICgoc2l6ZW9mICh4KSA9PSBzaXplb2YgKGZsb2F0KSkgPyBfX3NpZ25iaXRmKHgpCVwKKyAgICA6IChzaXplb2YgKHgpID09IHNpemVvZiAoZG91YmxlKSkgPyBfX3NpZ25iaXQoeCkJXAorICAgIDogX19zaWduYml0bCh4KSkKKworI2lmIDAKK3R5cGVkZWYJX19kb3VibGVfdAlkb3VibGVfdDsKK3R5cGVkZWYJX19mbG9hdF90CWZsb2F0X3Q7CisjZW5kaWYgCisvKiAjZW5kaWYgKi8gLyogX19JU09fQ19WSVNJQkxFID49IDE5OTkgKi8KKworLyoKKyAqIFhPUEVOL1NWSUQKKyAqLworLyogI2lmIF9fQlNEX1ZJU0lCTEUgfHwgX19YU0lfVklTSUJMRSAqLworI2RlZmluZQlNX0UJCTIuNzE4MjgxODI4NDU5MDQ1MjM1NAkvKiBlICovCisjZGVmaW5lCU1fTE9HMkUJCTEuNDQyNjk1MDQwODg4OTYzNDA3NAkvKiBsb2cgMmUgKi8KKyNkZWZpbmUJTV9MT0cxMEUJMC40MzQyOTQ0ODE5MDMyNTE4Mjc2NQkvKiBsb2cgMTBlICovCisjZGVmaW5lCU1fTE4yCQkwLjY5MzE0NzE4MDU1OTk0NTMwOTQyCS8qIGxvZyBlMiAqLworI2RlZmluZQlNX0xOMTAJCTIuMzAyNTg1MDkyOTk0MDQ1Njg0MDIJLyogbG9nIGUxMCAqLworI2RlZmluZQlNX1BJCQkzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CS8qIHBpICovCisjZGVmaW5lCU1fUElfMgkJMS41NzA3OTYzMjY3OTQ4OTY2MTkyMwkvKiBwaS8yICovCisjZGVmaW5lCU1fUElfNAkJMC43ODUzOTgxNjMzOTc0NDgzMDk2MgkvKiBwaS80ICovCisjZGVmaW5lCU1fMV9QSQkJMC4zMTgzMDk4ODYxODM3OTA2NzE1NAkvKiAxL3BpICovCisjZGVmaW5lCU1fMl9QSQkJMC42MzY2MTk3NzIzNjc1ODEzNDMwOAkvKiAyL3BpICovCisjZGVmaW5lCU1fMl9TUVJUUEkJMS4xMjgzNzkxNjcwOTU1MTI1NzM5MAkvKiAyL3NxcnQocGkpICovCisjZGVmaW5lCU1fU1FSVDIJCTEuNDE0MjEzNTYyMzczMDk1MDQ4ODAJLyogc3FydCgyKSAqLworI2RlZmluZQlNX1NRUlQxXzIJMC43MDcxMDY3ODExODY1NDc1MjQ0MAkvKiAxL3NxcnQoMikgKi8KKworI2RlZmluZQlNQVhGTE9BVAkoKGZsb2F0KTMuNDAyODIzNDY2Mzg1Mjg4NjBlKzM4KQorZXh0ZXJuIGludCBzaWduZ2FtOworLyogI2VuZGlmICovIC8qIF9fQlNEX1ZJU0lCTEUgfHwgX19YU0lfVklTSUJMRSAqLworCisjaWYgX19CU0RfVklTSUJMRQorI2lmIDAKKy8qIE9sZCB2YWx1ZSBmcm9tIDQuNEJTRC1MaXRlIG1hdGguaDsgdGhpcyBpcyBwcm9iYWJseSBiZXR0ZXIuICovCisjZGVmaW5lCUhVR0UJCUhVR0VfVkFMCisjZWxzZQorI2RlZmluZQlIVUdFCQlNQVhGTE9BVAorI2VuZGlmCisjZW5kaWYgLyogX19CU0RfVklTSUJMRSAqLworCisvKgorICogTW9zdCBvZiB0aGVzZSBmdW5jdGlvbnMgZGVwZW5kIG9uIHRoZSByb3VuZGluZyBtb2RlIGFuZCBoYXZlIHRoZSBzaWRlCisgKiBlZmZlY3Qgb2YgcmFpc2luZyBmbG9hdGluZy1wb2ludCBleGNlcHRpb25zLCBzbyB0aGV5IGFyZSBub3QgZGVjbGFyZWQKKyAqIGFzIF9fcHVyZTIuICBJbiBDOTksIEZFTlZfQUNDRVNTIGFmZmVjdHMgdGhlIHB1cml0eSBvZiB0aGVzZSBmdW5jdGlvbnMuCisgKi8KK19fQkVHSU5fREVDTFMKKy8qCisgKiBBTlNJL1BPU0lYCisgKi8KK2ludAlfX2ZwY2xhc3NpZnlkKGRvdWJsZSkgX19wdXJlMjsKK2ludAlfX2ZwY2xhc3NpZnlmKGZsb2F0KSBfX3B1cmUyOworaW50CV9fZnBjbGFzc2lmeWwobG9uZyBkb3VibGUpIF9fcHVyZTI7CitpbnQJX19pc2Zpbml0ZWYoZmxvYXQpIF9fcHVyZTI7CitpbnQJX19pc2Zpbml0ZShkb3VibGUpIF9fcHVyZTI7CitpbnQJX19pc2Zpbml0ZWwobG9uZyBkb3VibGUpIF9fcHVyZTI7CitpbnQJX19pc2luZmYoZmxvYXQpIF9fcHVyZTI7CitpbnQgICAgIF9faXNpbmYoZG91YmxlKSBfX3B1cmUyOworaW50CV9faXNpbmZsKGxvbmcgZG91YmxlKSBfX3B1cmUyOworaW50CV9faXNuYW5sKGxvbmcgZG91YmxlKSBfX3B1cmUyOworaW50CV9faXNub3JtYWxmKGZsb2F0KSBfX3B1cmUyOworaW50CV9faXNub3JtYWwoZG91YmxlKSBfX3B1cmUyOworaW50CV9faXNub3JtYWxsKGxvbmcgZG91YmxlKSBfX3B1cmUyOworaW50CV9fc2lnbmJpdChkb3VibGUpIF9fcHVyZTI7CitpbnQJX19zaWduYml0ZihmbG9hdCkgX19wdXJlMjsKK2ludAlfX3NpZ25iaXRsKGxvbmcgZG91YmxlKSBfX3B1cmUyOworCitkb3VibGUJYWNvcyhkb3VibGUpOworZG91YmxlCWFzaW4oZG91YmxlKTsKK2RvdWJsZQlhdGFuKGRvdWJsZSk7Citkb3VibGUJYXRhbjIoZG91YmxlLCBkb3VibGUpOworZG91YmxlCWNvcyhkb3VibGUpOworZG91YmxlCXNpbihkb3VibGUpOworZG91YmxlCXRhbihkb3VibGUpOworCitkb3VibGUJY29zaChkb3VibGUpOworZG91YmxlCXNpbmgoZG91YmxlKTsKK2RvdWJsZQl0YW5oKGRvdWJsZSk7CisKK2RvdWJsZQlleHAoZG91YmxlKTsKK2RvdWJsZQlmcmV4cChkb3VibGUsIGludCAqKTsJLyogZnVuZGFtZW50YWxseSAhX19wdXJlMiAqLworZG91YmxlCWxkZXhwKGRvdWJsZSwgaW50KTsKK2RvdWJsZQlsb2coZG91YmxlKTsKK2RvdWJsZQlsb2cxMChkb3VibGUpOworZG91YmxlCW1vZGYoZG91YmxlLCBkb3VibGUgKik7CS8qIGZ1bmRhbWVudGFsbHkgIV9fcHVyZTIgKi8KKworZG91YmxlCXBvdyhkb3VibGUsIGRvdWJsZSk7Citkb3VibGUJc3FydChkb3VibGUpOworCitkb3VibGUJY2VpbChkb3VibGUpOworZG91YmxlCWZhYnMoZG91YmxlKSBfX3B1cmUyOworZG91YmxlCWZsb29yKGRvdWJsZSk7Citkb3VibGUJZm1vZChkb3VibGUsIGRvdWJsZSk7CisKKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBpbiBDOTAuCisgKi8KKy8qICNpZiBfX0JTRF9WSVNJQkxFIHx8IF9fSVNPX0NfVklTSUJMRSA+PSAxOTk5IHx8IF9fWFNJX1ZJU0lCTEUgKi8KK2RvdWJsZQlhY29zaChkb3VibGUpOworZG91YmxlCWFzaW5oKGRvdWJsZSk7Citkb3VibGUJYXRhbmgoZG91YmxlKTsKK2RvdWJsZQljYnJ0KGRvdWJsZSk7Citkb3VibGUJZXJmKGRvdWJsZSk7Citkb3VibGUJZXJmYyhkb3VibGUpOworZG91YmxlCWV4cDIoZG91YmxlKTsKK2RvdWJsZQlleHBtMShkb3VibGUpOworZG91YmxlCWZtYShkb3VibGUsIGRvdWJsZSwgZG91YmxlKTsKK2RvdWJsZQloeXBvdChkb3VibGUsIGRvdWJsZSk7CitpbnQJaWxvZ2IoZG91YmxlKSBfX3B1cmUyOworLyogaW50CShpc2luZikoZG91YmxlKSBfX3B1cmUyOyAqLworaW50CShpc25hbikoZG91YmxlKSBfX3B1cmUyOworZG91YmxlCWxnYW1tYShkb3VibGUpOworbG9uZyBsb25nIGxscmludChkb3VibGUpOworbG9uZyBsb25nIGxscm91bmQoZG91YmxlKTsKK2RvdWJsZQlsb2cxcChkb3VibGUpOworZG91YmxlCWxvZ2IoZG91YmxlKTsKK2xvbmcJbHJpbnQoZG91YmxlKTsKK2xvbmcJbHJvdW5kKGRvdWJsZSk7Citkb3VibGUJbmV4dGFmdGVyKGRvdWJsZSwgZG91YmxlKTsKK2RvdWJsZQlyZW1haW5kZXIoZG91YmxlLCBkb3VibGUpOworZG91YmxlCXJlbXF1byhkb3VibGUsIGRvdWJsZSwgaW50ICopOworZG91YmxlCXJpbnQoZG91YmxlKTsKKy8qICNlbmRpZiAqLyAvKiBfX0JTRF9WSVNJQkxFIHx8IF9fSVNPX0NfVklTSUJMRSA+PSAxOTk5IHx8IF9fWFNJX1ZJU0lCTEUgKi8KKworLyogI2lmIF9fQlNEX1ZJU0lCTEUgfHwgX19YU0lfVklTSUJMRSAqLworZG91YmxlCWowKGRvdWJsZSk7Citkb3VibGUJajEoZG91YmxlKTsKK2RvdWJsZQlqbihpbnQsIGRvdWJsZSk7Citkb3VibGUJc2NhbGIoZG91YmxlLCBkb3VibGUpOworZG91YmxlCXkwKGRvdWJsZSk7Citkb3VibGUJeTEoZG91YmxlKTsKK2RvdWJsZQl5bihpbnQsIGRvdWJsZSk7CisKKy8qICNpZiBfX1hTSV9WSVNJQkxFIDw9IDUwMCB8fCBfX0JTRF9WSVNJQkxFICovCitkb3VibGUJZ2FtbWEoZG91YmxlKTsKKy8qICNlbmRpZiAqLworLyogI2VuZGlmICovIC8qIF9fQlNEX1ZJU0lCTEUgfHwgX19YU0lfVklTSUJMRSAqLworCisvKiAjaWYgX19CU0RfVklTSUJMRSB8fCBfX0lTT19DX1ZJU0lCTEUgPj0gMTk5OSAqLworZG91YmxlCWNvcHlzaWduKGRvdWJsZSwgZG91YmxlKSBfX3B1cmUyOworZG91YmxlCWZkaW0oZG91YmxlLCBkb3VibGUpOworZG91YmxlCWZtYXgoZG91YmxlLCBkb3VibGUpIF9fcHVyZTI7Citkb3VibGUJZm1pbihkb3VibGUsIGRvdWJsZSkgX19wdXJlMjsKK2RvdWJsZQluZWFyYnlpbnQoZG91YmxlKTsKK2RvdWJsZQlyb3VuZChkb3VibGUpOworZG91YmxlCXNjYWxibG4oZG91YmxlLCBsb25nKTsKK2RvdWJsZQlzY2FsYm4oZG91YmxlLCBpbnQpOworZG91YmxlCXRnYW1tYShkb3VibGUpOworZG91YmxlCXRydW5jKGRvdWJsZSk7CisvKiAjZW5kaWYgKi8KKworLyoKKyAqIEJTRCBtYXRoIGxpYnJhcnkgZW50cnkgcG9pbnRzCisgKi8KKy8qICNpZiBfX0JTRF9WSVNJQkxFICovCitkb3VibGUJZHJlbShkb3VibGUsIGRvdWJsZSk7CitpbnQJZmluaXRlKGRvdWJsZSkgX19wdXJlMjsKK2ludAlpc25hbmYoZmxvYXQpIF9fcHVyZTI7CisKKy8qCisgKiBSZWVudHJhbnQgdmVyc2lvbiBvZiBnYW1tYSAmIGxnYW1tYTsgcGFzc2VzIHNpZ25nYW0gYmFjayBieSByZWZlcmVuY2UKKyAqIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQ7IHVzZXIgbXVzdCBhbGxvY2F0ZSBzcGFjZSBmb3Igc2lnbmdhbS4KKyAqLworZG91YmxlCWdhbW1hX3IoZG91YmxlLCBpbnQgKik7Citkb3VibGUJbGdhbW1hX3IoZG91YmxlLCBpbnQgKik7CisKKy8qCisgKiBJRUVFIFRlc3QgVmVjdG9yCisgKi8KK2RvdWJsZQlzaWduaWZpY2FuZChkb3VibGUpOworLyogI2VuZGlmICovIC8qIF9fQlNEX1ZJU0lCTEUgKi8KKworLyogZmxvYXQgdmVyc2lvbnMgb2YgQU5TSS9QT1NJWCBmdW5jdGlvbnMgKi8KKy8qI2lmIF9fSVNPX0NfVklTSUJMRSA+PSAxOTk5ICovCitmbG9hdAlhY29zZihmbG9hdCk7CitmbG9hdAlhc2luZihmbG9hdCk7CitmbG9hdAlhdGFuZihmbG9hdCk7CitmbG9hdAlhdGFuMmYoZmxvYXQsIGZsb2F0KTsKK2Zsb2F0CWNvc2YoZmxvYXQpOworZmxvYXQJc2luZihmbG9hdCk7CitmbG9hdAl0YW5mKGZsb2F0KTsKKworZmxvYXQJY29zaGYoZmxvYXQpOworZmxvYXQJc2luaGYoZmxvYXQpOworZmxvYXQJdGFuaGYoZmxvYXQpOworCitmbG9hdAlleHAyZihmbG9hdCk7CitmbG9hdAlleHBmKGZsb2F0KTsKK2Zsb2F0CWV4cG0xZihmbG9hdCk7CitmbG9hdAlmcmV4cGYoZmxvYXQsIGludCAqKTsJLyogZnVuZGFtZW50YWxseSAhX19wdXJlMiAqLworaW50CWlsb2diZihmbG9hdCkgX19wdXJlMjsKK2Zsb2F0CWxkZXhwZihmbG9hdCwgaW50KTsKK2Zsb2F0CWxvZzEwZihmbG9hdCk7CitmbG9hdAlsb2cxcGYoZmxvYXQpOworZmxvYXQJbG9nZihmbG9hdCk7CitmbG9hdAltb2RmZihmbG9hdCwgZmxvYXQgKik7CS8qIGZ1bmRhbWVudGFsbHkgIV9fcHVyZTIgKi8KKworZmxvYXQJcG93ZihmbG9hdCwgZmxvYXQpOworZmxvYXQJc3FydGYoZmxvYXQpOworCitmbG9hdAljZWlsZihmbG9hdCk7CitmbG9hdAlmYWJzZihmbG9hdCkgX19wdXJlMjsKK2Zsb2F0CWZsb29yZihmbG9hdCk7CitmbG9hdAlmbW9kZihmbG9hdCwgZmxvYXQpOworZmxvYXQJcm91bmRmKGZsb2F0KTsKKworZmxvYXQJZXJmZihmbG9hdCk7CitmbG9hdAllcmZjZihmbG9hdCk7CitmbG9hdAloeXBvdGYoZmxvYXQsIGZsb2F0KTsKK2Zsb2F0CWxnYW1tYWYoZmxvYXQpOworCitmbG9hdAlhY29zaGYoZmxvYXQpOworZmxvYXQJYXNpbmhmKGZsb2F0KTsKK2Zsb2F0CWF0YW5oZihmbG9hdCk7CitmbG9hdAljYnJ0ZihmbG9hdCk7CitmbG9hdAlsb2diZihmbG9hdCk7CitmbG9hdAljb3B5c2lnbmYoZmxvYXQsIGZsb2F0KSBfX3B1cmUyOworbG9uZyBsb25nIGxscmludGYoZmxvYXQpOworbG9uZyBsb25nIGxscm91bmRmKGZsb2F0KTsKK2xvbmcJbHJpbnRmKGZsb2F0KTsKK2xvbmcJbHJvdW5kZihmbG9hdCk7CitmbG9hdAluZWFyYnlpbnRmKGZsb2F0KTsKK2Zsb2F0CW5leHRhZnRlcmYoZmxvYXQsIGZsb2F0KTsKK2Zsb2F0CXJlbWFpbmRlcmYoZmxvYXQsIGZsb2F0KTsKK2Zsb2F0CXJlbXF1b2YoZmxvYXQsIGZsb2F0LCBpbnQgKik7CitmbG9hdAlyaW50ZihmbG9hdCk7CitmbG9hdAlzY2FsYmxuZihmbG9hdCwgbG9uZyk7CitmbG9hdAlzY2FsYm5mKGZsb2F0LCBpbnQpOworZmxvYXQJdHJ1bmNmKGZsb2F0KTsKKworZmxvYXQJZmRpbWYoZmxvYXQsIGZsb2F0KTsKK2Zsb2F0CWZtYWYoZmxvYXQsIGZsb2F0LCBmbG9hdCk7CitmbG9hdAlmbWF4ZihmbG9hdCwgZmxvYXQpIF9fcHVyZTI7CitmbG9hdAlmbWluZihmbG9hdCwgZmxvYXQpIF9fcHVyZTI7CisvKiAjZW5kaWYgKi8KKworLyoKKyAqIGZsb2F0IHZlcnNpb25zIG9mIEJTRCBtYXRoIGxpYnJhcnkgZW50cnkgcG9pbnRzCisgKi8KKy8qICNpZiBfX0JTRF9WSVNJQkxFICovCitmbG9hdAlkcmVtZihmbG9hdCwgZmxvYXQpOworaW50CWZpbml0ZWYoZmxvYXQpIF9fcHVyZTI7CitmbG9hdAlnYW1tYWYoZmxvYXQpOworZmxvYXQJajBmKGZsb2F0KTsKK2Zsb2F0CWoxZihmbG9hdCk7CitmbG9hdAlqbmYoaW50LCBmbG9hdCk7CitmbG9hdAlzY2FsYmYoZmxvYXQsIGZsb2F0KTsKK2Zsb2F0CXkwZihmbG9hdCk7CitmbG9hdAl5MWYoZmxvYXQpOworZmxvYXQJeW5mKGludCwgZmxvYXQpOworCisvKgorICogRmxvYXQgdmVyc2lvbnMgb2YgcmVlbnRyYW50IHZlcnNpb24gb2YgZ2FtbWEgJiBsZ2FtbWE7IHBhc3NlcworICogc2lnbmdhbSBiYWNrIGJ5IHJlZmVyZW5jZSBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50OyB1c2VyIG11c3QKKyAqIGFsbG9jYXRlIHNwYWNlIGZvciBzaWduZ2FtLgorICovCitmbG9hdAlnYW1tYWZfcihmbG9hdCwgaW50ICopOworZmxvYXQJbGdhbW1hZl9yKGZsb2F0LCBpbnQgKik7CisKKy8qCisgKiBmbG9hdCB2ZXJzaW9uIG9mIElFRUUgVGVzdCBWZWN0b3IKKyAqLworZmxvYXQJc2lnbmlmaWNhbmRmKGZsb2F0KTsKKy8qICNlbmRpZiAqLwkvKiBfX0JTRF9WSVNJQkxFICovIAorCisvKgorICogbG9uZyBkb3VibGUgdmVyc2lvbnMgb2YgSVNPL1BPU0lYIG1hdGggZnVuY3Rpb25zCisgKi8KKy8qICNpZiBfX0lTT19DX1ZJU0lCTEUgPj0gMTk5OSAqLworI2lmIDAKK2xvbmcgZG91YmxlCWFjb3NobChsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQlhY29zbChsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQlhc2luaGwobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJYXNpbmwobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJYXRhbjJsKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQlhdGFuaGwobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJYXRhbmwobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJY2JydGwobG9uZyBkb3VibGUpOworI2VuZGlmCitsb25nIGRvdWJsZQljZWlsbChsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQljb3B5c2lnbmwobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKSBfX3B1cmUyOworI2lmIDAKK2xvbmcgZG91YmxlCWNvc2hsKGxvbmcgZG91YmxlKTsKK2xvbmcgZG91YmxlCWNvc2wobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJZXJmY2wobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJZXJmbChsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQlleHAybChsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQlleHBsKGxvbmcgZG91YmxlKTsKK2xvbmcgZG91YmxlCWV4cG0xbChsb25nIGRvdWJsZSk7CisjZW5kaWYKK2xvbmcgZG91YmxlCWZhYnNsKGxvbmcgZG91YmxlKSBfX3B1cmUyOworbG9uZyBkb3VibGUJZmRpbWwobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKTsKK2xvbmcgZG91YmxlCWZsb29ybChsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQlmbWFsKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSwgbG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJZm1heGwobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKSBfX3B1cmUyOworbG9uZyBkb3VibGUJZm1pbmwobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKSBfX3B1cmUyOworI2lmIDAKK2xvbmcgZG91YmxlCWZtb2RsKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSk7CisjZW5kaWYKK2xvbmcgZG91YmxlCWZyZXhwbChsb25nIGRvdWJsZSB2YWx1ZSwgaW50ICopOyAvKiBmdW5kYW1lbnRhbGx5ICFfX3B1cmUyICovCisjaWYgMAorbG9uZyBkb3VibGUJaHlwb3RsKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSk7CisjZW5kaWYKK2ludAkJaWxvZ2JsKGxvbmcgZG91YmxlKSBfX3B1cmUyOworbG9uZyBkb3VibGUJbGRleHBsKGxvbmcgZG91YmxlLCBpbnQpOworI2lmIDAKK2xvbmcgZG91YmxlCWxnYW1tYWwobG9uZyBkb3VibGUpOworbG9uZyBsb25nCWxscmludGwobG9uZyBkb3VibGUpOworI2VuZGlmCitsb25nIGxvbmcJbGxyb3VuZGwobG9uZyBkb3VibGUpOworI2lmIDAKK2xvbmcgZG91YmxlCWxvZzEwbChsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQlsb2cxcGwobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJbG9nMmwobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJbG9nYmwobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJbG9nbChsb25nIGRvdWJsZSk7Citsb25nCQlscmludGwobG9uZyBkb3VibGUpOworI2VuZGlmCitsb25nCQlscm91bmRsKGxvbmcgZG91YmxlKTsKKyNpZiAwCitsb25nIGRvdWJsZQltb2RmbChsb25nIGRvdWJsZSwgbG9uZyBkb3VibGUgKik7IC8qIGZ1bmRhbWVudGFsbHkgIV9fcHVyZTIgKi8KK2xvbmcgZG91YmxlCW5hbmwoY29uc3QgY2hhciAqKSBfX3B1cmUyOworbG9uZyBkb3VibGUJbmVhcmJ5aW50bChsb25nIGRvdWJsZSk7CisjZW5kaWYKK2xvbmcgZG91YmxlCW5leHRhZnRlcmwobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKTsKK2RvdWJsZQkJbmV4dHRvd2FyZChkb3VibGUsIGxvbmcgZG91YmxlKTsKK2Zsb2F0CQluZXh0dG93YXJkZihmbG9hdCwgbG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJbmV4dHRvd2FyZGwobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKTsKKyNpZiAwCitsb25nIGRvdWJsZQlwb3dsKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQlyZW1haW5kZXJsKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQlyZW1xdW9sKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSwgaW50ICopOworbG9uZyBkb3VibGUJcmludGwobG9uZyBkb3VibGUpOworI2VuZGlmCitsb25nIGRvdWJsZQlyb3VuZGwobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJc2NhbGJsbmwobG9uZyBkb3VibGUsIGxvbmcpOworbG9uZyBkb3VibGUJc2NhbGJubChsb25nIGRvdWJsZSwgaW50KTsKKyNpZiAwCitsb25nIGRvdWJsZQlzaW5obChsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQlzaW5sKGxvbmcgZG91YmxlKTsKK2xvbmcgZG91YmxlCXNxcnRsKGxvbmcgZG91YmxlKTsKK2xvbmcgZG91YmxlCXRhbmhsKGxvbmcgZG91YmxlKTsKK2xvbmcgZG91YmxlCXRhbmwobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJdGdhbW1hbChsb25nIGRvdWJsZSk7CisjZW5kaWYKK2xvbmcgZG91YmxlCXRydW5jbChsb25nIGRvdWJsZSk7CisKKy8qICNlbmRpZiAqLyAvKiBfX0lTT19DX1ZJU0lCTEUgPj0gMTk5OSAqLworX19FTkRfREVDTFMKKworI2VuZGlmIC8qICFfTUFUSF9IXyAqLwpkaWZmIC0tZ2l0IGEvbGlibS9pbmNsdWRlL3Bvd2VycGMvZmVudi5oIGIvbGlibS9pbmNsdWRlL3Bvd2VycGMvZmVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZDIzODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2luY2x1ZGUvcG93ZXJwYy9mZW52LmgKQEAgLTAsMCArMSwyNjMgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3Bvd2VycGMvZmVudi5oLHYgMS4zIDIwMDUvMDMvMTYgMTk6MDM6NDUgZGFzIEV4cCAkCisgKi8KKworI2lmbmRlZglfRkVOVl9IXworI2RlZmluZQlfRkVOVl9IXworCisjaW5jbHVkZSA8c3lzL190eXBlcy5oPgorCit0eXBlZGVmCV9fdWludDMyX3QJZmVudl90OwordHlwZWRlZglfX3VpbnQzMl90CWZleGNlcHRfdDsKKworLyogRXhjZXB0aW9uIGZsYWdzICovCisjZGVmaW5lCUZFX0lORVhBQ1QJMHgwMjAwMDAwMAorI2RlZmluZQlGRV9ESVZCWVpFUk8JMHgwNDAwMDAwMAorI2RlZmluZQlGRV9VTkRFUkZMT1cJMHgwODAwMDAwMAorI2RlZmluZQlGRV9PVkVSRkxPVwkweDEwMDAwMDAwCisjZGVmaW5lCUZFX0lOVkFMSUQJMHgyMDAwMDAwMAkvKiBhbGwgdHlwZXMgb2YgaW52YWxpZCBGUCBvcHMgKi8KKworLyoKKyAqIFRoZSBQb3dlclBDIGFyY2hpdGVjdHVyZSBoYXMgZXh0cmEgaW52YWxpZCBmbGFncyB0aGF0IGluZGljYXRlIHRoZQorICogc3BlY2lmaWMgdHlwZSBvZiBpbnZhbGlkIG9wZXJhdGlvbiBvY2N1cnJlZC4gIFRoZXNlIGZsYWdzIG1heSBiZQorICogdGVzdGVkLCBzZXQsIGFuZCBjbGVhcmVkLS0tYnV0IG5vdCBtYXNrZWQtLS1zZXBhcmF0ZWx5LiAgQWxsIG9mCisgKiB0aGVzZSBiaXRzIGFyZSBjbGVhcmVkIHdoZW4gRkVfSU5WQUxJRCBpcyBjbGVhcmVkLCBidXQgb25seQorICogRkVfVlhTT0ZUIGlzIHNldCB3aGVuIEZFX0lOVkFMSUQgaXMgZXhwbGljaXRseSBzZXQgaW4gc29mdHdhcmUuCisgKi8KKyNkZWZpbmUJRkVfVlhDVkkJMHgwMDAwMDEwMAkvKiBpbnZhbGlkIGludGVnZXIgY29udmVydCAqLworI2RlZmluZQlGRV9WWFNRUlQJMHgwMDAwMDIwMAkvKiBzcXVhcmUgcm9vdCBvZiBhIG5lZ2F0aXZlICovCisjZGVmaW5lCUZFX1ZYU09GVAkweDAwMDAwNDAwCS8qIHNvZnR3YXJlLXJlcXVlc3RlZCBleGNlcHRpb24gKi8KKyNkZWZpbmUJRkVfVlhWQwkJMHgwMDA4MDAwMAkvKiBvcmRlcmVkIGNvbXBhcmlzb24gaW52b2x2aW5nIE5hTiAqLworI2RlZmluZQlGRV9WWElNWgkweDAwMTAwMDAwCS8qIGluZiAqIDAgKi8KKyNkZWZpbmUJRkVfVlhaRFoJMHgwMDIwMDAwMAkvKiAwIC8gMCAqLworI2RlZmluZQlGRV9WWElESQkweDAwNDAwMDAwCS8qIGluZiAvIGluZiAqLworI2RlZmluZQlGRV9WWElTSQkweDAwODAwMDAwCS8qIGluZiAtIGluZiAqLworI2RlZmluZQlGRV9WWFNOQU4JMHgwMTAwMDAwMAkvKiBvcGVyYXRpb24gb24gYSBzaWduYWxsaW5nIE5hTiAqLworI2RlZmluZQlGRV9BTExfSU5WQUxJRAkoRkVfVlhDVkkgfCBGRV9WWFNRUlQgfCBGRV9WWFNPRlQgfCBGRV9WWFZDIHwgXAorCQkJIEZFX1ZYSU1aIHwgRkVfVlhaRFogfCBGRV9WWElESSB8IEZFX1ZYSVNJIHwgXAorCQkJIEZFX1ZYU05BTiB8IEZFX0lOVkFMSUQpCisjZGVmaW5lCUZFX0FMTF9FWENFUFQJKEZFX0RJVkJZWkVSTyB8IEZFX0lORVhBQ1QgfCBcCisJCQkgRkVfQUxMX0lOVkFMSUQgfCBGRV9PVkVSRkxPVyB8IEZFX1VOREVSRkxPVykKKworLyogUm91bmRpbmcgbW9kZXMgKi8KKyNkZWZpbmUJRkVfVE9ORUFSRVNUCTB4MDAwMAorI2RlZmluZQlGRV9UT1dBUkRaRVJPCTB4MDAwMQorI2RlZmluZQlGRV9VUFdBUkQJMHgwMDAyCisjZGVmaW5lCUZFX0RPV05XQVJECTB4MDAwMworI2RlZmluZQlfUk9VTkRfTUFTSwkoRkVfVE9ORUFSRVNUIHwgRkVfRE9XTldBUkQgfCBcCisJCQkgRkVfVVBXQVJEIHwgRkVfVE9XQVJEWkVSTykKKworX19CRUdJTl9ERUNMUworCisvKiBEZWZhdWx0IGZsb2F0aW5nLXBvaW50IGVudmlyb25tZW50ICovCitleHRlcm4gY29uc3QgZmVudl90CV9fZmVfZGZsX2VudjsKKyNkZWZpbmUJRkVfREZMX0VOVgkoJl9fZmVfZGZsX2VudikKKworLyogV2UgbmVlZCB0byBiZSBhYmxlIHRvIG1hcCBzdGF0dXMgZmxhZyBwb3NpdGlvbnMgdG8gbWFzayBmbGFnIHBvc2l0aW9ucyAqLworI2RlZmluZQlfRlBVU1dfU0hJRlQJMjIKKyNkZWZpbmUJX0VOQUJMRV9NQVNLCSgoRkVfRElWQllaRVJPIHwgRkVfSU5FWEFDVCB8IEZFX0lOVkFMSUQgfCBcCisJCQkgRkVfT1ZFUkZMT1cgfCBGRV9VTkRFUkZMT1cpID4+IF9GUFVTV19TSElGVCkKKworI2RlZmluZQlfX21mZnMoX19lbnYpCV9fYXNtIF9fdm9sYXRpbGUoIm1mZnMgJTAiIDogIj1mIiAoKihfX2VudikpKQorI2RlZmluZQlfX210ZnNmKF9fZW52KQlfX2FzbSBfX3ZvbGF0aWxlKCJtdGZzZiAyNTUsJTAiIDogOiAiZiIgKF9fZW52KSkKKwordW5pb24gX19mcHNjciB7CisJZG91YmxlIF9fZDsKKwlzdHJ1Y3QgeworCQlfX3VpbnQzMl90IF9fanVuazsKKwkJZmVudl90IF9fcmVnOworCX0gX19iaXRzOworfTsKKworc3RhdGljIF9faW5saW5lIGludAorZmVjbGVhcmV4Y2VwdChpbnQgX19leGNlcHRzKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCisJaWYgKF9fZXhjZXB0cyAmIEZFX0lOVkFMSUQpCisJCV9fZXhjZXB0cyB8PSBGRV9BTExfSU5WQUxJRDsKKwlfX21mZnMoJl9fci5fX2QpOworCV9fci5fX2JpdHMuX19yZWcgJj0gfl9fZXhjZXB0czsKKwlfX210ZnNmKF9fci5fX2QpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZXhjZXB0ZmxhZyhmZXhjZXB0X3QgKl9fZmxhZ3AsIGludCBfX2V4Y2VwdHMpCit7CisJdW5pb24gX19mcHNjciBfX3I7CisKKwlfX21mZnMoJl9fci5fX2QpOworCSpfX2ZsYWdwID0gX19yLl9fYml0cy5fX3JlZyAmIF9fZXhjZXB0czsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldGV4Y2VwdGZsYWcoY29uc3QgZmV4Y2VwdF90ICpfX2ZsYWdwLCBpbnQgX19leGNlcHRzKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCisJaWYgKF9fZXhjZXB0cyAmIEZFX0lOVkFMSUQpCisJCV9fZXhjZXB0cyB8PSBGRV9BTExfRVhDRVBUOworCV9fbWZmcygmX19yLl9fZCk7CisJX19yLl9fYml0cy5fX3JlZyAmPSB+X19leGNlcHRzOworCV9fci5fX2JpdHMuX19yZWcgfD0gKl9fZmxhZ3AgJiBfX2V4Y2VwdHM7CisJX19tdGZzZihfX3IuX19kKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXJhaXNlZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJdW5pb24gX19mcHNjciBfX3I7CisKKwlpZiAoX19leGNlcHRzICYgRkVfSU5WQUxJRCkKKwkJX19leGNlcHRzIHw9IEZFX1ZYU09GVDsKKwlfX21mZnMoJl9fci5fX2QpOworCV9fci5fX2JpdHMuX19yZWcgfD0gX19leGNlcHRzOworCV9fbXRmc2YoX19yLl9fZCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmV0ZXN0ZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJdW5pb24gX19mcHNjciBfX3I7CisKKwlfX21mZnMoJl9fci5fX2QpOworCXJldHVybiAoX19yLl9fYml0cy5fX3JlZyAmIF9fZXhjZXB0cyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0cm91bmQodm9pZCkKK3sKKwl1bmlvbiBfX2Zwc2NyIF9fcjsKKworCV9fbWZmcygmX19yLl9fZCk7CisJcmV0dXJuIChfX3IuX19iaXRzLl9fcmVnICYgX1JPVU5EX01BU0spOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldHJvdW5kKGludCBfX3JvdW5kKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCisJaWYgKF9fcm91bmQgJiB+X1JPVU5EX01BU0spCisJCXJldHVybiAoLTEpOworCV9fbWZmcygmX19yLl9fZCk7CisJX19yLl9fYml0cy5fX3JlZyAmPSB+X1JPVU5EX01BU0s7CisJX19yLl9fYml0cy5fX3JlZyB8PSBfX3JvdW5kOworCV9fbXRmc2YoX19yLl9fZCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRlbnYoZmVudl90ICpfX2VudnApCit7CisJdW5pb24gX19mcHNjciBfX3I7CisKKwlfX21mZnMoJl9fci5fX2QpOworCSpfX2VudnAgPSBfX3IuX19iaXRzLl9fcmVnOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlaG9sZGV4Y2VwdChmZW52X3QgKl9fZW52cCkKK3sKKwl1bmlvbiBfX2Zwc2NyIF9fcjsKKworCV9fbWZmcygmX19yLl9fZCk7CisJKl9fZW52cCA9IF9fci5fX2Q7CisJX19yLl9fYml0cy5fX3JlZyAmPSB+KEZFX0FMTF9FWENFUFQgfCBfRU5BQkxFX01BU0spOworCV9fbXRmc2YoX19yLl9fZCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRlbnYoY29uc3QgZmVudl90ICpfX2VudnApCit7CisJdW5pb24gX19mcHNjciBfX3I7CisKKwlfX3IuX19iaXRzLl9fcmVnID0gKl9fZW52cDsKKwlfX210ZnNmKF9fci5fX2QpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZldXBkYXRlZW52KGNvbnN0IGZlbnZfdCAqX19lbnZwKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCisJX19tZmZzKCZfX3IuX19kKTsKKwlfX3IuX19iaXRzLl9fcmVnICY9IEZFX0FMTF9FWENFUFQ7CisJX19yLl9fYml0cy5fX3JlZyB8PSAqX19lbnZwOworCV9fbXRmc2YoX19yLl9fZCk7CisJcmV0dXJuICgwKTsKK30KKworI2lmIF9fQlNEX1ZJU0lCTEUKKworc3RhdGljIF9faW5saW5lIGludAorZmVlbmFibGVleGNlcHQoaW50IF9fbWFzaykKK3sKKwl1bmlvbiBfX2Zwc2NyIF9fcjsKKwlmZW52X3QgX19vbGRtYXNrOworCisJX19tZmZzKCZfX3IuX19kKTsKKwlfX29sZG1hc2sgPSBfX3IuX19iaXRzLl9fcmVnOworCV9fci5fX2JpdHMuX19yZWcgfD0gKF9fbWFzayAmIEZFX0FMTF9FWENFUFQpID4+IF9GUFVTV19TSElGVDsKKwlfX210ZnNmKF9fci5fX2QpOworCXJldHVybiAoKF9fb2xkbWFzayAmIF9FTkFCTEVfTUFTSykgPDwgX0ZQVVNXX1NISUZUKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVkaXNhYmxlZXhjZXB0KGludCBfX21hc2spCit7CisJdW5pb24gX19mcHNjciBfX3I7CisJZmVudl90IF9fb2xkbWFzazsKKworCV9fbWZmcygmX19yLl9fZCk7CisJX19vbGRtYXNrID0gX19yLl9fYml0cy5fX3JlZzsKKwlfX3IuX19iaXRzLl9fcmVnICY9IH4oKF9fbWFzayAmIEZFX0FMTF9FWENFUFQpID4+IF9GUFVTV19TSElGVCk7CisJX19tdGZzZihfX3IuX19kKTsKKwlyZXR1cm4gKChfX29sZG1hc2sgJiBfRU5BQkxFX01BU0spIDw8IF9GUFVTV19TSElGVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZXhjZXB0KHZvaWQpCit7CisJdW5pb24gX19mcHNjciBfX3I7CisKKwlfX21mZnMoJl9fci5fX2QpOworCXJldHVybiAoKF9fci5fX2JpdHMuX19yZWcgJiBfRU5BQkxFX01BU0spIDw8IF9GUFVTV19TSElGVCk7Cit9CisKKyNlbmRpZiAvKiBfX0JTRF9WSVNJQkxFICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiAhX0ZFTlZfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYm0vaW5jbHVkZS9zcGFyYzY0L2ZlbnYuaCBiL2xpYm0vaW5jbHVkZS9zcGFyYzY0L2ZlbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODRjNGEyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pbmNsdWRlL3NwYXJjNjQvZmVudi5oCkBAIC0wLDAgKzEsMjU0IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcGFyYzY0L2ZlbnYuaCx2IDEuMyAyMDA1LzAzLzE2IDE5OjAzOjQ2IGRhcyBFeHAgJAorICovCisKKyNpZm5kZWYJX0ZFTlZfSF8KKyNkZWZpbmUJX0ZFTlZfSF8KKworI2luY2x1ZGUgPHN5cy9fdHlwZXMuaD4KKwordHlwZWRlZglfX3VpbnQ2NF90CWZlbnZfdDsKK3R5cGVkZWYJX191aW50NjRfdAlmZXhjZXB0X3Q7CisKKy8qIEV4Y2VwdGlvbiBmbGFncyAqLworI2RlZmluZQlGRV9JTlZBTElECTB4MDAwMDAyMDAKKyNkZWZpbmUJRkVfRElWQllaRVJPCTB4MDAwMDAwNDAKKyNkZWZpbmUJRkVfT1ZFUkZMT1cJMHgwMDAwMDEwMAorI2RlZmluZQlGRV9VTkRFUkZMT1cJMHgwMDAwMDA4MAorI2RlZmluZQlGRV9JTkVYQUNUCTB4MDAwMDAwMjAKKyNkZWZpbmUJRkVfQUxMX0VYQ0VQVAkoRkVfRElWQllaRVJPIHwgRkVfSU5FWEFDVCB8IFwKKwkJCSBGRV9JTlZBTElEIHwgRkVfT1ZFUkZMT1cgfCBGRV9VTkRFUkZMT1cpCisKKy8qCisgKiBSb3VuZGluZyBtb2RlcworICoKKyAqIFdlIGNhbid0IGp1c3QgdXNlIHRoZSBoYXJkd2FyZSBiaXQgdmFsdWVzIGhlcmUsIGJlY2F1c2UgdGhhdCB3b3VsZAorICogbWFrZSBGRV9VUFdBUkQgYW5kIEZFX0RPV05XQVJEIG5lZ2F0aXZlLCB3aGljaCBpcyBub3QgYWxsb3dlZC4KKyAqLworI2RlZmluZQlGRV9UT05FQVJFU1QJMHgwCisjZGVmaW5lCUZFX1RPV0FSRFpFUk8JMHgxCisjZGVmaW5lCUZFX1VQV0FSRAkweDIKKyNkZWZpbmUJRkVfRE9XTldBUkQJMHgzCisjZGVmaW5lCV9ST1VORF9NQVNLCShGRV9UT05FQVJFU1QgfCBGRV9ET1dOV0FSRCB8IFwKKwkJCSBGRV9VUFdBUkQgfCBGRV9UT1dBUkRaRVJPKQorI2RlZmluZQlfUk9VTkRfU0hJRlQJMzAKKworX19CRUdJTl9ERUNMUworCisvKiBEZWZhdWx0IGZsb2F0aW5nLXBvaW50IGVudmlyb25tZW50ICovCitleHRlcm4gY29uc3QgZmVudl90CV9fZmVfZGZsX2VudjsKKyNkZWZpbmUJRkVfREZMX0VOVgkoJl9fZmVfZGZsX2VudikKKworLyogV2UgbmVlZCB0byBiZSBhYmxlIHRvIG1hcCBzdGF0dXMgZmxhZyBwb3NpdGlvbnMgdG8gbWFzayBmbGFnIHBvc2l0aW9ucyAqLworI2RlZmluZSBfRlBVU1dfU0hJRlQJMTgKKyNkZWZpbmUJX0VOQUJMRV9NQVNLCShGRV9BTExfRVhDRVBUIDw8IF9GUFVTV19TSElGVCkKKworI2RlZmluZQlfX2xkeGZzcihfX3IpCV9fYXNtIF9fdm9sYXRpbGUoImxkeCAlMCwgJSVmc3IiIDogOiAibSIgKF9fcikpCisjZGVmaW5lCV9fc3R4ZnNyKF9fcikJX19hc20gX192b2xhdGlsZSgic3R4ICUlZnNyLCAlMCIgOiAiPW0iICgqKF9fcikpKQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWNsZWFyZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJZmV4Y2VwdF90IF9fcjsKKworCV9fc3R4ZnNyKCZfX3IpOworCV9fciAmPSB+X19leGNlcHRzOworCV9fbGR4ZnNyKF9fcik7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRleGNlcHRmbGFnKGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwlmZXhjZXB0X3QgX19yOworCisJX19zdHhmc3IoJl9fcik7CisJKl9fZmxhZ3AgPSBfX3IgJiBfX2V4Y2VwdHM7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRleGNlcHRmbGFnKGNvbnN0IGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwlmZXhjZXB0X3QgX19yOworCisJX19zdHhmc3IoJl9fcik7CisJX19yICY9IH5fX2V4Y2VwdHM7CisJX19yIHw9ICpfX2ZsYWdwICYgX19leGNlcHRzOworCV9fbGR4ZnNyKF9fcik7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIEluIGNvbnRyYXN0IHdpdGggdGhlIGlhNjQgcGxhdGZvcm0sIGl0IHNlZW1zIHRvIGJlIHdvcnRod2hpbGUgdG8KKyAqIGlubGluZSB0aGlzIGZ1bmN0aW9uIG9uIHNwYXJjNjQgZXZlbiB3aGVuIHRoZSBhcmd1bWVudHMgYXJlIG5vdAorICogY29tcGlsZS10aW1lIGNvbnN0YW50cy4gIFBlcmhhcHMgdGhpcyBkZXBlbmRzIG9uIHRoZSByZWdpc3RlciB3aW5kb3cuCisgKi8KK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlcmFpc2VleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwl2b2xhdGlsZSBkb3VibGUgZDsKKworCS8qCisJICogV2l0aCBhIGNvbXBpbGVyIHRoYXQgc3VwcG9ydHMgdGhlIEZFTlZfQUNDRVNTIHByYWdtYQorCSAqIHByb3Blcmx5LCBzaW1wbGUgZXhwcmVzc2lvbnMgbGlrZSAnMC4wIC8gMC4wJyBzaG91bGQKKwkgKiBiZSBzdWZmaWNpZW50IHRvIGdlbmVyYXRlIHRyYXBzLiAgVW5mb3J0dW5hdGVseSwgd2UKKwkgKiBuZWVkIHRvIGJyaW5nIGEgdm9sYXRpbGUgdmFyaWFibGUgaW50byB0aGUgZXF1YXRpb24KKwkgKiB0byBwcmV2ZW50IGluY29ycmVjdCBvcHRpbWl6YXRpb25zLgorCSAqLworCWlmIChfX2V4Y2VwdHMgJiBGRV9JTlZBTElEKSB7CisJCWQgPSAwLjA7CisJCWQgPSAwLjAgLyBkOworCX0KKwlpZiAoX19leGNlcHRzICYgRkVfRElWQllaRVJPKSB7CisJCWQgPSAwLjA7CisJCWQgPSAxLjAgLyBkOworCX0KKwlpZiAoX19leGNlcHRzICYgRkVfT1ZFUkZMT1cpIHsKKwkJZCA9IDB4MS5mZnAxMDIzOworCQlkICo9IDIuMDsKKwl9CisJaWYgKF9fZXhjZXB0cyAmIEZFX1VOREVSRkxPVykgeworCQlkID0gMHgxcC0xMDIyOworCQlkIC89IDB4MXAxMDIzOworCX0KKwlpZiAoX19leGNlcHRzICYgRkVfSU5FWEFDVCkgeworCQlkID0gMHgxcC0xMDIyOworCQlkICs9IDEuMDsKKwl9CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmV0ZXN0ZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJZmV4Y2VwdF90IF9fcjsKKworCV9fc3R4ZnNyKCZfX3IpOworCXJldHVybiAoX19yICYgX19leGNlcHRzKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRyb3VuZCh2b2lkKQoreworCWZlbnZfdCBfX3I7CisKKwlfX3N0eGZzcigmX19yKTsKKwlyZXR1cm4gKChfX3IgPj4gX1JPVU5EX1NISUZUKSAmIF9ST1VORF9NQVNLKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRyb3VuZChpbnQgX19yb3VuZCkKK3sKKwlmZW52X3QgX19yOworCisJaWYgKF9fcm91bmQgJiB+X1JPVU5EX01BU0spCisJCXJldHVybiAoLTEpOworCV9fc3R4ZnNyKCZfX3IpOworCV9fciAmPSB+KF9ST1VORF9NQVNLIDw8IF9ST1VORF9TSElGVCk7CisJX19yIHw9IF9fcm91bmQgPDwgX1JPVU5EX1NISUZUOworCV9fbGR4ZnNyKF9fcik7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRlbnYoZmVudl90ICpfX2VudnApCit7CisKKwlfX3N0eGZzcihfX2VudnApOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlaG9sZGV4Y2VwdChmZW52X3QgKl9fZW52cCkKK3sKKwlmZW52X3QgX19yOworCisJX19zdHhmc3IoJl9fcik7CisJKl9fZW52cCA9IF9fcjsKKwlfX3IgJj0gfihGRV9BTExfRVhDRVBUIHwgX0VOQUJMRV9NQVNLKTsKKwlfX2xkeGZzcihfX3IpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2Zlc2V0ZW52KGNvbnN0IGZlbnZfdCAqX19lbnZwKQoreworCisJX19sZHhmc3IoKl9fZW52cCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmV1cGRhdGVlbnYoY29uc3QgZmVudl90ICpfX2VudnApCit7CisJZmV4Y2VwdF90IF9fcjsKKworCV9fc3R4ZnNyKCZfX3IpOworCV9fbGR4ZnNyKCpfX2VudnApOworCWZlcmFpc2VleGNlcHQoX19yICYgRkVfQUxMX0VYQ0VQVCk7CisJcmV0dXJuICgwKTsKK30KKworI2lmIF9fQlNEX1ZJU0lCTEUKKworc3RhdGljIF9faW5saW5lIGludAorZmVlbmFibGVleGNlcHQoaW50IF9fbWFzaykKK3sKKwlmZW52X3QgX19vbGRfciwgX19uZXdfcjsKKworCV9fc3R4ZnNyKCZfX29sZF9yKTsKKwlfX25ld19yID0gX19vbGRfciB8ICgoX19tYXNrICYgRkVfQUxMX0VYQ0VQVCkgPDwgX0ZQVVNXX1NISUZUKTsKKwlfX2xkeGZzcihfX25ld19yKTsKKwlyZXR1cm4gKChfX29sZF9yID4+IF9GUFVTV19TSElGVCkgJiBGRV9BTExfRVhDRVBUKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVkaXNhYmxlZXhjZXB0KGludCBfX21hc2spCit7CisJZmVudl90IF9fb2xkX3IsIF9fbmV3X3I7CisKKwlfX3N0eGZzcigmX19vbGRfcik7CisJX19uZXdfciA9IF9fb2xkX3IgJiB+KChfX21hc2sgJiBGRV9BTExfRVhDRVBUKSA8PCBfRlBVU1dfU0hJRlQpOworCV9fbGR4ZnNyKF9fbmV3X3IpOworCXJldHVybiAoKF9fb2xkX3IgPj4gX0ZQVVNXX1NISUZUKSAmIEZFX0FMTF9FWENFUFQpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldGV4Y2VwdCh2b2lkKQoreworCWZlbnZfdCBfX3I7CisKKwlfX3N0eGZzcigmX19yKTsKKwlyZXR1cm4gKChfX3IgJiBfRU5BQkxFX01BU0spID4+IF9GUFVTV19TSElGVCk7Cit9CisKKyNlbmRpZiAvKiBfX0JTRF9WSVNJQkxFICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiAhX0ZFTlZfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYm0vaXNpbmYuYyBiL2xpYm0vaXNpbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGE4ZjU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pc2luZi5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0QkCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlICJzcmMvZnBtYXRoLmgiCisKKy8qCisgKiBYWFggVGhlc2Ugcm91dGluZXMgYmVsb25nIGluIGxpYm0sIGJ1dCB0aGV5IG11c3QgcmVtYWluIGluIGxpYmMgZm9yCisgKiAgICAgYmluYXJ5IGNvbXBhdCB1bnRpbCB3ZSBjYW4gYnVtcCBsaWJtJ3MgbWFqb3IgdmVyc2lvbiBudW1iZXIuCisgKi8KKworaW50CitfX2lzaW5mKGRvdWJsZSBkKQoreworCXVuaW9uIElFRUVkMmJpdHMgdTsKKworCXUuZCA9IGQ7CisJcmV0dXJuICh1LmJpdHMuZXhwID09IDIwNDcgJiYgdS5iaXRzLm1hbmwgPT0gMCAmJiB1LmJpdHMubWFuaCA9PSAwKTsKK30KKworaW50CitfX2lzaW5mZihmbG9hdCBmKQoreworCXVuaW9uIElFRUVmMmJpdHMgdTsKKworCXUuZiA9IGY7CisJcmV0dXJuICh1LmJpdHMuZXhwID09IDI1NSAmJiB1LmJpdHMubWFuID09IDApOworfQorCitpbnQKK19faXNpbmZsKGxvbmcgZG91YmxlIGUpCit7CisJdW5pb24gSUVFRWwyYml0cyB1OworCisJdS5lID0gZTsKKwltYXNrX25iaXRfbCh1KTsKKyNpZm5kZWYgX19hbHBoYV9fCisJcmV0dXJuICh1LmJpdHMuZXhwID09IDMyNzY3ICYmIHUuYml0cy5tYW5sID09IDAgJiYgdS5iaXRzLm1hbmggPT0gMCk7CisjZWxzZQorCXJldHVybiAodS5iaXRzLmV4cCA9PSAyMDQ3ICYmIHUuYml0cy5tYW5sID09IDAgJiYgdS5iaXRzLm1hbmggPT0gMCk7CisjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vYWNvcy4zIGIvbGlibS9tYW4vYWNvcy4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMDNkNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi9hY29zLjMKQEAgLTAsMCArMSw5MiBAQAorLlwiIENvcHlyaWdodCAoYykgMTk5MSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKWFjb3MuMwk1LjEgKEJlcmtlbGV5KSA1LzIvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9hY29zLjMsdiAxLjEzIDIwMDUvMDEvMTQgMjM6Mjg6MjggZGFzIEV4cCAkCisuXCIKKy5EZCBKYW51YXJ5IDE0LCAyMDA1CisuRHQgQUNPUyAzCisuT3MKKy5TaCBOQU1FCisuTm0gYWNvcyAsCisuTm0gYWNvc2YKKy5OZCBhcmMgY29zaW5lIGZ1bmN0aW9ucworLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBhY29zICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIGFjb3NmICJmbG9hdCB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiBhY29zCithbmQgdGhlCisuRm4gYWNvc2YKK2Z1bmN0aW9ucyBjb21wdXRlIHRoZSBwcmluY2lwYWwgdmFsdWUgb2YgdGhlIGFyYyBjb3NpbmUgb2YKKy5GYSB4IC4KK0EgZG9tYWluIGVycm9yIG9jY3VycyBmb3IgYXJndW1lbnRzIG5vdCBpbiB0aGUgcmFuZ2UKKy5CcSAtMSAsICsxIC4KK0ZvciBhIGRpc2N1c3Npb24gb2YgZXJyb3IgZHVlIHRvIHJvdW5kb2ZmLCBzZWUKKy5YciBtYXRoIDMgLgorLlNoIFJFVFVSTiBWQUxVRVMKK1RoZQorLkZuIGFjb3MKK2FuZCB0aGUKKy5GbiBhY29zZgorZnVuY3Rpb25zIHJldHVybiB0aGUgYXJjIGNvc2luZSBpbiB0aGUgcmFuZ2UKKy5CcSAwICwgXCooUGkKK3JhZGlhbnMuCitJZjoKKy5CZCAtdW5maWxsZWQgLW9mZnNldCBpbmRlbnQKKy5QZiBcJnwgTnMgQXIgeCBOcyBcJnwgPiAxICwKKy5FZAorLlBwCisuRm4gYWNvcyB4CityYWlzZXMgYW4gaW52YWxpZCBleGNlcHRpb24gYW5kIHJldHVybnMgYW4gXCooTmEuCisuU2ggU0VFIEFMU08KKy5YciBhc2luIDMgLAorLlhyIGF0YW4gMyAsCisuWHIgYXRhbjIgMyAsCisuWHIgY29zIDMgLAorLlhyIGNvc2ggMyAsCisuWHIgZmVudiAzICwKKy5YciBtYXRoIDMgLAorLlhyIHNpbiAzICwKKy5YciBzaW5oIDMgLAorLlhyIHRhbiAzICwKKy5YciB0YW5oIDMKKy5TaCBTVEFOREFSRFMKK1RoZQorLkZuIGFjb3MKK2Z1bmN0aW9uIGNvbmZvcm1zIHRvCisuU3QgLWlzb0MgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vYWNvc2guMyBiL2xpYm0vbWFuL2Fjb3NoLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI1MzRhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2Fjb3NoLjMKQEAgLTAsMCArMSw4MiBAQAorLlwiIENvcHlyaWdodCAoYykgMTk5MSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKy5cIiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorLlwiCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorLlwiIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisuXCIgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisuXCIgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICAgICBmcm9tOiBAKCMpYWNvc2guMwk1LjIgKEJlcmtlbGV5KSA1LzYvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9hY29zaC4zLHYgMS4xMSAyMDA1LzAxLzE0IDIzOjI4OjI4IGRhcyBFeHAgJAorLlwiCisuRGQgSmFudWFyeSAxNCwgMjAwNQorLkR0IEFDT1NIIDMKKy5PcworLlNoIE5BTUUKKy5ObSBhY29zaCAsCisuTm0gYWNvc2hmCisuTmQgaW52ZXJzZSBoeXBlcmJvbGljIGNvc2luZSBmdW5jdGlvbnMKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gYWNvc2ggImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4gYWNvc2hmICJmbG9hdCB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiBhY29zaAorYW5kIHRoZQorLkZuIGFjb3NoZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIGludmVyc2UgaHlwZXJib2xpYyBjb3NpbmUKK29mIHRoZSByZWFsCithcmd1bWVudAorLkFyIHggLgorRm9yIGEgZGlzY3Vzc2lvbiBvZiBlcnJvciBkdWUgdG8gcm91bmRvZmYsIHNlZQorLlhyIG1hdGggMyAuCisuU2ggUkVUVVJOIFZBTFVFUworVGhlCisuRm4gYWNvc2gKK2FuZCB0aGUKKy5GbiBhY29zaGYKK2Z1bmN0aW9ucworcmV0dXJuIHRoZSBpbnZlcnNlIGh5cGVyYm9saWMgY29zaW5lIG9mCisuQXIgeCAuCitJZiB0aGUgYXJndW1lbnQgaXMgbGVzcyB0aGFuIDEsCisuRm4gYWNvc2gKK3JhaXNlcyBhbiBpbnZhbGlkIGV4Y2VwdGlvbiBhbmQgcmV0dXJucyBhbiBcKihOYS4KKy5TaCBTRUUgQUxTTworLlhyIGFzaW5oIDMgLAorLlhyIGF0YW5oIDMgLAorLlhyIGV4cCAzICwKKy5YciBmZW52IDMgLAorLlhyIG1hdGggMworLlNoIEhJU1RPUlkKK1RoZQorLkZuIGFjb3NoCitmdW5jdGlvbiBhcHBlYXJlZCBpbgorLkJ4IDQuMyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9hc2luLjMgYi9saWJtL21hbi9hc2luLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxODk5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2FzaW4uMwpAQCAtMCwwICsxLDk0IEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTkxIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKy5cIiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorLlwiCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorLlwiIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisuXCIgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisuXCIgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICAgICBmcm9tOiBAKCMpYXNpbi4zCTUuMSAoQmVya2VsZXkpIDUvMi85MQorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL2FzaW4uMyx2IDEuMTUgMjAwNS8wMS8xNCAyMzoyODoyOCBkYXMgRXhwICQKKy5cIgorLkRkIEphbnVhcnkgMTQsIDIwMDUKKy5EdCBBU0lOIDMKKy5PcworLlNoIE5BTUUKKy5ObSBhc2luICwKKy5ObSBhc2luZgorLk5kIGFyYyBzaW5lIGZ1bmN0aW9ucworLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBhc2luICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIGFzaW5mICJmbG9hdCB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiBhc2luCithbmQgdGhlCisuRm4gYXNpbmYKK2Z1bmN0aW9ucyBjb21wdXRlIHRoZSBwcmluY2lwYWwgdmFsdWUgb2YgdGhlIGFyYyBzaW5lIG9mCisuRmEgeCAuCitBIGRvbWFpbiBlcnJvciBvY2N1cnMgZm9yIGFyZ3VtZW50cyBub3QgaW4gdGhlIHJhbmdlCisuQnEgLTEgLCArMSAuCitGb3IgYSBkaXNjdXNzaW9uIG9mIGVycm9yIGR1ZSB0byByb3VuZG9mZiwgc2VlCisuWHIgbWF0aCAzIC4KKy5TaCBSRVRVUk4gVkFMVUVTCitUaGUKKy5GbiBhc2luCithbmQgdGhlCisuRm4gYXNpbmYKK2Z1bmN0aW9ucyByZXR1cm4gdGhlIGFyYyBzaW5lIGluIHRoZSByYW5nZQorLkJrIC13b3JkcworLkJxIC1cKihQaS8yICwgK1wqKFBpLzIKKy5FaworcmFkaWFucy4KK0lmOgorLkJkIC11bmZpbGxlZCAtb2Zmc2V0IGluZGVudAorLlBmIFwmfCBOcyBBciB4IE5zIFwmfCA+IDEKKy5FZAorLlBwCisuRm4gYXNpbiB4CityYWlzZXMgYW4gaW52YWxpZCBleGNlcHRpb24gYW5kIHJldHVybnMgYW4gXCooTmEuCisuU2ggU0VFIEFMU08KKy5YciBhY29zIDMgLAorLlhyIGF0YW4gMyAsCisuWHIgYXRhbjIgMyAsCisuWHIgY29zIDMgLAorLlhyIGNvc2ggMyAsCisuWHIgZmVudiAzICwKKy5YciBtYXRoIDMgLAorLlhyIHNpbiAzICwKKy5YciBzaW5oIDMgLAorLlhyIHRhbiAzICwKKy5YciB0YW5oIDMKKy5TaCBTVEFOREFSRFMKK1RoZQorLkZuIGFzaW4KK2Z1bmN0aW9uIGNvbmZvcm1zIHRvCisuU3QgLWlzb0MgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vYXNpbmguMyBiL2xpYm0vbWFuL2FzaW5oLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwZDlhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2FzaW5oLjMKQEAgLTAsMCArMSw3OCBAQAorLlwiIENvcHlyaWdodCAoYykgMTk4NSwgMTk5MSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKy5cIiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorLlwiCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorLlwiIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisuXCIgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisuXCIgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICAgICBmcm9tOiBAKCMpYXNpbmguMwk2LjQgKEJlcmtlbGV5KSA1LzYvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9hc2luaC4zLHYgMS4xMCAyMDAxLzEwLzEzIDEyOjIzOjIyIGJkZSBFeHAgJAorLlwiCisuRGQgTWF5IDYsIDE5OTEKKy5EdCBBU0lOSCAzCisuT3MKKy5TaCBOQU1FCisuTm0gYXNpbmggLAorLk5tIGFzaW5oZgorLk5kIGludmVyc2UgaHlwZXJib2xpYyBzaW5lIGZ1bmN0aW9ucworLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBhc2luaCAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBhc2luaGYgImZsb2F0IHgiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIGFzaW5oCithbmQgdGhlCisuRm4gYXNpbmhmCitmdW5jdGlvbnMgY29tcHV0ZSB0aGUgaW52ZXJzZSBoeXBlcmJvbGljIHNpbmUKK29mIHRoZSByZWFsCithcmd1bWVudAorLkFyIHggLgorRm9yIGEgZGlzY3Vzc2lvbiBvZiBlcnJvciBkdWUgdG8gcm91bmRvZmYsIHNlZQorLlhyIG1hdGggMyAuCisuU2ggUkVUVVJOIFZBTFVFUworVGhlCisuRm4gYXNpbmgKK2FuZCB0aGUKKy5GbiBhc2luaGYKK2Z1bmN0aW9ucworcmV0dXJuIHRoZSBpbnZlcnNlIGh5cGVyYm9saWMgc2luZSBvZgorLkFyIHggLgorLlNoIFNFRSBBTFNPCisuWHIgYWNvc2ggMyAsCisuWHIgYXRhbmggMyAsCisuWHIgZXhwIDMgLAorLlhyIG1hdGggMworLlNoIEhJU1RPUlkKK1RoZQorLkZuIGFzaW5oCitmdW5jdGlvbiBhcHBlYXJlZCBpbgorLkJ4IDQuMyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9hdGFuLjMgYi9saWJtL21hbi9hdGFuLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjZWZlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2F0YW4uMwpAQCAtMCwwICsxLDg0IEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTkxIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKy5cIiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorLlwiCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorLlwiIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisuXCIgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisuXCIgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICAgICBmcm9tOiBAKCMpYXRhbi4zCTUuMSAoQmVya2VsZXkpIDUvMi85MQorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL2F0YW4uMyx2IDEuMTAgMjAwMS8xMC8xMyAxMjoyMzoyMiBiZGUgRXhwICQKKy5cIgorLkRkIE1heSAyLCAxOTkxCisuRHQgQVRBTiAzCisuT3MKKy5TaCBOQU1FCisuTm0gYXRhbiAsCisuTm0gYXRhbmYKKy5OZCBhcmMgdGFuZ2VudCBmdW5jdGlvbnMgb2Ygb25lIHZhcmlhYmxlCisuU2ggTElCUkFSWQorLkxiIGxpYm0KKy5TaCBTWU5PUFNJUworLkluIG1hdGguaAorLkZ0IGRvdWJsZQorLkZuIGF0YW4gImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4gYXRhbmYgImZsb2F0IHgiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIGF0YW4KK2FuZCB0aGUKKy5GbiBhdGFuZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIHByaW5jaXBhbCB2YWx1ZSBvZiB0aGUgYXJjIHRhbmdlbnQgb2YKKy5GYSB4IC4KK0ZvciBhIGRpc2N1c3Npb24gb2YgZXJyb3IgZHVlIHRvIHJvdW5kb2ZmLCBzZWUKKy5YciBtYXRoIDMgLgorLlNoIFJFVFVSTiBWQUxVRVMKK1RoZQorLkZuIGF0YW4KK2FuZCB0aGUKKy5GbiBhdGFuZgorZnVuY3Rpb24gcmV0dXJucyB0aGUgYXJjIHRhbmdlbnQgaW4gdGhlIHJhbmdlCisuQmsgLXdvcmRzCisuQnEgLVwqKFBpLzIgLCArXCooUGkvMgorLkVrCityYWRpYW5zLgorLlNoIFNFRSBBTFNPCisuWHIgYWNvcyAzICwKKy5YciBhc2luIDMgLAorLlhyIGF0YW4yIDMgLAorLlhyIGNvcyAzICwKKy5YciBjb3NoIDMgLAorLlhyIG1hdGggMyAsCisuWHIgc2luIDMgLAorLlhyIHNpbmggMyAsCisuWHIgdGFuIDMgLAorLlhyIHRhbmggMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gYXRhbgorZnVuY3Rpb24gY29uZm9ybXMgdG8KKy5TdCAtaXNvQyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9hdGFuMi4zIGIvbGlibS9tYW4vYXRhbjIuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjFlMTdkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vYXRhbjIuMwpAQCAtMCwwICsxLDE4NyBAQAorLlwiIENvcHlyaWdodCAoYykgMTk5MSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKWF0YW4yLjMJNS4xIChCZXJrZWxleSkgNS8yLzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vYXRhbjIuMyx2IDEuMTQgMjAwNS8wMS8yOCAyMToxMzozNCBydSBFeHAgJAorLlwiCisuRGQgSmFudWFyeSAxNCwgMjAwNQorLkR0IEFUQU4yIDMKKy5PcworLlNoIE5BTUUKKy5ObSBhdGFuMiAsCisuTm0gYXRhbjJmCisuTmQgYXJjIHRhbmdlbnQgZnVuY3Rpb25zIG9mIHR3byB2YXJpYWJsZXMKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gYXRhbjIgImRvdWJsZSB5IiAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBhdGFuMmYgImZsb2F0IHkiICJmbG9hdCB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiBhdGFuMgorYW5kIHRoZQorLkZuIGF0YW4yZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIHByaW5jaXBhbCB2YWx1ZSBvZiB0aGUgYXJjIHRhbmdlbnQgb2YKKy5GYSB5LyBOcyBBciB4ICwKK3VzaW5nIHRoZSBzaWducyBvZiBib3RoIGFyZ3VtZW50cyB0byBkZXRlcm1pbmUgdGhlIHF1YWRyYW50IG9mCit0aGUgcmV0dXJuIHZhbHVlLgorLlNoIFJFVFVSTiBWQUxVRVMKK1RoZQorLkZuIGF0YW4yCithbmQgdGhlCisuRm4gYXRhbjJmCitmdW5jdGlvbnMsIGlmIHN1Y2Nlc3NmdWwsCityZXR1cm4gdGhlIGFyYyB0YW5nZW50IG9mCisuRmEgeS8gTnMgQXIgeAoraW4gdGhlIHJhbmdlCisuQmsgLXdvcmRzCisuQnEgXCYtIE5zIFwqKFBpICwgXCYrIE5zIFwqKFBpCisuRWsKK3JhZGlhbnMuCitIZXJlIGFyZSBzb21lIG9mIHRoZSBzcGVjaWFsIGNhc2VzOgorLkJsIC1jb2x1bW4gYXRhbl8oeSx4KV86PV9fX18gIHNpZ24oeSlfKFBpX2F0YW4yKFh5X3hYKSlfX18KKy5JdCBGbiBhdGFuMiB5IHggTm8gOj0gVGEKKy5GbiBhdGFuIHkveCBUYQoraWYKKy5BciB4Cis+IDAsCisuSXQgVGEgc2lnbiggTnMgQXIgeSBOcyApKihcKihQaSAtCisuRm4gYXRhbiAiXFwqKEJheS94XFwqKEJhIiApIFRhCitpZgorLkFyIHgKKzwgMCwKKy5JdCBUYQorLk5vIDAgVGEKK2lmIHggPSB5ID0gMCwgb3IKKy5JdCBUYQorLlBmIHNpZ24oIEFyIHkgTnMgKSpcXCooUGkvMiBUYQoraWYKKy5BciB4Cis9IDAgXCghPQorLkFyIHkgLgorLkVsCisuU2ggTk9URVMKK1RoZSBmdW5jdGlvbgorLkZuIGF0YW4yCitkZWZpbmVzICJpZiB4ID4gMCwiCisuRm4gYXRhbjIgMCAwCis9IDAgZGVzcGl0ZSB0aGF0IHByZXZpb3VzbHkKKy5GbiBhdGFuMiAwIDAKK21heSBoYXZlIGdlbmVyYXRlZCBhbiBlcnJvciBtZXNzYWdlLgorVGhlIHJlYXNvbnMgZm9yIGFzc2lnbmluZyBhIHZhbHVlIHRvCisuRm4gYXRhbjIgMCAwCithcmUgdGhlc2U6CisuQmwgLWVudW0gLW9mZnNldCBpbmRlbnQKKy5JdAorUHJvZ3JhbXMgdGhhdCB0ZXN0IGFyZ3VtZW50cyB0byBhdm9pZCBjb21wdXRpbmcKKy5GbiBhdGFuMiAwIDAKK211c3QgYmUgaW5kaWZmZXJlbnQgdG8gaXRzIHZhbHVlLgorUHJvZ3JhbXMgdGhhdCByZXF1aXJlIGl0IHRvIGJlIGludmFsaWQgYXJlIHZ1bG5lcmFibGUKK3RvIGRpdmVyc2UgcmVhY3Rpb25zIHRvIHRoYXQgaW52YWxpZGl0eSBvbiBkaXZlcnNlIGNvbXB1dGVyIHN5c3RlbXMuCisuSXQKK1RoZQorLkZuIGF0YW4yCitmdW5jdGlvbiBpcyB1c2VkIG1vc3RseSB0byBjb252ZXJ0IGZyb20gcmVjdGFuZ3VsYXIgKHgseSkKK3RvIHBvbGFyCisuaWYgblwKKyhyLHRoZXRhKQorLmlmIHRcCisocixcKCpoKQorY29vcmRpbmF0ZXMgdGhhdCBtdXN0IHNhdGlzZnkgeCA9CisuaWYgblwKK3JcKCoqY29zIHRoZXRhCisuaWYgdFwKK3JcKCoqY29zXCgqaAorYW5kIHkgPQorLmlmIG5cCityXCgqKnNpbiB0aGV0YS4KKy5pZiB0XAorclwoKipzaW5cKCpoLgorVGhlc2UgZXF1YXRpb25zIGFyZSBzYXRpc2ZpZWQgd2hlbiAoeD0wLHk9MCkKK2lzIG1hcHBlZCB0bworLmlmIG4gXAorKHI9MCx0aGV0YT0wKS4KKy5pZiB0IFwKKyhyPTAsXCgqaD0wKS4KK0luIGdlbmVyYWwsIGNvbnZlcnNpb25zIHRvIHBvbGFyIGNvb3JkaW5hdGVzCitzaG91bGQgYmUgY29tcHV0ZWQgdGh1czoKKy5CZCAtdW5maWxsZWQgLW9mZnNldCBpbmRlbnQKKy5pZiBuIFx7XAorcgk6PSBoeXBvdCh4LHkpOyAgLi4uIDo9IHNxcnQoeFwoKip4K3lcKCoqeSkKK3RoZXRhCTo9IGF0YW4yKHkseCkuCisuXH0KKy5pZiB0IFx7XAorcgk6PSBoeXBvdCh4LHkpOyAgLi4uIDo9IFwoc3IoeFx1XHM4MlxzMTBcZCt5XHVcczgyXHMxMFxkKQorXCgqaAk6PSBhdGFuMih5LHgpLgorLlx9CisuRWQKKy5JdAorVGhlIGZvcmVnb2luZyBmb3JtdWxhcyBuZWVkIG5vdCBiZSBhbHRlcmVkIHRvIGNvcGUgaW4gYQorcmVhc29uYWJsZSB3YXkgd2l0aCBzaWduZWQgemVyb3MgYW5kIGluZmluaXRpZXMKK29uIGEgbWFjaGluZSB0aGF0IGNvbmZvcm1zIHRvCisuVG4gSUVFRSA3NTQgOwordGhlIHZlcnNpb25zIG9mCisuWHIgaHlwb3QgMworYW5kCisuRm4gYXRhbjIKK3Byb3ZpZGVkIGZvcgorc3VjaCBhIG1hY2hpbmUgYXJlIGRlc2lnbmVkIHRvIGhhbmRsZSBhbGwgY2FzZXMuCitUaGF0IGlzIHdoeQorLkZuIGF0YW4yIFwoKy0wIFwtMAorPSBcKCstXCooUGkKK2ZvciBpbnN0YW5jZS4KK0luIGdlbmVyYWwgdGhlIGZvcm11bGFzIGFib3ZlIGFyZSBlcXVpdmFsZW50IHRvIHRoZXNlOgorLkJkIC11bmZpbGxlZCAtb2Zmc2V0IGluZGVudAorLmlmIG4gXAorciA6PSBzcXJ0KHhcKCoqeCt5XCgqKnkpOyBpZiByID0gMCB0aGVuIHggOj0gY29weXNpZ24oMSx4KTsKKy5pZiB0IFwKK3IgOj0gXChzcih4XCgqKngreVwoKip5KTtcMFwwaWYgciA9IDAgdGhlbiB4IDo9IGNvcHlzaWduKDEseCk7CisuRWQKKy5FbAorLlNoIFNFRSBBTFNPCisuWHIgYWNvcyAzICwKKy5YciBhc2luIDMgLAorLlhyIGF0YW4gMyAsCisuWHIgY29zIDMgLAorLlhyIGNvc2ggMyAsCisuWHIgbWF0aCAzICwKKy5YciBzaW4gMyAsCisuWHIgc2luaCAzICwKKy5YciB0YW4gMyAsCisuWHIgdGFuaCAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiBhdGFuMgorZnVuY3Rpb24gY29uZm9ybXMgdG8KKy5TdCAtaXNvQyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9hdGFuaC4zIGIvbGlibS9tYW4vYXRhbmguMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGNjMDFhCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vYXRhbmguMwpAQCAtMCwwICsxLDg1IEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTg1LCAxOTkxIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgICAgIGZyb206IEAoIylhdGFuaC4zCTUuMiAoQmVya2VsZXkpIDUvNi85MQorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL2F0YW5oLjMsdiAxLjEzIDIwMDUvMDEvMjggMjE6MTQ6MTYgcnUgRXhwICQKKy5cIgorLkRkIEphbnVhcnkgMTQsIDIwMDUKKy5EdCBBVEFOSCAzCisuT3MKKy5TaCBOQU1FCisuTm0gYXRhbmggLAorLk5tIGF0YW5oZgorLk5kIGludmVyc2UgaHlwZXJib2xpYyB0YW5nZW50IGZ1bmN0aW9ucworLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBhdGFuaCAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBhdGFuaGYgImZsb2F0IHgiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIGF0YW5oCithbmQgdGhlCisuRm4gYXRhbmhmCitmdW5jdGlvbnMgY29tcHV0ZSB0aGUgaW52ZXJzZSBoeXBlcmJvbGljIHRhbmdlbnQKK29mIHRoZSByZWFsCithcmd1bWVudAorLkFyIHggLgorRm9yIGEgZGlzY3Vzc2lvbiBvZiBlcnJvciBkdWUgdG8gcm91bmRvZmYsIHNlZQorLlhyIG1hdGggMyAuCisuU2ggUkVUVVJOIFZBTFVFUworVGhlCisuRm4gYXRhbmgKK2FuZCB0aGUKKy5GbiBhdGFuaGYKK2Z1bmN0aW9ucworcmV0dXJuIHRoZSBpbnZlcnNlIGh5cGVyYm9saWMgdGFuZ2VudCBvZgorLkFyIHgKK2lmIHN1Y2Nlc3NmdWwuCitJZiB0aGUgYXJndW1lbnQgaGFzIGFic29sdXRlIHZhbHVlIDEsIGEgZGl2aWRlLWJ5LXplcm8gZXhjZXB0aW9uCitpcyByYWlzZWQgYW5kIGFuIGluZmluaXR5IGlzIHJldHVybmVkLgorSWYKKy5BciB8eHwKKz4gMSwgYW4gaW52YWxpZCBleGNlcHRpb24gaXMgcmFpc2VkIGFuZCBhbiBcKihOYSBpcyByZXR1cm5lZC4KKy5TaCBTRUUgQUxTTworLlhyIGFjb3NoIDMgLAorLlhyIGFzaW5oIDMgLAorLlhyIGV4cCAzICwKKy5YciBmZW52IDMgLAorLlhyIG1hdGggMworLlNoIEhJU1RPUlkKK1RoZQorLkZuIGF0YW5oCitmdW5jdGlvbiBhcHBlYXJlZCBpbgorLkJ4IDQuMyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9jZWlsLjMgYi9saWJtL21hbi9jZWlsLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3OTAzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2NlaWwuMwpAQCAtMCwwICsxLDgyIEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTkxIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKy5cIiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorLlwiCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorLlwiIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisuXCIgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisuXCIgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICAgICBmcm9tOiBAKCMpY2VpbC4zCTUuMSAoQmVya2VsZXkpIDUvMi85MQorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL2NlaWwuMyx2IDEuMTUgMjAwNS8wMS8xMyAyMDozMzo0MiBzdGVmYW5mIEV4cCAkCisuXCIKKy5EZCBKYW51YXJ5IDEzLCAyMDA1CisuRHQgQ0VJTCAzCisuT3MKKy5TaCBOQU1FCisuTm0gY2VpbCAsCisuTm0gY2VpbGYgLAorLk5tIGNlaWxsCisuTmQgc21hbGxlc3QgaW50ZWdyYWwgdmFsdWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHgKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gY2VpbCAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBjZWlsZiAiZmxvYXQgeCIKKy5GdCAibG9uZyBkb3VibGUiCisuRm4gY2VpbGwgImxvbmcgZG91YmxlIHgiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIGNlaWwgLAorLkZuIGNlaWxmCithbmQKKy5GbiBjZWlsbAorZnVuY3Rpb25zIHJldHVybiB0aGUgc21hbGxlc3QgaW50ZWdyYWwgdmFsdWUKK2dyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bworLkZhIHggLAorZXhwcmVzc2VkIGFzIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgorLlNoIFNFRSBBTFNPCisuWHIgYWJzIDMgLAorLlhyIGZhYnMgMyAsCisuWHIgZmxvb3IgMyAsCisuWHIgaWVlZSAzICwKKy5YciBtYXRoIDMgLAorLlhyIHJpbnQgMyAsCisuWHIgcm91bmQgMyAsCisuWHIgdHJ1bmMgMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gY2VpbAorZnVuY3Rpb24gY29uZm9ybXMgdG8KKy5TdCAtaXNvQyAuCitUaGUKKy5GbiBjZWlsZgorYW5kCisuRm4gY2VpbGwKK2Z1bmN0aW9ucyBjb25mb3JtIHRvCisuU3QgLWlzb0MtOTkgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vY2ltYWcuMyBiL2xpYm0vbWFuL2NpbWFnLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY5ZTg0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2NpbWFnLjMKQEAgLTAsMCArMSw5NiBAQAorLlwiIENvcHlyaWdodCAoYykgMjAwNCBTdGVmYW4gRmFyZmVsZWRlcgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9jaW1hZy4zLHYgMS4yIDIwMDUvMDEvMTMgMTA6NDM6MDEgcnUgRXhwICQKKy5cIgorLkRkIEF1Z3VzdCA3LCAyMDA0CisuRHQgQ0lNQUcgMworLk9zCisuU2ggTkFNRQorLk5tIGNpbWFnICwgY2ltYWdmICwgY2ltYWdsICwKKy5ObSBjb25qICwgY29uamYgLCBjb25qbCAsCisuTm0gY3JlYWwgLCBjcmVhbGYgLCBjcmVhbGwKKy5OZCAiZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgY29tcGxleCBudW1iZXJzIgorLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBjb21wbGV4LmgKKy5GdCBkb3VibGUKKy5GbiBjaW1hZyAiZG91YmxlIGNvbXBsZXggeiIKKy5GdCBmbG9hdAorLkZuIGNpbWFnZiAiZmxvYXQgY29tcGxleCB6IgorLkZ0ICJsb25nIGRvdWJsZSIKKy5GbiBjaW1hZ2wgImxvbmcgZG91YmxlIGNvbXBsZXggeiIKKy5GdCAiZG91YmxlIGNvbXBsZXgiCisuRm4gY29uaiAiZG91YmxlIGNvbXBsZXggeiIKKy5GdCAiZmxvYXQgY29tcGxleCIKKy5GbiBjb25qZiAiZmxvYXQgY29tcGxleCB6IgorLkZ0ICJsb25nIGRvdWJsZSBjb21wbGV4IgorLkZuIGNvbmpsICJsb25nIGRvdWJsZSBjb21wbGV4IHoiCisuRnQgZG91YmxlCisuRm4gY3JlYWwgImRvdWJsZSBjb21wbGV4IHoiCisuRnQgZmxvYXQKKy5GbiBjcmVhbGYgImZsb2F0IGNvbXBsZXggeiIKKy5GdCAibG9uZyBkb3VibGUiCisuRm4gY3JlYWxsICJsb25nIGRvdWJsZSBjb21wbGV4IHoiCisuU2ggREVTQ1JJUFRJT04KK0xldAorLlNtIG9mZgorLkZhIGEgKyBiICogRW0gaQorLlNtIG9uCitkZW5vdGUgdGhlIGNvbXBsZXggbnVtYmVyCisuRmEgeiAuCisuUHAKK1RoZQorLkZuIGNpbWFnCitmdW5jdGlvbnMgcmV0dXJuIHRoZSBpbWFnaW5hcnkgcGFydAorLkZhIGIgLgorLlBwCitUaGUKKy5GbiBjb25qCitmdW5jdGlvbnMgcmV0dXJuIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZQorLlNtIG9mZgorLkZhIGEgLSBiICogRW0gaSAuCisuU20gb24KKy5QcAorVGhlCisuRm4gY3JlYWwKK2Z1bmN0aW9ucyByZXR1cm4gdGhlIHJlYWwgcGFydAorLkZhIGEgLgorLlNoIFNUQU5EQVJEUworVGhlCisuRm4gY2ltYWcgLAorLkZuIGNvbmoKK2FuZAorLkZuIGNyZWFsCitmdW5jdGlvbnMgY29uZm9ybSB0bworLlN0IC1pc29DLTk5IC4KKy5TaCBISVNUT1JZCitUaGUKKy5GbiBjaW1hZyAsCisuRm4gY29uagorYW5kCisuRm4gY3JlYWwKK2Z1bmN0aW9ucyBmaXJzdCBhcHBlYXJlZCBpbgorLkZ4IDUuMyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9jb3B5c2lnbi4zIGIvbGlibS9tYW4vY29weXNpZ24uMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2NlM2RjCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vY29weXNpZ24uMwpAQCAtMCwwICsxLDkwIEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTg1LCAxOTkxIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgICAgIGZyb206IEAoIylpZWVlLjMJNi40IChCZXJrZWxleSkgNS82LzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vY29weXNpZ24uMyx2IDEuMSAyMDA1LzAxLzI3IDA1OjQ2OjE2IGRhcyBFeHAgJAorLlwiCisuRGQgSmFudWFyeSAyNiwgMjAwNQorLkR0IENPUFlTSUdOIDMKKy5PcworLlNoIE5BTUUKKy5ObSBjb3B5c2lnbiAsCisuTm0gY29weXNpZ25mICwKKy5ObSBjb3B5c2lnbmwKKy5OZCBjb3B5IHNpZ24KKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gY29weXNpZ24gImRvdWJsZSB4IiAiZG91YmxlIHkiCisuRnQgZmxvYXQKKy5GbiBjb3B5c2lnbmYgImZsb2F0IHgiICJmbG9hdCB5IgorLkZ0IGxvbmcgZG91YmxlCisuRm4gY29weXNpZ25sICJsb25nIGRvdWJsZSB4IiAibG9uZyBkb3VibGUgeSIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gY29weXNpZ24gLAorLkZuIGNvcHlzaWduZgorYW5kCisuRm4gY29weXNpZ25sCitmdW5jdGlvbnMKK3JldHVybgorLkZhIHgKK3dpdGggaXRzIHNpZ24gY2hhbmdlZCB0bworLkZhIHkgTnMgJ3MgLgorLlNoIFNFRSBBTFNPCisuWHIgZmFicyAzICwKKy5YciBmZGltIDMgLAorLlhyIGllZWUgMyAsCisuWHIgbWF0aCAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiBjb3B5c2lnbiAsCisuRm4gY29weXNpZ25mICwKK2FuZAorLkZuIGNvcHlzaWdubAorcm91dGluZXMgY29uZm9ybSB0bworLlN0IC1pc29DLTk5IC4KK1RoZXkgaW1wbGVtZW50IHRoZSBDb3B5c2lnbiBmdW5jdGlvbiByZWNvbW1lbmRlZCBieQorLlN0IC1pZWVlNzU0IC4KKy5TaCBISVNUT1JZCitUaGUKKy5GbiBjb3B5c2lnbiAsCisuRm4gY29weXNpZ25mICwKK2FuZAorLkZuIGNvcHlzaWdubAorZnVuY3Rpb25zIGFwcGVhcmVkIGluCisuQnggNC4zICwKKy5GeCAyLjAgLAorYW5kCisuRnggNS4zICwKK3Jlc3BlY3RpdmVseS4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL2Nvcy4zIGIvbGlibS9tYW4vY29zLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUwYmQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2Nvcy4zCkBAIC0wLDAgKzEsODMgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTEgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgICAgIGZyb206IEAoIyljb3MuMwk1LjEgKEJlcmtlbGV5KSA1LzIvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9jb3MuMyx2IDEuMTEgMjAwMS8xMC8xMyAxMjoyMzoyMyBiZGUgRXhwICQKKy5cIgorLkRkIE1heSAyLCAxOTkxCisuRHQgQ09TIDMKKy5PcworLlNoIE5BTUUKKy5ObSBjb3MgLAorLk5tIGNvc2YKKy5OZCBjb3NpbmUgZnVuY3Rpb25zCisuU2ggTElCUkFSWQorLkxiIGxpYm0KKy5TaCBTWU5PUFNJUworLkluIG1hdGguaAorLkZ0IGRvdWJsZQorLkZuIGNvcyAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBjb3NmICJmbG9hdCB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiBjb3MKK2FuZCB0aGUKKy5GbiBjb3NmCitmdW5jdGlvbnMgY29tcHV0ZSB0aGUgY29zaW5lIG9mCisuRmEgeAorKG1lYXN1cmVkIGluIHJhZGlhbnMpLgorQSBsYXJnZSBtYWduaXR1ZGUgYXJndW1lbnQgbWF5IHlpZWxkIGEgcmVzdWx0IHdpdGggbGl0dGxlIG9yIG5vCitzaWduaWZpY2FuY2UuCitGb3IgYSBkaXNjdXNzaW9uIG9mIGVycm9yIGR1ZSB0byByb3VuZG9mZiwgc2VlCisuWHIgbWF0aCAzIC4KKy5TaCBSRVRVUk4gVkFMVUVTCitUaGUKKy5GbiBjb3MKK2FuZCB0aGUKKy5GbiBjb3NmCitmdW5jdGlvbnMgcmV0dXJuIHRoZSBjb3NpbmUgdmFsdWUuCisuU2ggU0VFIEFMU08KKy5YciBhY29zIDMgLAorLlhyIGFzaW4gMyAsCisuWHIgYXRhbiAzICwKKy5YciBhdGFuMiAzICwKKy5YciBjb3NoIDMgLAorLlhyIG1hdGggMyAsCisuWHIgc2luIDMgLAorLlhyIHNpbmggMyAsCisuWHIgdGFuIDMgLAorLlhyIHRhbmggMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gY29zCitmdW5jdGlvbiBjb25mb3JtcyB0bworLlN0IC1pc29DIC4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL2Nvc2guMyBiL2xpYm0vbWFuL2Nvc2guMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDdjMzNlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vY29zaC4zCkBAIC0wLDAgKzEsNzIgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODksIDE5OTEgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgICAgIGZyb206IEAoIyljb3NoLjMJNS4xIChCZXJrZWxleSkgNS8yLzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vY29zaC4zLHYgMS4xMiAyMDA1LzAxLzE0IDIzOjI4OjI4IGRhcyBFeHAgJAorLlwiCisuRGQgSmFudWFyeSAxNCwgMjAwNQorLkR0IENPU0ggMworLk9zCisuU2ggTkFNRQorLk5tIGNvc2ggLAorLk5tIGNvc2hmCisuTmQgaHlwZXJib2xpYyBjb3NpbmUgZnVuY3Rpb25zCisuU2ggTElCUkFSWQorLkxiIGxpYm0KKy5TaCBTWU5PUFNJUworLkluIG1hdGguaAorLkZ0IGRvdWJsZQorLkZuIGNvc2ggImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4gY29zaGYgImZsb2F0IHgiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIGNvc2gKK2FuZCB0aGUKKy5GbiBjb3NoZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIGh5cGVyYm9saWMgY29zaW5lIG9mCisuRmEgeCAuCisuU2ggU0VFIEFMU08KKy5YciBhY29zIDMgLAorLlhyIGFzaW4gMyAsCisuWHIgYXRhbiAzICwKKy5YciBhdGFuMiAzICwKKy5YciBjb3MgMyAsCisuWHIgbWF0aCAzICwKKy5YciBzaW4gMyAsCisuWHIgc2luaCAzICwKKy5YciB0YW4gMyAsCisuWHIgdGFuaCAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiBjb3NoCitmdW5jdGlvbiBjb25mb3JtcyB0bworLlN0IC1pc29DIC4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL2VyZi4zIGIvbGlibS9tYW4vZXJmLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI0Nzg3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2VyZi4zCkBAIC0wLDAgKzEsOTcgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODUsIDE5OTEgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKWVyZi4zCTYuNCAoQmVya2VsZXkpIDQvMjAvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9lcmYuMyx2IDEuMTEgMjAwNC8wNy8wMiAyMzo1MjoyMCBydSBFeHAgJAorLlwiCisuRGQgQXByaWwgMjAsIDE5OTEKKy5EdCBFUkYgMworLk9zCisuU2ggTkFNRQorLk5tIGVyZiAsCisuTm0gZXJmZiAsCisuTm0gZXJmYyAsCisuTm0gZXJmY2YKKy5OZCBlcnJvciBmdW5jdGlvbiBvcGVyYXRvcnMKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gZXJmICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIGVyZmYgImZsb2F0IHgiCisuRnQgZG91YmxlCisuRm4gZXJmYyAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBlcmZjZiAiZmxvYXQgeCIKKy5TaCBERVNDUklQVElPTgorVGhlc2UgZnVuY3Rpb25zIGNhbGN1bGF0ZSB0aGUgZXJyb3IgZnVuY3Rpb24gb2YKKy5GYSB4IC4KKy5QcAorVGhlCisuRm4gZXJmCithbmQgdGhlCisuRm4gZXJmZgorZnVuY3Rpb25zIGNhbGN1bGF0ZSB0aGUgZXJyb3IgZnVuY3Rpb24gb2YgeDsgd2hlcmUKKy5CZCAtcmFnZ2VkIC1vZmZzZXQgaW5kZW50CisuaWYgbiBce1wKK2VyZih4KSA9IDIvc3FydChwaSlcKCoqXHxpbnRlZ3JhbCBmcm9tIDAgdG8geCBvZiBleHAoXC10XCgqKnQpIGR0LgorXH0KKy5pZiB0IFx7XAorZXJmXHwoeCkgOj0KKygyL1woc3JcKCpwKVx8XChpc1xkXHM4XHowXHMxMFx1XHVcczh4XHMxMFxkXHxleHAoXC10XHVcczgyXHMxMFxkKVx8ZHQuCitcfQorLkVkCisuUHAKK1RoZQorLkZuIGVyZmMKK2FuZCB0aGUKKy5GbiBlcmZjZgorZnVuY3Rpb25zIGNhbGN1bGF0ZSB0aGUgY29tcGxlbWVudGFyeSBlcnJvciBmdW5jdGlvbiBvZgorLkZhIHggOwordGhhdCBpcworLkZuIGVyZmMKK3N1YnRyYWN0cyB0aGUgcmVzdWx0IG9mIHRoZSBlcnJvciBmdW5jdGlvbgorLkZuIGVyZiB4Citmcm9tIDEuMC4KK1RoaXMgaXMgdXNlZnVsLCBzaW5jZSBmb3IgbGFyZ2UKKy5GYSB4CitwbGFjZXMgZGlzYXBwZWFyLgorLlNoIFNFRSBBTFNPCisuWHIgbWF0aCAzCisuU2ggSElTVE9SWQorVGhlCisuRm4gZXJmCithbmQKKy5GbiBlcmZjCitmdW5jdGlvbnMgYXBwZWFyZWQgaW4KKy5CeCA0LjMgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vZXhwLjMgYi9saWJtL21hbi9leHAuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmFlZDhmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vZXhwLjMKQEAgLTAsMCArMSwyMzYgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODUsIDE5OTEgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKWV4cC4zCTYuMTIgKEJlcmtlbGV5KSA3LzMxLzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vZXhwLjMsdiAxLjIyIDIwMDUvMDQvMDUgMDI6NTc6MjggZGFzIEV4cCAkCisuXCIKKy5EZCBBcHJpbCA1LCAyMDA1CisuRHQgRVhQIDMKKy5PcworLlNoIE5BTUUKKy5ObSBleHAgLAorLk5tIGV4cGYgLAorLlwiIFRoZSBzb3J0aW5nIGVycm9yIGlzIGludGVudGlvbmFsLiAgZXhwIGFuZCBleHBmIHNob3VsZCBiZSBhZGphY2VudC4KKy5ObSBleHAyICwKKy5ObSBleHAyZiAsCisuTm0gZXhwbTEgLAorLk5tIGV4cG0xZiAsCisuTm0gbG9nICwKKy5ObSBsb2dmICwKKy5ObSBsb2cxMCAsCisuTm0gbG9nMTBmICwKKy5ObSBsb2cxcCAsCisuTm0gbG9nMXBmICwKKy5ObSBwb3cgLAorLk5tIHBvd2YKKy5OZCBleHBvbmVudGlhbCwgbG9nYXJpdGhtLCBwb3dlciBmdW5jdGlvbnMKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gZXhwICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIGV4cGYgImZsb2F0IHgiCisuRnQgZG91YmxlCisuRm4gZXhwMiAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBleHAyZiAiZmxvYXQgeCIKKy5GdCBkb3VibGUKKy5GbiBleHBtMSAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBleHBtMWYgImZsb2F0IHgiCisuRnQgZG91YmxlCisuRm4gbG9nICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIGxvZ2YgImZsb2F0IHgiCisuRnQgZG91YmxlCisuRm4gbG9nMTAgImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4gbG9nMTBmICJmbG9hdCB4IgorLkZ0IGRvdWJsZQorLkZuIGxvZzFwICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIGxvZzFwZiAiZmxvYXQgeCIKKy5GdCBkb3VibGUKKy5GbiBwb3cgImRvdWJsZSB4IiAiZG91YmxlIHkiCisuRnQgZmxvYXQKKy5GbiBwb3dmICJmbG9hdCB4IiAiZmxvYXQgeSIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gZXhwCithbmQgdGhlCisuRm4gZXhwZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIGJhc2UKKy5NcyBlCitleHBvbmVudGlhbCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gYXJndW1lbnQKKy5GYSB4IC4KKy5QcAorVGhlCisuRm4gZXhwMgorYW5kIHRoZQorLkZuIGV4cDJmCitmdW5jdGlvbnMgY29tcHV0ZSB0aGUgYmFzZSAyIGV4cG9uZW50aWFsIG9mIHRoZSBnaXZlbiBhcmd1bWVudAorLkZhIHggLgorLlBwCitUaGUKKy5GbiBleHBtMQorYW5kIHRoZQorLkZuIGV4cG0xZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIHZhbHVlIGV4cCh4KVwtMSBhY2N1cmF0ZWx5IGV2ZW4gZm9yIHRpbnkgYXJndW1lbnQKKy5GYSB4IC4KKy5QcAorVGhlCisuRm4gbG9nCithbmQgdGhlCisuRm4gbG9nZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIHZhbHVlIG9mIHRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiBhcmd1bWVudAorLkZhIHggLgorLlBwCitUaGUKKy5GbiBsb2cxMAorYW5kIHRoZQorLkZuIGxvZzEwZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIHZhbHVlIG9mIHRoZSBsb2dhcml0aG0gb2YgYXJndW1lbnQKKy5GYSB4Cit0byBiYXNlIDEwLgorLlBwCitUaGUKKy5GbiBsb2cxcAorYW5kIHRoZQorLkZuIGxvZzFwZgorZnVuY3Rpb25zIGNvbXB1dGUKK3RoZSB2YWx1ZSBvZiBsb2coMSt4KSBhY2N1cmF0ZWx5IGV2ZW4gZm9yIHRpbnkgYXJndW1lbnQKKy5GYSB4IC4KKy5QcAorVGhlCisuRm4gcG93CithbmQgdGhlCisuRm4gcG93ZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIHZhbHVlCitvZgorLkFyIHgKK3RvIHRoZSBleHBvbmVudAorLkFyIHkgLgorLlNoIEVSUk9SIChkdWUgdG8gUm91bmRvZmYgZXRjLikKK1RoZSB2YWx1ZXMgb2YKKy5GbiBleHAgMCAsCisuRm4gZXhwbTEgMCAsCisuRm4gZXhwMiBpbnRlZ2VyICwKK2FuZAorLkZuIHBvdyBpbnRlZ2VyIGludGVnZXIKK2FyZSBleGFjdCBwcm92aWRlZCB0aGF0IHRoZXkgYXJlIHJlcHJlc2VudGFibGUuCisuXCIgWFhYIElzIHRoaXMgcmVhbGx5IHRydWUgZm9yIHBvdygpPworT3RoZXJ3aXNlIHRoZSBlcnJvciBpbiB0aGVzZSBmdW5jdGlvbnMgaXMgZ2VuZXJhbGx5IGJlbG93IG9uZQorLkVtIHVscCAuCisuU2ggUkVUVVJOIFZBTFVFUworVGhlc2UgZnVuY3Rpb25zIHdpbGwgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBjb21wdXRhdGlvbiB1bmxlc3MgYW4gZXJyb3IKK29jY3VycyBvciBhbiBhcmd1bWVudCBpcyBvdXQgb2YgcmFuZ2UuCitUaGUgZnVuY3Rpb25zCisuRm4gcG93IHggeQorYW5kCisuRm4gcG93ZiB4IHkKK3JhaXNlIGFuIGludmFsaWQgZXhjZXB0aW9uIGFuZCByZXR1cm4gYW4gXCooTmEgaWYKKy5GYSB4Cis8IDAgYW5kCisuRmEgeQoraXMgbm90IGFuIGludGVnZXIuCitBbiBhdHRlbXB0IHRvIHRha2UgdGhlIGxvZ2FyaXRobSBvZiBcKihQbTAgd2lsbCByZXN1bHQgaW4KK2EgZGl2aWRlLWJ5LXplcm8gZXhjZXB0aW9uLCBhbmQgYW4gaW5maW5pdHkgd2lsbCBiZSByZXR1cm5lZC4KK0FuIGF0dGVtcHQgdG8gdGFrZSB0aGUgbG9nYXJpdGhtIG9mIGEgbmVnYXRpdmUgbnVtYmVyIHdpbGwKK3Jlc3VsdCBpbiBhbiBpbnZhbGlkIGV4Y2VwdGlvbiwgYW5kIGFuIFwqKE5hIHdpbGwgYmUgZ2VuZXJhdGVkLgorLlNoIE5PVEVTCitUaGUgZnVuY3Rpb25zIGV4cCh4KVwtMSBhbmQgbG9nKDEreCkgYXJlIGNhbGxlZAorZXhwbTEgYW5kIGxvZ3AxIGluCisuVG4gQkFTSUMKK29uIHRoZSBIZXdsZXR0XC1QYWNrYXJkCisuVG4gSFAgTnMgXC03MUIKK2FuZAorLlRuIEFQUExFCitNYWNpbnRvc2gsCisuVG4gRVhQMQorYW5kCisuVG4gTE4xCitpbiBQYXNjYWwsIGV4cDEgYW5kIGxvZzEgaW4gQworb24KKy5UbiBBUFBMRQorTWFjaW50b3NoZXMsIHdoZXJlIHRoZXkgaGF2ZSBiZWVuIHByb3ZpZGVkIHRvIG1ha2UKK3N1cmUgZmluYW5jaWFsIGNhbGN1bGF0aW9ucyBvZiAoKDEreCkqKm5cLTEpL3gsIG5hbWVseQorZXhwbTEoblwoKipsb2cxcCh4KSkveCwgd2lsbCBiZSBhY2N1cmF0ZSB3aGVuIHggaXMgdGlueS4KK1RoZXkgYWxzbyBwcm92aWRlIGFjY3VyYXRlIGludmVyc2UgaHlwZXJib2xpYyBmdW5jdGlvbnMuCisuUHAKK1RoZSBmdW5jdGlvbgorLkZuIHBvdyB4IDAKK3JldHVybnMgeCoqMCA9IDEgZm9yIGFsbCB4IGluY2x1ZGluZyB4ID0gMCwgXCooSWYsIGFuZCBcKihOYSAuCitQcmV2aW91cyBpbXBsZW1lbnRhdGlvbnMgb2YgcG93IG1heQoraGF2ZSBkZWZpbmVkIHgqKjAgdG8gYmUgdW5kZWZpbmVkIGluIHNvbWUgb3IgYWxsIG9mIHRoZXNlCitjYXNlcy4KK0hlcmUgYXJlIHJlYXNvbnMgZm9yIHJldHVybmluZyB4KiowID0gMSBhbHdheXM6CisuQmwgLWVudW0gLXdpZHRoIGluZGVudAorLkl0CitBbnkgcHJvZ3JhbSB0aGF0IGFscmVhZHkgdGVzdHMgd2hldGhlciB4IGlzIHplcm8gKG9yCitpbmZpbml0ZSBvciBcKihOYSkgYmVmb3JlIGNvbXB1dGluZyB4KiowIGNhbm5vdCBjYXJlCit3aGV0aGVyIDAqKjAgPSAxIG9yIG5vdC4KK0FueSBwcm9ncmFtIHRoYXQgZGVwZW5kcwordXBvbiAwKiowIHRvIGJlIGludmFsaWQgaXMgZHViaW91cyBhbnl3YXkgc2luY2UgdGhhdAorZXhwcmVzc2lvbidzIG1lYW5pbmcgYW5kLCBpZiBpbnZhbGlkLCBpdHMgY29uc2VxdWVuY2VzCit2YXJ5IGZyb20gb25lIGNvbXB1dGVyIHN5c3RlbSB0byBhbm90aGVyLgorLkl0CitTb21lIEFsZ2VicmEgdGV4dHMgKGUuZy5cJiBTaWdsZXIncykgZGVmaW5lIHgqKjAgPSAxIGZvcgorYWxsIHgsIGluY2x1ZGluZyB4ID0gMC4KK1RoaXMgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBjb252ZW50aW9uIHRoYXQgYWNjZXB0cyBhWzBdCithcyB0aGUgdmFsdWUgb2YgcG9seW5vbWlhbAorLkJkIC1saXRlcmFsIC1vZmZzZXQgaW5kZW50CitwKHgpID0gYVswXVwoKip4KiowICsgYVsxXVwoKip4KioxICsgYVsyXVwoKip4KioyICsuLi4rIGFbbl1cKCoqeCoqbgorLkVkCisuUHAKK2F0IHggPSAwIHJhdGhlciB0aGFuIHJlamVjdCBhWzBdXCgqKjAqKjAgYXMgaW52YWxpZC4KKy5JdAorQW5hbHlzdHMgd2lsbCBhY2NlcHQgMCoqMCA9IDEgZGVzcGl0ZSB0aGF0IHgqKnkgY2FuCithcHByb2FjaCBhbnl0aGluZyBvciBub3RoaW5nIGFzIHggYW5kIHkgYXBwcm9hY2ggMAoraW5kZXBlbmRlbnRseS4KK1RoZSByZWFzb24gZm9yIHNldHRpbmcgMCoqMCA9IDEgYW55d2F5IGlzIHRoaXM6CisuQmQgLXJhZ2dlZCAtb2Zmc2V0IGluZGVudAorSWYgeCh6KSBhbmQgeSh6KSBhcmUKKy5FbSBhbnkKK2Z1bmN0aW9ucyBhbmFseXRpYyAoZXhwYW5kYWJsZQoraW4gcG93ZXIgc2VyaWVzKSBpbiB6IGFyb3VuZCB6ID0gMCwgYW5kIGlmIHRoZXJlCit4KDApID0geSgwKSA9IDAsIHRoZW4geCh6KSoqeSh6KSBcKC0+IDEgYXMgeiBcKC0+IDAuCisuRWQKKy5JdAorSWYgMCoqMCA9IDEsIHRoZW4KK1wqKElmKiowID0gMS8wKiowID0gMSB0b287IGFuZAordGhlbiBcKihOYSoqMCA9IDEgdG9vIGJlY2F1c2UgeCoqMCA9IDEgZm9yIGFsbCBmaW5pdGUKK2FuZCBpbmZpbml0ZSB4LCBpLmUuLCBpbmRlcGVuZGVudGx5IG9mIHguCisuRWwKKy5TaCBTRUUgQUxTTworLlhyIGZlbnYgMyAsCisuWHIgbWF0aCAzCmRpZmYgLS1naXQgYS9saWJtL21hbi9mYWJzLjMgYi9saWJtL21hbi9mYWJzLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiM2EyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2ZhYnMuMwpAQCAtMCwwICsxLDg3IEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTkxIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiCUAoIylmYWJzLjMJNS4xIChCZXJrZWxleSkgNS8yLzkxCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgICAgIGZyb206IEAoIylmYWJzLjMJNS4xIChCZXJrZWxleSkgNS8yLzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vZmFicy4zLHYgMS4xMSAyMDA0LzA3LzAxIDE4OjIwOjU3IHJ1IEV4cCAkCisuXCIKKy5EZCBPY3RvYmVyIDI1LCAyMDAzCisuRHQgRkFCUyAzCisuT3MKKy5TaCBOQU1FCisuTm0gZmFicyAsCisuTm0gZmFic2YgLAorLk5tIGZhYnNsCisuTmQgZmxvYXRpbmctcG9pbnQgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb25zCisuU2ggTElCUkFSWQorLkxiIGxpYm0KKy5TaCBTWU5PUFNJUworLkluIG1hdGguaAorLkZ0IGRvdWJsZQorLkZuIGZhYnMgImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4gZmFic2YgImZsb2F0IHgiCisuRnQgbG9uZyBkb3VibGUKKy5GbiBmYWJzbCAibG9uZyBkb3VibGUgeCIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gZmFicyAsCisuRm4gZmFic2YKK2FuZAorLkZuIGZhYnNsCitmdW5jdGlvbnMgY29tcHV0ZSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgYSBmbG9hdGluZy1wb2ludCBudW1iZXIKKy5GYSB4IC4KKy5TaCBSRVRVUk4gVkFMVUVTCitUaGUKKy5GbiBmYWJzICwKKy5GbiBmYWJzZgorYW5kCisuRm4gZmFic2wKK2Z1bmN0aW9ucyByZXR1cm4gdGhlIGFic29sdXRlIHZhbHVlIG9mCisuRmEgeCAuCisuU2ggU0VFIEFMU08KKy5YciBhYnMgMyAsCisuWHIgY2VpbCAzICwKKy5YciBmbG9vciAzICwKKy5YciBpZWVlIDMgLAorLlhyIG1hdGggMyAsCisuWHIgcmludCAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiBmYWJzCitmdW5jdGlvbiBjb25mb3JtcyB0bworLlN0IC1pc29DIC4KK1RoZQorLkZuIGZhYnNmCithbmQKKy5GbiBmYWJzbAorZnVuY3Rpb25zIGNvbmZvcm0gdG8KKy5TdCAtaXNvQy05OSAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9mZGltLjMgYi9saWJtL21hbi9mZGltLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E0ZTVlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2ZkaW0uMwpAQCAtMCwwICsxLDg2IEBACisuXCIgQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELm9yZz4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vZmRpbS4zLHYgMS4xIDIwMDQvMDYvMzAgMDc6MDQ6MDEgZGFzIEV4cCAkCisuXCIKKy5EZCBKdW5lIDI5LCAyMDA0CisuRHQgRkRJTSAzCisuT3MKKy5TaCBOQU1FCisuTm0gZmRpbSAsCisuTm0gZmRpbWYgLAorLk5tIGZkaW1sCisuTmQgcG9zaXRpdmUgZGlmZmVyZW5jZSBmdW5jdGlvbnMKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gZmRpbSAiZG91YmxlIHgiICJkb3VibGUgeSIKKy5GdCBmbG9hdAorLkZuIGZkaW1mICJmbG9hdCB4IiAiZmxvYXQgeSIKKy5GdCBsb25nIGRvdWJsZQorLkZuIGZkaW1sICJsb25nIGRvdWJsZSB4IiAibG9uZyBkb3VibGUgeSIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gZmRpbSAsCisuRm4gZmRpbWYgLAorYW5kCisuRm4gZmRpbWwKK2Z1bmN0aW9ucyByZXR1cm4gdGhlIHBvc2l0aXZlIGRpZmZlcmVuY2UgYmV0d2VlbgorLkZhIHgKK2FuZAorLkZhIHkgLgorVGhhdCBpcywgaWYKKy5GYSB4XC0gTnMgRmEgeQoraXMgcG9zaXRpdmUsIHRoZW4KKy5GYSB4XC0gTnMgRmEgeQoraXMgcmV0dXJuZWQuCitJZiBlaXRoZXIKKy5GYSB4CitvcgorLkZhIHkKK2lzIGFuIFwqKE5hLCB0aGVuIGFuIFwqKE5hIGlzIHJldHVybmVkLgorT3RoZXJ3aXNlLCB0aGUgcmVzdWx0IGlzCisuTGkgKzAuMCAuCisuUHAKK092ZXJmbG93IG9yIHVuZGVyZmxvdyBtYXkgb2NjdXIgaWZmIHRoZSBleGFjdCByZXN1bHQgaXMgbm90CityZXByZXNlbnRhYmxlIGluIHRoZSByZXR1cm4gdHlwZS4KK05vIG90aGVyIGV4Y2VwdGlvbnMgYXJlIHJhaXNlZC4KKy5TaCBTRUUgQUxTTworLlhyIGZhYnMgMyAsCisuWHIgZm1heCAzICwKKy5YciBmbWluIDMgLAorLlhyIG1hdGggMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gZmRpbSAsCisuRm4gZmRpbWYgLAorYW5kCisuRm4gZmRpbWwKK2Z1bmN0aW9ucyBjb25mb3JtIHRvCisuU3QgLWlzb0MtOTkgLgorLlNoIEhJU1RPUlkKK1RoZXNlIHJvdXRpbmVzIGZpcnN0IGFwcGVhcmVkIGluCisuRnggNS4zIC4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL2ZlY2xlYXJleGNlcHQuMyBiL2xpYm0vbWFuL2ZlY2xlYXJleGNlcHQuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzNkZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vZmVjbGVhcmV4Y2VwdC4zCkBAIC0wLDAgKzEsMTM5IEBACisuXCIgQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELm9yZz4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vZmVjbGVhcmV4Y2VwdC4zLHYgMS4zIDIwMDUvMDEvMTQgMDk6MTI6MDUgcnUgRXhwICQKKy5cIgorLkRkIE1heSA4LCAyMDA0CisuRHQgRkVDTEVBUkVYQ0VQVCAzCisuT3MKKy5TaCBOQU1FCisuTm0gZmVjbGVhcmV4Y2VwdCAsCisuTm0gZmVnZXRleGNlcHRmbGFnICwKKy5ObSBmZXJhaXNlZXhjZXB0ICwKKy5ObSBmZXNldGV4Y2VwdGZsYWcgLAorLk5tIGZldGVzdGV4Y2VwdAorLk5kIGZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbiBmbGFnIG1hbmlwdWxhdGlvbgorLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBmZW52LmgKKy5GZCAiI3ByYWdtYSBTVERDIEZFTlZfQUNDRVNTIE9OIgorLkZ0IGludAorLkZuIGZlY2xlYXJleGNlcHQgImludCBleGNlcHRzIgorLkZ0IGludAorLkZuIGZlZ2V0ZXhjZXB0ZmxhZyAiZmV4Y2VwdF90ICpmbGFncCIgImludCBleGNlcHRzIgorLkZ0IGludAorLkZuIGZlcmFpc2VleGNlcHQgImludCBleGNlcHRzIgorLkZ0IGludAorLkZuIGZlc2V0ZXhjZXB0ZmxhZyAiY29uc3QgZmV4Y2VwdF90ICpmbGFncCIgImludCBleGNlcHRzIgorLkZ0IGludAorLkZuIGZldGVzdGV4Y2VwdCAiaW50IGV4Y2VwdHMiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIGZlY2xlYXJleGNlcHQKK3JvdXRpbmUgY2xlYXJzIHRoZSBmbG9hdGluZy1wb2ludCBleGNlcHRpb24gZmxhZ3Mgc3BlY2lmaWVkIGJ5CisuRmEgZXhjZXB0cyAsCit3aGVyZWFzCisuRm4gZmVyYWlzZWV4Y2VwdAorcmFpc2VzIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9ucy4KK1JhaXNpbmcgYW4gZXhjZXB0aW9uIGNhdXNlcyB0aGUgY29ycmVzcG9uZGluZyBmbGFnIHRvIGJlIHNldCwKK2FuZCBhCisuRHYgU0lHRlBFCitpcyBkZWxpdmVyZWQgdG8gdGhlIHByb2Nlc3MgaWYgdGhlIGV4Y2VwdGlvbiBpcyB1bm1hc2tlZC4KKy5QcAorVGhlCisuRm4gZmV0ZXN0ZXhjZXB0CitmdW5jdGlvbiBkZXRlcm1pbmVzIHdoaWNoIGZsYWdzIGFyZSBjdXJyZW50bHkgc2V0LCBvZiB0aG9zZSBzcGVjaWZpZWQgYnkKKy5GYSBleGNlcHRzIC4KKy5QcAorVGhlCisuRm4gZmVnZXRleGNlcHRmbGFnCitmdW5jdGlvbiBzdG9yZXMgdGhlIHN0YXRlIG9mIHRoZSBleGNlcHRpb24gZmxhZ3Mgc3BlY2lmaWVkIGluCisuRmEgZXhjZXB0cworaW4gdGhlIG9wYXF1ZSBvYmplY3QgcG9pbnRlZCB0byBieQorLkZhIGZsYWdwIC4KK1NpbWlsYXJseSwKKy5GbiBmZXNldGV4Y2VwdGZsYWcKK2NoYW5nZXMgdGhlIHNwZWNpZmllZCBleGNlcHRpb24gZmxhZ3MgdG8gcmVmbGVjdCB0aGUgc3RhdGUgc3RvcmVkIGluCit0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkKKy5GYSBmbGFncCAuCitOb3RlIHRoYXQgdGhlIGZsYWdzIHJlc3RvcmVkIHdpdGgKKy5GbiBmZXNldGV4Y2VwdGZsYWcKK211c3QgYmUgYSAobm90IG5lY2Vzc2FyaWx5IHByb3Blcikgc3Vic2V0IG9mIHRoZSBmbGFncyByZWNvcmRlZCBieQorYSBwcmlvciBjYWxsIHRvCisuRm4gZmVnZXRleGNlcHRmbGFnIC4KKy5QcAorRm9yIGFsbCBvZiB0aGVzZSBmdW5jdGlvbnMsIHRoZSBwb3NzaWJsZSB0eXBlcyBvZiBleGNlcHRpb25zCitpbmNsdWRlIHRob3NlIGRlc2NyaWJlZCBpbgorLlhyIGZlbnYgMyAuCitTb21lIGFyY2hpdGVjdHVyZXMgbWF5IGRlZmluZSBvdGhlciB0eXBlcyBvZiBmbG9hdGluZy1wb2ludCBleGNlcHRpb25zLgorLlNoIElNUExFTUVOVEFUSU9OIE5PVEVTCitPbiBzb21lIGFyY2hpdGVjdHVyZXMsIHJhaXNpbmcgYW4gb3ZlcmZsb3cgb3IgdW5kZXJmbG93IGV4Y2VwdGlvbgorYWxzbyBjYXVzZXMgYW4gaW5leGFjdCBleGNlcHRpb24gdG8gYmUgcmFpc2VkLgorSW4gdGhlc2UgY2FzZXMsIHRoZSBvdmVyZmxvdyBvciB1bmRlcmZsb3cgd2lsbCBiZSByYWlzZWQgZmlyc3QuCisuUHAKK1RoZQorLkZuIGZlZ2V0ZXhjZXB0ZmxhZworYW5kCisuRm4gZmVzZXRleGNlcHRmbGFnCityb3V0aW5lcyBhcmUgcHJlZmVycmVkIHRvCisuRm4gZmV0ZXN0ZXhjZXB0CithbmQKKy5GbiBmZXJhaXNlZXhjZXB0ICwKK3Jlc3BlY3RpdmVseSwgZm9yIHNhdmluZyBhbmQgcmVzdG9yaW5nIGV4Y2VwdGlvbiBmbGFncy4KK1RoZSBsYXR0ZXIgZG8gbm90IHJlLXJhaXNlIGV4Y2VwdGlvbnMgYW5kIG1heSBwcmVzZXJ2ZQorYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGluZm9ybWF0aW9uIHN1Y2ggYXMgYWRkcmVzc2VzIHdoZXJlCitleGNlcHRpb25zIG9jY3VycmVkLgorLlNoIFJFVFVSTiBWQUxVRVMKK1RoZQorLkZuIGZlY2xlYXJleGNlcHQgLAorLkZuIGZlZ2V0ZXhjZXB0ZmxhZyAsCisuRm4gZmVyYWlzZWV4Y2VwdCAsCithbmQKKy5GbiBmZXNldGV4Y2VwdGZsYWcKK2Z1bmN0aW9ucyByZXR1cm4gMCB1cG9uIHN1Y2Nlc3MsIGFuZCBub24temVybyBvdGhlcndpc2UuCitUaGUKKy5GbiBmZXRlc3RleGNlcHQKK2Z1bmN0aW9uIHJldHVybnMgdGhlIGJpdHdpc2UgT1Igb2YgdGhlIHZhbHVlcyBvZiB0aGUgY3VycmVudCBleGNlcHRpb24KK2ZsYWdzIHRoYXQgd2VyZSByZXF1ZXN0ZWQuCisuU2ggU0VFIEFMU08KKy5YciBzaWdhY3Rpb24gMiAsCisuWHIgZmVob2xkZXhjZXB0IDMgLAorLlhyIGZlbnYgMyAsCisuWHIgZmV1cGRhdGVlbnYgMyAsCisuWHIgZnBnZXRzdGlja3kgMyAsCisuWHIgZnByZXNldHN0aWNreSAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiBmZWNsZWFyZXhjZXB0ICwKKy5GbiBmZWdldGV4Y2VwdGZsYWcgLAorLkZuIGZlcmFpc2VleGNlcHQgLAorLkZuIGZlc2V0ZXhjZXB0ZmxhZyAsCithbmQKKy5GbiBmZXRlc3RleGNlcHQKK3JvdXRpbmVzIGNvbmZvcm0gdG8KKy5TdCAtaXNvQy05OSAuCisuU2ggSElTVE9SWQorVGhlc2UgZnVuY3Rpb25zIGZpcnN0IGFwcGVhcmVkIGluCisuRnggNS4zIC4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL2ZlZW5hYmxlZXhjZXB0LjMgYi9saWJtL21hbi9mZWVuYWJsZWV4Y2VwdC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNzkwZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi9mZWVuYWJsZWV4Y2VwdC4zCkBAIC0wLDAgKzEsOTggQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0Qub3JnPgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9mZWVuYWJsZWV4Y2VwdC4zLHYgMS4xIDIwMDUvMDMvMTYgMTk6MDQ6MjggZGFzIEV4cCAkCisuXCIKKy5EZCBNYXJjaCAxNiwgMjAwNQorLkR0IEZFRU5BQkxFRVhDRVBUIDMKKy5PcworLlNoIE5BTUUKKy5ObSBmZWVuYWJsZWV4Y2VwdCAsCisuTm0gZmVkaXNhYmxlZXhjZXB0ICwKKy5ObSBmZWdldGV4Y2VwdAorLk5kIGZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbiBtYXNraW5nCisuU2ggTElCUkFSWQorLkxiIGxpYm0KKy5TaCBTWU5PUFNJUworLkluIGZlbnYuaAorLkZkICIjcHJhZ21hIFNUREMgRkVOVl9BQ0NFU1MgT04iCisuRnQgaW50CisuRm4gZmVlbmFibGVleGNlcHQgImludCBleGNlcHRzIgorLkZ0IGludAorLkZuIGZlZGlzYWJsZWV4Y2VwdCAiaW50IGV4Y2VwdHMiCisuRnQgaW50CisuRm4gZmVnZXRleGNlcHQgInZvaWQiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIGZlZW5hYmxlZXhjZXB0CithbmQKKy5GbiBmZWRpc2FibGVleGNlcHQKK2Z1bmN0aW9ucwordW5tYXNrIGFuZCBtYXNrIChyZXNwZWN0aXZlbHkpIGV4Y2VwdGlvbnMgc3BlY2lmaWVkIGluCisuRmEgZXhjZXB0cyAuCitUaGUKKy5GbiBmZWdldGV4Y2VwdAorZnVuY3Rpb24KK3JldHVybnMgdGhlIGN1cnJlbnQgZXhjZXB0aW9uIG1hc2suCitBbGwgZXhjZXB0aW9ucyBhcmUgbWFza2VkIGJ5IGRlZmF1bHQuCisuUHAKK0Zsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgdGhhdCBwcm9kdWNlIHVubWFza2VkIGV4Y2VwdGlvbnMgd2lsbCB0cmFwLCBhbmQgYQorLkR2IFNJR0ZQRQord2lsbCBiZSBkZWxpdmVyZWQgdG8gdGhlIHByb2Nlc3MuCitCeSBpbnN0YWxsaW5nIGEgc2lnbmFsIGhhbmRsZXIgZm9yCisuRHYgU0lHRlBFICwKK2FwcGxpY2F0aW9ucyBjYW4gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gaW1tZWRpYXRlbHkgd2l0aG91dAordGVzdGluZyB0aGUgZXhjZXB0aW9uIGZsYWdzIGFmdGVyIGV2ZXJ5IG9wZXJhdGlvbi4KK05vdGUgdGhhdCB0aGUgdHJhcCBtYXkgbm90IGJlIGltbWVkaWF0ZSwgYnV0IGl0IHNob3VsZCBvY2N1cgorYmVmb3JlIHRoZSBuZXh0IGZsb2F0aW5nLXBvaW50IGluc3RydWN0aW9uIGlzIGV4ZWN1dGVkLgorLlBwCitGb3IgYWxsIG9mIHRoZXNlIGZ1bmN0aW9ucywgdGhlIHBvc3NpYmxlIHR5cGVzIG9mIGV4Y2VwdGlvbnMKK2luY2x1ZGUgdGhvc2UgZGVzY3JpYmVkIGluCisuWHIgZmVudiAzIC4KK1NvbWUgYXJjaGl0ZWN0dXJlcyBtYXkgZGVmaW5lIG90aGVyIHR5cGVzIG9mIGZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbnMuCisuU2ggUkVUVVJOIFZBTFVFUworVGhlCisuRm4gZmVlbmFibGVleGNlcHQgLAorLkZuIGZlZGlzYWJsZWV4Y2VwdCAsCithbmQKKy5GbiBmZWdldGV4Y2VwdAorZnVuY3Rpb25zIHJldHVybiBhIGJpdG1hcCBvZiB0aGUgZXhjZXB0aW9ucyB0aGF0IHdlcmUgdW5tYXNrZWQKK3ByaW9yIHRvIHRoZSBjYWxsLgorLlNoIFNFRSBBTFNPCisuWHIgc2lnYWN0aW9uIDIgLAorLlhyIGZlY2xlYXJleGNlcHQgMyAsCisuWHIgZmVob2xkZXhjZXB0IDMgLAorLlhyIGZlbnYgMyAsCisuWHIgZmV1cGRhdGVlbnYgMworLlNoIEJVR1MKK0Z1bmN0aW9ucyBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeSBtYXkgdHJpZ2dlciBleGNlcHRpb25zIG11bHRpcGxlCit0aW1lcyBhcyBhIHJlc3VsdCBvZiBpbnRlcm1lZGlhdGUgY29tcHV0YXRpb25zOworaG93ZXZlciwgdGhleSBnZW5lcmFsbHkgZG8gbm90IHRyaWdnZXIgc3B1cmlvdXMgZXhjZXB0aW9ucy4KKy5QcAorTm8gaW50ZXJmYWNlIGlzIHByb3ZpZGVkIHRvIHBlcm1pdCBleGNlcHRpb25zIHRvIGJlIGhhbmRsZWQgaW4KK25vbnRyaXZpYWwgd2F5cy4KK1RoZXJlIGlzIG5vIHVuaWZvcm0gd2F5IGZvciBhbiBleGNlcHRpb24gaGFuZGxlciB0byBhY2Nlc3MKK2luZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24tY2F1c2luZyBpbnN0cnVjdGlvbiwgb3IKK3RvIGRldGVybWluZSB3aGV0aGVyIHRoYXQgaW5zdHJ1Y3Rpb24gc2hvdWxkIGJlIHJlZXhlY3V0ZWQKK2FmdGVyIHJldHVybmluZyBmcm9tIHRoZSBoYW5kbGVyLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vZmVnZXRlbnYuMyBiL2xpYm0vbWFuL2ZlZ2V0ZW52LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUzODZhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2ZlZ2V0ZW52LjMKQEAgLTAsMCArMSwxMTMgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0Qub3JnPgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9mZWdldGVudi4zLHYgMS4xIDIwMDQvMDYvMDYgMTA6MDY6MjYgZGFzIEV4cCAkCisuXCIKKy5EZCBNYXkgOCwgMjAwNAorLkR0IEZFR0VURU5WIDMKKy5PcworLlNoIE5BTUUKKy5ObSBmZWdldGVudiAsCisuTm0gZmVob2xkZXhjZXB0ICwKKy5ObSBmZXNldGVudiAsCisuTm0gZmV1cGRhdGVlbnYKKy5OZCBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCBzYXZlIGFuZCByZXN0b3JlCisuU2ggTElCUkFSWQorLkxiIGxpYm0KKy5TaCBTWU5PUFNJUworLkluIGZlbnYuaAorLkZkICIjcHJhZ21hIFNUREMgRkVOVl9BQ0NFU1MgT04iCisuRnQgaW50CisuRm4gZmVnZXRlbnYgImZlbnZfdCAqZW52cCIKKy5GdCBpbnQKKy5GbiBmZWhvbGRleGNlcHQgImZlbnZfdCAqZW52cCIKKy5GdCBpbnQKKy5GbiBmZXNldGVudiAiY29uc3QgZmVudl90ICplbnZwIgorLkZ0IGludAorLkZuIGZldXBkYXRlZW52ICJjb25zdCBmZW52X3QgKmVudnAiCisuU2ggREVTQ1JJUFRJT04KK1RoZSBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCBpbmNsdWRlcyBleGNlcHRpb24gZmxhZ3MgYW5kIG1hc2tzLCB0aGUKK2N1cnJlbnQgcm91bmRpbmcgbW9kZSwgYW5kIG90aGVyIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBzZXR0aW5ncy4KK0hvd2V2ZXIsIGl0IGRvZXMgbm90IGluY2x1ZGUgdGhlIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyIGZpbGUuCisuUHAKK1RoZQorLkZuIGZlZ2V0ZW52CitmdW5jdGlvbiBzdG9yZXMgdGhlIGN1cnJlbnQgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQgaW4gdGhlIG9iamVjdAorcG9pbnRlZCB0byBieQorLkZhIGVudnAgLAord2hlcmVhcworLkZuIGZlaG9sZGV4Y2VwdAorc2F2ZXMgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQsIHRoZW4gY2xlYXJzIGFsbCBleGNlcHRpb24gZmxhZ3MKK2FuZCBtYXNrcyBhbGwgZmxvYXRpbmctcG9pbnQgZXhjZXB0aW9ucy4KKy5QcAorVGhlCisuRm4gZmVzZXRlbnYKK2Z1bmN0aW9uIHJlc3RvcmVzIGEgcHJldmlvdXNseSBzYXZlZCBlbnZpcm9ubWVudC4KK1RoZQorLkZuIGZldXBkYXRlZW52CitmdW5jdGlvbiByZXN0b3JlcyBhIHNhdmVkIGVudmlyb25tZW50IGFzIHdlbGwsIGJ1dCBpdCBhbHNvCityYWlzZXMgYW55IGV4Y2VwdGlvbnMgdGhhdCB3ZXJlIHNldCBpbiB0aGUgZW52aXJvbm1lbnQgaXQKK3JlcGxhY2VzLgorLlBwCitUaGUKKy5GbiBmZWhvbGRleGNlcHQKK2Z1bmN0aW9uIGlzIG9mdGVuIHVzZWQgd2l0aAorLkZuIGZldXBkYXRlZW52CitvcgorLkZuIGZlc2V0ZW52Cit0byBzdXBwcmVzcyBzcHVyaW91cyBleGNlcHRpb25zIHRoYXQgb2NjdXIgYXMgYSByZXN1bHQgb2YKK2ludGVybWVkaWF0ZSBjb21wdXRhdGlvbnMuCitBbiBleGFtcGxlIGluCisuWHIgZmVudiAzCitkZW1vbnN0cmF0ZXMgaG93IHRvIGRvIHRoaXMuCisuU2ggUkVUVVJOIFZBTFVFUworVGhlCisuRm4gZmVnZXRlbnYgLAorLkZuIGZlaG9sZGV4Y2VwdCAsCisuRm4gZmVzZXRlbnYgLAorYW5kCisuRm4gZmV1cGRhdGVlbnYKK2Z1bmN0aW9ucyByZXR1cm4gMCBpZiB0aGV5IHN1Y2NlZWQsIGFuZCBub24temVybyBvdGhlcndpc2UuCisuU2ggU0VFIEFMU08KKy5YciBmZWNsZWFyZXhjZXB0IDMgLAorLlhyIGZlbnYgMyAsCisuWHIgZmVyYWlzZWV4Y2VwdCAzICwKKy5YciBmZXNldGVudiAzICwKKy5YciBmZXRlc3RleGNlcHQgMyAsCisuWHIgZnBnZXRtYXNrIDMgLAorLlhyIGZwZ2V0cHJlYyAzICwKKy5YciBmcHNldG1hc2sgMyAsCisuWHIgZnBzZXRwcmVjIDMKKy5TaCBTVEFOREFSRFMKK1RoZQorLkZuIGZlZ2V0ZW52ICwKKy5GbiBmZWhvbGRleGNlcHQgLAorLkZuIGZlc2V0ZW52ICwKK2FuZAorLkZuIGZldXBkYXRlZW52CitmdW5jdGlvbnMgY29uZm9ybSB0bworLlN0IC1pc29DLTk5IC4KKy5TaCBISVNUT1JZCitUaGVzZSByb3V0aW5lcyBmaXJzdCBhcHBlYXJlZCBpbgorLkZ4IDUuMyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9mZWdldHJvdW5kLjMgYi9saWJtL21hbi9mZWdldHJvdW5kLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM4NDE1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2ZlZ2V0cm91bmQuMwpAQCAtMCwwICsxLDgzIEBACisuXCIgQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELm9yZz4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vZmVnZXRyb3VuZC4zLHYgMS4yIDIwMDUvMDEvMTQgMDk6MTI6MDUgcnUgRXhwICQKKy5cIgorLkRkIE1heSA4LCAyMDA0CisuRHQgRkVHRVRST1VORCAzCisuT3MKKy5TaCBOQU1FCisuTm0gZmVnZXRyb3VuZCAsCisuTm0gZmVzZXRyb3VuZAorLk5kIGZsb2F0aW5nLXBvaW50IHJvdW5kaW5nIGNvbnRyb2wKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gZmVudi5oCisuRmQgIiNwcmFnbWEgU1REQyBGRU5WX0FDQ0VTUyBPTiIKKy5GdCBpbnQKKy5GbiBmZWdldHJvdW5kIHZvaWQKKy5GdCBpbnQKKy5GbiBmZXNldHJvdW5kICJpbnQgcm91bmQiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIGZlZ2V0cm91bmQKK2Z1bmN0aW9uIGRldGVybWluZXMgdGhlIGN1cnJlbnQgZmxvYXRpbmctcG9pbnQgcm91bmRpbmcgbW9kZSwKK2FuZCB0aGUKKy5GbiBmZXNldHJvdW5kCitmdW5jdGlvbiBzZXRzIHRoZSBjdXJyZW50IHJvdW5kaW5nIG1vZGUgdG8KKy5GYSByb3VuZCAuCitUaGUgcm91bmRpbmcgbW9kZSBpcyBvbmUgb2YKKy5EdiBGRV9UT05FQVJFU1QgLCBGRV9ET1dOV0FSRCAsIEZFX1VQV0FSRCAsCitvcgorLkR2IEZFX1RPV0FSRFpFUk8gLAorYXMgZGVzY3JpYmVkIGluCisuWHIgZmVudiAzIC4KKy5TaCBSRVRVUk4gVkFMVUVTCitUaGUKKy5GbiBmZWdldHJvdW5kCityb3V0aW5lIHJldHVybnMgdGhlIGN1cnJlbnQgcm91bmRpbmcgbW9kZS4KK1RoZQorLkZuIGZlc2V0cm91bmQKK2Z1bmN0aW9uIHJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBub24temVybyBvdGhlcndpc2U7Citob3dldmVyLCB0aGUgcHJlc2VudCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgc3VjY2VlZHMuCisuU2ggU0VFIEFMU08KKy5YciBmZW52IDMgLAorLlhyIGZwZ2V0cm91bmQgMyAsCisuWHIgZnBzZXRyb3VuZCAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiBmZWdldHJvdW5kCithbmQKKy5GbiBmZXNldHJvdW5kCitmdW5jdGlvbnMgY29uZm9ybSB0bworLlN0IC1pc29DLTk5IC4KKy5TaCBISVNUT1JZCitUaGVzZSByb3V0aW5lcyBmaXJzdCBhcHBlYXJlZCBpbgorLkZ4IDUuMyAuCitUaGV5IHN1cGVyc2VkZSB0aGUgbm9uLXN0YW5kYXJkCisuWHIgZnBnZXRyb3VuZCAzCithbmQKKy5YciBmcHNldHJvdW5kIDMKK2Z1bmN0aW9ucy4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL2ZlbnYuMyBiL2xpYm0vbWFuL2ZlbnYuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2FkNTQxCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vZmVudi4zCkBAIC0wLDAgKzEsMjg5IEBACisuXCIgQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELm9yZz4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vZmVudi4zLHYgMS41IDIwMDUvMDYvMTUgMTk6MDQ6MDQgcnUgRXhwICQKKy5cIgorLkRkIE1hcmNoIDE2LCAyMDA1CisuRHQgRkVOViAzCisuT3MKKy5TaCBOQU1FCisuTm0gZmVjbGVhcmV4Y2VwdCAsCisuTm0gZmVnZXRleGNlcHRmbGFnICwKKy5ObSBmZXJhaXNlZXhjZXB0ICwKKy5ObSBmZXNldGV4Y2VwdGZsYWcgLAorLk5tIGZldGVzdGV4Y2VwdCAsCisuTm0gZmVnZXRyb3VuZCAsCisuTm0gZmVzZXRyb3VuZCAsCisuTm0gZmVnZXRlbnYgLAorLk5tIGZlaG9sZGV4Y2VwdCAsCisuTm0gZmVzZXRlbnYgLAorLk5tIGZldXBkYXRlZW52ICwKKy5ObSBmZWVuYWJsZWV4Y2VwdCAsCisuTm0gZmVkaXNhYmxlZXhjZXB0ICwKKy5ObSBmZWdldGV4Y2VwdAorLk5kIGZsb2F0aW5nLXBvaW50IGVudmlyb25tZW50IGNvbnRyb2wKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gZmVudi5oCisuRmQgIiNwcmFnbWEgU1REQyBGRU5WX0FDQ0VTUyBPTiIKKy5GdCBpbnQKKy5GbiBmZWNsZWFyZXhjZXB0ICJpbnQgZXhjZXB0cyIKKy5GdCBpbnQKKy5GbiBmZWdldGV4Y2VwdGZsYWcgImZleGNlcHRfdCAqZmxhZ3AiICJpbnQgZXhjZXB0cyIKKy5GdCBpbnQKKy5GbiBmZXJhaXNlZXhjZXB0ICJpbnQgZXhjZXB0cyIKKy5GdCBpbnQKKy5GbiBmZXNldGV4Y2VwdGZsYWcgImNvbnN0IGZleGNlcHRfdCAqZmxhZ3AiICJpbnQgZXhjZXB0cyIKKy5GdCBpbnQKKy5GbiBmZXRlc3RleGNlcHQgImludCBleGNlcHRzIgorLkZ0IGludAorLkZuIGZlZ2V0cm91bmQgdm9pZAorLkZ0IGludAorLkZuIGZlc2V0cm91bmQgImludCByb3VuZCIKKy5GdCBpbnQKKy5GbiBmZWdldGVudiAiZmVudl90ICplbnZwIgorLkZ0IGludAorLkZuIGZlaG9sZGV4Y2VwdCAiZmVudl90ICplbnZwIgorLkZ0IGludAorLkZuIGZlc2V0ZW52ICJjb25zdCBmZW52X3QgKmVudnAiCisuRnQgaW50CisuRm4gZmV1cGRhdGVlbnYgImNvbnN0IGZlbnZfdCAqZW52cCIKKy5GdCBpbnQKKy5GbiBmZWVuYWJsZWV4Y2VwdCAiaW50IGV4Y2VwdHMiCisuRnQgaW50CisuRm4gZmVkaXNhYmxlZXhjZXB0ICJpbnQgZXhjZXB0cyIKKy5GdCBpbnQKKy5GbiBmZWdldGV4Y2VwdCB2b2lkCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkluIGZlbnYuaAorcm91dGluZXMgbWFuaXB1bGF0ZSB0aGUgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQsCit3aGljaCBpbmNsdWRlcyB0aGUgZXhjZXB0aW9uIGZsYWdzIGFuZCByb3VuZGluZyBtb2RlcyBkZWZpbmVkIGluCisuU3QgLWllZWU3NTQgLgorLlNzIEV4Y2VwdGlvbnMKK0V4Y2VwdGlvbiBmbGFncyBhcmUgc2V0IGFzIHNpZGUtZWZmZWN0cyBvZiBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljCitvcGVyYXRpb25zIGFuZCBtYXRoIGxpYnJhcnkgcm91dGluZXMsIGFuZCB0aGV5IHJlbWFpbiBzZXQgdW50aWwKK2V4cGxpY2l0bHkgY2xlYXJlZC4KK1RoZSBmb2xsb3dpbmcgbWFjcm9zIGV4cGFuZCB0byBiaXQgZmxhZ3Mgb2YgdHlwZQorLlZ0IGludAorcmVwcmVzZW50aW5nIHRoZSBmaXZlIHN0YW5kYXJkIGZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbnMuCisuQmwgLXRhZyAtd2lkdGggIi5EdiBGRV9ESVZCWVpFUk8iCisuSXQgRHYgRkVfRElWQllaRVJPCitBIGRpdmlkZS1ieS16ZXJvIGV4Y2VwdGlvbiBvY2N1cnMgd2hlbiB0aGUgcHJvZ3JhbSBhdHRlbXB0cyB0bworZGl2aWRlIGEgZmluaXRlIG5vbi16ZXJvIG51bWJlciBieSB6ZXJvLgorLkl0IER2IEZFX0lORVhBQ1QKK0FuIGluZXhhY3QgZXhjZXB0aW9uIGlzIHJhaXNlZCB3aGVuZXZlciB0aGVyZSBpcyBhIGxvc3Mgb2YgcHJlY2lzaW9uCitkdWUgdG8gcm91bmRpbmcuCisuSXQgRHYgRkVfSU5WQUxJRAorSW52YWxpZCBvcGVyYXRpb24gZXhjZXB0aW9ucyBvY2N1ciB3aGVuIGEgcHJvZ3JhbSBhdHRlbXB0cyB0bworcGVyZm9ybSBjYWxjdWxhdGlvbnMgZm9yIHdoaWNoIHRoZXJlIGlzIG5vIHJlYXNvbmFibGUgcmVwcmVzZW50YWJsZQorYW5zd2VyLgorRm9yIGluc3RhbmNlLCBzdWJ0cmFjdGlvbiBvZiBpbmZpbml0aWVzLCBkaXZpc2lvbiBvZiB6ZXJvIGJ5IHplcm8sCitvcmRlcmVkIGNvbXBhcmlzb24gaW52b2x2aW5nIFwqKE5hcywgYW5kIHRha2luZyB0aGUgc3F1YXJlIHJvb3Qgb2YgYQorbmVnYXRpdmUgbnVtYmVyIGFyZSBhbGwgaW52YWxpZCBvcGVyYXRpb25zLgorLkl0IER2IEZFX09WRVJGTE9XCitBbiBvdmVyZmxvdyBleGNlcHRpb24gb2NjdXJzIHdoZW4gdGhlIG1hZ25pdHVkZSBvZiB0aGUgcmVzdWx0IG9mIGEKK2NvbXB1dGF0aW9uIGlzIHRvbyBsYXJnZSB0byBmaXQgaW4gdGhlIGRlc3RpbmF0aW9uIHR5cGUuCisuSXQgRHYgRkVfVU5ERVJGTE9XCitVbmRlcmZsb3cgb2NjdXJzIHdoZW4gdGhlIHJlc3VsdCBvZiBhIGNvbXB1dGF0aW9uIGlzIHRvbyBjbG9zZSB0byB6ZXJvCit0byBiZSByZXByZXNlbnRlZCBhcyBhIG5vbi16ZXJvIHZhbHVlIGluIHRoZSBkZXN0aW5hdGlvbiB0eXBlLgorLkVsCisuUHAKK0FkZGl0aW9uYWxseSwgdGhlCisuRHYgRkVfQUxMX0VYQ0VQVAorbWFjcm8gZXhwYW5kcyB0byB0aGUgYml0d2lzZSBPUiBvZiB0aGUgYWJvdmUgZmxhZ3MgYW5kIGFueQorYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGZsYWdzLgorQ29tYmluYXRpb25zIG9mIHRoZXNlIGZsYWdzIGFyZSBwYXNzZWQgdG8gdGhlCisuRm4gZmVjbGVhcmV4Y2VwdCAsCisuRm4gZmVnZXRleGNlcHRmbGFnICwKKy5GbiBmZXJhaXNlZXhjZXB0ICwKKy5GbiBmZXNldGV4Y2VwdGZsYWcgLAorYW5kCisuRm4gZmV0ZXN0ZXhjZXB0CitmdW5jdGlvbnMgdG8gY2xlYXIsIHNhdmUsIHJhaXNlLCByZXN0b3JlLCBhbmQgZXhhbWluZSB0aGUKK3Byb2Nlc3NvcidzIGZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbiBmbGFncywgcmVzcGVjdGl2ZWx5LgorLlBwCitFeGNlcHRpb25zIG1heSBiZQorLkVtIHVubWFza2VkCit3aXRoCisuRm4gZmVlbmFibGVleGNlcHQKK2FuZCBtYXNrZWQgd2l0aAorLkZuIGZlZGlzYWJsZWV4Y2VwdCAuCitVbm1hc2tlZCBleGNlcHRpb25zIGNhdXNlIGEgdHJhcCB3aGVuIHRoZXkgYXJlIHByb2R1Y2VkLCBhbmQKK2FsbCBleGNlcHRpb25zIGFyZSBtYXNrZWQgYnkgZGVmYXVsdC4KK1RoZSBjdXJyZW50IG1hc2sgY2FuIGJlIHRlc3RlZCB3aXRoCisuRm4gZmVnZXRleGNlcHQgLgorLlNzIFJvdW5kaW5nIE1vZGVzCisuU3QgLWllZWU3NTQKK3NwZWNpZmllcyBmb3VyIHJvdW5kaW5nIG1vZGVzLgorVGhlc2UgbW9kZXMgY29udHJvbCB0aGUgZGlyZWN0aW9uIGluIHdoaWNoIHJlc3VsdHMgYXJlIHJvdW5kZWQKK2Zyb20gdGhlaXIgZXhhY3QgdmFsdWVzIGluIG9yZGVyIHRvIGZpdCB0aGVtIGludG8gYmluYXJ5CitmbG9hdGluZy1wb2ludCB2YXJpYWJsZXMuCitUaGUgZm91ciBtb2RlcyBjb3JyZXNwb25kIHdpdGggdGhlIGZvbGxvd2luZyBzeW1ib2xpYyBjb25zdGFudHMuCisuQmwgLXRhZyAtd2lkdGggIi5EdiBGRV9UT1dBUkRaRVJPIgorLkl0IER2IEZFX1RPTkVBUkVTVAorUmVzdWx0cyBhcmUgcm91bmRlZCB0byB0aGUgY2xvc2VzdCByZXByZXNlbnRhYmxlIHZhbHVlLgorSWYgdGhlIGV4YWN0IHJlc3VsdCBpcyBleGFjdGx5IGhhbGYgd2F5IGJldHdlZW4gdHdvIHJlcHJlc2VudGFibGUKK3ZhbHVlcywgdGhlIHZhbHVlIHdob3NlIGxhc3QgYmluYXJ5IGRpZ2l0IGlzIGV2ZW4gKHplcm8pIGlzIGNob3Nlbi4KK1RoaXMgaXMgdGhlIGRlZmF1bHQgbW9kZS4KKy5JdCBEdiBGRV9ET1dOV0FSRAorUmVzdWx0cyBhcmUgcm91bmRlZCB0b3dhcmRzIG5lZ2F0aXZlIFwqW0lmXS4KKy5JdCBEdiBGRV9VUFdBUkQKK1Jlc3VsdHMgYXJlIHJvdW5kZWQgdG93YXJkcyBwb3NpdGl2ZSBcKltJZl0uCisuSXQgRHYgRkVfVE9XQVJEWkVSTworUmVzdWx0cyBhcmUgcm91bmRlZCB0b3dhcmRzIHplcm8uCisuRWwKKy5QcAorVGhlCisuRm4gZmVnZXRyb3VuZAorYW5kCisuRm4gZmVzZXRyb3VuZAorZnVuY3Rpb25zIHF1ZXJ5IGFuZCBzZXQgdGhlIHJvdW5kaW5nIG1vZGUuCisuU3MgRW52aXJvbm1lbnQgQ29udHJvbAorVGhlCisuRm4gZmVnZXRlbnYKK2FuZAorLkZuIGZlc2V0ZW52CitmdW5jdGlvbnMgc2F2ZSBhbmQgcmVzdG9yZSB0aGUgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQsCit3aGljaCBpbmNsdWRlcyBleGNlcHRpb24gZmxhZ3MsIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiBtYXNrLAordGhlIHJvdW5kaW5nIG1vZGUsIGFuZCBwb3NzaWJseSBvdGhlciBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYworc3RhdGUuCitUaGUKKy5GbiBmZWhvbGRleGNlcHQKK2Z1bmN0aW9uIGJlaGF2ZXMgbGlrZQorLkZuIGZlZ2V0ZW52ICwKK2J1dCB3aXRoIHRoZSBhZGRpdGlvbmFsIGVmZmVjdCBvZiBjbGVhcmluZyB0aGUgZXhjZXB0aW9uIGZsYWdzIGFuZAoraW5zdGFsbGluZyBhCisuRW0gbm9uLXN0b3AKK21vZGUuCitJbiBub24tc3RvcCBtb2RlLCBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIHdpbGwgc2V0IGV4Y2VwdGlvbiBmbGFncworYXMgdXN1YWwsIGJ1dCBubworLkR2IFNJR0ZQRQorc2lnbmFscyB3aWxsIGJlIGdlbmVyYXRlZCBhcyBhIHJlc3VsdC4KK05vbi1zdG9wIG1vZGUgaXMgdGhlIGRlZmF1bHQsIGJ1dCBpdCBtYXkgYmUgYWx0ZXJlZCBieQorbm9uLXN0YW5kYXJkIG1lY2hhbmlzbXMuCisuXCIgWFhYIE1lbnRpb24gZmVbZ3NdZXRtYXNrKCkgaGVyZSBhZnRlciB0aGUgaW50ZXJmYWNlIGlzIGZpbmFsaXplZAorLlwiIFhYWCBhbmQgcmVhZHkgdG8gYmUgb2ZmaWNpYWxseSBkb2N1bWVudGVkLgorVGhlCisuRm4gZmV1cGRhdGVlbnYKK2Z1bmN0aW9uIHJlc3RvcmVzIGEgc2F2ZWQgZW52aXJvbm1lbnQgc2ltaWxhcmx5IHRvCisuRm4gZmVzZXRlbnYgLAorYnV0IGl0IGFsc28gcmUtcmFpc2VzIGFueSBmbG9hdGluZy1wb2ludCBleGNlcHRpb25zIGZyb20gdGhlIG9sZAorZW52aXJvbm1lbnQuCisuUHAKK1RoZSBtYWNybworLkR2IEZFX0RGTF9FTlYKK2V4cGFuZHMgdG8gYSBwb2ludGVyIHRvIHRoZSBkZWZhdWx0IGVudmlyb25tZW50LgorLlNoIENBVkVBVFMKK1RoZSBGRU5WX0FDQ0VTUyBwcmFnbWEgY2FuIGJlIGVuYWJsZWQgd2l0aAorLkRsICIjcHJhZ21hIFNUREMgRkVOVl9BQ0NFU1MgT04iCithbmQgZGlzYWJsZWQgd2l0aCB0aGUKKy5EbCAiI3ByYWdtYSBTVERDIEZFTlZfQUNDRVNTIE9GRiIKK2RpcmVjdGl2ZS4KK1RoaXMgbGV4aWNhbGx5LXNjb3BlZCBhbm5vdGF0aW9uIHRlbGxzIHRoZSBjb21waWxlciB0aGF0IHRoZSBwcm9ncmFtCittYXkgYWNjZXNzIHRoZSBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCwgc28gb3B0aW1pemF0aW9ucyB0aGF0IHdvdWxkCit2aW9sYXRlIHN0cmljdCBJRUVFLTc1NCBzZW1hbnRpY3MgYXJlIGRpc2FibGVkLgorSWYgZXhlY3V0aW9uIHJlYWNoZXMgYSBibG9jayBvZiBjb2RlIGZvciB3aGljaAorLkR2IEZFTlZfQUNDRVNTCitpcyBvZmYsIHRoZSBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCB3aWxsIGJlY29tZSB1bmRlZmluZWQuCisuU2ggRVhBTVBMRVMKK1RoZSBmb2xsb3dpbmcgcm91dGluZSBjb21wdXRlcyB0aGUgc3F1YXJlIHJvb3QgZnVuY3Rpb24uCitJdCBleHBsaWNpdGx5IHJhaXNlcyBhbiBpbnZhbGlkIGV4Y2VwdGlvbiBvbiBhcHByb3ByaWF0ZSBpbnB1dHMgdXNpbmcKKy5GbiBmZXJhaXNlZXhjZXB0IC4KK0l0IGFsc28gZGVmZXJzIGluZXhhY3QgZXhjZXB0aW9ucyB3aGlsZSBpdCBjb21wdXRlcyBpbnRlcm1lZGlhdGUKK3ZhbHVlcywgYW5kIHRoZW4gaXQgYWxsb3dzIGFuIGluZXhhY3QgZXhjZXB0aW9uIHRvIGJlIHJhaXNlZCBvbmx5IGlmCit0aGUgZmluYWwgYW5zd2VyIGlzIGluZXhhY3QuCisuQmQgLWxpdGVyYWwgLW9mZnNldCBpbmRlbnQKKyNwcmFnbWEgU1REQyBGRU5WX0FDQ0VTUyBPTgorZG91YmxlIHNxcnQoZG91YmxlIG4pIHsKKwlkb3VibGUgeCA9IDEuMDsKKwlmZW52X3QgZW52OworCisJaWYgKGlzbmFuKG4pIHx8IG4gPCAwLjApIHsKKwkJZmVyYWlzZWV4Y2VwdChGRV9JTlZBTElEKTsKKwkJcmV0dXJuIChOQU4pOworCX0KKwlpZiAoaXNpbmYobikgfHwgbiA9PSAwLjApCisJCXJldHVybiAobik7CisJZmVob2xkZXhjZXB0KCZlbnYpOworCXdoaWxlIChmYWJzKCh4ICogeCkgLSBuKSA+IERCTF9FUFNJTE9OICogMiAqIHgpCisJCXggPSAoeCAvIDIpICsgKG4gLyAoMiAqIHgpKTsKKwlpZiAoeCAqIHggPT0gbikKKwkJZmVjbGVhcmV4Y2VwdChGRV9JTkVYQUNUKTsKKwlmZXVwZGF0ZWVudigmZW52KTsKKwlyZXR1cm4gKHgpOworfQorLkVkCisuU2ggU0VFIEFMU08KKy5YciBjYyAxICwKKy5YciBmZWNsZWFyZXhjZXB0IDMgLAorLlhyIGZlZGlzYWJsZWV4Y2VwdCAzICwKKy5YciBmZWVuYWJsZWV4Y2VwdCAzICwKKy5YciBmZWdldGVudiAzICwKKy5YciBmZWdldGV4Y2VwdCAzICwKKy5YciBmZWdldGV4Y2VwdGZsYWcgMyAsCisuWHIgZmVnZXRyb3VuZCAzICwKKy5YciBmZWhvbGRleGNlcHQgMyAsCisuWHIgZmVyYWlzZWV4Y2VwdCAzICwKKy5YciBmZXNldGVudiAzICwKKy5YciBmZXNldGV4Y2VwdGZsYWcgMyAsCisuWHIgZmVzZXRyb3VuZCAzICwKKy5YciBmZXRlc3RleGNlcHQgMyAsCisuWHIgZmV1cGRhdGVlbnYgMyAsCisuWHIgZnBnZXRwcmVjIDMgLAorLlhyIGZwc2V0cHJlYyAzCisuU2ggU1RBTkRBUkRTCitFeGNlcHQgYXMgbm90ZWQgYmVsb3csCisuSW4gZmVudi5oCitjb25mb3JtcyB0bworLlN0IC1pc29DLTk5IC4KK1RoZQorLkZuIGZlZW5hYmxlZXhjZXB0ICwKKy5GbiBmZWRpc2FibGVleGNlcHQgLAorYW5kCisuRm4gZmVnZXRleGNlcHQKK3JvdXRpbmVzIGFyZSBleHRlbnNpb25zLgorLlNoIEhJU1RPUlkKK1RoZQorLkluIGZlbnYuaAoraGVhZGVyIGZpcnN0IGFwcGVhcmVkIGluCisuRnggNS4zIC4KK0l0IHN1cGVyc2VkZXMgdGhlIG5vbi1zdGFuZGFyZCByb3V0aW5lcyBkZWZpbmVkIGluCisuSW4gaWVlZWZwLmgKK2FuZCBkb2N1bWVudGVkIGluCisuWHIgZnBnZXRyb3VuZCAzIC4KKy5TaCBCVUdTCitUaGUKKy5EdiBGRU5WX0FDQ0VTUworcHJhZ21hIGlzIHVuaW1wbGVtZW50ZWQgaW4gdGhlIHN5c3RlbSBjb21waWxlci4KK0hvd2V2ZXIsIG5vbi1jb25zdGFudCBleHByZXNzaW9ucyBnZW5lcmFsbHkgcHJvZHVjZSB0aGUgY29ycmVjdAorc2lkZS1lZmZlY3RzIGF0IGxvdyBvcHRpbWl6YXRpb24gbGV2ZWxzLgorLlBwCitPbiB0aGUgQWxwaGEgcGxhdGZvcm0sCisuWHIgY2MgMQorbXVzdCBiZSBwYXNzZWQgdGhlCisuRmwgbWllZWUtd2l0aC1pbmV4YWN0IG1mcC1yb3VuZGluZy1tb2RlPWQKK29wdGlvbnMgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgY29kZSB0aGF0IGhhcyB0aGUgc3RhbmRhcmQKK3NpZGUtZWZmZWN0cyBhbmQgdXNlcyB0aGUgc3BlY2lmaWVkIHJvdW5kaW5nIG1vZGVzLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vZmxvb3IuMyBiL2xpYm0vbWFuL2Zsb29yLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwMmRhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2Zsb29yLjMKQEAgLTAsMCArMSw4MiBAQAorLlwiIENvcHlyaWdodCAoYykgMTk4NSwgMTk5MSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKWZsb29yLjMJNi41IChCZXJrZWxleSkgNC8xOS85MQorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL2Zsb29yLjMsdiAxLjE3IDIwMDUvMDEvMTMgMDk6MzU6NDcgcnUgRXhwICQKKy5cIgorLkRkIEphbnVhcnkgMTMsIDIwMDUKKy5EdCBGTE9PUiAzCisuT3MKKy5TaCBOQU1FCisuTm0gZmxvb3IgLAorLk5tIGZsb29yZiAsCisuTm0gZmxvb3JsCisuTmQgbGFyZ2VzdCBpbnRlZ3JhbCB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8geAorLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBmbG9vciAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBmbG9vcmYgImZsb2F0IHgiCisuRnQgImxvbmcgZG91YmxlIgorLkZuIGZsb29ybCAibG9uZyBkb3VibGUgeCIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gZmxvb3IgLAorLkZuIGZsb29yZgorYW5kCisuRm4gZmxvb3JsCitmdW5jdGlvbnMgcmV0dXJuIHRoZSBsYXJnZXN0IGludGVncmFsIHZhbHVlCitsZXNzIHRoYW4gb3IgZXF1YWwgdG8KKy5GYSB4ICwKK2V4cHJlc3NlZCBhcyBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4KKy5TaCBTRUUgQUxTTworLlhyIGFicyAzICwKKy5YciBjZWlsIDMgLAorLlhyIGZhYnMgMyAsCisuWHIgaWVlZSAzICwKKy5YciBtYXRoIDMgLAorLlhyIHJpbnQgMyAsCisuWHIgcm91bmQgMyAsCisuWHIgdHJ1bmMgMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gZmxvb3IKK2Z1bmN0aW9uIGNvbmZvcm1zIHRvCisuU3QgLWlzb0MgLgorVGhlCisuRm4gZmxvb3JmCithbmQKKy5GbiBmbG9vcmwKK2Z1bmN0aW9ucyBjb25mb3JtIHRvCisuU3QgLWlzb0MtOTkgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vZm1hLjMgYi9saWJtL21hbi9mbWEuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzhhNmUyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vZm1hLjMKQEAgLTAsMCArMSwxMTYgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0Qub3JnPgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9mbWEuMyx2IDEuMyAyMDA1LzExLzI0IDA5OjI1OjEwIGpvZWwgRXhwICQKKy5cIgorLkRkIEphbnVhcnkgMjIsIDIwMDUKKy5EdCBGTUEgMworLk9zCisuU2ggTkFNRQorLk5tIGZtYSAsCisuTm0gZm1hZiAsCisuTm0gZm1hbAorLk5kIGZ1c2VkIG11bHRpcGx5LWFkZAorLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBmbWEgImRvdWJsZSB4IiAiZG91YmxlIHkiICJkb3VibGUgeiIKKy5GdCBmbG9hdAorLkZuIGZtYWYgImZsb2F0IHgiICJmbG9hdCB5IiAiZmxvYXQgeiIKKy5GdCBsb25nIGRvdWJsZQorLkZuIGZtYWwgImxvbmcgZG91YmxlIHgiICJsb25nIGRvdWJsZSB5IiAibG9uZyBkb3VibGUgeiIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gZm1hICwKKy5GbiBmbWFmICwKK2FuZAorLkZuIGZtYWwKK2Z1bmN0aW9ucyByZXR1cm4KKy5ObyAiKHggKiB5KSArIHoiICwKK2NvbXB1dGVkIHdpdGggb25seSBvbmUgcm91bmRpbmcgZXJyb3IuCitVc2luZyB0aGUgb3JkaW5hcnkgbXVsdGlwbGljYXRpb24gYW5kIGFkZGl0aW9uIG9wZXJhdG9ycywgYnkgY29udHJhc3QsCityZXN1bHRzIGluIHR3byByb3VuZGluZ3M6IG9uZSBmb3IgdGhlIGludGVybWVkaWF0ZSBwcm9kdWN0IGFuZCBvbmUgZm9yCit0aGUgZmluYWwgcmVzdWx0LgorLlBwCitGb3IgaW5zdGFuY2UsIHRoZSBleHByZXNzaW9uCisuTm8gIjEuMmUxMDAgKiAyLjBlMjA4IC0gMS40ZTMwOCIKK3Byb2R1Y2VzIFwqKElmIGR1ZSB0byBvdmVyZmxvdyBpbiB0aGUgaW50ZXJtZWRpYXRlIHByb2R1Y3QsIHdoZXJlYXMKKy5ObyAiZm1hKDEuMmUxMDAsIDIuMGUyMDgsIC0xLjRlMzA4KSIKK3JldHVybnMgYXBwcm94aW1hdGVseSAxLjBlMzA4LgorLlBwCitUaGUgZnVzZWQgbXVsdGlwbHktYWRkIG9wZXJhdGlvbiBpcyBvZnRlbiB1c2VkIHRvIGltcHJvdmUgdGhlCithY2N1cmFjeSBvZiBjYWxjdWxhdGlvbnMgc3VjaCBhcyBkb3QgcHJvZHVjdHMuCitJdCBtYXkgYWxzbyBiZSB1c2VkIHRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugb24gbWFjaGluZXMgdGhhdCBpbXBsZW1lbnQKK2l0IG5hdGl2ZWx5LgorVGhlIG1hY3JvcworLkR2IEZQX0ZBU1RfRk1BICwKKy5EdiBGUF9GQVNUX0ZNQUYKK2FuZAorLkR2IEZQX0ZBU1RfRk1BTAorbWF5IGJlIGRlZmluZWQgaW4KKy5JbiBtYXRoLmgKK3RvIGluZGljYXRlIHRoYXQKKy5GbiBmbWEgLAorLkZuIGZtYWYgLAorYW5kCisuRm4gZm1hbAorKHJlc3BlY3RpdmVseSkgaGF2ZSBjb21wYXJhYmxlIG9yIGZhc3RlciBzcGVlZCB0aGFuIGEgbXVsdGlwbHkKK29wZXJhdGlvbiBmb2xsb3dlZCBieSBhbiBhZGQgb3BlcmF0aW9uLgorLlNoIElNUExFTUVOVEFUSU9OIE5PVEVTCitJbiBnZW5lcmFsLCB0aGVzZSByb3V0aW5lcyB3aWxsIGJlaGF2ZSBhcyBvbmUgd291bGQgZXhwZWN0IGlmCisuTm8gInggKiB5ICsgeiIKK3dlcmUgY29tcHV0ZWQgd2l0aCB1bmJvdW5kZWQgcHJlY2lzaW9uIGFuZCByYW5nZSwKK3RoZW4gcm91bmRlZCB0byB0aGUgcHJlY2lzaW9uIG9mIHRoZSByZXR1cm4gdHlwZS4KK0hvd2V2ZXIsIG9uIHNvbWUgcGxhdGZvcm1zLCBpZgorLkZhIHoKK2lzIFwqKE5hLCB0aGVzZSBmdW5jdGlvbnMgbWF5IG5vdCByYWlzZSBhbiBleGNlcHRpb24gZXZlbgord2hlbiB0aGUgY29tcHV0YXRpb24gb2YKKy5ObyAieCAqIHkiCit3b3VsZCBoYXZlIG90aGVyd2lzZSBnZW5lcmF0ZWQgYW4gaW52YWxpZCBleGNlcHRpb24uCisuU2ggU0VFIEFMU08KKy5YciBmZW52IDMgLAorLlhyIG1hdGggMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gZm1hICwKKy5GbiBmbWFmICwKK2FuZAorLkZuIGZtYWwKK2Z1bmN0aW9ucyBjb25mb3JtIHRvCisuU3QgLWlzb0MtOTkgLgorQSBmdXNlZCBtdWx0aXBseS1hZGQgb3BlcmF0aW9uIHdpdGggdmlydHVhbGx5IGlkZW50aWNhbAorY2hhcmFjdGVyaXN0aWNzIGFwcGVhcnMgaW4gSUVFRSBkcmFmdCBzdGFuZGFyZCA3NTRSLgorLlNoIEhJU1RPUlkKK1RoZQorLkZuIGZtYQorYW5kCisuRm4gZm1hZgorcm91dGluZXMgZmlyc3QgYXBwZWFyZWQgaW4KKy5GeCA1LjQgLAorYW5kCisuRm4gZm1hbAorYXBwZWFyZWQgaW4KKy5GeCA2LjAgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vZm1heC4zIGIvbGlibS9tYW4vZm1heC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMjQ5YTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi9mbWF4LjMKQEAgLTAsMCArMSw5NyBAQAorLlwiIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5vcmc+CisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL2ZtYXguMyx2IDEuMiAyMDA1LzAxLzE0IDA5OjEyOjA1IHJ1IEV4cCAkCisuXCIKKy5EZCBKdW5lIDI5LCAyMDA0CisuRHQgRk1BWCAzCisuT3MKKy5TaCBOQU1FCisuTm0gZm1heCAsCisuTm0gZm1heGYgLAorLk5tIGZtYXhsICwKKy5ObSBmbWluICwKKy5ObSBmbWluZiAsCisuTm0gZm1pbmwKKy5OZCBmbG9hdGluZy1wb2ludCBtYXhpbXVtIGFuZCBtaW5pbXVtIGZ1bmN0aW9ucworLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBmbWF4ICJkb3VibGUgeCIgImRvdWJsZSB5IgorLkZ0IGZsb2F0CisuRm4gZm1heGYgImZsb2F0IHgiICJmbG9hdCB5IgorLkZ0ICJsb25nIGRvdWJsZSIKKy5GbiBmbWF4bCAibG9uZyBkb3VibGUgeCIgImxvbmcgZG91YmxlIHkiCisuRnQgZG91YmxlCisuRm4gZm1pbiAiZG91YmxlIHgiICJkb3VibGUgeSIKKy5GdCBmbG9hdAorLkZuIGZtaW5mICJmbG9hdCB4IiAiZmxvYXQgeSIKKy5GdCAibG9uZyBkb3VibGUiCisuRm4gZm1pbmwgImxvbmcgZG91YmxlIHgiICJsb25nIGRvdWJsZSB5IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiBmbWF4ICwKKy5GbiBmbWF4ZiAsCithbmQKKy5GbiBmbWF4bAorZnVuY3Rpb25zIHJldHVybiB0aGUgbGFyZ2VyIG9mCisuRmEgeAorYW5kCisuRmEgeSAsCithbmQgbGlrZXdpc2UsIHRoZQorLkZuIGZtaW4gLAorLkZuIGZtaW5mICwKK2FuZAorLkZuIGZtaW5sCitmdW5jdGlvbnMgcmV0dXJuIHRoZSBzbWFsbGVyIG9mCisuRmEgeAorYW5kCisuRmEgeSAuCitUaGV5IHRyZWF0CisuTGkgKzAuMAorYXMgYmVpbmcgbGFyZ2VyIHRoYW4KKy5MaSAtMC4wIC4KK0lmIG9uZSBhcmd1bWVudCBpcyBhbiBcKihOYSwgdGhlbiB0aGUgb3RoZXIgYXJndW1lbnQgaXMgcmV0dXJuZWQuCitJZiBib3RoIGFyZ3VtZW50cyBhcmUgXCooTmFzLCB0aGVuIHRoZSByZXN1bHQgaXMgYW4gXCooTmEuCitUaGVzZSByb3V0aW5lcyBkbyBub3QgcmFpc2UgYW55IGZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbnMuCisuU2ggU0VFIEFMU08KKy5YciBmYWJzIDMgLAorLlhyIGZkaW0gMyAsCisuWHIgbWF0aCAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiBmbWF4ICwKKy5GbiBmbWF4ZiAsCisuRm4gZm1heGwgLAorLkZuIGZtaW4gLAorLkZuIGZtaW5mICwKK2FuZAorLkZuIGZtaW5sCitmdW5jdGlvbnMgY29uZm9ybSB0bworLlN0IC1pc29DLTk5IC4KKy5TaCBISVNUT1JZCitUaGVzZSByb3V0aW5lcyBmaXJzdCBhcHBlYXJlZCBpbgorLkZ4IDUuMyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9mbW9kLjMgYi9saWJtL21hbi9mbW9kLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkNGVkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2Ztb2QuMwpAQCAtMCwwICsxLDg3IEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTkxIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKy5cIiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorLlwiCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorLlwiIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisuXCIgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisuXCIgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICAgICBmcm9tOiBAKCMpZm1vZC4zCTUuMSAoQmVya2VsZXkpIDUvMi85MQorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL2Ztb2QuMyx2IDEuOCAyMDAxLzEwLzEzIDEyOjIzOjIzIGJkZSBFeHAgJAorLlwiCisuRGQgTWF5IDIsIDE5OTEKKy5EdCBGTU9EIDMKKy5PcworLlNoIE5BTUUKKy5ObSBmbW9kICwKKy5ObSBmbW9kZgorLk5kIGZsb2F0aW5nLXBvaW50IHJlbWFpbmRlciBmdW5jdGlvbnMKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gZm1vZCAiZG91YmxlIHgiICJkb3VibGUgeSIKKy5GdCBmbG9hdAorLkZuIGZtb2RmICJmbG9hdCB4IiAiZmxvYXQgeSIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gZm1vZAorYW5kIHRoZQorLkZuIGZtb2RmCitmdW5jdGlvbnMgY29tcHV0ZSB0aGUgZmxvYXRpbmctcG9pbnQgcmVtYWluZGVyIG9mCisuRmEgeCBOcyAvIEZhIHkgLgorLlNoIFJFVFVSTiBWQUxVRVMKK1RoZQorLkZuIGZtb2QKK2FuZCB0aGUKKy5GbiBmbW9kZgorZnVuY3Rpb25zIHJldHVybiB0aGUgdmFsdWUKKy5TbSBvZmYKKy5GYSB4IC0gRW0gaSAqIEZhIHkgLAorLlNtIG9uCitmb3Igc29tZSBpbnRlZ2VyCisuRW0gaQorc3VjaCB0aGF0LCBpZgorLkZhIHkKK2lzIG5vbi16ZXJvLCB0aGUgcmVzdWx0IGhhcyB0aGUgc2FtZSBzaWduIGFzCisuRmEgeAorYW5kIG1hZ25pdHVkZSBsZXNzIHRoYW4gdGhlIG1hZ25pdHVkZSBvZgorLkZhIHkgLgorSWYKKy5GYSB5CitpcyB6ZXJvLCB3aGV0aGVyIGEgZG9tYWluIGVycm9yIG9jY3VycyBvciB0aGUKKy5GbiBmbW9kCithbmQgdGhlCisuRm4gZm1vZGYKK2Z1bmN0aW9uIHJldHVybnMgemVybyBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgorLlNoIFNFRSBBTFNPCisuWHIgbWF0aCAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiBmbW9kCitmdW5jdGlvbiBjb25mb3JtcyB0bworLlN0IC1pc29DIC4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL2h5cG90LjMgYi9saWJtL21hbi9oeXBvdC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MmEyYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi9oeXBvdC4zCkBAIC0wLDAgKzEsMTM0IEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTg1LCAxOTkxIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgICAgIGZyb206IEAoIyloeXBvdC4zCTYuNyAoQmVya2VsZXkpIDUvNi85MQorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL2h5cG90LjMsdiAxLjEzIDIwMDUvMDEvMTQgMjM6Mjg6MjggZGFzIEV4cCAkCisuXCIKKy5EZCBKYW51YXJ5IDE0LCAyMDA1CisuRHQgSFlQT1QgMworLk9zCisuU2ggTkFNRQorLk5tIGh5cG90ICwKKy5ObSBoeXBvdGYgLAorLk5tIGNhYnMgLAorLk5tIGNhYnNmCisuTmQgRXVjbGlkZWFuIGRpc3RhbmNlIGFuZCBjb21wbGV4IGFic29sdXRlIHZhbHVlIGZ1bmN0aW9ucworLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBoeXBvdCAiZG91YmxlIHgiICJkb3VibGUgeSIKKy5GdCBmbG9hdAorLkZuIGh5cG90ZiAiZmxvYXQgeCIgImZsb2F0IHkiCisuSW4gY29tcGxleC5oCisuRnQgZG91YmxlCisuRm4gY2FicyAiZG91YmxlIGNvbXBsZXggeiIKKy5GdCBmbG9hdAorLkZuIGNhYnNmICJmbG9hdCBjb21wbGV4IHoiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIGh5cG90CithbmQKKy5GbiBoeXBvdGYKK2Z1bmN0aW9ucworY29tcHV0ZSB0aGUKK3NxcnQoeCp4K3kqeSkKK2luIHN1Y2ggYSB3YXkgdGhhdCB1bmRlcmZsb3cgd2lsbCBub3QgaGFwcGVuLCBhbmQgb3ZlcmZsb3cKK29jY3VycyBvbmx5IGlmIHRoZSBmaW5hbCByZXN1bHQgZGVzZXJ2ZXMgaXQuCitUaGUKKy5GbiBjYWJzCithbmQKKy5GbiBjYWJzZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIGNvbXBsZXggYWJzb2x1dGUgdmFsdWUgb2YKKy5GYSB6IC4KKy5QcAorLkZuIGh5cG90ICJcKihJZiIgInYiCis9CisuRm4gaHlwb3QgInYiICJcKihJZiIKKz0gK1wqKElmIGZvciBhbGwKKy5GYSB2ICwKK2luY2x1ZGluZyBcKihOYS4KKy5TaCBFUlJPUiAoZHVlIHRvIFJvdW5kb2ZmLCBldGMuKQorQmVsb3cgMC45NworLkVtIHVscHMgLgorQ29uc2VxdWVudGx5CisuRm4gaHlwb3QgIjUuMCIgIjEyLjAiCis9IDEzLjAKK2V4YWN0bHk7CitpbiBnZW5lcmFsLCBoeXBvdCBhbmQgY2FicyByZXR1cm4gYW4gaW50ZWdlciB3aGVuZXZlciBhbgoraW50ZWdlciBtaWdodCBiZSBleHBlY3RlZC4KKy5QcAorVGhlIHNhbWUgY2Fubm90IGJlIHNhaWQgZm9yIHRoZSBzaG9ydGVyIGFuZCBmYXN0ZXIgdmVyc2lvbiBvZiBoeXBvdAorYW5kIGNhYnMgdGhhdCBpcyBwcm92aWRlZCBpbiB0aGUgY29tbWVudHMgaW4gY2Ficy5jOyBpdHMgZXJyb3IgY2FuCitleGNlZWQgMS4yCisuRW0gdWxwcyAuCisuU2ggTk9URVMKK0FzIG1pZ2h0IGJlIGV4cGVjdGVkLAorLkZuIGh5cG90ICJ2IiAiXCooTmEiCithbmQKKy5GbiBoeXBvdCAiXCooTmEiICJ2IgorYXJlIFwqKE5hIGZvciBhbGwKKy5FbSBmaW5pdGUKKy5GYSB2IC4KK0J1dCBwcm9ncmFtbWVycworbWlnaHQgYmUgc3VycHJpc2VkIGF0IGZpcnN0IHRvIGRpc2NvdmVyIHRoYXQKKy5GbiBoeXBvdCAiXCgrLVwqKElmIiAiXCooTmEiCis9ICtcKihJZi4KK1RoaXMgaXMgaW50ZW50aW9uYWw7IGl0IGhhcHBlbnMgYmVjYXVzZQorLkZuIGh5cG90ICJcKihJZiIgInYiCis9ICtcKihJZgorZm9yCisuRW0gYWxsCisuRmEgdiAsCitmaW5pdGUgb3IgaW5maW5pdGUuCitIZW5jZQorLkZuIGh5cG90ICJcKihJZiIgInYiCitpcyBpbmRlcGVuZGVudCBvZgorLkZhIHYgLgorVW5saWtlIHRoZSByZXNlcnZlZCBvcGVyYW5kIGZhdWx0IG9uIGEKKy5UbiBWQVggLAordGhlCisuVG4gSUVFRQorXCooTmEgaXMgZGVzaWduZWQgdG8KK2Rpc2FwcGVhciB3aGVuIGl0IHR1cm5zIG91dCB0byBiZSBpcnJlbGV2YW50LCBhcyBpdCBkb2VzIGluCisuRm4gaHlwb3QgIlwqKElmIiAiXCooTmEiIC4KKy5TaCBTRUUgQUxTTworLlhyIG1hdGggMyAsCisuWHIgc3FydCAzCisuU2ggSElTVE9SWQorQm90aCBhCisuRm4gaHlwb3QKK2Z1bmN0aW9uIGFuZCBhCisuRm4gY2FicworZnVuY3Rpb24KK2FwcGVhcmVkIGluCisuQXQgdjcgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vaWVlZS4zIGIvbGlibS9tYW4vaWVlZS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNzA4N2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi9pZWVlLjMKQEAgLTAsMCArMSw0NDggQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKWllZWUuMwk2LjQgKEJlcmtlbGV5KSA1LzYvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9pZWVlLjMsdiAxLjIyIDIwMDUvMDYvMTYgMjE6NTU6NDUgcnUgRXhwICQKKy5cIgorLkRkIEphbnVhcnkgMjYsIDIwMDUKKy5EdCBJRUVFIDMKKy5PcworLlNoIE5BTUUKKy5ObSBpZWVlCisuTmQgSUVFRSBzdGFuZGFyZCA3NTQgZm9yIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMKKy5TaCBERVNDUklQVElPTgorVGhlIElFRUUgU3RhbmRhcmQgNzU0IGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYworZGVmaW5lcyByZXByZXNlbnRhdGlvbnMgb2YgZmxvYXRpbmctcG9pbnQgbnVtYmVycyBhbmQgYWJzdHJhY3QKK3Byb3BlcnRpZXMgb2YgYXJpdGhtZXRpYyBvcGVyYXRpb25zIHJlbGF0aW5nIHRvIHByZWNpc2lvbiwKK3JvdW5kaW5nLCBhbmQgZXhjZXB0aW9uYWwgY2FzZXMsIGFzIGRlc2NyaWJlZCBiZWxvdy4KKy5TcyBJRUVFIFNUQU5EQVJEIDc1NCBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljCitSYWRpeDogQmluYXJ5LgorLlBwCitPdmVyZmxvdyBhbmQgdW5kZXJmbG93OgorLkJkIC1yYWdnZWQgLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKK092ZXJmbG93IGdvZXMgYnkgZGVmYXVsdCB0byBhIHNpZ25lZCBcKihJZi4KK1VuZGVyZmxvdyBpcworLkVtIGdyYWR1YWwgLgorLkVkCisuUHAKK1plcm8gaXMgcmVwcmVzZW50ZWQgYW1iaWd1b3VzbHkgYXMgKzAgb3IgXC0wLgorLkJkIC1yYWdnZWQgLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKK0l0cyBzaWduIHRyYW5zZm9ybXMgY29ycmVjdGx5IHRocm91Z2ggbXVsdGlwbGljYXRpb24gb3IKK2RpdmlzaW9uLCBhbmQgaXMgcHJlc2VydmVkIGJ5IGFkZGl0aW9uIG9mIHplcm9zCit3aXRoIGxpa2Ugc2lnbnM7IGJ1dCB4XC14IHlpZWxkcyArMCBmb3IgZXZlcnkKK2Zpbml0ZSB4LgorVGhlIG9ubHkgb3BlcmF0aW9ucyB0aGF0IHJldmVhbCB6ZXJvJ3MKK3NpZ24gYXJlIGRpdmlzaW9uIGJ5IHplcm8gYW5kCisuRm4gY29weXNpZ24geCBcKCstMCAuCitJbiBwYXJ0aWN1bGFyLCBjb21wYXJpc29uICh4ID4geSwgeCBcKD49IHksIGV0Yy4pXCYKK2Nhbm5vdCBiZSBhZmZlY3RlZCBieSB0aGUgc2lnbiBvZiB6ZXJvOyBidXQgaWYKK2Zpbml0ZSB4ID0geSB0aGVuIFwqKElmID0gMS8oeFwteSkgXCghPSBcLTEvKHlcLXgpID0gXC1cKihJZi4KKy5FZAorLlBwCitJbmZpbml0eSBpcyBzaWduZWQuCisuQmQgLXJhZ2dlZCAtb2Zmc2V0IGluZGVudCAtY29tcGFjdAorSXQgcGVyc2lzdHMgd2hlbiBhZGRlZCB0byBpdHNlbGYKK29yIHRvIGFueSBmaW5pdGUgbnVtYmVyLgorSXRzIHNpZ24gdHJhbnNmb3JtcworY29ycmVjdGx5IHRocm91Z2ggbXVsdGlwbGljYXRpb24gYW5kIGRpdmlzaW9uLCBhbmQKKyhmaW5pdGUpL1woKy1cKihJZlwwPVwwXCgrLTAKKyhub256ZXJvKS8wID0gXCgrLVwqKElmLgorQnV0CitcKihJZlwtXCooSWYsIFwqKElmXCgqKjAgYW5kIFwqKElmL1wqKElmCithcmUsIGxpa2UgMC8wIGFuZCBzcXJ0KFwtMyksCitpbnZhbGlkIG9wZXJhdGlvbnMgdGhhdCBwcm9kdWNlIFwqKE5hLiAuLi4KKy5FZAorLlBwCitSZXNlcnZlZCBvcGVyYW5kcyAoXCooTmFzKToKKy5CZCAtcmFnZ2VkIC1vZmZzZXQgaW5kZW50IC1jb21wYWN0CitBbiBcKihOYSBpcworLkVtICggTiBOcyBvdCBFbSBhIE4gTnMgdW1iZXIgKSAuCitTb21lIFwqKE5hcywgY2FsbGVkIFNpZ25hbGluZyBcKihOYXMsIHRyYXAgYW55IGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbgorcGVyZm9ybWVkIHVwb24gdGhlbTsgdGhleSBhcmUgdXNlZCB0byBtYXJrIG1pc3NpbmcKK29yIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCBvciBub25leGlzdGVudCBlbGVtZW50cworb2YgYXJyYXlzLgorVGhlIHJlc3QgYXJlIFF1aWV0IFwqKE5hczsgdGhleSBhcmUKK3RoZSBkZWZhdWx0IHJlc3VsdHMgb2YgSW52YWxpZCBPcGVyYXRpb25zLCBhbmQKK3Byb3BhZ2F0ZSB0aHJvdWdoIHN1YnNlcXVlbnQgYXJpdGhtZXRpYyBvcGVyYXRpb25zLgorSWYgeCBcKCE9IHggdGhlbiB4IGlzIFwqKE5hOyBldmVyeSBvdGhlciBwcmVkaWNhdGUKKyh4ID4geSwgeCA9IHksIHggPCB5LCAuLi4pIGlzIEZBTFNFIGlmIFwqKE5hIGlzIGludm9sdmVkLgorLkVkCisuUHAKK1JvdW5kaW5nOgorLkJkIC1yYWdnZWQgLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKK0V2ZXJ5IGFsZ2VicmFpYyBvcGVyYXRpb24gKCssIFwtLCBcKCoqLCAvLAorXChzcikKK2lzIHJvdW5kZWQgYnkgZGVmYXVsdCB0byB3aXRoaW4gaGFsZiBhbgorLkVtIHVscCAsCithbmQgd2hlbiB0aGUgcm91bmRpbmcgZXJyb3IgaXMgZXhhY3RseSBoYWxmIGFuCisuRW0gdWxwCit0aGVuCit0aGUgcm91bmRlZCB2YWx1ZSdzIGxlYXN0IHNpZ25pZmljYW50IGJpdCBpcyB6ZXJvLgorKEFuCisuRW0gdWxwCitpcyBvbmUKKy5FbSBVIE5zIG5pdAoraW4gdGhlCisuRW0gTCBOcyBhc3QKKy5FbSBQIE5zIGxhY2UgLiApCitUaGlzIGtpbmQgb2Ygcm91bmRpbmcgaXMgdXN1YWxseSB0aGUgYmVzdCBraW5kLAorc29tZXRpbWVzIHByb3ZhYmx5IHNvOyBmb3IgaW5zdGFuY2UsIGZvciBldmVyeQoreCA9IDEuMCwgMi4wLCAzLjAsIDQuMCwgLi4uLCAyLjAqKjUyLCB3ZSBmaW5kCisoeC8zLjApXCgqKjMuMCA9PSB4IGFuZCAoeC8xMC4wKVwoKioxMC4wID09IHggYW5kIC4uLgorZGVzcGl0ZSB0aGF0IGJvdGggdGhlIHF1b3RpZW50cyBhbmQgdGhlIHByb2R1Y3RzCitoYXZlIGJlZW4gcm91bmRlZC4KK09ubHkgcm91bmRpbmcgbGlrZSBJRUVFIDc1NCBjYW4gZG8gdGhhdC4KK0J1dCBubyBzaW5nbGUga2luZCBvZiByb3VuZGluZyBjYW4gYmUKK3Byb3ZlZCBiZXN0IGZvciBldmVyeSBjaXJjdW1zdGFuY2UsIHNvIElFRUUgNzU0Citwcm92aWRlcyByb3VuZGluZyB0b3dhcmRzIHplcm8gb3IgdG93YXJkcworK1wqKElmIG9yIHRvd2FyZHMgXC1cKihJZgorYXQgdGhlIHByb2dyYW1tZXIncyBvcHRpb24uCisuRWQKKy5QcAorRXhjZXB0aW9uczoKKy5CZCAtcmFnZ2VkIC1vZmZzZXQgaW5kZW50IC1jb21wYWN0CitJRUVFIDc1NCByZWNvZ25pemVzIGZpdmUga2luZHMgb2YgZmxvYXRpbmctcG9pbnQgZXhjZXB0aW9ucywKK2xpc3RlZCBiZWxvdyBpbiBkZWNsaW5pbmcgb3JkZXIgb2YgcHJvYmFibGUgaW1wb3J0YW5jZS4KKy5CbCAtY29sdW1uIC1vZmZzZXQgaW5kZW50ICJJbnZhbGlkIE9wZXJhdGlvbiIgIkdyYWR1YWwgVW5kZXJmbG93IgorLkVtICJFeGNlcHRpb24JRGVmYXVsdCBSZXN1bHQiCitJbnZhbGlkIE9wZXJhdGlvbglcKihOYSwgb3IgRkFMU0UKK092ZXJmbG93CVwoKy1cKihJZgorRGl2aWRlIGJ5IFplcm8JXCgrLVwqKElmCitVbmRlcmZsb3cJR3JhZHVhbCBVbmRlcmZsb3cKK0luZXhhY3QJUm91bmRlZCB2YWx1ZQorLkVsCisuUHAKK05PVEU6IEFuIEV4Y2VwdGlvbiBpcyBub3QgYW4gRXJyb3IgdW5sZXNzIGhhbmRsZWQKK2JhZGx5LgorV2hhdCBtYWtlcyBhIGNsYXNzIG9mIGV4Y2VwdGlvbnMgZXhjZXB0aW9uYWwKK2lzIHRoYXQgbm8gc2luZ2xlIGRlZmF1bHQgcmVzcG9uc2UgY2FuIGJlIHNhdGlzZmFjdG9yeQoraW4gZXZlcnkgaW5zdGFuY2UuCitPbiB0aGUgb3RoZXIgaGFuZCwgaWYgYSBkZWZhdWx0CityZXNwb25zZSB3aWxsIHNlcnZlIG1vc3QgaW5zdGFuY2VzIHNhdGlzZmFjdG9yaWx5LAordGhlIHVuc2F0aXNmYWN0b3J5IGluc3RhbmNlcyBjYW5ub3QganVzdGlmeSBhYm9ydGluZworY29tcHV0YXRpb24gZXZlcnkgdGltZSB0aGUgZXhjZXB0aW9uIG9jY3Vycy4KKy5FZAorLlNzIERhdGEgRm9ybWF0cworU2luZ2xlLXByZWNpc2lvbjoKKy5CZCAtcmFnZ2VkIC1vZmZzZXQgaW5kZW50IC1jb21wYWN0CitUeXBlIG5hbWU6CisuVnQgZmxvYXQKKy5QcAorV29yZHNpemU6IDMyIGJpdHMuCisuUHAKK1ByZWNpc2lvbjogMjQgc2lnbmlmaWNhbnQgYml0cywKK3JvdWdobHkgbGlrZSA3IHNpZ25pZmljYW50IGRlY2ltYWxzLgorLkJkIC1yYWdnZWQgLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKK0lmIHggYW5kIHgnIGFyZSBjb25zZWN1dGl2ZSBwb3NpdGl2ZSBzaW5nbGUtcHJlY2lzaW9uCitudW1iZXJzICh0aGV5IGRpZmZlciBieSAxCisuRW0gdWxwICkgLAordGhlbgorLkJkIC1yYWdnZWQgLWNvbXBhY3QKKzUuOWVcLTA4IDwgMC41KioyNCA8ICh4J1wteCkveCBcKDw9IDAuNSoqMjMgPCAxLjJlXC0wNy4KKy5FZAorLkVkCisuUHAKKy5CbCAtY29sdW1uICJYWFgiIC1jb21wYWN0CitSYW5nZToJT3ZlcmZsb3cgdGhyZXNob2xkICA9IDIuMCoqMTI4ID0gMy40ZTM4CisJVW5kZXJmbG93IHRocmVzaG9sZCA9IDAuNSoqMTI2ID0gMS4yZVwtMzgKKy5FbAorLkJkIC1yYWdnZWQgLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKK1VuZGVyZmxvd2VkIHJlc3VsdHMgcm91bmQgdG8gdGhlIG5lYXJlc3QKK2ludGVnZXIgbXVsdGlwbGUgb2YgMC41KioxNDkgPSAxLjRlXC00NS4KKy5FZAorLkVkCisuUHAKK0RvdWJsZS1wcmVjaXNpb246CisuQmQgLXJhZ2dlZCAtb2Zmc2V0IGluZGVudCAtY29tcGFjdAorVHlwZSBuYW1lOgorLlZ0IGRvdWJsZQorLkJkIC1yYWdnZWQgLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKK09uIHNvbWUgYXJjaGl0ZWN0dXJlcywKKy5WdCBsb25nIGRvdWJsZQoraXMgdGhlIHRoZSBzYW1lIGFzCisuVnQgZG91YmxlIC4KKy5FZAorLlBwCitXb3Jkc2l6ZTogNjQgYml0cy4KKy5QcAorUHJlY2lzaW9uOiA1MyBzaWduaWZpY2FudCBiaXRzLAorcm91Z2hseSBsaWtlIDE2IHNpZ25pZmljYW50IGRlY2ltYWxzLgorLkJkIC1yYWdnZWQgLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKK0lmIHggYW5kIHgnIGFyZSBjb25zZWN1dGl2ZSBwb3NpdGl2ZSBkb3VibGUtcHJlY2lzaW9uCitudW1iZXJzICh0aGV5IGRpZmZlciBieSAxCisuRW0gdWxwICkgLAordGhlbgorLkJkIC1yYWdnZWQgLWNvbXBhY3QKKzEuMWVcLTE2IDwgMC41Kio1MyA8ICh4J1wteCkveCBcKDw9IDAuNSoqNTIgPCAyLjNlXC0xNi4KKy5FZAorLkVkCisuUHAKKy5CbCAtY29sdW1uICJYWFgiIC1jb21wYWN0CitSYW5nZToJT3ZlcmZsb3cgdGhyZXNob2xkICA9IDIuMCoqMTAyNCA9IDEuOGUzMDgKKwlVbmRlcmZsb3cgdGhyZXNob2xkID0gMC41KioxMDIyID0gMi4yZVwtMzA4CisuRWwKKy5CZCAtcmFnZ2VkIC1vZmZzZXQgaW5kZW50IC1jb21wYWN0CitVbmRlcmZsb3dlZCByZXN1bHRzIHJvdW5kIHRvIHRoZSBuZWFyZXN0CitpbnRlZ2VyIG11bHRpcGxlIG9mIDAuNSoqMTA3NCA9IDQuOWVcLTMyNC4KKy5FZAorLkVkCisuUHAKK0V4dGVuZGVkLXByZWNpc2lvbjoKKy5CZCAtcmFnZ2VkIC1vZmZzZXQgaW5kZW50IC1jb21wYWN0CitUeXBlIG5hbWU6CisuVnQgbG9uZyBkb3VibGUKKyh3aGVuIHN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUpCisuUHAKK1dvcmRzaXplOiA5NiBiaXRzLgorLlBwCitQcmVjaXNpb246IDY0IHNpZ25pZmljYW50IGJpdHMsCityb3VnaGx5IGxpa2UgMTkgc2lnbmlmaWNhbnQgZGVjaW1hbHMuCisuQmQgLXJhZ2dlZCAtb2Zmc2V0IGluZGVudCAtY29tcGFjdAorSWYgeCBhbmQgeCcgYXJlIGNvbnNlY3V0aXZlIHBvc2l0aXZlIGRvdWJsZS1wcmVjaXNpb24KK251bWJlcnMgKHRoZXkgZGlmZmVyIGJ5IDEKKy5FbSB1bHAgKSAsCit0aGVuCisuQmQgLXJhZ2dlZCAtY29tcGFjdAorMS4wZVwtMTkgPCAwLjUqKjYzIDwgKHgnXC14KS94IFwoPD0gMC41Kio2MiA8IDIuMmVcLTE5LgorLkVkCisuRWQKKy5QcAorLkJsIC1jb2x1bW4gIlhYWCIgLWNvbXBhY3QKK1JhbmdlOglPdmVyZmxvdyB0aHJlc2hvbGQgID0gMi4wKioxNjM4NCA9IDEuMmU0OTMyCisJVW5kZXJmbG93IHRocmVzaG9sZCA9IDAuNSoqMTYzODIgPSAzLjRlXC00OTMyCisuRWwKKy5CZCAtcmFnZ2VkIC1vZmZzZXQgaW5kZW50IC1jb21wYWN0CitVbmRlcmZsb3dlZCByZXN1bHRzIHJvdW5kIHRvIHRoZSBuZWFyZXN0CitpbnRlZ2VyIG11bHRpcGxlIG9mIDAuNSoqMTY0NDUgPSA1LjdlXC00OTUzLgorLkVkCisuRWQKKy5QcAorUXVhZC1leHRlbmRlZC1wcmVjaXNpb246CisuQmQgLXJhZ2dlZCAtb2Zmc2V0IGluZGVudCAtY29tcGFjdAorVHlwZSBuYW1lOgorLlZ0IGxvbmcgZG91YmxlCisod2hlbiBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlKQorLlBwCitXb3Jkc2l6ZTogMTI4IGJpdHMuCisuUHAKK1ByZWNpc2lvbjogMTEzIHNpZ25pZmljYW50IGJpdHMsCityb3VnaGx5IGxpa2UgMzQgc2lnbmlmaWNhbnQgZGVjaW1hbHMuCisuQmQgLXJhZ2dlZCAtb2Zmc2V0IGluZGVudCAtY29tcGFjdAorSWYgeCBhbmQgeCcgYXJlIGNvbnNlY3V0aXZlIHBvc2l0aXZlIGRvdWJsZS1wcmVjaXNpb24KK251bWJlcnMgKHRoZXkgZGlmZmVyIGJ5IDEKKy5FbSB1bHAgKSAsCit0aGVuCisuQmQgLXJhZ2dlZCAtY29tcGFjdAorOS42ZVwtMzUgPCAwLjUqKjExMyA8ICh4J1wteCkveCBcKDw9IDAuNSoqMTEyIDwgMi4wZVwtMzQuCisuRWQKKy5FZAorLlBwCisuQmwgLWNvbHVtbiAiWFhYIiAtY29tcGFjdAorUmFuZ2U6CU92ZXJmbG93IHRocmVzaG9sZCAgPSAyLjAqKjE2Mzg0ID0gMS4yZTQ5MzIKKwlVbmRlcmZsb3cgdGhyZXNob2xkID0gMC41KioxNjM4MiA9IDMuNGVcLTQ5MzIKKy5FbAorLkJkIC1yYWdnZWQgLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKK1VuZGVyZmxvd2VkIHJlc3VsdHMgcm91bmQgdG8gdGhlIG5lYXJlc3QKK2ludGVnZXIgbXVsdGlwbGUgb2YgMC41KioxNjQ5NCA9IDYuNWVcLTQ5NjYuCisuRWQKKy5FZAorLlNzIEFkZGl0aW9uYWwgSW5mb3JtYXRpb24gUmVnYXJkaW5nIEV4Y2VwdGlvbnMKKy5QcAorRm9yIGVhY2gga2luZCBvZiBmbG9hdGluZy1wb2ludCBleGNlcHRpb24sIElFRUUgNzU0Citwcm92aWRlcyBhIEZsYWcgdGhhdCBpcyByYWlzZWQgZWFjaCB0aW1lIGl0cyBleGNlcHRpb24KK2lzIHNpZ25hbGVkLCBhbmQgc3RheXMgcmFpc2VkIHVudGlsIHRoZSBwcm9ncmFtIHJlc2V0cworaXQuCitQcm9ncmFtcyBtYXkgYWxzbyB0ZXN0LCBzYXZlIGFuZCByZXN0b3JlIGEgZmxhZy4KK1RodXMsIElFRUUgNzU0IHByb3ZpZGVzIHRocmVlIHdheXMgYnkgd2hpY2ggcHJvZ3JhbXMKK21heSBjb3BlIHdpdGggZXhjZXB0aW9ucyBmb3Igd2hpY2ggdGhlIGRlZmF1bHQgcmVzdWx0CittaWdodCBiZSB1bnNhdGlzZmFjdG9yeToKKy5CbCAtZW51bQorLkl0CitUZXN0IGZvciBhIGNvbmRpdGlvbiB0aGF0IG1pZ2h0IGNhdXNlIGFuIGV4Y2VwdGlvbgorbGF0ZXIsIGFuZCBicmFuY2ggdG8gYXZvaWQgdGhlIGV4Y2VwdGlvbi4KKy5JdAorVGVzdCBhIGZsYWcgdG8gc2VlIHdoZXRoZXIgYW4gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZAorc2luY2UgdGhlIHByb2dyYW0gbGFzdCByZXNldCBpdHMgZmxhZy4KKy5JdAorVGVzdCBhIHJlc3VsdCB0byBzZWUgd2hldGhlciBpdCBpcyBhIHZhbHVlIHRoYXQgb25seQorYW4gZXhjZXB0aW9uIGNvdWxkIGhhdmUgcHJvZHVjZWQuCisuUHAKK0NBVVRJT046IFRoZSBvbmx5IHJlbGlhYmxlIHdheXMgdG8gZGlzY292ZXIKK3doZXRoZXIgVW5kZXJmbG93IGhhcyBvY2N1cnJlZCBhcmUgdG8gdGVzdCB3aGV0aGVyCitwcm9kdWN0cyBvciBxdW90aWVudHMgbGllIGNsb3NlciB0byB6ZXJvIHRoYW4gdGhlCit1bmRlcmZsb3cgdGhyZXNob2xkLCBvciB0byB0ZXN0IHRoZSBVbmRlcmZsb3cKK2ZsYWcuCisoU3VtcyBhbmQgZGlmZmVyZW5jZXMgY2Fubm90IHVuZGVyZmxvdyBpbgorSUVFRSA3NTQ7IGlmIHggXCghPSB5IHRoZW4geFwteSBpcyBjb3JyZWN0IHRvCitmdWxsIHByZWNpc2lvbiBhbmQgY2VydGFpbmx5IG5vbnplcm8gcmVnYXJkbGVzcyBvZgoraG93IHRpbnkgaXQgbWF5IGJlLikKK1Byb2R1Y3RzIGFuZCBxdW90aWVudHMgdGhhdAordW5kZXJmbG93IGdyYWR1YWxseSBjYW4gbG9zZSBhY2N1cmFjeSBncmFkdWFsbHkKK3dpdGhvdXQgdmFuaXNoaW5nLCBzbyBjb21wYXJpbmcgdGhlbSB3aXRoIHplcm8KKyhhcyBvbmUgbWlnaHQgb24gYSBWQVgpIHdpbGwgbm90IHJldmVhbCB0aGUgbG9zcy4KK0ZvcnR1bmF0ZWx5LCBpZiBhIGdyYWR1YWxseSB1bmRlcmZsb3dlZCB2YWx1ZSBpcworZGVzdGluZWQgdG8gYmUgYWRkZWQgdG8gc29tZXRoaW5nIGJpZ2dlciB0aGFuIHRoZQordW5kZXJmbG93IHRocmVzaG9sZCwgYXMgaXMgYWxtb3N0IGFsd2F5cyB0aGUgY2FzZSwKK2RpZ2l0cyBsb3N0IHRvIGdyYWR1YWwgdW5kZXJmbG93IHdpbGwgbm90IGJlIG1pc3NlZAorYmVjYXVzZSB0aGV5IHdvdWxkIGhhdmUgYmVlbiByb3VuZGVkIG9mZiBhbnl3YXkuCitTbyBncmFkdWFsIHVuZGVyZmxvd3MgYXJlIHVzdWFsbHkKKy5FbSBwcm92YWJseQoraWdub3JhYmxlLgorVGhlIHNhbWUgY2Fubm90IGJlIHNhaWQgb2YgdW5kZXJmbG93cyBmbHVzaGVkIHRvIDAuCisuRWwKKy5QcAorQXQgdGhlIG9wdGlvbiBvZiBhbiBpbXBsZW1lbnRvciBjb25mb3JtaW5nIHRvIElFRUUgNzU0LAorb3RoZXIgd2F5cyB0byBjb3BlIHdpdGggZXhjZXB0aW9ucyBtYXkgYmUgcHJvdmlkZWQ6CisuQmwgLWVudW0KKy5JdAorQUJPUlQuCitUaGlzIG1lY2hhbmlzbSBjbGFzc2lmaWVzIGFuIGV4Y2VwdGlvbiBpbgorYWR2YW5jZSBhcyBhbiBpbmNpZGVudCB0byBiZSBoYW5kbGVkIGJ5IG1lYW5zCit0cmFkaXRpb25hbGx5IGFzc29jaWF0ZWQgd2l0aCBlcnJvci1oYW5kbGluZworc3RhdGVtZW50cyBsaWtlICJPTiBFUlJPUiBHTyBUTyAuLi4iLgorRGlmZmVyZW50CitsYW5ndWFnZXMgb2ZmZXIgZGlmZmVyZW50IGZvcm1zIG9mIHRoaXMgc3RhdGVtZW50LAorYnV0IG1vc3Qgc2hhcmUgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJpc3RpY3M6CisuQmwgLWRhc2gKKy5JdAorTm8gbWVhbnMgaXMgcHJvdmlkZWQgdG8gc3Vic3RpdHV0ZSBhIHZhbHVlIGZvcgordGhlIG9mZmVuZGluZyBvcGVyYXRpb24ncyByZXN1bHQgYW5kIHJlc3VtZQorY29tcHV0YXRpb24gZnJvbSB3aGF0IG1heSBiZSB0aGUgbWlkZGxlIG9mIGFuCitleHByZXNzaW9uLgorQW4gZXhjZXB0aW9uYWwgcmVzdWx0IGlzIGFiYW5kb25lZC4KKy5JdAorSW4gYSBzdWJwcm9ncmFtIHRoYXQgbGFja3MgYW4gZXJyb3ItaGFuZGxpbmcKK3N0YXRlbWVudCwgYW4gZXhjZXB0aW9uIGNhdXNlcyB0aGUgc3VicHJvZ3JhbSB0bworYWJvcnQgd2l0aGluIHdoYXRldmVyIHByb2dyYW0gY2FsbGVkIGl0LCBhbmQgc28KK29uIGJhY2sgdXAgdGhlIGNoYWluIG9mIGNhbGxpbmcgc3VicHJvZ3JhbXMgdW50aWwKK2FuIGVycm9yLWhhbmRsaW5nIHN0YXRlbWVudCBpcyBlbmNvdW50ZXJlZCBvciB0aGUKK3dob2xlIHRhc2sgaXMgYWJvcnRlZCBhbmQgbWVtb3J5IGlzIGR1bXBlZC4KKy5FbAorLkl0CitTVE9QLgorVGhpcyBtZWNoYW5pc20sIHJlcXVpcmluZyBhbiBpbnRlcmFjdGl2ZQorZGVidWdnaW5nIGVudmlyb25tZW50LCBpcyBtb3JlIGZvciB0aGUgcHJvZ3JhbW1lcgordGhhbiB0aGUgcHJvZ3JhbS4KK0l0IGNsYXNzaWZpZXMgYW4gZXhjZXB0aW9uIGluCithZHZhbmNlIGFzIGEgc3ltcHRvbSBvZiBhIHByb2dyYW1tZXIncyBlcnJvcjsgdGhlCitleGNlcHRpb24gc3VzcGVuZHMgZXhlY3V0aW9uIGFzIG5lYXIgYXMgaXQgY2FuIHRvCit0aGUgb2ZmZW5kaW5nIG9wZXJhdGlvbiBzbyB0aGF0IHRoZSBwcm9ncmFtbWVyIGNhbgorbG9vayBhcm91bmQgdG8gc2VlIGhvdyBpdCBoYXBwZW5lZC4KK1F1aXRlIG9mdGVuCit0aGUgZmlyc3Qgc2V2ZXJhbCBleGNlcHRpb25zIHR1cm4gb3V0IHRvIGJlIHF1aXRlCit1bmV4Y2VwdGlvbmFibGUsIHNvIHRoZSBwcm9ncmFtbWVyIG91Z2h0IGlkZWFsbHkKK3RvIGJlIGFibGUgdG8gcmVzdW1lIGV4ZWN1dGlvbiBhZnRlciBlYWNoIG9uZSBhcyBpZgorZXhlY3V0aW9uIGhhZCBub3QgYmVlbiBzdG9wcGVkLgorLkl0CitcJi4uLiBPdGhlciB3YXlzIGxpZSBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgZG9jdW1lbnQuCisuRWwKKy5QcAorSWRlYWxseSwgZWFjaAorZWxlbWVudGFyeSBmdW5jdGlvbiBzaG91bGQgYWN0IGFzIGlmIGl0IHdlcmUgaW5kaXZpc2libGUsIG9yCithdG9taWMsIGluIHRoZSBzZW5zZSB0aGF0IC4uLgorLkJsIC1lbnVtCisuSXQKK05vIGV4Y2VwdGlvbiBzaG91bGQgYmUgc2lnbmFsZWQgdGhhdCBpcyBub3QgZGVzZXJ2ZWQgYnkKK3RoZSBkYXRhIHN1cHBsaWVkIHRvIHRoYXQgZnVuY3Rpb24uCisuSXQKK0FueSBleGNlcHRpb24gc2lnbmFsZWQgc2hvdWxkIGJlIGlkZW50aWZpZWQgd2l0aCB0aGF0CitmdW5jdGlvbiByYXRoZXIgdGhhbiB3aXRoIG9uZSBvZiBpdHMgc3Vicm91dGluZXMuCisuSXQKK1RoZSBpbnRlcm5hbCBiZWhhdmlvciBvZiBhbiBhdG9taWMgZnVuY3Rpb24gc2hvdWxkIG5vdAorYmUgZGlzcnVwdGVkIHdoZW4gYSBjYWxsaW5nIHByb2dyYW0gY2hhbmdlcyBmcm9tCitvbmUgdG8gYW5vdGhlciBvZiB0aGUgZml2ZSBvciBzbyB3YXlzIG9mIGhhbmRsaW5nCitleGNlcHRpb25zIGxpc3RlZCBhYm92ZSwgYWx0aG91Z2ggdGhlIGRlZmluaXRpb24KK29mIHRoZSBmdW5jdGlvbiBtYXkgYmUgY29ycmVsYXRlZCBpbnRlbnRpb25hbGx5Cit3aXRoIGV4Y2VwdGlvbiBoYW5kbGluZy4KKy5FbAorLlBwCitUaGUgZnVuY3Rpb25zIGluCisuTm0gbGlibQorYXJlIG9ubHkgYXBwcm94aW1hdGVseSBhdG9taWMuCitUaGV5IHNpZ25hbCBubyBpbmFwcHJvcHJpYXRlIGV4Y2VwdGlvbiBleGNlcHQgcG9zc2libHkgLi4uCisuQmwgLXRhZyAtd2lkdGggaW5kZW50IC1vZmZzZXQgaW5kZW50IC1jb21wYWN0CisuSXQgWG8KK092ZXIvVW5kZXJmbG93CisuWGMKK3doZW4gYSByZXN1bHQsIGlmIHByb3Blcmx5IGNvbXB1dGVkLCBtaWdodCBoYXZlIGxhaW4gYmFyZWx5IHdpdGhpbiByYW5nZSwgYW5kCisuSXQgWG8KK0luZXhhY3QgaW4KKy5GbiBjYWJzICwKKy5GbiBjYnJ0ICwKKy5GbiBoeXBvdCAsCisuRm4gbG9nMTAKK2FuZAorLkZuIHBvdworLlhjCit3aGVuIGl0IGhhcHBlbnMgdG8gYmUgZXhhY3QsIHRoYW5rcyB0byBmb3J0dWl0b3VzIGNhbmNlbGxhdGlvbiBvZiBlcnJvcnMuCisuRWwKK090aGVyd2lzZSwgLi4uCisuQmwgLXRhZyAtd2lkdGggaW5kZW50IC1vZmZzZXQgaW5kZW50IC1jb21wYWN0CisuSXQgWG8KK0ludmFsaWQgT3BlcmF0aW9uIGlzIHNpZ25hbGVkIG9ubHkgd2hlbgorLlhjCithbnkgcmVzdWx0IGJ1dCBcKihOYSB3b3VsZCBwcm9iYWJseSBiZSBtaXNsZWFkaW5nLgorLkl0IFhvCitPdmVyZmxvdyBpcyBzaWduYWxlZCBvbmx5IHdoZW4KKy5YYwordGhlIGV4YWN0IHJlc3VsdCB3b3VsZCBiZSBmaW5pdGUgYnV0IGJleW9uZCB0aGUgb3ZlcmZsb3cgdGhyZXNob2xkLgorLkl0IFhvCitEaXZpZGUtYnktWmVybyBpcyBzaWduYWxlZCBvbmx5IHdoZW4KKy5YYworYSBmdW5jdGlvbiB0YWtlcyBleGFjdGx5IGluZmluaXRlIHZhbHVlcyBhdCBmaW5pdGUgb3BlcmFuZHMuCisuSXQgWG8KK1VuZGVyZmxvdyBpcyBzaWduYWxlZCBvbmx5IHdoZW4KKy5YYwordGhlIGV4YWN0IHJlc3VsdCB3b3VsZCBiZSBub256ZXJvIGJ1dCB0aW5pZXIgdGhhbiB0aGUgdW5kZXJmbG93IHRocmVzaG9sZC4KKy5JdCBYbworSW5leGFjdCBpcyBzaWduYWxlZCBvbmx5IHdoZW4KKy5YYworZ3JlYXRlciByYW5nZSBvciBwcmVjaXNpb24gd291bGQgYmUgbmVlZGVkIHRvIHJlcHJlc2VudCB0aGUgZXhhY3QgcmVzdWx0LgorLkVsCisuU2ggU0VFIEFMU08KKy5YciBmZW52IDMgLAorLlhyIGllZWVfdGVzdCAzICwKKy5YciBtYXRoIDMKKy5QcAorQW4gZXhwbGFuYXRpb24gb2YgSUVFRSA3NTQgYW5kIGl0cyBwcm9wb3NlZCBleHRlbnNpb24gcDg1NAord2FzIHB1Ymxpc2hlZCBpbiB0aGUgSUVFRSBtYWdhemluZSBNSUNSTyBpbiBBdWd1c3QgMTk4NCB1bmRlcgordGhlIHRpdGxlICJBIFByb3Bvc2VkIFJhZGl4LSBhbmQgV29yZC1sZW5ndGgtaW5kZXBlbmRlbnQKK1N0YW5kYXJkIGZvciBGbG9hdGluZy1wb2ludCBBcml0aG1ldGljIiBieQorLkFuICJXLiBKLiBDb2R5IgorZXQgYWwuCitUaGUgbWFudWFscyBmb3IgUGFzY2FsLCBDIGFuZCBCQVNJQyBvbiB0aGUgQXBwbGUgTWFjaW50b3NoCitkb2N1bWVudCB0aGUgZmVhdHVyZXMgb2YgSUVFRSA3NTQgcHJldHR5IHdlbGwuCitBcnRpY2xlcyBpbiB0aGUgSUVFRSBtYWdhemluZSBDT01QVVRFUiB2b2wuXCYgMTQgbm8uXCYgMyAoTWFyLlwmCisxOTgxKSwgYW5kIGluIHRoZSBBQ00gU0lHTlVNIE5ld3NsZXR0ZXIgU3BlY2lhbCBJc3N1ZSBvZgorT2N0LlwmIDE5NzksIG1heSBiZSBoZWxwZnVsIGFsdGhvdWdoIHRoZXkgcGVydGFpbiB0bworc3VwZXJzZWRlZCBkcmFmdHMgb2YgdGhlIHN0YW5kYXJkLgorLlNoIFNUQU5EQVJEUworLlN0IC1pZWVlNzU0CmRpZmYgLS1naXQgYS9saWJtL21hbi9pZWVlX3Rlc3QuMyBiL2xpYm0vbWFuL2llZWVfdGVzdC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYmI2YzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi9pZWVlX3Rlc3QuMwpAQCAtMCwwICsxLDkzIEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTg1LCAxOTkxIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgICAgIGZyb206IEAoIylpZWVlLjMJNi40IChCZXJrZWxleSkgNS82LzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vaWVlZV90ZXN0LjMsdiAxLjEzIDIwMDUvMTEvMTcgMTM6MDA6MDAgcnUgRXhwICQKKy5cIgorLkRkIE5vdmVtYmVyIDYsIDIwMDUKKy5EdCBJRUVFX1RFU1QgMworLk9zCisuU2ggTkFNRQorLk5tIHNjYWxiICwKKy5ObSBzY2FsYmYgLAorLk5tIHNpZ25pZmljYW5kICwKKy5ObSBzaWduaWZpY2FuZGYKKy5OZCBJRUVFIHRlc3QgZnVuY3Rpb25zCisuU2ggTElCUkFSWQorLkxiIGxpYm0KKy5TaCBTWU5PUFNJUworLkluIG1hdGguaAorLkZ0IGRvdWJsZQorLkZuIHNjYWxiICJkb3VibGUgeCIgImRvdWJsZSBuIgorLkZ0IGZsb2F0CisuRm4gc2NhbGJmICJmbG9hdCB4IiAiZmxvYXQgbiIKKy5GdCBkb3VibGUKKy5GbiBzaWduaWZpY2FuZCAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBzaWduaWZpY2FuZGYgImZsb2F0IHgiCisuU2ggREVTQ1JJUFRJT04KK1RoZXNlIGZ1bmN0aW9ucyBhbGxvdyB1c2VycyB0byB0ZXN0IGNvbmZvcm1hbmNlIHRvCisuU3QgLWllZWU3NTQgLgorVGhlaXIgdXNlIGlzIG5vdCBvdGhlcndpc2UgcmVjb21tZW5kZWQuCisuUHAKKy5GbiBzY2FsYiB4IG4KK2FuZAorLkZuIHNjYWxiZiB4IG4KK3JldHVybgorLkZhIHggTnMgXCgqKigyKiogTnMgRmEgbiApCitjb21wdXRlZCBieSBleHBvbmVudCBtYW5pcHVsYXRpb24uCitJZgorLkZhIG4KK2lzIG5vdCBhbiBpbnRlZ2VyLCBcKihQbVwqKElmLCBvciBhbiBcKihOYSwgdGhlIHJlc3VsdCBpcyB1bnNwZWNpZmllZC4KKy5QcAorLkZuIHNpZ25pZmljYW5kIHgKK2FuZAorLkZuIHNpZ25pZmljYW5kZiB4CityZXR1cm4KKy5GYSBzaWcgLAord2hlcmUKKy5GYSB4Cis6PQorLkZhIHNpZyBObyBcKCoqIDIqKiBOcyBGYSBuCit3aXRoIDEgXCg8PQorLkZhIHNpZworPCAyLgorLkZuIHNpZ25pZmljYW5kIHgKK2FuZAorLkZuIHNpZ25pZmljYW5kZiB4CithcmUgbm90IGRlZmluZWQgd2hlbgorLkZhIHgKK2lzIDAsIFwqKFBtXCooSWYsIG9yIFwqKE5hLgorLlNoIFNFRSBBTFNPCisuWHIgaWVlZSAzICwKKy5YciBtYXRoIDMKKy5TaCBTVEFOREFSRFMKKy5TdCAtaWVlZTc1NApkaWZmIC0tZ2l0IGEvbGlibS9tYW4vaWxvZ2IuMyBiL2xpYm0vbWFuL2lsb2diLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBhYzc1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2lsb2diLjMKQEAgLTAsMCArMSwxMjcgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODUsIDE5OTEgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKWllZWUuMwk2LjQgKEJlcmtlbGV5KSA1LzYvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9pbG9nYi4zLHYgMS4zIDIwMDUvMTEvMTcgMTM6MDA6MDAgcnUgRXhwICQKKy5cIgorLkRkIE5vdmVtYmVyIDYsIDIwMDUKKy5EdCBJTE9HQiAzCisuT3MKKy5TaCBOQU1FCisuTm0gaWxvZ2IgLAorLk5tIGlsb2diZiAsCisuTm0gaWxvZ2JsICwKKy5ObSBsb2diICwKKy5ObSBsb2diZgorLk5kIGV4dHJhY3QgZXhwb25lbnQKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgaW50CisuRm4gaWxvZ2IgImRvdWJsZSB4IgorLkZ0IGludAorLkZuIGlsb2diZiAiZmxvYXQgeCIKKy5GdCBpbnQKKy5GbiBpbG9nYmwgImxvbmcgZG91YmxlIHgiCisuRnQgZG91YmxlCisuRm4gbG9nYiAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBsb2diZiAiZmxvYXQgeCIKKy5TaCBERVNDUklQVElPTgorLkZuIGlsb2diICwKKy5GbiBpbG9nYmYKK2FuZAorLkZuIGlsb2dibAorcmV0dXJuCisuRmEgeCBOcyAncyBleHBvbmVudAoraW4gaW50ZWdlciBmb3JtYXQuCisuRm4gaWxvZ2IgXCooUG1cKihJZgorcmV0dXJucworLkR2IElOVF9NQVggLAorLkZuIGlsb2diIFwqKFBtXCooTmEKK3JldHVybnMKKy5EdiBGUF9JTE9HQk5BTiAsCithbmQKKy5GbiBpbG9nYiAwCityZXR1cm5zCisuRHYgRlBfSUxPR0IwIC4KKy5QcAorLkZuIGxvZ2IgeAorYW5kCisuRm4gbG9nYmYgeAorcmV0dXJuCisuRmEgeCBOcyAncyBleHBvbmVudAoraW4gZmxvYXRpbmdcLXBvaW50IGZvcm1hdCB3aXRoIHRoZSBzYW1lIHByZWNpc2lvbiBhcworLkZhIHggLgorLkZuIGxvZ2IgXCooUG1cKihJZgorcmV0dXJucyArXCooSWYsIGFuZAorLkZuIGxvZ2IgMAorcmV0dXJucyAtXCooSWYgd2l0aCBhIGRpdmlzaW9uIGJ5IHplcm8gZXhjZXB0aW9uLgorLlNoIFNFRSBBTFNPCisuWHIgZnJleHAgMyAsCisuWHIgaWVlZSAzICwKKy5YciBtYXRoIDMgLAorLlhyIHNjYWxibiAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiBpbG9nYiAsCisuRm4gaWxvZ2JmICwKKy5GbiBpbG9nYmwgLAorLkZuIGxvZ2IKK2FuZAorLkZuIGxvZ2JmCityb3V0aW5lcyBjb25mb3JtIHRvCisuU3QgLWlzb0MtOTkgLgorLkZuIGxvZ2IKK2FuZAorLkZuIGxvZ2JmCitpbXBsZW1lbnQgdGhlIGxvZ2IgZnVuY3Rpb24gcmVjb21tZW5kZWQgYnkKKy5TdCAtaWVlZTc1NCAuCisuU2ggSElTVE9SWQorVGhlCisuRm4gbG9nYgorZnVuY3Rpb24gYXBwZWFyZWQgaW4KKy5CeCA0LjMgLgorVGhlCisuRm4gaWxvZ2IKK2Z1bmN0aW9uIGFwcGVhcmVkIGluCisuRnggMS4xLjUgLgorVGhlCisuRm4gaWxvZ2JmCithbmQKKy5GbiBsb2diZgorZnVuY3Rpb25zIGFwcGVhcmVkIGluCisuRnggMi4wIC4KK1RoZQorLkZuIGlsb2dibAorZnVuY3Rpb24gYXBwZWFyZWQgaW4KKy5GeCA1LjQgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vajAuMyBiL2xpYm0vbWFuL2owLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjZDUxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2owLjMKQEAgLTAsMCArMSwxNDIgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODUsIDE5OTEgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKWowLjMJNi43IChCZXJrZWxleSkgNC8xOS85MQorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL2owLjMsdiAxLjEzIDIwMDUvMDEvMTQgMjM6Mjg6MjggZGFzIEV4cCAkCisuXCIKKy5EZCBKYW51YXJ5IDE0LCAyMDA1CisuRHQgSjAgMworLk9zCisuU2ggTkFNRQorLk5tIGowICwKKy5ObSBqMGYgLAorLk5tIGoxICwKKy5ObSBqMWYgLAorLk5tIGpuICwKKy5ObSBqbmYgLAorLk5tIHkwICwKKy5ObSB5MGYgLAorLk5tIHkxICwKKy5ObSB5MWYgLAorLk5tIHluICwKKy5ObSB5bmYKKy5OZCBCZXNzZWwgZnVuY3Rpb25zIG9mIGZpcnN0IGFuZCBzZWNvbmQga2luZAorLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBqMCAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBqMGYgImZsb2F0IHgiCisuRnQgZG91YmxlCisuRm4gajEgImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4gajFmICJmbG9hdCB4IgorLkZ0IGRvdWJsZQorLkZuIGpuICJpbnQgbiIgImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4gam5mICJpbnQgbiIgImZsb2F0IHgiCisuRnQgZG91YmxlCisuRm4geTAgImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4geTBmICJmbG9hdCB4IgorLkZ0IGRvdWJsZQorLkZuIHkxICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIHkxZiAiZmxvYXQgeCIKKy5GdCBkb3VibGUKKy5GbiB5biAiaW50IG4iICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIHluZiAiaW50IG4iICJmbG9hdCB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUgZnVuY3Rpb25zCisuRm4gajAgLAorLkZuIGowZiAsCisuRm4gajEKK2FuZAorLkZuIGoxZgorY29tcHV0ZSB0aGUKKy5FbSBCZXNzZWwgZnVuY3Rpb24gb2YgdGhlIGZpcnN0IGtpbmQgb2YgdGhlIG9yZGVyCiswIGFuZCB0aGUKKy5FbSBvcmRlcgorMSwgcmVzcGVjdGl2ZWx5LAorZm9yIHRoZQorcmVhbCB2YWx1ZQorLkZhIHggOwordGhlIGZ1bmN0aW9ucworLkZuIGpuCithbmQKKy5GbiBqbmYKK2NvbXB1dGUgdGhlCisuRW0gQmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kIG9mIHRoZSBpbnRlZ2VyCisuRW0gb3JkZXIKKy5GYSBuCitmb3IgdGhlIHJlYWwgdmFsdWUKKy5GYSB4IC4KKy5QcAorVGhlIGZ1bmN0aW9ucworLkZuIHkwICwKKy5GbiB5MGYgLAorLkZuIHkxICwKK2FuZAorLkZuIHkxZgorY29tcHV0ZSB0aGUgbGluZWFybHkgaW5kZXBlbmRlbnQKKy5FbSBCZXNzZWwgZnVuY3Rpb24gb2YgdGhlIHNlY29uZCBraW5kIG9mIHRoZSBvcmRlcgorMCBhbmQgdGhlCisuRW0gb3JkZXIKKzEsIHJlc3BlY3RpdmVseSwKK2ZvciB0aGUKK3Bvc2l0aXZlCisuRW0gcmVhbAordmFsdWUKKy5GYSB4IDsKK3RoZSBmdW5jdGlvbnMKKy5GbiB5bgorYW5kCisuRm4geW5mCitjb21wdXRlIHRoZQorLkVtIEJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgc2Vjb25kIGtpbmQgZm9yIHRoZSBpbnRlZ2VyCisuRW0gb3JkZXIKKy5GYSBuCitmb3IgdGhlIHBvc2l0aXZlCisuRW0gcmVhbAordmFsdWUKKy5GYSB4IC4KKy5TaCBSRVRVUk4gVkFMVUVTCitJZiB0aGVzZSBmdW5jdGlvbnMgYXJlIHN1Y2Nlc3NmdWwsCit0aGUgY29tcHV0ZWQgdmFsdWUgaXMgcmV0dXJuZWQuCisuU2ggU0VFIEFMU08KKy5YciBtYXRoIDMKKy5TaCBISVNUT1JZCitUaGlzIHNldCBvZiBmdW5jdGlvbnMKK2FwcGVhcmVkIGluCisuQXQgdjcgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vbGdhbW1hLjMgYi9saWJtL21hbi9sZ2FtbWEuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDY0YTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vbGdhbW1hLjMKQEAgLTAsMCArMSwxODUgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODUsIDE5OTEgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKWxnYW1tYS4zCTYuNiAoQmVya2VsZXkpIDEyLzMvOTIKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9sZ2FtbWEuMyx2IDEuMjIgMjAwNS8wMS8xNiAxNjo0NjoxNCBydSBFeHAgJAorLlwiCisuRGQgSmFudWFyeSAxNCwgMjAwNQorLkR0IExHQU1NQSAzCisuT3MKKy5TaCBOQU1FCisuTm0gbGdhbW1hICwKKy5ObSBsZ2FtbWFfciAsCisuTm0gbGdhbW1hZiAsCisuTm0gbGdhbW1hZl9yICwKKy5ObSBnYW1tYSAsCisuTm0gZ2FtbWFfciAsCisuTm0gZ2FtbWFmICwKKy5ObSBnYW1tYWZfciAsCisuTm0gdGdhbW1hCisuTmQgbG9nIGdhbW1hIGZ1bmN0aW9ucywgZ2FtbWEgZnVuY3Rpb24KKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZXh0ZXJuIGludAorLkZhIHNpZ25nYW0gOworLnNwCisuRnQgZG91YmxlCisuRm4gbGdhbW1hICJkb3VibGUgeCIKKy5GdCBkb3VibGUKKy5GbiBsZ2FtbWFfciAiZG91YmxlIHgiICJpbnQgKnNpZ25nYW1wIgorLkZ0IGZsb2F0CisuRm4gbGdhbW1hZiAiZmxvYXQgeCIKKy5GdCBmbG9hdAorLkZuIGxnYW1tYWZfciAiZmxvYXQgeCIgImludCAqc2lnbmdhbXAiCisuRnQgZG91YmxlCisuRm4gZ2FtbWEgImRvdWJsZSB4IgorLkZ0IGRvdWJsZQorLkZuIGdhbW1hX3IgImRvdWJsZSB4IiAiaW50ICpzaWduZ2FtcCIKKy5GdCBmbG9hdAorLkZuIGdhbW1hZiAiZmxvYXQgeCIKKy5GdCBmbG9hdAorLkZuIGdhbW1hZl9yICJmbG9hdCB4IiAiaW50ICpzaWduZ2FtcCIKKy5GdCBkb3VibGUKKy5GbiB0Z2FtbWEgImRvdWJsZSB4IgorLlNoIERFU0NSSVBUSU9OCisuRm4gbGdhbW1hIHgKK2FuZAorLkZuIGxnYW1tYWYgeAorLmlmIHQgXHtcCityZXR1cm4gbG5cfHxcKCpHKHgpfCB3aGVyZQorLkJkIC11bmZpbGxlZCAtb2Zmc2V0IGluZGVudAorXCgqRyh4KSA9IFwoaXNcZFxzOFx6MFxzMTBcdVx1XHM4XChpZlxzMTBcZCB0XHVcczh4XC0xXHMxMFxkIGVcdVxzOFwtdFxzMTBcZCBkdAlmb3IgeCA+IDAgYW5kCitcKCpHKHgpID0gXCgqcC8oXCgqRygxXC14KVx8c2luKFwoKnB4KSkJZm9yIHggPCAxLgorLkVkCisuXH0KKy5pZiBuIFwKK3JldHVybiBsblx8fFwoKkcoeCl8LgorLlBwCitUaGUgZXh0ZXJuYWwgaW50ZWdlcgorLkZhIHNpZ25nYW0KK3JldHVybnMgdGhlIHNpZ24gb2YgXCgqRyh4KS4KKy5QcAorLkZuIGxnYW1tYV9yIHggc2lnbmdhbXAKK2FuZAorLkZuIGxnYW1tYWZfciB4IHNpZ25nYW1wCitwcm92aWRlIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMKKy5GbiBsZ2FtbWEgeAorYW5kCisuRm4gbGdhbW1hZiB4CitidXQgdGhlIGNhbGxlciBtdXN0IHByb3ZpZGUgYW4gaW50ZWdlciB0byBzdG9yZSB0aGUgc2lnbiBvZiBcKCpHKHgpLgorLlBwCisuRm4gZ2FtbWEgLAorLkZuIGdhbW1hZiAsCisuRm4gZ2FtbWFfciAsCithbmQKKy5GbiBnYW1tYWZfcgorYXJlIGRlcHJlY2F0ZWQgYWxpYXNlcyBmb3IKKy5GbiBsZ2FtbWEgLAorLkZuIGxnYW1tYWYgLAorLkZuIGxnYW1tYV9yICwKK2FuZAorLkZuIGxnYW1tYWZfciAsCityZXNwZWN0aXZlbHkuCisuRm4gdGdhbW1hIHgKK3JldHVybnMgXCgqRyh4KSwgd2l0aCBubyBlZmZlY3Qgb24KKy5GYSBzaWduZ2FtIC4KKy5TaCBJRElPU1lOQ1JBU0lFUworRG8gbm90IHVzZSB0aGUgZXhwcmVzc2lvbgorLkRxIExpIHNpZ25nYW1cKCoqZXhwKGxnYW1tYSh4KSkKK3RvIGNvbXB1dGUgZyA6PSBcKCpHKHgpLgorSW5zdGVhZCB1c2UgYSBwcm9ncmFtIGxpa2UgdGhpcyAoaW4gQyk6CisuQmQgLWxpdGVyYWwgLW9mZnNldCBpbmRlbnQKK2xnID0gbGdhbW1hKHgpOyBnID0gc2lnbmdhbVwoKipleHAobGcpOworLkVkCisuUHAKK09ubHkgYWZ0ZXIKKy5GbiBsZ2FtbWEKK29yCisuRm4gbGdhbW1hZgoraGFzIHJldHVybmVkIGNhbiBzaWduZ2FtIGJlIGNvcnJlY3QuCisuUHAKK0ZvciBhcmd1bWVudHMgaW4gaXRzIHJhbmdlLAorLkZuIHRnYW1tYQoraXMgcHJlZmVycmVkLCBhcyBmb3IgcG9zaXRpdmUgYXJndW1lbnRzCitpdCBpcyBhY2N1cmF0ZSB0byB3aXRoaW4gb25lIHVuaXQgaW4gdGhlIGxhc3QgcGxhY2UuCitFeHBvbmVudGlhdGlvbiBvZgorLkZuIGxnYW1tYQord2lsbCBsb3NlIHVwIHRvIDEwIHNpZ25pZmljYW50IGJpdHMuCisuU2ggUkVUVVJOIFZBTFVFUworLkZuIGdhbW1hICwKKy5GbiBnYW1tYV9yICwKKy5GbiBnYW1tYWYgLAorLkZuIGdhbW1hZl9yICwKKy5GbiBsZ2FtbWEgLAorLkZuIGxnYW1tYV9yICwKKy5GbiBsZ2FtbWFmICwKK2FuZAorLkZuIGxnYW1tYWZfcgorcmV0dXJuIGFwcHJvcHJpYXRlIHZhbHVlcyB1bmxlc3MgYW4gYXJndW1lbnQgaXMgb3V0IG9mIHJhbmdlLgorT3ZlcmZsb3cgd2lsbCBvY2N1ciBmb3Igc3VmZmljaWVudGx5IGxhcmdlIHBvc2l0aXZlIHZhbHVlcywgYW5kCitub24tcG9zaXRpdmUgaW50ZWdlcnMuCitGb3IgbGFyZ2Ugbm9uLWludGVnZXIgbmVnYXRpdmUgdmFsdWVzLAorLkZuIHRnYW1tYQord2lsbCB1bmRlcmZsb3cuCisuU2ggU0VFIEFMU08KKy5YciBtYXRoIDMKKy5TaCBTVEFOREFSRFMKK1RoZQorLkZuIGxnYW1tYQorYW5kCisuRm4gdGdhbW1hCitmdW5jdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGNvbmZvcm0gdG8KKy5TdCAtaXNvQy05OSAuCisuU2ggSElTVE9SWQorVGhlCisuRm4gbGdhbW1hCitmdW5jdGlvbiBhcHBlYXJlZCBpbgorLkJ4IDQuMyAuCitUaGUKKy5GbiBnYW1tYQorZnVuY3Rpb24gYXBwZWFyZWQgaW4KKy5CeCA0LjQKK2FzIGEgZnVuY3Rpb24gd2hpY2ggY29tcHV0ZWQgXCgqRyh4KS4KK1RoaXMgdmVyc2lvbiB3YXMgdXNlZCBpbgorLkZ4IDEuMSAuCitUaGUgbmFtZQorLkZuIGdhbW1hCit3YXMgb3JpZ2luYWxseSBkZWRpY2F0ZWQgdG8gdGhlCisuRm4gbGdhbW1hCitmdW5jdGlvbiwKK2FuZCB0aGF0IHVzYWdlIHdhcyByZXN0b3JlZCBieSBzd2l0Y2hpbmcgdG8gU3VuJ3MgZmRsaWJtIGluCisuRnggMS4xLjUgLgorVGhlCisuRm4gdGdhbW1hCitmdW5jdGlvbiBhcHBlYXJlZCBpbgorLkZ4IDUuMCAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9scmludC4zIGIvbGlibS9tYW4vbHJpbnQuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2RlMDkzCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vbHJpbnQuMwpAQCAtMCwwICsxLDk0IEBACisuXCIgQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELm9yZz4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vbHJpbnQuMyx2IDEuMiAyMDA1LzAxLzEzIDEwOjQzOjAxIHJ1IEV4cCAkCisuXCIKKy5EZCBKYW51YXJ5IDExLCAyMDA1CisuRHQgTFJJTlQgMworLk9zCisuU2ggTkFNRQorLk5tIGxscmludCAsCisuTm0gbGxyaW50ZiAsCisuTm0gbHJpbnQgLAorLk5tIGxyaW50ZgorLk5kICJjb252ZXJ0IHRvIGludGVnZXIiCisuU2ggTElCUkFSWQorLkxiIGxpYm0KKy5TaCBTWU5PUFNJUworLkluIG1hdGguaAorLkZ0ICJsb25nIGxvbmciCisuRm4gbGxyaW50ICJkb3VibGUgeCIKKy5GdCAibG9uZyBsb25nIgorLkZuIGxscmludGYgImZsb2F0IHgiCisuRnQgbG9uZworLkZuIGxyaW50ICJkb3VibGUgeCIKKy5GdCBsb25nCisuRm4gbHJpbnRmICJmbG9hdCB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiBscmludAorZnVuY3Rpb24gcmV0dXJucyB0aGUgaW50ZWdlciBuZWFyZXN0IHRvIGl0cyBhcmd1bWVudAorLkZhIHgKK2FjY29yZGluZyB0byB0aGUgY3VycmVudCByb3VuZGluZyBtb2RlLgorSWYgdGhlIHJvdW5kZWQgcmVzdWx0IGlzIHRvbyBsYXJnZSB0byBiZSByZXByZXNlbnRlZCBhcyBhCisuVnQgbG9uZwordmFsdWUsIGFuIGludmFsaWQgZXhjZXB0aW9uIGlzIHJhaXNlZCBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyB1bmRlZmluZWQuCitPdGhlcndpc2UsIGlmCisuRmEgeAoraXMgbm90IGFuIGludGVnZXIsCisuRm4gbHJpbnQKK3JhaXNlcyBhbiBpbmV4YWN0IGV4Y2VwdGlvbi4KK1doZW4gdGhlIHJvdW5kZWQgcmVzdWx0IGlzIHJlcHJlc2VudGFibGUgYXMgYQorLlZ0IGxvbmcgLAordGhlIGV4cHJlc3Npb24KKy5GbiBscmludCB4CitpcyBlcXVpdmFsZW50IHRvCisuUG8gVnQgbG9uZyBQYyBOcyBGbiByaW50IHgKKyhhbHRob3VnaCB0aGUgZm9ybWVyIG1heSBiZSBtb3JlIGVmZmljaWVudCkuCisuUHAKK1RoZQorLkZuIGxscmludCAsCisuRm4gbGxyaW50ZiAsCithbmQKKy5GbiBscmludGYKK2Z1bmN0aW9ucyBkaWZmZXIgZnJvbQorLkZuIGxyaW50Citvbmx5IGluIHRoZWlyIGlucHV0IGFuZCBvdXRwdXQgdHlwZXMuCisuU2ggU0VFIEFMU08KKy5YciBscm91bmQgMyAsCisuWHIgbWF0aCAzICwKKy5YciByaW50IDMgLAorLlhyIHJvdW5kIDMKKy5TaCBTVEFOREFSRFMKK1RoZQorLkZuIGxscmludCAsCisuRm4gbGxyaW50ZiAsCisuRm4gbHJpbnQgLAorYW5kCisuRm4gbHJpbnRmCitmdW5jdGlvbnMgY29uZm9ybSB0bworLlN0IC1pc29DLTk5IC4KKy5TaCBISVNUT1JZCitUaGVzZSByb3V0aW5lcyBmaXJzdCBhcHBlYXJlZCBpbgorLkZ4IDUuNCAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9scm91bmQuMyBiL2xpYm0vbWFuL2xyb3VuZC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZTUzYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi9scm91bmQuMwpAQCAtMCwwICsxLDExMiBAQAorLlwiIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5vcmc+CisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL2xyb3VuZC4zLHYgMS40IDIwMDUvMDYvMTUgMTk6MDQ6MDQgcnUgRXhwICQKKy5cIgorLkRkIEFwcmlsIDcsIDIwMDUKKy5EdCBMUk9VTkQgMworLk9zCisuU2ggTkFNRQorLk5tIGxscm91bmQgLAorLk5tIGxscm91bmRmICwKKy5ObSBsbHJvdW5kbCAsCisuTm0gbHJvdW5kICwKKy5ObSBscm91bmRmICwKKy5ObSBscm91bmRsCisuTmQgImNvbnZlcnQgdG8gbmVhcmVzdCBpbnRlZ3JhbCB2YWx1ZSIKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgImxvbmcgbG9uZyIKKy5GbiBsbHJvdW5kICJkb3VibGUgeCIKKy5GdCAibG9uZyBsb25nIgorLkZuIGxscm91bmRmICJmbG9hdCB4IgorLkZ0ICJsb25nIGxvbmciCisuRm4gbGxyb3VuZGwgImxvbmcgZG91YmxlIHgiCisuRnQgbG9uZworLkZuIGxyb3VuZCAiZG91YmxlIHgiCisuRnQgbG9uZworLkZuIGxyb3VuZGYgImZsb2F0IHgiCisuRnQgbG9uZworLkZuIGxyb3VuZGwgImxvbmcgZG91YmxlIHgiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIGxyb3VuZAorZnVuY3Rpb24gcmV0dXJucyB0aGUgaW50ZWdlciBuZWFyZXN0IHRvIGl0cyBhcmd1bWVudAorLkZhIHggLAorcm91bmRpbmcgYXdheSBmcm9tIHplcm8gaW4gaGFsZndheSBjYXNlcy4KK0lmIHRoZSByb3VuZGVkIHJlc3VsdCBpcyB0b28gbGFyZ2UgdG8gYmUgcmVwcmVzZW50ZWQgYXMgYQorLlZ0IGxvbmcKK3ZhbHVlLCBhbiBpbnZhbGlkIGV4Y2VwdGlvbiBpcyByYWlzZWQgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgdW5kZWZpbmVkLgorT3RoZXJ3aXNlLCBpZgorLkZhIHgKK2lzIG5vdCBhbiBpbnRlZ2VyLAorLkZuIGxyb3VuZAorbWF5IHJhaXNlIGFuIGluZXhhY3QgZXhjZXB0aW9uLgorV2hlbiB0aGUgcm91bmRlZCByZXN1bHQgaXMgcmVwcmVzZW50YWJsZSBhcyBhCisuVnQgbG9uZyAsCit0aGUgZXhwcmVzc2lvbgorLkZuIGxyb3VuZCB4CitpcyBlcXVpdmFsZW50IHRvCisuUG8gVnQgbG9uZyBQYyBOcyBGbiByb3VuZCB4CisoYWx0aG91Z2ggdGhlIGZvcm1lciBtYXkgYmUgbW9yZSBlZmZpY2llbnQpLgorLlBwCitUaGUKKy5GbiBsbHJvdW5kICwKKy5GbiBsbHJvdW5kZiAsCisuRm4gbGxyb3VuZGwgLAorLkZuIGxyb3VuZGYKK2FuZAorLkZuIGxyb3VuZGwKK2Z1bmN0aW9ucyBkaWZmZXIgZnJvbQorLkZuIGxyb3VuZAorb25seSBpbiB0aGVpciBpbnB1dCBhbmQgb3V0cHV0IHR5cGVzLgorLlNoIFNFRSBBTFNPCisuWHIgbHJpbnQgMyAsCisuWHIgbWF0aCAzICwKKy5YciByaW50IDMgLAorLlhyIHJvdW5kIDMKKy5TaCBTVEFOREFSRFMKK1RoZQorLkZuIGxscm91bmQgLAorLkZuIGxscm91bmRmICwKKy5GbiBsbHJvdW5kbCAsCisuRm4gbHJvdW5kICwKKy5GbiBscm91bmRmICwKK2FuZAorLkZuIGxyb3VuZGwKK2Z1bmN0aW9ucyBjb25mb3JtIHRvCisuU3QgLWlzb0MtOTkgLgorLlNoIEhJU1RPUlkKK1RoZQorLlZ0IGZsb2F0CithbmQKKy5WdCBkb3VibGUKK3ZlcnNpb25zIG9mIHRoZXNlIHJvdXRpbmVzIGZpcnN0IGFwcGVhcmVkIGluCisuRnggNS40IC4KK1RoZQorLlZ0ICJsb25nIGRvdWJsZSIKK3ZlcnNpb25zIGFwcGVhcmVkIGluCisuRnggNi4wIC4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL21hdGguMyBiL2xpYm0vbWFuL21hdGguMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjhiNWUwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vbWF0aC4zCkBAIC0wLDAgKzEsMjQyIEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTg1IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIJZnJvbTogQCgjKW1hdGguMwk2LjEwIChCZXJrZWxleSkgNS82LzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vbWF0aC4zLHYgMS4yNyAyMDA1LzExLzE3IDEzOjAwOjAwIHJ1IEV4cCAkCisuXCIKKy5EZCBOb3ZlbWJlciA2LCAyMDA1CisuRHQgTUFUSCAzCisuT3MKKy5pZiBuIFx7XAorLmNoYXIgXFtzcl0gInNxcnQKKy5cfQorLlNoIE5BTUUKKy5ObSBtYXRoCisuTmQgImZsb2F0aW5nLXBvaW50IG1hdGhlbWF0aWNhbCBsaWJyYXJ5IgorLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5TaCBERVNDUklQVElPTgorVGhlc2UgZnVuY3Rpb25zIGNvbnN0aXR1dGUgdGhlIEMgbWF0aCBsaWJyYXJ5LgorLlNoICJMSVNUIE9GIEZVTkNUSU9OUyIKK0VhY2ggb2YgdGhlIGZvbGxvd2luZworLlZ0IGRvdWJsZQorZnVuY3Rpb25zIGhhcyBhCisuVnQgZmxvYXQKK2NvdW50ZXJwYXJ0IHdpdGggYW4KKy5RbCBmCithcHBlbmRlZCB0byB0aGUgbmFtZSBhbmQgYQorLlZ0ICJsb25nIGRvdWJsZSIKK2NvdW50ZXJwYXJ0IHdpdGggYW4KKy5RbCBsCithcHBlbmRlZC4KK0FzIGFuIGV4YW1wbGUsIHRoZQorLlZ0IGZsb2F0CithbmQKKy5WdCAibG9uZyBkb3VibGUiCitjb3VudGVycGFydHMgb2YKKy5GdCBkb3VibGUKKy5GbiBhY29zICJkb3VibGUgeCIKK2FyZQorLkZ0IGZsb2F0CisuRm4gYWNvc2YgImZsb2F0IHgiCithbmQKKy5GdCAibG9uZyBkb3VibGUiCisuRm4gYWNvc2wgImxvbmcgZG91YmxlIHgiICwKK3Jlc3BlY3RpdmVseS4KKy5kZSBDbAorLkJsIC1jb2x1bW4gImlzZ3JlYXRlcmVxdWFsIiAiYmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBzZWNvbmQga2luZCBvZiB0aGUgb3JkZXIgMCIKKy5FbSAiTmFtZQlEZXNjcmlwdGlvbiIKKy4uCisuU3MgQWxnZWJyYWljIEZ1bmN0aW9ucworLkNsCitjYnJ0CWN1YmUgcm9vdAorZm1hCWZ1c2VkIG11bHRpcGx5LWFkZAoraHlwb3QJRXVjbGlkZWFuIGRpc3RhbmNlCitzcXJ0CXNxdWFyZSByb290CisuRWwKKy5TcyBDbGFzc2lmaWNhdGlvbiBGdW5jdGlvbnMKKy5DbAorZnBjbGFzc2lmeQljbGFzc2lmeSBhIGZsb2F0aW5nLXBvaW50IHZhbHVlCitpc2Zpbml0ZQlkZXRlcm1pbmUgd2hldGhlciBhIHZhbHVlIGlzIGZpbml0ZQoraXNpbmYJZGV0ZXJtaW5lIHdoZXRoZXIgYSB2YWx1ZSBpcyBpbmZpbml0ZQoraXNuYW4JZGV0ZXJtaW5lIHdoZXRoZXIgYSB2YWx1ZSBpcyBcKihOYQoraXNub3JtYWwJZGV0ZXJtaW5lIHdoZXRoZXIgYSB2YWx1ZSBpcyBub3JtYWxpemVkCisuRWwKKy5TcyBFeHBvbmVudCBNYW5pcHVsYXRpb24gRnVuY3Rpb25zCisuQ2wKK2ZyZXhwCWV4dHJhY3QgZXhwb25lbnQgYW5kIG1hbnRpc3NhCitpbG9nYglleHRyYWN0IGV4cG9uZW50CitsZGV4cAltdWx0aXBseSBieSBwb3dlciBvZiAyCitsb2diCWV4dHJhY3QgZXhwb25lbnQKK3NjYWxibG4JYWRqdXN0IGV4cG9uZW50CitzY2FsYm4JYWRqdXN0IGV4cG9uZW50CisuRWwKKy5TcyBFeHRyZW11bS0gYW5kIFNpZ24tUmVsYXRlZCBGdW5jdGlvbnMKKy5DbAorY29weXNpZ24JY29weSBzaWduIGJpdAorZmFicwlhYnNvbHV0ZSB2YWx1ZQorZmRpbQlwb3NpdGl2ZSBkaWZmZXJlbmNlCitmbWF4CW1heGltdW0gZnVuY3Rpb24KK2ZtaW4JbWluaW11bSBmdW5jdGlvbgorc2lnbmJpdAlleHRyYWN0IHNpZ24gYml0CisuRWwKKy5cIiAuU3MgTm90IGEgTnVtYmVyCisuXCIgLkNsCisuXCIgbmFuCXJldHVybiBxdWlldCBcKihOYSkJMAorLlwiIC5FbAorLlNzIFJlc2lkdWUgYW5kIFJvdW5kaW5nIEZ1bmN0aW9ucworLkNsCitjZWlsCWludGVnZXIgbm8gbGVzcyB0aGFuCitmbG9vcglpbnRlZ2VyIG5vIGdyZWF0ZXIgdGhhbgorZm1vZAlwb3NpdGl2ZSByZW1haW5kZXIKK2xscmludAlyb3VuZCB0byBpbnRlZ2VyIGluIGZpeGVkLXBvaW50IGZvcm1hdAorbGxyb3VuZAlyb3VuZCB0byBuZWFyZXN0IGludGVnZXIgaW4gZml4ZWQtcG9pbnQgZm9ybWF0CitscmludAlyb3VuZCB0byBpbnRlZ2VyIGluIGZpeGVkLXBvaW50IGZvcm1hdAorbHJvdW5kCXJvdW5kIHRvIG5lYXJlc3QgaW50ZWdlciBpbiBmaXhlZC1wb2ludCBmb3JtYXQKK21vZGYJZXh0cmFjdCBpbnRlZ2VyIGFuZCBmcmFjdGlvbmFsIHBhcnRzCituZWFyYnlpbnQJcm91bmQgdG8gaW50ZWdlciAoc2lsZW50KQorbmV4dGFmdGVyCW5leHQgcmVwcmVzZW50YWJsZSB2YWx1ZQorbmV4dHRvd2FyZAluZXh0IHJlcHJlc2VudGFibGUgdmFsdWUKK3JlbWFpbmRlcglyZW1haW5kZXIKK3JlbXF1bwlyZW1haW5kZXIgd2l0aCBwYXJ0aWFsIHF1b3RpZW50CityaW50CXJvdW5kIHRvIGludGVnZXIKK3JvdW5kCXJvdW5kIHRvIG5lYXJlc3QgaW50ZWdlcgordHJ1bmMJaW50ZWdlciBubyBncmVhdGVyIGluIG1hZ25pdHVkZSB0aGFuCisuRWwKKy5QcAorVGhlCisuRm4gY2VpbCAsCisuRm4gZmxvb3IgLAorLkZuIGxscm91bmQgLAorLkZuIGxyb3VuZCAsCisuRm4gcm91bmQgLAorYW5kCisuRm4gdHJ1bmMKK2Z1bmN0aW9ucyByb3VuZCBpbiBwcmVkZXRlcm1pbmVkIGRpcmVjdGlvbnMsIHdoZXJlYXMKKy5GbiBsbHJpbnQgLAorLkZuIGxyaW50ICwKK2FuZAorLkZuIHJpbnQKK3JvdW5kIGFjY29yZGluZyB0byB0aGUgY3VycmVudCAoZHluYW1pYykgcm91bmRpbmcgbW9kZS4KK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGNvbnRyb2xsaW5nIHRoZSBkeW5hbWljIHJvdW5kaW5nIG1vZGUsIHNlZQorLlhyIGZlbnYgMworYW5kCisuWHIgZmVzZXRyb3VuZCAzIC4KKy5TcyBTaWxlbnQgT3JkZXIgUHJlZGljYXRlcworLkNsCitpc2dyZWF0ZXIJZ3JlYXRlciB0aGFuIHJlbGF0aW9uCitpc2dyZWF0ZXJlcXVhbAlncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcmVsYXRpb24KK2lzbGVzcwlsZXNzIHRoYW4gcmVsYXRpb24KK2lzbGVzc2VxdWFsCWxlc3MgdGhhbiBvciBlcXVhbCB0byByZWxhdGlvbgoraXNsZXNzZ3JlYXRlcglsZXNzIHRoYW4gb3IgZ3JlYXRlciB0aGFuIHJlbGF0aW9uCitpc3Vub3JkZXJlZAl1bm9yZGVyZWQgcmVsYXRpb24KKy5FbAorLlNzIFRyYW5zY2VuZGVudGFsIEZ1bmN0aW9ucworLkNsCithY29zCWludmVyc2UgY29zaW5lCithY29zaAlpbnZlcnNlIGh5cGVyYm9saWMgY29zaW5lCithc2luCWludmVyc2Ugc2luZQorYXNpbmgJaW52ZXJzZSBoeXBlcmJvbGljIHNpbmUKK2F0YW4JaW52ZXJzZSB0YW5nZW50CithdGFuaAlpbnZlcnNlIGh5cGVyYm9saWMgdGFuZ2VudAorYXRhbjIJYXRhbih5L3gpOyBjb21wbGV4IGFyZ3VtZW50Citjb3MJY29zaW5lCitjb3NoCWh5cGVyYm9saWMgY29zaW5lCitlcmYJZXJyb3IgZnVuY3Rpb24KK2VyZmMJY29tcGxlbWVudGFyeSBlcnJvciBmdW5jdGlvbgorZXhwCWV4cG9uZW50aWFsIGJhc2UgZQorZXhwMglleHBvbmVudGlhbCBiYXNlIDIKK2V4cG0xCWV4cCh4KVwtMQorajAJQmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kIG9mIHRoZSBvcmRlciAwCitqMQlCZXNzZWwgZnVuY3Rpb24gb2YgdGhlIGZpcnN0IGtpbmQgb2YgdGhlIG9yZGVyIDEKK2puCUJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgZmlyc3Qga2luZCBvZiB0aGUgb3JkZXIgbgorbGdhbW1hCWxvZyBnYW1tYSBmdW5jdGlvbgorbG9nCW5hdHVyYWwgbG9nYXJpdGhtCitsb2cxMAlsb2dhcml0aG0gdG8gYmFzZSAxMAorbG9nMXAJbG9nKDEreCkKKy5cIiBsb2cyCWJhc2UgMiBsb2dhcml0aG0KK3BvdwlleHBvbmVudGlhbCB4Kip5CitzaW4JdHJpZ29ub21ldHJpYyBmdW5jdGlvbgorc2luaAloeXBlcmJvbGljIGZ1bmN0aW9uCit0YW4JdHJpZ29ub21ldHJpYyBmdW5jdGlvbgordGFuaAloeXBlcmJvbGljIGZ1bmN0aW9uCit0Z2FtbWEJZ2FtbWEgZnVuY3Rpb24KK3kwCUJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgc2Vjb25kIGtpbmQgb2YgdGhlIG9yZGVyIDAKK3kxCUJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgc2Vjb25kIGtpbmQgb2YgdGhlIG9yZGVyIDEKK3luCUJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgc2Vjb25kIGtpbmQgb2YgdGhlIG9yZGVyIG4KKy5FbAorLlBwCitVbmxpa2UgdGhlIGFsZ2VicmFpYyBmdW5jdGlvbnMgbGlzdGVkIGVhcmxpZXIsIHRoZSByb3V0aW5lcworaW4gdGhpcyBzZWN0aW9uIG1heSBub3QgcHJvZHVjZSBhIHJlc3VsdCB0aGF0IGlzIGNvcnJlY3RseSByb3VuZGVkLAorc28gcmVwcm9kdWNpYmxlIHJlc3VsdHMgY2Fubm90IGJlIGd1YXJhbnRlZWQgYWNyb3NzIHBsYXRmb3Jtcy4KK0ZvciBtb3N0IG9mIHRoZXNlIGZ1bmN0aW9ucywgaG93ZXZlciwgaW5jb3JyZWN0IHJvdW5kaW5nIG9jY3VycworcmFyZWx5LCBhbmQgdGhlbiBvbmx5IGluIHZlcnktY2xvc2UtdG8taGFsZndheSBjYXNlcy4KKy5TaCBTRUUgQUxTTworLlhyIGZlbnYgMyAsCisuWHIgaWVlZSAzCisuU2ggSElTVE9SWQorQSBtYXRoIGxpYnJhcnkgd2l0aCBtYW55IG9mIHRoZSBwcmVzZW50IGZ1bmN0aW9ucyBhcHBlYXJlZCBpbgorLkF0IHY3IC4KK1RoZSBsaWJyYXJ5IHdhcyBzdWJzdGFudGlhbGx5IHJld3JpdHRlbiBmb3IKKy5CeCA0LjMKK3RvIHByb3ZpZGUKK2JldHRlciBhY2N1cmFjeSBhbmQgc3BlZWQgb24gbWFjaGluZXMgc3VwcG9ydGluZyBlaXRoZXIgVkFYCitvciBJRUVFIDc1NCBmbG9hdGluZy1wb2ludC4KK01vc3Qgb2YgdGhpcyBsaWJyYXJ5IHdhcyByZXBsYWNlZCB3aXRoIEZETElCTSwgZGV2ZWxvcGVkIGF0IFN1bgorTWljcm9zeXN0ZW1zLCBpbgorLkZ4IDEuMS41IC4KK0FkZGl0aW9uYWwgcm91dGluZXMsIGluY2x1ZGluZyBvbmVzIGZvcgorLlZ0IGZsb2F0CithbmQKKy5WdCBsb25nIGRvdWJsZQordmFsdWVzLCB3ZXJlIHdyaXR0ZW4gZm9yIG9yIGltcG9ydGVkIGludG8gc3Vic2VxdWVudCB2ZXJzaW9ucyBvZiBGcmVlQlNELgorLlNoIEJVR1MKK1RoZQorLkZuIGxvZzIKK2FuZAorLkZuIG5hbgorZnVuY3Rpb25zIGFyZSBtaXNzaW5nLCBhbmQgbWFueSBmdW5jdGlvbnMgYXJlIG5vdCBhdmFpbGFibGUgaW4gdGhlaXIKKy5WdCAibG9uZyBkb3VibGUiCit2YXJpYW50cy4KKy5QcAorTWFueSBvZiB0aGUgcm91dGluZXMgdG8gY29tcHV0ZSB0cmFuc2NlbmRlbnRhbCBmdW5jdGlvbnMgcHJvZHVjZQoraW5hY2N1cmF0ZSByZXN1bHRzIGluIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgcm91bmRpbmcgbW9kZS4KKy5QcAorT24gc29tZSBhcmNoaXRlY3R1cmVzLCB0cmlnb25vbWV0cmljIGFyZ3VtZW50IHJlZHVjdGlvbiBpcyBub3QKK3BlcmZvcm1lZCBhY2N1cmF0ZWx5LCByZXN1bHRpbmcgaW4gZXJyb3JzIGdyZWF0ZXIgdGhhbiAxCisuRW0gdWxwCitmb3IgbGFyZ2UgYXJndW1lbnRzIHRvCisuRm4gY29zICwKKy5GbiBzaW4gLAorYW5kCisuRm4gdGFuIC4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL25leHRhZnRlci4zIGIvbGlibS9tYW4vbmV4dGFmdGVyLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5NGZiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL25leHRhZnRlci4zCkBAIC0wLDAgKzEsMTAwIEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTg1LCAxOTkxIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgICAgIGZyb206IEAoIylpZWVlLjMJNi40IChCZXJrZWxleSkgNS82LzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vbmV4dGFmdGVyLjMsdiAxLjIgMjAwNS8wMy8wNyAwNTowMDoyOSBkYXMgRXhwICQKKy5cIgorLkRkIE1heSA0LCAyMDA1CisuRHQgTkVYVEFGVEVSIDMKKy5PcworLlNoIE5BTUUKKy5ObSBuZXh0YWZ0ZXIgLAorLk5tIG5leHRhZnRlcmYgLAorLk5tIG5leHRhZnRlcmwgLAorLk5tIG5leHR0b3dhcmQgLAorLk5tIG5leHR0b3dhcmRmICwKKy5ObSBuZXh0dG93YXJkbAorLk5kIG5leHQgcmVwcmVzZW50YWJsZSB2YWx1ZQorLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBuZXh0YWZ0ZXIgImRvdWJsZSB4IiAiZG91YmxlIHkiCisuRnQgZmxvYXQKKy5GbiBuZXh0YWZ0ZXJmICJmbG9hdCB4IiAiZmxvYXQgeSIKKy5GdCBsb25nIGRvdWJsZQorLkZuIG5leHRhZnRlcmwgImxvbmcgZG91YmxlIHgiICJsb25nIGRvdWJsZSB5IgorLkZ0IGRvdWJsZQorLkZuIG5leHR0b3dhcmQgImRvdWJsZSB4IiAibG9uZyBkb3VibGUgeSIKKy5GdCBmbG9hdAorLkZuIG5leHR0b3dhcmRmICJmbG9hdCB4IiAibG9uZyBkb3VibGUgeSIKKy5GdCBsb25nIGRvdWJsZQorLkZuIG5leHR0b3dhcmRsICJsb25nIGRvdWJsZSB4IiAibG9uZyBkb3VibGUgeSIKKy5TaCBERVNDUklQVElPTgorVGhlc2UgZnVuY3Rpb25zCityZXR1cm4gdGhlIG5leHQgbWFjaGluZSByZXByZXNlbnRhYmxlIG51bWJlciBmcm9tCisuRmEgeAoraW4gZGlyZWN0aW9uCisuRmEgeSAuCisuU2ggU0VFIEFMU08KKy5YciBpZWVlIDMgLAorLlhyIG1hdGggMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gbmV4dGFmdGVyICwKKy5GbiBuZXh0YWZ0ZXJmICwKKy5GbiBuZXh0YWZ0ZXJsICwKKy5GbiBuZXh0dG93YXJkICwKKy5GbiBuZXh0dG93YXJkZiAsCithbmQKKy5GbiBuZXh0dG93YXJkbAorcm91dGluZXMgY29uZm9ybSB0bworLlN0IC1pc29DLTk5IC4KK1RoZXkgaW1wbGVtZW50IHRoZSBOZXh0YWZ0ZXIgZnVuY3Rpb24gcmVjb21tZW5kZWQgYnkKKy5TdCAtaWVlZTc1NCAsCit3aXRoIHRoZSBleHRlbnNpb24gdGhhdAorLkZuIG5leHRhZnRlciArMC4wLCAtMC4wCityZXR1cm5zCisuTGkgLTAuMCAsCithbmQKKy5GbiBuZXh0YWZ0ZXIgLTAuMCwgKzAuMAorcmV0dXJucworLkxpICswLjAgLgorLlNoIEhJU1RPUlkKK1RoZQorLkZuIG5leHRhZnRlcgorZnVuY3Rpb24gYXBwZWFyZWQgaW4KKy5CeCA0LjMgLAorYW5kCisuRm4gbmV4dGFmdGVyZgorYXBwZWFyZWQgaW4KKy5GeCAyLjAgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vcmVtYWluZGVyLjMgYi9saWJtL21hbi9yZW1haW5kZXIuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjYyMWUzCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vcmVtYWluZGVyLjMKQEAgLTAsMCArMSwxNDYgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODUsIDE5OTEgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKWllZWUuMwk2LjQgKEJlcmtlbGV5KSA1LzYvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9yZW1haW5kZXIuMyx2IDEuNCAyMDA1LzExLzI0IDA5OjI1OjEwIGpvZWwgRXhwICQKKy5cIgorLkRkIE1hcmNoIDI0LCAyMDA1CisuRHQgUkVNQUlOREVSIDMKKy5PcworLlNoIE5BTUUKKy5ObSByZW1haW5kZXIgLAorLk5tIHJlbWFpbmRlcmYgLAorLk5tIHJlbXF1byAsCisuTm0gcmVtcXVvZgorLk5kIG1pbmltYWwgcmVzaWR1ZSBmdW5jdGlvbnMKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gcmVtYWluZGVyICJkb3VibGUgeCIgImRvdWJsZSB5IgorLkZ0IGZsb2F0CisuRm4gcmVtYWluZGVyZiAiZmxvYXQgeCIgImZsb2F0IHkiCisuRnQgZG91YmxlCisuRm4gcmVtcXVvICJkb3VibGUgeCIgImRvdWJsZSB5IiAiaW50ICpxdW8iCisuRnQgZmxvYXQKKy5GbiByZW1xdW9mICJmbG9hdCB4IiAiZmxvYXQgeSIgImludCAqcXVvIgorLlNoIERFU0NSSVBUSU9OCisuRm4gcmVtYWluZGVyICwKKy5GbiByZW1haW5kZXJmICwKKy5GbiByZW1xdW8gLAorYW5kCisuRm4gcmVtcXVvZgorcmV0dXJuIHRoZSByZW1haW5kZXIKKy5GYSByCis6PQorLkZhIHgKK1wtCisuRmEgblwoKip5Cit3aGVyZQorLkZhIG4KK2lzIHRoZSBpbnRlZ2VyIG5lYXJlc3QgdGhlIGV4YWN0IHZhbHVlIG9mCisuQmsgLXdvcmRzCisuRmEgeCBOcyAvIE5zIEZhIHkgOworLkVrCittb3Jlb3ZlciBpZgorLlBmIFxcKihCYSBGYSBuCitcLQorLlNtIG9mZgorLkZhIHggTm8gLyBGYSB5IE5vIFxcKihCYQorLlNtIG9uCis9CisxLzIKK3RoZW4KKy5GYSBuCitpcyBldmVuLgorQ29uc2VxdWVudGx5Cit0aGUgcmVtYWluZGVyIGlzIGNvbXB1dGVkIGV4YWN0bHkgYW5kCisuU20gb2ZmCisuUGYgXFwqKEJhIEZhIHIgTm8gXFwqKEJhCisuU20gb24KK1wqKExlCisuU20gb2ZmCisuUGYgXFwqKEJhIEZhIHkgTm8gXFwqKEJhLzIgLgorLlNtIG9uCitCdXQgYXR0ZW1wdGluZyB0byB0YWtlIHRoZSByZW1haW5kZXIgd2hlbgorLkZhIHkKK2lzIDAgb3IKKy5GYSB4CitpcyBcKihQbVwqKElmIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uIHRoYXQgcHJvZHVjZXMgYSBcKihOYS4KKy5QcAorVGhlCisuRm4gcmVtcXVvCithbmQKKy5GbiByZW1xdW9mCitmdW5jdGlvbnMgYWxzbyBzdG9yZSB0aGUgbGFzdAorLlZhIGsKK2JpdHMgb2YKKy5GYSBuCitpbiB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieQorLkZhIHF1byAsCitwcm92aWRlZCB0aGF0CisuRmEgbgorZXhpc3RzLgorVGhlIG51bWJlciBvZiBiaXRzCisuVmEgaworaXMgcGxhdGZvcm0tc3BlY2lmaWMsIGJ1dCBpcyBndWFyYW50ZWVkIHRvIGJlIGF0IGxlYXN0IDMuCisuU2ggU0VFIEFMU08KKy5YciBmbW9kIDMgLAorLlhyIGllZWUgMyAsCisuWHIgbWF0aCAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiByZW1haW5kZXIgLAorLkZuIHJlbWFpbmRlcmYgLAorLkZuIHJlbXF1byAsCithbmQKKy5GbiByZW1xdW9mCityb3V0aW5lcyBjb25mb3JtIHRvCisuU3QgLWlzb0MtOTkgLgorVGhlIHJlbWFpbmRlciBpcyBhcyBkZWZpbmVkIGluCisuU3QgLWllZWU3NTQgLgorLlNoIEhJU1RPUlkKK1RoZQorLkZuIHJlbWFpbmRlcgorYW5kCisuRm4gcmVtYWluZGVyZgorZnVuY3Rpb25zIGFwcGVhcmVkIGluCisuQnggNC4zCithbmQKKy5GeCAyLjAgLAorcmVzcGVjdGl2ZWx5LgorVGhlCisuRm4gcmVtcXVvCithbmQKKy5GbiByZW1xdW9mCitmdW5jdGlvbnMgd2VyZSBhZGRlZCBpbgorLkZ4IDYuMCAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9yaW50LjMgYi9saWJtL21hbi9yaW50LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1NWZlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL3JpbnQuMwpAQCAtMCwwICsxLDEwMyBAQAorLlwiIENvcHlyaWdodCAoYykgMTk4NSwgMTk5MSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKy5cIiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorLlwiCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorLlwiIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisuXCIgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisuXCIgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICAgICBmcm9tOiBAKCMpcmludC4zCTUuMSAoQmVya2VsZXkpIDUvMi85MQorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL3JpbnQuMyx2IDEuMTEgMjAwNS8wMS8xMSAyMzoxMjoxNyBkYXMgRXhwICQKKy5cIgorLkRkIEp1bHkgNSwgMjAwNAorLkR0IFJJTlQgMworLk9zCisuU2ggTkFNRQorLk5tIG5lYXJieWludCAsCisuTm0gbmVhcmJ5aW50ZiAsCisuTm0gcmludCAsCisuTm0gcmludGYKKy5OZCByb3VuZCB0byBpbnRlZ3JhbCB2YWx1ZSBpbiBmbG9hdGluZy1wb2ludCBmb3JtYXQKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gbmVhcmJ5aW50ICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIG5lYXJieWludGYgImZsb2F0IHgiCisuRnQgZG91YmxlCisuRm4gcmludCAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiByaW50ZiAiZmxvYXQgeCIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gcmludAorYW5kIHRoZQorLkZuIHJpbnRmCitmdW5jdGlvbnMgcmV0dXJuIHRoZSBpbnRlZ3JhbCB2YWx1ZSBuZWFyZXN0IHRvCisuRmEgeAorYWNjb3JkaW5nIHRvIHRoZSBwcmV2YWlsaW5nIHJvdW5kaW5nIG1vZGUuCitUaGVzZSBmdW5jdGlvbnMgcmFpc2UgYW4gaW5leGFjdCBleGNlcHRpb24gd2hlbiB0aGUgb3JpZ2luYWwgYXJndW1lbnQKK2lzIG5vdCBhbiBleGFjdCBpbnRlZ2VyLgorLlBwCitUaGUKKy5GbiBuZWFyYnlpbnQKK2FuZAorLkZuIG5lYXJieWludGYKK2Z1bmN0aW9ucyBwZXJmb3JtIHRoZSBzYW1lIG9wZXJhdGlvbiwgZXhjZXB0IHRoYXQgdGhleSBkbyBub3QgcmFpc2UKK2FuIGluZXhhY3QgZXhjZXB0aW9uLgorLlNoIFNFRSBBTFNPCisuWHIgYWJzIDMgLAorLlhyIGNlaWwgMyAsCisuWHIgZmFicyAzICwKKy5YciBmZW52IDMgLAorLlhyIGZsb29yIDMgLAorLlhyIGllZWUgMyAsCisuWHIgbHJpbnQgMyAsCisuWHIgbHJvdW5kIDMgLAorLlhyIG1hdGggMyAsCisuWHIgcm91bmQgMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gbmVhcmJ5aW50ICwKKy5GbiBuZWFyYnlpbnRmICwKKy5GbiByaW50ICwKK2FuZAorLkZuIHJpbnRmCitmdW5jdGlvbnMgY29uZm9ybSB0bworLlN0IC1pc29DLTk5IC4KKy5TaCBISVNUT1JZCitBCisuRm4gcmludAorZnVuY3Rpb24gYXBwZWFyZWQgaW4KKy5BdCB2NiAuCitUaGUKKy5GbiBuZWFyYnlpbnQKK2FuZAorLkZuIG5lYXJieWludGYKK2Z1bmN0aW9ucyBhcHBlYXJlZCBpbgorLkZ4IDUuMyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9yb3VuZC4zIGIvbGlibS9tYW4vcm91bmQuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDc3ZDc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vcm91bmQuMwpAQCAtMCwwICsxLDgwIEBACisuXCIgQ29weXJpZ2h0IChjKSAyMDAzLCBTdGV2ZW4gRy4gS2FyZ2wKKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9yb3VuZC4zLHYgMS42IDIwMDUvMDYvMTUgMTk6MDQ6MDQgcnUgRXhwICQKKy5cIgorLkRkIEFwcmlsIDcsIDIwMDUKKy5EdCBST1VORCAzCisuT3MKKy5TaCBOQU1FCisuTm0gcm91bmQgLAorLk5tIHJvdW5kZiAsCisuTm0gcm91bmRsCisuTmQgcm91bmQgdG8gbmVhcmVzdCBpbnRlZ3JhbCB2YWx1ZQorLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiByb3VuZCAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiByb3VuZGYgImZsb2F0IHgiCisuRnQgImxvbmcgZG91YmxlIgorLkZuIHJvdW5kbCAibG9uZyBkb3VibGUgeCIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gcm91bmQgLAorLkZuIHJvdW5kZiAsCithbmQKKy5GbiByb3VuZGwKK2Z1bmN0aW9ucyByZXR1cm4gdGhlIG5lYXJlc3QgaW50ZWdyYWwgdmFsdWUgdG8KKy5GYSB4IDsKK2lmCisuRmEgeAorbGllcyBoYWxmd2F5IGJldHdlZW4gdHdvIGludGVncmFsIHZhbHVlcywgdGhlbiB0aGVzZQorZnVuY3Rpb25zIHJldHVybiB0aGUgaW50ZWdyYWwgdmFsdWUgd2l0aCB0aGUgbGFyZ2VyCithYnNvbHV0ZSB2YWx1ZSAoaS5lLiwgdGhleSByb3VuZCBhd2F5IGZyb20gemVybykuCisuU2ggU0VFIEFMU08KKy5YciBjZWlsIDMgLAorLlhyIGZsb29yIDMgLAorLlhyIGllZWUgMyAsCisuWHIgbHJpbnQgMyAsCisuWHIgbHJvdW5kIDMgLAorLlhyIG1hdGggMyAsCisuWHIgcmludCAzICwKKy5YciB0cnVuYyAzCisuU2ggU1RBTkRBUkRTCitUaGVzZSBmdW5jdGlvbnMgY29uZm9ybSB0bworLlN0IC1pc29DLTk5IC4KKy5TaCBISVNUT1JZCitUaGUKKy5GbiByb3VuZAorYW5kCisuRm4gcm91bmRmCitmdW5jdGlvbnMgYXBwZWFyZWQgaW4KKy5GeCA1LjMgLgorVGhlCisuRm4gcm91bmRsCitmdW5jdGlvbiBhcHBlYXJlZCBpbgorLkZ4IDYuMCAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9zY2FsYm4uMyBiL2xpYm0vbWFuL3NjYWxibi4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyM2NhYWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi9zY2FsYm4uMwpAQCAtMCwwICsxLDk1IEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTg1LCAxOTkxIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgICAgIGZyb206IEAoIylpZWVlLjMJNi40IChCZXJrZWxleSkgNS82LzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vc2NhbGJuLjMsdiAxLjMgMjAwNS8xMS8yNCAwOToyNToxMCBqb2VsIEV4cCAkCisuXCIKKy5EZCBNYXJjaCA0LCAyMDA1CisuRHQgU0NBTEJOIDMKKy5PcworLlNoIE5BTUUKKy5ObSBzY2FsYmxuICwKKy5ObSBzY2FsYmxuZiAsCisuTm0gc2NhbGJsbmwgLAorLk5tIHNjYWxibiAsCisuTm0gc2NhbGJuZiAsCisuTm0gc2NhbGJubAorLk5kIGFkanVzdCBleHBvbmVudAorLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBzY2FsYmxuICJkb3VibGUgeCIgImxvbmcgbiIKKy5GdCBmbG9hdAorLkZuIHNjYWxibG5mICJmbG9hdCB4IiAibG9uZyBuIgorLkZ0IGxvbmcgZG91YmxlCisuRm4gc2NhbGJsbmwgImxvbmcgZG91YmxlIHgiICJsb25nIG4iCisuRnQgZG91YmxlCisuRm4gc2NhbGJuICJkb3VibGUgeCIgImludCBuIgorLkZ0IGZsb2F0CisuRm4gc2NhbGJuZiAiZmxvYXQgeCIgImludCBuIgorLkZ0IGxvbmcgZG91YmxlCisuRm4gc2NhbGJubCAibG9uZyBkb3VibGUgeCIgImludCBuIgorLlNoIERFU0NSSVBUSU9OCitUaGVzZSByb3V0aW5lcyByZXR1cm4KKy5GYSB4IE5zIFwoKiooMioqIE5zIEZhIG4gKQorY29tcHV0ZWQgYnkgZXhwb25lbnQgbWFuaXB1bGF0aW9uLgorLlNoIFNFRSBBTFNPCisuWHIgaWVlZSAzICwKKy5YciBtYXRoIDMKKy5TaCBTVEFOREFSRFMKK1RoZXNlIHJvdXRpbmVzIGNvbmZvcm0gdG8KKy5TdCAtaXNvQy05OSAsCithbmQgdGhleSBpbXBsZW1lbnQgdGhlIFNjYWxiIGZ1bmN0aW9uIHJlY29tbWVuZGVkIGJ5CisuU3QgLWllZWU3NTQgLgorLlNoIEhJU1RPUlkKK1RoZQorLkZuIHNjYWxibgorYW5kCisuRm4gc2NhbGJuZgorZnVuY3Rpb25zIGFwcGVhcmVkIGluCisuQnggNC4zCithbmQKKy5GeCAyLjAgLAorcmVzcGVjdGl2ZWx5LgorVGhlCisuRm4gc2NhbGJsbgorYW5kCisuRm4gc2NhbGJsbmYKK2Z1bmN0aW9ucyBmaXJzdCBhcHBlYXJlZCBpbgorLkZ4IDUuMyAsCithbmQKKy5GbiBzY2FsYmxubAorYW5kCisuRm4gc2NhbGJsbgoraW4KKy5GeCA2LjAgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vc2lnbmJpdC4zIGIvbGlibS9tYW4vc2lnbmJpdC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NDk2NzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi9zaWduYml0LjMKQEAgLTAsMCArMSw1NyBAQAorLlwiIENvcHlyaWdodCAoYykgMjAwMyBNaWtlIEJhcmNyb2Z0IDxtaWtlQEZyZWVCU0Qub3JnPgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9zaWduYml0LjMsdiAxLjEgMjAwNC8wNy8xOSAwODoxNjoxMCBkYXMgRXhwICQKKy5cIgorLkRkIEp1bHkgMTgsIDIwMDQKKy5EdCBTSUdOQklUIDMKKy5PcworLlNoIE5BTUUKKy5ObSBzaWduYml0CisuTmQgImRldGVybWluZSB3aGV0aGVyIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyJ3Mgc2lnbiBpcyBuZWdhdGl2ZSIKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgaW50CisuRm4gc2lnbmJpdCAicmVhbC1mbG9hdGluZyB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiBzaWduYml0CittYWNybyB0YWtlcyBhbiBhcmd1bWVudCBvZgorLkZhIHgKK2FuZCByZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSB2YWx1ZSBvZiBpdHMgc2lnbiBpcyBuZWdhdGl2ZSwgb3RoZXJ3aXNlIDAuCisuU2ggU0VFIEFMU08KKy5YciBmcGNsYXNzaWZ5IDMgLAorLlhyIG1hdGggMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gc2lnbmJpdAorbWFjcm8gY29uZm9ybXMgdG8KKy5TdCAtaXNvQy05OSAuCisuU2ggSElTVE9SWQorVGhlCisuRm4gc2lnbmJpdAorbWFjcm8gd2FzIGFkZGVkIGluCisuRnggNS4xIC4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL3Npbi4zIGIvbGlibS9tYW4vc2luLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0MDhhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL3Npbi4zCkBAIC0wLDAgKzEsODIgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTEgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIJQCgjKXNpbi4zCTYuNyAoQmVya2VsZXkpIDQvMTkvOTEKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKXNpbi4zCTYuNyAoQmVya2VsZXkpIDQvMTkvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9zaW4uMyx2IDEuOSAyMDAxLzEwLzEzIDEyOjIzOjIzIGJkZSBFeHAgJAorLlwiCisuRGQgQXByaWwgMTksIDE5OTEKKy5EdCBTSU4gMworLk9zCisuU2ggTkFNRQorLk5tIHNpbiAsCisuTm0gc2luZgorLk5kIHNpbmUgZnVuY3Rpb25zCisuU2ggTElCUkFSWQorLkxiIGxpYm0KKy5TaCBTWU5PUFNJUworLkluIG1hdGguaAorLkZ0IGRvdWJsZQorLkZuIHNpbiAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBzaW5mICJmbG9hdCB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiBzaW4KK2FuZCB0aGUKKy5GbiBzaW5mCitmdW5jdGlvbnMgY29tcHV0ZSB0aGUgc2luZSBvZgorLkZhIHgKKyhtZWFzdXJlZCBpbiByYWRpYW5zKS4KK0EgbGFyZ2UgbWFnbml0dWRlIGFyZ3VtZW50IG1heSB5aWVsZCBhIHJlc3VsdCB3aXRoIGxpdHRsZQorb3Igbm8gc2lnbmlmaWNhbmNlLgorLlNoIFJFVFVSTiBWQUxVRVMKK1RoZQorLkZuIHNpbgorYW5kIHRoZQorLkZuIHNpbmYKK2Z1bmN0aW9ucyByZXR1cm4gdGhlIHNpbmUgdmFsdWUuCisuU2ggU0VFIEFMU08KKy5YciBhY29zIDMgLAorLlhyIGFzaW4gMyAsCisuWHIgYXRhbiAzICwKKy5YciBhdGFuMiAzICwKKy5YciBjb3MgMyAsCisuWHIgY29zaCAzICwKKy5YciBtYXRoIDMgLAorLlhyIHNpbmggMyAsCisuWHIgdGFuIDMgLAorLlhyIHRhbmggMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gc2luCitmdW5jdGlvbiBjb25mb3JtcyB0bworLlN0IC1pc29DIC4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL3NpbmguMyBiL2xpYm0vbWFuL3NpbmguMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQ3ODYyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vc2luaC4zCkBAIC0wLDAgKzEsNzEgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTEgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIJZnJvbTogQCgjKXNpbmguMwk2LjYgKEJlcmtlbGV5KSA0LzE5LzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vc2luaC4zLHYgMS4xMiAyMDA1LzAxLzE0IDIzOjI4OjI4IGRhcyBFeHAgJAorLkRkIEphbnVhcnkgMTQsIDIwMDUKKy5EdCBTSU5IIDMKKy5PcworLlNoIE5BTUUKKy5ObSBzaW5oICwKKy5ObSBzaW5oZgorLk5kIGh5cGVyYm9saWMgc2luZSBmdW5jdGlvbgorLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBzaW5oICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIHNpbmhmICJmbG9hdCB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiBzaW5oCithbmQgdGhlCisuRm4gc2luaGYKK2Z1bmN0aW9ucyBjb21wdXRlIHRoZSBoeXBlcmJvbGljIHNpbmUgb2YKKy5GYSB4IC4KKy5TaCBTRUUgQUxTTworLlhyIGFjb3MgMyAsCisuWHIgYXNpbiAzICwKKy5YciBhdGFuIDMgLAorLlhyIGF0YW4yIDMgLAorLlhyIGNvcyAzICwKKy5YciBjb3NoIDMgLAorLlhyIG1hdGggMyAsCisuWHIgc2luIDMgLAorLlhyIHRhbiAzICwKKy5YciB0YW5oIDMKKy5TaCBTVEFOREFSRFMKK1RoZQorLkZuIHNpbmgKK2Z1bmN0aW9uIGNvbmZvcm1zIHRvCisuU3QgLWlzb0MgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vc3FydC4zIGIvbGlibS9tYW4vc3FydC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZjhiN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi9zcXJ0LjMKQEAgLTAsMCArMSwxMDAgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODUsIDE5OTEgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKXNxcnQuMwk2LjQgKEJlcmtlbGV5KSA1LzYvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9zcXJ0LjMsdiAxLjEyIDIwMDUvMDEvMTQgMjM6Mjg6MjggZGFzIEV4cCAkCisuXCIKKy5EZCBNYXkgNiwgMTk5MQorLkR0IFNRUlQgMworLk9zCisuU2ggTkFNRQorLk5tIGNicnQgLAorLk5tIGNicnRmICwKKy5ObSBzcXJ0ICwKKy5ObSBzcXJ0ZgorLk5kIGN1YmUgcm9vdCBhbmQgc3F1YXJlIHJvb3QgZnVuY3Rpb25zCisuU2ggTElCUkFSWQorLkxiIGxpYm0KKy5TaCBTWU5PUFNJUworLkluIG1hdGguaAorLkZ0IGRvdWJsZQorLkZuIGNicnQgImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4gY2JydGYgImZsb2F0IHgiCisuRnQgZG91YmxlCisuRm4gc3FydCAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBzcXJ0ZiAiZmxvYXQgeCIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gY2JydAorYW5kIHRoZQorLkZuIGNicnRmCitmdW5jdGlvbnMgY29tcHV0ZQordGhlIGN1YmUgcm9vdCBvZgorLkFyIHggLgorLlBwCitUaGUKKy5GbiBzcXJ0CithbmQgdGhlCisuRm4gc3FydGYKK2Z1bmN0aW9ucyBjb21wdXRlIHRoZQorbm9uLW5lZ2F0aXZlIHNxdWFyZSByb290IG9mIHguCisuU2ggUkVUVVJOIFZBTFVFUworVGhlCisuRm4gY2JydAorYW5kIHRoZQorLkZuIGNicnRmCitmdW5jdGlvbnMgcmV0dXJuIHRoZSByZXF1ZXN0ZWQgY3ViZSByb290LgorVGhlCisuRm4gc3FydAorYW5kIHRoZQorLkZuIHNxcnRmCitmdW5jdGlvbnMgcmV0dXJuIHRoZSByZXF1ZXN0ZWQgc3F1YXJlIHJvb3QKK3VubGVzcyBhbiBlcnJvciBvY2N1cnMuCitBbiBhdHRlbXB0IHRvIHRha2UgdGhlCisuRm4gc3FydAorb2YgbmVnYXRpdmUKKy5GYSB4CityYWlzZXMgYW4gaW52YWxpZCBleGNlcHRpb24gYW5kIGNhdXNlcyBhbiBcKihOYSB0byBiZSByZXR1cm5lZC4KKy5TaCBTRUUgQUxTTworLlhyIGZlbnYgMyAsCisuWHIgbWF0aCAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiBzcXJ0CitmdW5jdGlvbiBjb25mb3JtcyB0bworLlN0IC1pc29DIC4KKy5TaCBISVNUT1JZCitUaGUKKy5GbiBjYnJ0CitmdW5jdGlvbiBhcHBlYXJlZCBpbgorLkJ4IDQuMyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi90YW4uMyBiL2xpYm0vbWFuL3Rhbi4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OTVhM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi90YW4uMwpAQCAtMCwwICsxLDgxIEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTkxIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKy5cIiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorLlwiCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorLlwiIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisuXCIgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisuXCIgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICAgICBmcm9tOiBAKCMpdGFuLjMJNS4xIChCZXJrZWxleSkgNS8yLzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vdGFuLjMsdiAxLjkgMjAwMS8xMC8xMyAxMjoyMzoyMyBiZGUgRXhwICQKKy5cIgorLkRkIE1heSAyLCAxOTkxCisuRHQgVEFOIDMKKy5PcworLlNoIE5BTUUKKy5ObSB0YW4gLAorLk5tIHRhbmYKKy5OZCB0YW5nZW50IGZ1bmN0aW9ucworLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiB0YW4gImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4gdGFuZiAiZmxvYXQgeCIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gdGFuCithbmQgdGhlCisuRm4gdGFuZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIHRhbmdlbnQgb2YKKy5GYSB4CisobWVhc3VyZWQgaW4gcmFkaWFucykuCitBIGxhcmdlIG1hZ25pdHVkZSBhcmd1bWVudCBtYXkgeWllbGQgYSByZXN1bHQKK3dpdGggbGl0dGxlIG9yIG5vIHNpZ25pZmljYW5jZS4KK0ZvciBhIGRpc2N1c3Npb24gb2YgZXJyb3IgZHVlIHRvIHJvdW5kb2ZmLCBzZWUKKy5YciBtYXRoIDMgLgorLlNoIFJFVFVSTiBWQUxVRVMKK1RoZQorLkZuIHRhbgorZnVuY3Rpb24gcmV0dXJucyB0aGUgdGFuZ2VudCB2YWx1ZS4KKy5TaCBTRUUgQUxTTworLlhyIGFjb3MgMyAsCisuWHIgYXNpbiAzICwKKy5YciBhdGFuIDMgLAorLlhyIGF0YW4yIDMgLAorLlhyIGNvcyAzICwKKy5YciBjb3NoIDMgLAorLlhyIG1hdGggMyAsCisuWHIgc2luIDMgLAorLlhyIHNpbmggMyAsCisuWHIgdGFuaCAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiB0YW4KK2Z1bmN0aW9uIGNvbmZvcm1zIHRvCisuU3QgLWlzb0MgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vdGFuaC4zIGIvbGlibS9tYW4vdGFuaC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MWJjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi90YW5oLjMKQEAgLTAsMCArMSw4MCBAQAorLlwiIENvcHlyaWdodCAoYykgMTk5MSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKXRhbmguMwk1LjEgKEJlcmtlbGV5KSA1LzIvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi90YW5oLjMsdiAxLjEwIDIwMDEvMTAvMTMgMTI6MjM6MjMgYmRlIEV4cCAkCisuXCIKKy5EZCBNYXkgMiwgMTk5MQorLkR0IFRBTkggMworLk9zCisuU2ggTkFNRQorLk5tIHRhbmggLAorLk5tIHRhbmhmCisuTmQgaHlwZXJib2xpYyB0YW5nZW50IGZ1bmN0aW9ucworLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiB0YW5oICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIHRhbmhmICJmbG9hdCB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiB0YW5oCithbmQgdGhlCisuRm4gdGFuaGYKK2Z1bmN0aW9ucyBjb21wdXRlIHRoZSBoeXBlcmJvbGljIHRhbmdlbnQgb2YKKy5GYSB4IC4KK0ZvciBhIGRpc2N1c3Npb24gb2YgZXJyb3IgZHVlIHRvIHJvdW5kb2ZmLCBzZWUKKy5YciBtYXRoIDMgLgorLlNoIFJFVFVSTiBWQUxVRVMKK1RoZQorLkZuIHRhbmgKK2FuZCB0aGUKKy5GbiB0YW5oZgorZnVuY3Rpb25zIHJldHVybiB0aGUgaHlwZXJib2xpYyB0YW5nZW50IHZhbHVlLgorLlNoIFNFRSBBTFNPCisuWHIgYWNvcyAzICwKKy5YciBhc2luIDMgLAorLlhyIGF0YW4gMyAsCisuWHIgYXRhbjIgMyAsCisuWHIgY29zIDMgLAorLlhyIGNvc2ggMyAsCisuWHIgbWF0aCAzICwKKy5YciBzaW4gMyAsCisuWHIgc2luaCAzICwKKy5YciB0YW4gMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gdGFuaAorZnVuY3Rpb24gY29uZm9ybXMgdG8KKy5TdCAtaXNvQyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi90cnVuYy4zIGIvbGlibS9tYW4vdHJ1bmMuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjZjMjZmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vdHJ1bmMuMwpAQCAtMCwwICsxLDgwIEBACisuXCIgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELm9yZz4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vdHJ1bmMuMyx2IDEuMyAyMDA1LzA2LzE1IDE5OjA0OjA0IHJ1IEV4cCAkCisuXCIKKy5EZCBBcHJpbCAxNiwgMjAwNQorLkR0IFRSVU5DIDMKKy5PcworLlNoIE5BTUUKKy5ObSB0cnVuYyAsCisuTm0gdHJ1bmNmICwKKy5ObSB0cnVuY2wKKy5OZCBuZWFyZXN0IGludGVncmFsIHZhbHVlIHdpdGggbWFnbml0dWRlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB8eHwKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gdHJ1bmMgImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4gdHJ1bmNmICJmbG9hdCB4IgorLkZ0ICJsb25nIGRvdWJsZSIKKy5GbiB0cnVuY2wgImxvbmcgZG91YmxlIHgiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIHRydW5jICwKKy5GbiB0cnVuY2YgLAorYW5kCisuRm4gdHJ1bmNsCitmdW5jdGlvbnMgcmV0dXJuIHRoZSBuZWFyZXN0IGludGVncmFsIHZhbHVlIHdpdGggbWFnbml0dWRlIGxlc3MgdGhhbgorb3IgZXF1YWwgdG8KKy5QZiB8IEZhIHggTnMgfCAuCitUaGV5IGFyZSBlcXVpdmFsZW50IHRvCisuRm4gcmludCAsCisuRm4gcmludGYgLAorYW5kCisuRm4gcmludGwgLAorcmVzcGVjdGl2ZWx5LCBpbiB0aGUKKy5EdiBGRV9UT1dBUkRaRVJPCityb3VuZGluZyBtb2RlLgorLlNoIFNFRSBBTFNPCisuWHIgY2VpbCAzICwKKy5YciBmZXNldHJvdW5kIDMgLAorLlhyIGZsb29yIDMgLAorLlhyIG1hdGggMyAsCisuWHIgbmV4dGFmdGVyIDMgLAorLlhyIHJpbnQgMyAsCisuWHIgcm91bmQgMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gdHJ1bmMgLAorLkZuIHRydW5jZiAsCithbmQKKy5GbiB0cnVuY2wKK2Z1bmN0aW9ucyBjb25mb3JtIHRvCisuU3QgLWlzb0MtOTkgLgorLlNoIEhJU1RPUlkKK1RoZXNlIHJvdXRpbmVzIGZpcnN0IGFwcGVhcmVkIGluCisuRnggNS4zIC4KZGlmZiAtLWdpdCBhL2xpYm0vcG93ZXJwYy9NYWtlZmlsZS5pbmMgYi9saWJtL3Bvd2VycGMvTWFrZWZpbGUuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYjM3MDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3Bvd2VycGMvTWFrZWZpbGUuaW5jCkBAIC0wLDAgKzEsMyBAQAorIyAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3Bvd2VycGMvTWFrZWZpbGUuaW5jLHYgMS4xIDIwMDUvMDMvMDcgMDQ6NTM6MzYgZGFzIEV4cCAkCisKK0xEQkxfUFJFQyA9IDUzCmRpZmYgLS1naXQgYS9saWJtL3Bvd2VycGMvX2ZwbWF0aC5oIGIvbGlibS9wb3dlcnBjL19mcG1hdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjg1Y2I5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9wb3dlcnBjL19mcG1hdGguaApAQCAtMCwwICsxLDQ5IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMyBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL2xpYmMvcG93ZXJwYy9fZnBtYXRoLmgsdiAxLjcgMjAwNS8wMy8wNyAwNDo1NToyMiBkYXMgRXhwICQKKyAqLworCit1bmlvbiBJRUVFbDJiaXRzIHsKKwlsb25nIGRvdWJsZQllOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGludAkJc2lnbgk6MTsKKwkJdW5zaWduZWQgaW50CQlleHAJOjExOworCQl1bnNpZ25lZCBpbnQJCW1hbmgJOjIwOworCQl1bnNpZ25lZCBpbnQJCW1hbmwJOjMyOworCX0gYml0czsKK307CisKKyNkZWZpbmUJbWFza19uYml0X2wodSkJKCh2b2lkKTApCisjZGVmaW5lCUxEQkxfSU1QTElDSVRfTkJJVAorI2RlZmluZQlMREJMX05CSVQJMAorCisjZGVmaW5lCUxEQkxfTUFOSF9TSVpFCTIwCisjZGVmaW5lCUxEQkxfTUFOTF9TSVpFCTMyCisKKyNkZWZpbmUJTERCTF9UT19BUlJBWTMyKHUsIGEpIGRvIHsJCQlcCisJKGEpWzBdID0gKHVpbnQzMl90KSh1KS5iaXRzLm1hbmw7CQlcCisJKGEpWzFdID0gKHVpbnQzMl90KSh1KS5iaXRzLm1hbmg7CQlcCit9IHdoaWxlKDApCmRpZmYgLS1naXQgYS9saWJtL3Bvd2VycGMvZmVudi5jIGIvbGlibS9wb3dlcnBjL2ZlbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGZhODdhCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9wb3dlcnBjL2ZlbnYuYwpAQCAtMCwwICsxLDMxIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vcG93ZXJwYy9mZW52LmMsdiAxLjEgMjAwNC8wNi8wNiAxMDowNToxMCBkYXMgRXhwICQKKyAqLworCisjaW5jbHVkZSA8ZmVudi5oPgorCitjb25zdCBmZW52X3QgX19mZV9kZmxfZW52ID0gMHgwMDAwMDAwMDsKZGlmZiAtLWdpdCBhL2xpYm0vcG93ZXJwYy9mZW52LmggYi9saWJtL3Bvd2VycGMvZmVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZDIzODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3Bvd2VycGMvZmVudi5oCkBAIC0wLDAgKzEsMjYzIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9wb3dlcnBjL2ZlbnYuaCx2IDEuMyAyMDA1LzAzLzE2IDE5OjAzOjQ1IGRhcyBFeHAgJAorICovCisKKyNpZm5kZWYJX0ZFTlZfSF8KKyNkZWZpbmUJX0ZFTlZfSF8KKworI2luY2x1ZGUgPHN5cy9fdHlwZXMuaD4KKwordHlwZWRlZglfX3VpbnQzMl90CWZlbnZfdDsKK3R5cGVkZWYJX191aW50MzJfdAlmZXhjZXB0X3Q7CisKKy8qIEV4Y2VwdGlvbiBmbGFncyAqLworI2RlZmluZQlGRV9JTkVYQUNUCTB4MDIwMDAwMDAKKyNkZWZpbmUJRkVfRElWQllaRVJPCTB4MDQwMDAwMDAKKyNkZWZpbmUJRkVfVU5ERVJGTE9XCTB4MDgwMDAwMDAKKyNkZWZpbmUJRkVfT1ZFUkZMT1cJMHgxMDAwMDAwMAorI2RlZmluZQlGRV9JTlZBTElECTB4MjAwMDAwMDAJLyogYWxsIHR5cGVzIG9mIGludmFsaWQgRlAgb3BzICovCisKKy8qCisgKiBUaGUgUG93ZXJQQyBhcmNoaXRlY3R1cmUgaGFzIGV4dHJhIGludmFsaWQgZmxhZ3MgdGhhdCBpbmRpY2F0ZSB0aGUKKyAqIHNwZWNpZmljIHR5cGUgb2YgaW52YWxpZCBvcGVyYXRpb24gb2NjdXJyZWQuICBUaGVzZSBmbGFncyBtYXkgYmUKKyAqIHRlc3RlZCwgc2V0LCBhbmQgY2xlYXJlZC0tLWJ1dCBub3QgbWFza2VkLS0tc2VwYXJhdGVseS4gIEFsbCBvZgorICogdGhlc2UgYml0cyBhcmUgY2xlYXJlZCB3aGVuIEZFX0lOVkFMSUQgaXMgY2xlYXJlZCwgYnV0IG9ubHkKKyAqIEZFX1ZYU09GVCBpcyBzZXQgd2hlbiBGRV9JTlZBTElEIGlzIGV4cGxpY2l0bHkgc2V0IGluIHNvZnR3YXJlLgorICovCisjZGVmaW5lCUZFX1ZYQ1ZJCTB4MDAwMDAxMDAJLyogaW52YWxpZCBpbnRlZ2VyIGNvbnZlcnQgKi8KKyNkZWZpbmUJRkVfVlhTUVJUCTB4MDAwMDAyMDAJLyogc3F1YXJlIHJvb3Qgb2YgYSBuZWdhdGl2ZSAqLworI2RlZmluZQlGRV9WWFNPRlQJMHgwMDAwMDQwMAkvKiBzb2Z0d2FyZS1yZXF1ZXN0ZWQgZXhjZXB0aW9uICovCisjZGVmaW5lCUZFX1ZYVkMJCTB4MDAwODAwMDAJLyogb3JkZXJlZCBjb21wYXJpc29uIGludm9sdmluZyBOYU4gKi8KKyNkZWZpbmUJRkVfVlhJTVoJMHgwMDEwMDAwMAkvKiBpbmYgKiAwICovCisjZGVmaW5lCUZFX1ZYWkRaCTB4MDAyMDAwMDAJLyogMCAvIDAgKi8KKyNkZWZpbmUJRkVfVlhJREkJMHgwMDQwMDAwMAkvKiBpbmYgLyBpbmYgKi8KKyNkZWZpbmUJRkVfVlhJU0kJMHgwMDgwMDAwMAkvKiBpbmYgLSBpbmYgKi8KKyNkZWZpbmUJRkVfVlhTTkFOCTB4MDEwMDAwMDAJLyogb3BlcmF0aW9uIG9uIGEgc2lnbmFsbGluZyBOYU4gKi8KKyNkZWZpbmUJRkVfQUxMX0lOVkFMSUQJKEZFX1ZYQ1ZJIHwgRkVfVlhTUVJUIHwgRkVfVlhTT0ZUIHwgRkVfVlhWQyB8IFwKKwkJCSBGRV9WWElNWiB8IEZFX1ZYWkRaIHwgRkVfVlhJREkgfCBGRV9WWElTSSB8IFwKKwkJCSBGRV9WWFNOQU4gfCBGRV9JTlZBTElEKQorI2RlZmluZQlGRV9BTExfRVhDRVBUCShGRV9ESVZCWVpFUk8gfCBGRV9JTkVYQUNUIHwgXAorCQkJIEZFX0FMTF9JTlZBTElEIHwgRkVfT1ZFUkZMT1cgfCBGRV9VTkRFUkZMT1cpCisKKy8qIFJvdW5kaW5nIG1vZGVzICovCisjZGVmaW5lCUZFX1RPTkVBUkVTVAkweDAwMDAKKyNkZWZpbmUJRkVfVE9XQVJEWkVSTwkweDAwMDEKKyNkZWZpbmUJRkVfVVBXQVJECTB4MDAwMgorI2RlZmluZQlGRV9ET1dOV0FSRAkweDAwMDMKKyNkZWZpbmUJX1JPVU5EX01BU0sJKEZFX1RPTkVBUkVTVCB8IEZFX0RPV05XQVJEIHwgXAorCQkJIEZFX1VQV0FSRCB8IEZFX1RPV0FSRFpFUk8pCisKK19fQkVHSU5fREVDTFMKKworLyogRGVmYXVsdCBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCAqLworZXh0ZXJuIGNvbnN0IGZlbnZfdAlfX2ZlX2RmbF9lbnY7CisjZGVmaW5lCUZFX0RGTF9FTlYJKCZfX2ZlX2RmbF9lbnYpCisKKy8qIFdlIG5lZWQgdG8gYmUgYWJsZSB0byBtYXAgc3RhdHVzIGZsYWcgcG9zaXRpb25zIHRvIG1hc2sgZmxhZyBwb3NpdGlvbnMgKi8KKyNkZWZpbmUJX0ZQVVNXX1NISUZUCTIyCisjZGVmaW5lCV9FTkFCTEVfTUFTSwkoKEZFX0RJVkJZWkVSTyB8IEZFX0lORVhBQ1QgfCBGRV9JTlZBTElEIHwgXAorCQkJIEZFX09WRVJGTE9XIHwgRkVfVU5ERVJGTE9XKSA+PiBfRlBVU1dfU0hJRlQpCisKKyNkZWZpbmUJX19tZmZzKF9fZW52KQlfX2FzbSBfX3ZvbGF0aWxlKCJtZmZzICUwIiA6ICI9ZiIgKCooX19lbnYpKSkKKyNkZWZpbmUJX19tdGZzZihfX2VudikJX19hc20gX192b2xhdGlsZSgibXRmc2YgMjU1LCUwIiA6IDogImYiIChfX2VudikpCisKK3VuaW9uIF9fZnBzY3IgeworCWRvdWJsZSBfX2Q7CisJc3RydWN0IHsKKwkJX191aW50MzJfdCBfX2p1bms7CisJCWZlbnZfdCBfX3JlZzsKKwl9IF9fYml0czsKK307CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlY2xlYXJleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwl1bmlvbiBfX2Zwc2NyIF9fcjsKKworCWlmIChfX2V4Y2VwdHMgJiBGRV9JTlZBTElEKQorCQlfX2V4Y2VwdHMgfD0gRkVfQUxMX0lOVkFMSUQ7CisJX19tZmZzKCZfX3IuX19kKTsKKwlfX3IuX19iaXRzLl9fcmVnICY9IH5fX2V4Y2VwdHM7CisJX19tdGZzZihfX3IuX19kKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldGV4Y2VwdGZsYWcoZmV4Y2VwdF90ICpfX2ZsYWdwLCBpbnQgX19leGNlcHRzKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCisJX19tZmZzKCZfX3IuX19kKTsKKwkqX19mbGFncCA9IF9fci5fX2JpdHMuX19yZWcgJiBfX2V4Y2VwdHM7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRleGNlcHRmbGFnKGNvbnN0IGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwl1bmlvbiBfX2Zwc2NyIF9fcjsKKworCWlmIChfX2V4Y2VwdHMgJiBGRV9JTlZBTElEKQorCQlfX2V4Y2VwdHMgfD0gRkVfQUxMX0VYQ0VQVDsKKwlfX21mZnMoJl9fci5fX2QpOworCV9fci5fX2JpdHMuX19yZWcgJj0gfl9fZXhjZXB0czsKKwlfX3IuX19iaXRzLl9fcmVnIHw9ICpfX2ZsYWdwICYgX19leGNlcHRzOworCV9fbXRmc2YoX19yLl9fZCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVyYWlzZWV4Y2VwdChpbnQgX19leGNlcHRzKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCisJaWYgKF9fZXhjZXB0cyAmIEZFX0lOVkFMSUQpCisJCV9fZXhjZXB0cyB8PSBGRV9WWFNPRlQ7CisJX19tZmZzKCZfX3IuX19kKTsKKwlfX3IuX19iaXRzLl9fcmVnIHw9IF9fZXhjZXB0czsKKwlfX210ZnNmKF9fci5fX2QpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZldGVzdGV4Y2VwdChpbnQgX19leGNlcHRzKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCisJX19tZmZzKCZfX3IuX19kKTsKKwlyZXR1cm4gKF9fci5fX2JpdHMuX19yZWcgJiBfX2V4Y2VwdHMpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldHJvdW5kKHZvaWQpCit7CisJdW5pb24gX19mcHNjciBfX3I7CisKKwlfX21mZnMoJl9fci5fX2QpOworCXJldHVybiAoX19yLl9fYml0cy5fX3JlZyAmIF9ST1VORF9NQVNLKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRyb3VuZChpbnQgX19yb3VuZCkKK3sKKwl1bmlvbiBfX2Zwc2NyIF9fcjsKKworCWlmIChfX3JvdW5kICYgfl9ST1VORF9NQVNLKQorCQlyZXR1cm4gKC0xKTsKKwlfX21mZnMoJl9fci5fX2QpOworCV9fci5fX2JpdHMuX19yZWcgJj0gfl9ST1VORF9NQVNLOworCV9fci5fX2JpdHMuX19yZWcgfD0gX19yb3VuZDsKKwlfX210ZnNmKF9fci5fX2QpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZW52KGZlbnZfdCAqX19lbnZwKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCisJX19tZmZzKCZfX3IuX19kKTsKKwkqX19lbnZwID0gX19yLl9fYml0cy5fX3JlZzsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWhvbGRleGNlcHQoZmVudl90ICpfX2VudnApCit7CisJdW5pb24gX19mcHNjciBfX3I7CisKKwlfX21mZnMoJl9fci5fX2QpOworCSpfX2VudnAgPSBfX3IuX19kOworCV9fci5fX2JpdHMuX19yZWcgJj0gfihGRV9BTExfRVhDRVBUIHwgX0VOQUJMRV9NQVNLKTsKKwlfX210ZnNmKF9fci5fX2QpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2Zlc2V0ZW52KGNvbnN0IGZlbnZfdCAqX19lbnZwKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCisJX19yLl9fYml0cy5fX3JlZyA9ICpfX2VudnA7CisJX19tdGZzZihfX3IuX19kKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXVwZGF0ZWVudihjb25zdCBmZW52X3QgKl9fZW52cCkKK3sKKwl1bmlvbiBfX2Zwc2NyIF9fcjsKKworCV9fbWZmcygmX19yLl9fZCk7CisJX19yLl9fYml0cy5fX3JlZyAmPSBGRV9BTExfRVhDRVBUOworCV9fci5fX2JpdHMuX19yZWcgfD0gKl9fZW52cDsKKwlfX210ZnNmKF9fci5fX2QpOworCXJldHVybiAoMCk7Cit9CisKKyNpZiBfX0JTRF9WSVNJQkxFCisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZW5hYmxlZXhjZXB0KGludCBfX21hc2spCit7CisJdW5pb24gX19mcHNjciBfX3I7CisJZmVudl90IF9fb2xkbWFzazsKKworCV9fbWZmcygmX19yLl9fZCk7CisJX19vbGRtYXNrID0gX19yLl9fYml0cy5fX3JlZzsKKwlfX3IuX19iaXRzLl9fcmVnIHw9IChfX21hc2sgJiBGRV9BTExfRVhDRVBUKSA+PiBfRlBVU1dfU0hJRlQ7CisJX19tdGZzZihfX3IuX19kKTsKKwlyZXR1cm4gKChfX29sZG1hc2sgJiBfRU5BQkxFX01BU0spIDw8IF9GUFVTV19TSElGVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZGlzYWJsZWV4Y2VwdChpbnQgX19tYXNrKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCWZlbnZfdCBfX29sZG1hc2s7CisKKwlfX21mZnMoJl9fci5fX2QpOworCV9fb2xkbWFzayA9IF9fci5fX2JpdHMuX19yZWc7CisJX19yLl9fYml0cy5fX3JlZyAmPSB+KChfX21hc2sgJiBGRV9BTExfRVhDRVBUKSA+PiBfRlBVU1dfU0hJRlQpOworCV9fbXRmc2YoX19yLl9fZCk7CisJcmV0dXJuICgoX19vbGRtYXNrICYgX0VOQUJMRV9NQVNLKSA8PCBfRlBVU1dfU0hJRlQpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldGV4Y2VwdCh2b2lkKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCisJX19tZmZzKCZfX3IuX19kKTsKKwlyZXR1cm4gKChfX3IuX19iaXRzLl9fcmVnICYgX0VOQUJMRV9NQVNLKSA8PCBfRlBVU1dfU0hJRlQpOworfQorCisjZW5kaWYgLyogX19CU0RfVklTSUJMRSAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogIV9GRU5WX0hfICovCmRpZmYgLS1naXQgYS9saWJtL3NwYXJjNjQvTWFrZWZpbGUuaW5jIGIvbGlibS9zcGFyYzY0L01ha2VmaWxlLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODgzZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcGFyYzY0L01ha2VmaWxlLmluYwpAQCAtMCwwICsxLDQgQEAKKyMgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcGFyYzY0L01ha2VmaWxlLmluYyx2IDEuMiAyMDA1LzAzLzA3IDA0OjUzOjM2IGRhcyBFeHAgJAorCitBUkNIX1NSQ1M9IGVfc3FydC5TIGVfc3FydGYuUworTERCTF9QUkVDPSAxMTMKZGlmZiAtLWdpdCBhL2xpYm0vc3BhcmM2NC9fZnBtYXRoLmggYi9saWJtL3NwYXJjNjQvX2ZwbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZmFhYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NwYXJjNjQvX2ZwbWF0aC5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pa2UgQmFyY3JvZnQgPG1pa2VARnJlZUJTRC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9saWJjL3NwYXJjNjQvX2ZwbWF0aC5oLHYgMS41IDIwMDUvMDMvMDcgMDQ6NTU6MjIgZGFzIEV4cCAkCisgKi8KKwordW5pb24gSUVFRWwyYml0cyB7CisJbG9uZyBkb3VibGUJZTsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQJc2lnbgk6MTsKKwkJdW5zaWduZWQgaW50CWV4cAk6MTU7CisJCXVuc2lnbmVkIGxvbmcJbWFuaAk6NDg7CisJCXVuc2lnbmVkIGxvbmcJbWFubAk6NjQ7CisJfSBiaXRzOworfTsKKworI2RlZmluZQltYXNrX25iaXRfbCh1KQkoKHZvaWQpMCkKKyNkZWZpbmUJTERCTF9JTVBMSUNJVF9OQklUCisjZGVmaW5lCUxEQkxfTkJJVAkwCisKKyNkZWZpbmUJTERCTF9NQU5IX1NJWkUJNDgKKyNkZWZpbmUJTERCTF9NQU5MX1NJWkUJNjQKKworI2RlZmluZQlMREJMX1RPX0FSUkFZMzIodSwgYSkgZG8gewkJCVwKKwkoYSlbMF0gPSAodWludDMyX3QpKHUpLmJpdHMubWFubDsJCVwKKwkoYSlbMV0gPSAodWludDMyX3QpKCh1KS5iaXRzLm1hbmwgPj4gMzIpOyAgICAgIAlcCisJKGEpWzJdID0gKHVpbnQzMl90KSh1KS5iaXRzLm1hbmg7CQlcCisJKGEpWzNdID0gKHVpbnQzMl90KSgodSkuYml0cy5tYW5oID4+IDMyKTsJXAorfSB3aGlsZSgwKQpkaWZmIC0tZ2l0IGEvbGlibS9zcGFyYzY0L2Vfc3FydC5TIGIvbGlibS9zcGFyYzY0L2Vfc3FydC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1Zjc5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NwYXJjNjQvZV9zcXJ0LlMKQEAgLTAsMCArMSwzMyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NwYXJjNjQvZV9zcXJ0LlMsdiAxLjEgMjAwNS8wMi8yMSAxODoyNzo1NyBkYXMgRXhwICQiKQorCitFTlRSWShzcXJ0KQorCXJldGwKKwlmc3FydGQgJWYwLCAlZjAKK0VORChzcXJ0KQpkaWZmIC0tZ2l0IGEvbGlibS9zcGFyYzY0L2Vfc3FydGYuUyBiL2xpYm0vc3BhcmM2NC9lX3NxcnRmLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFmN2NmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3BhcmM2NC9lX3NxcnRmLlMKQEAgLTAsMCArMSwzMyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NwYXJjNjQvZV9zcXJ0Zi5TLHYgMS4xIDIwMDUvMDIvMjEgMTg6Mjc6NTcgZGFzIEV4cCAkIikKKworRU5UUlkoc3FydGYpCisJcmV0bAorCWZzcXJ0cyAlZjEsICVmMAorRU5EKHNxcnRmKQpkaWZmIC0tZ2l0IGEvbGlibS9zcGFyYzY0L2ZlbnYuYyBiL2xpYm0vc3BhcmM2NC9mZW52LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlhMGY2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3BhcmM2NC9mZW52LmMKQEAgLTAsMCArMSwzNiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NwYXJjNjQvZmVudi5jLHYgMS4xIDIwMDQvMDYvMDYgMTA6MDU6NTcgZGFzIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGZlbnYuaD4KKworLyoKKyAqIFRoZSBGU1JfdmVyc2lvbiBmaWVsZCBtYXkgYmUgZGlmZmVyZW50IG9uIGRpZmZlcmVudAorICogaW1wbGVtZW50YXRpb25zLCBidXQgaXQgaXMgaW1tdXRhYmxlIGFuZCBvcGFxdWUgdG8gdGhlCisgKiBhcHBsaWNhdGlvbi4gIFRodXMsIDAgaXMgdmFsaWQgYXMgdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQuCisgKi8KK2NvbnN0IGZlbnZfdCBfX2ZlX2RmbF9lbnYgPSAwOwpkaWZmIC0tZ2l0IGEvbGlibS9zcGFyYzY0L2ZlbnYuaCBiL2xpYm0vc3BhcmM2NC9mZW52LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0YzRhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3BhcmM2NC9mZW52LmgKQEAgLTAsMCArMSwyNTQgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NwYXJjNjQvZmVudi5oLHYgMS4zIDIwMDUvMDMvMTYgMTk6MDM6NDYgZGFzIEV4cCAkCisgKi8KKworI2lmbmRlZglfRkVOVl9IXworI2RlZmluZQlfRkVOVl9IXworCisjaW5jbHVkZSA8c3lzL190eXBlcy5oPgorCit0eXBlZGVmCV9fdWludDY0X3QJZmVudl90OwordHlwZWRlZglfX3VpbnQ2NF90CWZleGNlcHRfdDsKKworLyogRXhjZXB0aW9uIGZsYWdzICovCisjZGVmaW5lCUZFX0lOVkFMSUQJMHgwMDAwMDIwMAorI2RlZmluZQlGRV9ESVZCWVpFUk8JMHgwMDAwMDA0MAorI2RlZmluZQlGRV9PVkVSRkxPVwkweDAwMDAwMTAwCisjZGVmaW5lCUZFX1VOREVSRkxPVwkweDAwMDAwMDgwCisjZGVmaW5lCUZFX0lORVhBQ1QJMHgwMDAwMDAyMAorI2RlZmluZQlGRV9BTExfRVhDRVBUCShGRV9ESVZCWVpFUk8gfCBGRV9JTkVYQUNUIHwgXAorCQkJIEZFX0lOVkFMSUQgfCBGRV9PVkVSRkxPVyB8IEZFX1VOREVSRkxPVykKKworLyoKKyAqIFJvdW5kaW5nIG1vZGVzCisgKgorICogV2UgY2FuJ3QganVzdCB1c2UgdGhlIGhhcmR3YXJlIGJpdCB2YWx1ZXMgaGVyZSwgYmVjYXVzZSB0aGF0IHdvdWxkCisgKiBtYWtlIEZFX1VQV0FSRCBhbmQgRkVfRE9XTldBUkQgbmVnYXRpdmUsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLgorICovCisjZGVmaW5lCUZFX1RPTkVBUkVTVAkweDAKKyNkZWZpbmUJRkVfVE9XQVJEWkVSTwkweDEKKyNkZWZpbmUJRkVfVVBXQVJECTB4MgorI2RlZmluZQlGRV9ET1dOV0FSRAkweDMKKyNkZWZpbmUJX1JPVU5EX01BU0sJKEZFX1RPTkVBUkVTVCB8IEZFX0RPV05XQVJEIHwgXAorCQkJIEZFX1VQV0FSRCB8IEZFX1RPV0FSRFpFUk8pCisjZGVmaW5lCV9ST1VORF9TSElGVAkzMAorCitfX0JFR0lOX0RFQ0xTCisKKy8qIERlZmF1bHQgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQgKi8KK2V4dGVybiBjb25zdCBmZW52X3QJX19mZV9kZmxfZW52OworI2RlZmluZQlGRV9ERkxfRU5WCSgmX19mZV9kZmxfZW52KQorCisvKiBXZSBuZWVkIHRvIGJlIGFibGUgdG8gbWFwIHN0YXR1cyBmbGFnIHBvc2l0aW9ucyB0byBtYXNrIGZsYWcgcG9zaXRpb25zICovCisjZGVmaW5lIF9GUFVTV19TSElGVAkxOAorI2RlZmluZQlfRU5BQkxFX01BU0sJKEZFX0FMTF9FWENFUFQgPDwgX0ZQVVNXX1NISUZUKQorCisjZGVmaW5lCV9fbGR4ZnNyKF9fcikJX19hc20gX192b2xhdGlsZSgibGR4ICUwLCAlJWZzciIgOiA6ICJtIiAoX19yKSkKKyNkZWZpbmUJX19zdHhmc3IoX19yKQlfX2FzbSBfX3ZvbGF0aWxlKCJzdHggJSVmc3IsICUwIiA6ICI9bSIgKCooX19yKSkpCisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlY2xlYXJleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwlmZXhjZXB0X3QgX19yOworCisJX19zdHhmc3IoJl9fcik7CisJX19yICY9IH5fX2V4Y2VwdHM7CisJX19sZHhmc3IoX19yKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldGV4Y2VwdGZsYWcoZmV4Y2VwdF90ICpfX2ZsYWdwLCBpbnQgX19leGNlcHRzKQoreworCWZleGNlcHRfdCBfX3I7CisKKwlfX3N0eGZzcigmX19yKTsKKwkqX19mbGFncCA9IF9fciAmIF9fZXhjZXB0czsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldGV4Y2VwdGZsYWcoY29uc3QgZmV4Y2VwdF90ICpfX2ZsYWdwLCBpbnQgX19leGNlcHRzKQoreworCWZleGNlcHRfdCBfX3I7CisKKwlfX3N0eGZzcigmX19yKTsKKwlfX3IgJj0gfl9fZXhjZXB0czsKKwlfX3IgfD0gKl9fZmxhZ3AgJiBfX2V4Y2VwdHM7CisJX19sZHhmc3IoX19yKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogSW4gY29udHJhc3Qgd2l0aCB0aGUgaWE2NCBwbGF0Zm9ybSwgaXQgc2VlbXMgdG8gYmUgd29ydGh3aGlsZSB0bworICogaW5saW5lIHRoaXMgZnVuY3Rpb24gb24gc3BhcmM2NCBldmVuIHdoZW4gdGhlIGFyZ3VtZW50cyBhcmUgbm90CisgKiBjb21waWxlLXRpbWUgY29uc3RhbnRzLiAgUGVyaGFwcyB0aGlzIGRlcGVuZHMgb24gdGhlIHJlZ2lzdGVyIHdpbmRvdy4KKyAqLworc3RhdGljIF9faW5saW5lIGludAorZmVyYWlzZWV4Y2VwdChpbnQgX19leGNlcHRzKQoreworCXZvbGF0aWxlIGRvdWJsZSBkOworCisJLyoKKwkgKiBXaXRoIGEgY29tcGlsZXIgdGhhdCBzdXBwb3J0cyB0aGUgRkVOVl9BQ0NFU1MgcHJhZ21hCisJICogcHJvcGVybHksIHNpbXBsZSBleHByZXNzaW9ucyBsaWtlICcwLjAgLyAwLjAnIHNob3VsZAorCSAqIGJlIHN1ZmZpY2llbnQgdG8gZ2VuZXJhdGUgdHJhcHMuICBVbmZvcnR1bmF0ZWx5LCB3ZQorCSAqIG5lZWQgdG8gYnJpbmcgYSB2b2xhdGlsZSB2YXJpYWJsZSBpbnRvIHRoZSBlcXVhdGlvbgorCSAqIHRvIHByZXZlbnQgaW5jb3JyZWN0IG9wdGltaXphdGlvbnMuCisJICovCisJaWYgKF9fZXhjZXB0cyAmIEZFX0lOVkFMSUQpIHsKKwkJZCA9IDAuMDsKKwkJZCA9IDAuMCAvIGQ7CisJfQorCWlmIChfX2V4Y2VwdHMgJiBGRV9ESVZCWVpFUk8pIHsKKwkJZCA9IDAuMDsKKwkJZCA9IDEuMCAvIGQ7CisJfQorCWlmIChfX2V4Y2VwdHMgJiBGRV9PVkVSRkxPVykgeworCQlkID0gMHgxLmZmcDEwMjM7CisJCWQgKj0gMi4wOworCX0KKwlpZiAoX19leGNlcHRzICYgRkVfVU5ERVJGTE9XKSB7CisJCWQgPSAweDFwLTEwMjI7CisJCWQgLz0gMHgxcDEwMjM7CisJfQorCWlmIChfX2V4Y2VwdHMgJiBGRV9JTkVYQUNUKSB7CisJCWQgPSAweDFwLTEwMjI7CisJCWQgKz0gMS4wOworCX0KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXRlc3RleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwlmZXhjZXB0X3QgX19yOworCisJX19zdHhmc3IoJl9fcik7CisJcmV0dXJuIChfX3IgJiBfX2V4Y2VwdHMpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldHJvdW5kKHZvaWQpCit7CisJZmVudl90IF9fcjsKKworCV9fc3R4ZnNyKCZfX3IpOworCXJldHVybiAoKF9fciA+PiBfUk9VTkRfU0hJRlQpICYgX1JPVU5EX01BU0spOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldHJvdW5kKGludCBfX3JvdW5kKQoreworCWZlbnZfdCBfX3I7CisKKwlpZiAoX19yb3VuZCAmIH5fUk9VTkRfTUFTSykKKwkJcmV0dXJuICgtMSk7CisJX19zdHhmc3IoJl9fcik7CisJX19yICY9IH4oX1JPVU5EX01BU0sgPDwgX1JPVU5EX1NISUZUKTsKKwlfX3IgfD0gX19yb3VuZCA8PCBfUk9VTkRfU0hJRlQ7CisJX19sZHhmc3IoX19yKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldGVudihmZW52X3QgKl9fZW52cCkKK3sKKworCV9fc3R4ZnNyKF9fZW52cCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVob2xkZXhjZXB0KGZlbnZfdCAqX19lbnZwKQoreworCWZlbnZfdCBfX3I7CisKKwlfX3N0eGZzcigmX19yKTsKKwkqX19lbnZwID0gX19yOworCV9fciAmPSB+KEZFX0FMTF9FWENFUFQgfCBfRU5BQkxFX01BU0spOworCV9fbGR4ZnNyKF9fcik7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRlbnYoY29uc3QgZmVudl90ICpfX2VudnApCit7CisKKwlfX2xkeGZzcigqX19lbnZwKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXVwZGF0ZWVudihjb25zdCBmZW52X3QgKl9fZW52cCkKK3sKKwlmZXhjZXB0X3QgX19yOworCisJX19zdHhmc3IoJl9fcik7CisJX19sZHhmc3IoKl9fZW52cCk7CisJZmVyYWlzZWV4Y2VwdChfX3IgJiBGRV9BTExfRVhDRVBUKTsKKwlyZXR1cm4gKDApOworfQorCisjaWYgX19CU0RfVklTSUJMRQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWVuYWJsZWV4Y2VwdChpbnQgX19tYXNrKQoreworCWZlbnZfdCBfX29sZF9yLCBfX25ld19yOworCisJX19zdHhmc3IoJl9fb2xkX3IpOworCV9fbmV3X3IgPSBfX29sZF9yIHwgKChfX21hc2sgJiBGRV9BTExfRVhDRVBUKSA8PCBfRlBVU1dfU0hJRlQpOworCV9fbGR4ZnNyKF9fbmV3X3IpOworCXJldHVybiAoKF9fb2xkX3IgPj4gX0ZQVVNXX1NISUZUKSAmIEZFX0FMTF9FWENFUFQpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWRpc2FibGVleGNlcHQoaW50IF9fbWFzaykKK3sKKwlmZW52X3QgX19vbGRfciwgX19uZXdfcjsKKworCV9fc3R4ZnNyKCZfX29sZF9yKTsKKwlfX25ld19yID0gX19vbGRfciAmIH4oKF9fbWFzayAmIEZFX0FMTF9FWENFUFQpIDw8IF9GUFVTV19TSElGVCk7CisJX19sZHhmc3IoX19uZXdfcik7CisJcmV0dXJuICgoX19vbGRfciA+PiBfRlBVU1dfU0hJRlQpICYgRkVfQUxMX0VYQ0VQVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZXhjZXB0KHZvaWQpCit7CisJZmVudl90IF9fcjsKKworCV9fc3R4ZnNyKCZfX3IpOworCXJldHVybiAoKF9fciAmIF9FTkFCTEVfTUFTSykgPj4gX0ZQVVNXX1NISUZUKTsKK30KKworI2VuZGlmIC8qIF9fQlNEX1ZJU0lCTEUgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qICFfRkVOVl9IXyAqLwpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9hY29zLmMgYi9saWJtL3NyYy9lX2Fjb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmE2NzJhCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9hY29zLmMKQEAgLTAsMCArMSwxMDQgQEAKKworLyogQCgjKWVfYWNvcy5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2Fjb3MuYyx2IDEuMTAgMjAwNS8wMi8wNCAxODoyNjowNSBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9hY29zKHgpCisgKiBNZXRob2QgOiAgICAgICAgICAgICAgICAgIAorICoJYWNvcyh4KSAgPSBwaS8yIC0gYXNpbih4KQorICoJYWNvcygteCkgPSBwaS8yICsgYXNpbih4KQorICogRm9yIHx4fDw9MC41CisgKglhY29zKHgpID0gcGkvMiAtICh4ICsgeCp4XjIqUih4XjIpKQkoc2VlIGFzaW4uYykKKyAqIEZvciB4PjAuNQorICogCWFjb3MoeCkgPSBwaS8yIC0gKHBpLzIgLSAyYXNpbihzcXJ0KCgxLXgpLzIpKSkKKyAqCQk9IDJhc2luKHNxcnQoKDEteCkvMikpICAKKyAqCQk9IDJzICsgMnMqeipSKHopIAkuLi56PSgxLXgpLzIsIHM9c3FydCh6KQorICoJCT0gMmYgKyAoMmMgKyAycyp6KlIoeikpCisgKiAgICAgd2hlcmUgZj1oaSBwYXJ0IG9mIHMsIGFuZCBjID0gKHotZipmKS8ocytmKSBpcyB0aGUgY29ycmVjdGlvbiB0ZXJtCisgKiAgICAgZm9yIGYgc28gdGhhdCBmK2MgfiBzcXJ0KHopLgorICogRm9yIHg8LTAuNQorICoJYWNvcyh4KSA9IHBpIC0gMmFzaW4oc3FydCgoMS18eHwpLzIpKQorICoJCT0gcGkgLSAwLjUqKHMrcyp6KlIoeikpLCB3aGVyZSB6PSgxLXx4fCkvMixzPXNxcnQoeikKKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICoJaWYgeCBpcyBOYU4sIHJldHVybiB4IGl0c2VsZjsKKyAqCWlmIHx4fD4xLCByZXR1cm4gTmFOIHdpdGggaW52YWxpZCBzaWduYWwuCisgKgorICogRnVuY3Rpb24gbmVlZGVkOiBzcXJ0CisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQorb25lPSAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMGUrMDAsIC8qIDB4M0ZGMDAwMDAsIDB4MDAwMDAwMDAgKi8KK3BpID0gIDMuMTQxNTkyNjUzNTg5NzkzMTE2MDBlKzAwLCAvKiAweDQwMDkyMUZCLCAweDU0NDQyRDE4ICovCitwaW8yX2hpID0gIDEuNTcwNzk2MzI2Nzk0ODk2NTU4MDBlKzAwLCAvKiAweDNGRjkyMUZCLCAweDU0NDQyRDE4ICovCitwaW8yX2xvID0gIDYuMTIzMjMzOTk1NzM2NzY2MDM1ODdlLTE3LCAvKiAweDNDOTFBNjI2LCAweDMzMTQ1QzA3ICovCitwUzAgPSAgMS42NjY2NjY2NjY2NjY2NjY1NzQxNWUtMDEsIC8qIDB4M0ZDNTU1NTUsIDB4NTU1NTU1NTUgKi8KK3BTMSA9IC0zLjI1NTY1ODE4NjIyNDAwOTE1NDA1ZS0wMSwgLyogMHhCRkQ0RDYxMiwgMHgwM0VCNkY3RCAqLworcFMyID0gIDIuMDEyMTI1MzIxMzQ4NjI5MjU4ODFlLTAxLCAvKiAweDNGQzlDMTU1LCAweDBFODg0NDU1ICovCitwUzMgPSAtNC4wMDU1NTM0NTAwNjc5NDExNDAyN2UtMDIsIC8qIDB4QkZBNDgyMjgsIDB4QjU2ODhGM0IgKi8KK3BTNCA9ICA3LjkxNTM0OTk0Mjg5ODE0NTMyMTc2ZS0wNCwgLyogMHgzRjQ5RUZFMCwgMHg3NTAxQjI4OCAqLworcFM1ID0gIDMuNDc5MzMxMDc1OTYwMjExNjc1NzBlLTA1LCAvKiAweDNGMDIzREUxLCAweDBERkRGNzA5ICovCitxUzEgPSAtMi40MDMzOTQ5MTE3MzQ0MTQyMTg3OGUrMDAsIC8qIDB4QzAwMzNBMjcsIDB4MUM4QTJENEIgKi8KK3FTMiA9ICAyLjAyMDk0NTc2MDIzMzUwNTY5NDcxZSswMCwgLyogMHg0MDAwMkFFNSwgMHg5QzU5OEFDOCAqLworcVMzID0gLTYuODgyODM5NzE2MDU0NTMyOTMwMzBlLTAxLCAvKiAweEJGRTYwNjZDLCAweDFCOEQwMTU5ICovCitxUzQgPSAgNy43MDM4MTUwNTU1OTAxOTM1Mjc5MWUtMDI7IC8qIDB4M0ZCM0I4QzUsIDB4QjEyRTkyODIgKi8KKworZG91YmxlCitfX2llZWU3NTRfYWNvcyhkb3VibGUgeCkKK3sKKwlkb3VibGUgeixwLHEscix3LHMsYyxkZjsKKwlpbnQzMl90IGh4LGl4OworCUdFVF9ISUdIX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmKGl4Pj0weDNmZjAwMDAwKSB7CS8qIHx4fCA+PSAxICovCisJICAgIHVfaW50MzJfdCBseDsKKwkgICAgR0VUX0xPV19XT1JEKGx4LHgpOworCSAgICBpZigoKGl4LTB4M2ZmMDAwMDApfGx4KT09MCkgewkvKiB8eHw9PTEgKi8KKwkJaWYoaHg+MCkgcmV0dXJuIDAuMDsJCS8qIGFjb3MoMSkgPSAwICAqLworCQllbHNlIHJldHVybiBwaSsyLjAqcGlvMl9sbzsJLyogYWNvcygtMSk9IHBpICovCisJICAgIH0KKwkgICAgcmV0dXJuICh4LXgpLyh4LXgpOwkJLyogYWNvcyh8eHw+MSkgaXMgTmFOICovCisJfQorCWlmKGl4PDB4M2ZlMDAwMDApIHsJLyogfHh8IDwgMC41ICovCisJICAgIGlmKGl4PD0weDNjNjAwMDAwKSByZXR1cm4gcGlvMl9oaStwaW8yX2xvOy8qaWZ8eHw8MioqLTU3Ki8KKwkgICAgeiA9IHgqeDsKKwkgICAgcCA9IHoqKHBTMCt6KihwUzEreioocFMyK3oqKHBTMyt6KihwUzQreipwUzUpKSkpKTsKKwkgICAgcSA9IG9uZSt6KihxUzEreioocVMyK3oqKHFTMyt6KnFTNCkpKTsKKwkgICAgciA9IHAvcTsKKwkgICAgcmV0dXJuIHBpbzJfaGkgLSAoeCAtIChwaW8yX2xvLXgqcikpOworCX0gZWxzZSAgaWYgKGh4PDApIHsJCS8qIHggPCAtMC41ICovCisJICAgIHogPSAob25lK3gpKjAuNTsKKwkgICAgcCA9IHoqKHBTMCt6KihwUzEreioocFMyK3oqKHBTMyt6KihwUzQreipwUzUpKSkpKTsKKwkgICAgcSA9IG9uZSt6KihxUzEreioocVMyK3oqKHFTMyt6KnFTNCkpKTsKKwkgICAgcyA9IHNxcnQoeik7CisJICAgIHIgPSBwL3E7CisJICAgIHcgPSByKnMtcGlvMl9sbzsKKwkgICAgcmV0dXJuIHBpIC0gMi4wKihzK3cpOworCX0gZWxzZSB7CQkJLyogeCA+IDAuNSAqLworCSAgICB6ID0gKG9uZS14KSowLjU7CisJICAgIHMgPSBzcXJ0KHopOworCSAgICBkZiA9IHM7CisJICAgIFNFVF9MT1dfV09SRChkZiwwKTsKKwkgICAgYyAgPSAoei1kZipkZikvKHMrZGYpOworCSAgICBwID0geioocFMwK3oqKHBTMSt6KihwUzIreioocFMzK3oqKHBTNCt6KnBTNSkpKSkpOworCSAgICBxID0gb25lK3oqKHFTMSt6KihxUzIreioocVMzK3oqcVM0KSkpOworCSAgICByID0gcC9xOworCSAgICB3ID0gcipzK2M7CisJICAgIHJldHVybiAyLjAqKGRmK3cpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfYWNvc2YuYyBiL2xpYm0vc3JjL2VfYWNvc2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTFmNDhlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9hY29zZi5jCkBAIC0wLDAgKzEsODEgQEAKKy8qIGVfYWNvc2YuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfYWNvcy5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9hY29zZi5jLHYgMS43IDIwMDIvMDUvMjggMTc6MDM6MTIgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK29uZSA9ICAxLjAwMDAwMDAwMDBlKzAwLCAvKiAweDNGODAwMDAwICovCitwaSA9ICAzLjE0MTU5MjUwMjZlKzAwLCAvKiAweDQwNDkwZmRhICovCitwaW8yX2hpID0gIDEuNTcwNzk2MjUxM2UrMDAsIC8qIDB4M2ZjOTBmZGEgKi8KK3BpbzJfbG8gPSAgNy41NDk3ODk0MTU5ZS0wOCwgLyogMHgzM2EyMjE2OCAqLworcFMwID0gIDEuNjY2NjY2NzE2M2UtMDEsIC8qIDB4M2UyYWFhYWIgKi8KK3BTMSA9IC0zLjI1NTY1ODE0OTdlLTAxLCAvKiAweGJlYTZiMDkwICovCitwUzIgPSAgMi4wMTIxMjUyNTM3ZS0wMSwgLyogMHgzZTRlMGFhOCAqLworcFMzID0gLTQuMDA1NTUzNTczNGUtMDIsIC8qIDB4YmQyNDExNDYgKi8KK3BTNCA9ICA3LjkxNTM1MDE0MjllLTA0LCAvKiAweDNhNGY3ZjA0ICovCitwUzUgPSAgMy40NzkzMzA5MTY5ZS0wNSwgLyogMHgzODExZWYwOCAqLworcVMxID0gLTIuNDAzMzk0OTM3NWUrMDAsIC8qIDB4YzAxOWQxMzkgKi8KK3FTMiA9ICAyLjAyMDk0NTc4NzRlKzAwLCAvKiAweDQwMDE1NzJkICovCitxUzMgPSAtNi44ODI4Mzk3OTg5ZS0wMSwgLyogMHhiZjMwMzM2MSAqLworcVM0ID0gIDcuNzAzODE1NDAwNmUtMDI7IC8qIDB4M2Q5ZGM2MmUgKi8KKworZmxvYXQKK19faWVlZTc1NF9hY29zZihmbG9hdCB4KQoreworCWZsb2F0IHoscCxxLHIsdyxzLGMsZGY7CisJaW50MzJfdCBoeCxpeDsKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg9PTB4M2Y4MDAwMDApIHsJCS8qIHx4fD09MSAqLworCSAgICBpZihoeD4wKSByZXR1cm4gMC4wOwkvKiBhY29zKDEpID0gMCAgKi8KKwkgICAgZWxzZSByZXR1cm4gcGkrKGZsb2F0KTIuMCpwaW8yX2xvOwkvKiBhY29zKC0xKT0gcGkgKi8KKwl9IGVsc2UgaWYoaXg+MHgzZjgwMDAwMCkgewkvKiB8eHwgPj0gMSAqLworCSAgICByZXR1cm4gKHgteCkvKHgteCk7CQkvKiBhY29zKHx4fD4xKSBpcyBOYU4gKi8KKwl9CisJaWYoaXg8MHgzZjAwMDAwMCkgewkvKiB8eHwgPCAwLjUgKi8KKwkgICAgaWYoaXg8PTB4MjMwMDAwMDApIHJldHVybiBwaW8yX2hpK3BpbzJfbG87LyppZnx4fDwyKiotNTcqLworCSAgICB6ID0geCp4OworCSAgICBwID0geioocFMwK3oqKHBTMSt6KihwUzIreioocFMzK3oqKHBTNCt6KnBTNSkpKSkpOworCSAgICBxID0gb25lK3oqKHFTMSt6KihxUzIreioocVMzK3oqcVM0KSkpOworCSAgICByID0gcC9xOworCSAgICByZXR1cm4gcGlvMl9oaSAtICh4IC0gKHBpbzJfbG8teCpyKSk7CisJfSBlbHNlICBpZiAoaHg8MCkgewkJLyogeCA8IC0wLjUgKi8KKwkgICAgeiA9IChvbmUreCkqKGZsb2F0KTAuNTsKKwkgICAgcCA9IHoqKHBTMCt6KihwUzEreioocFMyK3oqKHBTMyt6KihwUzQreipwUzUpKSkpKTsKKwkgICAgcSA9IG9uZSt6KihxUzEreioocVMyK3oqKHFTMyt6KnFTNCkpKTsKKwkgICAgcyA9IF9faWVlZTc1NF9zcXJ0Zih6KTsKKwkgICAgciA9IHAvcTsKKwkgICAgdyA9IHIqcy1waW8yX2xvOworCSAgICByZXR1cm4gcGkgLSAoZmxvYXQpMi4wKihzK3cpOworCX0gZWxzZSB7CQkJLyogeCA+IDAuNSAqLworCSAgICBpbnQzMl90IGlkZjsKKwkgICAgeiA9IChvbmUteCkqKGZsb2F0KTAuNTsKKwkgICAgcyA9IF9faWVlZTc1NF9zcXJ0Zih6KTsKKwkgICAgZGYgPSBzOworCSAgICBHRVRfRkxPQVRfV09SRChpZGYsZGYpOworCSAgICBTRVRfRkxPQVRfV09SRChkZixpZGYmMHhmZmZmZjAwMCk7CisJICAgIGMgID0gKHotZGYqZGYpLyhzK2RmKTsKKwkgICAgcCA9IHoqKHBTMCt6KihwUzEreioocFMyK3oqKHBTMyt6KihwUzQreipwUzUpKSkpKTsKKwkgICAgcSA9IG9uZSt6KihxUzEreioocVMyK3oqKHFTMyt6KnFTNCkpKTsKKwkgICAgciA9IHAvcTsKKwkgICAgdyA9IHIqcytjOworCSAgICByZXR1cm4gKGZsb2F0KTIuMCooZGYrdyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9hY29zaC5jIGIvbGlibS9zcmMvZV9hY29zaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYjE1MjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2Fjb3NoLmMKQEAgLTAsMCArMSw2MyBAQAorCisvKiBAKCMpZV9hY29zaC5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9hY29zaC5jLHYgMS44IDIwMDUvMDIvMDQgMTg6MjY6MDUgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfYWNvc2goeCkKKyAqIE1ldGhvZCA6CisgKglCYXNlZCBvbiAKKyAqCQlhY29zaCh4KSA9IGxvZyBbIHggKyBzcXJ0KHgqeC0xKSBdCisgKgl3ZSBoYXZlCisgKgkJYWNvc2goeCkgOj0gbG9nKHgpK2xuMiwJaWYgeCBpcyBsYXJnZTsgZWxzZQorICoJCWFjb3NoKHgpIDo9IGxvZygyeC0xLyhzcXJ0KHgqeC0xKSt4KSkgaWYgeD4yOyBlbHNlCisgKgkJYWNvc2goeCkgOj0gbG9nMXAodCtzcXJ0KDIuMCp0K3QqdCkpOyB3aGVyZSB0PXgtMS4KKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICoJYWNvc2goeCkgaXMgTmFOIHdpdGggc2lnbmFsIGlmIHg8MS4KKyAqCWFjb3NoKE5hTikgaXMgTmFOIHdpdGhvdXQgc2lnbmFsLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK29uZQk9IDEuMCwKK2xuMgk9IDYuOTMxNDcxODA1NTk5NDUyODYyMjdlLTAxOyAgLyogMHgzRkU2MkU0MiwgMHhGRUZBMzlFRiAqLworCitkb3VibGUKK19faWVlZTc1NF9hY29zaChkb3VibGUgeCkKK3sKKwlkb3VibGUgdDsKKwlpbnQzMl90IGh4OworCXVfaW50MzJfdCBseDsKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCWlmKGh4PDB4M2ZmMDAwMDApIHsJCS8qIHggPCAxICovCisJICAgIHJldHVybiAoeC14KS8oeC14KTsKKwl9IGVsc2UgaWYoaHggPj0weDQxYjAwMDAwKSB7CS8qIHggPiAyKioyOCAqLworCSAgICBpZihoeCA+PTB4N2ZmMDAwMDApIHsJLyogeCBpcyBpbmYgb2YgTmFOICovCisJICAgICAgICByZXR1cm4geCt4OworCSAgICB9IGVsc2UgCisJCXJldHVybiBfX2llZWU3NTRfbG9nKHgpK2xuMjsJLyogYWNvc2goaHVnZSk9bG9nKDJ4KSAqLworCX0gZWxzZSBpZigoKGh4LTB4M2ZmMDAwMDApfGx4KT09MCkgeworCSAgICByZXR1cm4gMC4wOwkJCS8qIGFjb3NoKDEpID0gMCAqLworCX0gZWxzZSBpZiAoaHggPiAweDQwMDAwMDAwKSB7CS8qIDIqKjI4ID4geCA+IDIgKi8KKwkgICAgdD14Kng7CisJICAgIHJldHVybiBfX2llZWU3NTRfbG9nKDIuMCp4LW9uZS8oeCtzcXJ0KHQtb25lKSkpOworCX0gZWxzZSB7CQkJLyogMTx4PDIgKi8KKwkgICAgdCA9IHgtb25lOworCSAgICByZXR1cm4gbG9nMXAodCtzcXJ0KDIuMCp0K3QqdCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfYWNvc2hmLmMgYi9saWJtL3NyYy9lX2Fjb3NoZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNTc5MTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2Fjb3NoZi5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qIGVfYWNvc2hmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2Fjb3NoLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2Fjb3NoZi5jLHYgMS43IDIwMDIvMDUvMjggMTc6MDM6MTIgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK29uZQk9IDEuMCwKK2xuMgk9IDYuOTMxNDcxODI0NmUtMDE7ICAvKiAweDNmMzE3MjE4ICovCisKK2Zsb2F0CitfX2llZWU3NTRfYWNvc2hmKGZsb2F0IHgpCit7CisJZmxvYXQgdDsKKwlpbnQzMl90IGh4OworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWlmKGh4PDB4M2Y4MDAwMDApIHsJCS8qIHggPCAxICovCisJICAgIHJldHVybiAoeC14KS8oeC14KTsKKwl9IGVsc2UgaWYoaHggPj0weDRkODAwMDAwKSB7CS8qIHggPiAyKioyOCAqLworCSAgICBpZihoeCA+PTB4N2Y4MDAwMDApIHsJLyogeCBpcyBpbmYgb2YgTmFOICovCisJICAgICAgICByZXR1cm4geCt4OworCSAgICB9IGVsc2UKKwkJcmV0dXJuIF9faWVlZTc1NF9sb2dmKHgpK2xuMjsJLyogYWNvc2goaHVnZSk9bG9nKDJ4KSAqLworCX0gZWxzZSBpZiAoaHg9PTB4M2Y4MDAwMDApIHsKKwkgICAgcmV0dXJuIDAuMDsJCQkvKiBhY29zaCgxKSA9IDAgKi8KKwl9IGVsc2UgaWYgKGh4ID4gMHg0MDAwMDAwMCkgewkvKiAyKioyOCA+IHggPiAyICovCisJICAgIHQ9eCp4OworCSAgICByZXR1cm4gX19pZWVlNzU0X2xvZ2YoKGZsb2F0KTIuMCp4LW9uZS8oeCtfX2llZWU3NTRfc3FydGYodC1vbmUpKSk7CisJfSBlbHNlIHsJCQkvKiAxPHg8MiAqLworCSAgICB0ID0geC1vbmU7CisJICAgIHJldHVybiBsb2cxcGYodCtfX2llZWU3NTRfc3FydGYoKGZsb2F0KTIuMCp0K3QqdCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfYXNpbi5jIGIvbGlibS9zcmMvZV9hc2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhNzAyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfYXNpbi5jCkBAIC0wLDAgKzEsMTEzIEBACisKKy8qIEAoIyllX2FzaW4uYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9hc2luLmMsdiAxLjExIDIwMDUvMDIvMDQgMTg6MjY6MDUgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfYXNpbih4KQorICogTWV0aG9kIDogICAgICAgICAgICAgICAgICAKKyAqCVNpbmNlICBhc2luKHgpID0geCArIHheMy82ICsgeF41KjMvNDAgKyB4XjcqMTUvMzM2ICsgLi4uCisgKgl3ZSBhcHByb3hpbWF0ZSBhc2luKHgpIG9uIFswLDAuNV0gYnkKKyAqCQlhc2luKHgpID0geCArIHgqeF4yKlIoeF4yKQorICoJd2hlcmUKKyAqCQlSKHheMikgaXMgYSByYXRpb25hbCBhcHByb3hpbWF0aW9uIG9mIChhc2luKHgpLXgpL3heMyAKKyAqCWFuZCBpdHMgcmVtZXogZXJyb3IgaXMgYm91bmRlZCBieQorICoJCXwoYXNpbih4KS14KS94XjMgLSBSKHheMil8IDwgMl4oLTU4Ljc1KQorICoKKyAqCUZvciB4IGluIFswLjUsMV0KKyAqCQlhc2luKHgpID0gcGkvMi0yKmFzaW4oc3FydCgoMS14KS8yKSkKKyAqCUxldCB5ID0gKDEteCksIHogPSB5LzIsIHMgOj0gc3FydCh6KSwgYW5kIHBpbzJfaGkrcGlvMl9sbz1waS8yOworICoJdGhlbiBmb3IgeD4wLjk4CisgKgkJYXNpbih4KSA9IHBpLzIgLSAyKihzK3MqeipSKHopKQorICoJCQk9IHBpbzJfaGkgLSAoMioocytzKnoqUih6KSkgLSBwaW8yX2xvKQorICoJRm9yIHg8PTAuOTgsIGxldCBwaW80X2hpID0gcGlvMl9oaS8yLCB0aGVuCisgKgkJZiA9IGhpIHBhcnQgb2YgczsKKyAqCQljID0gc3FydCh6KSAtIGYgPSAoei1mKmYpLyhzK2YpIAkuLi5mK2M9c3FydCh6KQorICoJYW5kCisgKgkJYXNpbih4KSA9IHBpLzIgLSAyKihzK3MqeipSKHopKQorICoJCQk9IHBpbzRfaGkrKHBpbzQtMnMpLSgycyp6KlIoeiktcGlvMl9sbykKKyAqCQkJPSBwaW80X2hpKyhwaW80LTJmKS0oMnMqeipSKHopLShwaW8yX2xvKzJjKSkKKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICoJaWYgeCBpcyBOYU4sIHJldHVybiB4IGl0c2VsZjsKKyAqCWlmIHx4fD4xLCByZXR1cm4gTmFOIHdpdGggaW52YWxpZCBzaWduYWwuCisgKgorICovCisKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQorb25lID0gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwLCAvKiAweDNGRjAwMDAwLCAweDAwMDAwMDAwICovCitodWdlID0gIDEuMDAwZSszMDAsCitwaW8yX2hpID0gIDEuNTcwNzk2MzI2Nzk0ODk2NTU4MDBlKzAwLCAvKiAweDNGRjkyMUZCLCAweDU0NDQyRDE4ICovCitwaW8yX2xvID0gIDYuMTIzMjMzOTk1NzM2NzY2MDM1ODdlLTE3LCAvKiAweDNDOTFBNjI2LCAweDMzMTQ1QzA3ICovCitwaW80X2hpID0gIDcuODUzOTgxNjMzOTc0NDgyNzg5OTllLTAxLCAvKiAweDNGRTkyMUZCLCAweDU0NDQyRDE4ICovCisJLyogY29lZmZpY2llbnQgZm9yIFIoeF4yKSAqLworcFMwID0gIDEuNjY2NjY2NjY2NjY2NjY2NTc0MTVlLTAxLCAvKiAweDNGQzU1NTU1LCAweDU1NTU1NTU1ICovCitwUzEgPSAtMy4yNTU2NTgxODYyMjQwMDkxNTQwNWUtMDEsIC8qIDB4QkZENEQ2MTIsIDB4MDNFQjZGN0QgKi8KK3BTMiA9ICAyLjAxMjEyNTMyMTM0ODYyOTI1ODgxZS0wMSwgLyogMHgzRkM5QzE1NSwgMHgwRTg4NDQ1NSAqLworcFMzID0gLTQuMDA1NTUzNDUwMDY3OTQxMTQwMjdlLTAyLCAvKiAweEJGQTQ4MjI4LCAweEI1Njg4RjNCICovCitwUzQgPSAgNy45MTUzNDk5NDI4OTgxNDUzMjE3NmUtMDQsIC8qIDB4M0Y0OUVGRTAsIDB4NzUwMUIyODggKi8KK3BTNSA9ICAzLjQ3OTMzMTA3NTk2MDIxMTY3NTcwZS0wNSwgLyogMHgzRjAyM0RFMSwgMHgwREZERjcwOSAqLworcVMxID0gLTIuNDAzMzk0OTExNzM0NDE0MjE4NzhlKzAwLCAvKiAweEMwMDMzQTI3LCAweDFDOEEyRDRCICovCitxUzIgPSAgMi4wMjA5NDU3NjAyMzM1MDU2OTQ3MWUrMDAsIC8qIDB4NDAwMDJBRTUsIDB4OUM1OThBQzggKi8KK3FTMyA9IC02Ljg4MjgzOTcxNjA1NDUzMjkzMDMwZS0wMSwgLyogMHhCRkU2MDY2QywgMHgxQjhEMDE1OSAqLworcVM0ID0gIDcuNzAzODE1MDU1NTkwMTkzNTI3OTFlLTAyOyAvKiAweDNGQjNCOEM1LCAweEIxMkU5MjgyICovCisKK2RvdWJsZQorX19pZWVlNzU0X2FzaW4oZG91YmxlIHgpCit7CisJZG91YmxlIHQ9MC4wLHcscCxxLGMscixzOworCWludDMyX3QgaHgsaXg7CisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PSAweDNmZjAwMDAwKSB7CQkvKiB8eHw+PSAxICovCisJICAgIHVfaW50MzJfdCBseDsKKwkgICAgR0VUX0xPV19XT1JEKGx4LHgpOworCSAgICBpZigoKGl4LTB4M2ZmMDAwMDApfGx4KT09MCkKKwkJICAgIC8qIGFzaW4oMSk9Ky1waS8yIHdpdGggaW5leGFjdCAqLworCQlyZXR1cm4geCpwaW8yX2hpK3gqcGlvMl9sbzsJCisJICAgIHJldHVybiAoeC14KS8oeC14KTsJCS8qIGFzaW4ofHh8PjEpIGlzIE5hTiAqLyAgIAorCX0gZWxzZSBpZiAoaXg8MHgzZmUwMDAwMCkgewkvKiB8eHw8MC41ICovCisJICAgIGlmKGl4PDB4M2U0MDAwMDApIHsJCS8qIGlmIHx4fCA8IDIqKi0yNyAqLworCQlpZihodWdlK3g+b25lKSByZXR1cm4geDsvKiByZXR1cm4geCB3aXRoIGluZXhhY3QgaWYgeCE9MCovCisJICAgIH0gZWxzZSAKKwkJdCA9IHgqeDsKKwkJcCA9IHQqKHBTMCt0KihwUzErdCoocFMyK3QqKHBTMyt0KihwUzQrdCpwUzUpKSkpKTsKKwkJcSA9IG9uZSt0KihxUzErdCoocVMyK3QqKHFTMyt0KnFTNCkpKTsKKwkJdyA9IHAvcTsKKwkJcmV0dXJuIHgreCp3OworCX0KKwkvKiAxPiB8eHw+PSAwLjUgKi8KKwl3ID0gb25lLWZhYnMoeCk7CisJdCA9IHcqMC41OworCXAgPSB0KihwUzArdCoocFMxK3QqKHBTMit0KihwUzMrdCoocFM0K3QqcFM1KSkpKSk7CisJcSA9IG9uZSt0KihxUzErdCoocVMyK3QqKHFTMyt0KnFTNCkpKTsKKwlzID0gc3FydCh0KTsKKwlpZihpeD49MHgzRkVGMzMzMykgeyAJLyogaWYgfHh8ID4gMC45NzUgKi8KKwkgICAgdyA9IHAvcTsKKwkgICAgdCA9IHBpbzJfaGktKDIuMCoocytzKncpLXBpbzJfbG8pOworCX0gZWxzZSB7CisJICAgIHcgID0gczsKKwkgICAgU0VUX0xPV19XT1JEKHcsMCk7CisJICAgIGMgID0gKHQtdyp3KS8ocyt3KTsKKwkgICAgciAgPSBwL3E7CisJICAgIHAgID0gMi4wKnMqci0ocGlvMl9sby0yLjAqYyk7CisJICAgIHEgID0gcGlvNF9oaS0yLjAqdzsKKwkgICAgdCAgPSBwaW80X2hpLShwLXEpOworCX0gICAgCisJaWYoaHg+MCkgcmV0dXJuIHQ7IGVsc2UgcmV0dXJuIC10OyAgICAKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfYXNpbmYuYyBiL2xpYm0vc3JjL2VfYXNpbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDA1ZmFmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9hc2luZi5jCkBAIC0wLDAgKzEsODQgQEAKKy8qIGVfYXNpbmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfYXNpbi5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9hc2luZi5jLHYgMS45IDIwMDUvMTIvMDQgMTM6NTI6NDYgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK29uZSA9ICAxLjAwMDAwMDAwMDBlKzAwLCAvKiAweDNGODAwMDAwICovCitodWdlID0gIDEuMDAwZSszMCwKK3BpbzJfaGkgPSAgMS41NzA3OTYyNTEzZSswMCwgLyogMHgzZmM5MGZkYSAqLworcGlvMl9sbyA9ICA3LjU0OTc4OTQxNTllLTA4LCAvKiAweDMzYTIyMTY4ICovCitwaW80X2hpID0gIDcuODUzOTgxMjU2NWUtMDEsIC8qIDB4M2Y0OTBmZGEgKi8KKwkvKiBjb2VmZmljaWVudCBmb3IgUih4XjIpICovCitwUzAgPSAgMS42NjY2NjY3MTYzZS0wMSwgLyogMHgzZTJhYWFhYiAqLworcFMxID0gLTMuMjU1NjU4MTQ5N2UtMDEsIC8qIDB4YmVhNmIwOTAgKi8KK3BTMiA9ICAyLjAxMjEyNTI1MzdlLTAxLCAvKiAweDNlNGUwYWE4ICovCitwUzMgPSAtNC4wMDU1NTM1NzM0ZS0wMiwgLyogMHhiZDI0MTE0NiAqLworcFM0ID0gIDcuOTE1MzUwMTQyOWUtMDQsIC8qIDB4M2E0ZjdmMDQgKi8KK3BTNSA9ICAzLjQ3OTMzMDkxNjllLTA1LCAvKiAweDM4MTFlZjA4ICovCitxUzEgPSAtMi40MDMzOTQ5Mzc1ZSswMCwgLyogMHhjMDE5ZDEzOSAqLworcVMyID0gIDIuMDIwOTQ1Nzg3NGUrMDAsIC8qIDB4NDAwMTU3MmQgKi8KK3FTMyA9IC02Ljg4MjgzOTc5ODllLTAxLCAvKiAweGJmMzAzMzYxICovCitxUzQgPSAgNy43MDM4MTU0MDA2ZS0wMjsgLyogMHgzZDlkYzYyZSAqLworCitmbG9hdAorX19pZWVlNzU0X2FzaW5mKGZsb2F0IHgpCit7CisJZmxvYXQgdD0wLjAsdyxwLHEsYyxyLHM7CisJaW50MzJfdCBoeCxpeDsKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg9PTB4M2Y4MDAwMDApIHsKKwkJLyogYXNpbigxKT0rLXBpLzIgd2l0aCBpbmV4YWN0ICovCisJICAgIHJldHVybiB4KnBpbzJfaGkreCpwaW8yX2xvOworCX0gZWxzZSBpZihpeD4gMHgzZjgwMDAwMCkgewkvKiB8eHw+PSAxICovCisJICAgIHJldHVybiAoeC14KS8oeC14KTsJCS8qIGFzaW4ofHh8PjEpIGlzIE5hTiAqLworCX0gZWxzZSBpZiAoaXg8MHgzZjAwMDAwMCkgewkvKiB8eHw8MC41ICovCisJICAgIGlmKGl4PDB4MzIwMDAwMDApIHsJCS8qIGlmIHx4fCA8IDIqKi0yNyAqLworCQlpZihodWdlK3g+b25lKSByZXR1cm4geDsvKiByZXR1cm4geCB3aXRoIGluZXhhY3QgaWYgeCE9MCovCisJICAgIH0gZWxzZQorCQl0ID0geCp4OworCQlwID0gdCoocFMwK3QqKHBTMSt0KihwUzIrdCoocFMzK3QqKHBTNCt0KnBTNSkpKSkpOworCQlxID0gb25lK3QqKHFTMSt0KihxUzIrdCoocVMzK3QqcVM0KSkpOworCQl3ID0gcC9xOworCQlyZXR1cm4geCt4Knc7CisJfQorCS8qIDE+IHx4fD49IDAuNSAqLworCXcgPSBvbmUtZmFic2YoeCk7CisJdCA9IHcqKGZsb2F0KTAuNTsKKwlwID0gdCoocFMwK3QqKHBTMSt0KihwUzIrdCoocFMzK3QqKHBTNCt0KnBTNSkpKSkpOworCXEgPSBvbmUrdCoocVMxK3QqKHFTMit0KihxUzMrdCpxUzQpKSk7CisJcyA9IF9faWVlZTc1NF9zcXJ0Zih0KTsKKwlpZihpeD49MHgzRjc5OTk5QSkgeyAJLyogaWYgfHh8ID4gMC45NzUgKi8KKwkgICAgdyA9IHAvcTsKKwkgICAgdCA9IHBpbzJfaGktKChmbG9hdCkyLjAqKHMrcyp3KS1waW8yX2xvKTsKKwl9IGVsc2UgeworCSAgICBpbnQzMl90IGl3OworCSAgICB3ICA9IHM7CisJICAgIEdFVF9GTE9BVF9XT1JEKGl3LHcpOworCSAgICBTRVRfRkxPQVRfV09SRCh3LGl3JjB4ZmZmZmYwMDApOworCSAgICBjICA9ICh0LXcqdykvKHMrdyk7CisJICAgIHIgID0gcC9xOworCSAgICBwICA9IChmbG9hdCkyLjAqcypyLShwaW8yX2xvLShmbG9hdCkyLjAqYyk7CisJICAgIHEgID0gcGlvNF9oaS0oZmxvYXQpMi4wKnc7CisJICAgIHQgID0gcGlvNF9oaS0ocC1xKTsKKwl9CisJaWYoaHg+MCkgcmV0dXJuIHQ7IGVsc2UgcmV0dXJuIC10OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9hdGFuMi5jIGIvbGlibS9zcmMvZV9hdGFuMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3M2Y4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2F0YW4yLmMKQEAgLTAsMCArMSwxMjQgQEAKKworLyogQCgjKWVfYXRhbjIuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfYXRhbjIuYyx2IDEuMTAgMjAwNS8wMi8wNCAxODoyNjowNSBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9hdGFuMih5LHgpCisgKiBNZXRob2QgOgorICoJMS4gUmVkdWNlIHkgdG8gcG9zaXRpdmUgYnkgYXRhbjIoeSx4KT0tYXRhbjIoLXkseCkuCisgKgkyLiBSZWR1Y2UgeCB0byBwb3NpdGl2ZSBieSAoaWYgeCBhbmQgeSBhcmUgdW5leGNlcHRpb25hbCk6IAorICoJCUFSRyAoeCtpeSkgPSBhcmN0YW4oeS94KSAgIAkgICAuLi4gaWYgeCA+IDAsCisgKgkJQVJHICh4K2l5KSA9IHBpIC0gYXJjdGFuW3kvKC14KV0gICAuLi4gaWYgeCA8IDAsCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqCisgKglBVEFOMigoYW55dGhpbmcpLCBOYU4gKSBpcyBOYU47CisgKglBVEFOMihOQU4gLCAoYW55dGhpbmcpICkgaXMgTmFOOworICoJQVRBTjIoKy0wLCArKGFueXRoaW5nIGJ1dCBOYU4pKSBpcyArLTAgIDsKKyAqCUFUQU4yKCstMCwgLShhbnl0aGluZyBidXQgTmFOKSkgaXMgKy1waSA7CisgKglBVEFOMigrLShhbnl0aGluZyBidXQgMCBhbmQgTmFOKSwgMCkgaXMgKy1waS8yOworICoJQVRBTjIoKy0oYW55dGhpbmcgYnV0IElORiBhbmQgTmFOKSwgK0lORikgaXMgKy0wIDsKKyAqCUFUQU4yKCstKGFueXRoaW5nIGJ1dCBJTkYgYW5kIE5hTiksIC1JTkYpIGlzICstcGk7CisgKglBVEFOMigrLUlORiwrSU5GICkgaXMgKy1waS80IDsKKyAqCUFUQU4yKCstSU5GLC1JTkYgKSBpcyArLTNwaS80OworICoJQVRBTjIoKy1JTkYsIChhbnl0aGluZyBidXQsMCxOYU4sIGFuZCBJTkYpKSBpcyArLXBpLzI7CisgKgorICogQ29uc3RhbnRzOgorICogVGhlIGhleGFkZWNpbWFsIHZhbHVlcyBhcmUgdGhlIGludGVuZGVkIG9uZXMgZm9yIHRoZSBmb2xsb3dpbmcgCisgKiBjb25zdGFudHMuIFRoZSBkZWNpbWFsIHZhbHVlcyBtYXkgYmUgdXNlZCwgcHJvdmlkZWQgdGhhdCB0aGUgCisgKiBjb21waWxlciB3aWxsIGNvbnZlcnQgZnJvbSBkZWNpbWFsIHRvIGJpbmFyeSBhY2N1cmF0ZWx5IGVub3VnaCAKKyAqIHRvIHByb2R1Y2UgdGhlIGhleGFkZWNpbWFsIHZhbHVlcyBzaG93bi4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlCit0aW55ICA9IDEuMGUtMzAwLAoremVybyAgPSAwLjAsCitwaV9vXzQgID0gNy44NTM5ODE2MzM5NzQ0ODI3OTAwRS0wMSwgLyogMHgzRkU5MjFGQiwgMHg1NDQ0MkQxOCAqLworcGlfb18yICA9IDEuNTcwNzk2MzI2Nzk0ODk2NTU4MEUrMDAsIC8qIDB4M0ZGOTIxRkIsIDB4NTQ0NDJEMTggKi8KK3BpICAgICAgPSAzLjE0MTU5MjY1MzU4OTc5MzExNjBFKzAwLCAvKiAweDQwMDkyMUZCLCAweDU0NDQyRDE4ICovCitwaV9sbyAgID0gMS4yMjQ2NDY3OTkxNDczNTMxNzcyRS0xNjsgLyogMHgzQ0ExQTYyNiwgMHgzMzE0NUMwNyAqLworCitkb3VibGUKK19faWVlZTc1NF9hdGFuMihkb3VibGUgeSwgZG91YmxlIHgpCit7CisJZG91YmxlIHo7CisJaW50MzJfdCBrLG0saHgsaHksaXgsaXk7CisJdV9pbnQzMl90IGx4LGx5OworCisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJRVhUUkFDVF9XT1JEUyhoeSxseSx5KTsKKwlpeSA9IGh5JjB4N2ZmZmZmZmY7CisJaWYoKChpeHwoKGx4fC1seCk+PjMxKSk+MHg3ZmYwMDAwMCl8fAorCSAgICgoaXl8KChseXwtbHkpPj4zMSkpPjB4N2ZmMDAwMDApKQkvKiB4IG9yIHkgaXMgTmFOICovCisJICAgcmV0dXJuIHgreTsKKwlpZigoaHgtMHgzZmYwMDAwMHxseCk9PTApIHJldHVybiBhdGFuKHkpOyAgIC8qIHg9MS4wICovCisJbSA9ICgoaHk+PjMxKSYxKXwoKGh4Pj4zMCkmMik7CS8qIDIqc2lnbih4KStzaWduKHkpICovCisKKyAgICAvKiB3aGVuIHkgPSAwICovCisJaWYoKGl5fGx5KT09MCkgeworCSAgICBzd2l0Y2gobSkgeworCQljYXNlIDA6IAorCQljYXNlIDE6IHJldHVybiB5OyAJLyogYXRhbigrLTAsK2FueXRoaW5nKT0rLTAgKi8KKwkJY2FzZSAyOiByZXR1cm4gIHBpK3Rpbnk7LyogYXRhbigrMCwtYW55dGhpbmcpID0gcGkgKi8KKwkJY2FzZSAzOiByZXR1cm4gLXBpLXRpbnk7LyogYXRhbigtMCwtYW55dGhpbmcpID0tcGkgKi8KKwkgICAgfQorCX0KKyAgICAvKiB3aGVuIHggPSAwICovCisJaWYoKGl4fGx4KT09MCkgcmV0dXJuIChoeTwwKT8gIC1waV9vXzItdGlueTogcGlfb18yK3Rpbnk7CisJICAgIAorICAgIC8qIHdoZW4geCBpcyBJTkYgKi8KKwlpZihpeD09MHg3ZmYwMDAwMCkgeworCSAgICBpZihpeT09MHg3ZmYwMDAwMCkgeworCQlzd2l0Y2gobSkgeworCQkgICAgY2FzZSAwOiByZXR1cm4gIHBpX29fNCt0aW55Oy8qIGF0YW4oK0lORiwrSU5GKSAqLworCQkgICAgY2FzZSAxOiByZXR1cm4gLXBpX29fNC10aW55Oy8qIGF0YW4oLUlORiwrSU5GKSAqLworCQkgICAgY2FzZSAyOiByZXR1cm4gIDMuMCpwaV9vXzQrdGlueTsvKmF0YW4oK0lORiwtSU5GKSovCisJCSAgICBjYXNlIDM6IHJldHVybiAtMy4wKnBpX29fNC10aW55Oy8qYXRhbigtSU5GLC1JTkYpKi8KKwkJfQorCSAgICB9IGVsc2UgeworCQlzd2l0Y2gobSkgeworCQkgICAgY2FzZSAwOiByZXR1cm4gIHplcm8gIDsJLyogYXRhbigrLi4uLCtJTkYpICovCisJCSAgICBjYXNlIDE6IHJldHVybiAtemVybyAgOwkvKiBhdGFuKC0uLi4sK0lORikgKi8KKwkJICAgIGNhc2UgMjogcmV0dXJuICBwaSt0aW55ICA7CS8qIGF0YW4oKy4uLiwtSU5GKSAqLworCQkgICAgY2FzZSAzOiByZXR1cm4gLXBpLXRpbnkgIDsJLyogYXRhbigtLi4uLC1JTkYpICovCisJCX0KKwkgICAgfQorCX0KKyAgICAvKiB3aGVuIHkgaXMgSU5GICovCisJaWYoaXk9PTB4N2ZmMDAwMDApIHJldHVybiAoaHk8MCk/IC1waV9vXzItdGlueTogcGlfb18yK3Rpbnk7CisKKyAgICAvKiBjb21wdXRlIHkveCAqLworCWsgPSAoaXktaXgpPj4yMDsKKwlpZihrID4gNjApIHo9cGlfb18yKzAuNSpwaV9sbzsgCS8qIHx5L3h8ID4gIDIqKjYwICovCisJZWxzZSBpZihoeDwwJiZrPC02MCkgej0wLjA7IAkvKiB8eXwveCA8IC0yKio2MCAqLworCWVsc2Ugej1hdGFuKGZhYnMoeS94KSk7CQkvKiBzYWZlIHRvIGRvIHkveCAqLworCXN3aXRjaCAobSkgeworCSAgICBjYXNlIDA6IHJldHVybiAgICAgICB6ICA7CS8qIGF0YW4oKywrKSAqLworCSAgICBjYXNlIDE6IHsKKwkgICAgCSAgICAgIHVfaW50MzJfdCB6aDsKKwkJICAgICAgR0VUX0hJR0hfV09SRCh6aCx6KTsKKwkJICAgICAgU0VUX0hJR0hfV09SRCh6LHpoIF4gMHg4MDAwMDAwMCk7CisJCSAgICB9CisJCSAgICByZXR1cm4gICAgICAgeiAgOwkvKiBhdGFuKC0sKykgKi8KKwkgICAgY2FzZSAyOiByZXR1cm4gIHBpLSh6LXBpX2xvKTsvKiBhdGFuKCssLSkgKi8KKwkgICAgZGVmYXVsdDogLyogY2FzZSAzICovCisJICAgIAkgICAgcmV0dXJuICAoei1waV9sbyktcGk7LyogYXRhbigtLC0pICovCisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9hdGFuMmYuYyBiL2xpYm0vc3JjL2VfYXRhbjJmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY2ZDVkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfYXRhbjJmLmMKQEAgLTAsMCArMSw5NyBAQAorLyogZV9hdGFuMmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfYXRhbjIuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfYXRhbjJmLmMsdiAxLjcgMjAwNC8wNi8wMiAxNzowOTowNSBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdAordGlueSAgPSAxLjBlLTMwLAoremVybyAgPSAwLjAsCitwaV9vXzQgID0gNy44NTM5ODE4NTI1ZS0wMSwgLyogMHgzZjQ5MGZkYiAqLworcGlfb18yICA9IDEuNTcwNzk2MzcwNWUrMDAsIC8qIDB4M2ZjOTBmZGIgKi8KK3BpICAgICAgPSAzLjE0MTU5Mjc0MTBlKzAwLCAvKiAweDQwNDkwZmRiICovCitwaV9sbyAgID0gLTguNzQyMjc3NjU3M2UtMDg7IC8qIDB4YjNiYmJkMmUgKi8KKworZmxvYXQKK19faWVlZTc1NF9hdGFuMmYoZmxvYXQgeSwgZmxvYXQgeCkKK3sKKwlmbG9hdCB6OworCWludDMyX3QgayxtLGh4LGh5LGl4LGl5OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCUdFVF9GTE9BVF9XT1JEKGh5LHkpOworCWl5ID0gaHkmMHg3ZmZmZmZmZjsKKwlpZigoaXg+MHg3ZjgwMDAwMCl8fAorCSAgIChpeT4weDdmODAwMDAwKSkJLyogeCBvciB5IGlzIE5hTiAqLworCSAgIHJldHVybiB4K3k7CisJaWYoaHg9PTB4M2Y4MDAwMDApIHJldHVybiBhdGFuZih5KTsgICAvKiB4PTEuMCAqLworCW0gPSAoKGh5Pj4zMSkmMSl8KChoeD4+MzApJjIpOwkvKiAyKnNpZ24oeCkrc2lnbih5KSAqLworCisgICAgLyogd2hlbiB5ID0gMCAqLworCWlmKGl5PT0wKSB7CisJICAgIHN3aXRjaChtKSB7CisJCWNhc2UgMDoKKwkJY2FzZSAxOiByZXR1cm4geTsgCS8qIGF0YW4oKy0wLCthbnl0aGluZyk9Ky0wICovCisJCWNhc2UgMjogcmV0dXJuICBwaSt0aW55Oy8qIGF0YW4oKzAsLWFueXRoaW5nKSA9IHBpICovCisJCWNhc2UgMzogcmV0dXJuIC1waS10aW55Oy8qIGF0YW4oLTAsLWFueXRoaW5nKSA9LXBpICovCisJICAgIH0KKwl9CisgICAgLyogd2hlbiB4ID0gMCAqLworCWlmKGl4PT0wKSByZXR1cm4gKGh5PDApPyAgLXBpX29fMi10aW55OiBwaV9vXzIrdGlueTsKKworICAgIC8qIHdoZW4geCBpcyBJTkYgKi8KKwlpZihpeD09MHg3ZjgwMDAwMCkgeworCSAgICBpZihpeT09MHg3ZjgwMDAwMCkgeworCQlzd2l0Y2gobSkgeworCQkgICAgY2FzZSAwOiByZXR1cm4gIHBpX29fNCt0aW55Oy8qIGF0YW4oK0lORiwrSU5GKSAqLworCQkgICAgY2FzZSAxOiByZXR1cm4gLXBpX29fNC10aW55Oy8qIGF0YW4oLUlORiwrSU5GKSAqLworCQkgICAgY2FzZSAyOiByZXR1cm4gIChmbG9hdCkzLjAqcGlfb180K3Rpbnk7LyphdGFuKCtJTkYsLUlORikqLworCQkgICAgY2FzZSAzOiByZXR1cm4gKGZsb2F0KS0zLjAqcGlfb180LXRpbnk7LyphdGFuKC1JTkYsLUlORikqLworCQl9CisJICAgIH0gZWxzZSB7CisJCXN3aXRjaChtKSB7CisJCSAgICBjYXNlIDA6IHJldHVybiAgemVybyAgOwkvKiBhdGFuKCsuLi4sK0lORikgKi8KKwkJICAgIGNhc2UgMTogcmV0dXJuIC16ZXJvICA7CS8qIGF0YW4oLS4uLiwrSU5GKSAqLworCQkgICAgY2FzZSAyOiByZXR1cm4gIHBpK3RpbnkgIDsJLyogYXRhbigrLi4uLC1JTkYpICovCisJCSAgICBjYXNlIDM6IHJldHVybiAtcGktdGlueSAgOwkvKiBhdGFuKC0uLi4sLUlORikgKi8KKwkJfQorCSAgICB9CisJfQorICAgIC8qIHdoZW4geSBpcyBJTkYgKi8KKwlpZihpeT09MHg3ZjgwMDAwMCkgcmV0dXJuIChoeTwwKT8gLXBpX29fMi10aW55OiBwaV9vXzIrdGlueTsKKworICAgIC8qIGNvbXB1dGUgeS94ICovCisJayA9IChpeS1peCk+PjIzOworCWlmKGsgPiA2MCkgej1waV9vXzIrKGZsb2F0KTAuNSpwaV9sbzsgCS8qIHx5L3h8ID4gIDIqKjYwICovCisJZWxzZSBpZihoeDwwJiZrPC02MCkgej0wLjA7IAkvKiB8eXwveCA8IC0yKio2MCAqLworCWVsc2Ugej1hdGFuZihmYWJzZih5L3gpKTsJLyogc2FmZSB0byBkbyB5L3ggKi8KKwlzd2l0Y2ggKG0pIHsKKwkgICAgY2FzZSAwOiByZXR1cm4gICAgICAgeiAgOwkvKiBhdGFuKCssKykgKi8KKwkgICAgY2FzZSAxOiB7CisJICAgIAkgICAgICB1X2ludDMyX3Qgemg7CisJCSAgICAgIEdFVF9GTE9BVF9XT1JEKHpoLHopOworCQkgICAgICBTRVRfRkxPQVRfV09SRCh6LHpoIF4gMHg4MDAwMDAwMCk7CisJCSAgICB9CisJCSAgICByZXR1cm4gICAgICAgeiAgOwkvKiBhdGFuKC0sKykgKi8KKwkgICAgY2FzZSAyOiByZXR1cm4gIHBpLSh6LXBpX2xvKTsvKiBhdGFuKCssLSkgKi8KKwkgICAgZGVmYXVsdDogLyogY2FzZSAzICovCisJICAgIAkgICAgcmV0dXJuICAoei1waV9sbyktcGk7LyogYXRhbigtLC0pICovCisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9hdGFuaC5jIGIvbGlibS9zcmMvZV9hdGFuaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNDg3NWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2F0YW5oLmMKQEAgLTAsMCArMSw2MyBAQAorCisvKiBAKCMpZV9hdGFuaC5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9hdGFuaC5jLHYgMS43IDIwMDUvMDIvMDQgMTg6MjY6MDUgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfYXRhbmgoeCkKKyAqIE1ldGhvZCA6CisgKiAgICAxLlJlZHVjZWQgeCB0byBwb3NpdGl2ZSBieSBhdGFuaCgteCkgPSAtYXRhbmgoeCkKKyAqICAgIDIuRm9yIHg+PTAuNQorICogICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAyeCAgICAgICAgICAgICAgICAgICAgICAgICAgeAorICoJYXRhbmgoeCkgPSAtLS0gKiBsb2coMSArIC0tLS0tLS0pID0gMC41ICogbG9nMXAoMiAqIC0tLS0tLS0tKQorICogICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgIDEgLSB4ICAgICAgICAgICAgICAgICAgICAgIDEgLSB4CisgKgkKKyAqIAlGb3IgeDwwLjUKKyAqCWF0YW5oKHgpID0gMC41KmxvZzFwKDJ4KzJ4KngvKDEteCkpCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqCWF0YW5oKHgpIGlzIE5hTiBpZiB8eHwgPiAxIHdpdGggc2lnbmFsOworICoJYXRhbmgoTmFOKSBpcyB0aGF0IE5hTiB3aXRoIG5vIHNpZ25hbDsKKyAqCWF0YW5oKCstMSkgaXMgKy1JTkYgd2l0aCBzaWduYWwuCisgKgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUgb25lID0gMS4wLCBodWdlID0gMWUzMDA7CitzdGF0aWMgY29uc3QgZG91YmxlIHplcm8gPSAwLjA7CisKK2RvdWJsZQorX19pZWVlNzU0X2F0YW5oKGRvdWJsZSB4KQoreworCWRvdWJsZSB0OworCWludDMyX3QgaHgsaXg7CisJdV9pbnQzMl90IGx4OworCUVYVFJBQ1RfV09SRFMoaHgsbHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmICgoaXh8KChseHwoLWx4KSk+PjMxKSk+MHgzZmYwMDAwMCkgLyogfHh8PjEgKi8KKwkgICAgcmV0dXJuICh4LXgpLyh4LXgpOworCWlmKGl4PT0weDNmZjAwMDAwKSAKKwkgICAgcmV0dXJuIHgvemVybzsKKwlpZihpeDwweDNlMzAwMDAwJiYoaHVnZSt4KT56ZXJvKSByZXR1cm4geDsJLyogeDwyKiotMjggKi8KKwlTRVRfSElHSF9XT1JEKHgsaXgpOworCWlmKGl4PDB4M2ZlMDAwMDApIHsJCS8qIHggPCAwLjUgKi8KKwkgICAgdCA9IHgreDsKKwkgICAgdCA9IDAuNSpsb2cxcCh0K3QqeC8ob25lLXgpKTsKKwl9IGVsc2UgCisJICAgIHQgPSAwLjUqbG9nMXAoKHgreCkvKG9uZS14KSk7CisJaWYoaHg+PTApIHJldHVybiB0OyBlbHNlIHJldHVybiAtdDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfYXRhbmhmLmMgYi9saWJtL3NyYy9lX2F0YW5oZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZWJkM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2F0YW5oZi5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qIGVfYXRhbmhmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2F0YW5oLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2F0YW5oZi5jLHYgMS42IDIwMDIvMDUvMjggMTc6MDM6MTIgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQgb25lID0gMS4wLCBodWdlID0gMWUzMDsKKworc3RhdGljIGNvbnN0IGZsb2F0IHplcm8gPSAwLjA7CisKK2Zsb2F0CitfX2llZWU3NTRfYXRhbmhmKGZsb2F0IHgpCit7CisJZmxvYXQgdDsKKwlpbnQzMl90IGh4LGl4OworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZiAoaXg+MHgzZjgwMDAwMCkgCQkvKiB8eHw+MSAqLworCSAgICByZXR1cm4gKHgteCkvKHgteCk7CisJaWYoaXg9PTB4M2Y4MDAwMDApCisJICAgIHJldHVybiB4L3plcm87CisJaWYoaXg8MHgzMTgwMDAwMCYmKGh1Z2UreCk+emVybykgcmV0dXJuIHg7CS8qIHg8MioqLTI4ICovCisJU0VUX0ZMT0FUX1dPUkQoeCxpeCk7CisJaWYoaXg8MHgzZjAwMDAwMCkgewkJLyogeCA8IDAuNSAqLworCSAgICB0ID0geCt4OworCSAgICB0ID0gKGZsb2F0KTAuNSpsb2cxcGYodCt0KngvKG9uZS14KSk7CisJfSBlbHNlCisJICAgIHQgPSAoZmxvYXQpMC41KmxvZzFwZigoeCt4KS8ob25lLXgpKTsKKwlpZihoeD49MCkgcmV0dXJuIHQ7IGVsc2UgcmV0dXJuIC10OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9jb3NoLmMgYi9saWJtL3NyYy9lX2Nvc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGE5NDNhCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9jb3NoLmMKQEAgLTAsMCArMSw4NiBAQAorCisvKiBAKCMpZV9jb3NoLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfY29zaC5jLHYgMS44IDIwMDUvMDIvMDQgMTg6MjY6MDUgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfY29zaCh4KQorICogTWV0aG9kIDogCisgKiBtYXRoZW1hdGljYWxseSBjb3NoKHgpIGlmIGRlZmluZWQgdG8gYmUgKGV4cCh4KStleHAoLXgpKS8yCisgKgkxLiBSZXBsYWNlIHggYnkgfHh8IChjb3NoKHgpID0gY29zaCgteCkpLiAKKyAqCTIuIAorICoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIGV4cCh4KSAtIDEgXV4yIAorICoJICAgIDAgICAgICAgIDw9IHggPD0gbG4yLzIgIDogIGNvc2goeCkgOj0gMSArIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCQkJICAgICAgIAkJCSAgICAgICAgICAgMipleHAoeCkKKyAqCisgKgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cCh4KSArICAxL2V4cCh4KQorICoJICAgIGxuMi8yICAgIDw9IHggPD0gMjIgICAgIDogIGNvc2goeCkgOj0gLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJCQkgICAgICAgCQkJICAgICAgICAgIDIKKyAqCSAgICAyMiAgICAgICA8PSB4IDw9IGxub3ZmdCA6ICBjb3NoKHgpIDo9IGV4cCh4KS8yIAorICoJICAgIGxub3ZmdCAgIDw9IHggPD0gbG4yb3ZmdDogIGNvc2goeCkgOj0gZXhwKHgvMikvMiAqIGV4cCh4LzIpCisgKgkgICAgbG4yb3ZmdCAgPCAgeAkgICAgOiAgY29zaCh4KSA6PSBodWdlKmh1Z2UgKG92ZXJmbG93KQorICoKKyAqIFNwZWNpYWwgY2FzZXM6CisgKgljb3NoKHgpIGlzIHx4fCBpZiB4IGlzICtJTkYsIC1JTkYsIG9yIE5hTi4KKyAqCW9ubHkgY29zaCgwKT0xIGlzIGV4YWN0IGZvciBmaW5pdGUgeC4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlIG9uZSA9IDEuMCwgaGFsZj0wLjUsIGh1Z2UgPSAxLjBlMzAwOworCitkb3VibGUKK19faWVlZTc1NF9jb3NoKGRvdWJsZSB4KQoreworCWRvdWJsZSB0LHc7CisJaW50MzJfdCBpeDsKKwl1X2ludDMyX3QgbHg7CisKKyAgICAvKiBIaWdoIHdvcmQgb2YgfHh8LiAqLworCUdFVF9ISUdIX1dPUkQoaXgseCk7CisJaXggJj0gMHg3ZmZmZmZmZjsKKworICAgIC8qIHggaXMgSU5GIG9yIE5hTiAqLworCWlmKGl4Pj0weDdmZjAwMDAwKSByZXR1cm4geCp4OwkKKworICAgIC8qIHx4fCBpbiBbMCwwLjUqbG4yXSwgcmV0dXJuIDErZXhwbTEofHh8KV4yLygyKmV4cCh8eHwpKSAqLworCWlmKGl4PDB4M2ZkNjJlNDMpIHsKKwkgICAgdCA9IGV4cG0xKGZhYnMoeCkpOworCSAgICB3ID0gb25lK3Q7CisJICAgIGlmIChpeDwweDNjODAwMDAwKSByZXR1cm4gdzsJLyogY29zaCh0aW55KSA9IDEgKi8KKwkgICAgcmV0dXJuIG9uZSsodCp0KS8odyt3KTsKKwl9CisKKyAgICAvKiB8eHwgaW4gWzAuNSpsbjIsMjJdLCByZXR1cm4gKGV4cCh8eHwpKzEvZXhwKHx4fCkvMjsgKi8KKwlpZiAoaXggPCAweDQwMzYwMDAwKSB7CisJCXQgPSBfX2llZWU3NTRfZXhwKGZhYnMoeCkpOworCQlyZXR1cm4gaGFsZip0K2hhbGYvdDsKKwl9CisKKyAgICAvKiB8eHwgaW4gWzIyLCBsb2cobWF4ZG91YmxlKV0gcmV0dXJuIGhhbGYqZXhwKHx4fCkgKi8KKwlpZiAoaXggPCAweDQwODYyRTQyKSAgcmV0dXJuIGhhbGYqX19pZWVlNzU0X2V4cChmYWJzKHgpKTsKKworICAgIC8qIHx4fCBpbiBbbG9nKG1heGRvdWJsZSksIG92ZXJmbG93dGhyZXNvbGRdICovCisJR0VUX0xPV19XT1JEKGx4LHgpOworCWlmIChpeDwweDQwODYzM0NFIHx8CisJICAgICAgKChpeD09MHg0MDg2MzNjZSkmJihseDw9KHVfaW50MzJfdCkweDhmYjlmODdkKSkpIHsKKwkgICAgdyA9IF9faWVlZTc1NF9leHAoaGFsZipmYWJzKHgpKTsKKwkgICAgdCA9IGhhbGYqdzsKKwkgICAgcmV0dXJuIHQqdzsKKwl9CisKKyAgICAvKiB8eHwgPiBvdmVyZmxvd3RocmVzb2xkLCBjb3NoKHgpIG92ZXJmbG93ICovCisJcmV0dXJuIGh1Z2UqaHVnZTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfY29zaGYuYyBiL2xpYm0vc3JjL2VfY29zaGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWRmOWIwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9jb3NoZi5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qIGVfY29zaGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfY29zaC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9jb3NoZi5jLHYgMS43IDIwMDUvMTEvMTMgMDA6MDg6MjMgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQgb25lID0gMS4wLCBoYWxmPTAuNSwgaHVnZSA9IDEuMGUzMDsKKworZmxvYXQKK19faWVlZTc1NF9jb3NoZihmbG9hdCB4KQoreworCWZsb2F0IHQsdzsKKwlpbnQzMl90IGl4OworCisJR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJaXggJj0gMHg3ZmZmZmZmZjsKKworICAgIC8qIHggaXMgSU5GIG9yIE5hTiAqLworCWlmKGl4Pj0weDdmODAwMDAwKSByZXR1cm4geCp4OworCisgICAgLyogfHh8IGluIFswLDAuNSpsbjJdLCByZXR1cm4gMStleHBtMSh8eHwpXjIvKDIqZXhwKHx4fCkpICovCisJaWYoaXg8MHgzZWIxNzIxOCkgeworCSAgICB0ID0gZXhwbTFmKGZhYnNmKHgpKTsKKwkgICAgdyA9IG9uZSt0OworCSAgICBpZiAoaXg8MHgzOTgwMDAwMCkgcmV0dXJuIG9uZTsJLyogY29zaCh0aW55KSA9IDEgKi8KKwkgICAgcmV0dXJuIG9uZSsodCp0KS8odyt3KTsKKwl9CisKKyAgICAvKiB8eHwgaW4gWzAuNSpsbjIsOV0sIHJldHVybiAoZXhwKHx4fCkrMS9leHAofHh8KSkvMjsgKi8KKwlpZiAoaXggPCAweDQxMTAwMDAwKSB7CisJCXQgPSBfX2llZWU3NTRfZXhwZihmYWJzZih4KSk7CisJCXJldHVybiBoYWxmKnQraGFsZi90OworCX0KKworICAgIC8qIHx4fCBpbiBbOSwgbG9nKG1heGZsb2F0KV0gcmV0dXJuIGhhbGYqZXhwKHx4fCkgKi8KKwlpZiAoaXggPCAweDQyYjE3MjE3KSAgcmV0dXJuIGhhbGYqX19pZWVlNzU0X2V4cGYoZmFic2YoeCkpOworCisgICAgLyogfHh8IGluIFtsb2cobWF4ZmxvYXQpLCBvdmVyZmxvd3RocmVzb2xkXSAqLworCWlmIChpeDw9MHg0MmIyZDRmYykgeworCSAgICB3ID0gX19pZWVlNzU0X2V4cGYoaGFsZipmYWJzZih4KSk7CisJICAgIHQgPSBoYWxmKnc7CisJICAgIHJldHVybiB0Knc7CisJfQorCisgICAgLyogfHh8ID4gb3ZlcmZsb3d0aHJlc29sZCwgY29zaCh4KSBvdmVyZmxvdyAqLworCXJldHVybiBodWdlKmh1Z2U7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2V4cC5jIGIvbGlibS9zcmMvZV9leHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjYxODk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9leHAuYwpAQCAtMCwwICsxLDE1OSBAQAorCisvKiBAKCMpZV9leHAuYyAxLjYgMDQvMDQvMjIgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2V4cC5jLHYgMS4xMCAyMDA1LzAyLzA0IDE4OjI2OjA1IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X2V4cCh4KQorICogUmV0dXJucyB0aGUgZXhwb25lbnRpYWwgb2YgeC4KKyAqCisgKiBNZXRob2QKKyAqICAgMS4gQXJndW1lbnQgcmVkdWN0aW9uOgorICogICAgICBSZWR1Y2UgeCB0byBhbiByIHNvIHRoYXQgfHJ8IDw9IDAuNSpsbjIgfiAwLjM0NjU4LgorICoJR2l2ZW4geCwgZmluZCByIGFuZCBpbnRlZ2VyIGsgc3VjaCB0aGF0CisgKgorICogICAgICAgICAgICAgICB4ID0gaypsbjIgKyByLCAgfHJ8IDw9IDAuNSpsbjIuICAKKyAqCisgKiAgICAgIEhlcmUgciB3aWxsIGJlIHJlcHJlc2VudGVkIGFzIHIgPSBoaS1sbyBmb3IgYmV0dGVyIAorICoJYWNjdXJhY3kuCisgKgorICogICAyLiBBcHByb3hpbWF0aW9uIG9mIGV4cChyKSBieSBhIHNwZWNpYWwgcmF0aW9uYWwgZnVuY3Rpb24gb24KKyAqCXRoZSBpbnRlcnZhbCBbMCwwLjM0NjU4XToKKyAqCVdyaXRlCisgKgkgICAgUihyKioyKSA9IHIqKGV4cChyKSsxKS8oZXhwKHIpLTEpID0gMiArIHIqci82IC0gcioqNC8zNjAgKyAuLi4KKyAqICAgICAgV2UgdXNlIGEgc3BlY2lhbCBSZW1lcyBhbGdvcml0aG0gb24gWzAsMC4zNDY1OF0gdG8gZ2VuZXJhdGUgCisgKiAJYSBwb2x5bm9taWFsIG9mIGRlZ3JlZSA1IHRvIGFwcHJveGltYXRlIFIuIFRoZSBtYXhpbXVtIGVycm9yIAorICoJb2YgdGhpcyBwb2x5bm9taWFsIGFwcHJveGltYXRpb24gaXMgYm91bmRlZCBieSAyKiotNTkuIEluCisgKglvdGhlciB3b3JkcywKKyAqCSAgICBSKHopIH4gMi4wICsgUDEqeiArIFAyKnoqKjIgKyBQMyp6KiozICsgUDQqeioqNCArIFA1KnoqKjUKKyAqICAJKHdoZXJlIHo9cipyLCBhbmQgdGhlIHZhbHVlcyBvZiBQMSB0byBQNSBhcmUgbGlzdGVkIGJlbG93KQorICoJYW5kCisgKgkgICAgfCAgICAgICAgICAgICAgICAgIDUgICAgICAgICAgfCAgICAgLTU5CisgKgkgICAgfCAyLjArUDEqeisuLi4rUDUqeiAgIC0gIFIoeikgfCA8PSAyIAorICoJICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqCVRoZSBjb21wdXRhdGlvbiBvZiBleHAocikgdGh1cyBiZWNvbWVzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMipyCisgKgkJZXhwKHIpID0gMSArIC0tLS0tLS0KKyAqCQkgICAgICAgICAgICAgIFIgLSByCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIqUjEocikJCisgKgkJICAgICAgID0gMSArIHIgKyAtLS0tLS0tLS0tLSAoZm9yIGJldHRlciBhY2N1cmFjeSkKKyAqCQkgICAgICAgICAgICAgICAgICAyIC0gUjEocikKKyAqCXdoZXJlCisgKgkJCSAgICAgICAgIDIgICAgICAgNCAgICAgICAgICAgICAxMAorICoJCVIxKHIpID0gciAtIChQMSpyICArIFAyKnIgICsgLi4uICsgUDUqciAgICkuCisgKgkKKyAqICAgMy4gU2NhbGUgYmFjayB0byBvYnRhaW4gZXhwKHgpOgorICoJRnJvbSBzdGVwIDEsIHdlIGhhdmUKKyAqCSAgIGV4cCh4KSA9IDJeayAqIGV4cChyKQorICoKKyAqIFNwZWNpYWwgY2FzZXM6CisgKglleHAoSU5GKSBpcyBJTkYsIGV4cChOYU4pIGlzIE5hTjsKKyAqCWV4cCgtSU5GKSBpcyAwLCBhbmQKKyAqCWZvciBmaW5pdGUgYXJndW1lbnQsIG9ubHkgZXhwKDApPTEgaXMgZXhhY3QuCisgKgorICogQWNjdXJhY3k6CisgKglhY2NvcmRpbmcgdG8gYW4gZXJyb3IgYW5hbHlzaXMsIHRoZSBlcnJvciBpcyBhbHdheXMgbGVzcyB0aGFuCisgKgkxIHVscCAodW5pdCBpbiB0aGUgbGFzdCBwbGFjZSkuCisgKgorICogTWlzYy4gaW5mby4KKyAqCUZvciBJRUVFIGRvdWJsZSAKKyAqCSAgICBpZiB4ID4gIDcuMDk3ODI3MTI4OTMzODM5NzMwOTZlKzAyIHRoZW4gZXhwKHgpIG92ZXJmbG93CisgKgkgICAgaWYgeCA8IC03LjQ1MTMzMjE5MTAxOTQxMTA4NDIwZSswMiB0aGVuIGV4cCh4KSB1bmRlcmZsb3cKKyAqCisgKiBDb25zdGFudHM6CisgKiBUaGUgaGV4YWRlY2ltYWwgdmFsdWVzIGFyZSB0aGUgaW50ZW5kZWQgb25lcyBmb3IgdGhlIGZvbGxvd2luZyAKKyAqIGNvbnN0YW50cy4gVGhlIGRlY2ltYWwgdmFsdWVzIG1heSBiZSB1c2VkLCBwcm92aWRlZCB0aGF0IHRoZSAKKyAqIGNvbXBpbGVyIHdpbGwgY29udmVydCBmcm9tIGRlY2ltYWwgdG8gYmluYXJ5IGFjY3VyYXRlbHkgZW5vdWdoCisgKiB0byBwcm9kdWNlIHRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgc2hvd24uCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQorb25lCT0gMS4wLAoraGFsRlsyXQk9IHswLjUsLTAuNSx9LAoraHVnZQk9IDEuMGUrMzAwLAordHdvbTEwMDA9IDkuMzMyNjM2MTg1MDMyMTg4Nzg5OTBlLTMwMiwgICAgIC8qIDIqKi0xMDAwPTB4MDE3MDAwMDAsMCovCitvX3RocmVzaG9sZD0gIDcuMDk3ODI3MTI4OTMzODM5NzMwOTZlKzAyLCAgLyogMHg0MDg2MkU0MiwgMHhGRUZBMzlFRiAqLwordV90aHJlc2hvbGQ9IC03LjQ1MTMzMjE5MTAxOTQxMTA4NDIwZSswMiwgIC8qIDB4YzA4NzQ5MTAsIDB4RDUyRDMwNTEgKi8KK2xuMkhJWzJdICAgPXsgNi45MzE0NzE4MDM2OTEyMzgxNjQ5MGUtMDEsICAvKiAweDNmZTYyZTQyLCAweGZlZTAwMDAwICovCisJICAgICAtNi45MzE0NzE4MDM2OTEyMzgxNjQ5MGUtMDEsfSwvKiAweGJmZTYyZTQyLCAweGZlZTAwMDAwICovCitsbjJMT1syXSAgID17IDEuOTA4MjE0OTI5MjcwNTg3NzAwMDJlLTEwLCAgLyogMHgzZGVhMzllZiwgMHgzNTc5M2M3NiAqLworCSAgICAgLTEuOTA4MjE0OTI5MjcwNTg3NzAwMDJlLTEwLH0sLyogMHhiZGVhMzllZiwgMHgzNTc5M2M3NiAqLworaW52bG4yID0gIDEuNDQyNjk1MDQwODg4OTYzMzg3MDBlKzAwLCAvKiAweDNmZjcxNTQ3LCAweDY1MmI4MmZlICovCitQMSAgID0gIDEuNjY2NjY2NjY2NjY2NjYwMTkwMzdlLTAxLCAvKiAweDNGQzU1NTU1LCAweDU1NTU1NTNFICovCitQMiAgID0gLTIuNzc3Nzc3Nzc3NzAxNTU5MzM4NDJlLTAzLCAvKiAweEJGNjZDMTZDLCAweDE2QkVCRDkzICovCitQMyAgID0gIDYuNjEzNzU2MzIxNDM3OTM0MzYxMTdlLTA1LCAvKiAweDNGMTE1NjZBLCAweEFGMjVERTJDICovCitQNCAgID0gLTEuNjUzMzkwMjIwNTQ2NTI1MTUzOTBlLTA2LCAvKiAweEJFQkJCRDQxLCAweEM1RDI2QkYxICovCitQNSAgID0gIDQuMTM4MTM2Nzk3MDU3MjM4NDYwMzllLTA4OyAvKiAweDNFNjYzNzY5LCAweDcyQkVBNEQwICovCisKKworZG91YmxlCitfX2llZWU3NTRfZXhwKGRvdWJsZSB4KQkvKiBkZWZhdWx0IElFRUUgZG91YmxlIGV4cCAqLworeworCWRvdWJsZSB5LGhpPTAuMCxsbz0wLjAsYyx0OworCWludDMyX3Qgaz0wLHhzYjsKKwl1X2ludDMyX3QgaHg7CisKKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCXhzYiA9IChoeD4+MzEpJjE7CQkvKiBzaWduIGJpdCBvZiB4ICovCisJaHggJj0gMHg3ZmZmZmZmZjsJCS8qIGhpZ2ggd29yZCBvZiB8eHwgKi8KKworICAgIC8qIGZpbHRlciBvdXQgbm9uLWZpbml0ZSBhcmd1bWVudCAqLworCWlmKGh4ID49IDB4NDA4NjJFNDIpIHsJCQkvKiBpZiB8eHw+PTcwOS43OC4uLiAqLworICAgICAgICAgICAgaWYoaHg+PTB4N2ZmMDAwMDApIHsKKwkgICAgICAgIHVfaW50MzJfdCBseDsKKwkJR0VUX0xPV19XT1JEKGx4LHgpOworCQlpZigoKGh4JjB4ZmZmZmYpfGx4KSE9MCkKKwkJICAgICByZXR1cm4geCt4OyAJCS8qIE5hTiAqLworCQllbHNlIHJldHVybiAoeHNiPT0wKT8geDowLjA7CS8qIGV4cCgrLWluZik9e2luZiwwfSAqLworCSAgICB9CisJICAgIGlmKHggPiBvX3RocmVzaG9sZCkgcmV0dXJuIGh1Z2UqaHVnZTsgLyogb3ZlcmZsb3cgKi8KKwkgICAgaWYoeCA8IHVfdGhyZXNob2xkKSByZXR1cm4gdHdvbTEwMDAqdHdvbTEwMDA7IC8qIHVuZGVyZmxvdyAqLworCX0KKworICAgIC8qIGFyZ3VtZW50IHJlZHVjdGlvbiAqLworCWlmKGh4ID4gMHgzZmQ2MmU0MikgewkJLyogaWYgIHx4fCA+IDAuNSBsbjIgKi8gCisJICAgIGlmKGh4IDwgMHgzRkYwQTJCMikgewkvKiBhbmQgfHh8IDwgMS41IGxuMiAqLworCQloaSA9IHgtbG4ySElbeHNiXTsgbG89bG4yTE9beHNiXTsgayA9IDEteHNiLXhzYjsKKwkgICAgfSBlbHNlIHsKKwkJayAgPSAoaW50KShpbnZsbjIqeCtoYWxGW3hzYl0pOworCQl0ICA9IGs7CisJCWhpID0geCAtIHQqbG4ySElbMF07CS8qIHQqbG4ySEkgaXMgZXhhY3QgaGVyZSAqLworCQlsbyA9IHQqbG4yTE9bMF07CisJICAgIH0KKwkgICAgeCAgPSBoaSAtIGxvOworCX0gCisJZWxzZSBpZihoeCA8IDB4M2UzMDAwMDApICB7CS8qIHdoZW4gfHh8PDIqKi0yOCAqLworCSAgICBpZihodWdlK3g+b25lKSByZXR1cm4gb25lK3g7LyogdHJpZ2dlciBpbmV4YWN0ICovCisJfQorCWVsc2UgayA9IDA7CisKKyAgICAvKiB4IGlzIG5vdyBpbiBwcmltYXJ5IHJhbmdlICovCisJdCAgPSB4Kng7CisJYyAgPSB4IC0gdCooUDErdCooUDIrdCooUDMrdCooUDQrdCpQNSkpKSk7CisJaWYoaz09MCkgCXJldHVybiBvbmUtKCh4KmMpLyhjLTIuMCkteCk7IAorCWVsc2UgCQl5ID0gb25lLSgobG8tKHgqYykvKDIuMC1jKSktaGkpOworCWlmKGsgPj0gLTEwMjEpIHsKKwkgICAgdV9pbnQzMl90IGh5OworCSAgICBHRVRfSElHSF9XT1JEKGh5LHkpOworCSAgICBTRVRfSElHSF9XT1JEKHksaHkrKGs8PDIwKSk7CS8qIGFkZCBrIHRvIHkncyBleHBvbmVudCAqLworCSAgICByZXR1cm4geTsKKwl9IGVsc2UgeworCSAgICB1X2ludDMyX3QgaHk7CisJICAgIEdFVF9ISUdIX1dPUkQoaHkseSk7CisJICAgIFNFVF9ISUdIX1dPUkQoeSxoeSsoKGsrMTAwMCk8PDIwKSk7CS8qIGFkZCBrIHRvIHkncyBleHBvbmVudCAqLworCSAgICByZXR1cm4geSp0d29tMTAwMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2V4cGYuYyBiL2xpYm0vc3JjL2VfZXhwZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMDY1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2V4cGYuYwpAQCAtMCwwICsxLDk1IEBACisvKiBlX2V4cGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfZXhwLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2V4cGYuYyx2IDEuMTAgMjAwNS8xMS8zMCAwNDo1Njo0OSBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdAorb25lCT0gMS4wLAoraGFsRlsyXQk9IHswLjUsLTAuNSx9LAoraHVnZQk9IDEuMGUrMzAsCit0d29tMTAwID0gNy44ODg2MDkwNTIyZS0zMSwgICAgICAvKiAyKiotMTAwPTB4MGQ4MDAwMDAgKi8KK29fdGhyZXNob2xkPSAgOC44NzIxNjc5Njg4ZSswMSwgIC8qIDB4NDJiMTcxODAgKi8KK3VfdGhyZXNob2xkPSAtMS4wMzk3MjA4NDA1ZSswMiwgIC8qIDB4YzJjZmYxYjUgKi8KK2xuMkhJWzJdICAgPXsgNi45MzE0NTc1MTk1ZS0wMSwJCS8qIDB4M2YzMTcyMDAgKi8KKwkgICAgIC02LjkzMTQ1NzUxOTVlLTAxLH0sCS8qIDB4YmYzMTcyMDAgKi8KK2xuMkxPWzJdICAgPXsgMS40Mjg2MDY3NjUzZS0wNiwgIAkvKiAweDM1YmZiZThlICovCisJICAgICAtMS40Mjg2MDY3NjUzZS0wNix9LAkvKiAweGI1YmZiZThlICovCitpbnZsbjIgPSAgMS40NDI2OTUwMjE2ZSswMCwgCQkvKiAweDNmYjhhYTNiICovCitQMSAgID0gIDEuNjY2NjY2NzE2M2UtMDEsIC8qIDB4M2UyYWFhYWIgKi8KK1AyICAgPSAtMi43Nzc3Nzc4NDUwZS0wMywgLyogMHhiYjM2MGI2MSAqLworUDMgICA9ICA2LjYxMzc1NTk3NzBlLTA1LCAvKiAweDM4OGFiMzU1ICovCitQNCAgID0gLTEuNjUzMzkwMTk5OWUtMDYsIC8qIDB4YjVkZGVhMGUgKi8KK1A1ICAgPSAgNC4xMzgxMzY5NDQyZS0wODsgLyogMHgzMzMxYmI0YyAqLworCitmbG9hdAorX19pZWVlNzU0X2V4cGYoZmxvYXQgeCkJLyogZGVmYXVsdCBJRUVFIGRvdWJsZSBleHAgKi8KK3sKKwlmbG9hdCB5LGhpPTAuMCxsbz0wLjAsYyx0OworCWludDMyX3Qgaz0wLHhzYjsKKwl1X2ludDMyX3QgaHg7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwl4c2IgPSAoaHg+PjMxKSYxOwkJLyogc2lnbiBiaXQgb2YgeCAqLworCWh4ICY9IDB4N2ZmZmZmZmY7CQkvKiBoaWdoIHdvcmQgb2YgfHh8ICovCisKKyAgICAvKiBmaWx0ZXIgb3V0IG5vbi1maW5pdGUgYXJndW1lbnQgKi8KKwlpZihoeCA+PSAweDQyYjE3MjE4KSB7CQkJLyogaWYgfHh8Pj04OC43MjEuLi4gKi8KKwkgICAgaWYoaHg+MHg3ZjgwMDAwMCkKKwkJIHJldHVybiB4K3g7CSAJCS8qIE5hTiAqLworICAgICAgICAgICAgaWYoaHg9PTB4N2Y4MDAwMDApCisJCXJldHVybiAoeHNiPT0wKT8geDowLjA7CQkvKiBleHAoKy1pbmYpPXtpbmYsMH0gKi8KKwkgICAgaWYoeCA+IG9fdGhyZXNob2xkKSByZXR1cm4gaHVnZSpodWdlOyAvKiBvdmVyZmxvdyAqLworCSAgICBpZih4IDwgdV90aHJlc2hvbGQpIHJldHVybiB0d29tMTAwKnR3b20xMDA7IC8qIHVuZGVyZmxvdyAqLworCX0KKworICAgIC8qIGFyZ3VtZW50IHJlZHVjdGlvbiAqLworCWlmKGh4ID4gMHgzZWIxNzIxOCkgewkJLyogaWYgIHx4fCA+IDAuNSBsbjIgKi8KKwkgICAgaWYoaHggPCAweDNGODUxNTkyKSB7CS8qIGFuZCB8eHwgPCAxLjUgbG4yICovCisJCWhpID0geC1sbjJISVt4c2JdOyBsbz1sbjJMT1t4c2JdOyBrID0gMS14c2IteHNiOworCSAgICB9IGVsc2UgeworCQlrICA9IGludmxuMip4K2hhbEZbeHNiXTsKKwkJdCAgPSBrOworCQloaSA9IHggLSB0KmxuMkhJWzBdOwkvKiB0KmxuMkhJIGlzIGV4YWN0IGhlcmUgKi8KKwkJbG8gPSB0KmxuMkxPWzBdOworCSAgICB9CisJICAgIHggID0gaGkgLSBsbzsKKwl9CisJZWxzZSBpZihoeCA8IDB4MzE4MDAwMDApICB7CS8qIHdoZW4gfHh8PDIqKi0yOCAqLworCSAgICBpZihodWdlK3g+b25lKSByZXR1cm4gb25lK3g7LyogdHJpZ2dlciBpbmV4YWN0ICovCisJfQorCWVsc2UgayA9IDA7CisKKyAgICAvKiB4IGlzIG5vdyBpbiBwcmltYXJ5IHJhbmdlICovCisJdCAgPSB4Kng7CisJYyAgPSB4IC0gdCooUDErdCooUDIrdCooUDMrdCooUDQrdCpQNSkpKSk7CisJaWYoaz09MCkgCXJldHVybiBvbmUtKCh4KmMpLyhjLShmbG9hdCkyLjApLXgpOworCWVsc2UgCQl5ID0gb25lLSgobG8tKHgqYykvKChmbG9hdCkyLjAtYykpLWhpKTsKKwlpZihrID49IC0xMjUpIHsKKwkgICAgdV9pbnQzMl90IGh5OworCSAgICBHRVRfRkxPQVRfV09SRChoeSx5KTsKKwkgICAgU0VUX0ZMT0FUX1dPUkQoeSxoeSsoazw8MjMpKTsJLyogYWRkIGsgdG8geSdzIGV4cG9uZW50ICovCisJICAgIHJldHVybiB5OworCX0gZWxzZSB7CisJICAgIHVfaW50MzJfdCBoeTsKKwkgICAgR0VUX0ZMT0FUX1dPUkQoaHkseSk7CisJICAgIFNFVF9GTE9BVF9XT1JEKHksaHkrKChrKzEwMCk8PDIzKSk7CS8qIGFkZCBrIHRvIHkncyBleHBvbmVudCAqLworCSAgICByZXR1cm4geSp0d29tMTAwOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfZm1vZC5jIGIvbGlibS9zcmMvZV9mbW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzYzE2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfZm1vZC5jCkBAIC0wLDAgKzEsMTMzIEBACisKKy8qIEAoIyllX2Ztb2QuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9mbW9kLmMsdiAxLjkgMjAwNS8wMi8wNCAxODoyNjowNSBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIAorICogX19pZWVlNzU0X2Ztb2QoeCx5KQorICogUmV0dXJuIHggbW9kIHkgaW4gZXhhY3QgYXJpdGhtZXRpYworICogTWV0aG9kOiBzaGlmdCBhbmQgc3VidHJhY3QKKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlIG9uZSA9IDEuMCwgWmVyb1tdID0gezAuMCwgLTAuMCx9OworCitkb3VibGUKK19faWVlZTc1NF9mbW9kKGRvdWJsZSB4LCBkb3VibGUgeSkKK3sKKwlpbnQzMl90IG4saHgsaHksaHosaXgsaXksc3gsaTsKKwl1X2ludDMyX3QgbHgsbHksbHo7CisKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCUVYVFJBQ1RfV09SRFMoaHksbHkseSk7CisJc3ggPSBoeCYweDgwMDAwMDAwOwkJLyogc2lnbiBvZiB4ICovCisJaHggXj1zeDsJCS8qIHx4fCAqLworCWh5ICY9IDB4N2ZmZmZmZmY7CS8qIHx5fCAqLworCisgICAgLyogcHVyZ2Ugb2ZmIGV4Y2VwdGlvbiB2YWx1ZXMgKi8KKwlpZigoaHl8bHkpPT0wfHwoaHg+PTB4N2ZmMDAwMDApfHwJLyogeT0wLG9yIHggbm90IGZpbml0ZSAqLworCSAgKChoeXwoKGx5fC1seSk+PjMxKSk+MHg3ZmYwMDAwMCkpCS8qIG9yIHkgaXMgTmFOICovCisJICAgIHJldHVybiAoeCp5KS8oeCp5KTsKKwlpZihoeDw9aHkpIHsKKwkgICAgaWYoKGh4PGh5KXx8KGx4PGx5KSkgcmV0dXJuIHg7CS8qIHx4fDx8eXwgcmV0dXJuIHggKi8KKwkgICAgaWYobHg9PWx5KSAKKwkJcmV0dXJuIFplcm9bKHVfaW50MzJfdClzeD4+MzFdOwkvKiB8eHw9fHl8IHJldHVybiB4KjAqLworCX0KKworICAgIC8qIGRldGVybWluZSBpeCA9IGlsb2diKHgpICovCisJaWYoaHg8MHgwMDEwMDAwMCkgewkvKiBzdWJub3JtYWwgeCAqLworCSAgICBpZihoeD09MCkgeworCQlmb3IgKGl4ID0gLTEwNDMsIGk9bHg7IGk+MDsgaTw8PTEpIGl4IC09MTsKKwkgICAgfSBlbHNlIHsKKwkJZm9yIChpeCA9IC0xMDIyLGk9KGh4PDwxMSk7IGk+MDsgaTw8PTEpIGl4IC09MTsKKwkgICAgfQorCX0gZWxzZSBpeCA9IChoeD4+MjApLTEwMjM7CisKKyAgICAvKiBkZXRlcm1pbmUgaXkgPSBpbG9nYih5KSAqLworCWlmKGh5PDB4MDAxMDAwMDApIHsJLyogc3Vibm9ybWFsIHkgKi8KKwkgICAgaWYoaHk9PTApIHsKKwkJZm9yIChpeSA9IC0xMDQzLCBpPWx5OyBpPjA7IGk8PD0xKSBpeSAtPTE7CisJICAgIH0gZWxzZSB7CisJCWZvciAoaXkgPSAtMTAyMixpPShoeTw8MTEpOyBpPjA7IGk8PD0xKSBpeSAtPTE7CisJICAgIH0KKwl9IGVsc2UgaXkgPSAoaHk+PjIwKS0xMDIzOworCisgICAgLyogc2V0IHVwIHtoeCxseH0sIHtoeSxseX0gYW5kIGFsaWduIHkgdG8geCAqLworCWlmKGl4ID49IC0xMDIyKSAKKwkgICAgaHggPSAweDAwMTAwMDAwfCgweDAwMGZmZmZmJmh4KTsKKwllbHNlIHsJCS8qIHN1Ym5vcm1hbCB4LCBzaGlmdCB4IHRvIG5vcm1hbCAqLworCSAgICBuID0gLTEwMjItaXg7CisJICAgIGlmKG48PTMxKSB7CisJICAgICAgICBoeCA9IChoeDw8bil8KGx4Pj4oMzItbikpOworCSAgICAgICAgbHggPDw9IG47CisJICAgIH0gZWxzZSB7CisJCWh4ID0gbHg8PChuLTMyKTsKKwkJbHggPSAwOworCSAgICB9CisJfQorCWlmKGl5ID49IC0xMDIyKSAKKwkgICAgaHkgPSAweDAwMTAwMDAwfCgweDAwMGZmZmZmJmh5KTsKKwllbHNlIHsJCS8qIHN1Ym5vcm1hbCB5LCBzaGlmdCB5IHRvIG5vcm1hbCAqLworCSAgICBuID0gLTEwMjItaXk7CisJICAgIGlmKG48PTMxKSB7CisJICAgICAgICBoeSA9IChoeTw8bil8KGx5Pj4oMzItbikpOworCSAgICAgICAgbHkgPDw9IG47CisJICAgIH0gZWxzZSB7CisJCWh5ID0gbHk8PChuLTMyKTsKKwkJbHkgPSAwOworCSAgICB9CisJfQorCisgICAgLyogZml4IHBvaW50IGZtb2QgKi8KKwluID0gaXggLSBpeTsKKwl3aGlsZShuLS0pIHsKKwkgICAgaHo9aHgtaHk7bHo9bHgtbHk7IGlmKGx4PGx5KSBoeiAtPSAxOworCSAgICBpZihoejwwKXtoeCA9IGh4K2h4KyhseD4+MzEpOyBseCA9IGx4K2x4O30KKwkgICAgZWxzZSB7CisJICAgIAlpZigoaHp8bHopPT0wKSAJCS8qIHJldHVybiBzaWduKHgpKjAgKi8KKwkJICAgIHJldHVybiBaZXJvWyh1X2ludDMyX3Qpc3g+PjMxXTsKKwkgICAgCWh4ID0gaHoraHorKGx6Pj4zMSk7IGx4ID0gbHorbHo7CisJICAgIH0KKwl9CisJaHo9aHgtaHk7bHo9bHgtbHk7IGlmKGx4PGx5KSBoeiAtPSAxOworCWlmKGh6Pj0wKSB7aHg9aHo7bHg9bHo7fQorCisgICAgLyogY29udmVydCBiYWNrIHRvIGZsb2F0aW5nIHZhbHVlIGFuZCByZXN0b3JlIHRoZSBzaWduICovCisJaWYoKGh4fGx4KT09MCkgCQkJLyogcmV0dXJuIHNpZ24oeCkqMCAqLworCSAgICByZXR1cm4gWmVyb1sodV9pbnQzMl90KXN4Pj4zMV07CisJd2hpbGUoaHg8MHgwMDEwMDAwMCkgewkJLyogbm9ybWFsaXplIHggKi8KKwkgICAgaHggPSBoeCtoeCsobHg+PjMxKTsgbHggPSBseCtseDsKKwkgICAgaXkgLT0gMTsKKwl9CisJaWYoaXk+PSAtMTAyMikgewkvKiBub3JtYWxpemUgb3V0cHV0ICovCisJICAgIGh4ID0gKChoeC0weDAwMTAwMDAwKXwoKGl5KzEwMjMpPDwyMCkpOworCSAgICBJTlNFUlRfV09SRFMoeCxoeHxzeCxseCk7CisJfSBlbHNlIHsJCS8qIHN1Ym5vcm1hbCBvdXRwdXQgKi8KKwkgICAgbiA9IC0xMDIyIC0gaXk7CisJICAgIGlmKG48PTIwKSB7CisJCWx4ID0gKGx4Pj5uKXwoKHVfaW50MzJfdCloeDw8KDMyLW4pKTsKKwkJaHggPj49IG47CisJICAgIH0gZWxzZSBpZiAobjw9MzEpIHsKKwkJbHggPSAoaHg8PCgzMi1uKSl8KGx4Pj5uKTsgaHggPSBzeDsKKwkgICAgfSBlbHNlIHsKKwkJbHggPSBoeD4+KG4tMzIpOyBoeCA9IHN4OworCSAgICB9CisJICAgIElOU0VSVF9XT1JEUyh4LGh4fHN4LGx4KTsKKwkgICAgeCAqPSBvbmU7CQkvKiBjcmVhdGUgbmVjZXNzYXJ5IHNpZ25hbCAqLworCX0KKwlyZXR1cm4geDsJCS8qIGV4YWN0IG91dHB1dCAqLworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9mbW9kZi5jIGIvbGlibS9zcmMvZV9mbW9kZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNDg3YWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2Ztb2RmLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qIGVfZm1vZGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfZm1vZC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9mbW9kZi5jLHYgMS42IDIwMDIvMDUvMjggMTc6MDM6MTIgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogX19pZWVlNzU0X2Ztb2RmKHgseSkKKyAqIFJldHVybiB4IG1vZCB5IGluIGV4YWN0IGFyaXRobWV0aWMKKyAqIE1ldGhvZDogc2hpZnQgYW5kIHN1YnRyYWN0CisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0IG9uZSA9IDEuMCwgWmVyb1tdID0gezAuMCwgLTAuMCx9OworCitmbG9hdAorX19pZWVlNzU0X2Ztb2RmKGZsb2F0IHgsIGZsb2F0IHkpCit7CisJaW50MzJfdCBuLGh4LGh5LGh6LGl4LGl5LHN4LGk7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlHRVRfRkxPQVRfV09SRChoeSx5KTsKKwlzeCA9IGh4JjB4ODAwMDAwMDA7CQkvKiBzaWduIG9mIHggKi8KKwloeCBePXN4OwkJLyogfHh8ICovCisJaHkgJj0gMHg3ZmZmZmZmZjsJLyogfHl8ICovCisKKyAgICAvKiBwdXJnZSBvZmYgZXhjZXB0aW9uIHZhbHVlcyAqLworCWlmKGh5PT0wfHwoaHg+PTB4N2Y4MDAwMDApfHwJCS8qIHk9MCxvciB4IG5vdCBmaW5pdGUgKi8KKwkgICAoaHk+MHg3ZjgwMDAwMCkpCQkJLyogb3IgeSBpcyBOYU4gKi8KKwkgICAgcmV0dXJuICh4KnkpLyh4KnkpOworCWlmKGh4PGh5KSByZXR1cm4geDsJCQkvKiB8eHw8fHl8IHJldHVybiB4ICovCisJaWYoaHg9PWh5KQorCSAgICByZXR1cm4gWmVyb1sodV9pbnQzMl90KXN4Pj4zMV07CS8qIHx4fD18eXwgcmV0dXJuIHgqMCovCisKKyAgICAvKiBkZXRlcm1pbmUgaXggPSBpbG9nYih4KSAqLworCWlmKGh4PDB4MDA4MDAwMDApIHsJLyogc3Vibm9ybWFsIHggKi8KKwkgICAgZm9yIChpeCA9IC0xMjYsaT0oaHg8PDgpOyBpPjA7IGk8PD0xKSBpeCAtPTE7CisJfSBlbHNlIGl4ID0gKGh4Pj4yMyktMTI3OworCisgICAgLyogZGV0ZXJtaW5lIGl5ID0gaWxvZ2IoeSkgKi8KKwlpZihoeTwweDAwODAwMDAwKSB7CS8qIHN1Ym5vcm1hbCB5ICovCisJICAgIGZvciAoaXkgPSAtMTI2LGk9KGh5PDw4KTsgaT49MDsgaTw8PTEpIGl5IC09MTsKKwl9IGVsc2UgaXkgPSAoaHk+PjIzKS0xMjc7CisKKyAgICAvKiBzZXQgdXAge2h4LGx4fSwge2h5LGx5fSBhbmQgYWxpZ24geSB0byB4ICovCisJaWYoaXggPj0gLTEyNikKKwkgICAgaHggPSAweDAwODAwMDAwfCgweDAwN2ZmZmZmJmh4KTsKKwllbHNlIHsJCS8qIHN1Ym5vcm1hbCB4LCBzaGlmdCB4IHRvIG5vcm1hbCAqLworCSAgICBuID0gLTEyNi1peDsKKwkgICAgaHggPSBoeDw8bjsKKwl9CisJaWYoaXkgPj0gLTEyNikKKwkgICAgaHkgPSAweDAwODAwMDAwfCgweDAwN2ZmZmZmJmh5KTsKKwllbHNlIHsJCS8qIHN1Ym5vcm1hbCB5LCBzaGlmdCB5IHRvIG5vcm1hbCAqLworCSAgICBuID0gLTEyNi1peTsKKwkgICAgaHkgPSBoeTw8bjsKKwl9CisKKyAgICAvKiBmaXggcG9pbnQgZm1vZCAqLworCW4gPSBpeCAtIGl5OworCXdoaWxlKG4tLSkgeworCSAgICBoej1oeC1oeTsKKwkgICAgaWYoaHo8MCl7aHggPSBoeCtoeDt9CisJICAgIGVsc2UgeworCSAgICAJaWYoaHo9PTApIAkJLyogcmV0dXJuIHNpZ24oeCkqMCAqLworCQkgICAgcmV0dXJuIFplcm9bKHVfaW50MzJfdClzeD4+MzFdOworCSAgICAJaHggPSBoeitoejsKKwkgICAgfQorCX0KKwloej1oeC1oeTsKKwlpZihoej49MCkge2h4PWh6O30KKworICAgIC8qIGNvbnZlcnQgYmFjayB0byBmbG9hdGluZyB2YWx1ZSBhbmQgcmVzdG9yZSB0aGUgc2lnbiAqLworCWlmKGh4PT0wKSAJCQkvKiByZXR1cm4gc2lnbih4KSowICovCisJICAgIHJldHVybiBaZXJvWyh1X2ludDMyX3Qpc3g+PjMxXTsKKwl3aGlsZShoeDwweDAwODAwMDAwKSB7CQkvKiBub3JtYWxpemUgeCAqLworCSAgICBoeCA9IGh4K2h4OworCSAgICBpeSAtPSAxOworCX0KKwlpZihpeT49IC0xMjYpIHsJCS8qIG5vcm1hbGl6ZSBvdXRwdXQgKi8KKwkgICAgaHggPSAoKGh4LTB4MDA4MDAwMDApfCgoaXkrMTI3KTw8MjMpKTsKKwkgICAgU0VUX0ZMT0FUX1dPUkQoeCxoeHxzeCk7CisJfSBlbHNlIHsJCS8qIHN1Ym5vcm1hbCBvdXRwdXQgKi8KKwkgICAgbiA9IC0xMjYgLSBpeTsKKwkgICAgaHggPj49IG47CisJICAgIFNFVF9GTE9BVF9XT1JEKHgsaHh8c3gpOworCSAgICB4ICo9IG9uZTsJCS8qIGNyZWF0ZSBuZWNlc3Nhcnkgc2lnbmFsICovCisJfQorCXJldHVybiB4OwkJLyogZXhhY3Qgb3V0cHV0ICovCit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2dhbW1hLmMgYi9saWJtL3NyYy9lX2dhbW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUyZmYxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfZ2FtbWEuYwpAQCAtMCwwICsxLDM0IEBACisKKy8qIEAoIyllX2dhbW1hLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2dhbW1hLmMsdiAxLjcgMjAwNS8wMi8wNCAxODoyNjowNSBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9nYW1tYSh4KQorICogUmV0dXJuIHRoZSBsb2dhcml0aG0gb2YgdGhlIEdhbW1hIGZ1bmN0aW9uIG9mIHguCisgKgorICogTWV0aG9kOiBjYWxsIF9faWVlZTc1NF9nYW1tYV9yCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZXh0ZXJuIGludCBzaWduZ2FtOworCitkb3VibGUKK19faWVlZTc1NF9nYW1tYShkb3VibGUgeCkKK3sKKwlyZXR1cm4gX19pZWVlNzU0X2dhbW1hX3IoeCwmc2lnbmdhbSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2dhbW1hX3IuYyBiL2xpYm0vc3JjL2VfZ2FtbWFfci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlODMzOWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2dhbW1hX3IuYwpAQCAtMCwwICsxLDMzIEBACisKKy8qIEAoIyllX2dhbW1hX3IuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfZ2FtbWFfci5jLHYgMS43IDIwMDUvMDIvMDQgMTg6MjY6MDUgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfZ2FtbWFfcih4LCBzaWduZ2FtcCkKKyAqIFJlZW50cmFudCB2ZXJzaW9uIG9mIHRoZSBsb2dhcml0aG0gb2YgdGhlIEdhbW1hIGZ1bmN0aW9uIAorICogd2l0aCB1c2VyIHByb3ZpZGUgcG9pbnRlciBmb3IgdGhlIHNpZ24gb2YgR2FtbWEoeCkuIAorICoKKyAqIE1ldGhvZDogU2VlIF9faWVlZTc1NF9sZ2FtbWFfcgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2RvdWJsZQorX19pZWVlNzU0X2dhbW1hX3IoZG91YmxlIHgsIGludCAqc2lnbmdhbXApCit7CisJcmV0dXJuIF9faWVlZTc1NF9sZ2FtbWFfcih4LHNpZ25nYW1wKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfZ2FtbWFmLmMgYi9saWJtL3NyYy9lX2dhbW1hZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YzJlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2dhbW1hZi5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIGVfZ2FtbWFmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2dhbW1hLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2dhbW1hZi5jLHYgMS42IDIwMDIvMDUvMjggMTc6MDM6MTIgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfZ2FtbWFmKHgpCisgKiBSZXR1cm4gdGhlIGxvZ2FyaXRobSBvZiB0aGUgR2FtbWEgZnVuY3Rpb24gb2YgeC4KKyAqCisgKiBNZXRob2Q6IGNhbGwgX19pZWVlNzU0X2dhbW1hZl9yCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZXh0ZXJuIGludCBzaWduZ2FtOworCitmbG9hdAorX19pZWVlNzU0X2dhbW1hZihmbG9hdCB4KQoreworCXJldHVybiBfX2llZWU3NTRfZ2FtbWFmX3IoeCwmc2lnbmdhbSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2dhbW1hZl9yLmMgYi9saWJtL3NyYy9lX2dhbW1hZl9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzMDBjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfZ2FtbWFmX3IuYwpAQCAtMCwwICsxLDM0IEBACisvKiBlX2dhbW1hZl9yLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2dhbW1hX3IuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfZ2FtbWFmX3IuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjAzIGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X2dhbW1hZl9yKHgsIHNpZ25nYW1wKQorICogUmVlbnRyYW50IHZlcnNpb24gb2YgdGhlIGxvZ2FyaXRobSBvZiB0aGUgR2FtbWEgZnVuY3Rpb24KKyAqIHdpdGggdXNlciBwcm92aWRlIHBvaW50ZXIgZm9yIHRoZSBzaWduIG9mIEdhbW1hKHgpLgorICoKKyAqIE1ldGhvZDogU2VlIF9faWVlZTc1NF9sZ2FtbWFmX3IKKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitmbG9hdAorX19pZWVlNzU0X2dhbW1hZl9yKGZsb2F0IHgsIGludCAqc2lnbmdhbXApCit7CisJcmV0dXJuIF9faWVlZTc1NF9sZ2FtbWFmX3IoeCxzaWduZ2FtcCk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2h5cG90LmMgYi9saWJtL3NyYy9lX2h5cG90LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEzODVmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfaHlwb3QuYwpAQCAtMCwwICsxLDEyNSBAQAorCisvKiBAKCMpZV9oeXBvdC5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2h5cG90LmMsdiAxLjkgMjAwNS8wMi8wNCAxODoyNjowNSBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9oeXBvdCh4LHkpCisgKgorICogTWV0aG9kIDogICAgICAgICAgICAgICAgICAKKyAqCUlmIChhc3N1bWUgcm91bmQtdG8tbmVhcmVzdCkgej14KngreSp5IAorICoJaGFzIGVycm9yIGxlc3MgdGhhbiBzcXJ0KDIpLzIgdWxwLCB0aGFuIAorICoJc3FydCh6KSBoYXMgZXJyb3IgbGVzcyB0aGFuIDEgdWxwIChleGVyY2lzZSkuCisgKgorICoJU28sIGNvbXB1dGUgc3FydCh4KngreSp5KSB3aXRoIHNvbWUgY2FyZSBhcyAKKyAqCWZvbGxvd3MgdG8gZ2V0IHRoZSBlcnJvciBiZWxvdyAxIHVscDoKKyAqCisgKglBc3N1bWUgeD55PjA7CisgKgkoaWYgcG9zc2libGUsIHNldCByb3VuZGluZyB0byByb3VuZC10by1uZWFyZXN0KQorICoJMS4gaWYgeCA+IDJ5ICB1c2UKKyAqCQl4MSp4MSsoeSp5Kyh4MiooeCt4MSkpKSBmb3IgeCp4K3kqeQorICoJd2hlcmUgeDEgPSB4IHdpdGggbG93ZXIgMzIgYml0cyBjbGVhcmVkLCB4MiA9IHgteDE7IGVsc2UKKyAqCTIuIGlmIHggPD0gMnkgdXNlCisgKgkJdDEqeTErKCh4LXkpKih4LXkpKyh0MSp5Mit0Mip5KSkKKyAqCXdoZXJlIHQxID0gMnggd2l0aCBsb3dlciAzMiBiaXRzIGNsZWFyZWQsIHQyID0gMngtdDEsIAorICoJeTE9IHkgd2l0aCBsb3dlciAzMiBiaXRzIGNob3BwZWQsIHkyID0geS15MS4KKyAqCQkKKyAqCU5PVEU6IHNjYWxpbmcgbWF5IGJlIG5lY2Vzc2FyeSBpZiBzb21lIGFyZ3VtZW50IGlzIHRvbyAKKyAqCSAgICAgIGxhcmdlIG9yIHRvbyB0aW55CisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqCWh5cG90KHgseSkgaXMgSU5GIGlmIHggb3IgeSBpcyArSU5GIG9yIC1JTkY7IGVsc2UKKyAqCWh5cG90KHgseSkgaXMgTkFOIGlmIHggb3IgeSBpcyBOQU4uCisgKgorICogQWNjdXJhY3k6CisgKiAJaHlwb3QoeCx5KSByZXR1cm5zIHNxcnQoeF4yK3leMikgd2l0aCBlcnJvciBsZXNzIAorICogCXRoYW4gMSB1bHBzICh1bml0cyBpbiB0aGUgbGFzdCBwbGFjZSkgCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZG91YmxlCitfX2llZWU3NTRfaHlwb3QoZG91YmxlIHgsIGRvdWJsZSB5KQoreworCWRvdWJsZSBhPXgsYj15LHQxLHQyLHkxLHkyLHc7CisJaW50MzJfdCBqLGssaGEsaGI7CisKKwlHRVRfSElHSF9XT1JEKGhhLHgpOworCWhhICY9IDB4N2ZmZmZmZmY7CisJR0VUX0hJR0hfV09SRChoYix5KTsKKwloYiAmPSAweDdmZmZmZmZmOworCWlmKGhiID4gaGEpIHthPXk7Yj14O2o9aGE7IGhhPWhiO2hiPWo7fSBlbHNlIHthPXg7Yj15O30KKwlTRVRfSElHSF9XT1JEKGEsaGEpOwkvKiBhIDwtIHxhfCAqLworCVNFVF9ISUdIX1dPUkQoYixoYik7CS8qIGIgPC0gfGJ8ICovCisJaWYoKGhhLWhiKT4weDNjMDAwMDApIHtyZXR1cm4gYStiO30gLyogeC95ID4gMioqNjAgKi8KKwlrPTA7CisJaWYoaGEgPiAweDVmMzAwMDAwKSB7CS8qIGE+MioqNTAwICovCisJICAgaWYoaGEgPj0gMHg3ZmYwMDAwMCkgewkvKiBJbmYgb3IgTmFOICovCisJICAgICAgIHVfaW50MzJfdCBsb3c7CisJICAgICAgIHcgPSBhK2I7CQkJLyogZm9yIHNOYU4gKi8KKwkgICAgICAgR0VUX0xPV19XT1JEKGxvdyxhKTsKKwkgICAgICAgaWYoKChoYSYweGZmZmZmKXxsb3cpPT0wKSB3ID0gYTsKKwkgICAgICAgR0VUX0xPV19XT1JEKGxvdyxiKTsKKwkgICAgICAgaWYoKChoYl4weDdmZjAwMDAwKXxsb3cpPT0wKSB3ID0gYjsKKwkgICAgICAgcmV0dXJuIHc7CisJICAgfQorCSAgIC8qIHNjYWxlIGEgYW5kIGIgYnkgMioqLTYwMCAqLworCSAgIGhhIC09IDB4MjU4MDAwMDA7IGhiIC09IDB4MjU4MDAwMDA7CWsgKz0gNjAwOworCSAgIFNFVF9ISUdIX1dPUkQoYSxoYSk7CisJICAgU0VUX0hJR0hfV09SRChiLGhiKTsKKwl9CisJaWYoaGIgPCAweDIwYjAwMDAwKSB7CS8qIGIgPCAyKiotNTAwICovCisJICAgIGlmKGhiIDw9IDB4MDAwZmZmZmYpIHsJLyogc3Vibm9ybWFsIGIgb3IgMCAqLworCSAgICAgICAgdV9pbnQzMl90IGxvdzsKKwkJR0VUX0xPV19XT1JEKGxvdyxiKTsKKwkJaWYoKGhifGxvdyk9PTApIHJldHVybiBhOworCQl0MT0wOworCQlTRVRfSElHSF9XT1JEKHQxLDB4N2ZkMDAwMDApOwkvKiB0MT0yXjEwMjIgKi8KKwkJYiAqPSB0MTsKKwkJYSAqPSB0MTsKKwkJayAtPSAxMDIyOworCSAgICB9IGVsc2UgewkJLyogc2NhbGUgYSBhbmQgYiBieSAyXjYwMCAqLworCSAgICAgICAgaGEgKz0gMHgyNTgwMDAwMDsgCS8qIGEgKj0gMl42MDAgKi8KKwkJaGIgKz0gMHgyNTgwMDAwMDsJLyogYiAqPSAyXjYwMCAqLworCQlrIC09IDYwMDsKKwkJU0VUX0hJR0hfV09SRChhLGhhKTsKKwkJU0VUX0hJR0hfV09SRChiLGhiKTsKKwkgICAgfQorCX0KKyAgICAvKiBtZWRpdW0gc2l6ZSBhIGFuZCBiICovCisJdyA9IGEtYjsKKwlpZiAodz5iKSB7CisJICAgIHQxID0gMDsKKwkgICAgU0VUX0hJR0hfV09SRCh0MSxoYSk7CisJICAgIHQyID0gYS10MTsKKwkgICAgdyAgPSBzcXJ0KHQxKnQxLShiKigtYiktdDIqKGErdDEpKSk7CisJfSBlbHNlIHsKKwkgICAgYSAgPSBhK2E7CisJICAgIHkxID0gMDsKKwkgICAgU0VUX0hJR0hfV09SRCh5MSxoYik7CisJICAgIHkyID0gYiAtIHkxOworCSAgICB0MSA9IDA7CisJICAgIFNFVF9ISUdIX1dPUkQodDEsaGErMHgwMDEwMDAwMCk7CisJICAgIHQyID0gYSAtIHQxOworCSAgICB3ICA9IHNxcnQodDEqeTEtKHcqKC13KS0odDEqeTIrdDIqYikpKTsKKwl9CisJaWYoayE9MCkgeworCSAgICB1X2ludDMyX3QgaGlnaDsKKwkgICAgdDEgPSAxLjA7CisJICAgIEdFVF9ISUdIX1dPUkQoaGlnaCx0MSk7CisJICAgIFNFVF9ISUdIX1dPUkQodDEsaGlnaCsoazw8MjApKTsKKwkgICAgcmV0dXJuIHQxKnc7CisJfSBlbHNlIHJldHVybiB3OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9oeXBvdGYuYyBiL2xpYm0vc3JjL2VfaHlwb3RmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0MDc1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfaHlwb3RmLmMKQEAgLTAsMCArMSw4MyBAQAorLyogZV9oeXBvdGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfaHlwb3QuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfaHlwb3RmLmMsdiAxLjkgMjAwMi8wNS8yOCAxODoxNTowMyBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2Zsb2F0CitfX2llZWU3NTRfaHlwb3RmKGZsb2F0IHgsIGZsb2F0IHkpCit7CisJZmxvYXQgYT14LGI9eSx0MSx0Mix5MSx5Mix3OworCWludDMyX3QgaixrLGhhLGhiOworCisJR0VUX0ZMT0FUX1dPUkQoaGEseCk7CisJaGEgJj0gMHg3ZmZmZmZmZjsKKwlHRVRfRkxPQVRfV09SRChoYix5KTsKKwloYiAmPSAweDdmZmZmZmZmOworCWlmKGhiID4gaGEpIHthPXk7Yj14O2o9aGE7IGhhPWhiO2hiPWo7fSBlbHNlIHthPXg7Yj15O30KKwlTRVRfRkxPQVRfV09SRChhLGhhKTsJLyogYSA8LSB8YXwgKi8KKwlTRVRfRkxPQVRfV09SRChiLGhiKTsJLyogYiA8LSB8YnwgKi8KKwlpZigoaGEtaGIpPjB4ZjAwMDAwMCkge3JldHVybiBhK2I7fSAvKiB4L3kgPiAyKiozMCAqLworCWs9MDsKKwlpZihoYSA+IDB4NTg4MDAwMDApIHsJLyogYT4yKio1MCAqLworCSAgIGlmKGhhID49IDB4N2Y4MDAwMDApIHsJLyogSW5mIG9yIE5hTiAqLworCSAgICAgICB3ID0gYStiOwkJCS8qIGZvciBzTmFOICovCisJICAgICAgIGlmKGhhID09IDB4N2Y4MDAwMDApIHcgPSBhOworCSAgICAgICBpZihoYiA9PSAweDdmODAwMDAwKSB3ID0gYjsKKwkgICAgICAgcmV0dXJuIHc7CisJICAgfQorCSAgIC8qIHNjYWxlIGEgYW5kIGIgYnkgMioqLTY4ICovCisJICAgaGEgLT0gMHgyMjAwMDAwMDsgaGIgLT0gMHgyMjAwMDAwMDsJayArPSA2ODsKKwkgICBTRVRfRkxPQVRfV09SRChhLGhhKTsKKwkgICBTRVRfRkxPQVRfV09SRChiLGhiKTsKKwl9CisJaWYoaGIgPCAweDI2ODAwMDAwKSB7CS8qIGIgPCAyKiotNTAgKi8KKwkgICAgaWYoaGIgPD0gMHgwMDdmZmZmZikgewkvKiBzdWJub3JtYWwgYiBvciAwICovCisJICAgICAgICBpZihoYj09MCkgcmV0dXJuIGE7CisJCVNFVF9GTE9BVF9XT1JEKHQxLDB4N2U4MDAwMDApOwkvKiB0MT0yXjEyNiAqLworCQliICo9IHQxOworCQlhICo9IHQxOworCQlrIC09IDEyNjsKKwkgICAgfSBlbHNlIHsJCS8qIHNjYWxlIGEgYW5kIGIgYnkgMl42OCAqLworCSAgICAgICAgaGEgKz0gMHgyMjAwMDAwMDsgCS8qIGEgKj0gMl42OCAqLworCQloYiArPSAweDIyMDAwMDAwOwkvKiBiICo9IDJeNjggKi8KKwkJayAtPSA2ODsKKwkJU0VUX0ZMT0FUX1dPUkQoYSxoYSk7CisJCVNFVF9GTE9BVF9XT1JEKGIsaGIpOworCSAgICB9CisJfQorICAgIC8qIG1lZGl1bSBzaXplIGEgYW5kIGIgKi8KKwl3ID0gYS1iOworCWlmICh3PmIpIHsKKwkgICAgU0VUX0ZMT0FUX1dPUkQodDEsaGEmMHhmZmZmZjAwMCk7CisJICAgIHQyID0gYS10MTsKKwkgICAgdyAgPSBfX2llZWU3NTRfc3FydGYodDEqdDEtKGIqKC1iKS10MiooYSt0MSkpKTsKKwl9IGVsc2UgeworCSAgICBhICA9IGErYTsKKwkgICAgU0VUX0ZMT0FUX1dPUkQoeTEsaGImMHhmZmZmZjAwMCk7CisJICAgIHkyID0gYiAtIHkxOworCSAgICBTRVRfRkxPQVRfV09SRCh0MSxoYSsweDAwODAwMDAwKTsKKwkgICAgdDIgPSBhIC0gdDE7CisJICAgIHcgID0gX19pZWVlNzU0X3NxcnRmKHQxKnkxLSh3KigtdyktKHQxKnkyK3QyKmIpKSk7CisJfQorCWlmKGshPTApIHsKKwkgICAgU0VUX0ZMT0FUX1dPUkQodDEsMHgzZjgwMDAwMCsoazw8MjMpKTsKKwkgICAgcmV0dXJuIHQxKnc7CisJfSBlbHNlIHJldHVybiB3OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9qMC5jIGIvbGlibS9zcmMvZV9qMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OWJmMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2owLmMKQEAgLTAsMCArMSwzODIgQEAKKworLyogQCgjKWVfajAuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9qMC5jLHYgMS44IDIwMDUvMDIvMDQgMTg6MjY6MDUgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfajAoeCksIF9faWVlZTc1NF95MCh4KQorICogQmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGtpbmRzIG9mIG9yZGVyIHplcm8uCisgKiBNZXRob2QgLS0gajAoeCk6CisgKgkxLiBGb3IgdGlueSB4LCB3ZSB1c2UgajAoeCkgPSAxIC0geF4yLzQgKyB4XjQvNjQgLSAuLi4KKyAqCTIuIFJlZHVjZSB4IHRvIHx4fCBzaW5jZSBqMCh4KT1qMCgteCksICBhbmQKKyAqCSAgIGZvciB4IGluICgwLDIpCisgKgkJajAoeCkgPSAxLXovNCsgel4yKlIwL1MwLCAgd2hlcmUgeiA9IHgqeDsKKyAqCSAgIChwcmVjaXNpb246ICB8ajAtMSt6LzQtel4yUjAvUzAgfDwyKiotNjMuNjcgKQorICoJICAgZm9yIHggaW4gKDIsaW5mKQorICogCQlqMCh4KSA9IHNxcnQoMi8ocGkqeCkpKihwMCh4KSpjb3MoeDApLXEwKHgpKnNpbih4MCkpCisgKiAJICAgd2hlcmUgeDAgPSB4LXBpLzQuIEl0IGlzIGJldHRlciB0byBjb21wdXRlIHNpbih4MCksY29zKHgwKQorICoJICAgYXMgZm9sbG93OgorICoJCWNvcyh4MCkgPSBjb3MoeCljb3MocGkvNCkrc2luKHgpc2luKHBpLzQpCisgKgkJCT0gMS9zcXJ0KDIpICogKGNvcyh4KSArIHNpbih4KSkKKyAqCQlzaW4oeDApID0gc2luKHgpY29zKHBpLzQpLWNvcyh4KXNpbihwaS80KQorICoJCQk9IDEvc3FydCgyKSAqIChzaW4oeCkgLSBjb3MoeCkpCisgKiAJICAgKFRvIGF2b2lkIGNhbmNlbGxhdGlvbiwgdXNlCisgKgkJc2luKHgpICstIGNvcyh4KSA9IC1jb3MoMngpLyhzaW4oeCkgLSsgY29zKHgpKQorICogCSAgICB0byBjb21wdXRlIHRoZSB3b3JzZSBvbmUuKQorICoJICAgCisgKgkzIFNwZWNpYWwgY2FzZXMKKyAqCQlqMChuYW4pPSBuYW4KKyAqCQlqMCgwKSA9IDEKKyAqCQlqMChpbmYpID0gMAorICoJCQorICogTWV0aG9kIC0tIHkwKHgpOgorICoJMS4gRm9yIHg8Mi4KKyAqCSAgIFNpbmNlIAorICoJCXkwKHgpID0gMi9waSooajAoeCkqKGxuKHgvMikrRXVsZXIpICsgeF4yLzQgLSAuLi4pCisgKgkgICB0aGVyZWZvcmUgeTAoeCktMi9waSpqMCh4KSpsbih4KSBpcyBhbiBldmVuIGZ1bmN0aW9uLgorICoJICAgV2UgdXNlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdG8gYXBwcm94aW1hdGUgeTAsCisgKgkJeTAoeCkgPSBVKHopL1YoeikgKyAoMi9waSkqKGowKHgpKmxuKHgpKSwgej0geF4yCisgKgkgICB3aGVyZSAKKyAqCQlVKHopID0gdTAwICsgdTAxKnogKyAuLi4gKyB1MDYqel42CisgKgkJVih6KSA9IDEgICsgdjAxKnogKyAuLi4gKyB2MDQqel40CisgKgkgICB3aXRoIGFic29sdXRlIGFwcHJveGltYXRpb24gZXJyb3IgYm91bmRlZCBieSAyKiotNzIuCisgKgkgICBOb3RlOiBGb3IgdGlueSB4LCBVL1YgPSB1MCBhbmQgajAoeCl+MSwgaGVuY2UKKyAqCQl5MCh0aW55KSA9IHUwICsgKDIvcGkpKmxuKHRpbnkpLCAoY2hvb3NlIHRpbnk8MioqLTI3KQorICoJMi4gRm9yIHg+PTIuCisgKiAJCXkwKHgpID0gc3FydCgyLyhwaSp4KSkqKHAwKHgpKmNvcyh4MCkrcTAoeCkqc2luKHgwKSkKKyAqIAkgICB3aGVyZSB4MCA9IHgtcGkvNC4gSXQgaXMgYmV0dGVyIHRvIGNvbXB1dGUgc2luKHgwKSxjb3MoeDApCisgKgkgICBieSB0aGUgbWV0aG9kIG1lbnRpb25lZCBhYm92ZS4KKyAqCTMuIFNwZWNpYWwgY2FzZXM6IHkwKDApPS1pbmYsIHkwKHg8MCk9TmFOLCB5MChpbmYpPTAuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGRvdWJsZSBwemVybyhkb3VibGUpLCBxemVybyhkb3VibGUpOworCitzdGF0aWMgY29uc3QgZG91YmxlCitodWdlIAk9IDFlMzAwLAorb25lCT0gMS4wLAoraW52c3FydHBpPSAgNS42NDE4OTU4MzU0Nzc1NjI3OTI4MGUtMDEsIC8qIDB4M0ZFMjBERDcsIDB4NTA0MjlCNkQgKi8KK3RwaSAgICAgID0gIDYuMzY2MTk3NzIzNjc1ODEzODI0MzNlLTAxLCAvKiAweDNGRTQ1RjMwLCAweDZEQzlDODgzICovCisgCQkvKiBSMC9TMCBvbiBbMCwgMi4wMF0gKi8KK1IwMiAgPSAgMS41NjI0OTk5OTk5OTk5OTk0Nzk1OGUtMDIsIC8qIDB4M0Y4RkZGRkYsIDB4RkZGRkZGRkQgKi8KK1IwMyAgPSAtMS44OTk3OTI5NDIzODg1NDcyMTc1MWUtMDQsIC8qIDB4QkYyOEU2QTUsIDB4QjYxQUM2RTkgKi8KK1IwNCAgPSAgMS44Mjk1NDA0OTUzMjcwMDY2NTY3MGUtMDYsIC8qIDB4M0VCRUIxRDEsIDB4MEM1MDM5MTkgKi8KK1IwNSAgPSAtNC42MTgzMjY4ODUzMjEwMzE4OTE5OWUtMDksIC8qIDB4QkUzM0Q1RTcsIDB4NzNENjNGQ0UgKi8KK1MwMSAgPSAgMS41NjE5MTAyOTQ2NDg5MDAxMDQ5MmUtMDIsIC8qIDB4M0Y4RkZDRTgsIDB4ODJDOEMyQTQgKi8KK1MwMiAgPSAgMS4xNjkyNjc4NDY2MzMzNzQ1MDI2MGUtMDQsIC8qIDB4M0YxRUE2RDIsIDB4REQ1N0RCRjQgKi8KK1MwMyAgPSAgNS4xMzU0NjU1MDIwNzMxODExMTQ0NmUtMDcsIC8qIDB4M0VBMTNCNTQsIDB4Q0U4NEQ1QTkgKi8KK1MwNCAgPSAgMS4xNjYxNDAwMzMzMzc5MDAwMDIwNWUtMDk7IC8qIDB4M0UxNDA4QkMsIDB4RjQ3NDVEOEYgKi8KKworc3RhdGljIGNvbnN0IGRvdWJsZSB6ZXJvID0gMC4wOworCitkb3VibGUKK19faWVlZTc1NF9qMChkb3VibGUgeCkKK3sKKwlkb3VibGUgeiwgcyxjLHNzLGNjLHIsdSx2OworCWludDMyX3QgaHgsaXg7CisKKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg3ZmYwMDAwMCkgcmV0dXJuIG9uZS8oeCp4KTsKKwl4ID0gZmFicyh4KTsKKwlpZihpeCA+PSAweDQwMDAwMDAwKSB7CS8qIHx4fCA+PSAyLjAgKi8KKwkJcyA9IHNpbih4KTsKKwkJYyA9IGNvcyh4KTsKKwkJc3MgPSBzLWM7CisJCWNjID0gcytjOworCQlpZihpeDwweDdmZTAwMDAwKSB7ICAvKiBtYWtlIHN1cmUgeCt4IG5vdCBvdmVyZmxvdyAqLworCQkgICAgeiA9IC1jb3MoeCt4KTsKKwkJICAgIGlmICgocypjKTx6ZXJvKSBjYyA9IHovc3M7CisJCSAgICBlbHNlIAkgICAgc3MgPSB6L2NjOworCQl9CisJLyoKKwkgKiBqMCh4KSA9IDEvc3FydChwaSkgKiAoUCgwLHgpKmNjIC0gUSgwLHgpKnNzKSAvIHNxcnQoeCkKKwkgKiB5MCh4KSA9IDEvc3FydChwaSkgKiAoUCgwLHgpKnNzICsgUSgwLHgpKmNjKSAvIHNxcnQoeCkKKwkgKi8KKwkJaWYoaXg+MHg0ODAwMDAwMCkgeiA9IChpbnZzcXJ0cGkqY2MpL3NxcnQoeCk7CisJCWVsc2UgeworCQkgICAgdSA9IHB6ZXJvKHgpOyB2ID0gcXplcm8oeCk7CisJCSAgICB6ID0gaW52c3FydHBpKih1KmNjLXYqc3MpL3NxcnQoeCk7CisJCX0KKwkJcmV0dXJuIHo7CisJfQorCWlmKGl4PDB4M2YyMDAwMDApIHsJLyogfHh8IDwgMioqLTEzICovCisJICAgIGlmKGh1Z2UreD5vbmUpIHsJLyogcmFpc2UgaW5leGFjdCBpZiB4ICE9IDAgKi8KKwkgICAgICAgIGlmKGl4PDB4M2U0MDAwMDApIHJldHVybiBvbmU7CS8qIHx4fDwyKiotMjcgKi8KKwkgICAgICAgIGVsc2UgCSAgICAgIHJldHVybiBvbmUgLSAwLjI1KngqeDsKKwkgICAgfQorCX0KKwl6ID0geCp4OworCXIgPSAgeiooUjAyK3oqKFIwMyt6KihSMDQreipSMDUpKSk7CisJcyA9ICBvbmUreiooUzAxK3oqKFMwMit6KihTMDMreipTMDQpKSk7CisJaWYoaXggPCAweDNGRjAwMDAwKSB7CS8qIHx4fCA8IDEuMDAgKi8KKwkgICAgcmV0dXJuIG9uZSArIHoqKC0wLjI1KyhyL3MpKTsKKwl9IGVsc2UgeworCSAgICB1ID0gMC41Kng7CisJICAgIHJldHVybigob25lK3UpKihvbmUtdSkreiooci9zKSk7CisJfQorfQorCitzdGF0aWMgY29uc3QgZG91YmxlCit1MDAgID0gLTcuMzgwNDI5NTEwODY4NzIzMTc1MjNlLTAyLCAvKiAweEJGQjJFNEQ2LCAweDk5Q0JEMDFGICovCit1MDEgID0gIDEuNzY2NjY0NTI1MDkxODExMTU1MzhlLTAxLCAvKiAweDNGQzY5RDAxLCAweDlERTlFM0ZDICovCit1MDIgID0gLTEuMzgxODU2NzE5NDU1OTY4OTg4OTZlLTAyLCAvKiAweEJGOEM0Q0U4LCAweEIxNkNGQTk3ICovCit1MDMgID0gIDMuNDc0NTM0MzIwOTM2ODM2NTAyMzhlLTA0LCAvKiAweDNGMzZDNTRELCAweDIwQjI5QjZCICovCit1MDQgID0gLTMuODE0MDcwNTM3MjQzNjQxNjExMjVlLTA2LCAvKiAweEJFQ0ZGRUE3LCAweDczRDI1Q0FEICovCit1MDUgID0gIDEuOTU1OTAxMzcwMzUwMjI5MjAyMDZlLTA4LCAvKiAweDNFNTUwMDU3LCAweDNCNEVBQkQ0ICovCit1MDYgID0gLTMuOTgyMDUxOTQxMzIxMDMzOTg0NTNlLTExLCAvKiAweEJEQzVFNDNELCAweDY5M0ZCM0M4ICovCit2MDEgID0gIDEuMjczMDQ4MzQ4MzQxMjM2OTkzMjhlLTAyLCAvKiAweDNGOEExMjcwLCAweDkxQzlDNzFBICovCit2MDIgID0gIDcuNjAwNjg2MjczNTAzNTMyNTM3MDJlLTA1LCAvKiAweDNGMTNFQ0JCLCAweEY1NzhDNkMxICovCit2MDMgID0gIDIuNTkxNTA4NTE4NDA0NTc4MDU0NjdlLTA3LCAvKiAweDNFOTE2NDJELCAweDdGRjIwMkZEICovCit2MDQgID0gIDQuNDExMTAzMTEzMzI2NzU0Njc0MDNlLTEwOyAvKiAweDNERkU1MDE4LCAweDNCRDZEOUVGICovCisKK2RvdWJsZQorX19pZWVlNzU0X3kwKGRvdWJsZSB4KQoreworCWRvdWJsZSB6LCBzLGMsc3MsY2MsdSx2OworCWludDMyX3QgaHgsaXgsbHg7CisKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworICAgICAgICBpeCA9IDB4N2ZmZmZmZmYmaHg7CisgICAgLyogWTAoTmFOKSBpcyBOYU4sIHkwKC1pbmYpIGlzIE5hbiwgeTAoaW5mKSBpcyAwICAqLworCWlmKGl4Pj0weDdmZjAwMDAwKSByZXR1cm4gIG9uZS8oeCt4KngpOyAKKyAgICAgICAgaWYoKGl4fGx4KT09MCkgcmV0dXJuIC1vbmUvemVybzsKKyAgICAgICAgaWYoaHg8MCkgcmV0dXJuIHplcm8vemVybzsKKyAgICAgICAgaWYoaXggPj0gMHg0MDAwMDAwMCkgeyAgLyogfHh8ID49IDIuMCAqLworICAgICAgICAvKiB5MCh4KSA9IHNxcnQoMi8ocGkqeCkpKihwMCh4KSpzaW4oeDApK3EwKHgpKmNvcyh4MCkpCisgICAgICAgICAqIHdoZXJlIHgwID0geC1waS80CisgICAgICAgICAqICAgICAgQmV0dGVyIGZvcm11bGE6CisgICAgICAgICAqICAgICAgICAgICAgICBjb3MoeDApID0gY29zKHgpY29zKHBpLzQpK3Npbih4KXNpbihwaS80KQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9ICAxL3NxcnQoMikgKiAoc2luKHgpICsgY29zKHgpKQorICAgICAgICAgKiAgICAgICAgICAgICAgc2luKHgwKSA9IHNpbih4KWNvcygzcGkvNCktY29zKHgpc2luKDNwaS80KQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9ICAxL3NxcnQoMikgKiAoc2luKHgpIC0gY29zKHgpKQorICAgICAgICAgKiBUbyBhdm9pZCBjYW5jZWxsYXRpb24sIHVzZQorICAgICAgICAgKiAgICAgICAgICAgICAgc2luKHgpICstIGNvcyh4KSA9IC1jb3MoMngpLyhzaW4oeCkgLSsgY29zKHgpKQorICAgICAgICAgKiB0byBjb21wdXRlIHRoZSB3b3JzZSBvbmUuCisgICAgICAgICAqLworICAgICAgICAgICAgICAgIHMgPSBzaW4oeCk7CisgICAgICAgICAgICAgICAgYyA9IGNvcyh4KTsKKyAgICAgICAgICAgICAgICBzcyA9IHMtYzsKKyAgICAgICAgICAgICAgICBjYyA9IHMrYzsKKwkvKgorCSAqIGowKHgpID0gMS9zcXJ0KHBpKSAqIChQKDAseCkqY2MgLSBRKDAseCkqc3MpIC8gc3FydCh4KQorCSAqIHkwKHgpID0gMS9zcXJ0KHBpKSAqIChQKDAseCkqc3MgKyBRKDAseCkqY2MpIC8gc3FydCh4KQorCSAqLworICAgICAgICAgICAgICAgIGlmKGl4PDB4N2ZlMDAwMDApIHsgIC8qIG1ha2Ugc3VyZSB4K3ggbm90IG92ZXJmbG93ICovCisgICAgICAgICAgICAgICAgICAgIHogPSAtY29zKHgreCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgocypjKTx6ZXJvKSBjYyA9IHovc3M7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICBzcyA9IHovY2M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKGl4PjB4NDgwMDAwMDApIHogPSAoaW52c3FydHBpKnNzKS9zcXJ0KHgpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1ID0gcHplcm8oeCk7IHYgPSBxemVybyh4KTsKKyAgICAgICAgICAgICAgICAgICAgeiA9IGludnNxcnRwaSoodSpzcyt2KmNjKS9zcXJ0KHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gejsKKwl9CisJaWYoaXg8PTB4M2U0MDAwMDApIHsJLyogeCA8IDIqKi0yNyAqLworCSAgICByZXR1cm4odTAwICsgdHBpKl9faWVlZTc1NF9sb2coeCkpOworCX0KKwl6ID0geCp4OworCXUgPSB1MDAreioodTAxK3oqKHUwMit6Kih1MDMreioodTA0K3oqKHUwNSt6KnUwNikpKSkpOworCXYgPSBvbmUreioodjAxK3oqKHYwMit6Kih2MDMreip2MDQpKSk7CisJcmV0dXJuKHUvdiArIHRwaSooX19pZWVlNzU0X2owKHgpKl9faWVlZTc1NF9sb2coeCkpKTsKK30KKworLyogVGhlIGFzeW1wdG90aWMgZXhwYW5zaW9ucyBvZiBwemVybyBpcworICoJMSAtIDkvMTI4IHNeMiArIDExMDI1Lzk4MzA0IHNeNCAtIC4uLiwJd2hlcmUgcyA9IDEveC4KKyAqIEZvciB4ID49IDIsIFdlIGFwcHJveGltYXRlIHB6ZXJvIGJ5CisgKiAJcHplcm8oeCkgPSAxICsgKFIvUykKKyAqIHdoZXJlICBSID0gcFIwICsgcFIxKnNeMiArIHBSMipzXjQgKyAuLi4gKyBwUjUqc14xMAorICogCSAgUyA9IDEgKyBwUzAqc14yICsgLi4uICsgcFM0KnNeMTAKKyAqIGFuZAorICoJfCBwemVybyh4KS0xLVIvUyB8IDw9IDIgICoqICggLTYwLjI2KQorICovCitzdGF0aWMgY29uc3QgZG91YmxlIHBSOFs2XSA9IHsgLyogZm9yIHggaW4gW2luZiwgOF09MS9bMCwwLjEyNV0gKi8KKyAgMC4wMDAwMDAwMDAwMDAwMDAwMDAwMGUrMDAsIC8qIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgKi8KKyAtNy4wMzEyNDk5OTk5OTkwMDM1NzQ4NGUtMDIsIC8qIDB4QkZCMUZGRkYsIDB4RkZGRkZEMzIgKi8KKyAtOC4wODE2NzA0MTI3NTM0OTc5NTYyNmUrMDAsIC8qIDB4QzAyMDI5RDAsIDB4QjQ0RkE3NzkgKi8KKyAtMi41NzA2MzEwNTY3OTcwNDg0NzI2MmUrMDIsIC8qIDB4QzA3MDExMDIsIDB4N0IxOUU4NjMgKi8KKyAtMi40ODUyMTY0MTAwOTQyODgyMjE0NGUrMDMsIC8qIDB4QzBBMzZBNkUsIDB4Q0Q0RENBRkMgKi8KKyAtNS4yNTMwNDM4MDQ5MDcyOTU0NTI3MmUrMDMsIC8qIDB4QzBCNDg1MEIsIDB4MzZDQzY0M0QgKi8KK307CitzdGF0aWMgY29uc3QgZG91YmxlIHBTOFs1XSA9IHsKKyAgMS4xNjUzNDM2NDYxOTY2ODE4MTcxN2UrMDIsIC8qIDB4NDA1RDIyMzMsIDB4MDdBOTY3NTEgKi8KKyAgMy44MzM3NDQ3NTM2NDEyMTgyNjcxNWUrMDMsIC8qIDB4NDBBREYzN0QsIDB4NTA1OTY5MzggKi8KKyAgNC4wNTk3ODU3MjY0ODQ3MjU0NTU1MmUrMDQsIC8qIDB4NDBFM0QyQkIsIDB4NkVCNkIwNUYgKi8KKyAgMS4xNjc1Mjk3MjU2NDM3NTkxNTY4MWUrMDUsIC8qIDB4NDBGQzgxMEYsIDB4OEY5RkE5QkQgKi8KKyAgNC43NjI3NzI4NDE0NjczMDk2MjY3NWUrMDQsIC8qIDB4NDBFNzQxNzcsIDB4NEYyQzQ5REMgKi8KK307CisKK3N0YXRpYyBjb25zdCBkb3VibGUgcFI1WzZdID0geyAvKiBmb3IgeCBpbiBbOCw0LjU0NTRdPTEvWzAuMTI1LDAuMjIwMDFdICovCisgLTEuMTQxMjU0NjQ2OTE4OTQ1MDI1ODRlLTExLCAvKiAweEJEQTkxOEIxLCAweDQ3RTQ5NUNDICovCisgLTcuMDMxMjQ5NDA4NzM1OTkyODAwNzhlLTAyLCAvKiAweEJGQjFGRkZGLCAweEU2OUFGQkM2ICovCisgLTQuMTU5NjEwNjQ0NzA1ODc3ODI0MzhlKzAwLCAvKiAweEMwMTBBMzcwLCAweEY5MEM2QkJGICovCisgLTYuNzY3NDc2NTIyNjUxNjcyNjEwMjFlKzAxLCAvKiAweEMwNTBFQjJGLCAweDVBN0QxNzgzICovCisgLTMuMzEyMzEyOTk2NDkxNzI5Njc3NDdlKzAyLCAvKiAweEMwNzRCM0IzLCAweDY3NDJDQzYzICovCisgLTMuNDY0MzMzODgzNjU2MDQ5MTI0NTFlKzAyLCAvKiAweEMwNzVBNkVGLCAweDI4QTM4QkQ3ICovCit9Oworc3RhdGljIGNvbnN0IGRvdWJsZSBwUzVbNV0gPSB7CisgIDYuMDc1MzkzODI2OTIzMDAzMzU5NzVlKzAxLCAvKiAweDQwNEU2MDgxLCAweDBDOThDNURFICovCisgIDEuMDUxMjUyMzA1OTU3MDQ1NzkxNzNlKzAzLCAvKiAweDQwOTA2RDAyLCAweDVDN0UyODY0ICovCisgIDUuOTc4OTcwOTQzMzM4NTU3ODQ0OThlKzAzLCAvKiAweDQwQjc1QUY4LCAweDhGQkUxRDYwICovCisgIDkuNjI1NDQ1MTQzNTc3NzQ0NjAyMjNlKzAzLCAvKiAweDQwQzJDQ0I4LCAweEZBNzZGQTM4ICovCisgIDIuNDA2MDU4MTU5MjI5MzkxMDk0NDFlKzAzLCAvKiAweDQwQTJDQzFELCAweEM3MEJFODY0ICovCit9OworCitzdGF0aWMgY29uc3QgZG91YmxlIHBSM1s2XSA9IHsvKiBmb3IgeCBpbiBbNC41NDcsMi44NTcxXT0xL1swLjIxOTksMC4zNTAwMV0gKi8KKyAtMi41NDcwNDYwMTc3MTk1MTkxNTYyMGUtMDksIC8qIDB4QkUyNUUxMDMsIDB4NkZFMUFBODYgKi8KKyAtNy4wMzExOTYxNjM4MTQ4MTY1NDY1NGUtMDIsIC8qIDB4QkZCMUZGRjYsIDB4RjdDMEUyNEIgKi8KKyAtMi40MDkwMzIyMTU0OTUyOTYxMTQyM2UrMDAsIC8qIDB4QzAwMzQ1QjIsIDB4QUVBNDgwNzQgKi8KKyAtMi4xOTY1OTc3NDczNDg4MzA4NjQ2N2UrMDEsIC8qIDB4QzAzNUY3NEEsIDB4NENCOTRFMTQgKi8KKyAtNS44MDc5MTcwNDcwMTczNzU3MjIzNmUrMDEsIC8qIDB4QzA0RDBBMjIsIDB4NDIwQTFBNDUgKi8KKyAtMy4xNDQ3OTQ3MDU5NDg4ODUwMzg1NGUrMDEsIC8qIDB4QzAzRjcyQUMsIDB4QTg5MkQ4MEYgKi8KK307CitzdGF0aWMgY29uc3QgZG91YmxlIHBTM1s1XSA9IHsKKyAgMy41ODU2MDMzODA1NTIwOTcyNjM0OWUrMDEsIC8qIDB4NDA0MUVEOTIsIDB4ODQwNzdERDMgKi8KKyAgMy42MTUxMzk4MzA1MDMwMzg2MzgyMGUrMDIsIC8qIDB4NDA3Njk4MzksIDB4NDY0QTdDMEUgKi8KKyAgMS4xOTM2MDc4Mzc5MjExMTUzMzMzMGUrMDMsIC8qIDB4NDA5MkE2NkUsIDB4NkQxMDYxRDYgKi8KKyAgMS4xMjc5OTY3OTg1NjkwNzQxNDQzMmUrMDMsIC8qIDB4NDA5MTlGRkMsIDB4QjhDMzlCN0UgKi8KKyAgMS43MzU4MDkzMDgxMzMzNTc1NDY5MmUrMDIsIC8qIDB4NDA2NUIyOTYsIDB4RkMzNzkwODEgKi8KK307CisKK3N0YXRpYyBjb25zdCBkb3VibGUgcFIyWzZdID0gey8qIGZvciB4IGluIFsyLjg1NzAsMl09MS9bMC4zNDk5LDAuNV0gKi8KKyAtOC44NzUzNDMzMzAzMjUyNjQxMTI1NGUtMDgsIC8qIDB4QkU3N0QzMTYsIDB4RTkyNzAyNkQgKi8KKyAtNy4wMzAzMDk5NTQ4MzYyNDc0MzI0N2UtMDIsIC8qIDB4QkZCMUZGNjIsIDB4NDk1RTFFNDIgKi8KKyAtMS40NTA3Mzg0Njc4MDk1Mjk4NjM1N2UrMDAsIC8qIDB4QkZGNzM2MzksIDB4OEEyNEE4NDMgKi8KKyAtNy42MzU2OTYxMzgyMzUyNzc3MDc5MWUrMDAsIC8qIDB4QzAxRThBRjMsIDB4RURBRkE3RjMgKi8KKyAtMS4xMTkzMTY2ODg2MDM1Njc0Nzc4NmUrMDEsIC8qIDB4QzAyNjYyRTYsIDB4QzUyNDYzMDMgKi8KKyAtMy4yMzM2NDU3OTM1MTMzNTMzNTAzM2UrMDAsIC8qIDB4QzAwOURFODEsIDB4QUY4RkU3MEYgKi8KK307CitzdGF0aWMgY29uc3QgZG91YmxlIHBTMls1XSA9IHsKKyAgMi4yMjIwMjk5NzUzMjA4ODgwODQ0MWUrMDEsIC8qIDB4NDAzNjM4NjUsIDB4OTA4QjU5NTkgKi8KKyAgMS4zNjIwNjc5NDIxODIxNTIwODA0OGUrMDIsIC8qIDB4NDA2MTA2OUUsIDB4MEVFODg3OEYgKi8KKyAgMi43MDQ3MDI3ODY1ODA4MzQ4Njc4OWUrMDIsIC8qIDB4NDA3MEU3ODYsIDB4NDJFQTA3OUIgKi8KKyAgMS41Mzg3NTM5NDIwODMyMDMyOTg4MWUrMDIsIC8qIDB4NDA2MzNDMDMsIDB4M0FCNkZBRkYgKi8KKyAgMS40NjU3NjE3Njk0ODI1NjE5MzgxMGUrMDEsIC8qIDB4NDAyRDUwQjMsIDB4NDQzOTE4MDkgKi8KK307CisKKwlzdGF0aWMgZG91YmxlIHB6ZXJvKGRvdWJsZSB4KQoreworCWNvbnN0IGRvdWJsZSAqcCwqcTsKKwlkb3VibGUgeixyLHM7CisJaW50MzJfdCBpeDsKKwlHRVRfSElHSF9XT1JEKGl4LHgpOworCWl4ICY9IDB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4NDAyMDAwMDApICAgICB7cCA9IHBSODsgcT0gcFM4O30KKwllbHNlIGlmKGl4Pj0weDQwMTIyRThCKXtwID0gcFI1OyBxPSBwUzU7fQorCWVsc2UgaWYoaXg+PTB4NDAwNkRCNkQpe3AgPSBwUjM7IHE9IHBTMzt9CisJZWxzZSBpZihpeD49MHg0MDAwMDAwMCl7cCA9IHBSMjsgcT0gcFMyO30KKwl6ID0gb25lLyh4KngpOworCXIgPSBwWzBdK3oqKHBbMV0reioocFsyXSt6KihwWzNdK3oqKHBbNF0reipwWzVdKSkpKTsKKwlzID0gb25lK3oqKHFbMF0reioocVsxXSt6KihxWzJdK3oqKHFbM10reipxWzRdKSkpKTsKKwlyZXR1cm4gb25lKyByL3M7Cit9CisJCQorCisvKiBGb3IgeCA+PSA4LCB0aGUgYXN5bXB0b3RpYyBleHBhbnNpb25zIG9mIHF6ZXJvIGlzCisgKgktMS84IHMgKyA3NS8xMDI0IHNeMyAtIC4uLiwgd2hlcmUgcyA9IDEveC4KKyAqIFdlIGFwcHJveGltYXRlIHB6ZXJvIGJ5CisgKiAJcXplcm8oeCkgPSBzKigtMS4yNSArIChSL1MpKQorICogd2hlcmUgIFIgPSBxUjAgKyBxUjEqc14yICsgcVIyKnNeNCArIC4uLiArIHFSNSpzXjEwCisgKiAJICBTID0gMSArIHFTMCpzXjIgKyAuLi4gKyBxUzUqc14xMgorICogYW5kCisgKgl8IHF6ZXJvKHgpL3MgKzEuMjUtUi9TIHwgPD0gMiAgKiogKCAtNjEuMjIpCisgKi8KK3N0YXRpYyBjb25zdCBkb3VibGUgcVI4WzZdID0geyAvKiBmb3IgeCBpbiBbaW5mLCA4XT0xL1swLDAuMTI1XSAqLworICAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMCwgLyogMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCAqLworICA3LjMyNDIxODc0OTk5OTM1MDUxOTUzZS0wMiwgLyogMHgzRkIyQkZGRiwgMHhGRkZGRkUyQyAqLworICAxLjE3NjgyMDY0NjgyMjUyNjkzODk5ZSswMSwgLyogMHg0MDI3ODk1MiwgMHg1QkIzMzRENiAqLworICA1LjU3NjczMzgwMjU2NDAxODU2MDU5ZSswMiwgLyogMHg0MDgxNkQ2MywgMHgxNTMwMTgyNSAqLworICA4Ljg1OTE5NzIwNzU2NDY4NjMyMzE3ZSswMywgLyogMHg0MEMxNEQ5OSwgMHgzRTE4RjQ2RCAqLworICAzLjcwMTQ2MjY3Nzc2ODg3ODM0NzcxZSswNCwgLyogMHg0MEUyMTJENCwgMHgwRTkwMTU2NiAqLworfTsKK3N0YXRpYyBjb25zdCBkb3VibGUgcVM4WzZdID0geworICAxLjYzNzc2MDI2ODk1Njg5ODI0NDE0ZSswMiwgLyogMHg0MDY0NzhENSwgMHgzNjVCMzlCQyAqLworICA4LjA5ODM0NDk0NjU2NDQ5ODA1OTE2ZSswMywgLyogMHg0MEJGQTI1OCwgMHg0RTZCMDU2MyAqLworICAxLjQyNTM4MjkxNDE5MTIwNDc2MzQ4ZSswNSwgLyogMHg0MTAxNjY1MiwgMHg1NEQzOEMzRiAqLworICA4LjAzMzA5MjU3MTE5NTE0Mzk3MzQ1ZSswNSwgLyogMHg0MTI4ODNEQSwgMHg4M0E1MkI0MyAqLworICA4LjQwNTAxNTc5ODE5MDYwNTEyODE4ZSswNSwgLyogMHg0MTI5QTY2QiwgMHgyOERFMEIzRCAqLworIC0zLjQzODk5MjkzNTM3ODY2NjE1MjI1ZSswNSwgLyogMHhDMTE0RkQ2RCwgMHgyQzk1MzBDNSAqLworfTsKKworc3RhdGljIGNvbnN0IGRvdWJsZSBxUjVbNl0gPSB7IC8qIGZvciB4IGluIFs4LDQuNTQ1NF09MS9bMC4xMjUsMC4yMjAwMV0gKi8KKyAgMS44NDA4NTk2MzU5NDUxNTUzMTM4MWUtMTEsIC8qIDB4M0RCNDNEOEYsIDB4MjlDQzhDRDkgKi8KKyAgNy4zMjQyMTc2NjYxMjY4NDc2NTg5NmUtMDIsIC8qIDB4M0ZCMkJGRkYsIDB4RDE3MkIwNEMgKi8KKyAgNS44MzU2MzUwODk2MjA1Njk1Mzc3N2UrMDAsIC8qIDB4NDAxNzU3QjAsIDB4Qjk5NTNERDMgKi8KKyAgMS4zNTExMTU3NzI4NjQ0OTgyOTY3MWUrMDIsIC8qIDB4NDA2MEUzOTIsIDB4MEE4Nzg4RTkgKi8KKyAgMS4wMjcyNDM3NjU5NjE2NDA5NzQ2NGUrMDMsIC8qIDB4NDA5MDBDRjksIDB4OURDOEM0ODEgKi8KKyAgMS45ODk5Nzc4NTg2NDYwNTM4NDYzMWUrMDMsIC8qIDB4NDA5RjE3RTksIDB4NTNDNkUzQTYgKi8KK307CitzdGF0aWMgY29uc3QgZG91YmxlIHFTNVs2XSA9IHsKKyAgOC4yNzc2NjEwMjIzNjUzNzc2MTg4M2UrMDEsIC8qIDB4NDA1NEIxQjMsIDB4RkI1RTE1NDMgKi8KKyAgMi4wNzc4MTQxNjQyMTM5Mjk4NzEwNGUrMDMsIC8qIDB4NDBBMDNCQTAsIDB4REEyMUMwQ0UgKi8KKyAgMS44ODQ3Mjg4Nzc4NTcxODA4NTA3MGUrMDQsIC8qIDB4NDBEMjY3RDIsIDB4N0I1OTFFNkQgKi8KKyAgNS42NzUxMTEyMjg5NDk0NzMyOTc2OWUrMDQsIC8qIDB4NDBFQkI1RTMsIDB4OTdFMDIzNzIgKi8KKyAgMy41OTc2NzUzODQyNTExNDQ3MTQ2NWUrMDQsIC8qIDB4NDBFMTkxMTgsIDB4MUY3QTU0QTAgKi8KKyAtNS4zNTQzNDI3NTYwMTk0NDc3MzM3MWUrMDMsIC8qIDB4QzBCNEVBNTcsIDB4QkVEQkM2MDkgKi8KK307CisKK3N0YXRpYyBjb25zdCBkb3VibGUgcVIzWzZdID0gey8qIGZvciB4IGluIFs0LjU0NywyLjg1NzFdPTEvWzAuMjE5OSwwLjM1MDAxXSAqLworICA0LjM3NzQxMDE0MDg5NzM4NjIwOTA2ZS0wOSwgLyogMHgzRTMyQ0QwMywgMHg2QURFQ0I4MiAqLworICA3LjMyNDExMTgwMDQyOTExNDQ3MTYzZS0wMiwgLyogMHgzRkIyQkZFRSwgMHgwRThEMDg0MiAqLworICAzLjM0NDIzMTM3NTE2MTcwNzIwOTI5ZSswMCwgLyogMHg0MDBBQzBGQywgMHg2MTE0OUNGNSAqLworICA0LjI2MjE4NDQwNzQ1NDEyNjUwMDE3ZSswMSwgLyogMHg0MDQ1NEY5OCwgMHg5NjJEQUVERCAqLworICAxLjcwODA4MDkxMzQwNTY1NTk2MjgzZSswMiwgLyogMHg0MDY1NTlEQiwgMHhFMjVFRkQxRiAqLworICAxLjY2NzMzOTQ4Njk2NjUxMTY4NTc1ZSswMiwgLyogMHg0MDY0RDc3QywgMHg4MUZBMjFFMCAqLworfTsKK3N0YXRpYyBjb25zdCBkb3VibGUgcVMzWzZdID0geworICA0Ljg3NTg4NzI5NzI0NTg3MTgyMDkxZSswMSwgLyogMHg0MDQ4NjEyMiwgMHhCRkUzNDNBNiAqLworICA3LjA5Njg5MjIxMDU2NjA2MDE1NzM2ZSswMiwgLyogMHg0MDg2MkQ4MywgMHg4NjU0NEVCMyAqLworICAzLjcwNDE0ODIyNjIwMTExMzYyOTk0ZSswMywgLyogMHg0MEFDRjA0QiwgMHhFNDRERkM2MyAqLworICA2LjQ2MDQyNTE2NzUyNTY4OTE3NTgyZSswMywgLyogMHg0MEI5M0M2QywgMHhEN0M3NkEyOCAqLworICAyLjUxNjMzMzY4OTIwMzY4OTU3MzMzZSswMywgLyogMHg0MEEzQThBQSwgMHhEOTRGQjFDMCAqLworIC0xLjQ5MjQ3NDUxODM2MTU2Mzg2NjYyZSswMiwgLyogMHhDMDYyQTdFQiwgMHgyMDFDRjQwRiAqLworfTsKKworc3RhdGljIGNvbnN0IGRvdWJsZSBxUjJbNl0gPSB7LyogZm9yIHggaW4gWzIuODU3MCwyXT0xL1swLjM0OTksMC41XSAqLworICAxLjUwNDQ0NDQ0ODg2OTgzMjcyMzc5ZS0wNywgLyogMHgzRTg0MzEzQiwgMHg1NEY3NkJEQiAqLworICA3LjMyMjM0MjY1OTYzMDc5Mjc4MjcyZS0wMiwgLyogMHgzRkIyQkVDNSwgMHgzRTg4M0UzNCAqLworICAxLjk5ODE5MTc0MDkzODE1OTk4ODE2ZSswMCwgLyogMHgzRkZGRjg5NywgMHhFNzI3Nzc5QyAqLworICAxLjQ0OTU2MDI5MzQ3ODg1NzM1MzQ4ZSswMSwgLyogMHg0MDJDRkRCRiwgMHhBQUY5NkZFNSAqLworICAzLjE2NjYyMzE3NTA0NzgxNTQwODMzZSswMSwgLyogMHg0MDNGQUE4RSwgMHgyOUZCREM0QSAqLworICAxLjYyNTI3MDc1NzEwOTI5MjY3NDE2ZSswMSwgLyogMHg0MDMwNDBCMSwgMHg3MTgxNEJCNCAqLworfTsKK3N0YXRpYyBjb25zdCBkb3VibGUgcVMyWzZdID0geworICAzLjAzNjU1ODQ4MzU1MjE5MTg0NDk4ZSswMSwgLyogMHg0MDNFNUQ5NiwgMHhGN0MwN0FFRCAqLworICAyLjY5MzQ4MTE4NjA4MDQ5ODQ0NjI0ZSswMiwgLyogMHg0MDcwRDU5MSwgMHhFNEQxNEI0MCAqLworICA4LjQ0NzgzNzU3NTk1MzIwMTM5NDQ0ZSswMiwgLyogMHg0MDhBNjY0NSwgMHgyMkIzQkYyMiAqLworICA4LjgyOTM1ODQ1MTEyNDg4NTUwNTEyZSswMiwgLyogMHg0MDhCOTc3QywgMHg5QzVDQzIxNCAqLworICAyLjEyNjY2Mzg4NTExNzk4ODI4NjMxZSswMiwgLyogMHg0MDZBOTU1MywgMHgwRTAwMTM2NSAqLworIC01LjMxMDk1NDkzODgyNjY2OTQ2OTE3ZSswMCwgLyogMHhDMDE1M0U2QSwgMHhGOEIzMjkzMSAqLworfTsKKworCXN0YXRpYyBkb3VibGUgcXplcm8oZG91YmxlIHgpCit7CisJY29uc3QgZG91YmxlICpwLCpxOworCWRvdWJsZSBzLHIsejsKKwlpbnQzMl90IGl4OworCUdFVF9ISUdIX1dPUkQoaXgseCk7CisJaXggJj0gMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg0MDIwMDAwMCkgICAgIHtwID0gcVI4OyBxPSBxUzg7fQorCWVsc2UgaWYoaXg+PTB4NDAxMjJFOEIpe3AgPSBxUjU7IHE9IHFTNTt9CisJZWxzZSBpZihpeD49MHg0MDA2REI2RCl7cCA9IHFSMzsgcT0gcVMzO30KKwllbHNlIGlmKGl4Pj0weDQwMDAwMDAwKXtwID0gcVIyOyBxPSBxUzI7fQorCXogPSBvbmUvKHgqeCk7CisJciA9IHBbMF0reioocFsxXSt6KihwWzJdK3oqKHBbM10reioocFs0XSt6KnBbNV0pKSkpOworCXMgPSBvbmUreioocVswXSt6KihxWzFdK3oqKHFbMl0reioocVszXSt6KihxWzRdK3oqcVs1XSkpKSkpOworCXJldHVybiAoLS4xMjUgKyByL3MpL3g7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2owZi5jIGIvbGlibS9zcmMvZV9qMGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODcyNDA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9qMGYuYwpAQCAtMCwwICsxLDMzOCBAQAorLyogZV9qMGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfajAuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfajBmLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowMyBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBmbG9hdCBwemVyb2YoZmxvYXQpLCBxemVyb2YoZmxvYXQpOworCitzdGF0aWMgY29uc3QgZmxvYXQKK2h1Z2UgCT0gMWUzMCwKK29uZQk9IDEuMCwKK2ludnNxcnRwaT0gIDUuNjQxODk2MTI4N2UtMDEsIC8qIDB4M2YxMDZlYmIgKi8KK3RwaSAgICAgID0gIDYuMzY2MTk3NDY2OWUtMDEsIC8qIDB4M2YyMmY5ODMgKi8KKyAJCS8qIFIwL1MwIG9uIFswLCAyLjAwXSAqLworUjAyICA9ICAxLjU2MjUwMDAwMDBlLTAyLCAvKiAweDNjODAwMDAwICovCitSMDMgID0gLTEuODk5NzkyOTg3NGUtMDQsIC8qIDB4Yjk0NzM1MmUgKi8KK1IwNCAgPSAgMS44Mjk1NDA0NTE2ZS0wNiwgLyogMHgzNWY1OGU4OCAqLworUjA1ICA9IC00LjYxODMyNzA1NDFlLTA5LCAvKiAweGIxOWVhZjNjICovCitTMDEgID0gIDEuNTYxOTEwMjg2NWUtMDIsIC8qIDB4M2M3ZmU3NDQgKi8KK1MwMiAgPSAgMS4xNjkyNjc4NTI3ZS0wNCwgLyogMHgzOGY1MzY5NyAqLworUzAzICA9ICA1LjEzNTQ2NTI0NDJlLTA3LCAvKiAweDM1MDlkYWE2ICovCitTMDQgID0gIDEuMTY2MTQwMDczNGUtMDk7IC8qIDB4MzBhMDQ1ZTggKi8KKworc3RhdGljIGNvbnN0IGZsb2F0IHplcm8gPSAwLjA7CisKK2Zsb2F0CitfX2llZWU3NTRfajBmKGZsb2F0IHgpCit7CisJZmxvYXQgeiwgcyxjLHNzLGNjLHIsdSx2OworCWludDMyX3QgaHgsaXg7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4N2Y4MDAwMDApIHJldHVybiBvbmUvKHgqeCk7CisJeCA9IGZhYnNmKHgpOworCWlmKGl4ID49IDB4NDAwMDAwMDApIHsJLyogfHh8ID49IDIuMCAqLworCQlzID0gc2luZih4KTsKKwkJYyA9IGNvc2YoeCk7CisJCXNzID0gcy1jOworCQljYyA9IHMrYzsKKwkJaWYoaXg8MHg3ZjAwMDAwMCkgeyAgLyogbWFrZSBzdXJlIHgreCBub3Qgb3ZlcmZsb3cgKi8KKwkJICAgIHogPSAtY29zZih4K3gpOworCQkgICAgaWYgKChzKmMpPHplcm8pIGNjID0gei9zczsKKwkJICAgIGVsc2UgCSAgICBzcyA9IHovY2M7CisJCX0KKwkvKgorCSAqIGowKHgpID0gMS9zcXJ0KHBpKSAqIChQKDAseCkqY2MgLSBRKDAseCkqc3MpIC8gc3FydCh4KQorCSAqIHkwKHgpID0gMS9zcXJ0KHBpKSAqIChQKDAseCkqc3MgKyBRKDAseCkqY2MpIC8gc3FydCh4KQorCSAqLworCQlpZihpeD4weDgwMDAwMDAwKSB6ID0gKGludnNxcnRwaSpjYykvc3FydGYoeCk7CisJCWVsc2UgeworCQkgICAgdSA9IHB6ZXJvZih4KTsgdiA9IHF6ZXJvZih4KTsKKwkJICAgIHogPSBpbnZzcXJ0cGkqKHUqY2Mtdipzcykvc3FydGYoeCk7CisJCX0KKwkJcmV0dXJuIHo7CisJfQorCWlmKGl4PDB4MzkwMDAwMDApIHsJLyogfHh8IDwgMioqLTEzICovCisJICAgIGlmKGh1Z2UreD5vbmUpIHsJLyogcmFpc2UgaW5leGFjdCBpZiB4ICE9IDAgKi8KKwkgICAgICAgIGlmKGl4PDB4MzIwMDAwMDApIHJldHVybiBvbmU7CS8qIHx4fDwyKiotMjcgKi8KKwkgICAgICAgIGVsc2UgCSAgICAgIHJldHVybiBvbmUgLSAoZmxvYXQpMC4yNSp4Kng7CisJICAgIH0KKwl9CisJeiA9IHgqeDsKKwlyID0gIHoqKFIwMit6KihSMDMreiooUjA0K3oqUjA1KSkpOworCXMgPSAgb25lK3oqKFMwMSt6KihTMDIreiooUzAzK3oqUzA0KSkpOworCWlmKGl4IDwgMHgzRjgwMDAwMCkgewkvKiB8eHwgPCAxLjAwICovCisJICAgIHJldHVybiBvbmUgKyB6KigoZmxvYXQpLTAuMjUrKHIvcykpOworCX0gZWxzZSB7CisJICAgIHUgPSAoZmxvYXQpMC41Kng7CisJICAgIHJldHVybigob25lK3UpKihvbmUtdSkreiooci9zKSk7CisJfQorfQorCitzdGF0aWMgY29uc3QgZmxvYXQKK3UwMCAgPSAtNy4zODA0Mjk2NTUzZS0wMiwgLyogMHhiZDk3MjZiNSAqLwordTAxICA9ICAxLjc2NjY2NDUzNDhlLTAxLCAvKiAweDNlMzRlODBkICovCit1MDIgID0gLTEuMzgxODU2NzYxOWUtMDIsIC8qIDB4YmM2MjY3NDYgKi8KK3UwMyAgPSAgMy40NzQ1MzQzMTQ2ZS0wNCwgLyogMHgzOWI2MmE2OSAqLwordTA0ICA9IC0zLjgxNDA3MDYyMzhlLTA2LCAvKiAweGI2N2ZmNTNjICovCit1MDUgID0gIDEuOTU1OTAxMzk2NGUtMDgsIC8qIDB4MzJhODAyYmEgKi8KK3UwNiAgPSAtMy45ODIwNTE4NDEwZS0xMSwgLyogMHhhZTJmMjFlYiAqLwordjAxICA9ICAxLjI3MzA0ODM4OTdlLTAyLCAvKiAweDNjNTA5Mzg1ICovCit2MDIgID0gIDcuNjAwNjg2NTEyOWUtMDUsIC8qIDB4Mzg5ZjY1ZTAgKi8KK3YwMyAgPSAgMi41OTE1MDg1MTg5ZS0wNywgLyogMHgzNDhiMjE2YyAqLwordjA0ICA9ICA0LjQxMTEwMzE0OTRlLTEwOyAvKiAweDJmZjI4MGMyICovCisKK2Zsb2F0CitfX2llZWU3NTRfeTBmKGZsb2F0IHgpCit7CisJZmxvYXQgeiwgcyxjLHNzLGNjLHUsdjsKKwlpbnQzMl90IGh4LGl4OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisgICAgICAgIGl4ID0gMHg3ZmZmZmZmZiZoeDsKKyAgICAvKiBZMChOYU4pIGlzIE5hTiwgeTAoLWluZikgaXMgTmFuLCB5MChpbmYpIGlzIDAgICovCisJaWYoaXg+PTB4N2Y4MDAwMDApIHJldHVybiAgb25lLyh4K3gqeCk7CisgICAgICAgIGlmKGl4PT0wKSByZXR1cm4gLW9uZS96ZXJvOworICAgICAgICBpZihoeDwwKSByZXR1cm4gemVyby96ZXJvOworICAgICAgICBpZihpeCA+PSAweDQwMDAwMDAwKSB7ICAvKiB8eHwgPj0gMi4wICovCisgICAgICAgIC8qIHkwKHgpID0gc3FydCgyLyhwaSp4KSkqKHAwKHgpKnNpbih4MCkrcTAoeCkqY29zKHgwKSkKKyAgICAgICAgICogd2hlcmUgeDAgPSB4LXBpLzQKKyAgICAgICAgICogICAgICBCZXR0ZXIgZm9ybXVsYToKKyAgICAgICAgICogICAgICAgICAgICAgIGNvcyh4MCkgPSBjb3MoeCljb3MocGkvNCkrc2luKHgpc2luKHBpLzQpCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gIDEvc3FydCgyKSAqIChzaW4oeCkgKyBjb3MoeCkpCisgICAgICAgICAqICAgICAgICAgICAgICBzaW4oeDApID0gc2luKHgpY29zKDNwaS80KS1jb3MoeClzaW4oM3BpLzQpCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gIDEvc3FydCgyKSAqIChzaW4oeCkgLSBjb3MoeCkpCisgICAgICAgICAqIFRvIGF2b2lkIGNhbmNlbGxhdGlvbiwgdXNlCisgICAgICAgICAqICAgICAgICAgICAgICBzaW4oeCkgKy0gY29zKHgpID0gLWNvcygyeCkvKHNpbih4KSAtKyBjb3MoeCkpCisgICAgICAgICAqIHRvIGNvbXB1dGUgdGhlIHdvcnNlIG9uZS4KKyAgICAgICAgICovCisgICAgICAgICAgICAgICAgcyA9IHNpbmYoeCk7CisgICAgICAgICAgICAgICAgYyA9IGNvc2YoeCk7CisgICAgICAgICAgICAgICAgc3MgPSBzLWM7CisgICAgICAgICAgICAgICAgY2MgPSBzK2M7CisJLyoKKwkgKiBqMCh4KSA9IDEvc3FydChwaSkgKiAoUCgwLHgpKmNjIC0gUSgwLHgpKnNzKSAvIHNxcnQoeCkKKwkgKiB5MCh4KSA9IDEvc3FydChwaSkgKiAoUCgwLHgpKnNzICsgUSgwLHgpKmNjKSAvIHNxcnQoeCkKKwkgKi8KKyAgICAgICAgICAgICAgICBpZihpeDwweDdmMDAwMDAwKSB7ICAvKiBtYWtlIHN1cmUgeCt4IG5vdCBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgICAgICB6ID0gLWNvc2YoeCt4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzKmMpPHplcm8pIGNjID0gei9zczsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgIHNzID0gei9jYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoaXg+MHg4MDAwMDAwMCkgeiA9IChpbnZzcXJ0cGkqc3MpL3NxcnRmKHgpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1ID0gcHplcm9mKHgpOyB2ID0gcXplcm9mKHgpOworICAgICAgICAgICAgICAgICAgICB6ID0gaW52c3FydHBpKih1KnNzK3YqY2MpL3NxcnRmKHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gejsKKwl9CisJaWYoaXg8PTB4MzIwMDAwMDApIHsJLyogeCA8IDIqKi0yNyAqLworCSAgICByZXR1cm4odTAwICsgdHBpKl9faWVlZTc1NF9sb2dmKHgpKTsKKwl9CisJeiA9IHgqeDsKKwl1ID0gdTAwK3oqKHUwMSt6Kih1MDIreioodTAzK3oqKHUwNCt6Kih1MDUreip1MDYpKSkpKTsKKwl2ID0gb25lK3oqKHYwMSt6Kih2MDIreioodjAzK3oqdjA0KSkpOworCXJldHVybih1L3YgKyB0cGkqKF9faWVlZTc1NF9qMGYoeCkqX19pZWVlNzU0X2xvZ2YoeCkpKTsKK30KKworLyogVGhlIGFzeW1wdG90aWMgZXhwYW5zaW9ucyBvZiBwemVybyBpcworICoJMSAtIDkvMTI4IHNeMiArIDExMDI1Lzk4MzA0IHNeNCAtIC4uLiwJd2hlcmUgcyA9IDEveC4KKyAqIEZvciB4ID49IDIsIFdlIGFwcHJveGltYXRlIHB6ZXJvIGJ5CisgKiAJcHplcm8oeCkgPSAxICsgKFIvUykKKyAqIHdoZXJlICBSID0gcFIwICsgcFIxKnNeMiArIHBSMipzXjQgKyAuLi4gKyBwUjUqc14xMAorICogCSAgUyA9IDEgKyBwUzAqc14yICsgLi4uICsgcFM0KnNeMTAKKyAqIGFuZAorICoJfCBwemVybyh4KS0xLVIvUyB8IDw9IDIgICoqICggLTYwLjI2KQorICovCitzdGF0aWMgY29uc3QgZmxvYXQgcFI4WzZdID0geyAvKiBmb3IgeCBpbiBbaW5mLCA4XT0xL1swLDAuMTI1XSAqLworICAwLjAwMDAwMDAwMDBlKzAwLCAvKiAweDAwMDAwMDAwICovCisgLTcuMDMxMjUwMDAwMGUtMDIsIC8qIDB4YmQ5MDAwMDAgKi8KKyAtOC4wODE2NzA3NjExZSswMCwgLyogMHhjMTAxNGU4NiAqLworIC0yLjU3MDYzMTEwMzVlKzAyLCAvKiAweGMzODA4ODE0ICovCisgLTIuNDg1MjE2MzA4NmUrMDMsIC8qIDB4YzUxYjUzNzYgKi8KKyAtNS4yNTMwNDM5NDUzZSswMywgLyogMHhjNWE0Mjg1YSAqLworfTsKK3N0YXRpYyBjb25zdCBmbG9hdCBwUzhbNV0gPSB7CisgIDEuMTY1MzQzNjI3OWUrMDIsIC8qIDB4NDJlOTExOTggKi8KKyAgMy44MzM3NDQ4NzMwZSswMywgLyogMHg0NTZmOWJlYiAqLworICA0LjA1OTc4NTU0NjllKzA0LCAvKiAweDQ3MWU5NWRiICovCisgIDEuMTY3NTI5Njg3NWUrMDUsIC8qIDB4NDdlNDA4N2MgKi8KKyAgNC43NjI3NzI2NTYyZSswNCwgLyogMHg0NzNhMGJiYSAqLworfTsKK3N0YXRpYyBjb25zdCBmbG9hdCBwUjVbNl0gPSB7IC8qIGZvciB4IGluIFs4LDQuNTQ1NF09MS9bMC4xMjUsMC4yMjAwMV0gKi8KKyAtMS4xNDEyNTQ2MjU1ZS0xMSwgLyogMHhhZDQ4YzU4YSAqLworIC03LjAzMTI0OTI1NDllLTAyLCAvKiAweGJkOGZmZmZmICovCisgLTQuMTU5NjEwNzQ4M2UrMDAsIC8qIDB4YzA4NTFiODggKi8KKyAtNi43Njc0NzY2NTQxZSswMSwgLyogMHhjMjg3NTk3YiAqLworIC0zLjMxMjMxMjkyNzJlKzAyLCAvKiAweGMzYTU5ZDliICovCisgLTMuNDY0MzMzODAxM2UrMDIsIC8qIDB4YzNhZDM3NzkgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcFM1WzVdID0geworICA2LjA3NTM5MzY3NjhlKzAxLCAvKiAweDQyNzMwNDA4ICovCisgIDEuMDUxMjUyMzE5M2UrMDMsIC8qIDB4NDQ4MzY4MTMgKi8KKyAgNS45Nzg5NzA3MDMxZSswMywgLyogMHg0NWJhZDdjNCAqLworICA5LjYyNTQ0NTMxMjVlKzAzLCAvKiAweDQ2MTY2NWM4ICovCisgIDIuNDA2MDU4MTA1NWUrMDMsIC8qIDB4NDUxNjYwZWUgKi8KK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBwUjNbNl0gPSB7LyogZm9yIHggaW4gWzQuNTQ3LDIuODU3MV09MS9bMC4yMTk5LDAuMzUwMDFdICovCisgLTIuNTQ3MDQ1OTA3NWUtMDksIC8qIDB4YjEyZjA4MWIgKi8KKyAtNy4wMzExOTYzNTU4ZS0wMiwgLyogMHhiZDhmZmZiOCAqLworIC0yLjQwOTAzMjEwNjRlKzAwLCAvKiAweGMwMWEyZDk1ICovCisgLTIuMTk2NTk3NjcxNWUrMDEsIC8qIDB4YzFhZmJhNTIgKi8KKyAtNS44MDc5MTcwMjI3ZSswMSwgLyogMHhjMjY4NTExMiAqLworIC0zLjE0NDc5NDY1NDhlKzAxLCAvKiAweGMxZmI5NTY1ICovCit9Oworc3RhdGljIGNvbnN0IGZsb2F0IHBTM1s1XSA9IHsKKyAgMy41ODU2MDMzMzI1ZSswMSwgLyogMHg0MjBmNmM5NCAqLworICAzLjYxNTEzOTc3MDVlKzAyLCAvKiAweDQzYjRjMWNhICovCisgIDEuMTkzNjA3Nzg4MWUrMDMsIC8qIDB4NDQ5NTMzNzMgKi8KKyAgMS4xMjc5OTY4MjYyZSswMywgLyogMHg0NDhjZmZlNiAqLworICAxLjczNTgwOTMyNjJlKzAyLCAvKiAweDQzMmQ5NGI4ICovCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgcFIyWzZdID0gey8qIGZvciB4IGluIFsyLjg1NzAsMl09MS9bMC4zNDk5LDAuNV0gKi8KKyAtOC44NzUzNDMxMjcxZS0wOCwgLyogMHhiM2JlOThiNyAqLworIC03LjAzMDMwOTczNjdlLTAyLCAvKiAweGJkOGZmYjEyICovCisgLTEuNDUwNzM4NDMwMGUrMDAsIC8qIDB4YmZiOWIxY2MgKi8KKyAtNy42MzU2OTU5MzQzZSswMCwgLyogMHhjMGY0NTc5ZiAqLworIC0xLjExOTMxNjY3MzNlKzAxLCAvKiAweGMxMzMxNzM2ICovCisgLTMuMjMzNjQ1Njc3NmUrMDAsIC8qIDB4YzA0ZWY0MGQgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcFMyWzVdID0geworICAyLjIyMjAzMDA2NzRlKzAxLCAvKiAweDQxYjFjMzJkICovCisgIDEuMzYyMDY3ODcxMWUrMDIsIC8qIDB4NDMwODM0ZjAgKi8KKyAgMi43MDQ3MDI3NTg4ZSswMiwgLyogMHg0Mzg3M2MzMiAqLworICAxLjUzODc1Mzk2NzNlKzAyLCAvKiAweDQzMTllMDFhICovCisgIDEuNDY1NzYxNzU2OWUrMDEsIC8qIDB4NDE2YTg1OWEgKi8KK307CisKKwlzdGF0aWMgZmxvYXQgcHplcm9mKGZsb2F0IHgpCit7CisJY29uc3QgZmxvYXQgKnAsKnE7CisJZmxvYXQgeixyLHM7CisJaW50MzJfdCBpeDsKKwlHRVRfRkxPQVRfV09SRChpeCx4KTsKKwlpeCAmPSAweDdmZmZmZmZmOworCWlmKGl4Pj0weDQxMDAwMDAwKSAgICAge3AgPSBwUjg7IHE9IHBTODt9CisJZWxzZSBpZihpeD49MHg0MGY3MWM1OCl7cCA9IHBSNTsgcT0gcFM1O30KKwllbHNlIGlmKGl4Pj0weDQwMzZkYjY4KXtwID0gcFIzOyBxPSBwUzM7fQorCWVsc2UgaWYoaXg+PTB4NDAwMDAwMDApe3AgPSBwUjI7IHE9IHBTMjt9CisJeiA9IG9uZS8oeCp4KTsKKwlyID0gcFswXSt6KihwWzFdK3oqKHBbMl0reioocFszXSt6KihwWzRdK3oqcFs1XSkpKSk7CisJcyA9IG9uZSt6KihxWzBdK3oqKHFbMV0reioocVsyXSt6KihxWzNdK3oqcVs0XSkpKSk7CisJcmV0dXJuIG9uZSsgci9zOworfQorCisKKy8qIEZvciB4ID49IDgsIHRoZSBhc3ltcHRvdGljIGV4cGFuc2lvbnMgb2YgcXplcm8gaXMKKyAqCS0xLzggcyArIDc1LzEwMjQgc14zIC0gLi4uLCB3aGVyZSBzID0gMS94LgorICogV2UgYXBwcm94aW1hdGUgcHplcm8gYnkKKyAqIAlxemVybyh4KSA9IHMqKC0xLjI1ICsgKFIvUykpCisgKiB3aGVyZSAgUiA9IHFSMCArIHFSMSpzXjIgKyBxUjIqc140ICsgLi4uICsgcVI1KnNeMTAKKyAqIAkgIFMgPSAxICsgcVMwKnNeMiArIC4uLiArIHFTNSpzXjEyCisgKiBhbmQKKyAqCXwgcXplcm8oeCkvcyArMS4yNS1SL1MgfCA8PSAyICAqKiAoIC02MS4yMikKKyAqLworc3RhdGljIGNvbnN0IGZsb2F0IHFSOFs2XSA9IHsgLyogZm9yIHggaW4gW2luZiwgOF09MS9bMCwwLjEyNV0gKi8KKyAgMC4wMDAwMDAwMDAwZSswMCwgLyogMHgwMDAwMDAwMCAqLworICA3LjMyNDIxODc1MDBlLTAyLCAvKiAweDNkOTYwMDAwICovCisgIDEuMTc2ODIwNjU5NmUrMDEsIC8qIDB4NDEzYzRhOTMgKi8KKyAgNS41NzY3MzQwMDg4ZSswMiwgLyogMHg0NDBiNmIxOSAqLworICA4Ljg1OTE5NzI2NTZlKzAzLCAvKiAweDQ2MGE2Y2NhICovCisgIDMuNzAxNDYyNTAwMGUrMDQsIC8qIDB4NDcxMDk2YTAgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcVM4WzZdID0geworICAxLjYzNzc2MDMxNDllKzAyLCAvKiAweDQzMjNjNmFhICovCisgIDguMDk4MzQ0NzI2NmUrMDMsIC8qIDB4NDVmZDEyYzIgKi8KKyAgMS40MjUzODI5Njg4ZSswNSwgLyogMHg0ODBiMzI5MyAqLworICA4LjAzMzA5MjUwMDBlKzA1LCAvKiAweDQ5NDQxZWQ0ICovCisgIDguNDA1MDE1NjI1MGUrMDUsIC8qIDB4NDk0ZDMzNTkgKi8KKyAtMy40Mzg5OTI4MTI1ZSswNSwgLyogMHhjOGE3ZWI2OSAqLworfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHFSNVs2XSA9IHsgLyogZm9yIHggaW4gWzgsNC41NDU0XT0xL1swLjEyNSwwLjIyMDAxXSAqLworICAxLjg0MDg1OTU4MjhlLTExLCAvKiAweDJkYTFlYzc5ICovCisgIDcuMzI0MjE4MDA0OWUtMDIsIC8qIDB4M2Q5NWZmZmYgKi8KKyAgNS44MzU2MzUxODUyZSswMCwgLyogMHg0MGJhYmQ4NiAqLworICAxLjM1MTExNTcyMjdlKzAyLCAvKiAweDQzMDcxYzkwICovCisgIDEuMDI3MjQzNzc0NGUrMDMsIC8qIDB4NDQ4MDY3Y2QgKi8KKyAgMS45ODk5Nzc5MDUzZSswMywgLyogMHg0NGY4YmY0YiAqLworfTsKK3N0YXRpYyBjb25zdCBmbG9hdCBxUzVbNl0gPSB7CisgIDguMjc3NjYxMTMyOGUrMDEsIC8qIDB4NDJhNThkYTAgKi8KKyAgMi4wNzc4MTQyMDkwZSswMywgLyogMHg0NTAxZGQwNyAqLworICAxLjg4NDcyODkwNjJlKzA0LCAvKiAweDQ2OTMzZTk0ICovCisgIDUuNjc1MTExMzI4MWUrMDQsIC8qIDB4NDc1ZGFmMWQgKi8KKyAgMy41OTc2NzUzOTA2ZSswNCwgLyogMHg0NzBjODhjMSAqLworIC01LjM1NDM0Mjc3MzRlKzAzLCAvKiAweGM1YTc1MmJlICovCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgcVIzWzZdID0gey8qIGZvciB4IGluIFs0LjU0NywyLjg1NzFdPTEvWzAuMjE5OSwwLjM1MDAxXSAqLworICA0LjM3NzQwOTk5MDBlLTA5LCAvKiAweDMxOTY2ODFiICovCisgIDcuMzI0MTExNDYxNmUtMDIsIC8qIDB4M2Q5NWZmNzAgKi8KKyAgMy4zNDQyMzEzNjcxZSswMCwgLyogMHg0MDU2MDdlMyAqLworICA0LjI2MjE4NDUyNDVlKzAxLCAvKiAweDQyMmE3Y2M1ICovCisgIDEuNzA4MDgwOTAyMWUrMDIsIC8qIDB4NDMyYWNlZGYgKi8KKyAgMS42NjczMzk0Nzc1ZSswMiwgLyogMHg0MzI2YmJlNCAqLworfTsKK3N0YXRpYyBjb25zdCBmbG9hdCBxUzNbNl0gPSB7CisgIDQuODc1ODg3Mjk4NmUrMDEsIC8qIDB4NDI0MzA5MTYgKi8KKyAgNy4wOTY4OTIwODk4ZSswMiwgLyogMHg0NDMxNmMxYyAqLworICAzLjcwNDE0ODE5MzRlKzAzLCAvKiAweDQ1Njc4MjVmICovCisgIDYuNDYwNDI1MjkzMGUrMDMsIC8qIDB4NDVjOWUzNjcgKi8KKyAgMi41MTYzMzM3NDAyZSswMywgLyogMHg0NTFkNDU1NyAqLworIC0xLjQ5MjQ3NDUxNzhlKzAyLCAvKiAweGMzMTUzZjU5ICovCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgcVIyWzZdID0gey8qIGZvciB4IGluIFsyLjg1NzAsMl09MS9bMC4zNDk5LDAuNV0gKi8KKyAgMS41MDQ0NDQ0OTc5ZS0wNywgLyogMHgzNDIxODlkYiAqLworICA3LjMyMjM0MjY5MzhlLTAyLCAvKiAweDNkOTVmNjJhICovCisgIDEuOTk4MTkxNzE0M2UrMDAsIC8qIDB4M2ZmZmM0YmYgKi8KKyAgMS40NDk1NjAyNjA4ZSswMSwgLyogMHg0MTY3ZWRmZCAqLworICAzLjE2NjYyMzExNTVlKzAxLCAvKiAweDQxZmQ1NDcxICovCisgIDEuNjI1MjcwODQzNWUrMDEsIC8qIDB4NDE4MjA1OGMgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcVMyWzZdID0geworICAzLjAzNjU1ODUzMjdlKzAxLCAvKiAweDQxZjJlY2I4ICovCisgIDIuNjkzNDgxMTQwMWUrMDIsIC8qIDB4NDM4NmFjOGYgKi8KKyAgOC40NDc4Mzc1MjQ0ZSswMiwgLyogMHg0NDUzMzIyOSAqLworICA4LjgyOTM1ODUyMDVlKzAyLCAvKiAweDQ0NWNiYmU1ICovCisgIDIuMTI2NjYzODE4NGUrMDIsIC8qIDB4NDM1NGFhOTggKi8KKyAtNS4zMTA5NTUwNDc2ZSswMCwgLyogMHhjMGE5ZjM1OCAqLworfTsKKworCXN0YXRpYyBmbG9hdCBxemVyb2YoZmxvYXQgeCkKK3sKKwljb25zdCBmbG9hdCAqcCwqcTsKKwlmbG9hdCBzLHIsejsKKwlpbnQzMl90IGl4OworCUdFVF9GTE9BVF9XT1JEKGl4LHgpOworCWl4ICY9IDB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4NDEwMDAwMDApICAgICB7cCA9IHFSODsgcT0gcVM4O30KKwllbHNlIGlmKGl4Pj0weDQwZjcxYzU4KXtwID0gcVI1OyBxPSBxUzU7fQorCWVsc2UgaWYoaXg+PTB4NDAzNmRiNjgpe3AgPSBxUjM7IHE9IHFTMzt9CisJZWxzZSBpZihpeD49MHg0MDAwMDAwMCl7cCA9IHFSMjsgcT0gcVMyO30KKwl6ID0gb25lLyh4KngpOworCXIgPSBwWzBdK3oqKHBbMV0reioocFsyXSt6KihwWzNdK3oqKHBbNF0reipwWzVdKSkpKTsKKwlzID0gb25lK3oqKHFbMF0reioocVsxXSt6KihxWzJdK3oqKHFbM10reioocVs0XSt6KnFbNV0pKSkpKTsKKwlyZXR1cm4gKC0oZmxvYXQpLjEyNSArIHIvcykveDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfajEuYyBiL2xpYm0vc3JjL2VfajEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGJmMjIyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9qMS5jCkBAIC0wLDAgKzEsMzc3IEBACisKKy8qIEAoIyllX2oxLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfajEuYyx2IDEuOCAyMDA1LzAyLzA0IDE4OjI2OjA2IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X2oxKHgpLCBfX2llZWU3NTRfeTEoeCkKKyAqIEJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgZmlyc3QgYW5kIHNlY29uZCBraW5kcyBvZiBvcmRlciB6ZXJvLgorICogTWV0aG9kIC0tIGoxKHgpOgorICoJMS4gRm9yIHRpbnkgeCwgd2UgdXNlIGoxKHgpID0geC8yIC0geF4zLzE2ICsgeF41LzM4NCAtIC4uLgorICoJMi4gUmVkdWNlIHggdG8gfHh8IHNpbmNlIGoxKHgpPS1qMSgteCksICBhbmQKKyAqCSAgIGZvciB4IGluICgwLDIpCisgKgkJajEoeCkgPSB4LzIgKyB4KnoqUjAvUzAsICB3aGVyZSB6ID0geCp4OworICoJICAgKHByZWNpc2lvbjogIHxqMS94IC0gMS8yIC0gUjAvUzAgfDwyKiotNjEuNTEgKQorICoJICAgZm9yIHggaW4gKDIsaW5mKQorICogCQlqMSh4KSA9IHNxcnQoMi8ocGkqeCkpKihwMSh4KSpjb3MoeDEpLXExKHgpKnNpbih4MSkpCisgKiAJCXkxKHgpID0gc3FydCgyLyhwaSp4KSkqKHAxKHgpKnNpbih4MSkrcTEoeCkqY29zKHgxKSkKKyAqIAkgICB3aGVyZSB4MSA9IHgtMypwaS80LiBJdCBpcyBiZXR0ZXIgdG8gY29tcHV0ZSBzaW4oeDEpLGNvcyh4MSkKKyAqCSAgIGFzIGZvbGxvdzoKKyAqCQljb3MoeDEpID0gIGNvcyh4KWNvcygzcGkvNCkrc2luKHgpc2luKDNwaS80KQorICoJCQk9ICAxL3NxcnQoMikgKiAoc2luKHgpIC0gY29zKHgpKQorICoJCXNpbih4MSkgPSAgc2luKHgpY29zKDNwaS80KS1jb3MoeClzaW4oM3BpLzQpCisgKgkJCT0gLTEvc3FydCgyKSAqIChzaW4oeCkgKyBjb3MoeCkpCisgKiAJICAgKFRvIGF2b2lkIGNhbmNlbGxhdGlvbiwgdXNlCisgKgkJc2luKHgpICstIGNvcyh4KSA9IC1jb3MoMngpLyhzaW4oeCkgLSsgY29zKHgpKQorICogCSAgICB0byBjb21wdXRlIHRoZSB3b3JzZSBvbmUuKQorICoJICAgCisgKgkzIFNwZWNpYWwgY2FzZXMKKyAqCQlqMShuYW4pPSBuYW4KKyAqCQlqMSgwKSA9IDAKKyAqCQlqMShpbmYpID0gMAorICoJCQorICogTWV0aG9kIC0tIHkxKHgpOgorICoJMS4gc2NyZWVuIG91dCB4PD0wIGNhc2VzOiB5MSgwKT0taW5mLCB5MSh4PDApPU5hTiAKKyAqCTIuIEZvciB4PDIuCisgKgkgICBTaW5jZSAKKyAqCQl5MSh4KSA9IDIvcGkqKGoxKHgpKihsbih4LzIpK0V1bGVyKS0xL3gteC8yKzUvNjQqeF4zLS4uLikKKyAqCSAgIHRoZXJlZm9yZSB5MSh4KS0yL3BpKmoxKHgpKmxuKHgpLTEveCBpcyBhbiBvZGQgZnVuY3Rpb24uCisgKgkgICBXZSB1c2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiB0byBhcHByb3hpbWF0ZSB5MSwKKyAqCQl5MSh4KSA9IHgqVSh6KS9WKHopICsgKDIvcGkpKihqMSh4KSpsbih4KS0xL3gpLCB6PSB4XjIKKyAqCSAgIHdoZXJlIGZvciB4IGluIFswLDJdIChhYnMgZXJyIGxlc3MgdGhhbiAyKiotNjUuODkpCisgKgkJVSh6KSA9IFUwWzBdICsgVTBbMV0qeiArIC4uLiArIFUwWzRdKnpeNAorICoJCVYoeikgPSAxICArIHYwWzBdKnogKyAuLi4gKyB2MFs0XSp6XjUKKyAqCSAgIE5vdGU6IEZvciB0aW55IHgsIDEveCBkb21pbmF0ZSB5MSBhbmQgaGVuY2UKKyAqCQl5MSh0aW55KSA9IC0yL3BpL3RpbnksIChjaG9vc2UgdGlueTwyKiotNTQpCisgKgkzLiBGb3IgeD49Mi4KKyAqIAkJeTEoeCkgPSBzcXJ0KDIvKHBpKngpKSoocDEoeCkqc2luKHgxKStxMSh4KSpjb3MoeDEpKQorICogCSAgIHdoZXJlIHgxID0geC0zKnBpLzQuIEl0IGlzIGJldHRlciB0byBjb21wdXRlIHNpbih4MSksY29zKHgxKQorICoJICAgYnkgbWV0aG9kIG1lbnRpb25lZCBhYm92ZS4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgZG91YmxlIHBvbmUoZG91YmxlKSwgcW9uZShkb3VibGUpOworCitzdGF0aWMgY29uc3QgZG91YmxlCitodWdlICAgID0gMWUzMDAsCitvbmUJPSAxLjAsCitpbnZzcXJ0cGk9ICA1LjY0MTg5NTgzNTQ3NzU2Mjc5MjgwZS0wMSwgLyogMHgzRkUyMERENywgMHg1MDQyOUI2RCAqLwordHBpICAgICAgPSAgNi4zNjYxOTc3MjM2NzU4MTM4MjQzM2UtMDEsIC8qIDB4M0ZFNDVGMzAsIDB4NkRDOUM4ODMgKi8KKwkvKiBSMC9TMCBvbiBbMCwyXSAqLworcjAwICA9IC02LjI1MDAwMDAwMDAwMDAwMDAwMDAwZS0wMiwgLyogMHhCRkIwMDAwMCwgMHgwMDAwMDAwMCAqLworcjAxICA9ICAxLjQwNzA1NjY2OTU1MTg5NzA2MDQ4ZS0wMywgLyogMHgzRjU3MEQ5RiwgMHg5ODQ3MkM2MSAqLworcjAyICA9IC0xLjU5OTU1NjMxMDg0MDM1NTk3NTIwZS0wNSwgLyogMHhCRUYwQzVDNiwgMHhCQTE2OTY2OCAqLworcjAzICA9ICA0Ljk2NzI3OTk5NjA5NTg0NDQ4NDEyZS0wOCwgLyogMHgzRTZBQUFGQSwgMHg0NkNBMEJEOSAqLworczAxICA9ICAxLjkxNTM3NTk5NTM4MzYzNDYwODA1ZS0wMiwgLyogMHgzRjkzOUQwQiwgMHgxMjYzN0U1MyAqLworczAyICA9ICAxLjg1OTQ2Nzg1NTg4NjMwOTE1NTYwZS0wNCwgLyogMHgzRjI4NUY1NiwgMHhCOUNERjY2NCAqLworczAzICA9ICAxLjE3NzE4NDY0MDQyNjIzNjgzMjYzZS0wNiwgLyogMHgzRUIzQkZGOCwgMHgzMzNGODQ5OCAqLworczA0ICA9ICA1LjA0NjM2MjU3MDc2MjE3MDQyNzE1ZS0wOSwgLyogMHgzRTM1QUM4OCwgMHhDOTdERkYyQyAqLworczA1ICA9ICAxLjIzNTQyMjc0NDI2MTM3OTEzOTA4ZS0xMTsgLyogMHgzREFCMkFDRiwgMHhDRkI5N0VEOCAqLworCitzdGF0aWMgY29uc3QgZG91YmxlIHplcm8gICAgPSAwLjA7CisKK2RvdWJsZQorX19pZWVlNzU0X2oxKGRvdWJsZSB4KQoreworCWRvdWJsZSB6LCBzLGMsc3MsY2Mscix1LHYseTsKKwlpbnQzMl90IGh4LGl4OworCisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4N2ZmMDAwMDApIHJldHVybiBvbmUveDsKKwl5ID0gZmFicyh4KTsKKwlpZihpeCA+PSAweDQwMDAwMDAwKSB7CS8qIHx4fCA+PSAyLjAgKi8KKwkJcyA9IHNpbih5KTsKKwkJYyA9IGNvcyh5KTsKKwkJc3MgPSAtcy1jOworCQljYyA9IHMtYzsKKwkJaWYoaXg8MHg3ZmUwMDAwMCkgeyAgLyogbWFrZSBzdXJlIHkreSBub3Qgb3ZlcmZsb3cgKi8KKwkJICAgIHogPSBjb3MoeSt5KTsKKwkJICAgIGlmICgocypjKT56ZXJvKSBjYyA9IHovc3M7CisJCSAgICBlbHNlIAkgICAgc3MgPSB6L2NjOworCQl9CisJLyoKKwkgKiBqMSh4KSA9IDEvc3FydChwaSkgKiAoUCgxLHgpKmNjIC0gUSgxLHgpKnNzKSAvIHNxcnQoeCkKKwkgKiB5MSh4KSA9IDEvc3FydChwaSkgKiAoUCgxLHgpKnNzICsgUSgxLHgpKmNjKSAvIHNxcnQoeCkKKwkgKi8KKwkJaWYoaXg+MHg0ODAwMDAwMCkgeiA9IChpbnZzcXJ0cGkqY2MpL3NxcnQoeSk7CisJCWVsc2UgeworCQkgICAgdSA9IHBvbmUoeSk7IHYgPSBxb25lKHkpOworCQkgICAgeiA9IGludnNxcnRwaSoodSpjYy12KnNzKS9zcXJ0KHkpOworCQl9CisJCWlmKGh4PDApIHJldHVybiAtejsKKwkJZWxzZSAgCSByZXR1cm4gIHo7CisJfQorCWlmKGl4PDB4M2U0MDAwMDApIHsJLyogfHh8PDIqKi0yNyAqLworCSAgICBpZihodWdlK3g+b25lKSByZXR1cm4gMC41Kng7LyogaW5leGFjdCBpZiB4IT0wIG5lY2Vzc2FyeSAqLworCX0KKwl6ID0geCp4OworCXIgPSAgeioocjAwK3oqKHIwMSt6KihyMDIreipyMDMpKSk7CisJcyA9ICBvbmUreiooczAxK3oqKHMwMit6KihzMDMreiooczA0K3oqczA1KSkpKTsKKwlyICo9IHg7CisJcmV0dXJuKHgqMC41K3Ivcyk7Cit9CisKK3N0YXRpYyBjb25zdCBkb3VibGUgVTBbNV0gPSB7CisgLTEuOTYwNTcwOTA2NDYyMzg5NDA2NjhlLTAxLCAvKiAweEJGQzkxODY2LCAweDE0M0NCQzhBICovCisgIDUuMDQ0Mzg3MTY2Mzk4MTEyODI2MTZlLTAyLCAvKiAweDNGQTlEM0M3LCAweDc2MjkyQ0QxICovCisgLTEuOTEyNTY4OTU4NzU3NjM1NDcyOThlLTAzLCAvKiAweEJGNUY1NUU1LCAweDQ4NDRGNTBGICovCisgIDIuMzUyNTI2MDA1NjE2MTA0OTU5MjhlLTA1LCAvKiAweDNFRjhBQjAzLCAweDhGQTZCODhFICovCisgLTkuMTkwOTkxNTgwMzk4Nzg4NzQ1MDRlLTA4LCAvKiAweEJFNzhBQzAwLCAweDU2OTEwNUI4ICovCit9Oworc3RhdGljIGNvbnN0IGRvdWJsZSBWMFs1XSA9IHsKKyAgMS45OTE2NzMxODIzNjY0OTkwMzk3M2UtMDIsIC8qIDB4M0Y5NDY1MEQsIDB4M0Y0REE5RjAgKi8KKyAgMi4wMjU1MjU4MTAyNTEzNTE3MTQ5NmUtMDQsIC8qIDB4M0YyQThDODksIDB4NkMyNTc3NjQgKi8KKyAgMS4zNTYwODgwMTA5NzUxNjIyOTQwNGUtMDYsIC8qIDB4M0VCNkMwNUEsIDB4ODk0RThDQTYgKi8KKyAgNi4yMjc0MTQ1MjM2NDYyMTUwMTI5NWUtMDksIC8qIDB4M0UzQUJGMUQsIDB4NUJBNjlBODYgKi8KKyAgMS42NjU1OTI0NjIwNzk5MjA3OTExNGUtMTEsIC8qIDB4M0RCMjUwMzksIDB4REFDQTc3MkEgKi8KK307CisKK2RvdWJsZQorX19pZWVlNzU0X3kxKGRvdWJsZSB4KQoreworCWRvdWJsZSB6LCBzLGMsc3MsY2MsdSx2OworCWludDMyX3QgaHgsaXgsbHg7CisKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworICAgICAgICBpeCA9IDB4N2ZmZmZmZmYmaHg7CisgICAgLyogaWYgWTEoTmFOKSBpcyBOYU4sIFkxKC1pbmYpIGlzIE5hTiwgWTEoaW5mKSBpcyAwICovCisJaWYoaXg+PTB4N2ZmMDAwMDApIHJldHVybiAgb25lLyh4K3gqeCk7IAorICAgICAgICBpZigoaXh8bHgpPT0wKSByZXR1cm4gLW9uZS96ZXJvOworICAgICAgICBpZihoeDwwKSByZXR1cm4gemVyby96ZXJvOworICAgICAgICBpZihpeCA+PSAweDQwMDAwMDAwKSB7ICAvKiB8eHwgPj0gMi4wICovCisgICAgICAgICAgICAgICAgcyA9IHNpbih4KTsKKyAgICAgICAgICAgICAgICBjID0gY29zKHgpOworICAgICAgICAgICAgICAgIHNzID0gLXMtYzsKKyAgICAgICAgICAgICAgICBjYyA9IHMtYzsKKyAgICAgICAgICAgICAgICBpZihpeDwweDdmZTAwMDAwKSB7ICAvKiBtYWtlIHN1cmUgeCt4IG5vdCBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgICAgICB6ID0gY29zKHgreCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgocypjKT56ZXJvKSBjYyA9IHovc3M7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICBzcyA9IHovY2M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAvKiB5MSh4KSA9IHNxcnQoMi8ocGkqeCkpKihwMSh4KSpzaW4oeDApK3ExKHgpKmNvcyh4MCkpCisgICAgICAgICAqIHdoZXJlIHgwID0geC0zcGkvNAorICAgICAgICAgKiAgICAgIEJldHRlciBmb3JtdWxhOgorICAgICAgICAgKiAgICAgICAgICAgICAgY29zKHgwKSA9IGNvcyh4KWNvcygzcGkvNCkrc2luKHgpc2luKDNwaS80KQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9ICAxL3NxcnQoMikgKiAoc2luKHgpIC0gY29zKHgpKQorICAgICAgICAgKiAgICAgICAgICAgICAgc2luKHgwKSA9IHNpbih4KWNvcygzcGkvNCktY29zKHgpc2luKDNwaS80KQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IC0xL3NxcnQoMikgKiAoY29zKHgpICsgc2luKHgpKQorICAgICAgICAgKiBUbyBhdm9pZCBjYW5jZWxsYXRpb24sIHVzZQorICAgICAgICAgKiAgICAgICAgICAgICAgc2luKHgpICstIGNvcyh4KSA9IC1jb3MoMngpLyhzaW4oeCkgLSsgY29zKHgpKQorICAgICAgICAgKiB0byBjb21wdXRlIHRoZSB3b3JzZSBvbmUuCisgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmKGl4PjB4NDgwMDAwMDApIHogPSAoaW52c3FydHBpKnNzKS9zcXJ0KHgpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1ID0gcG9uZSh4KTsgdiA9IHFvbmUoeCk7CisgICAgICAgICAgICAgICAgICAgIHogPSBpbnZzcXJ0cGkqKHUqc3MrdipjYykvc3FydCh4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHo7CisgICAgICAgIH0gCisgICAgICAgIGlmKGl4PD0weDNjOTAwMDAwKSB7ICAgIC8qIHggPCAyKiotNTQgKi8KKyAgICAgICAgICAgIHJldHVybigtdHBpL3gpOworICAgICAgICB9IAorICAgICAgICB6ID0geCp4OworICAgICAgICB1ID0gVTBbMF0reiooVTBbMV0reiooVTBbMl0reiooVTBbM10reipVMFs0XSkpKTsKKyAgICAgICAgdiA9IG9uZSt6KihWMFswXSt6KihWMFsxXSt6KihWMFsyXSt6KihWMFszXSt6KlYwWzRdKSkpKTsKKyAgICAgICAgcmV0dXJuKHgqKHUvdikgKyB0cGkqKF9faWVlZTc1NF9qMSh4KSpfX2llZWU3NTRfbG9nKHgpLW9uZS94KSk7Cit9CisKKy8qIEZvciB4ID49IDgsIHRoZSBhc3ltcHRvdGljIGV4cGFuc2lvbnMgb2YgcG9uZSBpcworICoJMSArIDE1LzEyOCBzXjIgLSA0NzI1LzJeMTUgc140IC0gLi4uLAl3aGVyZSBzID0gMS94LgorICogV2UgYXBwcm94aW1hdGUgcG9uZSBieQorICogCXBvbmUoeCkgPSAxICsgKFIvUykKKyAqIHdoZXJlICBSID0gcHIwICsgcHIxKnNeMiArIHByMipzXjQgKyAuLi4gKyBwcjUqc14xMAorICogCSAgUyA9IDEgKyBwczAqc14yICsgLi4uICsgcHM0KnNeMTAKKyAqIGFuZAorICoJfCBwb25lKHgpLTEtUi9TIHwgPD0gMiAgKiogKCAtNjAuMDYpCisgKi8KKworc3RhdGljIGNvbnN0IGRvdWJsZSBwcjhbNl0gPSB7IC8qIGZvciB4IGluIFtpbmYsIDhdPTEvWzAsMC4xMjVdICovCisgIDAuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwLCAvKiAweDAwMDAwMDAwLCAweDAwMDAwMDAwICovCisgIDEuMTcxODc0OTk5OTk5ODg2NDc5NzBlLTAxLCAvKiAweDNGQkRGRkZGLCAweEZGRkZGQ0NFICovCisgIDEuMzIzOTQ4MDY1OTMwNzM1NzUxMjllKzAxLCAvKiAweDQwMkE3QTlELCAweDM1N0Y3RkNFICovCisgIDQuMTIwNTE4NTQzMDczNzg1NjIyMjVlKzAyLCAvKiAweDQwNzlDMEQ0LCAweDY1MkVBNTkwICovCisgIDMuODc0NzQ1Mzg5MTM5NjA1MzIyMjdlKzAzLCAvKiAweDQwQUU0NTdELCAweEEzQTUzMkNDICovCisgIDcuOTE0NDc5NTQwMzE4OTE3MzE1NzRlKzAzLCAvKiAweDQwQkVFQTdBLCAweEMzMjc4MkREICovCit9Oworc3RhdGljIGNvbnN0IGRvdWJsZSBwczhbNV0gPSB7CisgIDEuMTQyMDczNzAzNzU2Nzg0MDg0MzZlKzAyLCAvKiAweDQwNUM4RDQ1LCAweDhFNjU2Q0FDICovCisgIDMuNjUwOTMwODM0MjA4NTM0NjMzOTRlKzAzLCAvKiAweDQwQUM4NURDLCAweDk2NEQyNzRGICovCisgIDMuNjk1NjIwNjAyNjkwMzM0NjM1NTVlKzA0LCAvKiAweDQwRTIwQjg2LCAweDk3QzVCQjdGICovCisgIDkuNzYwMjc5MzU5MzQ5NTA4MDEzMTFlKzA0LCAvKiAweDQwRjdENDJDLCAweEIyOEYxN0JCICovCisgIDMuMDgwNDI3MjA2Mjc4ODg4MTE1NzhlKzA0LCAvKiAweDQwREUxNTExLCAweDY5N0EwQjJEICovCit9OworCitzdGF0aWMgY29uc3QgZG91YmxlIHByNVs2XSA9IHsgLyogZm9yIHggaW4gWzgsNC41NDU0XT0xL1swLjEyNSwwLjIyMDAxXSAqLworICAxLjMxOTkwNTE5NTU2MjQzNTIyNzQ5ZS0xMSwgLyogMHgzREFEMDY2NywgMHhEQUUxQ0E3RCAqLworICAxLjE3MTg3NDkzMTkwNjE0MDk3NjM4ZS0wMSwgLyogMHgzRkJERkZGRiwgMHhFMkMxMDA0MyAqLworICA2LjgwMjc1MTI3ODY4NDMyODcxNzM2ZSswMCwgLyogMHg0MDFCMzYwNCwgMHg2RTYzMTVFMyAqLworICAxLjA4MzA4MTgyOTkwMTg5MTA5NzczZSswMiwgLyogMHg0MDVCMTNCOSwgMHg0NTI2MDJFRCAqLworICA1LjE3NjM2MTM5NTMzMTk5NzUyODA1ZSswMiwgLyogMHg0MDgwMkQxNiwgMHhEMDUyRDY0OSAqLworICA1LjI4NzE1MjAxMzYzMzM3NTQxODA3ZSswMiwgLyogMHg0MDgwODVCOCwgMHhCQjdFMENCNyAqLworfTsKK3N0YXRpYyBjb25zdCBkb3VibGUgcHM1WzVdID0geworICA1LjkyODA1OTg3MjIxMTMxMzMxOTIxZSswMSwgLyogMHg0MDREQTNFQSwgMHhBOEFGNjMzRCAqLworICA5LjkxNDAxNDE4NzMzNjE0Mzc3NzQzZSswMiwgLyogMHg0MDhFRkIzNiwgMHgxQjA2NjcwMSAqLworICA1LjM1MzI2Njk1MjkxNDg3OTc2NjQ3ZSswMywgLyogMHg0MEI0RTk0NCwgMHg1NzA2QjZGQiAqLworICA3Ljg0NDY5MDMxNzQ5NTUxMjMxNzY5ZSswMywgLyogMHg0MEJFQTRCMCwgMHhCOEE1QkIxNSAqLworICAxLjUwNDA0Njg4ODEwMzYxMDYyNjc5ZSswMywgLyogMHg0MDk3ODAzMCwgMHgwMzZGNUU1MSAqLworfTsKKworc3RhdGljIGNvbnN0IGRvdWJsZSBwcjNbNl0gPSB7CisgIDMuMDI1MDM5MTYxMzczNzM2MTgwMjRlLTA5LCAvKiAweDNFMjlGQzIxLCAweEE3QUQ5RUREICovCisgIDEuMTcxODY4NjU1NjcyNTM1OTI0OTFlLTAxLCAvKiAweDNGQkRGRkY1LCAweDVCMjFEMTdCICovCisgIDMuOTMyOTc3NTAwMzMzMTU2NDA2NTBlKzAwLCAvKiAweDQwMEY3NkJDLCAweEU4NUVBRDhBICovCisgIDMuNTExOTQwMzU1OTE2MzY5MzI3MzZlKzAxLCAvKiAweDQwNDE4RjQ4LCAweDlEQTZEMTI5ICovCisgIDkuMTA1NTAxMTA3NTA3ODEyNzE5MThlKzAxLCAvKiAweDQwNTZDMzg1LCAweDREMkMxODM3ICovCisgIDQuODU1OTA2ODUxOTczNjQ5MTk2NDVlKzAxLCAvKiAweDQwNDg0NzhGLCAweDhFQTgzRUU1ICovCit9Oworc3RhdGljIGNvbnN0IGRvdWJsZSBwczNbNV0gPSB7CisgIDMuNDc5MTMwOTUwMDEyNTE1MTk5ODllKzAxLCAvKiAweDQwNDE2NTQ5LCAweEExMzQwNjlDICovCisgIDMuMzY3NjI0NTg3NDc4MjU3NDY3NDFlKzAyLCAvKiAweDQwNzUwQzMzLCAweDA3RjFBNzVGICovCisgIDEuMDQ2ODcxMzk5NzU3NzUxMzA1NTFlKzAzLCAvKiAweDQwOTA1QjdDLCAweDUwMzdENTIzICovCisgIDguOTA4MTEzNDYzOTgyNTY0MzI2MjJlKzAyLCAvKiAweDQwOEJENjdELCAweEEzMkUzMUU5ICovCisgIDEuMDM3ODc5MzI0Mzk2MzkyNzc1MDRlKzAyLCAvKiAweDQwNTlGMjZELCAweDdDMkVFRDUzICovCit9OworCitzdGF0aWMgY29uc3QgZG91YmxlIHByMls2XSA9IHsvKiBmb3IgeCBpbiBbMi44NTcwLDJdPTEvWzAuMzQ5OSwwLjVdICovCisgIDEuMDc3MTA4MzAxMDY4NzM3NDMwODJlLTA3LCAvKiAweDNFN0NFOUQ0LCAweEY2NTU0NEY0ICovCisgIDEuMTcxNzYyMTk0NjI2ODMzNDgwOTRlLTAxLCAvKiAweDNGQkRGRjQyLCAweEJFNzYwRDgzICovCisgIDIuMzY4NTE0OTY2Njc2MDg3ODUxNzRlKzAwLCAvKiAweDQwMDJGMkI3LCAweEY5OEZBRUMwICovCisgIDEuMjI0MjYxMDkxNDgyNjEyMzI5MTdlKzAxLCAvKiAweDQwMjg3QzM3LCAweDdGNzFBOTY0ICovCisgIDEuNzY5Mzk3MTEyNzE2ODc3MjczOTBlKzAxLCAvKiAweDQwMzFCMUE4LCAweDE3N0Y4RUUyICovCisgIDUuMDczNTIzMTI1ODg4MTg0OTkyNTBlKzAwLCAvKiAweDQwMTQ0QjQ5LCAweEE1NzRDMUZFICovCit9Oworc3RhdGljIGNvbnN0IGRvdWJsZSBwczJbNV0gPSB7CisgIDIuMTQzNjQ4NTkzNjM4MjE0MDk0ODhlKzAxLCAvKiAweDQwMzU2RkJELCAweDhBRDVFQ0RDICovCisgIDEuMjUyOTAyMjcxNjg0MDI3NTEwOTBlKzAyLCAvKiAweDQwNUY1MjkzLCAweDE0RjkyQ0Q1ICovCisgIDIuMzIyNzY0NjkwNTcxNjI4MTM2NjllKzAyLCAvKiAweDQwNkQwOEQ4LCAweEQ1QTJEQkQ5ICovCisgIDEuMTc2NzkzNzMyODcxNDcxMDA3NjhlKzAyLCAvKiAweDQwNUQ2QjdBLCAweERBMTg4NEE5ICovCisgIDguMzY0NjM4OTMzNzE2MTgyODMzNjhlKzAwLCAvKiAweDQwMjBCQUIxLCAweEY0NEU1MTkyICovCit9OworCisJc3RhdGljIGRvdWJsZSBwb25lKGRvdWJsZSB4KQoreworCWNvbnN0IGRvdWJsZSAqcCwqcTsKKwlkb3VibGUgeixyLHM7CisgICAgICAgIGludDMyX3QgaXg7CisJR0VUX0hJR0hfV09SRChpeCx4KTsKKwlpeCAmPSAweDdmZmZmZmZmOworICAgICAgICBpZihpeD49MHg0MDIwMDAwMCkgICAgIHtwID0gcHI4OyBxPSBwczg7fQorICAgICAgICBlbHNlIGlmKGl4Pj0weDQwMTIyRThCKXtwID0gcHI1OyBxPSBwczU7fQorICAgICAgICBlbHNlIGlmKGl4Pj0weDQwMDZEQjZEKXtwID0gcHIzOyBxPSBwczM7fQorICAgICAgICBlbHNlIGlmKGl4Pj0weDQwMDAwMDAwKXtwID0gcHIyOyBxPSBwczI7fQorICAgICAgICB6ID0gb25lLyh4KngpOworICAgICAgICByID0gcFswXSt6KihwWzFdK3oqKHBbMl0reioocFszXSt6KihwWzRdK3oqcFs1XSkpKSk7CisgICAgICAgIHMgPSBvbmUreioocVswXSt6KihxWzFdK3oqKHFbMl0reioocVszXSt6KnFbNF0pKSkpOworICAgICAgICByZXR1cm4gb25lKyByL3M7Cit9CisJCQorCisvKiBGb3IgeCA+PSA4LCB0aGUgYXN5bXB0b3RpYyBleHBhbnNpb25zIG9mIHFvbmUgaXMKKyAqCTMvOCBzIC0gMTA1LzEwMjQgc14zIC0gLi4uLCB3aGVyZSBzID0gMS94LgorICogV2UgYXBwcm94aW1hdGUgcG9uZSBieQorICogCXFvbmUoeCkgPSBzKigwLjM3NSArIChSL1MpKQorICogd2hlcmUgIFIgPSBxcjEqc14yICsgcXIyKnNeNCArIC4uLiArIHFyNSpzXjEwCisgKiAJICBTID0gMSArIHFzMSpzXjIgKyAuLi4gKyBxczYqc14xMgorICogYW5kCisgKgl8IHFvbmUoeCkvcyAtMC4zNzUtUi9TIHwgPD0gMiAgKiogKCAtNjEuMTMpCisgKi8KKworc3RhdGljIGNvbnN0IGRvdWJsZSBxcjhbNl0gPSB7IC8qIGZvciB4IGluIFtpbmYsIDhdPTEvWzAsMC4xMjVdICovCisgIDAuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwLCAvKiAweDAwMDAwMDAwLCAweDAwMDAwMDAwICovCisgLTEuMDI1MzkwNjI0OTk5OTI3MTQxNjFlLTAxLCAvKiAweEJGQkEzRkZGLCAweEZGRkZGREYzICovCisgLTEuNjI3MTc1MzQ1NDQ1ODk5ODc4ODhlKzAxLCAvKiAweEMwMzA0NTkxLCAweEEyNjc3OUY3ICovCisgLTcuNTk2MDE3MjI1MTM5NTAxMDc4OTZlKzAyLCAvKiAweEMwODdCQ0QwLCAweDUzRTRCNTc2ICovCisgLTEuMTg0OTgwNjY3MDI0Mjk1ODcxNjdlKzA0LCAvKiAweEMwQzcyNEU3LCAweDQwRjg3NDE1ICovCisgLTQuODQzODUxMjQyODU3NTAzNTMwMTBlKzA0LCAvKiAweEMwRTdBNkQwLCAweDY1RDA5QzZBICovCit9Oworc3RhdGljIGNvbnN0IGRvdWJsZSBxczhbNl0gPSB7CisgIDEuNjEzOTUzNjk3MDA3MjI5MDk1NTZlKzAyLCAvKiAweDQwNjQyQ0E2LCAweERFNUJDREU1ICovCisgIDcuODI1Mzg1OTk5MjMzNDg0NjUzODFlKzAzLCAvKiAweDQwQkU5MTYyLCAweEQwRDg4NDE5ICovCisgIDEuMzM4NzUzMzYyODcyNDk1NzgxNjNlKzA1LCAvKiAweDQxMDA1NzlBLCAweEIwQjc1RTk4ICovCisgIDcuMTk2NTc3MjM2ODMyNDA5Mzk4NjNlKzA1LCAvKiAweDQxMjVGNjUzLCAweDcyODY5QzE5ICovCisgIDYuNjY2MDEyMzI2MTc3NzYzNzUyNjRlKzA1LCAvKiAweDQxMjQ1N0QyLCAweDc3MTlBRDVDICovCisgLTIuOTQ0OTAyNjQzMDM4MzQ2NDMyMTVlKzA1LCAvKiAweEMxMTFGOTY5LCAweDBFQTVBQTE4ICovCit9OworCitzdGF0aWMgY29uc3QgZG91YmxlIHFyNVs2XSA9IHsgLyogZm9yIHggaW4gWzgsNC41NDU0XT0xL1swLjEyNSwwLjIyMDAxXSAqLworIC0yLjA4OTc5OTMxMTQxNzY0MTA0Mjk3ZS0xMSwgLyogMHhCREI2RkE0MywgMHgxQUExQTA5OCAqLworIC0xLjAyNTM5MDUwMjQxMzc1NDI2MjMxZS0wMSwgLyogMHhCRkJBM0ZGRiwgMHhDQjU5N0ZFRiAqLworIC04LjA1NjQ0ODI4MTIzOTM2MDI5ODQwZSswMCwgLyogMHhDMDIwMUNFNiwgMHhDQTAzQUQ0QiAqLworIC0xLjgzNjY5NjA3NDc0ODg4MzgwMjM5ZSswMiwgLyogMHhDMDY2RjU2RCwgMHg2Q0E3QjlCMCAqLworIC0xLjM3MzE5Mzc2MDY1NTA4MTYzMjY1ZSswMywgLyogMHhDMDk1NzRDNiwgMHg2OTMxNzM0RiAqLworIC0yLjYxMjQ0NDQwNDUzMjE1NjU2ODE3ZSswMywgLyogMHhDMEE0NjhFMywgMHg4OEZEQTc5RCAqLworfTsKK3N0YXRpYyBjb25zdCBkb3VibGUgcXM1WzZdID0geworICA4LjEyNzY1NTAxMzg0MzM1Nzc3ODU3ZSswMSwgLyogMHg0MDU0NTFCMiwgMHhGRjVBMTFCMiAqLworICAxLjk5MTc5ODczNDYwNDg1OTY0NjQyZSswMywgLyogMHg0MDlGMUYzMSwgMHhFNzdCRjgzOSAqLworICAxLjc0Njg0ODUxOTI0OTA4OTA3Njc3ZSswNCwgLyogMHg0MEQxMEYxRiwgMHgwRDY0Q0UyOSAqLworICA0Ljk4NTE0MjcwOTEwMzUyMjc5MzE2ZSswNCwgLyogMHg0MEU4NTc2RCwgMHhBQUJBRDE5NyAqLworICAyLjc5NDgwNzUxNjM4OTE4MTE4MjYwZSswNCwgLyogMHg0MERCNEIwNCwgMHhDRjdDMzY0QiAqLworIC00LjcxOTE4MzU0Nzk1MTI4NDcwODY5ZSswMywgLyogMHhDMEIyNkYyRSwgMHhGQ0ZGQTAwNCAqLworfTsKKworc3RhdGljIGNvbnN0IGRvdWJsZSBxcjNbNl0gPSB7CisgLTUuMDc4MzEyMjY0NjE3NjY1NjEzNjllLTA5LCAvKiAweEJFMzVDRkE5LCAweEQzOEZDODRGICovCisgLTEuMDI1Mzc4Mjk4MjA4MzcwODk3NDVlLTAxLCAvKiAweEJGQkEzRkVCLCAweDUxQUVFRDU0ICovCisgLTQuNjEwMTE1ODExMzk0NzM0MDMxMTNlKzAwLCAvKiAweEMwMTI3MEMyLCAweDMzMDJEOUZGICovCisgLTUuNzg0NzIyMTY1NjI3ODM2NDMyMTJlKzAxLCAvKiAweEMwNENFQzcxLCAweEMyNUQxNkRBICovCisgLTIuMjgyNDQ1NDA3Mzc2MzE2OTUwMzhlKzAyLCAvKiAweEMwNkM4N0QzLCAweDQ3MThENTVGICovCisgLTIuMTkyMTAxMjg0Nzg5MDkzMjU2MjJlKzAyLCAvKiAweEMwNkI2NkI5LCAweDVGNUMxQkY2ICovCit9Oworc3RhdGljIGNvbnN0IGRvdWJsZSBxczNbNl0gPSB7CisgIDQuNzY2NTE1NTAzMjM3Mjk1MDkyNzNlKzAxLCAvKiAweDQwNDdENTIzLCAweENDRDM2N0U0ICovCisgIDYuNzM4NjUxMTI2NzY2OTk3MDk0ODJlKzAyLCAvKiAweDQwODUwRUVCLCAweEMwMzFFRTNFICovCisgIDMuMzgwMTUyODY2Nzk1MjYzNDM1MDVlKzAzLCAvKiAweDQwQUE2ODRFLCAweDQ0OEU3QzlBICovCisgIDUuNTQ3NzI5MDk3MjA3MjI3ODIzNjdlKzAzLCAvKiAweDQwQjVBQkJBLCAweEE2MUQ1NEE2ICovCisgIDEuOTAzMTE5MTkzMzg4MTA3OTg3NjNlKzAzLCAvKiAweDQwOURCQzdBLCAweDBERDRERjRCICovCisgLTEuMzUyMDExOTE0NDQzMDczNDA4MTdlKzAyLCAvKiAweEMwNjBFNjcwLCAweDI5MEEzMTFGICovCit9OworCitzdGF0aWMgY29uc3QgZG91YmxlIHFyMls2XSA9IHsvKiBmb3IgeCBpbiBbMi44NTcwLDJdPTEvWzAuMzQ5OSwwLjVdICovCisgLTEuNzgzODE3Mjc1MTA5NTg4NjU1NzJlLTA3LCAvKiAweEJFODdGMTI2LCAweDQ0QzYyNkQyICovCisgLTEuMDI1MTcwNDI2MDc5ODU1NTM0NjBlLTAxLCAvKiAweEJGQkEzRThFLCAweDkxNDhCMDEwICovCisgLTIuNzUyMjA1NjgyNzgxODc0NjA3MjBlKzAwLCAvKiAweEMwMDYwNDg0LCAweDY5QkI0RURBICovCisgLTEuOTY2MzYxNjI2NDM3MDM3MjAyMjFlKzAxLCAvKiAweEMwMzNBOUUyLCAweEMxNjg5MDdGICovCisgLTQuMjMyNTMxMzMzNzI4MzA0OTAwODllKzAxLCAvKiAweEMwNDUyOUEzLCAweERFMTA0QUFBICovCisgLTIuMTM3MTkyMTE3MDM3MDQwNjE3MzNlKzAxLCAvKiAweEMwMzU1RjM2LCAweDM5Q0Y2RTUyICovCit9Oworc3RhdGljIGNvbnN0IGRvdWJsZSBxczJbNl0gPSB7CisgIDIuOTUzMzM2MjkwNjA1MjM4NTQ1NDhlKzAxLCAvKiAweDQwM0Q4ODhBLCAweDc4QUU2NEZGICovCisgIDIuNTI5ODE1NDk5ODIxOTA1MjkxMzZlKzAyLCAvKiAweDQwNkY5RjY4LCAweERCODIxQ0JBICovCisgIDcuNTc1MDI4MzQ4Njg2NDU0MzY0NzJlKzAyLCAvKiAweDQwODdBQzA1LCAweENFNDlBMEY3ICovCisgIDcuMzkzOTMyMDUzMjA0NjcyNDU2NTZlKzAyLCAvKiAweDQwODcxQjI1LCAweDQ4RDRDMDI5ICovCisgIDEuNTU5NDkwMDMzMzY2NjYxMjM2ODdlKzAyLCAvKiAweDQwNjM3RTVFLCAweDNDM0VEOEQ0ICovCisgLTQuOTU5NDk4OTg4MjI2MjgyMTAxMjdlKzAwLCAvKiAweEMwMTNENjg2LCAweEU3MUJFODZCICovCit9OworCisJc3RhdGljIGRvdWJsZSBxb25lKGRvdWJsZSB4KQoreworCWNvbnN0IGRvdWJsZSAqcCwqcTsKKwlkb3VibGUgIHMscix6OworCWludDMyX3QgaXg7CisJR0VUX0hJR0hfV09SRChpeCx4KTsKKwlpeCAmPSAweDdmZmZmZmZmOworCWlmKGl4Pj0weDQwMjAwMDAwKSAgICAge3AgPSBxcjg7IHE9IHFzODt9CisJZWxzZSBpZihpeD49MHg0MDEyMkU4Qil7cCA9IHFyNTsgcT0gcXM1O30KKwllbHNlIGlmKGl4Pj0weDQwMDZEQjZEKXtwID0gcXIzOyBxPSBxczM7fQorCWVsc2UgaWYoaXg+PTB4NDAwMDAwMDApe3AgPSBxcjI7IHE9IHFzMjt9CisJeiA9IG9uZS8oeCp4KTsKKwlyID0gcFswXSt6KihwWzFdK3oqKHBbMl0reioocFszXSt6KihwWzRdK3oqcFs1XSkpKSk7CisJcyA9IG9uZSt6KihxWzBdK3oqKHFbMV0reioocVsyXSt6KihxWzNdK3oqKHFbNF0reipxWzVdKSkpKSk7CisJcmV0dXJuICguMzc1ICsgci9zKS94OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9qMWYuYyBiL2xpYm0vc3JjL2VfajFmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM5Mzk5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfajFmLmMKQEAgLTAsMCArMSwzMzQgQEAKKy8qIGVfajFmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2oxLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2oxZi5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgZmxvYXQgcG9uZWYoZmxvYXQpLCBxb25lZihmbG9hdCk7CisKK3N0YXRpYyBjb25zdCBmbG9hdAoraHVnZSAgICA9IDFlMzAsCitvbmUJPSAxLjAsCitpbnZzcXJ0cGk9ICA1LjY0MTg5NjEyODdlLTAxLCAvKiAweDNmMTA2ZWJiICovCit0cGkgICAgICA9ICA2LjM2NjE5NzQ2NjllLTAxLCAvKiAweDNmMjJmOTgzICovCisJLyogUjAvUzAgb24gWzAsMl0gKi8KK3IwMCAgPSAtNi4yNTAwMDAwMDAwZS0wMiwgLyogMHhiZDgwMDAwMCAqLworcjAxICA9ICAxLjQwNzA1NjY5NzZlLTAzLCAvKiAweDNhYjg2Y2ZkICovCityMDIgID0gLTEuNTk5NTU2MzQ0NGUtMDUsIC8qIDB4Yjc4NjJlMzYgKi8KK3IwMyAgPSAgNC45NjcyNzk5MjA3ZS0wOCwgLyogMHgzMzU1NTdkMiAqLworczAxICA9ICAxLjkxNTM3NjA3NDZlLTAyLCAvKiAweDNjOWNlODU5ICovCitzMDIgID0gIDEuODU5NDY3ODg0MWUtMDQsIC8qIDB4Mzk0MmZhYjYgKi8KK3MwMyAgPSAgMS4xNzcxODQ2ODU3ZS0wNiwgLyogMHgzNTlkZmZjMiAqLworczA0ICA9ICA1LjA0NjM2MjQzOTBlLTA5LCAvKiAweDMxYWQ2NDQ2ICovCitzMDUgID0gIDEuMjM1NDIyNzAxNmUtMTE7IC8qIDB4MmQ1OTU2N2UgKi8KKworc3RhdGljIGNvbnN0IGZsb2F0IHplcm8gICAgPSAwLjA7CisKK2Zsb2F0CitfX2llZWU3NTRfajFmKGZsb2F0IHgpCit7CisJZmxvYXQgeiwgcyxjLHNzLGNjLHIsdSx2LHk7CisJaW50MzJfdCBoeCxpeDsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg3ZjgwMDAwMCkgcmV0dXJuIG9uZS94OworCXkgPSBmYWJzZih4KTsKKwlpZihpeCA+PSAweDQwMDAwMDAwKSB7CS8qIHx4fCA+PSAyLjAgKi8KKwkJcyA9IHNpbmYoeSk7CisJCWMgPSBjb3NmKHkpOworCQlzcyA9IC1zLWM7CisJCWNjID0gcy1jOworCQlpZihpeDwweDdmMDAwMDAwKSB7ICAvKiBtYWtlIHN1cmUgeSt5IG5vdCBvdmVyZmxvdyAqLworCQkgICAgeiA9IGNvc2YoeSt5KTsKKwkJICAgIGlmICgocypjKT56ZXJvKSBjYyA9IHovc3M7CisJCSAgICBlbHNlIAkgICAgc3MgPSB6L2NjOworCQl9CisJLyoKKwkgKiBqMSh4KSA9IDEvc3FydChwaSkgKiAoUCgxLHgpKmNjIC0gUSgxLHgpKnNzKSAvIHNxcnQoeCkKKwkgKiB5MSh4KSA9IDEvc3FydChwaSkgKiAoUCgxLHgpKnNzICsgUSgxLHgpKmNjKSAvIHNxcnQoeCkKKwkgKi8KKwkJaWYoaXg+MHg4MDAwMDAwMCkgeiA9IChpbnZzcXJ0cGkqY2MpL3NxcnRmKHkpOworCQllbHNlIHsKKwkJICAgIHUgPSBwb25lZih5KTsgdiA9IHFvbmVmKHkpOworCQkgICAgeiA9IGludnNxcnRwaSoodSpjYy12KnNzKS9zcXJ0Zih5KTsKKwkJfQorCQlpZihoeDwwKSByZXR1cm4gLXo7CisJCWVsc2UgIAkgcmV0dXJuICB6OworCX0KKwlpZihpeDwweDMyMDAwMDAwKSB7CS8qIHx4fDwyKiotMjcgKi8KKwkgICAgaWYoaHVnZSt4Pm9uZSkgcmV0dXJuIChmbG9hdCkwLjUqeDsvKiBpbmV4YWN0IGlmIHghPTAgbmVjZXNzYXJ5ICovCisJfQorCXogPSB4Kng7CisJciA9ICB6KihyMDAreioocjAxK3oqKHIwMit6KnIwMykpKTsKKwlzID0gIG9uZSt6KihzMDEreiooczAyK3oqKHMwMyt6KihzMDQreipzMDUpKSkpOworCXIgKj0geDsKKwlyZXR1cm4oeCooZmxvYXQpMC41K3Ivcyk7Cit9CisKK3N0YXRpYyBjb25zdCBmbG9hdCBVMFs1XSA9IHsKKyAtMS45NjA1NzA5NjEyZS0wMSwgLyogMHhiZTQ4YzMzMSAqLworICA1LjA0NDM4NzI4MDllLTAyLCAvKiAweDNkNGU5ZTNjICovCisgLTEuOTEyNTY4OTI4N2UtMDMsIC8qIDB4YmFmYWFmMmEgKi8KKyAgMi4zNTI1MjU5MTY2ZS0wNSwgLyogMHgzN2M1NTgxYyAqLworIC05LjE5MDk5MTc4OTllLTA4LCAvKiAweGIzYzU2MDAzICovCit9Oworc3RhdGljIGNvbnN0IGZsb2F0IFYwWzVdID0geworICAxLjk5MTY3MzE4NjRlLTAyLCAvKiAweDNjYTMyODZhICovCisgIDIuMDI1NTI1NzU1MGUtMDQsIC8qIDB4Mzk1NDY0NGIgKi8KKyAgMS4zNTYwODc5Nzc5ZS0wNiwgLyogMHgzNWI2MDJkNCAqLworICA2LjIyNzQxNDU4NDBlLTA5LCAvKiAweDMxZDVmOGViICovCisgIDEuNjY1NTkyNDkwM2UtMTEsIC8qIDB4MmQ5MjgxY2YgKi8KK307CisKK2Zsb2F0CitfX2llZWU3NTRfeTFmKGZsb2F0IHgpCit7CisJZmxvYXQgeiwgcyxjLHNzLGNjLHUsdjsKKwlpbnQzMl90IGh4LGl4OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisgICAgICAgIGl4ID0gMHg3ZmZmZmZmZiZoeDsKKyAgICAvKiBpZiBZMShOYU4pIGlzIE5hTiwgWTEoLWluZikgaXMgTmFOLCBZMShpbmYpIGlzIDAgKi8KKwlpZihpeD49MHg3ZjgwMDAwMCkgcmV0dXJuICBvbmUvKHgreCp4KTsKKyAgICAgICAgaWYoaXg9PTApIHJldHVybiAtb25lL3plcm87CisgICAgICAgIGlmKGh4PDApIHJldHVybiB6ZXJvL3plcm87CisgICAgICAgIGlmKGl4ID49IDB4NDAwMDAwMDApIHsgIC8qIHx4fCA+PSAyLjAgKi8KKyAgICAgICAgICAgICAgICBzID0gc2luZih4KTsKKyAgICAgICAgICAgICAgICBjID0gY29zZih4KTsKKyAgICAgICAgICAgICAgICBzcyA9IC1zLWM7CisgICAgICAgICAgICAgICAgY2MgPSBzLWM7CisgICAgICAgICAgICAgICAgaWYoaXg8MHg3ZjAwMDAwMCkgeyAgLyogbWFrZSBzdXJlIHgreCBub3Qgb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgeiA9IGNvc2YoeCt4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzKmMpPnplcm8pIGNjID0gei9zczsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgIHNzID0gei9jYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIC8qIHkxKHgpID0gc3FydCgyLyhwaSp4KSkqKHAxKHgpKnNpbih4MCkrcTEoeCkqY29zKHgwKSkKKyAgICAgICAgICogd2hlcmUgeDAgPSB4LTNwaS80CisgICAgICAgICAqICAgICAgQmV0dGVyIGZvcm11bGE6CisgICAgICAgICAqICAgICAgICAgICAgICBjb3MoeDApID0gY29zKHgpY29zKDNwaS80KStzaW4oeClzaW4oM3BpLzQpCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gIDEvc3FydCgyKSAqIChzaW4oeCkgLSBjb3MoeCkpCisgICAgICAgICAqICAgICAgICAgICAgICBzaW4oeDApID0gc2luKHgpY29zKDNwaS80KS1jb3MoeClzaW4oM3BpLzQpCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gLTEvc3FydCgyKSAqIChjb3MoeCkgKyBzaW4oeCkpCisgICAgICAgICAqIFRvIGF2b2lkIGNhbmNlbGxhdGlvbiwgdXNlCisgICAgICAgICAqICAgICAgICAgICAgICBzaW4oeCkgKy0gY29zKHgpID0gLWNvcygyeCkvKHNpbih4KSAtKyBjb3MoeCkpCisgICAgICAgICAqIHRvIGNvbXB1dGUgdGhlIHdvcnNlIG9uZS4KKyAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYoaXg+MHg0ODAwMDAwMCkgeiA9IChpbnZzcXJ0cGkqc3MpL3NxcnRmKHgpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1ID0gcG9uZWYoeCk7IHYgPSBxb25lZih4KTsKKyAgICAgICAgICAgICAgICAgICAgeiA9IGludnNxcnRwaSoodSpzcyt2KmNjKS9zcXJ0Zih4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHo7CisgICAgICAgIH0KKyAgICAgICAgaWYoaXg8PTB4MjQ4MDAwMDApIHsgICAgLyogeCA8IDIqKi01NCAqLworICAgICAgICAgICAgcmV0dXJuKC10cGkveCk7CisgICAgICAgIH0KKyAgICAgICAgeiA9IHgqeDsKKyAgICAgICAgdSA9IFUwWzBdK3oqKFUwWzFdK3oqKFUwWzJdK3oqKFUwWzNdK3oqVTBbNF0pKSk7CisgICAgICAgIHYgPSBvbmUreiooVjBbMF0reiooVjBbMV0reiooVjBbMl0reiooVjBbM10reipWMFs0XSkpKSk7CisgICAgICAgIHJldHVybih4Kih1L3YpICsgdHBpKihfX2llZWU3NTRfajFmKHgpKl9faWVlZTc1NF9sb2dmKHgpLW9uZS94KSk7Cit9CisKKy8qIEZvciB4ID49IDgsIHRoZSBhc3ltcHRvdGljIGV4cGFuc2lvbnMgb2YgcG9uZSBpcworICoJMSArIDE1LzEyOCBzXjIgLSA0NzI1LzJeMTUgc140IC0gLi4uLAl3aGVyZSBzID0gMS94LgorICogV2UgYXBwcm94aW1hdGUgcG9uZSBieQorICogCXBvbmUoeCkgPSAxICsgKFIvUykKKyAqIHdoZXJlICBSID0gcHIwICsgcHIxKnNeMiArIHByMipzXjQgKyAuLi4gKyBwcjUqc14xMAorICogCSAgUyA9IDEgKyBwczAqc14yICsgLi4uICsgcHM0KnNeMTAKKyAqIGFuZAorICoJfCBwb25lKHgpLTEtUi9TIHwgPD0gMiAgKiogKCAtNjAuMDYpCisgKi8KKworc3RhdGljIGNvbnN0IGZsb2F0IHByOFs2XSA9IHsgLyogZm9yIHggaW4gW2luZiwgOF09MS9bMCwwLjEyNV0gKi8KKyAgMC4wMDAwMDAwMDAwZSswMCwgLyogMHgwMDAwMDAwMCAqLworICAxLjE3MTg3NTAwMDBlLTAxLCAvKiAweDNkZjAwMDAwICovCisgIDEuMzIzOTQ4MDk3MmUrMDEsIC8qIDB4NDE1M2Q0ZWEgKi8KKyAgNC4xMjA1MTg0OTM3ZSswMiwgLyogMHg0M2NlMDZhMyAqLworICAzLjg3NDc0NTM2MTNlKzAzLCAvKiAweDQ1NzIyYmVkICovCisgIDcuOTE0NDc5NDkyMmUrMDMsIC8qIDB4NDVmNzUzZDYgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcHM4WzVdID0geworICAxLjE0MjA3MzY2OTRlKzAyLCAvKiAweDQyZTQ2YTJjICovCisgIDMuNjUwOTMwOTA4MmUrMDMsIC8qIDB4NDU2NDJlZTUgKi8KKyAgMy42OTU2MjA3MDMxZSswNCwgLyogMHg0NzEwNWMzNSAqLworICA5Ljc2MDI3OTY4NzVlKzA0LCAvKiAweDQ3YmVhMTY2ICovCisgIDMuMDgwNDI3MTQ4NGUrMDQsIC8qIDB4NDZmMGE4OGIgKi8KK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBwcjVbNl0gPSB7IC8qIGZvciB4IGluIFs4LDQuNTQ1NF09MS9bMC4xMjUsMC4yMjAwMV0gKi8KKyAgMS4zMTk5MDUyMDk0ZS0xMSwgLyogMHgyZDY4MzMzZiAqLworICAxLjE3MTg3NDkyNTVlLTAxLCAvKiAweDNkZWZmZmZmICovCisgIDYuODAyNzUxMDY0M2UrMDAsIC8qIDB4NDBkOWIwMjMgKi8KKyAgMS4wODMwODE4MTc2ZSswMiwgLyogMHg0MmQ4OWRjYSAqLworICA1LjE3NjM2MTY5NDNlKzAyLCAvKiAweDQ0MDE2OGI3ICovCisgIDUuMjg3MTUyMDk5NmUrMDIsIC8qIDB4NDQwNDJkYzYgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcHM1WzVdID0geworICA1LjkyODA1OTc2ODdlKzAxLCAvKiAweDQyNmQxZjU1ICovCisgIDkuOTE0MDE0MjgyMmUrMDIsIC8qIDB4NDQ3N2Q5YjEgKi8KKyAgNS4zNTMyNjcwODk4ZSswMywgLyogMHg0NWE3NGEyMyAqLworICA3Ljg0NDY5MDQyOTdlKzAzLCAvKiAweDQ1ZjUyNTg2ICovCisgIDEuNTA0MDQ2ODc1MGUrMDMsIC8qIDB4NDRiYzAxODAgKi8KK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBwcjNbNl0gPSB7CisgIDMuMDI1MDM5MTA4MWUtMDksIC8qIDB4MzE0ZmUxMGQgKi8KKyAgMS4xNzE4Njg2NjcwZS0wMSwgLyogMHgzZGVmZmZhYiAqLworICAzLjkzMjk3NzQzODBlKzAwLCAvKiAweDQwN2JiNWU3ICovCisgIDMuNTExOTQwMzgzOWUrMDEsIC8qIDB4NDIwYzdhNDUgKi8KKyAgOS4xMDU1MDA3OTM1ZSswMSwgLyogMHg0MmI2MWMyYSAqLworICA0Ljg1NTkwNjY3NzJlKzAxLCAvKiAweDQyNDIzYzdjICovCit9Oworc3RhdGljIGNvbnN0IGZsb2F0IHBzM1s1XSA9IHsKKyAgMy40NzkxMzA5MzU3ZSswMSwgLyogMHg0MjBiMmE0ZCAqLworICAzLjM2NzYyNDUxMTdlKzAyLCAvKiAweDQzYTg2MTk4ICovCisgIDEuMDQ2ODcxNDYwMGUrMDMsIC8qIDB4NDQ4MmRiZTMgKi8KKyAgOC45MDgxMTM0MDMzZSswMiwgLyogMHg0NDVlYjNlZCAqLworICAxLjAzNzg3OTMzMzVlKzAyLCAvKiAweDQyY2Y5MzZjICovCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgcHIyWzZdID0gey8qIGZvciB4IGluIFsyLjg1NzAsMl09MS9bMC4zNDk5LDAuNV0gKi8KKyAgMS4wNzcxMDgzMjI1ZS0wNywgLyogMHgzM2U3NGVhOCAqLworICAxLjE3MTc2MjE5ODJlLTAxLCAvKiAweDNkZWZmYTE2ICovCisgIDIuMzY4NTE1MDE0NmUrMDAsIC8qIDB4NDAxNzk1YzAgKi8KKyAgMS4yMjQyNjEwOTMxZSswMSwgLyogMHg0MTQzZTFiYyAqLworICAxLjc2OTM5NzE2MzRlKzAxLCAvKiAweDQxOGQ4ZDQxICovCisgIDUuMDczNTIzMDQ0NmUrMDAsIC8qIDB4NDBhMjVhNGQgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcHMyWzVdID0geworICAyLjE0MzY0ODUyOTFlKzAxLCAvKiAweDQxYWI3ZGVjICovCisgIDEuMjUyOTAyMjk4MGUrMDIsIC8qIDB4NDJmYTk0OTkgKi8KKyAgMi4zMjI3NjQ3NDAwZSswMiwgLyogMHg0MzY4NDZjNyAqLworICAxLjE3Njc5Mzc0NjllKzAyLCAvKiAweDQyZWI1YmQ3ICovCisgIDguMzY0NjM5MjgyMmUrMDAsIC8qIDB4NDEwNWQ1OTAgKi8KK307CisKKwlzdGF0aWMgZmxvYXQgcG9uZWYoZmxvYXQgeCkKK3sKKwljb25zdCBmbG9hdCAqcCwqcTsKKwlmbG9hdCB6LHIsczsKKyAgICAgICAgaW50MzJfdCBpeDsKKwlHRVRfRkxPQVRfV09SRChpeCx4KTsKKwlpeCAmPSAweDdmZmZmZmZmOworICAgICAgICBpZihpeD49MHg0MTAwMDAwMCkgICAgIHtwID0gcHI4OyBxPSBwczg7fQorICAgICAgICBlbHNlIGlmKGl4Pj0weDQwZjcxYzU4KXtwID0gcHI1OyBxPSBwczU7fQorICAgICAgICBlbHNlIGlmKGl4Pj0weDQwMzZkYjY4KXtwID0gcHIzOyBxPSBwczM7fQorICAgICAgICBlbHNlIGlmKGl4Pj0weDQwMDAwMDAwKXtwID0gcHIyOyBxPSBwczI7fQorICAgICAgICB6ID0gb25lLyh4KngpOworICAgICAgICByID0gcFswXSt6KihwWzFdK3oqKHBbMl0reioocFszXSt6KihwWzRdK3oqcFs1XSkpKSk7CisgICAgICAgIHMgPSBvbmUreioocVswXSt6KihxWzFdK3oqKHFbMl0reioocVszXSt6KnFbNF0pKSkpOworICAgICAgICByZXR1cm4gb25lKyByL3M7Cit9CisKKworLyogRm9yIHggPj0gOCwgdGhlIGFzeW1wdG90aWMgZXhwYW5zaW9ucyBvZiBxb25lIGlzCisgKgkzLzggcyAtIDEwNS8xMDI0IHNeMyAtIC4uLiwgd2hlcmUgcyA9IDEveC4KKyAqIFdlIGFwcHJveGltYXRlIHBvbmUgYnkKKyAqIAlxb25lKHgpID0gcyooMC4zNzUgKyAoUi9TKSkKKyAqIHdoZXJlICBSID0gcXIxKnNeMiArIHFyMipzXjQgKyAuLi4gKyBxcjUqc14xMAorICogCSAgUyA9IDEgKyBxczEqc14yICsgLi4uICsgcXM2KnNeMTIKKyAqIGFuZAorICoJfCBxb25lKHgpL3MgLTAuMzc1LVIvUyB8IDw9IDIgICoqICggLTYxLjEzKQorICovCisKK3N0YXRpYyBjb25zdCBmbG9hdCBxcjhbNl0gPSB7IC8qIGZvciB4IGluIFtpbmYsIDhdPTEvWzAsMC4xMjVdICovCisgIDAuMDAwMDAwMDAwMGUrMDAsIC8qIDB4MDAwMDAwMDAgKi8KKyAtMS4wMjUzOTA2MjUwZS0wMSwgLyogMHhiZGQyMDAwMCAqLworIC0xLjYyNzE3NTMzMTFlKzAxLCAvKiAweGMxODIyYzhkICovCisgLTcuNTk2MDE3NDU2MWUrMDIsIC8qIDB4YzQzZGU2ODMgKi8KKyAtMS4xODQ5ODA2NjQxZSswNCwgLyogMHhjNjM5MjczYSAqLworIC00Ljg0Mzg1MTE3MTllKzA0LCAvKiAweGM3M2QzNjgzICovCit9Oworc3RhdGljIGNvbnN0IGZsb2F0IHFzOFs2XSA9IHsKKyAgMS42MTM5NTM3MDQ4ZSswMiwgLyogMHg0MzIxNjUzNyAqLworICA3LjgyNTM4NjIzMDVlKzAzLCAvKiAweDQ1ZjQ4YjE3ICovCisgIDEuMzM4NzUzNDM3NWUrMDUsIC8qIDB4NDgwMmJjZDYgKi8KKyAgNy4xOTY1Nzc1MDAwZSswNSwgLyogMHg0OTJmYjI5YyAqLworICA2LjY2NjAxMjUwMDBlKzA1LCAvKiAweDQ5MjJiZTk0ICovCisgLTIuOTQ0OTAyNTAwMGUrMDUsIC8qIDB4Yzg4ZmNiNDggKi8KK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBxcjVbNl0gPSB7IC8qIGZvciB4IGluIFs4LDQuNTQ1NF09MS9bMC4xMjUsMC4yMjAwMV0gKi8KKyAtMi4wODk3OTkzNDA1ZS0xMSwgLyogMHhhZGI3ZDIxOSAqLworIC0xLjAyNTM5MDQ3NjBlLTAxLCAvKiAweGJkZDFmZmZlICovCisgLTguMDU2NDQ3OTgyOGUrMDAsIC8qIDB4YzEwMGU3MzYgKi8KKyAtMS44MzY2OTYwMTQ0ZSswMiwgLyogMHhjMzM3YWI2YiAqLworIC0xLjM3MzE5MzcyNTZlKzAzLCAvKiAweGM0YWJhNjMzICovCisgLTIuNjEyNDQ0MzM1OWUrMDMsIC8qIDB4YzUyMzQ3MWMgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcXM1WzZdID0geworICA4LjEyNzY1NTAyOTNlKzAxLCAvKiAweDQyYTI4ZDk4ICovCisgIDEuOTkxNzk4NzA2MWUrMDMsIC8qIDB4NDRmOGY5OGYgKi8KKyAgMS43NDY4NDg0Mzc1ZSswNCwgLyogMHg0Njg4NzhmOCAqLworICA0Ljk4NTE0MjU3ODFlKzA0LCAvKiAweDQ3NDJiYjZkICovCisgIDIuNzk0ODA3NDIxOWUrMDQsIC8qIDB4NDZkYTU4MjYgKi8KKyAtNC43MTkxODM1OTM4ZSswMywgLyogMHhjNTkzNzk3OCAqLworfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHFyM1s2XSA9IHsKKyAtNS4wNzgzMTI0MzcyZS0wOSwgLyogMHhiMWFlN2Q0ZiAqLworIC0xLjAyNTM3ODMzMTVlLTAxLCAvKiAweGJkZDFmZjViICovCisgLTQuNjEwMTE2MDA0OWUrMDAsIC8qIDB4YzA5Mzg2MTIgKi8KKyAtNS43ODQ3MjIxMzc1ZSswMSwgLyogMHhjMjY3NjM4ZSAqLworIC0yLjI4MjQ0NTM3MzVlKzAyLCAvKiAweGMzNjQzZTlhICovCisgLTIuMTkyMTAxMjg3OGUrMDIsIC8qIDB4YzM1YjM1Y2IgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcXMzWzZdID0geworICA0Ljc2NjUxNTM1MDNlKzAxLCAvKiAweDQyM2VhOTFlICovCisgIDYuNzM4NjUxMTIzMGUrMDIsIC8qIDB4NDQyODc3NWUgKi8KKyAgMy4zODAxNTI4MzIwZSswMywgLyogMHg0NTUzNDI3MiAqLworICA1LjU0NzcyOTAwMzllKzAzLCAvKiAweDQ1YWQ1ZGQ1ICovCisgIDEuOTAzMTE5MTQwNmUrMDMsIC8qIDB4NDRlZGUzZDAgKi8KKyAtMS4zNTIwMTE4NzEzZSswMiwgLyogMHhjMzA3MzM4MSAqLworfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHFyMls2XSA9IHsvKiBmb3IgeCBpbiBbMi44NTcwLDJdPTEvWzAuMzQ5OSwwLjVdICovCisgLTEuNzgzODE3MjUzOWUtMDcsIC8qIDB4YjQzZjg5MzIgKi8KKyAtMS4wMjUxNzA0NjAzZS0wMSwgLyogMHhiZGQxZjQ3NSAqLworIC0yLjc1MjIwNTYxMDNlKzAwLCAvKiAweGMwMzAyNDIzICovCisgLTEuOTY2MzYxNjE4MGUrMDEsIC8qIDB4YzE5ZDRmMTYgKi8KKyAtNC4yMzI1MzEzNTY4ZSswMSwgLyogMHhjMjI5NGQxZiAqLworIC0yLjEzNzE5MjE1MzllKzAxLCAvKiAweGMxYWFmOWIyICovCit9Oworc3RhdGljIGNvbnN0IGZsb2F0IHFzMls2XSA9IHsKKyAgMi45NTMzMzYzMzQyZSswMSwgLyogMHg0MWVjNDQ1NCAqLworICAyLjUyOTgxNTUyMTJlKzAyLCAvKiAweDQzN2NmYjQ3ICovCisgIDcuNTc1MDI4MDc2MmUrMDIsIC8qIDB4NDQzZDYwMmUgKi8KKyAgNy4zOTM5MzE4ODQ4ZSswMiwgLyogMHg0NDM4ZDkyYSAqLworICAxLjU1OTQ5MDA1MTNlKzAyLCAvKiAweDQzMWJmMmYyICovCisgLTQuOTU5NDk4ODgyM2UrMDAsIC8qIDB4YzA5ZWI0MzcgKi8KK307CisKKwlzdGF0aWMgZmxvYXQgcW9uZWYoZmxvYXQgeCkKK3sKKwljb25zdCBmbG9hdCAqcCwqcTsKKwlmbG9hdCAgcyxyLHo7CisJaW50MzJfdCBpeDsKKwlHRVRfRkxPQVRfV09SRChpeCx4KTsKKwlpeCAmPSAweDdmZmZmZmZmOworCWlmKGl4Pj0weDQwMjAwMDAwKSAgICAge3AgPSBxcjg7IHE9IHFzODt9CisJZWxzZSBpZihpeD49MHg0MGY3MWM1OCl7cCA9IHFyNTsgcT0gcXM1O30KKwllbHNlIGlmKGl4Pj0weDQwMzZkYjY4KXtwID0gcXIzOyBxPSBxczM7fQorCWVsc2UgaWYoaXg+PTB4NDAwMDAwMDApe3AgPSBxcjI7IHE9IHFzMjt9CisJeiA9IG9uZS8oeCp4KTsKKwlyID0gcFswXSt6KihwWzFdK3oqKHBbMl0reioocFszXSt6KihwWzRdK3oqcFs1XSkpKSk7CisJcyA9IG9uZSt6KihxWzBdK3oqKHFbMV0reioocVsyXSt6KihxWzNdK3oqKHFbNF0reipxWzVdKSkpKSk7CisJcmV0dXJuICgoZmxvYXQpLjM3NSArIHIvcykveDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2Vfam4uYyBiL2xpYm0vc3JjL2Vfam4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTNiMjJkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9qbi5jCkBAIC0wLDAgKzEsMjY2IEBACisKKy8qIEAoIyllX2puLmMgMS40IDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2Vfam4uYyx2IDEuOSAyMDA1LzAyLzA0IDE4OjI2OjA2IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIF9faWVlZTc1NF9qbihuLCB4KSwgX19pZWVlNzU0X3luKG4sIHgpCisgKiBmbG9hdGluZyBwb2ludCBCZXNzZWwncyBmdW5jdGlvbiBvZiB0aGUgMXN0IGFuZCAybmQga2luZAorICogb2Ygb3JkZXIgbgorICogICAgICAgICAgCisgKiBTcGVjaWFsIGNhc2VzOgorICoJeTAoMCk9eTEoMCk9eW4obiwwKSA9IC1pbmYgd2l0aCBkaXZpc2lvbiBieSB6ZXJvIHNpZ25hbDsKKyAqCXkwKC12ZSk9eTEoLXZlKT15bihuLC12ZSkgYXJlIE5hTiB3aXRoIGludmFsaWQgc2lnbmFsLgorICogTm90ZSAyLiBBYm91dCBqbihuLHgpLCB5bihuLHgpCisgKglGb3Igbj0wLCBqMCh4KSBpcyBjYWxsZWQsCisgKglmb3Igbj0xLCBqMSh4KSBpcyBjYWxsZWQsCisgKglmb3Igbjx4LCBmb3J3YXJkIHJlY3Vyc2lvbiB1cyB1c2VkIHN0YXJ0aW5nCisgKglmcm9tIHZhbHVlcyBvZiBqMCh4KSBhbmQgajEoeCkuCisgKglmb3Igbj54LCBhIGNvbnRpbnVlZCBmcmFjdGlvbiBhcHByb3hpbWF0aW9uIHRvCisgKglqKG4seCkvaihuLTEseCkgaXMgZXZhbHVhdGVkIGFuZCB0aGVuIGJhY2t3YXJkCisgKglyZWN1cnNpb24gaXMgdXNlZCBzdGFydGluZyBmcm9tIGEgc3VwcG9zZWQgdmFsdWUKKyAqCWZvciBqKG4seCkuIFRoZSByZXN1bHRpbmcgdmFsdWUgb2YgaigwLHgpIGlzCisgKgljb21wYXJlZCB3aXRoIHRoZSBhY3R1YWwgdmFsdWUgdG8gY29ycmVjdCB0aGUKKyAqCXN1cHBvc2VkIHZhbHVlIG9mIGoobix4KS4KKyAqCisgKgl5bihuLHgpIGlzIHNpbWlsYXIgaW4gYWxsIHJlc3BlY3RzLCBleGNlcHQKKyAqCXRoYXQgZm9yd2FyZCByZWN1cnNpb24gaXMgdXNlZCBmb3IgYWxsCisgKgl2YWx1ZXMgb2Ygbj4xLgorICoJCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQoraW52c3FydHBpPSAgNS42NDE4OTU4MzU0Nzc1NjI3OTI4MGUtMDEsIC8qIDB4M0ZFMjBERDcsIDB4NTA0MjlCNkQgKi8KK3R3byAgID0gIDIuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwLCAvKiAweDQwMDAwMDAwLCAweDAwMDAwMDAwICovCitvbmUgICA9ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMDsgLyogMHgzRkYwMDAwMCwgMHgwMDAwMDAwMCAqLworCitzdGF0aWMgY29uc3QgZG91YmxlIHplcm8gID0gIDAuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwOworCitkb3VibGUKK19faWVlZTc1NF9qbihpbnQgbiwgZG91YmxlIHgpCit7CisJaW50MzJfdCBpLGh4LGl4LGx4LCBzZ247CisJZG91YmxlIGEsIGIsIHRlbXAsIGRpOworCWRvdWJsZSB6LCB3OworCisgICAgLyogSigtbix4KSA9ICgtMSlebiAqIEoobiwgeCksIEoobiwgLXgpID0gKC0xKV5uICogSihuLCB4KQorICAgICAqIFRodXMsIEooLW4seCkgPSBKKG4sLXgpCisgICAgICovCisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKwlpeCA9IDB4N2ZmZmZmZmYmaHg7CisgICAgLyogaWYgSihuLE5hTikgaXMgTmFOICovCisJaWYoKGl4fCgodV9pbnQzMl90KShseHwtbHgpKT4+MzEpPjB4N2ZmMDAwMDApIHJldHVybiB4K3g7CisJaWYobjwwKXsJCQorCQluID0gLW47CisJCXggPSAteDsKKwkJaHggXj0gMHg4MDAwMDAwMDsKKwl9CisJaWYobj09MCkgcmV0dXJuKF9faWVlZTc1NF9qMCh4KSk7CisJaWYobj09MSkgcmV0dXJuKF9faWVlZTc1NF9qMSh4KSk7CisJc2duID0gKG4mMSkmKGh4Pj4zMSk7CS8qIGV2ZW4gbiAtLSAwLCBvZGQgbiAtLSBzaWduKHgpICovCisJeCA9IGZhYnMoeCk7CisJaWYoKGl4fGx4KT09MHx8aXg+PTB4N2ZmMDAwMDApIAkvKiBpZiB4IGlzIDAgb3IgaW5mICovCisJICAgIGIgPSB6ZXJvOworCWVsc2UgaWYoKGRvdWJsZSluPD14KSB7ICAgCisJCS8qIFNhZmUgdG8gdXNlIEoobisxLHgpPTJuL3ggKkoobix4KS1KKG4tMSx4KSAqLworCSAgICBpZihpeD49MHg1MkQwMDAwMCkgeyAvKiB4ID4gMioqMzAyICovCisgICAgLyogKHggPj4gbioqMikgCisgICAgICoJICAgIEpuKHgpID0gY29zKHgtKDJuKzEpKnBpLzQpKnNxcnQoMi94KnBpKQorICAgICAqCSAgICBZbih4KSA9IHNpbih4LSgybisxKSpwaS80KSpzcXJ0KDIveCpwaSkKKyAgICAgKgkgICAgTGV0IHM9c2luKHgpLCBjPWNvcyh4KSwgCisgICAgICoJCXhuPXgtKDJuKzEpKnBpLzQsIHNxdDIgPSBzcXJ0KDIpLHRoZW4KKyAgICAgKgorICAgICAqCQkgICBuCXNpbih4bikqc3F0Mgljb3MoeG4pKnNxdDIKKyAgICAgKgkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqCQkgICAwCSBzLWMJCSBjK3MKKyAgICAgKgkJICAgMQktcy1jIAkJLWMrcworICAgICAqCQkgICAyCS1zK2MJCS1jLXMKKyAgICAgKgkJICAgMwkgcytjCQkgYy1zCisgICAgICovCisJCXN3aXRjaChuJjMpIHsKKwkJICAgIGNhc2UgMDogdGVtcCA9ICBjb3MoeCkrc2luKHgpOyBicmVhazsKKwkJICAgIGNhc2UgMTogdGVtcCA9IC1jb3MoeCkrc2luKHgpOyBicmVhazsKKwkJICAgIGNhc2UgMjogdGVtcCA9IC1jb3MoeCktc2luKHgpOyBicmVhazsKKwkJICAgIGNhc2UgMzogdGVtcCA9ICBjb3MoeCktc2luKHgpOyBicmVhazsKKwkJfQorCQliID0gaW52c3FydHBpKnRlbXAvc3FydCh4KTsKKwkgICAgfSBlbHNlIHsJCisJICAgICAgICBhID0gX19pZWVlNzU0X2owKHgpOworCSAgICAgICAgYiA9IF9faWVlZTc1NF9qMSh4KTsKKwkgICAgICAgIGZvcihpPTE7aTxuO2krKyl7CisJCSAgICB0ZW1wID0gYjsKKwkJICAgIGIgPSBiKigoZG91YmxlKShpK2kpL3gpIC0gYTsgLyogYXZvaWQgdW5kZXJmbG93ICovCisJCSAgICBhID0gdGVtcDsKKwkgICAgICAgIH0KKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGlmKGl4PDB4M2UxMDAwMDApIHsJLyogeCA8IDIqKi0yOSAqLworICAgIC8qIHggaXMgdGlueSwgcmV0dXJuIHRoZSBmaXJzdCBUYXlsb3IgZXhwYW5zaW9uIG9mIEoobix4KSAKKyAgICAgKiBKKG4seCkgPSAxL24hKih4LzIpXm4gIC0gLi4uCisgICAgICovCisJCWlmKG4+MzMpCS8qIHVuZGVyZmxvdyAqLworCQkgICAgYiA9IHplcm87CisJCWVsc2UgeworCQkgICAgdGVtcCA9IHgqMC41OyBiID0gdGVtcDsKKwkJICAgIGZvciAoYT1vbmUsaT0yO2k8PW47aSsrKSB7CisJCQlhICo9IChkb3VibGUpaTsJCS8qIGEgPSBuISAqLworCQkJYiAqPSB0ZW1wOwkJLyogYiA9ICh4LzIpXm4gKi8KKwkJICAgIH0KKwkJICAgIGIgPSBiL2E7CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJLyogdXNlIGJhY2t3YXJkIHJlY3VycmVuY2UgKi8KKwkJLyogCQkJeCAgICAgIHheMiAgICAgIHheMiAgICAgICAKKwkJICogIEoobix4KS9KKG4tMSx4KSA9ICAtLS0tICAgLS0tLS0tICAgLS0tLS0tICAgLi4uLi4KKwkJICoJCQkybiAgLSAyKG4rMSkgLSAyKG4rMikKKwkJICoKKwkJICogCQkJMSAgICAgIDEgICAgICAgIDEgICAgICAgCisJCSAqICAoZm9yIGxhcmdlIHgpICAgPSAgLS0tLSAgLS0tLS0tICAgLS0tLS0tICAgLi4uLi4KKwkJICoJCQkybiAgIDIobisxKSAgIDIobisyKQorCQkgKgkJCS0tIC0gLS0tLS0tIC0gLS0tLS0tIC0gCisJCSAqCQkJIHggICAgIHggICAgICAgICB4CisJCSAqCisJCSAqIExldCB3ID0gMm4veCBhbmQgaD0yL3gsIHRoZW4gdGhlIGFib3ZlIHF1b3RpZW50CisJCSAqIGlzIGVxdWFsIHRvIHRoZSBjb250aW51ZWQgZnJhY3Rpb246CisJCSAqCQkgICAgMQorCQkgKgk9IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCSAqCQkgICAgICAgMQorCQkgKgkgICB3IC0gLS0tLS0tLS0tLS0tLS0tLS0KKwkJICoJCQkgIDEKKwkJICogCSAgICAgICAgdytoIC0gLS0tLS0tLS0tCisJCSAqCQkgICAgICAgdysyaCAtIC4uLgorCQkgKgorCQkgKiBUbyBkZXRlcm1pbmUgaG93IG1hbnkgdGVybXMgbmVlZGVkLCBsZXQKKwkJICogUSgwKSA9IHcsIFEoMSkgPSB3KHcraCkgLSAxLAorCQkgKiBRKGspID0gKHcraypoKSpRKGstMSkgLSBRKGstMiksCisJCSAqIFdoZW4gUShrKSA+IDFlNAlnb29kIGZvciBzaW5nbGUgCisJCSAqIFdoZW4gUShrKSA+IDFlOQlnb29kIGZvciBkb3VibGUgCisJCSAqIFdoZW4gUShrKSA+IDFlMTcJZ29vZCBmb3IgcXVhZHJ1cGxlIAorCQkgKi8KKwkgICAgLyogZGV0ZXJtaW5lIGsgKi8KKwkJZG91YmxlIHQsdjsKKwkJZG91YmxlIHEwLHExLGgsdG1wOyBpbnQzMl90IGssbTsKKwkJdyAgPSAobituKS8oZG91YmxlKXg7IGggPSAyLjAvKGRvdWJsZSl4OworCQlxMCA9IHc7ICB6ID0gdytoOyBxMSA9IHcqeiAtIDEuMDsgaz0xOworCQl3aGlsZShxMTwxLjBlOSkgeworCQkJayArPSAxOyB6ICs9IGg7CisJCQl0bXAgPSB6KnExIC0gcTA7CisJCQlxMCA9IHExOworCQkJcTEgPSB0bXA7CisJCX0KKwkJbSA9IG4rbjsKKwkJZm9yKHQ9emVybywgaSA9IDIqKG4rayk7IGk+PW07IGkgLT0gMikgdCA9IG9uZS8oaS94LXQpOworCQlhID0gdDsKKwkJYiA9IG9uZTsKKwkJLyogIGVzdGltYXRlIGxvZygoMi94KV5uKm4hKSA9IG4qbG9nKDIveCkrbipsbihuKQorCQkgKiAgSGVuY2UsIGlmIG4qKGxvZygybi94KSkgPiAuLi4KKwkJICogIHNpbmdsZSA4Ljg3MjI4MzkzNTVlKzAxCisJCSAqICBkb3VibGUgNy4wOTc4MjcxMjg5MzM4Mzk3MzA5NmUrMDIKKwkJICogIGxvbmcgZG91YmxlIDEuMTM1NjUyMzQwNjI5NDE0Mzk0OTQ5MTkzMTA3Nzk3MDc2NTAwNjE3MGUrMDQKKwkJICogIHRoZW4gcmVjdXJyZW50IHZhbHVlIG1heSBvdmVyZmxvdyBhbmQgdGhlIHJlc3VsdCBpcworCQkgKiAgbGlrZWx5IHVuZGVyZmxvdyB0byB6ZXJvCisJCSAqLworCQl0bXAgPSBuOworCQl2ID0gdHdvL3g7CisJCXRtcCA9IHRtcCpfX2llZWU3NTRfbG9nKGZhYnModip0bXApKTsKKwkJaWYodG1wPDcuMDk3ODI3MTI4OTMzODM5NzMwOTZlKzAyKSB7CisJICAgIAkgICAgZm9yKGk9bi0xLGRpPShkb3VibGUpKGkraSk7aT4wO2ktLSl7CisJCSAgICAgICAgdGVtcCA9IGI7CisJCQliICo9IGRpOworCQkJYiAgPSBiL3ggLSBhOworCQkgICAgICAgIGEgPSB0ZW1wOworCQkJZGkgLT0gdHdvOworCSAgICAgCSAgICB9CisJCX0gZWxzZSB7CisJICAgIAkgICAgZm9yKGk9bi0xLGRpPShkb3VibGUpKGkraSk7aT4wO2ktLSl7CisJCSAgICAgICAgdGVtcCA9IGI7CisJCQliICo9IGRpOworCQkJYiAgPSBiL3ggLSBhOworCQkgICAgICAgIGEgPSB0ZW1wOworCQkJZGkgLT0gdHdvOworCQkgICAgLyogc2NhbGUgYiB0byBhdm9pZCBzcHVyaW91cyBvdmVyZmxvdyAqLworCQkJaWYoYj4xZTEwMCkgeworCQkJICAgIGEgLz0gYjsKKwkJCSAgICB0IC89IGI7CisJCQkgICAgYiAgPSBvbmU7CisJCQl9CisJICAgICAJICAgIH0KKwkJfQorCSAgICAJYiA9ICh0Kl9faWVlZTc1NF9qMCh4KS9iKTsKKwkgICAgfQorCX0KKwlpZihzZ249PTEpIHJldHVybiAtYjsgZWxzZSByZXR1cm4gYjsKK30KKworZG91YmxlCitfX2llZWU3NTRfeW4oaW50IG4sIGRvdWJsZSB4KQoreworCWludDMyX3QgaSxoeCxpeCxseDsKKwlpbnQzMl90IHNpZ247CisJZG91YmxlIGEsIGIsIHRlbXA7CisKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCWl4ID0gMHg3ZmZmZmZmZiZoeDsKKyAgICAvKiBpZiBZKG4sTmFOKSBpcyBOYU4gKi8KKwlpZigoaXh8KCh1X2ludDMyX3QpKGx4fC1seCkpPj4zMSk+MHg3ZmYwMDAwMCkgcmV0dXJuIHgreDsKKwlpZigoaXh8bHgpPT0wKSByZXR1cm4gLW9uZS96ZXJvOworCWlmKGh4PDApIHJldHVybiB6ZXJvL3plcm87CisJc2lnbiA9IDE7CisJaWYobjwwKXsKKwkJbiA9IC1uOworCQlzaWduID0gMSAtICgobiYxKTw8MSk7CisJfQorCWlmKG49PTApIHJldHVybihfX2llZWU3NTRfeTAoeCkpOworCWlmKG49PTEpIHJldHVybihzaWduKl9faWVlZTc1NF95MSh4KSk7CisJaWYoaXg9PTB4N2ZmMDAwMDApIHJldHVybiB6ZXJvOworCWlmKGl4Pj0weDUyRDAwMDAwKSB7IC8qIHggPiAyKiozMDIgKi8KKyAgICAvKiAoeCA+PiBuKioyKSAKKyAgICAgKgkgICAgSm4oeCkgPSBjb3MoeC0oMm4rMSkqcGkvNCkqc3FydCgyL3gqcGkpCisgICAgICoJICAgIFluKHgpID0gc2luKHgtKDJuKzEpKnBpLzQpKnNxcnQoMi94KnBpKQorICAgICAqCSAgICBMZXQgcz1zaW4oeCksIGM9Y29zKHgpLCAKKyAgICAgKgkJeG49eC0oMm4rMSkqcGkvNCwgc3F0MiA9IHNxcnQoMiksdGhlbgorICAgICAqCisgICAgICoJCSAgIG4Jc2luKHhuKSpzcXQyCWNvcyh4bikqc3F0MgorICAgICAqCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICoJCSAgIDAJIHMtYwkJIGMrcworICAgICAqCQkgICAxCS1zLWMgCQktYytzCisgICAgICoJCSAgIDIJLXMrYwkJLWMtcworICAgICAqCQkgICAzCSBzK2MJCSBjLXMKKyAgICAgKi8KKwkJc3dpdGNoKG4mMykgeworCQkgICAgY2FzZSAwOiB0ZW1wID0gIHNpbih4KS1jb3MoeCk7IGJyZWFrOworCQkgICAgY2FzZSAxOiB0ZW1wID0gLXNpbih4KS1jb3MoeCk7IGJyZWFrOworCQkgICAgY2FzZSAyOiB0ZW1wID0gLXNpbih4KStjb3MoeCk7IGJyZWFrOworCQkgICAgY2FzZSAzOiB0ZW1wID0gIHNpbih4KStjb3MoeCk7IGJyZWFrOworCQl9CisJCWIgPSBpbnZzcXJ0cGkqdGVtcC9zcXJ0KHgpOworCX0gZWxzZSB7CisJICAgIHVfaW50MzJfdCBoaWdoOworCSAgICBhID0gX19pZWVlNzU0X3kwKHgpOworCSAgICBiID0gX19pZWVlNzU0X3kxKHgpOworCS8qIHF1aXQgaWYgYiBpcyAtaW5mICovCisJICAgIEdFVF9ISUdIX1dPUkQoaGlnaCxiKTsKKwkgICAgZm9yKGk9MTtpPG4mJmhpZ2ghPTB4ZmZmMDAwMDA7aSsrKXsKKwkJdGVtcCA9IGI7CisJCWIgPSAoKGRvdWJsZSkoaStpKS94KSpiIC0gYTsKKwkJR0VUX0hJR0hfV09SRChoaWdoLGIpOworCQlhID0gdGVtcDsKKwkgICAgfQorCX0KKwlpZihzaWduPjApIHJldHVybiBiOyBlbHNlIHJldHVybiAtYjsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2Vfam5mLmMgYi9saWJtL3NyYy9lX2puZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOWRiYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2puZi5jCkBAIC0wLDAgKzEsMTk2IEBACisvKiBlX2puZi5jIC0tIGZsb2F0IHZlcnNpb24gb2YgZV9qbi5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9qbmYuYyx2IDEuOCAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0CitpbnZzcXJ0cGk9ICA1LjY0MTg5NjEyODdlLTAxLCAvKiAweDNmMTA2ZWJiICovCit0d28gICA9ICAyLjAwMDAwMDAwMDBlKzAwLCAvKiAweDQwMDAwMDAwICovCitvbmUgICA9ICAxLjAwMDAwMDAwMDBlKzAwOyAvKiAweDNGODAwMDAwICovCisKK3N0YXRpYyBjb25zdCBmbG9hdCB6ZXJvICA9ICAwLjAwMDAwMDAwMDBlKzAwOworCitmbG9hdAorX19pZWVlNzU0X2puZihpbnQgbiwgZmxvYXQgeCkKK3sKKwlpbnQzMl90IGksaHgsaXgsIHNnbjsKKwlmbG9hdCBhLCBiLCB0ZW1wLCBkaTsKKwlmbG9hdCB6LCB3OworCisgICAgLyogSigtbix4KSA9ICgtMSlebiAqIEoobiwgeCksIEoobiwgLXgpID0gKC0xKV5uICogSihuLCB4KQorICAgICAqIFRodXMsIEooLW4seCkgPSBKKG4sLXgpCisgICAgICovCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSAweDdmZmZmZmZmJmh4OworICAgIC8qIGlmIEoobixOYU4pIGlzIE5hTiAqLworCWlmKGl4PjB4N2Y4MDAwMDApIHJldHVybiB4K3g7CisJaWYobjwwKXsKKwkJbiA9IC1uOworCQl4ID0gLXg7CisJCWh4IF49IDB4ODAwMDAwMDA7CisJfQorCWlmKG49PTApIHJldHVybihfX2llZWU3NTRfajBmKHgpKTsKKwlpZihuPT0xKSByZXR1cm4oX19pZWVlNzU0X2oxZih4KSk7CisJc2duID0gKG4mMSkmKGh4Pj4zMSk7CS8qIGV2ZW4gbiAtLSAwLCBvZGQgbiAtLSBzaWduKHgpICovCisJeCA9IGZhYnNmKHgpOworCWlmKGl4PT0wfHxpeD49MHg3ZjgwMDAwMCkgCS8qIGlmIHggaXMgMCBvciBpbmYgKi8KKwkgICAgYiA9IHplcm87CisJZWxzZSBpZigoZmxvYXQpbjw9eCkgeworCQkvKiBTYWZlIHRvIHVzZSBKKG4rMSx4KT0ybi94ICpKKG4seCktSihuLTEseCkgKi8KKwkgICAgYSA9IF9faWVlZTc1NF9qMGYoeCk7CisJICAgIGIgPSBfX2llZWU3NTRfajFmKHgpOworCSAgICBmb3IoaT0xO2k8bjtpKyspeworCQl0ZW1wID0gYjsKKwkJYiA9IGIqKChmbG9hdCkoaStpKS94KSAtIGE7IC8qIGF2b2lkIHVuZGVyZmxvdyAqLworCQlhID0gdGVtcDsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGlmKGl4PDB4MzA4MDAwMDApIHsJLyogeCA8IDIqKi0yOSAqLworICAgIC8qIHggaXMgdGlueSwgcmV0dXJuIHRoZSBmaXJzdCBUYXlsb3IgZXhwYW5zaW9uIG9mIEoobix4KQorICAgICAqIEoobix4KSA9IDEvbiEqKHgvMilebiAgLSAuLi4KKyAgICAgKi8KKwkJaWYobj4zMykJLyogdW5kZXJmbG93ICovCisJCSAgICBiID0gemVybzsKKwkJZWxzZSB7CisJCSAgICB0ZW1wID0geCooZmxvYXQpMC41OyBiID0gdGVtcDsKKwkJICAgIGZvciAoYT1vbmUsaT0yO2k8PW47aSsrKSB7CisJCQlhICo9IChmbG9hdClpOwkJLyogYSA9IG4hICovCisJCQliICo9IHRlbXA7CQkvKiBiID0gKHgvMilebiAqLworCQkgICAgfQorCQkgICAgYiA9IGIvYTsKKwkJfQorCSAgICB9IGVsc2UgeworCQkvKiB1c2UgYmFja3dhcmQgcmVjdXJyZW5jZSAqLworCQkvKiAJCQl4ICAgICAgeF4yICAgICAgeF4yCisJCSAqICBKKG4seCkvSihuLTEseCkgPSAgLS0tLSAgIC0tLS0tLSAgIC0tLS0tLSAgIC4uLi4uCisJCSAqCQkJMm4gIC0gMihuKzEpIC0gMihuKzIpCisJCSAqCisJCSAqIAkJCTEgICAgICAxICAgICAgICAxCisJCSAqICAoZm9yIGxhcmdlIHgpICAgPSAgLS0tLSAgLS0tLS0tICAgLS0tLS0tICAgLi4uLi4KKwkJICoJCQkybiAgIDIobisxKSAgIDIobisyKQorCQkgKgkJCS0tIC0gLS0tLS0tIC0gLS0tLS0tIC0KKwkJICoJCQkgeCAgICAgeCAgICAgICAgIHgKKwkJICoKKwkJICogTGV0IHcgPSAybi94IGFuZCBoPTIveCwgdGhlbiB0aGUgYWJvdmUgcXVvdGllbnQKKwkJICogaXMgZXF1YWwgdG8gdGhlIGNvbnRpbnVlZCBmcmFjdGlvbjoKKwkJICoJCSAgICAxCisJCSAqCT0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJICoJCSAgICAgICAxCisJCSAqCSAgIHcgLSAtLS0tLS0tLS0tLS0tLS0tLQorCQkgKgkJCSAgMQorCQkgKiAJICAgICAgICB3K2ggLSAtLS0tLS0tLS0KKwkJICoJCSAgICAgICB3KzJoIC0gLi4uCisJCSAqCisJCSAqIFRvIGRldGVybWluZSBob3cgbWFueSB0ZXJtcyBuZWVkZWQsIGxldAorCQkgKiBRKDApID0gdywgUSgxKSA9IHcodytoKSAtIDEsCisJCSAqIFEoaykgPSAodytrKmgpKlEoay0xKSAtIFEoay0yKSwKKwkJICogV2hlbiBRKGspID4gMWU0CWdvb2QgZm9yIHNpbmdsZQorCQkgKiBXaGVuIFEoaykgPiAxZTkJZ29vZCBmb3IgZG91YmxlCisJCSAqIFdoZW4gUShrKSA+IDFlMTcJZ29vZCBmb3IgcXVhZHJ1cGxlCisJCSAqLworCSAgICAvKiBkZXRlcm1pbmUgayAqLworCQlmbG9hdCB0LHY7CisJCWZsb2F0IHEwLHExLGgsdG1wOyBpbnQzMl90IGssbTsKKwkJdyAgPSAobituKS8oZmxvYXQpeDsgaCA9IChmbG9hdCkyLjAvKGZsb2F0KXg7CisJCXEwID0gdzsgIHogPSB3K2g7IHExID0gdyp6IC0gKGZsb2F0KTEuMDsgaz0xOworCQl3aGlsZShxMTwoZmxvYXQpMS4wZTkpIHsKKwkJCWsgKz0gMTsgeiArPSBoOworCQkJdG1wID0geipxMSAtIHEwOworCQkJcTAgPSBxMTsKKwkJCXExID0gdG1wOworCQl9CisJCW0gPSBuK247CisJCWZvcih0PXplcm8sIGkgPSAyKihuK2spOyBpPj1tOyBpIC09IDIpIHQgPSBvbmUvKGkveC10KTsKKwkJYSA9IHQ7CisJCWIgPSBvbmU7CisJCS8qICBlc3RpbWF0ZSBsb2coKDIveClebipuISkgPSBuKmxvZygyL3gpK24qbG4obikKKwkJICogIEhlbmNlLCBpZiBuKihsb2coMm4veCkpID4gLi4uCisJCSAqICBzaW5nbGUgOC44NzIyODM5MzU1ZSswMQorCQkgKiAgZG91YmxlIDcuMDk3ODI3MTI4OTMzODM5NzMwOTZlKzAyCisJCSAqICBsb25nIGRvdWJsZSAxLjEzNTY1MjM0MDYyOTQxNDM5NDk0OTE5MzEwNzc5NzA3NjUwMDYxNzBlKzA0CisJCSAqICB0aGVuIHJlY3VycmVudCB2YWx1ZSBtYXkgb3ZlcmZsb3cgYW5kIHRoZSByZXN1bHQgaXMKKwkJICogIGxpa2VseSB1bmRlcmZsb3cgdG8gemVybworCQkgKi8KKwkJdG1wID0gbjsKKwkJdiA9IHR3by94OworCQl0bXAgPSB0bXAqX19pZWVlNzU0X2xvZ2YoZmFic2Yodip0bXApKTsKKwkJaWYodG1wPChmbG9hdCk4Ljg3MjE2Nzk2ODhlKzAxKSB7CisJICAgIAkgICAgZm9yKGk9bi0xLGRpPShmbG9hdCkoaStpKTtpPjA7aS0tKXsKKwkJICAgICAgICB0ZW1wID0gYjsKKwkJCWIgKj0gZGk7CisJCQliICA9IGIveCAtIGE7CisJCSAgICAgICAgYSA9IHRlbXA7CisJCQlkaSAtPSB0d287CisJICAgICAJICAgIH0KKwkJfSBlbHNlIHsKKwkgICAgCSAgICBmb3IoaT1uLTEsZGk9KGZsb2F0KShpK2kpO2k+MDtpLS0peworCQkgICAgICAgIHRlbXAgPSBiOworCQkJYiAqPSBkaTsKKwkJCWIgID0gYi94IC0gYTsKKwkJICAgICAgICBhID0gdGVtcDsKKwkJCWRpIC09IHR3bzsKKwkJICAgIC8qIHNjYWxlIGIgdG8gYXZvaWQgc3B1cmlvdXMgb3ZlcmZsb3cgKi8KKwkJCWlmKGI+KGZsb2F0KTFlMTApIHsKKwkJCSAgICBhIC89IGI7CisJCQkgICAgdCAvPSBiOworCQkJICAgIGIgID0gb25lOworCQkJfQorCSAgICAgCSAgICB9CisJCX0KKwkgICAgCWIgPSAodCpfX2llZWU3NTRfajBmKHgpL2IpOworCSAgICB9CisJfQorCWlmKHNnbj09MSkgcmV0dXJuIC1iOyBlbHNlIHJldHVybiBiOworfQorCitmbG9hdAorX19pZWVlNzU0X3luZihpbnQgbiwgZmxvYXQgeCkKK3sKKwlpbnQzMl90IGksaHgsaXgsaWI7CisJaW50MzJfdCBzaWduOworCWZsb2F0IGEsIGIsIHRlbXA7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IDB4N2ZmZmZmZmYmaHg7CisgICAgLyogaWYgWShuLE5hTikgaXMgTmFOICovCisJaWYoaXg+MHg3ZjgwMDAwMCkgcmV0dXJuIHgreDsKKwlpZihpeD09MCkgcmV0dXJuIC1vbmUvemVybzsKKwlpZihoeDwwKSByZXR1cm4gemVyby96ZXJvOworCXNpZ24gPSAxOworCWlmKG48MCl7CisJCW4gPSAtbjsKKwkJc2lnbiA9IDEgLSAoKG4mMSk8PDEpOworCX0KKwlpZihuPT0wKSByZXR1cm4oX19pZWVlNzU0X3kwZih4KSk7CisJaWYobj09MSkgcmV0dXJuKHNpZ24qX19pZWVlNzU0X3kxZih4KSk7CisJaWYoaXg9PTB4N2Y4MDAwMDApIHJldHVybiB6ZXJvOworCisJYSA9IF9faWVlZTc1NF95MGYoeCk7CisJYiA9IF9faWVlZTc1NF95MWYoeCk7CisJLyogcXVpdCBpZiBiIGlzIC1pbmYgKi8KKwlHRVRfRkxPQVRfV09SRChpYixiKTsKKwlmb3IoaT0xO2k8biYmaWIhPTB4ZmY4MDAwMDA7aSsrKXsKKwkgICAgdGVtcCA9IGI7CisJICAgIGIgPSAoKGZsb2F0KShpK2kpL3gpKmIgLSBhOworCSAgICBHRVRfRkxPQVRfV09SRChpYixiKTsKKwkgICAgYSA9IHRlbXA7CisJfQorCWlmKHNpZ24+MCkgcmV0dXJuIGI7IGVsc2UgcmV0dXJuIC1iOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9sZ2FtbWEuYyBiL2xpYm0vc3JjL2VfbGdhbW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdhZDQxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfbGdhbW1hLmMKQEAgLTAsMCArMSwzNCBAQAorCisvKiBAKCMpZV9sZ2FtbWEuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfbGdhbW1hLmMsdiAxLjggMjAwNS8wMi8wNCAxODoyNjowNiBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9sZ2FtbWEoeCkKKyAqIFJldHVybiB0aGUgbG9nYXJpdGhtIG9mIHRoZSBHYW1tYSBmdW5jdGlvbiBvZiB4LgorICoKKyAqIE1ldGhvZDogY2FsbCBfX2llZWU3NTRfbGdhbW1hX3IKKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitleHRlcm4gaW50IHNpZ25nYW07CisKK2RvdWJsZQorX19pZWVlNzU0X2xnYW1tYShkb3VibGUgeCkKK3sKKwlyZXR1cm4gX19pZWVlNzU0X2xnYW1tYV9yKHgsJnNpZ25nYW0pOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9sZ2FtbWFfci5jIGIvbGlibS9zcmMvZV9sZ2FtbWFfci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZGJmZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2xnYW1tYV9yLmMKQEAgLTAsMCArMSwyOTcgQEAKKworLyogQCgjKWVfbGdhbW1hX3IuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfbGdhbW1hX3IuYyx2IDEuOCAyMDA1LzAyLzA0IDE4OjI2OjA2IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X2xnYW1tYV9yKHgsIHNpZ25nYW1wKQorICogUmVlbnRyYW50IHZlcnNpb24gb2YgdGhlIGxvZ2FyaXRobSBvZiB0aGUgR2FtbWEgZnVuY3Rpb24gCisgKiB3aXRoIHVzZXIgcHJvdmlkZSBwb2ludGVyIGZvciB0aGUgc2lnbiBvZiBHYW1tYSh4KS4gCisgKgorICogTWV0aG9kOgorICogICAxLiBBcmd1bWVudCBSZWR1Y3Rpb24gZm9yIDAgPCB4IDw9IDgKKyAqIAlTaW5jZSBnYW1tYSgxK3MpPXMqZ2FtbWEocyksIGZvciB4IGluIFswLDhdLCB3ZSBtYXkgCisgKiAJcmVkdWNlIHggdG8gYSBudW1iZXIgaW4gWzEuNSwyLjVdIGJ5CisgKiAJCWxnYW1tYSgxK3MpID0gbG9nKHMpICsgbGdhbW1hKHMpCisgKglmb3IgZXhhbXBsZSwKKyAqCQlsZ2FtbWEoNy4zKSA9IGxvZyg2LjMpICsgbGdhbW1hKDYuMykKKyAqCQkJICAgID0gbG9nKDYuMyo1LjMpICsgbGdhbW1hKDUuMykKKyAqCQkJICAgID0gbG9nKDYuMyo1LjMqNC4zKjMuMyoyLjMpICsgbGdhbW1hKDIuMykKKyAqICAgMi4gUG9seW5vbWlhbCBhcHByb3hpbWF0aW9uIG9mIGxnYW1tYSBhcm91bmQgaXRzCisgKgltaW5pbXVuIHltaW49MS40NjE2MzIxNDQ5NjgzNjIyNDUgdG8gbWFpbnRhaW4gbW9ub3RvbmljaXR5LgorICoJT24gW3ltaW4tMC4yMywgeW1pbiswLjI3XSAoaS5lLiwgWzEuMjMxNjQsMS43MzE2M10pLCB1c2UKKyAqCQlMZXQgeiA9IHgteW1pbjsKKyAqCQlsZ2FtbWEoeCkgPSAtMS4yMTQ4NjI5MDUzNTg0OTYwNzgyMTggKyB6XjIqcG9seSh6KQorICoJd2hlcmUKKyAqCQlwb2x5KHopIGlzIGEgMTQgZGVncmVlIHBvbHlub21pYWwuCisgKiAgIDIuIFJhdGlvbmFsIGFwcHJveGltYXRpb24gaW4gdGhlIHByaW1hcnkgaW50ZXJ2YWwgWzIsM10KKyAqCVdlIHVzZSB0aGUgZm9sbG93aW5nIGFwcHJveGltYXRpb246CisgKgkJcyA9IHgtMi4wOworICoJCWxnYW1tYSh4KSA9IDAuNSpzICsgcypQKHMpL1EocykKKyAqCXdpdGggYWNjdXJhY3kKKyAqCQl8UC9RIC0gKGxnYW1tYSh4KS0wLjVzKXwgPCAyKiotNjEuNzEKKyAqCU91ciBhbGdvcml0aG1zIGFyZSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIG9ic2VydmF0aW9uCisgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpldGEoMiktMSAgICAyICAgIHpldGEoMyktMSAgICAzCisgKiBsZ2FtbWEoMitzKSA9IHMqKDEtRXVsZXIpICsgLS0tLS0tLS0tICogcyAgLSAgLS0tLS0tLS0tICogcyAgKyAuLi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgMworICoKKyAqCXdoZXJlIEV1bGVyID0gMC41NzcxLi4uIGlzIHRoZSBFdWxlciBjb25zdGFudCwgd2hpY2ggaXMgdmVyeQorICoJY2xvc2UgdG8gMC41LgorICoKKyAqICAgMy4gRm9yIHg+PTgsIHdlIGhhdmUKKyAqCWxnYW1tYSh4KX4oeC0wLjUpbG9nKHgpLXgrMC41KmxvZygycGkpKzEvKDEyeCktMS8oMzYweCoqMykrLi4uLgorICoJKGJldHRlciBmb3JtdWxhOgorICoJICAgbGdhbW1hKHgpfih4LTAuNSkqKGxvZyh4KS0xKS0uNSoobG9nKDJwaSktMSkgKyAuLi4pCisgKglMZXQgeiA9IDEveCwgdGhlbiB3ZSBhcHByb3hpbWF0aW9uCisgKgkJZih6KSA9IGxnYW1tYSh4KSAtICh4LTAuNSkobG9nKHgpLTEpCisgKglieQorICoJICAJCQkgICAgMyAgICAgICA1ICAgICAgICAgICAgIDExCisgKgkJdyA9IHcwICsgdzEqeiArIHcyKnogICsgdzMqeiAgKyAuLi4gKyB3Nip6CisgKgl3aGVyZSAKKyAqCQl8dyAtIGYoeil8IDwgMioqLTU4Ljc0CisgKgkJCisgKiAgIDQuIEZvciBuZWdhdGl2ZSB4LCBzaW5jZSAoRyBpcyBnYW1tYSBmdW5jdGlvbikKKyAqCQkteCpHKC14KSpHKHgpID0gcGkvc2luKHBpKngpLAorICogCXdlIGhhdmUKKyAqIAkJRyh4KSA9IHBpLyhzaW4ocGkqeCkqKC14KSpHKC14KSkKKyAqCXNpbmNlIEcoLXgpIGlzIHBvc2l0aXZlLCBzaWduKEcoeCkpID0gc2lnbihzaW4ocGkqeCkpIGZvciB4PDAKKyAqCUhlbmNlLCBmb3IgeDwwLCBzaWduZ2FtID0gc2lnbihzaW4ocGkqeCkpIGFuZCAKKyAqCQlsZ2FtbWEoeCkgPSBsb2cofEdhbW1hKHgpfCkKKyAqCQkJICA9IGxvZyhwaS8ofHgqc2luKHBpKngpfCkpIC0gbGdhbW1hKC14KTsKKyAqCU5vdGU6IG9uZSBzaG91bGQgYXZvaWQgY29tcHV0ZSBwaSooLXgpIGRpcmVjdGx5IGluIHRoZSAKKyAqCSAgICAgIGNvbXB1dGF0aW9uIG9mIHNpbihwaSooLXgpKS4KKyAqCQkKKyAqICAgNS4gU3BlY2lhbCBDYXNlcworICoJCWxnYW1tYSgyK3MpIH4gcyooMS1FdWxlcikgZm9yIHRpbnkgcworICoJCWxnYW1tYSgxKT1sZ2FtbWEoMik9MAorICoJCWxnYW1tYSh4KSB+IC1sb2coeCkgZm9yIHRpbnkgeAorICoJCWxnYW1tYSgwKSA9IGxnYW1tYShpbmYpID0gaW5mCisgKgkgCWxnYW1tYSgtaW50ZWdlcikgPSArLWluZgorICoJCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQordHdvNTI9ICA0LjUwMzU5OTYyNzM3MDQ5NjAwMDAwZSsxNSwgLyogMHg0MzMwMDAwMCwgMHgwMDAwMDAwMCAqLworaGFsZj0gIDUuMDAwMDAwMDAwMDAwMDAwMDAwMDBlLTAxLCAvKiAweDNGRTAwMDAwLCAweDAwMDAwMDAwICovCitvbmUgPSAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMGUrMDAsIC8qIDB4M0ZGMDAwMDAsIDB4MDAwMDAwMDAgKi8KK3BpICA9ICAzLjE0MTU5MjY1MzU4OTc5MzExNjAwZSswMCwgLyogMHg0MDA5MjFGQiwgMHg1NDQ0MkQxOCAqLworYTAgID0gIDcuNzIxNTY2NDkwMTUzMjg2NTU0OTRlLTAyLCAvKiAweDNGQjNDNDY3LCAweEUzN0RCMEM4ICovCithMSAgPSAgMy4yMjQ2NzAzMzQyNDExMzU5MTYxMWUtMDEsIC8qIDB4M0ZENEEzNEMsIDB4QzRBNjBGQUQgKi8KK2EyICA9ICA2LjczNTIzMDEwNTMxMjkyNjgxODI0ZS0wMiwgLyogMHgzRkIxM0UwMCwgMHgxQTU1NjJBNyAqLworYTMgID0gIDIuMDU4MDgwODQzMjUxNjczMzI4MDZlLTAyLCAvKiAweDNGOTUxMzIyLCAweEFDOTI1NDdCICovCithNCAgPSAgNy4zODU1NTA4NjA4MTQwMjg4Mzk1N2UtMDMsIC8qIDB4M0Y3RTQwNEYsIDB4QjY4RkVGRTggKi8KK2E1ICA9ICAyLjg5MDUxMzgzNjczNDE1NjI5MDkxZS0wMywgLyogMHgzRjY3QUREOCwgMHhDQ0I3OTI2QiAqLworYTYgID0gIDEuMTkyNzA3NjMxODMzNjIwNjc4NDVlLTAzLCAvKiAweDNGNTM4QTk0LCAweDExNkYzRjVEICovCithNyAgPSAgNS4xMDA2OTc5MjE1MzUxMTMzNjYwOGUtMDQsIC8qIDB4M0Y0MEI2QzYsIDB4ODlCOTlDMDAgKi8KK2E4ICA9ICAyLjIwODYyNzkwNzEzOTA4Mzg1NTU3ZS0wNCwgLyogMHgzRjJDRjJFQywgMHhFRDEwRTU0RCAqLworYTkgID0gIDEuMDgwMTE1NjcyNDc1ODM5Mzk5NTRlLTA0LCAvKiAweDNGMUM1MDg4LCAweDk4N0RGQjA3ICovCithMTAgPSAgMi41MjE0NDU2NTQ1MTI1NzMyNjkzOWUtMDUsIC8qIDB4M0VGQTcwNzQsIDB4NDI4Q0ZBNTIgKi8KK2ExMSA9ICA0LjQ4NjQwOTQ5NjE4OTE1MTYwMTUwZS0wNSwgLyogMHgzRjA3ODU4RSwgMHg5MEE0NTgzNyAqLwordGMgID0gIDEuNDYxNjMyMTQ0OTY4MzYyMjQ1NzZlKzAwLCAvKiAweDNGRjc2MkQ4LCAweDYzNTZCRTNGICovCit0ZiAgPSAtMS4yMTQ4NjI5MDUzNTg0OTYxMTQ2MWUtMDEsIC8qIDB4QkZCRjE5QjksIDB4QkNDMzhBNDIgKi8KKy8qIHR0ID0gLSh0YWlsIG9mIHRmKSAqLwordHQgID0gLTMuNjM4Njc2OTk3MDM5NTA1MzY1NDFlLTE4LCAvKiAweEJDNTBDN0NBLCAweEE0OEE5NzFGICovCit0MCAgPSAgNC44MzgzNjEyMjcyMzgxMDA0NzA0MmUtMDEsIC8qIDB4M0ZERUY3MkIsIDB4QzhFRTM4QTIgKi8KK3QxICA9IC0xLjQ3NTg3NzIyOTk0NTkzOTExNzUyZS0wMSwgLyogMHhCRkMyRTQyNywgMHg4REM2QzUwOSAqLwordDIgID0gIDYuNDYyNDk0MDIzOTEzMzM4NTQ3NzhlLTAyLCAvKiAweDNGQjA4QjQyLCAweDk0RDU0MTlCICovCit0MyAgPSAtMy4yNzg4NTQxMDc1OTg1OTY0OTU2NWUtMDIsIC8qIDB4QkZBMEM5QTgsIDB4REYzNUI3MTMgKi8KK3Q0ICA9ICAxLjc5NzA2NzUwODExODIwMzg3MTI2ZS0wMiwgLyogMHgzRjkyNjZFNywgMHg5NzBBRjlFQyAqLwordDUgID0gLTEuMDMxNDIyNDEyOTgzNDE0Mzc0NTBlLTAyLCAvKiAweEJGODUxRjlGLCAweEJBOTFFQzZBICovCit0NiAgPSAgNi4xMDA1Mzg3MDI0NjI5MTMzMjYzNWUtMDMsIC8qIDB4M0Y3OEZDRTAsIDB4RTM3MEUzNDQgKi8KK3Q3ICA9IC0zLjY4NDUyMDE2NzgxMTM4MjU2NzYwZS0wMywgLyogMHhCRjZFMkVGRiwgMHhCM0U5MTRENyAqLwordDggID0gIDIuMjU5NjQ3ODA5MDA2MTI0NzIyNTBlLTAzLCAvKiAweDNGNjI4MkQzLCAweDJFMTVDOTE1ICovCit0OSAgPSAtMS40MDM0NjQ2OTk4OTIzMjg0MzgxM2UtMDMsIC8qIDB4QkY1NkZFOEUsIDB4QkYyRDFBRjEgKi8KK3QxMCA9ICA4LjgxMDgxODgyNDM3NjU0MDExMzgyZS0wNCwgLyogMHgzRjRDREYwQywgMHhFRjYxQThFOSAqLwordDExID0gLTUuMzg1OTUzMDUzNTY3NDA1NDY3MTVlLTA0LCAvKiAweEJGNDFBNjEwLCAweDlDNzNFMEVDICovCit0MTIgPSAgMy4xNTYzMjA3MDkwMzYyNTk1MDM2MWUtMDQsIC8qIDB4M0YzNEFGNkQsIDB4NkMwRUJCRjcgKi8KK3QxMyA9IC0zLjEyNzU0MTY4Mzc1MTIwODYwNTE4ZS0wNCwgLyogMHhCRjM0N0YyNCwgMHhFQ0MzOEMzOCAqLwordDE0ID0gIDMuMzU1MjkxOTI2MzU1MTkwNzM1NDNlLTA0LCAvKiAweDNGMzVGRDNFLCAweEU4QzJEM0Y0ICovCit1MCAgPSAtNy43MjE1NjY0OTAxNTMyODY1NTQ5NGUtMDIsIC8qIDB4QkZCM0M0NjcsIDB4RTM3REIwQzggKi8KK3UxICA9ICA2LjMyODI3MDY0MDI1MDkzMzY2NTE3ZS0wMSwgLyogMHgzRkU0NDAxRSwgMHg4QjAwNURGRiAqLwordTIgID0gIDEuNDU0OTIyNTAxMzcyMzQ3Njg3MzdlKzAwLCAvKiAweDNGRjc0NzVDLCAweEQxMTlCRDZGICovCit1MyAgPSAgOS43NzcxNzUyNzk2MzM3Mjc0NTYwM2UtMDEsIC8qIDB4M0ZFRjQ5NzYsIDB4NDRFQTg0NTAgKi8KK3U0ICA9ICAyLjI4OTYzNzI4MDY0NjkyNDUxMDkyZS0wMSwgLyogMHgzRkNENEVBRSwgMHhGNjAxMDkyNCAqLwordTUgID0gIDEuMzM4MTA5MTg1MzY3ODc2NjAzNzdlLTAyLCAvKiAweDNGOEI2NzhCLCAweEJGMkJBQjA5ICovCit2MSAgPSAgMi40NTU5Nzc5MzcxMzA0MTEzNDgyMmUrMDAsIC8qIDB4NDAwM0E1RDcsIDB4QzJCRDYxOUMgKi8KK3YyICA9ICAyLjEyODQ4OTc2Mzc5ODkzMzk1MzYxZSswMCwgLyogMHg0MDAxMDcyNSwgMHhBNDJCMThGNSAqLwordjMgID0gIDcuNjkyODUxNTA0NTY2NzI3ODM4MjVlLTAxLCAvKiAweDNGRTg5REZCLCAweEU0NTA1MEFGICovCit2NCAgPSAgMS4wNDIyMjY0NTU5MzM2OTEzNDI1NGUtMDEsIC8qIDB4M0ZCQUFFNTUsIDB4RDY1MzdDODggKi8KK3Y1ICA9ICAzLjIxNzA5MjQyMjgyNDIzOTExODEwZS0wMywgLyogMHgzRjZBNUFCQiwgMHg1N0QwQ0Y2MSAqLworczAgID0gLTcuNzIxNTY2NDkwMTUzMjg2NTU0OTRlLTAyLCAvKiAweEJGQjNDNDY3LCAweEUzN0RCMEM4ICovCitzMSAgPSAgMi4xNDk4MjQxNTk2MDYwODg1MjUwMWUtMDEsIC8qIDB4M0ZDQjg0OEIsIDB4MzZFMjA4NzggKi8KK3MyICA9ICAzLjI1Nzc4Nzk2NDA4OTMwOTgxNzg3ZS0wMSwgLyogMHgzRkQ0RDk4RiwgMHg0RjEzOUY1OSAqLworczMgID0gIDEuNDYzNTA0NzI2NTI0NjQ0NTI4MDVlLTAxLCAvKiAweDNGQzJCQjlDLCAweEJFRTVGMkY3ICovCitzNCAgPSAgMi42NjQyMjcwMzAzMzYzODYwOTU2MGUtMDIsIC8qIDB4M0Y5QjQ4MUMsIDB4N0U5Mzk5NjEgKi8KK3M1ICA9ICAxLjg0MDI4NDUxNDA3MzM3NzE1NjUyZS0wMywgLyogMHgzRjVFMjZCNiwgMHg3MzY4RjIzOSAqLworczYgID0gIDMuMTk0NzUzMjY1ODQxMDA4Njc2MTdlLTA1LCAvKiAweDNGMDBCRkVDLCAweEREMTdFOTQ1ICovCityMSAgPSAgMS4zOTIwMDUzMzQ2NzYyMTA0NTk1OGUrMDAsIC8qIDB4M0ZGNjQ1QTcsIDB4NjJDNEFCNzQgKi8KK3IyICA9ICA3LjIxOTM1NTQ3NTY3MTM4MDY5NTI1ZS0wMSwgLyogMHgzRkU3MUExOCwgMHg5M0QzRENEQyAqLworcjMgID0gIDEuNzE5MzM4NjU2MzI4MDMwNzg5OTNlLTAxLCAvKiAweDNGQzYwMUVELCAweENDRkJERjI3ICovCityNCAgPSAgMS44NjQ1OTE5MTcxNTY1MjkwMTM0NGUtMDIsIC8qIDB4M0Y5MzE3RUEsIDB4NzQyRUQ0NzUgKi8KK3I1ICA9ICA3Ljc3OTQyNDk2MzgxODkzNTk2NDM0ZS0wNCwgLyogMHgzRjQ5N0REQSwgMHhDQTQxQTk1QiAqLworcjYgID0gIDcuMzI2Njg0MzA3NDQ2MjU2MzYxODllLTA2LCAvKiAweDNFREVCQUY3LCAweEE1QjM4MTQwICovCit3MCAgPSAgNC4xODkzODUzMzIwNDY3MjcyNTA1MmUtMDEsIC8qIDB4M0ZEQUNGRTMsIDB4OTBDOTdENjkgKi8KK3cxICA9ICA4LjMzMzMzMzMzMzMzMzI5Njc4ODQ5ZS0wMiwgLyogMHgzRkI1NTU1NSwgMHg1NTU1NTUzQiAqLwordzIgID0gLTIuNzc3Nzc3Nzc3Mjg3NzU1MzY0NzBlLTAzLCAvKiAweEJGNjZDMTZDLCAweDE2QjAyRTVDICovCit3MyAgPSAgNy45MzY1MDU1ODY0MzAxOTU1ODUwMGUtMDQsIC8qIDB4M0Y0QTAxOUYsIDB4OThDRjM4QjYgKi8KK3c0ICA9IC01Ljk1MTg3NTU3NDUwMzM5OTYzMTM1ZS0wNCwgLyogMHhCRjQzODBDQiwgMHg4QzBGRTc0MSAqLwordzUgID0gIDguMzYzMzk5MTg5OTYyODIxMzkxMjZlLTA0LCAvKiAweDNGNEI2N0JBLCAweDRDREFENUQxICovCit3NiAgPSAtMS42MzA5MjkzNDA5NjU3NTI3Mzk4OWUtMDM7IC8qIDB4QkY1QUI4OUQsIDB4MEI5RTQzRTQgKi8KKworc3RhdGljIGNvbnN0IGRvdWJsZSB6ZXJvPSAgMC4wMDAwMDAwMDAwMDAwMDAwMDAwMGUrMDA7CisKKwlzdGF0aWMgZG91YmxlIHNpbl9waShkb3VibGUgeCkKK3sKKwlkb3VibGUgeSx6OworCWludCBuLGl4OworCisJR0VUX0hJR0hfV09SRChpeCx4KTsKKwlpeCAmPSAweDdmZmZmZmZmOworCisJaWYoaXg8MHgzZmQwMDAwMCkgcmV0dXJuIF9fa2VybmVsX3NpbihwaSp4LHplcm8sMCk7CisJeSA9IC14OwkJLyogeCBpcyBhc3N1bWUgbmVnYXRpdmUgKi8KKworICAgIC8qCisgICAgICogYXJndW1lbnQgcmVkdWN0aW9uLCBtYWtlIHN1cmUgaW5leGFjdCBmbGFnIG5vdCByYWlzZWQgaWYgaW5wdXQKKyAgICAgKiBpcyBhbiBpbnRlZ2VyCisgICAgICovCisJeiA9IGZsb29yKHkpOworCWlmKHohPXkpIHsJCQkJLyogaW5leGFjdCBhbnl3YXkgKi8KKwkgICAgeSAgKj0gMC41OworCSAgICB5ICAgPSAyLjAqKHkgLSBmbG9vcih5KSk7CQkvKiB5ID0gfHh8IG1vZCAyLjAgKi8KKwkgICAgbiAgID0gKGludCkgKHkqNC4wKTsKKwl9IGVsc2UgeworICAgICAgICAgICAgaWYoaXg+PTB4NDM0MDAwMDApIHsKKyAgICAgICAgICAgICAgICB5ID0gemVybzsgbiA9IDA7ICAgICAgICAgICAgICAgICAvKiB5IG11c3QgYmUgZXZlbiAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZihpeDwweDQzMzAwMDAwKSB6ID0geSt0d281MjsJLyogZXhhY3QgKi8KKwkJR0VUX0xPV19XT1JEKG4seik7CisJCW4gJj0gMTsKKyAgICAgICAgICAgICAgICB5ICA9IG47CisgICAgICAgICAgICAgICAgbjw8PSAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisJc3dpdGNoIChuKSB7CisJICAgIGNhc2UgMDogICB5ID0gIF9fa2VybmVsX3NpbihwaSp5LHplcm8sMCk7IGJyZWFrOworCSAgICBjYXNlIDE6ICAgCisJICAgIGNhc2UgMjogICB5ID0gIF9fa2VybmVsX2NvcyhwaSooMC41LXkpLHplcm8pOyBicmVhazsKKwkgICAgY2FzZSAzOiAgCisJICAgIGNhc2UgNDogICB5ID0gIF9fa2VybmVsX3NpbihwaSoob25lLXkpLHplcm8sMCk7IGJyZWFrOworCSAgICBjYXNlIDU6CisJICAgIGNhc2UgNjogICB5ID0gLV9fa2VybmVsX2NvcyhwaSooeS0xLjUpLHplcm8pOyBicmVhazsKKwkgICAgZGVmYXVsdDogIHkgPSAgX19rZXJuZWxfc2luKHBpKih5LTIuMCksemVybywwKTsgYnJlYWs7CisJICAgIH0KKwlyZXR1cm4gLXk7Cit9CisKKworZG91YmxlCitfX2llZWU3NTRfbGdhbW1hX3IoZG91YmxlIHgsIGludCAqc2lnbmdhbXApCit7CisJZG91YmxlIHQseSx6LG5hZGoscCxwMSxwMixwMyxxLHIsdzsKKwlpbnQgaSxoeCxseCxpeDsKKworCUVYVFJBQ1RfV09SRFMoaHgsbHgseCk7CisKKyAgICAvKiBwdXJnZSBvZmYgKy1pbmYsIE5hTiwgKy0wLCBhbmQgbmVnYXRpdmUgYXJndW1lbnRzICovCisJKnNpZ25nYW1wID0gMTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4N2ZmMDAwMDApIHJldHVybiB4Kng7CisJaWYoKGl4fGx4KT09MCkgcmV0dXJuIG9uZS96ZXJvOworCWlmKGl4PDB4M2I5MDAwMDApIHsJLyogfHh8PDIqKi03MCwgcmV0dXJuIC1sb2cofHh8KSAqLworCSAgICBpZihoeDwwKSB7CisJICAgICAgICAqc2lnbmdhbXAgPSAtMTsKKwkgICAgICAgIHJldHVybiAtX19pZWVlNzU0X2xvZygteCk7CisJICAgIH0gZWxzZSByZXR1cm4gLV9faWVlZTc1NF9sb2coeCk7CisJfQorCWlmKGh4PDApIHsKKwkgICAgaWYoaXg+PTB4NDMzMDAwMDApIAkvKiB8eHw+PTIqKjUyLCBtdXN0IGJlIC1pbnRlZ2VyICovCisJCXJldHVybiBvbmUvemVybzsKKwkgICAgdCA9IHNpbl9waSh4KTsKKwkgICAgaWYodD09emVybykgcmV0dXJuIG9uZS96ZXJvOyAvKiAtaW50ZWdlciAqLworCSAgICBuYWRqID0gX19pZWVlNzU0X2xvZyhwaS9mYWJzKHQqeCkpOworCSAgICBpZih0PHplcm8pICpzaWduZ2FtcCA9IC0xOworCSAgICB4ID0gLXg7CisJfQorCisgICAgLyogcHVyZ2Ugb2ZmIDEgYW5kIDIgKi8KKwlpZigoKChpeC0weDNmZjAwMDAwKXxseCk9PTApfHwoKChpeC0weDQwMDAwMDAwKXxseCk9PTApKSByID0gMDsKKyAgICAvKiBmb3IgeCA8IDIuMCAqLworCWVsc2UgaWYoaXg8MHg0MDAwMDAwMCkgeworCSAgICBpZihpeDw9MHgzZmVjY2NjYykgeyAJLyogbGdhbW1hKHgpID0gbGdhbW1hKHgrMSktbG9nKHgpICovCisJCXIgPSAtX19pZWVlNzU0X2xvZyh4KTsKKwkJaWYoaXg+PTB4M0ZFNzY5NDQpIHt5ID0gb25lLXg7IGk9IDA7fQorCQllbHNlIGlmKGl4Pj0weDNGQ0RBNjYxKSB7eT0geC0odGMtb25lKTsgaT0xO30KKwkgIAllbHNlIHt5ID0geDsgaT0yO30KKwkgICAgfSBlbHNlIHsKKwkgIAlyID0gemVybzsKKwkgICAgICAgIGlmKGl4Pj0weDNGRkJCNEMzKSB7eT0yLjAteDtpPTA7fSAvKiBbMS43MzE2LDJdICovCisJICAgICAgICBlbHNlIGlmKGl4Pj0weDNGRjNCNEM0KSB7eT14LXRjO2k9MTt9IC8qIFsxLjIzLDEuNzNdICovCisJCWVsc2Uge3k9eC1vbmU7aT0yO30KKwkgICAgfQorCSAgICBzd2l0Y2goaSkgeworCSAgICAgIGNhc2UgMDoKKwkJeiA9IHkqeTsKKwkJcDEgPSBhMCt6KihhMit6KihhNCt6KihhNit6KihhOCt6KmExMCkpKSk7CisJCXAyID0geiooYTEreiooYTMreiooYTUreiooYTcreiooYTkreiphMTEpKSkpKTsKKwkJcCAgPSB5KnAxK3AyOworCQlyICArPSAocC0wLjUqeSk7IGJyZWFrOworCSAgICAgIGNhc2UgMToKKwkJeiA9IHkqeTsKKwkJdyA9IHoqeTsKKwkJcDEgPSB0MCt3Kih0Myt3Kih0Nit3Kih0OSArdyp0MTIpKSk7CS8qIHBhcmFsbGVsIGNvbXAgKi8KKwkJcDIgPSB0MSt3Kih0NCt3Kih0Nyt3Kih0MTArdyp0MTMpKSk7CisJCXAzID0gdDIrdyoodDUrdyoodDgrdyoodDExK3cqdDE0KSkpOworCQlwICA9IHoqcDEtKHR0LXcqKHAyK3kqcDMpKTsKKwkJciArPSAodGYgKyBwKTsgYnJlYWs7CisJICAgICAgY2FzZSAyOgkKKwkJcDEgPSB5Kih1MCt5Kih1MSt5Kih1Mit5Kih1Myt5Kih1NCt5KnU1KSkpKSk7CisJCXAyID0gb25lK3kqKHYxK3kqKHYyK3kqKHYzK3kqKHY0K3kqdjUpKSkpOworCQlyICs9ICgtMC41KnkgKyBwMS9wMik7CisJICAgIH0KKwl9CisJZWxzZSBpZihpeDwweDQwMjAwMDAwKSB7IAkJCS8qIHggPCA4LjAgKi8KKwkgICAgaSA9IChpbnQpeDsKKwkgICAgdCA9IHplcm87CisJICAgIHkgPSB4LShkb3VibGUpaTsKKwkgICAgcCA9IHkqKHMwK3kqKHMxK3kqKHMyK3kqKHMzK3kqKHM0K3kqKHM1K3kqczYpKSkpKSk7CisJICAgIHEgPSBvbmUreSoocjEreSoocjIreSoocjMreSoocjQreSoocjUreSpyNikpKSkpOworCSAgICByID0gaGFsZip5K3AvcTsKKwkgICAgeiA9IG9uZTsJLyogbGdhbW1hKDErcykgPSBsb2cocykgKyBsZ2FtbWEocykgKi8KKwkgICAgc3dpdGNoKGkpIHsKKwkgICAgY2FzZSA3OiB6ICo9ICh5KzYuMCk7CS8qIEZBTExUSFJVICovCisJICAgIGNhc2UgNjogeiAqPSAoeSs1LjApOwkvKiBGQUxMVEhSVSAqLworCSAgICBjYXNlIDU6IHogKj0gKHkrNC4wKTsJLyogRkFMTFRIUlUgKi8KKwkgICAgY2FzZSA0OiB6ICo9ICh5KzMuMCk7CS8qIEZBTExUSFJVICovCisJICAgIGNhc2UgMzogeiAqPSAoeSsyLjApOwkvKiBGQUxMVEhSVSAqLworCQkgICAgciArPSBfX2llZWU3NTRfbG9nKHopOyBicmVhazsKKwkgICAgfQorICAgIC8qIDguMCA8PSB4IDwgMioqNTggKi8KKwl9IGVsc2UgaWYgKGl4IDwgMHg0MzkwMDAwMCkgeworCSAgICB0ID0gX19pZWVlNzU0X2xvZyh4KTsKKwkgICAgeiA9IG9uZS94OworCSAgICB5ID0geip6OworCSAgICB3ID0gdzAreioodzEreSoodzIreSoodzMreSoodzQreSoodzUreSp3NikpKSkpOworCSAgICByID0gKHgtaGFsZikqKHQtb25lKSt3OworCX0gZWxzZSAKKyAgICAvKiAyKio1OCA8PSB4IDw9IGluZiAqLworCSAgICByID0gIHgqKF9faWVlZTc1NF9sb2coeCktb25lKTsKKwlpZihoeDwwKSByID0gbmFkaiAtIHI7CisJcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2xnYW1tYWYuYyBiL2xpYm0vc3JjL2VfbGdhbW1hZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZjQ4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2xnYW1tYWYuYwpAQCAtMCwwICsxLDM1IEBACisvKiBlX2xnYW1tYWYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfbGdhbW1hLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2xnYW1tYWYuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X2xnYW1tYWYoeCkKKyAqIFJldHVybiB0aGUgbG9nYXJpdGhtIG9mIHRoZSBHYW1tYSBmdW5jdGlvbiBvZiB4LgorICoKKyAqIE1ldGhvZDogY2FsbCBfX2llZWU3NTRfbGdhbW1hZl9yCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZXh0ZXJuIGludCBzaWduZ2FtOworCitmbG9hdAorX19pZWVlNzU0X2xnYW1tYWYoZmxvYXQgeCkKK3sKKwlyZXR1cm4gX19pZWVlNzU0X2xnYW1tYWZfcih4LCZzaWduZ2FtKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfbGdhbW1hZl9yLmMgYi9saWJtL3NyYy9lX2xnYW1tYWZfci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNTUyMDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2xnYW1tYWZfci5jCkBAIC0wLDAgKzEsMjMxIEBACisvKiBlX2xnYW1tYWZfci5jIC0tIGZsb2F0IHZlcnNpb24gb2YgZV9sZ2FtbWFfci5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9sZ2FtbWFmX3IuYyx2IDEuOSAyMDA1LzExLzI4IDA4OjMyOjE1IGJkZSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0Cit0d28yMz0gIDguMzg4NjA4MDAwMGUrMDYsIC8qIDB4NGIwMDAwMDAgKi8KK2hhbGY9ICA1LjAwMDAwMDAwMDBlLTAxLCAvKiAweDNmMDAwMDAwICovCitvbmUgPSAgMS4wMDAwMDAwMDAwZSswMCwgLyogMHgzZjgwMDAwMCAqLworcGkgID0gIDMuMTQxNTkyNzQxMGUrMDAsIC8qIDB4NDA0OTBmZGIgKi8KK2EwICA9ICA3LjcyMTU2NjQwODllLTAyLCAvKiAweDNkOWUyMzNmICovCithMSAgPSAgMy4yMjQ2NzAyOTA5ZS0wMSwgLyogMHgzZWE1MWE2NiAqLworYTIgID0gIDYuNzM1MjMwMjM3MmUtMDIsIC8qIDB4M2Q4OWYwMDEgKi8KK2EzICA9ICAyLjA1ODA4MDc3MDFlLTAyLCAvKiAweDNjYTg5OTE1ICovCithNCAgPSAgNy4zODU1NTA5OTgyZS0wMywgLyogMHgzYmYyMDI3ZSAqLworYTUgID0gIDIuODkwNTEzNzQ0MmUtMDMsIC8qIDB4M2IzZDZlYzYgKi8KK2E2ICA9ICAxLjE5MjcwNzY4NDhlLTAzLCAvKiAweDNhOWM1NGExICovCithNyAgPSAgNS4xMDA2OTc3NDQ2ZS0wNCwgLyogMHgzYTA1YjYzNCAqLworYTggID0gIDIuMjA4NjI3ODQ3N2UtMDQsIC8qIDB4Mzk2Nzk3NjcgKi8KK2E5ICA9ICAxLjA4MDExNTY4OTVlLTA0LCAvKiAweDM4ZTI4NDQ1ICovCithMTAgPSAgMi41MjE0NDU2NDAwZS0wNSwgLyogMHgzN2QzODNhMiAqLworYTExID0gIDQuNDg2NDA5NjcwOGUtMDUsIC8qIDB4MzgzYzJjNzUgKi8KK3RjICA9ICAxLjQ2MTYzMjEzMjVlKzAwLCAvKiAweDNmYmIxNmMzICovCit0ZiAgPSAtMS4yMTQ4NjI4Mzg0ZS0wMSwgLyogMHhiZGY4Y2RjZCAqLworLyogdHQgPSAtKHRhaWwgb2YgdGYpICovCit0dCAgPSAgNi42OTcxMDA2NTE4ZS0wOSwgLyogMHgzMWU2MWM1MiAqLwordDAgID0gIDQuODM4MzYxMTQ0MWUtMDEsIC8qIDB4M2VmN2I5NWUgKi8KK3QxICA9IC0xLjQ3NTg3NzE2NThlLTAxLCAvKiAweGJlMTcyMTNjICovCit0MiAgPSAgNi40NjI0OTQyODM5ZS0wMiwgLyogMHgzZDg0NWExNSAqLwordDMgID0gLTMuMjc4ODU0MTE2OGUtMDIsIC8qIDB4YmQwNjRkNDcgKi8KK3Q0ICA9ICAxLjc5NzA2NzU2MDNlLTAyLCAvKiAweDNjOTMzNzNkICovCit0NSAgPSAtMS4wMzE0MjI0Mjg4ZS0wMiwgLyogMHhiYzI4ZmNmZSAqLwordDYgID0gIDYuMTAwNTM4NjUyNGUtMDMsIC8qIDB4M2JjN2U3MDcgKi8KK3Q3ICA9IC0zLjY4NDUyMDI1NThlLTAzLCAvKiAweGJiNzE3N2ZlICovCit0OCAgPSAgMi4yNTk2NDc3MDY1ZS0wMywgLyogMHgzYjE0MTY5OSAqLwordDkgID0gLTEuNDAzNDY0NzAyOWUtMDMsIC8qIDB4YmFiN2Y0NzYgKi8KK3QxMCA9ICA4LjgxMDgxODU0NDZlLTA0LCAvKiAweDNhNjZmODY3ICovCit0MTEgPSAtNS4zODU5NTMxMTgxZS0wNCwgLyogMHhiYTBkMzA4NSAqLwordDEyID0gIDMuMTU2MzIwNTk5NGUtMDQsIC8qIDB4MzlhNTdiNmIgKi8KK3QxMyA9IC0zLjEyNzU0MTU2NzdlLTA0LCAvKiAweGI5YTNmOTI3ICovCit0MTQgPSAgMy4zNTUyOTE4NDY3ZS0wNCwgLyogMHgzOWFmZTlmNyAqLwordTAgID0gLTcuNzIxNTY2NDA4OWUtMDIsIC8qIDB4YmQ5ZTIzM2YgKi8KK3UxICA9ICA2LjMyODI3MDQzNTNlLTAxLCAvKiAweDNmMjIwMGY0ICovCit1MiAgPSAgMS40NTQ5MjI1NTY5ZSswMCwgLyogMHgzZmJhM2FlNyAqLwordTMgID0gIDkuNzc3MTc1MTg4MWUtMDEsIC8qIDB4M2Y3YTRiYjIgKi8KK3U0ICA9ICAyLjI4OTYzNzMyNzJlLTAxLCAvKiAweDNlNmE3NTc4ICovCit1NSAgPSAgMS4zMzgxMDkxODc4ZS0wMiwgLyogMHgzYzViM2M1ZSAqLwordjEgID0gIDIuNDU1OTc3OTE2N2UrMDAsIC8qIDB4NDAxZDJlYmUgKi8KK3YyICA9ICAyLjEyODQ4OTczMjdlKzAwLCAvKiAweDQwMDgzOTJkICovCit2MyAgPSAgNy42OTI4NTE0MjQyZS0wMSwgLyogMHgzZjQ0ZWZkZiAqLwordjQgID0gIDEuMDQyMjI2NDc4NWUtMDEsIC8qIDB4M2RkNTcyYWYgKi8KK3Y1ICA9ICAzLjIxNzA5MjQ4MjRlLTAzLCAvKiAweDNiNTJkNWRiICovCitzMCAgPSAtNy43MjE1NjY0MDg5ZS0wMiwgLyogMHhiZDllMjMzZiAqLworczEgID0gIDIuMTQ5ODI0MjAyMWUtMDEsIC8qIDB4M2U1YzI0NWEgKi8KK3MyICA9ICAzLjI1Nzc4NzgyMzdlLTAxLCAvKiAweDNlYTZjYzdhICovCitzMyAgPSAgMS40NjM1MDQ3MzE3ZS0wMSwgLyogMHgzZTE1ZGNlNiAqLworczQgID0gIDIuNjY0MjI3MDM4NmUtMDIsIC8qIDB4M2NkYTQwZTQgKi8KK3M1ICA9ICAxLjg0MDI4NDU1OTllLTAzLCAvKiAweDNhZjEzNWI0ICovCitzNiAgPSAgMy4xOTQ3NTMyOTg5ZS0wNSwgLyogMHgzODA1ZmY2NyAqLworcjEgID0gIDEuMzkyMDA1MzI0NGUrMDAsIC8qIDB4M2ZiMjJkM2IgKi8KK3IyICA9ICA3LjIxOTM1NTcwMjRlLTAxLCAvKiAweDNmMzhkMGM1ICovCityMyAgPSAgMS43MTkzMzg1OTU5ZS0wMSwgLyogMHgzZTMwMGY2ZSAqLworcjQgID0gIDEuODY0NTkxOTg1OWUtMDIsIC8qIDB4M2M5OGJmNTQgKi8KK3I1ICA9ICA3Ljc3OTQyNDc3NzNlLTA0LCAvKiAweDNhNGJlZWQ2ICovCityNiAgPSAgNy4zMjY2ODQyMjY0ZS0wNiwgLyogMHgzNmY1ZDdiZCAqLwordzAgID0gIDQuMTg5Mzg1NDczN2UtMDEsIC8qIDB4M2VkNjdmMWQgKi8KK3cxICA9ICA4LjMzMzMzMzU4MTdlLTAyLCAvKiAweDNkYWFhYWFiICovCit3MiAgPSAtMi43Nzc3Nzc4NDUwZS0wMywgLyogMHhiYjM2MGI2MSAqLwordzMgID0gIDcuOTM2NTA1NzE3MmUtMDQsIC8qIDB4M2E1MDBjZmQgKi8KK3c0ICA9IC01Ljk1MTg3NTM1NTFlLTA0LCAvKiAweGJhMWMwNjVjICovCit3NSAgPSAgOC4zNjMzOTg5NTYxZS0wNCwgLyogMHgzYTViM2RkMiAqLwordzYgID0gLTEuNjMwOTI5Mjk4N2UtMDM7IC8qIDB4YmFkNWM0ZTggKi8KKworc3RhdGljIGNvbnN0IGZsb2F0IHplcm89ICAwLjAwMDAwMDAwMDBlKzAwOworCisJc3RhdGljIGZsb2F0IHNpbl9waWYoZmxvYXQgeCkKK3sKKwlmbG9hdCB5LHo7CisJaW50IG4saXg7CisKKwlHRVRfRkxPQVRfV09SRChpeCx4KTsKKwlpeCAmPSAweDdmZmZmZmZmOworCisJaWYoaXg8MHgzZTgwMDAwMCkgcmV0dXJuIF9fa2VybmVsX3NpbmRmKHBpKngpOworCXkgPSAteDsJCS8qIHggaXMgYXNzdW1lIG5lZ2F0aXZlICovCisKKyAgICAvKgorICAgICAqIGFyZ3VtZW50IHJlZHVjdGlvbiwgbWFrZSBzdXJlIGluZXhhY3QgZmxhZyBub3QgcmFpc2VkIGlmIGlucHV0CisgICAgICogaXMgYW4gaW50ZWdlcgorICAgICAqLworCXogPSBmbG9vcmYoeSk7CisJaWYoeiE9eSkgewkJCQkvKiBpbmV4YWN0IGFueXdheSAqLworCSAgICB5ICAqPSAoZmxvYXQpMC41OworCSAgICB5ICAgPSAoZmxvYXQpMi4wKih5IC0gZmxvb3JmKHkpKTsJLyogeSA9IHx4fCBtb2QgMi4wICovCisJICAgIG4gICA9IChpbnQpICh5KihmbG9hdCk0LjApOworCX0gZWxzZSB7CisgICAgICAgICAgICBpZihpeD49MHg0YjgwMDAwMCkgeworICAgICAgICAgICAgICAgIHkgPSB6ZXJvOyBuID0gMDsgICAgICAgICAgICAgICAgIC8qIHkgbXVzdCBiZSBldmVuICovCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmKGl4PDB4NGIwMDAwMDApIHogPSB5K3R3bzIzOwkvKiBleGFjdCAqLworCQlHRVRfRkxPQVRfV09SRChuLHopOworCQluICY9IDE7CisgICAgICAgICAgICAgICAgeSAgPSBuOworICAgICAgICAgICAgICAgIG48PD0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCXN3aXRjaCAobikgeworCSAgICBjYXNlIDA6ICAgeSA9ICBfX2tlcm5lbF9zaW5kZihwaSp5KTsgYnJlYWs7CisJICAgIGNhc2UgMToKKwkgICAgY2FzZSAyOiAgIHkgPSAgX19rZXJuZWxfY29zZGYocGkqKChmbG9hdCkwLjUteSkpOyBicmVhazsKKwkgICAgY2FzZSAzOgorCSAgICBjYXNlIDQ6ICAgeSA9ICBfX2tlcm5lbF9zaW5kZihwaSoob25lLXkpKTsgYnJlYWs7CisJICAgIGNhc2UgNToKKwkgICAgY2FzZSA2OiAgIHkgPSAtX19rZXJuZWxfY29zZGYocGkqKHktKGZsb2F0KTEuNSkpOyBicmVhazsKKwkgICAgZGVmYXVsdDogIHkgPSAgX19rZXJuZWxfc2luZGYocGkqKHktKGZsb2F0KTIuMCkpOyBicmVhazsKKwkgICAgfQorCXJldHVybiAteTsKK30KKworCitmbG9hdAorX19pZWVlNzU0X2xnYW1tYWZfcihmbG9hdCB4LCBpbnQgKnNpZ25nYW1wKQoreworCWZsb2F0IHQseSx6LG5hZGoscCxwMSxwMixwMyxxLHIsdzsKKwlpbnQgaSxoeCxpeDsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCisgICAgLyogcHVyZ2Ugb2ZmICstaW5mLCBOYU4sICstMCwgYW5kIG5lZ2F0aXZlIGFyZ3VtZW50cyAqLworCSpzaWduZ2FtcCA9IDE7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmKGl4Pj0weDdmODAwMDAwKSByZXR1cm4geCp4OworCWlmKGl4PT0wKSByZXR1cm4gb25lL3plcm87CisJaWYoaXg8MHgzNTAwMDAwMCkgewkvKiB8eHw8MioqLTIxLCByZXR1cm4gLWxvZyh8eHwpICovCisJICAgIGlmKGh4PDApIHsKKwkgICAgICAgICpzaWduZ2FtcCA9IC0xOworCSAgICAgICAgcmV0dXJuIC1fX2llZWU3NTRfbG9nZigteCk7CisJICAgIH0gZWxzZSByZXR1cm4gLV9faWVlZTc1NF9sb2dmKHgpOworCX0KKwlpZihoeDwwKSB7CisJICAgIGlmKGl4Pj0weDRiMDAwMDAwKSAJLyogfHh8Pj0yKioyMywgbXVzdCBiZSAtaW50ZWdlciAqLworCQlyZXR1cm4gb25lL3plcm87CisJICAgIHQgPSBzaW5fcGlmKHgpOworCSAgICBpZih0PT16ZXJvKSByZXR1cm4gb25lL3plcm87IC8qIC1pbnRlZ2VyICovCisJICAgIG5hZGogPSBfX2llZWU3NTRfbG9nZihwaS9mYWJzZih0KngpKTsKKwkgICAgaWYodDx6ZXJvKSAqc2lnbmdhbXAgPSAtMTsKKwkgICAgeCA9IC14OworCX0KKworICAgIC8qIHB1cmdlIG9mZiAxIGFuZCAyICovCisJaWYgKGl4PT0weDNmODAwMDAwfHxpeD09MHg0MDAwMDAwMCkgciA9IDA7CisgICAgLyogZm9yIHggPCAyLjAgKi8KKwllbHNlIGlmKGl4PDB4NDAwMDAwMDApIHsKKwkgICAgaWYoaXg8PTB4M2Y2NjY2NjYpIHsgCS8qIGxnYW1tYSh4KSA9IGxnYW1tYSh4KzEpLWxvZyh4KSAqLworCQlyID0gLV9faWVlZTc1NF9sb2dmKHgpOworCQlpZihpeD49MHgzZjNiNGEyMCkge3kgPSBvbmUteDsgaT0gMDt9CisJCWVsc2UgaWYoaXg+PTB4M2U2ZDMzMDgpIHt5PSB4LSh0Yy1vbmUpOyBpPTE7fQorCSAgCWVsc2Uge3kgPSB4OyBpPTI7fQorCSAgICB9IGVsc2UgeworCSAgCXIgPSB6ZXJvOworCSAgICAgICAgaWYoaXg+PTB4M2ZkZGE2MTgpIHt5PShmbG9hdCkyLjAteDtpPTA7fSAvKiBbMS43MzE2LDJdICovCisJICAgICAgICBlbHNlIGlmKGl4Pj0weDNGOWRhNjIwKSB7eT14LXRjO2k9MTt9IC8qIFsxLjIzLDEuNzNdICovCisJCWVsc2Uge3k9eC1vbmU7aT0yO30KKwkgICAgfQorCSAgICBzd2l0Y2goaSkgeworCSAgICAgIGNhc2UgMDoKKwkJeiA9IHkqeTsKKwkJcDEgPSBhMCt6KihhMit6KihhNCt6KihhNit6KihhOCt6KmExMCkpKSk7CisJCXAyID0geiooYTEreiooYTMreiooYTUreiooYTcreiooYTkreiphMTEpKSkpKTsKKwkJcCAgPSB5KnAxK3AyOworCQlyICArPSAocC0oZmxvYXQpMC41KnkpOyBicmVhazsKKwkgICAgICBjYXNlIDE6CisJCXogPSB5Knk7CisJCXcgPSB6Knk7CisJCXAxID0gdDArdyoodDMrdyoodDYrdyoodDkgK3cqdDEyKSkpOwkvKiBwYXJhbGxlbCBjb21wICovCisJCXAyID0gdDErdyoodDQrdyoodDcrdyoodDEwK3cqdDEzKSkpOworCQlwMyA9IHQyK3cqKHQ1K3cqKHQ4K3cqKHQxMSt3KnQxNCkpKTsKKwkJcCAgPSB6KnAxLSh0dC13KihwMit5KnAzKSk7CisJCXIgKz0gKHRmICsgcCk7IGJyZWFrOworCSAgICAgIGNhc2UgMjoKKwkJcDEgPSB5Kih1MCt5Kih1MSt5Kih1Mit5Kih1Myt5Kih1NCt5KnU1KSkpKSk7CisJCXAyID0gb25lK3kqKHYxK3kqKHYyK3kqKHYzK3kqKHY0K3kqdjUpKSkpOworCQlyICs9ICgtKGZsb2F0KTAuNSp5ICsgcDEvcDIpOworCSAgICB9CisJfQorCWVsc2UgaWYoaXg8MHg0MTAwMDAwMCkgeyAJCQkvKiB4IDwgOC4wICovCisJICAgIGkgPSAoaW50KXg7CisJICAgIHQgPSB6ZXJvOworCSAgICB5ID0geC0oZmxvYXQpaTsKKwkgICAgcCA9IHkqKHMwK3kqKHMxK3kqKHMyK3kqKHMzK3kqKHM0K3kqKHM1K3kqczYpKSkpKSk7CisJICAgIHEgPSBvbmUreSoocjEreSoocjIreSoocjMreSoocjQreSoocjUreSpyNikpKSkpOworCSAgICByID0gaGFsZip5K3AvcTsKKwkgICAgeiA9IG9uZTsJLyogbGdhbW1hKDErcykgPSBsb2cocykgKyBsZ2FtbWEocykgKi8KKwkgICAgc3dpdGNoKGkpIHsKKwkgICAgY2FzZSA3OiB6ICo9ICh5KyhmbG9hdCk2LjApOwkvKiBGQUxMVEhSVSAqLworCSAgICBjYXNlIDY6IHogKj0gKHkrKGZsb2F0KTUuMCk7CS8qIEZBTExUSFJVICovCisJICAgIGNhc2UgNTogeiAqPSAoeSsoZmxvYXQpNC4wKTsJLyogRkFMTFRIUlUgKi8KKwkgICAgY2FzZSA0OiB6ICo9ICh5KyhmbG9hdCkzLjApOwkvKiBGQUxMVEhSVSAqLworCSAgICBjYXNlIDM6IHogKj0gKHkrKGZsb2F0KTIuMCk7CS8qIEZBTExUSFJVICovCisJCSAgICByICs9IF9faWVlZTc1NF9sb2dmKHopOyBicmVhazsKKwkgICAgfQorICAgIC8qIDguMCA8PSB4IDwgMioqNTggKi8KKwl9IGVsc2UgaWYgKGl4IDwgMHg1YzgwMDAwMCkgeworCSAgICB0ID0gX19pZWVlNzU0X2xvZ2YoeCk7CisJICAgIHogPSBvbmUveDsKKwkgICAgeSA9IHoqejsKKwkgICAgdyA9IHcwK3oqKHcxK3kqKHcyK3kqKHczK3kqKHc0K3kqKHc1K3kqdzYpKSkpKTsKKwkgICAgciA9ICh4LWhhbGYpKih0LW9uZSkrdzsKKwl9IGVsc2UKKyAgICAvKiAyKio1OCA8PSB4IDw9IGluZiAqLworCSAgICByID0gIHgqKF9faWVlZTc1NF9sb2dmKHgpLW9uZSk7CisJaWYoaHg8MCkgciA9IG5hZGogLSByOworCXJldHVybiByOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9sb2cuYyBiL2xpYm0vc3JjL2VfbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRiZjA1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfbG9nLmMKQEAgLTAsMCArMSwxMzUgQEAKKworLyogQCgjKWVfbG9nLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfbG9nLmMsdiAxLjEwIDIwMDUvMDIvMDQgMTg6MjY6MDYgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfbG9nKHgpCisgKiBSZXR1cm4gdGhlIGxvZ3JpdGhtIG9mIHgKKyAqCisgKiBNZXRob2QgOiAgICAgICAgICAgICAgICAgIAorICogICAxLiBBcmd1bWVudCBSZWR1Y3Rpb246IGZpbmQgayBhbmQgZiBzdWNoIHRoYXQgCisgKgkJCXggPSAyXmsgKiAoMStmKSwgCisgKgkgICB3aGVyZSAgc3FydCgyKS8yIDwgMStmIDwgc3FydCgyKSAuCisgKgorICogICAyLiBBcHByb3hpbWF0aW9uIG9mIGxvZygxK2YpLgorICoJTGV0IHMgPSBmLygyK2YpIDsgYmFzZWQgb24gbG9nKDErZikgPSBsb2coMStzKSAtIGxvZygxLXMpCisgKgkJID0gMnMgKyAyLzMgcyoqMyArIDIvNSBzKio1ICsgLi4uLi4sCisgKgkgICAgIAkgPSAycyArIHMqUgorICogICAgICBXZSB1c2UgYSBzcGVjaWFsIFJlbWUgYWxnb3JpdGhtIG9uIFswLDAuMTcxNl0gdG8gZ2VuZXJhdGUgCisgKiAJYSBwb2x5bm9taWFsIG9mIGRlZ3JlZSAxNCB0byBhcHByb3hpbWF0ZSBSIFRoZSBtYXhpbXVtIGVycm9yIAorICoJb2YgdGhpcyBwb2x5bm9taWFsIGFwcHJveGltYXRpb24gaXMgYm91bmRlZCBieSAyKiotNTguNDUuIEluCisgKglvdGhlciB3b3JkcywKKyAqCQkgICAgICAgIDIgICAgICA0ICAgICAgNiAgICAgIDggICAgICAxMCAgICAgIDEyICAgICAgMTQKKyAqCSAgICBSKHopIH4gTGcxKnMgK0xnMipzICtMZzMqcyArTGc0KnMgK0xnNSpzICArTGc2KnMgICtMZzcqcworICogIAkodGhlIHZhbHVlcyBvZiBMZzEgdG8gTGc3IGFyZSBsaXN0ZWQgaW4gdGhlIHByb2dyYW0pCisgKglhbmQKKyAqCSAgICB8ICAgICAgMiAgICAgICAgICAxNCAgICAgICAgICB8ICAgICAtNTguNDUKKyAqCSAgICB8IExnMSpzICsuLi4rTGc3KnMgICAgLSAgUih6KSB8IDw9IDIgCisgKgkgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICoJTm90ZSB0aGF0IDJzID0gZiAtIHMqZiA9IGYgLSBoZnNxICsgcypoZnNxLCB3aGVyZSBoZnNxID0gZipmLzIuCisgKglJbiBvcmRlciB0byBndWFyYW50ZWUgZXJyb3IgaW4gbG9nIGJlbG93IDF1bHAsIHdlIGNvbXB1dGUgbG9nCisgKglieQorICoJCWxvZygxK2YpID0gZiAtIHMqKGYgLSBSKQkoaWYgZiBpcyBub3QgdG9vIGxhcmdlKQorICoJCWxvZygxK2YpID0gZiAtIChoZnNxIC0gcyooaGZzcStSKSkuCShiZXR0ZXIgYWNjdXJhY3kpCisgKgkKKyAqCTMuIEZpbmFsbHksICBsb2coeCkgPSBrKmxuMiArIGxvZygxK2YpLiAgCisgKgkJCSAgICA9IGsqbG4yX2hpKyhmLShoZnNxLShzKihoZnNxK1IpK2sqbG4yX2xvKSkpCisgKgkgICBIZXJlIGxuMiBpcyBzcGxpdCBpbnRvIHR3byBmbG9hdGluZyBwb2ludCBudW1iZXI6IAorICoJCQlsbjJfaGkgKyBsbjJfbG8sCisgKgkgICB3aGVyZSBuKmxuMl9oaSBpcyBhbHdheXMgZXhhY3QgZm9yIHxufCA8IDIwMDAuCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqCWxvZyh4KSBpcyBOYU4gd2l0aCBzaWduYWwgaWYgeCA8IDAgKGluY2x1ZGluZyAtSU5GKSA7IAorICoJbG9nKCtJTkYpIGlzICtJTkY7IGxvZygwKSBpcyAtSU5GIHdpdGggc2lnbmFsOworICoJbG9nKE5hTikgaXMgdGhhdCBOYU4gd2l0aCBubyBzaWduYWwuCisgKgorICogQWNjdXJhY3k6CisgKglhY2NvcmRpbmcgdG8gYW4gZXJyb3IgYW5hbHlzaXMsIHRoZSBlcnJvciBpcyBhbHdheXMgbGVzcyB0aGFuCisgKgkxIHVscCAodW5pdCBpbiB0aGUgbGFzdCBwbGFjZSkuCisgKgorICogQ29uc3RhbnRzOgorICogVGhlIGhleGFkZWNpbWFsIHZhbHVlcyBhcmUgdGhlIGludGVuZGVkIG9uZXMgZm9yIHRoZSBmb2xsb3dpbmcgCisgKiBjb25zdGFudHMuIFRoZSBkZWNpbWFsIHZhbHVlcyBtYXkgYmUgdXNlZCwgcHJvdmlkZWQgdGhhdCB0aGUgCisgKiBjb21waWxlciB3aWxsIGNvbnZlcnQgZnJvbSBkZWNpbWFsIHRvIGJpbmFyeSBhY2N1cmF0ZWx5IGVub3VnaCAKKyAqIHRvIHByb2R1Y2UgdGhlIGhleGFkZWNpbWFsIHZhbHVlcyBzaG93bi4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlCitsbjJfaGkgID0gIDYuOTMxNDcxODAzNjkxMjM4MTY0OTBlLTAxLAkvKiAzZmU2MmU0MiBmZWUwMDAwMCAqLworbG4yX2xvICA9ICAxLjkwODIxNDkyOTI3MDU4NzcwMDAyZS0xMCwJLyogM2RlYTM5ZWYgMzU3OTNjNzYgKi8KK3R3bzU0ICAgPSAgMS44MDE0Mzk4NTA5NDgxOTg0MDAwMGUrMTYsICAvKiA0MzUwMDAwMCAwMDAwMDAwMCAqLworTGcxID0gNi42NjY2NjY2NjY2NjY3MzUxMzBlLTAxLCAgLyogM0ZFNTU1NTUgNTU1NTU1OTMgKi8KK0xnMiA9IDMuOTk5OTk5OTk5OTQwOTQxOTA4ZS0wMSwgIC8qIDNGRDk5OTk5IDk5OTdGQTA0ICovCitMZzMgPSAyLjg1NzE0Mjg3NDM2NjIzOTE0OWUtMDEsICAvKiAzRkQyNDkyNCA5NDIyOTM1OSAqLworTGc0ID0gMi4yMjIyMTk4NDMyMTQ5NzgzOTZlLTAxLCAgLyogM0ZDQzcxQzUgMUQ4RTc4QUYgKi8KK0xnNSA9IDEuODE4MzU3MjE2MTYxODA1MDEyZS0wMSwgIC8qIDNGQzc0NjY0IDk2Q0IwM0RFICovCitMZzYgPSAxLjUzMTM4Mzc2OTkyMDkzNzMzMmUtMDEsICAvKiAzRkMzOUEwOSBEMDc4QzY5RiAqLworTGc3ID0gMS40Nzk4MTk4NjA1MTE2NTg1OTFlLTAxOyAgLyogM0ZDMkYxMTIgREYzRTUyNDQgKi8KKworc3RhdGljIGNvbnN0IGRvdWJsZSB6ZXJvICAgPSAgMC4wOworCitkb3VibGUKK19faWVlZTc1NF9sb2coZG91YmxlIHgpCit7CisJZG91YmxlIGhmc3EsZixzLHosUix3LHQxLHQyLGRrOworCWludDMyX3QgayxoeCxpLGo7CisJdV9pbnQzMl90IGx4OworCisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKworCWs9MDsKKwlpZiAoaHggPCAweDAwMTAwMDAwKSB7CQkJLyogeCA8IDIqKi0xMDIyICAqLworCSAgICBpZiAoKChoeCYweDdmZmZmZmZmKXxseCk9PTApIAorCQlyZXR1cm4gLXR3bzU0L3plcm87CQkvKiBsb2coKy0wKT0taW5mICovCisJICAgIGlmIChoeDwwKSByZXR1cm4gKHgteCkvemVybzsJLyogbG9nKC0jKSA9IE5hTiAqLworCSAgICBrIC09IDU0OyB4ICo9IHR3bzU0OyAvKiBzdWJub3JtYWwgbnVtYmVyLCBzY2FsZSB1cCB4ICovCisJICAgIEdFVF9ISUdIX1dPUkQoaHgseCk7CisJfSAKKwlpZiAoaHggPj0gMHg3ZmYwMDAwMCkgcmV0dXJuIHgreDsKKwlrICs9IChoeD4+MjApLTEwMjM7CisJaHggJj0gMHgwMDBmZmZmZjsKKwlpID0gKGh4KzB4OTVmNjQpJjB4MTAwMDAwOworCVNFVF9ISUdIX1dPUkQoeCxoeHwoaV4weDNmZjAwMDAwKSk7CS8qIG5vcm1hbGl6ZSB4IG9yIHgvMiAqLworCWsgKz0gKGk+PjIwKTsKKwlmID0geC0xLjA7CisJaWYoKDB4MDAwZmZmZmYmKDIraHgpKTwzKSB7CS8qIHxmfCA8IDIqKi0yMCAqLworCSAgICBpZihmPT16ZXJvKSBpZihrPT0wKSByZXR1cm4gemVybzsgIGVsc2Uge2RrPShkb3VibGUpazsKKwkJCQkgcmV0dXJuIGRrKmxuMl9oaStkaypsbjJfbG87fQorCSAgICBSID0gZipmKigwLjUtMC4zMzMzMzMzMzMzMzMzMzMzMypmKTsKKwkgICAgaWYoaz09MCkgcmV0dXJuIGYtUjsgZWxzZSB7ZGs9KGRvdWJsZSlrOworCSAgICAJICAgICByZXR1cm4gZGsqbG4yX2hpLSgoUi1kaypsbjJfbG8pLWYpO30KKwl9CisgCXMgPSBmLygyLjArZik7IAorCWRrID0gKGRvdWJsZSlrOworCXogPSBzKnM7CisJaSA9IGh4LTB4NjE0N2E7CisJdyA9IHoqejsKKwlqID0gMHg2Yjg1MS1oeDsKKwl0MT0gdyooTGcyK3cqKExnNCt3KkxnNikpOyAKKwl0Mj0geiooTGcxK3cqKExnMyt3KihMZzUrdypMZzcpKSk7IAorCWkgfD0gajsKKwlSID0gdDIrdDE7CisJaWYoaT4wKSB7CisJICAgIGhmc3E9MC41KmYqZjsKKwkgICAgaWYoaz09MCkgcmV0dXJuIGYtKGhmc3EtcyooaGZzcStSKSk7IGVsc2UKKwkJICAgICByZXR1cm4gZGsqbG4yX2hpLSgoaGZzcS0ocyooaGZzcStSKStkaypsbjJfbG8pKS1mKTsKKwl9IGVsc2UgeworCSAgICBpZihrPT0wKSByZXR1cm4gZi1zKihmLVIpOyBlbHNlCisJCSAgICAgcmV0dXJuIGRrKmxuMl9oaS0oKHMqKGYtUiktZGsqbG4yX2xvKS1mKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2xvZzEwLmMgYi9saWJtL3NyYy9lX2xvZzEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg0YzBjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfbG9nMTAuYwpAQCAtMCwwICsxLDg3IEBACisKKy8qIEAoIyllX2xvZzEwLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfbG9nMTAuYyx2IDEuMTEgMjAwNS8wMi8wNCAxODoyNjowNiBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9sb2cxMCh4KQorICogUmV0dXJuIHRoZSBiYXNlIDEwIGxvZ2FyaXRobSBvZiB4CisgKiAKKyAqIE1ldGhvZCA6CisgKglMZXQgbG9nMTBfMmhpID0gbGVhZGluZyA0MCBiaXRzIG9mIGxvZzEwKDIpIGFuZAorICoJICAgIGxvZzEwXzJsbyA9IGxvZzEwKDIpIC0gbG9nMTBfMmhpLAorICoJICAgIGl2bG4xMCAgID0gMS9sb2coMTApIHJvdW5kZWQuCisgKglUaGVuCisgKgkJbiA9IGlsb2diKHgpLCAKKyAqCQlpZihuPDApICBuID0gbisxOworICoJCXggPSBzY2FsYm4oeCwtbik7CisgKgkJbG9nMTAoeCkgOj0gbipsb2cxMF8yaGkgKyAobipsb2cxMF8ybG8gKyBpdmxuMTAqbG9nKHgpKQorICoKKyAqIE5vdGUgMToKKyAqCVRvIGd1YXJhbnRlZSBsb2cxMCgxMCoqbik9biwgd2hlcmUgMTAqKm4gaXMgbm9ybWFsLCB0aGUgcm91bmRpbmcgCisgKgltb2RlIG11c3Qgc2V0IHRvIFJvdW5kLXRvLU5lYXJlc3QuCisgKiBOb3RlIDI6CisgKglbMS9sb2coMTApXSByb3VuZGVkIHRvIDUzIGJpdHMgaGFzIGVycm9yICAuMTk4ICAgdWxwczsKKyAqCWxvZzEwIGlzIG1vbm90b25pYyBhdCBhbGwgYmluYXJ5IGJyZWFrIHBvaW50cy4KKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICoJbG9nMTAoeCkgaXMgTmFOIHdpdGggc2lnbmFsIGlmIHggPCAwOyAKKyAqCWxvZzEwKCtJTkYpIGlzICtJTkYgd2l0aCBubyBzaWduYWw7IGxvZzEwKDApIGlzIC1JTkYgd2l0aCBzaWduYWw7CisgKglsb2cxMChOYU4pIGlzIHRoYXQgTmFOIHdpdGggbm8gc2lnbmFsOworICoJbG9nMTAoMTAqKk4pID0gTiAgZm9yIE49MCwxLC4uLiwyMi4KKyAqCisgKiBDb25zdGFudHM6CisgKiBUaGUgaGV4YWRlY2ltYWwgdmFsdWVzIGFyZSB0aGUgaW50ZW5kZWQgb25lcyBmb3IgdGhlIGZvbGxvd2luZyBjb25zdGFudHMuCisgKiBUaGUgZGVjaW1hbCB2YWx1ZXMgbWF5IGJlIHVzZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgY29udmVydAorICogZnJvbSBkZWNpbWFsIHRvIGJpbmFyeSBhY2N1cmF0ZWx5IGVub3VnaCB0byBwcm9kdWNlIHRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMKKyAqIHNob3duLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK3R3bzU0ICAgICAgPSAgMS44MDE0Mzk4NTA5NDgxOTg0MDAwMGUrMTYsIC8qIDB4NDM1MDAwMDAsIDB4MDAwMDAwMDAgKi8KK2l2bG4xMCAgICAgPSAgNC4zNDI5NDQ4MTkwMzI1MTgxNjY2OGUtMDEsIC8qIDB4M0ZEQkNCN0IsIDB4MTUyNkU1MEUgKi8KK2xvZzEwXzJoaSAgPSAgMy4wMTAyOTk5NTY2MzYxMTc3MTMwNmUtMDEsIC8qIDB4M0ZEMzQ0MTMsIDB4NTA5RjYwMDAgKi8KK2xvZzEwXzJsbyAgPSAgMy42OTQyMzkwNzcxNTg5MzA3ODYxNmUtMTM7IC8qIDB4M0Q1OUZFRjMsIDB4MTFGMTJCMzYgKi8KKworc3RhdGljIGNvbnN0IGRvdWJsZSB6ZXJvICAgPSAgMC4wOworCitkb3VibGUKK19faWVlZTc1NF9sb2cxMChkb3VibGUgeCkKK3sKKwlkb3VibGUgeSx6OworCWludDMyX3QgaSxrLGh4OworCXVfaW50MzJfdCBseDsKKworCUVYVFJBQ1RfV09SRFMoaHgsbHgseCk7CisKKyAgICAgICAgaz0wOworICAgICAgICBpZiAoaHggPCAweDAwMTAwMDAwKSB7ICAgICAgICAgICAgICAgICAgLyogeCA8IDIqKi0xMDIyICAqLworICAgICAgICAgICAgaWYgKCgoaHgmMHg3ZmZmZmZmZil8bHgpPT0wKQorICAgICAgICAgICAgICAgIHJldHVybiAtdHdvNTQvemVybzsgICAgICAgICAgICAgLyogbG9nKCstMCk9LWluZiAqLworICAgICAgICAgICAgaWYgKGh4PDApIHJldHVybiAoeC14KS96ZXJvOyAgICAgICAgLyogbG9nKC0jKSA9IE5hTiAqLworICAgICAgICAgICAgayAtPSA1NDsgeCAqPSB0d281NDsgLyogc3Vibm9ybWFsIG51bWJlciwgc2NhbGUgdXAgeCAqLworCSAgICBHRVRfSElHSF9XT1JEKGh4LHgpOworICAgICAgICB9CisJaWYgKGh4ID49IDB4N2ZmMDAwMDApIHJldHVybiB4K3g7CisJayArPSAoaHg+PjIwKS0xMDIzOworCWkgID0gKCh1X2ludDMyX3QpayYweDgwMDAwMDAwKT4+MzE7CisgICAgICAgIGh4ID0gKGh4JjB4MDAwZmZmZmYpfCgoMHgzZmYtaSk8PDIwKTsKKyAgICAgICAgeSAgPSAoZG91YmxlKShrK2kpOworCVNFVF9ISUdIX1dPUkQoeCxoeCk7CisJeiAgPSB5KmxvZzEwXzJsbyArIGl2bG4xMCpfX2llZWU3NTRfbG9nKHgpOworCXJldHVybiAgeit5KmxvZzEwXzJoaTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfbG9nMTBmLmMgYi9saWJtL3NyYy9lX2xvZzEwZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NzMwODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2xvZzEwZi5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qIGVfbG9nMTBmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2xvZzEwLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2xvZzEwZi5jLHYgMS44IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK3R3bzI1ICAgICAgPSAgMy4zNTU0NDMyMDAwZSswNywgLyogMHg0YzAwMDAwMCAqLworaXZsbjEwICAgICA9ICA0LjM0Mjk0NDkyMDFlLTAxLCAvKiAweDNlZGU1YmQ5ICovCitsb2cxMF8yaGkgID0gIDMuMDEwMjkyMDUzMmUtMDEsIC8qIDB4M2U5YTIwODAgKi8KK2xvZzEwXzJsbyAgPSAgNy45MDM0MTUxNjY4ZS0wNzsgLyogMHgzNTU0MjdkYiAqLworCitzdGF0aWMgY29uc3QgZmxvYXQgemVybyAgID0gIDAuMDsKKworZmxvYXQKK19faWVlZTc1NF9sb2cxMGYoZmxvYXQgeCkKK3sKKwlmbG9hdCB5LHo7CisJaW50MzJfdCBpLGssaHg7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKworICAgICAgICBrPTA7CisgICAgICAgIGlmIChoeCA8IDB4MDA4MDAwMDApIHsgICAgICAgICAgICAgICAgICAvKiB4IDwgMioqLTEyNiAgKi8KKyAgICAgICAgICAgIGlmICgoaHgmMHg3ZmZmZmZmZik9PTApCisgICAgICAgICAgICAgICAgcmV0dXJuIC10d28yNS96ZXJvOyAgICAgICAgICAgICAvKiBsb2coKy0wKT0taW5mICovCisgICAgICAgICAgICBpZiAoaHg8MCkgcmV0dXJuICh4LXgpL3plcm87ICAgICAgICAvKiBsb2coLSMpID0gTmFOICovCisgICAgICAgICAgICBrIC09IDI1OyB4ICo9IHR3bzI1OyAvKiBzdWJub3JtYWwgbnVtYmVyLCBzY2FsZSB1cCB4ICovCisJICAgIEdFVF9GTE9BVF9XT1JEKGh4LHgpOworICAgICAgICB9CisJaWYgKGh4ID49IDB4N2Y4MDAwMDApIHJldHVybiB4K3g7CisJayArPSAoaHg+PjIzKS0xMjc7CisJaSAgPSAoKHVfaW50MzJfdClrJjB4ODAwMDAwMDApPj4zMTsKKyAgICAgICAgaHggPSAoaHgmMHgwMDdmZmZmZil8KCgweDdmLWkpPDwyMyk7CisgICAgICAgIHkgID0gKGZsb2F0KShrK2kpOworCVNFVF9GTE9BVF9XT1JEKHgsaHgpOworCXogID0geSpsb2cxMF8ybG8gKyBpdmxuMTAqX19pZWVlNzU0X2xvZ2YoeCk7CisJcmV0dXJuICB6K3kqbG9nMTBfMmhpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9sb2dmLmMgYi9saWJtL3NyYy9lX2xvZ2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2VlMmFiCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9sb2dmLmMKQEAgLTAsMCArMSw4MyBAQAorLyogZV9sb2dmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2xvZy5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9sb2dmLmMsdiAxLjggMjAwNS8xMS8xMiAxODoyMDowOSBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdAorbG4yX2hpID0gICA2LjkzMTM4MTIyNTZlLTAxLAkvKiAweDNmMzE3MTgwICovCitsbjJfbG8gPSAgIDkuMDU4MDAwNjE0NWUtMDYsCS8qIDB4MzcxN2Y3ZDEgKi8KK3R3bzI1ID0gICAgMy4zNTU0NDMyMDBlKzA3LAkvKiAweDRjMDAwMDAwICovCisvKiB8KGxvZygxK3MpLWxvZygxLXMpKS9zIC0gTGcocyl8IDwgMioqLTM0LjI0ICh+Wy00Ljk1ZS0xMSwgNC45N2UtMTFdKS4gKi8KK0xnMSA9ICAgICAgMHhhYWFhYWEuMHAtMjQsCS8qIDAuNjY2NjY2NjI2OTMgKi8KK0xnMiA9ICAgICAgMHhjY2NlMTMuMHAtMjUsCS8qIDAuNDAwMDA5NzIxNTIgKi8KK0xnMyA9ICAgICAgMHg5MWU5ZWUuMHAtMjUsCS8qIDAuMjg0OTg3ODY2ODggKi8KK0xnNCA9ICAgICAgMHhmODllMjYuMHAtMjY7CS8qIDAuMjQyNzkwNzg4NDEgKi8KKworc3RhdGljIGNvbnN0IGZsb2F0IHplcm8gICA9ICAwLjA7CisKK2Zsb2F0CitfX2llZWU3NTRfbG9nZihmbG9hdCB4KQoreworCWZsb2F0IGhmc3EsZixzLHosUix3LHQxLHQyLGRrOworCWludDMyX3QgayxpeCxpLGo7CisKKwlHRVRfRkxPQVRfV09SRChpeCx4KTsKKworCWs9MDsKKwlpZiAoaXggPCAweDAwODAwMDAwKSB7CQkJLyogeCA8IDIqKi0xMjYgICovCisJICAgIGlmICgoaXgmMHg3ZmZmZmZmZik9PTApCisJCXJldHVybiAtdHdvMjUvemVybzsJCS8qIGxvZygrLTApPS1pbmYgKi8KKwkgICAgaWYgKGl4PDApIHJldHVybiAoeC14KS96ZXJvOwkvKiBsb2coLSMpID0gTmFOICovCisJICAgIGsgLT0gMjU7IHggKj0gdHdvMjU7IC8qIHN1Ym5vcm1hbCBudW1iZXIsIHNjYWxlIHVwIHggKi8KKwkgICAgR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJfQorCWlmIChpeCA+PSAweDdmODAwMDAwKSByZXR1cm4geCt4OworCWsgKz0gKGl4Pj4yMyktMTI3OworCWl4ICY9IDB4MDA3ZmZmZmY7CisJaSA9IChpeCsoMHg5NWY2NDw8MykpJjB4ODAwMDAwOworCVNFVF9GTE9BVF9XT1JEKHgsaXh8KGleMHgzZjgwMDAwMCkpOwkvKiBub3JtYWxpemUgeCBvciB4LzIgKi8KKwlrICs9IChpPj4yMyk7CisJZiA9IHgtKGZsb2F0KTEuMDsKKwlpZigoMHgwMDdmZmZmZiYoMTUraXgpKTwxNikgewkvKiB8ZnwgPCAyKiotMjAgKi8KKwkgICAgaWYoZj09emVybykgaWYoaz09MCkgcmV0dXJuIHplcm87ICBlbHNlIHtkaz0oZmxvYXQpazsKKwkJCQkgcmV0dXJuIGRrKmxuMl9oaStkaypsbjJfbG87fQorCSAgICBSID0gZipmKigoZmxvYXQpMC41LShmbG9hdCkwLjMzMzMzMzMzMzMzMzMzMzMzKmYpOworCSAgICBpZihrPT0wKSByZXR1cm4gZi1SOyBlbHNlIHtkaz0oZmxvYXQpazsKKwkgICAgCSAgICAgcmV0dXJuIGRrKmxuMl9oaS0oKFItZGsqbG4yX2xvKS1mKTt9CisJfQorIAlzID0gZi8oKGZsb2F0KTIuMCtmKTsKKwlkayA9IChmbG9hdClrOworCXogPSBzKnM7CisJaSA9IGl4LSgweDYxNDdhPDwzKTsKKwl3ID0geip6OworCWogPSAoMHg2Yjg1MTw8MyktaXg7CisJdDE9IHcqKExnMit3KkxnNCk7CisJdDI9IHoqKExnMSt3KkxnMyk7CisJaSB8PSBqOworCVIgPSB0Mit0MTsKKwlpZihpPjApIHsKKwkgICAgaGZzcT0oZmxvYXQpMC41KmYqZjsKKwkgICAgaWYoaz09MCkgcmV0dXJuIGYtKGhmc3EtcyooaGZzcStSKSk7IGVsc2UKKwkJICAgICByZXR1cm4gZGsqbG4yX2hpLSgoaGZzcS0ocyooaGZzcStSKStkaypsbjJfbG8pKS1mKTsKKwl9IGVsc2UgeworCSAgICBpZihrPT0wKSByZXR1cm4gZi1zKihmLVIpOyBlbHNlCisJCSAgICAgcmV0dXJuIGRrKmxuMl9oaS0oKHMqKGYtUiktZGsqbG4yX2xvKS1mKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX3Bvdy5jIGIvbGlibS9zcmMvZV9wb3cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjEzMTMyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9wb3cuYwpAQCAtMCwwICsxLDMwNCBAQAorLyogQCgjKWVfcG93LmMgMS41IDA0LzA0LzIyIFNNSSAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAwNCBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfcG93LmMsdiAxLjExIDIwMDUvMDIvMDQgMTg6MjY6MDYgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfcG93KHgseSkgcmV0dXJuIHgqKnkKKyAqCisgKgkJICAgICAgbgorICogTWV0aG9kOiAgTGV0IHggPSAgMiAgICogKDErZikKKyAqCTEuIENvbXB1dGUgYW5kIHJldHVybiBsb2cyKHgpIGluIHR3byBwaWVjZXM6CisgKgkJbG9nMih4KSA9IHcxICsgdzIsCisgKgkgICB3aGVyZSB3MSBoYXMgNTMtMjQgPSAyOSBiaXQgdHJhaWxpbmcgemVyb3MuCisgKgkyLiBQZXJmb3JtIHkqbG9nMih4KSA9IG4reScgYnkgc2ltdWxhdGluZyBtdXRpLXByZWNpc2lvbiAKKyAqCSAgIGFyaXRobWV0aWMsIHdoZXJlIHx5J3w8PTAuNS4KKyAqCTMuIFJldHVybiB4Kip5ID0gMioqbipleHAoeScqbG9nMikKKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICoJMS4gIChhbnl0aGluZykgKiogMCAgaXMgMQorICoJMi4gIChhbnl0aGluZykgKiogMSAgaXMgaXRzZWxmCisgKgkzLiAgKGFueXRoaW5nKSAqKiBOQU4gaXMgTkFOCisgKgk0LiAgTkFOICoqIChhbnl0aGluZyBleGNlcHQgMCkgaXMgTkFOCisgKgk1LiAgKy0ofHh8ID4gMSkgKiogICtJTkYgaXMgK0lORgorICoJNi4gICstKHx4fCA+IDEpICoqICAtSU5GIGlzICswCisgKgk3LiAgKy0ofHh8IDwgMSkgKiogICtJTkYgaXMgKzAKKyAqCTguICArLSh8eHwgPCAxKSAqKiAgLUlORiBpcyArSU5GCisgKgk5LiAgKy0xICAgICAgICAgKiogKy1JTkYgaXMgTkFOCisgKgkxMC4gKzAgKiogKCthbnl0aGluZyBleGNlcHQgMCwgTkFOKSAgICAgICAgICAgICAgIGlzICswCisgKgkxMS4gLTAgKiogKCthbnl0aGluZyBleGNlcHQgMCwgTkFOLCBvZGQgaW50ZWdlcikgIGlzICswCisgKgkxMi4gKzAgKiogKC1hbnl0aGluZyBleGNlcHQgMCwgTkFOKSAgICAgICAgICAgICAgIGlzICtJTkYKKyAqCTEzLiAtMCAqKiAoLWFueXRoaW5nIGV4Y2VwdCAwLCBOQU4sIG9kZCBpbnRlZ2VyKSAgaXMgK0lORgorICoJMTQuIC0wICoqIChvZGQgaW50ZWdlcikgPSAtKCArMCAqKiAob2RkIGludGVnZXIpICkKKyAqCTE1LiArSU5GICoqICgrYW55dGhpbmcgZXhjZXB0IDAsTkFOKSBpcyArSU5GCisgKgkxNi4gK0lORiAqKiAoLWFueXRoaW5nIGV4Y2VwdCAwLE5BTikgaXMgKzAKKyAqCTE3LiAtSU5GICoqIChhbnl0aGluZykgID0gLTAgKiogKC1hbnl0aGluZykKKyAqCTE4LiAoLWFueXRoaW5nKSAqKiAoaW50ZWdlcikgaXMgKC0xKSoqKGludGVnZXIpKigrYW55dGhpbmcqKmludGVnZXIpCisgKgkxOS4gKC1hbnl0aGluZyBleGNlcHQgMCBhbmQgaW5mKSAqKiAobm9uLWludGVnZXIpIGlzIE5BTgorICoKKyAqIEFjY3VyYWN5OgorICoJcG93KHgseSkgcmV0dXJucyB4Kip5IG5lYXJseSByb3VuZGVkLiBJbiBwYXJ0aWN1bGFyCisgKgkJCXBvdyhpbnRlZ2VyLGludGVnZXIpCisgKglhbHdheXMgcmV0dXJucyB0aGUgY29ycmVjdCBpbnRlZ2VyIHByb3ZpZGVkIGl0IGlzIAorICoJcmVwcmVzZW50YWJsZS4KKyAqCisgKiBDb25zdGFudHMgOgorICogVGhlIGhleGFkZWNpbWFsIHZhbHVlcyBhcmUgdGhlIGludGVuZGVkIG9uZXMgZm9yIHRoZSBmb2xsb3dpbmcgCisgKiBjb25zdGFudHMuIFRoZSBkZWNpbWFsIHZhbHVlcyBtYXkgYmUgdXNlZCwgcHJvdmlkZWQgdGhhdCB0aGUgCisgKiBjb21waWxlciB3aWxsIGNvbnZlcnQgZnJvbSBkZWNpbWFsIHRvIGJpbmFyeSBhY2N1cmF0ZWx5IGVub3VnaCAKKyAqIHRvIHByb2R1Y2UgdGhlIGhleGFkZWNpbWFsIHZhbHVlcyBzaG93bi4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlCiticFtdID0gezEuMCwgMS41LH0sCitkcF9oW10gPSB7IDAuMCwgNS44NDk2MjQ4NzIyMDc2NDE2MDE1NmUtMDEsfSwgLyogMHgzRkUyQjgwMywgMHg0MDAwMDAwMCAqLworZHBfbFtdID0geyAwLjAsIDEuMzUwMDM5MjAyMTI5NzQ4OTcxMjhlLTA4LH0sIC8qIDB4M0U0Q0ZERUIsIDB4NDNDRkQwMDYgKi8KK3plcm8gICAgPSAgMC4wLAorb25lCT0gIDEuMCwKK3R3bwk9ICAyLjAsCit0d281Mwk9ICA5MDA3MTk5MjU0NzQwOTkyLjAsCS8qIDB4NDM0MDAwMDAsIDB4MDAwMDAwMDAgKi8KK2h1Z2UJPSAgMS4wZTMwMCwKK3RpbnkgICAgPSAgMS4wZS0zMDAsCisJLyogcG9seSBjb2VmcyBmb3IgKDMvMikqKGxvZyh4KS0ycy0yLzMqcyoqMyAqLworTDEgID0gIDUuOTk5OTk5OTk5OTk5OTQ2NDg3MjVlLTAxLCAvKiAweDNGRTMzMzMzLCAweDMzMzMzMzAzICovCitMMiAgPSAgNC4yODU3MTQyODU3ODU1MDE4NDI1MmUtMDEsIC8qIDB4M0ZEQjZEQjYsIDB4REI2RkFCRkYgKi8KK0wzICA9ICAzLjMzMzMzMzI5ODE4Mzc3NDMyOTE4ZS0wMSwgLyogMHgzRkQ1NTU1NSwgMHg1MThGMjY0RCAqLworTDQgID0gIDIuNzI3MjgxMjM4MDg1MzQwMDY0ODllLTAxLCAvKiAweDNGRDE3NDYwLCAweEE5MUQ0MTAxICovCitMNSAgPSAgMi4zMDY2MDc0NTc3NTU2MTc1NDA2N2UtMDEsIC8qIDB4M0ZDRDg2NEEsIDB4OTNDOURCNjUgKi8KK0w2ICA9ICAyLjA2OTc1MDE3ODAwMzM4NDE3Nzg0ZS0wMSwgLyogMHgzRkNBN0UyOCwgMHg0QTQ1NEVFRiAqLworUDEgICA9ICAxLjY2NjY2NjY2NjY2NjY2MDE5MDM3ZS0wMSwgLyogMHgzRkM1NTU1NSwgMHg1NTU1NTUzRSAqLworUDIgICA9IC0yLjc3Nzc3Nzc3NzcwMTU1OTMzODQyZS0wMywgLyogMHhCRjY2QzE2QywgMHgxNkJFQkQ5MyAqLworUDMgICA9ICA2LjYxMzc1NjMyMTQzNzkzNDM2MTE3ZS0wNSwgLyogMHgzRjExNTY2QSwgMHhBRjI1REUyQyAqLworUDQgICA9IC0xLjY1MzM5MDIyMDU0NjUyNTE1MzkwZS0wNiwgLyogMHhCRUJCQkQ0MSwgMHhDNUQyNkJGMSAqLworUDUgICA9ICA0LjEzODEzNjc5NzA1NzIzODQ2MDM5ZS0wOCwgLyogMHgzRTY2Mzc2OSwgMHg3MkJFQTREMCAqLworbGcyICA9ICA2LjkzMTQ3MTgwNTU5OTQ1Mjg2MjI3ZS0wMSwgLyogMHgzRkU2MkU0MiwgMHhGRUZBMzlFRiAqLworbGcyX2ggID0gIDYuOTMxNDcxODI0NjQ1OTk2MDkzNzVlLTAxLCAvKiAweDNGRTYyRTQzLCAweDAwMDAwMDAwICovCitsZzJfbCAgPSAtMS45MDQ2NTQyOTk5NTc3NjgwNDUyNWUtMDksIC8qIDB4QkUyMDVDNjEsIDB4MENBODZDMzkgKi8KK292dCA9ICA4LjAwODU2NjI1OTUzNzI5NDQzNzJlLTAwMTcsIC8qIC0oMTAyNC1sb2cyKG92ZmwrLjV1bHApKSAqLworY3AgICAgPSAgOS42MTc5NjY5MzkyNTk3NTU1NDMyOWUtMDEsIC8qIDB4M0ZFRUM3MDksIDB4REMzQTAzRkQgPTIvKDNsbjIpICovCitjcF9oICA9ICA5LjYxNzk2NzAwOTU0NDM3MjU1ODU5ZS0wMSwgLyogMHgzRkVFQzcwOSwgMHhFMDAwMDAwMCA9KGZsb2F0KWNwICovCitjcF9sICA9IC03LjAyODQ2MTY1MDk1Mjc1ODI2NTE2ZS0wOSwgLyogMHhCRTNFMkZFMCwgMHgxNDVCMDFGNSA9dGFpbCBvZiBjcF9oKi8KK2l2bG4yICAgID0gIDEuNDQyNjk1MDQwODg4OTYzMzg3MDBlKzAwLCAvKiAweDNGRjcxNTQ3LCAweDY1MkI4MkZFID0xL2xuMiAqLworaXZsbjJfaCAgPSAgMS40NDI2OTUwMjE2MjkzMzM0OTYwOWUrMDAsIC8qIDB4M0ZGNzE1NDcsIDB4NjAwMDAwMDAgPTI0YiAxL2xuMiovCitpdmxuMl9sICA9ICAxLjkyNTk2Mjk5MTEyNjYxNzQ2ODg3ZS0wODsgLyogMHgzRTU0QUUwQiwgMHhGODVEREY0NCA9MS9sbjIgdGFpbCovCisKK2RvdWJsZQorX19pZWVlNzU0X3Bvdyhkb3VibGUgeCwgZG91YmxlIHkpCit7CisJZG91YmxlIHosYXgsel9oLHpfbCxwX2gscF9sOworCWRvdWJsZSB5MSx0MSx0MixyLHMsdCx1LHYsdzsKKwlpbnQzMl90IGksaixrLHlpc2ludCxuOworCWludDMyX3QgaHgsaHksaXgsaXk7CisJdV9pbnQzMl90IGx4LGx5OworCisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKwlFWFRSQUNUX1dPUkRTKGh5LGx5LHkpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsgIGl5ID0gaHkmMHg3ZmZmZmZmZjsKKworICAgIC8qIHk9PXplcm86IHgqKjAgPSAxICovCisJaWYoKGl5fGx5KT09MCkgcmV0dXJuIG9uZTsgCQorCisgICAgLyogKy1OYU4gcmV0dXJuIHgreSAqLworCWlmKGl4ID4gMHg3ZmYwMDAwMCB8fCAoKGl4PT0weDdmZjAwMDAwKSYmKGx4IT0wKSkgfHwKKwkgICBpeSA+IDB4N2ZmMDAwMDAgfHwgKChpeT09MHg3ZmYwMDAwMCkmJihseSE9MCkpKSAKKwkJcmV0dXJuIHgreTsJCisKKyAgICAvKiBkZXRlcm1pbmUgaWYgeSBpcyBhbiBvZGQgaW50IHdoZW4geCA8IDAKKyAgICAgKiB5aXNpbnQgPSAwCS4uLiB5IGlzIG5vdCBhbiBpbnRlZ2VyCisgICAgICogeWlzaW50ID0gMQkuLi4geSBpcyBhbiBvZGQgaW50CisgICAgICogeWlzaW50ID0gMgkuLi4geSBpcyBhbiBldmVuIGludAorICAgICAqLworCXlpc2ludCAgPSAwOworCWlmKGh4PDApIHsJCisJICAgIGlmKGl5Pj0weDQzNDAwMDAwKSB5aXNpbnQgPSAyOyAvKiBldmVuIGludGVnZXIgeSAqLworCSAgICBlbHNlIGlmKGl5Pj0weDNmZjAwMDAwKSB7CisJCWsgPSAoaXk+PjIwKS0weDNmZjsJICAgLyogZXhwb25lbnQgKi8KKwkJaWYoaz4yMCkgeworCQkgICAgaiA9IGx5Pj4oNTItayk7CisJCSAgICBpZigoajw8KDUyLWspKT09bHkpIHlpc2ludCA9IDItKGomMSk7CisJCX0gZWxzZSBpZihseT09MCkgeworCQkgICAgaiA9IGl5Pj4oMjAtayk7CisJCSAgICBpZigoajw8KDIwLWspKT09aXkpIHlpc2ludCA9IDItKGomMSk7CisJCX0KKwkgICAgfQkJCisJfSAKKworICAgIC8qIHNwZWNpYWwgdmFsdWUgb2YgeSAqLworCWlmKGx5PT0wKSB7IAkKKwkgICAgaWYgKGl5PT0weDdmZjAwMDAwKSB7CS8qIHkgaXMgKy1pbmYgKi8KKwkgICAgICAgIGlmKCgoaXgtMHgzZmYwMDAwMCl8bHgpPT0wKQorCQkgICAgcmV0dXJuICB5IC0geTsJLyogaW5mKiorLTEgaXMgTmFOICovCisJICAgICAgICBlbHNlIGlmIChpeCA+PSAweDNmZjAwMDAwKS8qICh8eHw+MSkqKistaW5mID0gaW5mLDAgKi8KKwkJICAgIHJldHVybiAoaHk+PTApPyB5OiB6ZXJvOworCSAgICAgICAgZWxzZQkJCS8qICh8eHw8MSkqKi0sK2luZiA9IGluZiwwICovCisJCSAgICByZXR1cm4gKGh5PDApPy15OiB6ZXJvOworCSAgICB9IAorCSAgICBpZihpeT09MHgzZmYwMDAwMCkgewkvKiB5IGlzICArLTEgKi8KKwkJaWYoaHk8MCkgcmV0dXJuIG9uZS94OyBlbHNlIHJldHVybiB4OworCSAgICB9CisJICAgIGlmKGh5PT0weDQwMDAwMDAwKSByZXR1cm4geCp4OyAvKiB5IGlzICAyICovCisJICAgIGlmKGh5PT0weDNmZTAwMDAwKSB7CS8qIHkgaXMgIDAuNSAqLworCQlpZihoeD49MCkJLyogeCA+PSArMCAqLworCQlyZXR1cm4gc3FydCh4KTsJCisJICAgIH0KKwl9CisKKwlheCAgID0gZmFicyh4KTsKKyAgICAvKiBzcGVjaWFsIHZhbHVlIG9mIHggKi8KKwlpZihseD09MCkgeworCSAgICBpZihpeD09MHg3ZmYwMDAwMHx8aXg9PTB8fGl4PT0weDNmZjAwMDAwKXsKKwkJeiA9IGF4OwkJCS8qeCBpcyArLTAsKy1pbmYsKy0xKi8KKwkJaWYoaHk8MCkgeiA9IG9uZS96OwkvKiB6ID0gKDEvfHh8KSAqLworCQlpZihoeDwwKSB7CisJCSAgICBpZigoKGl4LTB4M2ZmMDAwMDApfHlpc2ludCk9PTApIHsKKwkJCXogPSAoei16KS8oei16KTsgLyogKC0xKSoqbm9uLWludCBpcyBOYU4gKi8KKwkJICAgIH0gZWxzZSBpZih5aXNpbnQ9PTEpIAorCQkJeiA9IC16OwkJLyogKHg8MCkqKm9kZCA9IC0ofHh8KipvZGQpICovCisJCX0KKwkJcmV0dXJuIHo7CisJICAgIH0KKwl9CisgICAgCisgICAgLyogQ1lHTlVTIExPQ0FMICsgZmRsaWJtLTUuMyBmaXg6IFRoaXMgdXNlZCB0byBiZQorCW4gPSAoaHg+PjMxKSsxOworICAgICAgIGJ1dCBBTlNJIEMgc2F5cyBhIHJpZ2h0IHNoaWZ0IG9mIGEgc2lnbmVkIG5lZ2F0aXZlIHF1YW50aXR5IGlzCisgICAgICAgaW1wbGVtZW50YXRpb24gZGVmaW5lZC4gICovCisJbiA9ICgodV9pbnQzMl90KWh4Pj4zMSktMTsKKworICAgIC8qICh4PDApKioobm9uLWludCkgaXMgTmFOICovCisJaWYoKG58eWlzaW50KT09MCkgcmV0dXJuICh4LXgpLyh4LXgpOworCisJcyA9IG9uZTsgLyogcyAoc2lnbiBvZiByZXN1bHQgLXZlKipvZGQpID0gLTEgZWxzZSA9IDEgKi8KKwlpZigobnwoeWlzaW50LTEpKT09MCkgcyA9IC1vbmU7LyogKC12ZSkqKihvZGQgaW50KSAqLworCisgICAgLyogfHl8IGlzIGh1Z2UgKi8KKwlpZihpeT4weDQxZTAwMDAwKSB7IC8qIGlmIHx5fCA+IDIqKjMxICovCisJICAgIGlmKGl5PjB4NDNmMDAwMDApewkvKiBpZiB8eXwgPiAyKio2NCwgbXVzdCBvL3VmbG93ICovCisJCWlmKGl4PD0weDNmZWZmZmZmKSByZXR1cm4gKGh5PDApPyBodWdlKmh1Z2U6dGlueSp0aW55OworCQlpZihpeD49MHgzZmYwMDAwMCkgcmV0dXJuIChoeT4wKT8gaHVnZSpodWdlOnRpbnkqdGlueTsKKwkgICAgfQorCS8qIG92ZXIvdW5kZXJmbG93IGlmIHggaXMgbm90IGNsb3NlIHRvIG9uZSAqLworCSAgICBpZihpeDwweDNmZWZmZmZmKSByZXR1cm4gKGh5PDApPyBzKmh1Z2UqaHVnZTpzKnRpbnkqdGlueTsKKwkgICAgaWYoaXg+MHgzZmYwMDAwMCkgcmV0dXJuIChoeT4wKT8gcypodWdlKmh1Z2U6cyp0aW55KnRpbnk7CisJLyogbm93IHwxLXh8IGlzIHRpbnkgPD0gMioqLTIwLCBzdWZmaWNlIHRvIGNvbXB1dGUgCisJICAgbG9nKHgpIGJ5IHgteF4yLzIreF4zLzMteF40LzQgKi8KKwkgICAgdCA9IGF4LW9uZTsJCS8qIHQgaGFzIDIwIHRyYWlsaW5nIHplcm9zICovCisJICAgIHcgPSAodCp0KSooMC41LXQqKDAuMzMzMzMzMzMzMzMzMzMzMzMzMzMzMy10KjAuMjUpKTsKKwkgICAgdSA9IGl2bG4yX2gqdDsJLyogaXZsbjJfaCBoYXMgMjEgc2lnLiBiaXRzICovCisJICAgIHYgPSB0Kml2bG4yX2wtdyppdmxuMjsKKwkgICAgdDEgPSB1K3Y7CisJICAgIFNFVF9MT1dfV09SRCh0MSwwKTsKKwkgICAgdDIgPSB2LSh0MS11KTsKKwl9IGVsc2UgeworCSAgICBkb3VibGUgc3MsczIsc19oLHNfbCx0X2gsdF9sOworCSAgICBuID0gMDsKKwkvKiB0YWtlIGNhcmUgc3Vibm9ybWFsIG51bWJlciAqLworCSAgICBpZihpeDwweDAwMTAwMDAwKQorCQl7YXggKj0gdHdvNTM7IG4gLT0gNTM7IEdFVF9ISUdIX1dPUkQoaXgsYXgpOyB9CisJICAgIG4gICs9ICgoaXgpPj4yMCktMHgzZmY7CisJICAgIGogID0gaXgmMHgwMDBmZmZmZjsKKwkvKiBkZXRlcm1pbmUgaW50ZXJ2YWwgKi8KKwkgICAgaXggPSBqfDB4M2ZmMDAwMDA7CQkvKiBub3JtYWxpemUgaXggKi8KKwkgICAgaWYoajw9MHgzOTg4RSkgaz0wOwkJLyogfHh8PHNxcnQoMy8yKSAqLworCSAgICBlbHNlIGlmKGo8MHhCQjY3QSkgaz0xOwkvKiB8eHw8c3FydCgzKSAgICovCisJICAgIGVsc2Uge2s9MDtuKz0xO2l4IC09IDB4MDAxMDAwMDA7fQorCSAgICBTRVRfSElHSF9XT1JEKGF4LGl4KTsKKworCS8qIGNvbXB1dGUgc3MgPSBzX2grc19sID0gKHgtMSkvKHgrMSkgb3IgKHgtMS41KS8oeCsxLjUpICovCisJICAgIHUgPSBheC1icFtrXTsJCS8qIGJwWzBdPTEuMCwgYnBbMV09MS41ICovCisJICAgIHYgPSBvbmUvKGF4K2JwW2tdKTsKKwkgICAgc3MgPSB1KnY7CisJICAgIHNfaCA9IHNzOworCSAgICBTRVRfTE9XX1dPUkQoc19oLDApOworCS8qIHRfaD1heCticFtrXSBIaWdoICovCisJICAgIHRfaCA9IHplcm87CisJICAgIFNFVF9ISUdIX1dPUkQodF9oLCgoaXg+PjEpfDB4MjAwMDAwMDApKzB4MDAwODAwMDArKGs8PDE4KSk7CisJICAgIHRfbCA9IGF4IC0gKHRfaC1icFtrXSk7CisJICAgIHNfbCA9IHYqKCh1LXNfaCp0X2gpLXNfaCp0X2wpOworCS8qIGNvbXB1dGUgbG9nKGF4KSAqLworCSAgICBzMiA9IHNzKnNzOworCSAgICByID0gczIqczIqKEwxK3MyKihMMitzMiooTDMrczIqKEw0K3MyKihMNStzMipMNikpKSkpOworCSAgICByICs9IHNfbCooc19oK3NzKTsKKwkgICAgczIgID0gc19oKnNfaDsKKwkgICAgdF9oID0gMy4wK3MyK3I7CisJICAgIFNFVF9MT1dfV09SRCh0X2gsMCk7CisJICAgIHRfbCA9IHItKCh0X2gtMy4wKS1zMik7CisJLyogdSt2ID0gc3MqKDErLi4uKSAqLworCSAgICB1ID0gc19oKnRfaDsKKwkgICAgdiA9IHNfbCp0X2grdF9sKnNzOworCS8qIDIvKDNsb2cyKSooc3MrLi4uKSAqLworCSAgICBwX2ggPSB1K3Y7CisJICAgIFNFVF9MT1dfV09SRChwX2gsMCk7CisJICAgIHBfbCA9IHYtKHBfaC11KTsKKwkgICAgel9oID0gY3BfaCpwX2g7CQkvKiBjcF9oK2NwX2wgPSAyLygzKmxvZzIpICovCisJICAgIHpfbCA9IGNwX2wqcF9oK3BfbCpjcCtkcF9sW2tdOworCS8qIGxvZzIoYXgpID0gKHNzKy4uKSoyLygzKmxvZzIpID0gbiArIGRwX2ggKyB6X2ggKyB6X2wgKi8KKwkgICAgdCA9IChkb3VibGUpbjsKKwkgICAgdDEgPSAoKCh6X2grel9sKStkcF9oW2tdKSt0KTsKKwkgICAgU0VUX0xPV19XT1JEKHQxLDApOworCSAgICB0MiA9IHpfbC0oKCh0MS10KS1kcF9oW2tdKS16X2gpOworCX0KKworICAgIC8qIHNwbGl0IHVwIHkgaW50byB5MSt5MiBhbmQgY29tcHV0ZSAoeTEreTIpKih0MSt0MikgKi8KKwl5MSAgPSB5OworCVNFVF9MT1dfV09SRCh5MSwwKTsKKwlwX2wgPSAoeS15MSkqdDEreSp0MjsKKwlwX2ggPSB5MSp0MTsKKwl6ID0gcF9sK3BfaDsKKwlFWFRSQUNUX1dPUkRTKGosaSx6KTsKKwlpZiAoaj49MHg0MDkwMDAwMCkgewkJCQkvKiB6ID49IDEwMjQgKi8KKwkgICAgaWYoKChqLTB4NDA5MDAwMDApfGkpIT0wKQkJCS8qIGlmIHogPiAxMDI0ICovCisJCXJldHVybiBzKmh1Z2UqaHVnZTsJCQkvKiBvdmVyZmxvdyAqLworCSAgICBlbHNlIHsKKwkJaWYocF9sK292dD56LXBfaCkgcmV0dXJuIHMqaHVnZSpodWdlOwkvKiBvdmVyZmxvdyAqLworCSAgICB9CisJfSBlbHNlIGlmKChqJjB4N2ZmZmZmZmYpPj0weDQwOTBjYzAwICkgewkvKiB6IDw9IC0xMDc1ICovCisJICAgIGlmKCgoai0weGMwOTBjYzAwKXxpKSE9MCkgCQkvKiB6IDwgLTEwNzUgKi8KKwkJcmV0dXJuIHMqdGlueSp0aW55OwkJLyogdW5kZXJmbG93ICovCisJICAgIGVsc2UgeworCQlpZihwX2w8PXotcF9oKSByZXR1cm4gcyp0aW55KnRpbnk7CS8qIHVuZGVyZmxvdyAqLworCSAgICB9CisJfQorICAgIC8qCisgICAgICogY29tcHV0ZSAyKioocF9oK3BfbCkKKyAgICAgKi8KKwlpID0gaiYweDdmZmZmZmZmOworCWsgPSAoaT4+MjApLTB4M2ZmOworCW4gPSAwOworCWlmKGk+MHgzZmUwMDAwMCkgewkJLyogaWYgfHp8ID4gMC41LCBzZXQgbiA9IFt6KzAuNV0gKi8KKwkgICAgbiA9IGorKDB4MDAxMDAwMDA+PihrKzEpKTsKKwkgICAgayA9ICgobiYweDdmZmZmZmZmKT4+MjApLTB4M2ZmOwkvKiBuZXcgayBmb3IgbiAqLworCSAgICB0ID0gemVybzsKKwkgICAgU0VUX0hJR0hfV09SRCh0LG4mfigweDAwMGZmZmZmPj5rKSk7CisJICAgIG4gPSAoKG4mMHgwMDBmZmZmZil8MHgwMDEwMDAwMCk+PigyMC1rKTsKKwkgICAgaWYoajwwKSBuID0gLW47CisJICAgIHBfaCAtPSB0OworCX0gCisJdCA9IHBfbCtwX2g7CisJU0VUX0xPV19XT1JEKHQsMCk7CisJdSA9IHQqbGcyX2g7CisJdiA9IChwX2wtKHQtcF9oKSkqbGcyK3QqbGcyX2w7CisJeiA9IHUrdjsKKwl3ID0gdi0oei11KTsKKwl0ICA9IHoqejsKKwl0MSAgPSB6IC0gdCooUDErdCooUDIrdCooUDMrdCooUDQrdCpQNSkpKSk7CisJciAgPSAoeip0MSkvKHQxLXR3byktKHcreip3KTsKKwl6ICA9IG9uZS0oci16KTsKKwlHRVRfSElHSF9XT1JEKGoseik7CisJaiArPSAobjw8MjApOworCWlmKChqPj4yMCk8PTApIHogPSBzY2FsYm4oeixuKTsJLyogc3Vibm9ybWFsIG91dHB1dCAqLworCWVsc2UgU0VUX0hJR0hfV09SRCh6LGopOworCXJldHVybiBzKno7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX3Bvd2YuYyBiL2xpYm0vc3JjL2VfcG93Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZjA4ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX3Bvd2YuYwpAQCAtMCwwICsxLDI0NyBAQAorLyogZV9wb3dmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX3Bvdy5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9wb3dmLmMsdiAxLjEyIDIwMDQvMDYvMDEgMTk6MzM6MzAgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK2JwW10gPSB7MS4wLCAxLjUsfSwKK2RwX2hbXSA9IHsgMC4wLCA1Ljg0OTYwOTM4ZS0wMSx9LCAvKiAweDNmMTVjMDAwICovCitkcF9sW10gPSB7IDAuMCwgMS41NjMyMjA4NWUtMDYsfSwgLyogMHgzNWQxY2ZkYyAqLworemVybyAgICA9ICAwLjAsCitvbmUJPSAgMS4wLAordHdvCT0gIDIuMCwKK3R3bzI0CT0gIDE2Nzc3MjE2LjAsCS8qIDB4NGI4MDAwMDAgKi8KK2h1Z2UJPSAgMS4wZTMwLAordGlueSAgICA9ICAxLjBlLTMwLAorCS8qIHBvbHkgY29lZnMgZm9yICgzLzIpKihsb2coeCktMnMtMi8zKnMqKjMgKi8KK0wxICA9ICA2LjAwMDAwMDIzODRlLTAxLCAvKiAweDNmMTk5OTlhICovCitMMiAgPSAgNC4yODU3MTQzMjgzZS0wMSwgLyogMHgzZWRiNmRiNyAqLworTDMgID0gIDMuMzMzMzMzNDMyN2UtMDEsIC8qIDB4M2VhYWFhYWIgKi8KK0w0ICA9ICAyLjcyNzI4MTE1MzJlLTAxLCAvKiAweDNlOGJhMzA1ICovCitMNSAgPSAgMi4zMDY2MDc1MTQ2ZS0wMSwgLyogMHgzZTZjMzI1NSAqLworTDYgID0gIDIuMDY5NzUwMTMwMmUtMDEsIC8qIDB4M2U1M2YxNDIgKi8KK1AxICAgPSAgMS42NjY2NjY3MTYzZS0wMSwgLyogMHgzZTJhYWFhYiAqLworUDIgICA9IC0yLjc3Nzc3Nzg0NTBlLTAzLCAvKiAweGJiMzYwYjYxICovCitQMyAgID0gIDYuNjEzNzU1OTc3MGUtMDUsIC8qIDB4Mzg4YWIzNTUgKi8KK1A0ICAgPSAtMS42NTMzOTAxOTk5ZS0wNiwgLyogMHhiNWRkZWEwZSAqLworUDUgICA9ICA0LjEzODEzNjk0NDJlLTA4LCAvKiAweDMzMzFiYjRjICovCitsZzIgID0gIDYuOTMxNDcxODI0NmUtMDEsIC8qIDB4M2YzMTcyMTggKi8KK2xnMl9oICA9ICA2LjkzMTQ1NzUyZS0wMSwgLyogMHgzZjMxNzIwMCAqLworbGcyX2wgID0gIDEuNDI4NjA2NTRlLTA2LCAvKiAweDM1YmZiZThjICovCitvdnQgPSAgNC4yOTk1NjY1Njk0ZS0wOCwgLyogLSgxMjgtbG9nMihvdmZsKy41dWxwKSkgKi8KK2NwICAgID0gIDkuNjE3OTY3MDA5NWUtMDEsIC8qIDB4M2Y3NjM4NGYgPTIvKDNsbjIpICovCitjcF9oICA9ICA5LjYxNzkxOTkyMTllLTAxLCAvKiAweDNmNzYzODAwID1oZWFkIG9mIGNwICovCitjcF9sICA9ICA0LjcwMTczODM2MjJlLTA2LCAvKiAweDM2OWRjM2EwID10YWlsIG9mIGNwX2ggKi8KK2l2bG4yICAgID0gIDEuNDQyNjk1MDIxNmUrMDAsIC8qIDB4M2ZiOGFhM2IgPTEvbG4yICovCitpdmxuMl9oICA9ICAxLjQ0MjY4Nzk4ODNlKzAwLCAvKiAweDNmYjhhYTAwID0xNmIgMS9sbjIqLworaXZsbjJfbCAgPSAgNy4wNTI2MDc1NDMzZS0wNjsgLyogMHgzNmVjYTU3MCA9MS9sbjIgdGFpbCovCisKK2Zsb2F0CitfX2llZWU3NTRfcG93ZihmbG9hdCB4LCBmbG9hdCB5KQoreworCWZsb2F0IHosYXgsel9oLHpfbCxwX2gscF9sOworCWZsb2F0IHkxLHQxLHQyLHIscyxzbix0LHUsdix3OworCWludDMyX3QgaSxqLGsseWlzaW50LG47CisJaW50MzJfdCBoeCxoeSxpeCxpeSxpczsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCUdFVF9GTE9BVF9XT1JEKGh5LHkpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsgIGl5ID0gaHkmMHg3ZmZmZmZmZjsKKworICAgIC8qIHk9PXplcm86IHgqKjAgPSAxICovCisJaWYoaXk9PTApIHJldHVybiBvbmU7CisKKyAgICAvKiArLU5hTiByZXR1cm4geCt5ICovCisJaWYoaXggPiAweDdmODAwMDAwIHx8CisJICAgaXkgPiAweDdmODAwMDAwKQorCQlyZXR1cm4geCt5OworCisgICAgLyogZGV0ZXJtaW5lIGlmIHkgaXMgYW4gb2RkIGludCB3aGVuIHggPCAwCisgICAgICogeWlzaW50ID0gMAkuLi4geSBpcyBub3QgYW4gaW50ZWdlcgorICAgICAqIHlpc2ludCA9IDEJLi4uIHkgaXMgYW4gb2RkIGludAorICAgICAqIHlpc2ludCA9IDIJLi4uIHkgaXMgYW4gZXZlbiBpbnQKKyAgICAgKi8KKwl5aXNpbnQgID0gMDsKKwlpZihoeDwwKSB7CisJICAgIGlmKGl5Pj0weDRiODAwMDAwKSB5aXNpbnQgPSAyOyAvKiBldmVuIGludGVnZXIgeSAqLworCSAgICBlbHNlIGlmKGl5Pj0weDNmODAwMDAwKSB7CisJCWsgPSAoaXk+PjIzKS0weDdmOwkgICAvKiBleHBvbmVudCAqLworCQlqID0gaXk+PigyMy1rKTsKKwkJaWYoKGo8PCgyMy1rKSk9PWl5KSB5aXNpbnQgPSAyLShqJjEpOworCSAgICB9CisJfQorCisgICAgLyogc3BlY2lhbCB2YWx1ZSBvZiB5ICovCisJaWYgKGl5PT0weDdmODAwMDAwKSB7CS8qIHkgaXMgKy1pbmYgKi8KKwkgICAgaWYgKGl4PT0weDNmODAwMDAwKQorCSAgICAgICAgcmV0dXJuICB5IC0geTsJLyogaW5mKiorLTEgaXMgTmFOICovCisJICAgIGVsc2UgaWYgKGl4ID4gMHgzZjgwMDAwMCkvKiAofHh8PjEpKiorLWluZiA9IGluZiwwICovCisJICAgICAgICByZXR1cm4gKGh5Pj0wKT8geTogemVybzsKKwkgICAgZWxzZQkJCS8qICh8eHw8MSkqKi0sK2luZiA9IGluZiwwICovCisJICAgICAgICByZXR1cm4gKGh5PDApPy15OiB6ZXJvOworCX0KKwlpZihpeT09MHgzZjgwMDAwMCkgewkvKiB5IGlzICArLTEgKi8KKwkgICAgaWYoaHk8MCkgcmV0dXJuIG9uZS94OyBlbHNlIHJldHVybiB4OworCX0KKwlpZihoeT09MHg0MDAwMDAwMCkgcmV0dXJuIHgqeDsgLyogeSBpcyAgMiAqLworCWlmKGh5PT0weDNmMDAwMDAwKSB7CS8qIHkgaXMgIDAuNSAqLworCSAgICBpZihoeD49MCkJLyogeCA+PSArMCAqLworCSAgICByZXR1cm4gX19pZWVlNzU0X3NxcnRmKHgpOworCX0KKworCWF4ICAgPSBmYWJzZih4KTsKKyAgICAvKiBzcGVjaWFsIHZhbHVlIG9mIHggKi8KKwlpZihpeD09MHg3ZjgwMDAwMHx8aXg9PTB8fGl4PT0weDNmODAwMDAwKXsKKwkgICAgeiA9IGF4OwkJCS8qeCBpcyArLTAsKy1pbmYsKy0xKi8KKwkgICAgaWYoaHk8MCkgeiA9IG9uZS96OwkvKiB6ID0gKDEvfHh8KSAqLworCSAgICBpZihoeDwwKSB7CisJCWlmKCgoaXgtMHgzZjgwMDAwMCl8eWlzaW50KT09MCkgeworCQkgICAgeiA9ICh6LXopLyh6LXopOyAvKiAoLTEpKipub24taW50IGlzIE5hTiAqLworCQl9IGVsc2UgaWYoeWlzaW50PT0xKQorCQkgICAgeiA9IC16OwkJLyogKHg8MCkqKm9kZCA9IC0ofHh8KipvZGQpICovCisJICAgIH0KKwkgICAgcmV0dXJuIHo7CisJfQorCisJbiA9ICgodV9pbnQzMl90KWh4Pj4zMSktMTsKKworICAgIC8qICh4PDApKioobm9uLWludCkgaXMgTmFOICovCisJaWYoKG58eWlzaW50KT09MCkgcmV0dXJuICh4LXgpLyh4LXgpOworCisJc24gPSBvbmU7IC8qIHMgKHNpZ24gb2YgcmVzdWx0IC12ZSoqb2RkKSA9IC0xIGVsc2UgPSAxICovCisJaWYoKG58KHlpc2ludC0xKSk9PTApIHNuID0gLW9uZTsvKiAoLXZlKSoqKG9kZCBpbnQpICovCisKKyAgICAvKiB8eXwgaXMgaHVnZSAqLworCWlmKGl5PjB4NGQwMDAwMDApIHsgLyogaWYgfHl8ID4gMioqMjcgKi8KKwkvKiBvdmVyL3VuZGVyZmxvdyBpZiB4IGlzIG5vdCBjbG9zZSB0byBvbmUgKi8KKwkgICAgaWYoaXg8MHgzZjdmZmZmOCkgcmV0dXJuIChoeTwwKT8gc24qaHVnZSpodWdlOnNuKnRpbnkqdGlueTsKKwkgICAgaWYoaXg+MHgzZjgwMDAwNykgcmV0dXJuIChoeT4wKT8gc24qaHVnZSpodWdlOnNuKnRpbnkqdGlueTsKKwkvKiBub3cgfDEteHwgaXMgdGlueSA8PSAyKiotMjAsIHN1ZmZpY2UgdG8gY29tcHV0ZQorCSAgIGxvZyh4KSBieSB4LXheMi8yK3heMy8zLXheNC80ICovCisJICAgIHQgPSBheC0xOwkJLyogdCBoYXMgMjAgdHJhaWxpbmcgemVyb3MgKi8KKwkgICAgdyA9ICh0KnQpKigoZmxvYXQpMC41LXQqKChmbG9hdCkwLjMzMzMzMzMzMzMzMy10KihmbG9hdCkwLjI1KSk7CisJICAgIHUgPSBpdmxuMl9oKnQ7CS8qIGl2bG4yX2ggaGFzIDE2IHNpZy4gYml0cyAqLworCSAgICB2ID0gdCppdmxuMl9sLXcqaXZsbjI7CisJICAgIHQxID0gdSt2OworCSAgICBHRVRfRkxPQVRfV09SRChpcyx0MSk7CisJICAgIFNFVF9GTE9BVF9XT1JEKHQxLGlzJjB4ZmZmZmYwMDApOworCSAgICB0MiA9IHYtKHQxLXUpOworCX0gZWxzZSB7CisJICAgIGZsb2F0IHMyLHNfaCxzX2wsdF9oLHRfbDsKKwkgICAgbiA9IDA7CisJLyogdGFrZSBjYXJlIHN1Ym5vcm1hbCBudW1iZXIgKi8KKwkgICAgaWYoaXg8MHgwMDgwMDAwMCkKKwkJe2F4ICo9IHR3bzI0OyBuIC09IDI0OyBHRVRfRkxPQVRfV09SRChpeCxheCk7IH0KKwkgICAgbiAgKz0gKChpeCk+PjIzKS0weDdmOworCSAgICBqICA9IGl4JjB4MDA3ZmZmZmY7CisJLyogZGV0ZXJtaW5lIGludGVydmFsICovCisJICAgIGl4ID0ganwweDNmODAwMDAwOwkJLyogbm9ybWFsaXplIGl4ICovCisJICAgIGlmKGo8PTB4MWNjNDcxKSBrPTA7CS8qIHx4fDxzcXJ0KDMvMikgKi8KKwkgICAgZWxzZSBpZihqPDB4NWRiM2Q3KSBrPTE7CS8qIHx4fDxzcXJ0KDMpICAgKi8KKwkgICAgZWxzZSB7az0wO24rPTE7aXggLT0gMHgwMDgwMDAwMDt9CisJICAgIFNFVF9GTE9BVF9XT1JEKGF4LGl4KTsKKworCS8qIGNvbXB1dGUgcyA9IHNfaCtzX2wgPSAoeC0xKS8oeCsxKSBvciAoeC0xLjUpLyh4KzEuNSkgKi8KKwkgICAgdSA9IGF4LWJwW2tdOwkJLyogYnBbMF09MS4wLCBicFsxXT0xLjUgKi8KKwkgICAgdiA9IG9uZS8oYXgrYnBba10pOworCSAgICBzID0gdSp2OworCSAgICBzX2ggPSBzOworCSAgICBHRVRfRkxPQVRfV09SRChpcyxzX2gpOworCSAgICBTRVRfRkxPQVRfV09SRChzX2gsaXMmMHhmZmZmZjAwMCk7CisJLyogdF9oPWF4K2JwW2tdIEhpZ2ggKi8KKwkgICAgaXMgPSAoKGl4Pj4xKSYweGZmZmZmMDAwKXwweDIwMDAwMDAwOworCSAgICBTRVRfRkxPQVRfV09SRCh0X2gsaXMrMHgwMDQwMDAwMCsoazw8MjEpKTsKKwkgICAgdF9sID0gYXggLSAodF9oLWJwW2tdKTsKKwkgICAgc19sID0gdiooKHUtc19oKnRfaCktc19oKnRfbCk7CisJLyogY29tcHV0ZSBsb2coYXgpICovCisJICAgIHMyID0gcypzOworCSAgICByID0gczIqczIqKEwxK3MyKihMMitzMiooTDMrczIqKEw0K3MyKihMNStzMipMNikpKSkpOworCSAgICByICs9IHNfbCooc19oK3MpOworCSAgICBzMiAgPSBzX2gqc19oOworCSAgICB0X2ggPSAoZmxvYXQpMy4wK3MyK3I7CisJICAgIEdFVF9GTE9BVF9XT1JEKGlzLHRfaCk7CisJICAgIFNFVF9GTE9BVF9XT1JEKHRfaCxpcyYweGZmZmZmMDAwKTsKKwkgICAgdF9sID0gci0oKHRfaC0oZmxvYXQpMy4wKS1zMik7CisJLyogdSt2ID0gcyooMSsuLi4pICovCisJICAgIHUgPSBzX2gqdF9oOworCSAgICB2ID0gc19sKnRfaCt0X2wqczsKKwkvKiAyLygzbG9nMikqKHMrLi4uKSAqLworCSAgICBwX2ggPSB1K3Y7CisJICAgIEdFVF9GTE9BVF9XT1JEKGlzLHBfaCk7CisJICAgIFNFVF9GTE9BVF9XT1JEKHBfaCxpcyYweGZmZmZmMDAwKTsKKwkgICAgcF9sID0gdi0ocF9oLXUpOworCSAgICB6X2ggPSBjcF9oKnBfaDsJCS8qIGNwX2grY3BfbCA9IDIvKDMqbG9nMikgKi8KKwkgICAgel9sID0gY3BfbCpwX2grcF9sKmNwK2RwX2xba107CisJLyogbG9nMihheCkgPSAocysuLikqMi8oMypsb2cyKSA9IG4gKyBkcF9oICsgel9oICsgel9sICovCisJICAgIHQgPSAoZmxvYXQpbjsKKwkgICAgdDEgPSAoKCh6X2grel9sKStkcF9oW2tdKSt0KTsKKwkgICAgR0VUX0ZMT0FUX1dPUkQoaXMsdDEpOworCSAgICBTRVRfRkxPQVRfV09SRCh0MSxpcyYweGZmZmZmMDAwKTsKKwkgICAgdDIgPSB6X2wtKCgodDEtdCktZHBfaFtrXSktel9oKTsKKwl9CisKKyAgICAvKiBzcGxpdCB1cCB5IGludG8geTEreTIgYW5kIGNvbXB1dGUgKHkxK3kyKSoodDErdDIpICovCisJR0VUX0ZMT0FUX1dPUkQoaXMseSk7CisJU0VUX0ZMT0FUX1dPUkQoeTEsaXMmMHhmZmZmZjAwMCk7CisJcF9sID0gKHkteTEpKnQxK3kqdDI7CisJcF9oID0geTEqdDE7CisJeiA9IHBfbCtwX2g7CisJR0VUX0ZMT0FUX1dPUkQoaix6KTsKKwlpZiAoaj4weDQzMDAwMDAwKQkJCQkvKiBpZiB6ID4gMTI4ICovCisJICAgIHJldHVybiBzbipodWdlKmh1Z2U7CQkJLyogb3ZlcmZsb3cgKi8KKwllbHNlIGlmIChqPT0weDQzMDAwMDAwKSB7CQkJLyogaWYgeiA9PSAxMjggKi8KKwkgICAgaWYocF9sK292dD56LXBfaCkgcmV0dXJuIHNuKmh1Z2UqaHVnZTsJLyogb3ZlcmZsb3cgKi8KKwl9CisJZWxzZSBpZiAoKGomMHg3ZmZmZmZmZik+MHg0MzE2MDAwMCkJCS8qIHogPD0gLTE1MCAqLworCSAgICByZXR1cm4gc24qdGlueSp0aW55OwkJCS8qIHVuZGVyZmxvdyAqLworCWVsc2UgaWYgKGo9PTB4YzMxNjAwMDApewkJCS8qIHogPT0gLTE1MCAqLworCSAgICBpZihwX2w8PXotcF9oKSByZXR1cm4gc24qdGlueSp0aW55OwkJLyogdW5kZXJmbG93ICovCisJfQorICAgIC8qCisgICAgICogY29tcHV0ZSAyKioocF9oK3BfbCkKKyAgICAgKi8KKwlpID0gaiYweDdmZmZmZmZmOworCWsgPSAoaT4+MjMpLTB4N2Y7CisJbiA9IDA7CisJaWYoaT4weDNmMDAwMDAwKSB7CQkvKiBpZiB8enwgPiAwLjUsIHNldCBuID0gW3orMC41XSAqLworCSAgICBuID0gaisoMHgwMDgwMDAwMD4+KGsrMSkpOworCSAgICBrID0gKChuJjB4N2ZmZmZmZmYpPj4yMyktMHg3ZjsJLyogbmV3IGsgZm9yIG4gKi8KKwkgICAgU0VUX0ZMT0FUX1dPUkQodCxuJn4oMHgwMDdmZmZmZj4+aykpOworCSAgICBuID0gKChuJjB4MDA3ZmZmZmYpfDB4MDA4MDAwMDApPj4oMjMtayk7CisJICAgIGlmKGo8MCkgbiA9IC1uOworCSAgICBwX2ggLT0gdDsKKwl9CisJdCA9IHBfbCtwX2g7CisJR0VUX0ZMT0FUX1dPUkQoaXMsdCk7CisJU0VUX0ZMT0FUX1dPUkQodCxpcyYweGZmZmY4MDAwKTsKKwl1ID0gdCpsZzJfaDsKKwl2ID0gKHBfbC0odC1wX2gpKSpsZzIrdCpsZzJfbDsKKwl6ID0gdSt2OworCXcgPSB2LSh6LXUpOworCXQgID0geip6OworCXQxICA9IHogLSB0KihQMSt0KihQMit0KihQMyt0KihQNCt0KlA1KSkpKTsKKwlyICA9ICh6KnQxKS8odDEtdHdvKS0odyt6KncpOworCXogID0gb25lLShyLXopOworCUdFVF9GTE9BVF9XT1JEKGoseik7CisJaiArPSAobjw8MjMpOworCWlmKChqPj4yMyk8PTApIHogPSBzY2FsYm5mKHosbik7CS8qIHN1Ym5vcm1hbCBvdXRwdXQgKi8KKwllbHNlIFNFVF9GTE9BVF9XT1JEKHosaik7CisJcmV0dXJuIHNuKno7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX3JlbV9waW8yLmMgYi9saWJtL3NyYy9lX3JlbV9waW8yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIxYmEyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfcmVtX3BpbzIuYwpAQCAtMCwwICsxLDE2OCBAQAorCisvKiBAKCMpZV9yZW1fcGlvMi5jIDEuNCA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9yZW1fcGlvMi5jLHYgMS44IDIwMDUvMDIvMDQgMTg6MjY6MDYgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfcmVtX3BpbzIoeCx5KQorICogCisgKiByZXR1cm4gdGhlIHJlbWFpbmRlciBvZiB4IHJlbSBwaS8yIGluIHlbMF0reVsxXSAKKyAqIHVzZSBfX2tlcm5lbF9yZW1fcGlvMigpCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworLyoKKyAqIFRhYmxlIG9mIGNvbnN0YW50cyBmb3IgMi9waSwgMzk2IEhleCBkaWdpdHMgKDQ3NiBkZWNpbWFsKSBvZiAyL3BpIAorICovCitzdGF0aWMgY29uc3QgaW50MzJfdCB0d29fb3Zlcl9waVtdID0geworMHhBMkY5ODMsIDB4NkU0RTQ0LCAweDE1MjlGQywgMHgyNzU3RDEsIDB4RjUzNERELCAweEMwREI2MiwgCisweDk1OTkzQywgMHg0MzkwNDEsIDB4RkU1MTYzLCAweEFCREVCQiwgMHhDNTYxQjcsIDB4MjQ2RTNBLCAKKzB4NDI0REQyLCAweEUwMDY0OSwgMHgyRUVBMDksIDB4RDE5MjFDLCAweEZFMURFQiwgMHgxQ0IxMjksIAorMHhBNzNFRTgsIDB4ODIzNUY1LCAweDJFQkI0NCwgMHg4NEU5OUMsIDB4NzAyNkI0LCAweDVGN0U0MSwgCisweDM5OTFENiwgMHgzOTgzNTMsIDB4MzlGNDlDLCAweDg0NUY4QiwgMHhCREY5MjgsIDB4M0IxRkY4LCAKKzB4OTdGRkRFLCAweDA1OTgwRiwgMHhFRjJGMTEsIDB4OEI1QTBBLCAweDZEMUY2RCwgMHgzNjdFQ0YsIAorMHgyN0NCMDksIDB4Qjc0RjQ2LCAweDNGNjY5RSwgMHg1RkVBMkQsIDB4NzUyN0JBLCAweEM3RUJFNSwgCisweEYxN0IzRCwgMHgwNzM5RjcsIDB4OEE1MjkyLCAweEVBNkJGQiwgMHg1RkIxMUYsIDB4OEQ1RDA4LCAKKzB4NTYwMzMwLCAweDQ2RkM3QiwgMHg2QkFCRjAsIDB4Q0ZCQzIwLCAweDlBRjQzNiwgMHgxREE5RTMsIAorMHg5MTYxNUUsIDB4RTYxQjA4LCAweDY1OTk4NSwgMHg1RjE0QTAsIDB4Njg0MDhELCAweEZGRDg4MCwgCisweDRENzMyNywgMHgzMTA2MDYsIDB4MTU1NkNBLCAweDczQThDOSwgMHg2MEUyN0IsIDB4QzA4QzZCLCAKK307CisKK3N0YXRpYyBjb25zdCBpbnQzMl90IG5waW8yX2h3W10gPSB7CisweDNGRjkyMUZCLCAweDQwMDkyMUZCLCAweDQwMTJEOTdDLCAweDQwMTkyMUZCLCAweDQwMUY2QTdBLCAweDQwMjJEOTdDLAorMHg0MDI1RkRCQiwgMHg0MDI5MjFGQiwgMHg0MDJDNDYzQSwgMHg0MDJGNkE3QSwgMHg0MDMxNDc1QywgMHg0MDMyRDk3QywKKzB4NDAzNDZCOUMsIDB4NDAzNUZEQkIsIDB4NDAzNzhGREIsIDB4NDAzOTIxRkIsIDB4NDAzQUI0MUIsIDB4NDAzQzQ2M0EsCisweDQwM0REODVBLCAweDQwM0Y2QTdBLCAweDQwNDA3RTRDLCAweDQwNDE0NzVDLCAweDQwNDIxMDZDLCAweDQwNDJEOTdDLAorMHg0MDQzQTI4QywgMHg0MDQ0NkI5QywgMHg0MDQ1MzRBQywgMHg0MDQ1RkRCQiwgMHg0MDQ2QzZDQiwgMHg0MDQ3OEZEQiwKKzB4NDA0ODU4RUIsIDB4NDA0OTIxRkIsCit9OworCisvKgorICogaW52cGlvMjogIDUzIGJpdHMgb2YgMi9waQorICogcGlvMl8xOiAgIGZpcnN0ICAzMyBiaXQgb2YgcGkvMgorICogcGlvMl8xdDogIHBpLzIgLSBwaW8yXzEKKyAqIHBpbzJfMjogICBzZWNvbmQgMzMgYml0IG9mIHBpLzIKKyAqIHBpbzJfMnQ6ICBwaS8yIC0gKHBpbzJfMStwaW8yXzIpCisgKiBwaW8yXzM6ICAgdGhpcmQgIDMzIGJpdCBvZiBwaS8yCisgKiBwaW8yXzN0OiAgcGkvMiAtIChwaW8yXzErcGlvMl8yK3BpbzJfMykKKyAqLworCitzdGF0aWMgY29uc3QgZG91YmxlCit6ZXJvID0gIDAuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwLCAvKiAweDAwMDAwMDAwLCAweDAwMDAwMDAwICovCitoYWxmID0gIDUuMDAwMDAwMDAwMDAwMDAwMDAwMDBlLTAxLCAvKiAweDNGRTAwMDAwLCAweDAwMDAwMDAwICovCit0d28yNCA9ICAxLjY3NzcyMTYwMDAwMDAwMDAwMDAwZSswNywgLyogMHg0MTcwMDAwMCwgMHgwMDAwMDAwMCAqLworaW52cGlvMiA9ICA2LjM2NjE5NzcyMzY3NTgxMzgyNDMzZS0wMSwgLyogMHgzRkU0NUYzMCwgMHg2REM5Qzg4MyAqLworcGlvMl8xICA9ICAxLjU3MDc5NjMyNjczNDEyNTYxNDE3ZSswMCwgLyogMHgzRkY5MjFGQiwgMHg1NDQwMDAwMCAqLworcGlvMl8xdCA9ICA2LjA3NzEwMDUwNjUwNjE5MjI0OTMyZS0xMSwgLyogMHgzREQwQjQ2MSwgMHgxQTYyNjMzMSAqLworcGlvMl8yICA9ICA2LjA3NzEwMDUwNjMwMzk2NTk3NjYwZS0xMSwgLyogMHgzREQwQjQ2MSwgMHgxQTYwMDAwMCAqLworcGlvMl8ydCA9ICAyLjAyMjI2NjI0ODc5NTk1MDYzMTU0ZS0yMSwgLyogMHgzQkEzMTk4QSwgMHgyRTAzNzA3MyAqLworcGlvMl8zICA9ICAyLjAyMjI2NjI0ODcxMTE2NjQ1NTgwZS0yMSwgLyogMHgzQkEzMTk4QSwgMHgyRTAwMDAwMCAqLworcGlvMl8zdCA9ICA4LjQ3ODQyNzY2MDM2ODg5OTU2OTk3ZS0zMjsgLyogMHgzOTdCODM5QSwgMHgyNTIwNDlDMSAqLworCisJaW50MzJfdCBfX2llZWU3NTRfcmVtX3BpbzIoZG91YmxlIHgsIGRvdWJsZSAqeSkKK3sKKwlkb3VibGUgeix3LHQscixmbjsKKwlkb3VibGUgdHhbM107CisJaW50MzJfdCBlMCxpLGosbngsbixpeCxoeDsKKwl1X2ludDMyX3QgbG93OworCisJR0VUX0hJR0hfV09SRChoeCx4KTsJCS8qIGhpZ2ggd29yZCBvZiB4ICovCisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmKGl4PD0weDNmZTkyMWZiKSAgIC8qIHx4fCB+PD0gcGkvNCAsIG5vIG5lZWQgZm9yIHJlZHVjdGlvbiAqLworCSAgICB7eVswXSA9IHg7IHlbMV0gPSAwOyByZXR1cm4gMDt9CisJaWYoaXg8MHg0MDAyZDk3YykgeyAgLyogfHh8IDwgM3BpLzQsIHNwZWNpYWwgY2FzZSB3aXRoIG49Ky0xICovCisJICAgIGlmKGh4PjApIHsgCisJCXogPSB4IC0gcGlvMl8xOworCQlpZihpeCE9MHgzZmY5MjFmYikgeyAJLyogMzMrNTMgYml0IHBpIGlzIGdvb2QgZW5vdWdoICovCisJCSAgICB5WzBdID0geiAtIHBpbzJfMXQ7CisJCSAgICB5WzFdID0gKHoteVswXSktcGlvMl8xdDsKKwkJfSBlbHNlIHsJCS8qIG5lYXIgcGkvMiwgdXNlIDMzKzMzKzUzIGJpdCBwaSAqLworCQkgICAgeiAtPSBwaW8yXzI7CisJCSAgICB5WzBdID0geiAtIHBpbzJfMnQ7CisJCSAgICB5WzFdID0gKHoteVswXSktcGlvMl8ydDsKKwkJfQorCQlyZXR1cm4gMTsKKwkgICAgfSBlbHNlIHsJLyogbmVnYXRpdmUgeCAqLworCQl6ID0geCArIHBpbzJfMTsKKwkJaWYoaXghPTB4M2ZmOTIxZmIpIHsgCS8qIDMzKzUzIGJpdCBwaSBpcyBnb29kIGVub3VnaCAqLworCQkgICAgeVswXSA9IHogKyBwaW8yXzF0OworCQkgICAgeVsxXSA9ICh6LXlbMF0pK3BpbzJfMXQ7CisJCX0gZWxzZSB7CQkvKiBuZWFyIHBpLzIsIHVzZSAzMyszMys1MyBiaXQgcGkgKi8KKwkJICAgIHogKz0gcGlvMl8yOworCQkgICAgeVswXSA9IHogKyBwaW8yXzJ0OworCQkgICAgeVsxXSA9ICh6LXlbMF0pK3BpbzJfMnQ7CisJCX0KKwkJcmV0dXJuIC0xOworCSAgICB9CisJfQorCWlmKGl4PD0weDQxMzkyMWZiKSB7IC8qIHx4fCB+PD0gMl4xOSoocGkvMiksIG1lZGl1bSBzaXplICovCisJICAgIHQgID0gZmFicyh4KTsKKwkgICAgbiAgPSAoaW50MzJfdCkgKHQqaW52cGlvMitoYWxmKTsKKwkgICAgZm4gPSAoZG91YmxlKW47CisJICAgIHIgID0gdC1mbipwaW8yXzE7CisJICAgIHcgID0gZm4qcGlvMl8xdDsJLyogMXN0IHJvdW5kIGdvb2QgdG8gODUgYml0ICovCisJICAgIGlmKG48MzImJml4IT1ucGlvMl9od1tuLTFdKSB7CQorCQl5WzBdID0gci13OwkvKiBxdWljayBjaGVjayBubyBjYW5jZWxsYXRpb24gKi8KKwkgICAgfSBlbHNlIHsKKwkgICAgICAgIHVfaW50MzJfdCBoaWdoOworCSAgICAgICAgaiAgPSBpeD4+MjA7CisJICAgICAgICB5WzBdID0gci13OyAKKwkJR0VUX0hJR0hfV09SRChoaWdoLHlbMF0pOworCSAgICAgICAgaSA9IGotKChoaWdoPj4yMCkmMHg3ZmYpOworCSAgICAgICAgaWYoaT4xNikgeyAgLyogMm5kIGl0ZXJhdGlvbiBuZWVkZWQsIGdvb2QgdG8gMTE4ICovCisJCSAgICB0ICA9IHI7CisJCSAgICB3ICA9IGZuKnBpbzJfMjsJCisJCSAgICByICA9IHQtdzsKKwkJICAgIHcgID0gZm4qcGlvMl8ydC0oKHQtciktdyk7CQorCQkgICAgeVswXSA9IHItdzsKKwkJICAgIEdFVF9ISUdIX1dPUkQoaGlnaCx5WzBdKTsKKwkJICAgIGkgPSBqLSgoaGlnaD4+MjApJjB4N2ZmKTsKKwkJICAgIGlmKGk+NDkpICB7CS8qIDNyZCBpdGVyYXRpb24gbmVlZCwgMTUxIGJpdHMgYWNjICovCisJCSAgICAJdCAgPSByOwkvKiB3aWxsIGNvdmVyIGFsbCBwb3NzaWJsZSBjYXNlcyAqLworCQkgICAgCXcgID0gZm4qcGlvMl8zOwkKKwkJICAgIAlyICA9IHQtdzsKKwkJICAgIAl3ICA9IGZuKnBpbzJfM3QtKCh0LXIpLXcpOwkKKwkJICAgIAl5WzBdID0gci13OworCQkgICAgfQorCQl9CisJICAgIH0KKwkgICAgeVsxXSA9IChyLXlbMF0pLXc7CisJICAgIGlmKGh4PDApIAl7eVswXSA9IC15WzBdOyB5WzFdID0gLXlbMV07IHJldHVybiAtbjt9CisJICAgIGVsc2UJIHJldHVybiBuOworCX0KKyAgICAvKiAKKyAgICAgKiBhbGwgb3RoZXIgKGxhcmdlKSBhcmd1bWVudHMKKyAgICAgKi8KKwlpZihpeD49MHg3ZmYwMDAwMCkgewkJLyogeCBpcyBpbmYgb3IgTmFOICovCisJICAgIHlbMF09eVsxXT14LXg7IHJldHVybiAwOworCX0KKyAgICAvKiBzZXQgeiA9IHNjYWxibih8eHwsaWxvZ2IoeCktMjMpICovCisJR0VUX0xPV19XT1JEKGxvdyx4KTsKKwlTRVRfTE9XX1dPUkQoeixsb3cpOworCWUwIAk9IChpeD4+MjApLTEwNDY7CS8qIGUwID0gaWxvZ2IoeiktMjM7ICovCisJU0VUX0hJR0hfV09SRCh6LCBpeCAtICgoaW50MzJfdCkoZTA8PDIwKSkpOworCWZvcihpPTA7aTwyO2krKykgeworCQl0eFtpXSA9IChkb3VibGUpKChpbnQzMl90KSh6KSk7CisJCXogICAgID0gKHotdHhbaV0pKnR3bzI0OworCX0KKwl0eFsyXSA9IHo7CisJbnggPSAzOworCXdoaWxlKHR4W254LTFdPT16ZXJvKSBueC0tOwkvKiBza2lwIHplcm8gdGVybSAqLworCW4gID0gIF9fa2VybmVsX3JlbV9waW8yKHR4LHksZTAsbngsMix0d29fb3Zlcl9waSk7CisJaWYoaHg8MCkge3lbMF0gPSAteVswXTsgeVsxXSA9IC15WzFdOyByZXR1cm4gLW47fQorCXJldHVybiBuOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9yZW1fcGlvMmYuYyBiL2xpYm0vc3JjL2VfcmVtX3BpbzJmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIzMWNkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfcmVtX3BpbzJmLmMKQEAgLTAsMCArMSw5OCBAQAorLyogZV9yZW1fcGlvMmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfcmVtX3BpbzIuYworICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKiBEZWJ1Z2dlZCBhbmQgb3B0aW1pemVkIGJ5IEJydWNlIEQuIEV2YW5zLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfcmVtX3BpbzJmLmMsdiAxLjE5IDIwMDUvMTEvMjMgMDM6MDM6MDkgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfcmVtX3BpbzJmKHgseSkKKyAqCisgKiByZXR1cm4gdGhlIHJlbWFpbmRlciBvZiB4IHJlbSBwaS8yIGluIHlbMF0reVsxXQorICogdXNlIGRvdWJsZSBwcmVjaXNpb24gaW50ZXJuYWxseQorICogdXNlIF9fa2VybmVsX3JlbV9waW8yKCkgZm9yIGxhcmdlIHgKKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisvKgorICogVGFibGUgb2YgY29uc3RhbnRzIGZvciAyL3BpLCAzOTYgSGV4IGRpZ2l0cyAoNDc2IGRlY2ltYWwpIG9mIDIvcGkKKyAqLworc3RhdGljIGNvbnN0IGludDMyX3QgdHdvX292ZXJfcGlbXSA9IHsKKzB4QTJGOTgzLCAweDZFNEU0NCwgMHgxNTI5RkMsIDB4Mjc1N0QxLCAweEY1MzRERCwgMHhDMERCNjIsIAorMHg5NTk5M0MsIDB4NDM5MDQxLCAweEZFNTE2MywgMHhBQkRFQkIsIDB4QzU2MUI3LCAweDI0NkUzQSwgCisweDQyNEREMiwgMHhFMDA2NDksIDB4MkVFQTA5LCAweEQxOTIxQywgMHhGRTFERUIsIDB4MUNCMTI5LCAKKzB4QTczRUU4LCAweDgyMzVGNSwgMHgyRUJCNDQsIDB4ODRFOTlDLCAweDcwMjZCNCwgMHg1RjdFNDEsIAorMHgzOTkxRDYsIDB4Mzk4MzUzLCAweDM5RjQ5QywgMHg4NDVGOEIsIDB4QkRGOTI4LCAweDNCMUZGOCwgCisweDk3RkZERSwgMHgwNTk4MEYsIDB4RUYyRjExLCAweDhCNUEwQSwgMHg2RDFGNkQsIDB4MzY3RUNGLCAKKzB4MjdDQjA5LCAweEI3NEY0NiwgMHgzRjY2OUUsIDB4NUZFQTJELCAweDc1MjdCQSwgMHhDN0VCRTUsIAorMHhGMTdCM0QsIDB4MDczOUY3LCAweDhBNTI5MiwgMHhFQTZCRkIsIDB4NUZCMTFGLCAweDhENUQwOCwgCisweDU2MDMzMCwgMHg0NkZDN0IsIDB4NkJBQkYwLCAweENGQkMyMCwgMHg5QUY0MzYsIDB4MURBOUUzLCAKKzB4OTE2MTVFLCAweEU2MUIwOCwgMHg2NTk5ODUsIDB4NUYxNEEwLCAweDY4NDA4RCwgMHhGRkQ4ODAsIAorMHg0RDczMjcsIDB4MzEwNjA2LCAweDE1NTZDQSwgMHg3M0E4QzksIDB4NjBFMjdCLCAweEMwOEM2QiwgCit9OworCisvKgorICogaW52cGlvMjogIDUzIGJpdHMgb2YgMi9waQorICogcGlvMl8xOiAgIGZpcnN0ICAzMyBiaXQgb2YgcGkvMgorICogcGlvMl8xdDogIHBpLzIgLSBwaW8yXzEKKyAqLworCitzdGF0aWMgY29uc3QgZG91YmxlCit6ZXJvID0gIDAuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwLCAvKiAweDAwMDAwMDAwLCAweDAwMDAwMDAwICovCitoYWxmID0gIDUuMDAwMDAwMDAwMDAwMDAwMDAwMDBlLTAxLCAvKiAweDNGRTAwMDAwLCAweDAwMDAwMDAwICovCit0d28yNCA9ICAxLjY3NzcyMTYwMDAwMDAwMDAwMDAwZSswNywgLyogMHg0MTcwMDAwMCwgMHgwMDAwMDAwMCAqLworaW52cGlvMiA9ICA2LjM2NjE5NzcyMzY3NTgxMzgyNDMzZS0wMSwgLyogMHgzRkU0NUYzMCwgMHg2REM5Qzg4MyAqLworcGlvMl8xICA9ICAxLjU3MDc5NjMyNjczNDEyNTYxNDE3ZSswMCwgLyogMHgzRkY5MjFGQiwgMHg1NDQwMDAwMCAqLworcGlvMl8xdCA9ICA2LjA3NzEwMDUwNjUwNjE5MjI0OTMyZS0xMTsgLyogMHgzREQwQjQ2MSwgMHgxQTYyNjMzMSAqLworCisJaW50MzJfdCBfX2llZWU3NTRfcmVtX3BpbzJmKGZsb2F0IHgsIGZsb2F0ICp5KQoreworCWRvdWJsZSB3LHQscixmbjsKKwlkb3VibGUgdHhbMV0sdHlbMl07CisJZmxvYXQgejsKKwlpbnQzMl90IGUwLG4saXgsaHg7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisgICAgLyogMzMrNTMgYml0IHBpIGlzIGdvb2QgZW5vdWdoIGZvciBtZWRpdW0gc2l6ZSAqLworCWlmKGl4PD0weDQ5NDkwZjgwKSB7CQkvKiB8eHwgfjw9IDJeMTkqKHBpLzIpLCBtZWRpdW0gc2l6ZSAqLworCSAgICB0ICA9IGZhYnNmKHgpOworCSAgICBuICA9IChpbnQzMl90KSAodCppbnZwaW8yK2hhbGYpOworCSAgICBmbiA9IChkb3VibGUpbjsKKwkgICAgciAgPSB0LWZuKnBpbzJfMTsKKwkgICAgdyAgPSBmbipwaW8yXzF0OworCSAgICB5WzBdID0gci13OworCSAgICB5WzFdID0gKHIteVswXSktdzsKKwkgICAgaWYoaHg8MCkgCXt5WzBdID0gLXlbMF07IHlbMV0gPSAteVsxXTsgcmV0dXJuIC1uO30KKwkgICAgZWxzZQkgcmV0dXJuIG47CisJfQorICAgIC8qCisgICAgICogYWxsIG90aGVyIChsYXJnZSkgYXJndW1lbnRzCisgICAgICovCisJaWYoaXg+PTB4N2Y4MDAwMDApIHsJCS8qIHggaXMgaW5mIG9yIE5hTiAqLworCSAgICB5WzBdPXlbMV09eC14OyByZXR1cm4gMDsKKwl9CisgICAgLyogc2V0IHogPSBzY2FsYm4ofHh8LGlsb2diKHx4fCktMjMpICovCisJZTAgPSAoaXg+PjIzKS0xNTA7CQkvKiBlMCA9IGlsb2diKHx4fCktMjM7ICovCisJU0VUX0ZMT0FUX1dPUkQoeiwgaXggLSAoKGludDMyX3QpKGUwPDwyMykpKTsKKwl0eFswXSA9IHo7CisJbiAgPSAgX19rZXJuZWxfcmVtX3BpbzIodHgsdHksZTAsMSwxLHR3b19vdmVyX3BpKTsKKwl5WzBdID0gdHlbMF07CisJeVsxXSA9IHR5WzBdIC0geVswXTsKKwlpZihoeDwwKSB7eVswXSA9IC15WzBdOyB5WzFdID0gLXlbMV07IHJldHVybiAtbjt9CisJcmV0dXJuIG47Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX3JlbWFpbmRlci5jIGIvbGlibS9zcmMvZV9yZW1haW5kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjkzMmEyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9yZW1haW5kZXIuYwpAQCAtMCwwICsxLDczIEBACisKKy8qIEAoIyllX3JlbWFpbmRlci5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX3JlbWFpbmRlci5jLHYgMS4xMCAyMDA1LzAyLzA0IDE4OjI2OjA2IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X3JlbWFpbmRlcih4LHApCisgKiBSZXR1cm4gOiAgICAgICAgICAgICAgICAgIAorICogCXJldHVybnMgIHggUkVNIHAgID0gIHggLSBbeC9wXSpwIGFzIGlmIGluIGluZmluaXRlIAorICogCXByZWNpc2UgYXJpdGhtZXRpYywgd2hlcmUgW3gvcF0gaXMgdGhlIChpbmZpbml0ZSBiaXQpIAorICoJaW50ZWdlciBuZWFyZXN0IHgvcCAoaW4gaGFsZiB3YXkgY2FzZSBjaG9vc2UgdGhlIGV2ZW4gb25lKS4KKyAqIE1ldGhvZCA6IAorICoJQmFzZWQgb24gZm1vZCgpIHJldHVybiB4LVt4L3BdY2hvcHBlZCpwIGV4YWN0bHAuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZSB6ZXJvID0gMC4wOworCisKK2RvdWJsZQorX19pZWVlNzU0X3JlbWFpbmRlcihkb3VibGUgeCwgZG91YmxlIHApCit7CisJaW50MzJfdCBoeCxocDsKKwl1X2ludDMyX3Qgc3gsbHgsbHA7CisJZG91YmxlIHBfaGFsZjsKKworCUVYVFJBQ1RfV09SRFMoaHgsbHgseCk7CisJRVhUUkFDVF9XT1JEUyhocCxscCxwKTsKKwlzeCA9IGh4JjB4ODAwMDAwMDA7CisJaHAgJj0gMHg3ZmZmZmZmZjsKKwloeCAmPSAweDdmZmZmZmZmOworCisgICAgLyogcHVyZ2Ugb2ZmIGV4Y2VwdGlvbiB2YWx1ZXMgKi8KKwlpZigoaHB8bHApPT0wKSByZXR1cm4gKHgqcCkvKHgqcCk7IAkvKiBwID0gMCAqLworCWlmKChoeD49MHg3ZmYwMDAwMCl8fAkJCS8qIHggbm90IGZpbml0ZSAqLworCSAgKChocD49MHg3ZmYwMDAwMCkmJgkJCS8qIHAgaXMgTmFOICovCisJICAoKChocC0weDdmZjAwMDAwKXxscCkhPTApKSkKKwkgICAgcmV0dXJuICh4KnApLyh4KnApOworCisKKwlpZiAoaHA8PTB4N2ZkZmZmZmYpIHggPSBfX2llZWU3NTRfZm1vZCh4LHArcCk7CS8qIG5vdyB4IDwgMnAgKi8KKwlpZiAoKChoeC1ocCl8KGx4LWxwKSk9PTApIHJldHVybiB6ZXJvKng7CisJeCAgPSBmYWJzKHgpOworCXAgID0gZmFicyhwKTsKKwlpZiAoaHA8MHgwMDIwMDAwMCkgeworCSAgICBpZih4K3g+cCkgeworCQl4LT1wOworCQlpZih4K3g+PXApIHggLT0gcDsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIHBfaGFsZiA9IDAuNSpwOworCSAgICBpZih4PnBfaGFsZikgeworCQl4LT1wOworCQlpZih4Pj1wX2hhbGYpIHggLT0gcDsKKwkgICAgfQorCX0KKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCVNFVF9ISUdIX1dPUkQoeCxoeF5zeCk7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX3JlbWFpbmRlcmYuYyBiL2xpYm0vc3JjL2VfcmVtYWluZGVyZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNDUwODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX3JlbWFpbmRlcmYuYwpAQCAtMCwwICsxLDY1IEBACisvKiBlX3JlbWFpbmRlcmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfcmVtYWluZGVyLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX3JlbWFpbmRlcmYuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0IHplcm8gPSAwLjA7CisKKworZmxvYXQKK19faWVlZTc1NF9yZW1haW5kZXJmKGZsb2F0IHgsIGZsb2F0IHApCit7CisJaW50MzJfdCBoeCxocDsKKwl1X2ludDMyX3Qgc3g7CisJZmxvYXQgcF9oYWxmOworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJR0VUX0ZMT0FUX1dPUkQoaHAscCk7CisJc3ggPSBoeCYweDgwMDAwMDAwOworCWhwICY9IDB4N2ZmZmZmZmY7CisJaHggJj0gMHg3ZmZmZmZmZjsKKworICAgIC8qIHB1cmdlIG9mZiBleGNlcHRpb24gdmFsdWVzICovCisJaWYoaHA9PTApIHJldHVybiAoeCpwKS8oeCpwKTsJIAkvKiBwID0gMCAqLworCWlmKChoeD49MHg3ZjgwMDAwMCl8fAkJCS8qIHggbm90IGZpbml0ZSAqLworCSAgKChocD4weDdmODAwMDAwKSkpCQkJLyogcCBpcyBOYU4gKi8KKwkgICAgcmV0dXJuICh4KnApLyh4KnApOworCisKKwlpZiAoaHA8PTB4N2VmZmZmZmYpIHggPSBfX2llZWU3NTRfZm1vZGYoeCxwK3ApOwkvKiBub3cgeCA8IDJwICovCisJaWYgKChoeC1ocCk9PTApIHJldHVybiB6ZXJvKng7CisJeCAgPSBmYWJzZih4KTsKKwlwICA9IGZhYnNmKHApOworCWlmIChocDwweDAxMDAwMDAwKSB7CisJICAgIGlmKHgreD5wKSB7CisJCXgtPXA7CisJCWlmKHgreD49cCkgeCAtPSBwOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgcF9oYWxmID0gKGZsb2F0KTAuNSpwOworCSAgICBpZih4PnBfaGFsZikgeworCQl4LT1wOworCQlpZih4Pj1wX2hhbGYpIHggLT0gcDsKKwkgICAgfQorCX0KKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlTRVRfRkxPQVRfV09SRCh4LGh4XnN4KTsKKwlyZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2Vfc2NhbGIuYyBiL2xpYm0vc3JjL2Vfc2NhbGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODE2NjZlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9zY2FsYi5jCkBAIC0wLDAgKzEsNDggQEAKKworLyogQCgjKWVfc2NhbGIuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9zY2FsYi5jLHYgMS4xMiAyMDA1LzAyLzA0IDE4OjI2OjA2IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIF9faWVlZTc1NF9zY2FsYih4LCBmbikgaXMgcHJvdmlkZSBmb3IKKyAqIHBhc3NpbmcgdmFyaW91cyBzdGFuZGFyZCB0ZXN0IHN1aXRlLiBPbmUgCisgKiBzaG91bGQgdXNlIHNjYWxibigpIGluc3RlYWQuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworI2lmZGVmIF9TQ0FMQl9JTlQKK2RvdWJsZQorX19pZWVlNzU0X3NjYWxiKGRvdWJsZSB4LCBpbnQgZm4pCisjZWxzZQorZG91YmxlCitfX2llZWU3NTRfc2NhbGIoZG91YmxlIHgsIGRvdWJsZSBmbikKKyNlbmRpZgoreworI2lmZGVmIF9TQ0FMQl9JTlQKKwlyZXR1cm4gc2NhbGJuKHgsZm4pOworI2Vsc2UKKwlpZiAoaXNuYW4oeCl8fGlzbmFuKGZuKSkgcmV0dXJuIHgqZm47CisJaWYgKCFmaW5pdGUoZm4pKSB7CisJICAgIGlmKGZuPjAuMCkgcmV0dXJuIHgqZm47CisJICAgIGVsc2UgICAgICAgcmV0dXJuIHgvKC1mbik7CisJfQorCWlmIChyaW50KGZuKSE9Zm4pIHJldHVybiAoZm4tZm4pLyhmbi1mbik7CisJaWYgKCBmbiA+IDY1MDAwLjApIHJldHVybiBzY2FsYm4oeCwgNjUwMDApOworCWlmICgtZm4gPiA2NTAwMC4wKSByZXR1cm4gc2NhbGJuKHgsLTY1MDAwKTsKKwlyZXR1cm4gc2NhbGJuKHgsKGludClmbik7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2Vfc2NhbGJmLmMgYi9saWJtL3NyYy9lX3NjYWxiZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YWMxZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX3NjYWxiZi5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qIGVfc2NhbGJmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX3NjYWxiLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX3NjYWxiZi5jLHYgMS4xMCAyMDA1LzEyLzA2IDIwOjEyOjM4IG9icmllbiBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworI2lmZGVmIF9TQ0FMQl9JTlQKK2Zsb2F0CitfX2llZWU3NTRfc2NhbGJmKGZsb2F0IHgsIGludCBmbikKKyNlbHNlCitmbG9hdAorX19pZWVlNzU0X3NjYWxiZihmbG9hdCB4LCBmbG9hdCBmbikKKyNlbmRpZgoreworI2lmZGVmIF9TQ0FMQl9JTlQKKwlyZXR1cm4gc2NhbGJuZih4LGZuKTsKKyNlbHNlCisJaWYgKChpc25hbmYpKHgpfHwoaXNuYW5mKShmbikpIHJldHVybiB4KmZuOworCWlmICghZmluaXRlZihmbikpIHsKKwkgICAgaWYoZm4+KGZsb2F0KTAuMCkgcmV0dXJuIHgqZm47CisJICAgIGVsc2UgICAgICAgcmV0dXJuIHgvKC1mbik7CisJfQorCWlmIChyaW50ZihmbikhPWZuKSByZXR1cm4gKGZuLWZuKS8oZm4tZm4pOworCWlmICggZm4gPiAoZmxvYXQpNjUwMDAuMCkgcmV0dXJuIHNjYWxibmYoeCwgNjUwMDApOworCWlmICgtZm4gPiAoZmxvYXQpNjUwMDAuMCkgcmV0dXJuIHNjYWxibmYoeCwtNjUwMDApOworCXJldHVybiBzY2FsYm5mKHgsKGludClmbik7CisjZW5kaWYKK30KKworX193ZWFrX3JlZmVyZW5jZShzY2FsYmYsIGxkZXhwZik7CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX3NpbmguYyBiL2xpYm0vc3JjL2Vfc2luaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ODRiMjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX3NpbmguYwpAQCAtMCwwICsxLDc5IEBACisKKy8qIEAoIyllX3NpbmguYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9zaW5oLmMsdiAxLjkgMjAwNS8wMi8wNCAxODoyNjowNiBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9zaW5oKHgpCisgKiBNZXRob2QgOiAKKyAqIG1hdGhlbWF0aWNhbGx5IHNpbmgoeCkgaWYgZGVmaW5lZCB0byBiZSAoZXhwKHgpLWV4cCgteCkpLzIKKyAqCTEuIFJlcGxhY2UgeCBieSB8eHwgKHNpbmgoLXgpID0gLXNpbmgoeCkpLiAKKyAqCTIuIAorICoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgKyBFLyhFKzEpCisgKgkgICAgMCAgICAgICAgPD0geCA8PSAyMiAgICAgOiAgc2luaCh4KSA6PSAtLS0tLS0tLS0tLS0tLSwgRT1leHBtMSh4KQorICoJCQkgICAgICAgCQkJICAgICAgICAyCisgKgorICoJICAgIDIyICAgICAgIDw9IHggPD0gbG5vdmZ0IDogIHNpbmgoeCkgOj0gZXhwKHgpLzIgCisgKgkgICAgbG5vdmZ0ICAgPD0geCA8PSBsbjJvdmZ0OiAgc2luaCh4KSA6PSBleHAoeC8yKS8yICogZXhwKHgvMikKKyAqCSAgICBsbjJvdmZ0ICA8ICB4CSAgICA6ICBzaW5oKHgpIDo9IHgqc2h1Z2UgKG92ZXJmbG93KQorICoKKyAqIFNwZWNpYWwgY2FzZXM6CisgKglzaW5oKHgpIGlzIHx4fCBpZiB4IGlzICtJTkYsIC1JTkYsIG9yIE5hTi4KKyAqCW9ubHkgc2luaCgwKT0wIGlzIGV4YWN0IGZvciBmaW5pdGUgeC4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlIG9uZSA9IDEuMCwgc2h1Z2UgPSAxLjBlMzA3OworCitkb3VibGUKK19faWVlZTc1NF9zaW5oKGRvdWJsZSB4KQoreworCWRvdWJsZSB0LHcsaDsKKwlpbnQzMl90IGl4LGp4OworCXVfaW50MzJfdCBseDsKKworICAgIC8qIEhpZ2ggd29yZCBvZiB8eHwuICovCisJR0VUX0hJR0hfV09SRChqeCx4KTsKKwlpeCA9IGp4JjB4N2ZmZmZmZmY7CisKKyAgICAvKiB4IGlzIElORiBvciBOYU4gKi8KKwlpZihpeD49MHg3ZmYwMDAwMCkgcmV0dXJuIHgreDsJCisKKwloID0gMC41OworCWlmIChqeDwwKSBoID0gLWg7CisgICAgLyogfHh8IGluIFswLDIyXSwgcmV0dXJuIHNpZ24oeCkqMC41KihFK0UvKEUrMSkpKSAqLworCWlmIChpeCA8IDB4NDAzNjAwMDApIHsJCS8qIHx4fDwyMiAqLworCSAgICBpZiAoaXg8MHgzZTMwMDAwMCkgCQkvKiB8eHw8MioqLTI4ICovCisJCWlmKHNodWdlK3g+b25lKSByZXR1cm4geDsvKiBzaW5oKHRpbnkpID0gdGlueSB3aXRoIGluZXhhY3QgKi8KKwkgICAgdCA9IGV4cG0xKGZhYnMoeCkpOworCSAgICBpZihpeDwweDNmZjAwMDAwKSByZXR1cm4gaCooMi4wKnQtdCp0Lyh0K29uZSkpOworCSAgICByZXR1cm4gaCoodCt0Lyh0K29uZSkpOworCX0KKworICAgIC8qIHx4fCBpbiBbMjIsIGxvZyhtYXhkb3VibGUpXSByZXR1cm4gMC41KmV4cCh8eHwpICovCisJaWYgKGl4IDwgMHg0MDg2MkU0MikgIHJldHVybiBoKl9faWVlZTc1NF9leHAoZmFicyh4KSk7CisKKyAgICAvKiB8eHwgaW4gW2xvZyhtYXhkb3VibGUpLCBvdmVyZmxvd3RocmVzb2xkXSAqLworCUdFVF9MT1dfV09SRChseCx4KTsKKwlpZiAoaXg8MHg0MDg2MzNDRSB8fCAoKGl4PT0weDQwODYzM2NlKSYmKGx4PD0odV9pbnQzMl90KTB4OGZiOWY4N2QpKSkgeworCSAgICB3ID0gX19pZWVlNzU0X2V4cCgwLjUqZmFicyh4KSk7CisJICAgIHQgPSBoKnc7CisJICAgIHJldHVybiB0Knc7CisJfQorCisgICAgLyogfHh8ID4gb3ZlcmZsb3d0aHJlc29sZCwgc2luaCh4KSBvdmVyZmxvdyAqLworCXJldHVybiB4KnNodWdlOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9zaW5oZi5jIGIvbGlibS9zcmMvZV9zaW5oZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZTc1M2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX3NpbmhmLmMKQEAgLTAsMCArMSw2MCBAQAorLyogZV9zaW5oZi5jIC0tIGZsb2F0IHZlcnNpb24gb2YgZV9zaW5oLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX3NpbmhmLmMsdiAxLjggMjAwNS8xMS8xMyAwMDo0MTo0NiBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdCBvbmUgPSAxLjAsIHNodWdlID0gMS4wZTM3OworCitmbG9hdAorX19pZWVlNzU0X3NpbmhmKGZsb2F0IHgpCit7CisJZmxvYXQgdCx3LGg7CisJaW50MzJfdCBpeCxqeDsKKworCUdFVF9GTE9BVF9XT1JEKGp4LHgpOworCWl4ID0gangmMHg3ZmZmZmZmZjsKKworICAgIC8qIHggaXMgSU5GIG9yIE5hTiAqLworCWlmKGl4Pj0weDdmODAwMDAwKSByZXR1cm4geCt4OworCisJaCA9IDAuNTsKKwlpZiAoang8MCkgaCA9IC1oOworICAgIC8qIHx4fCBpbiBbMCw5XSwgcmV0dXJuIHNpZ24oeCkqMC41KihFK0UvKEUrMSkpKSAqLworCWlmIChpeCA8IDB4NDExMDAwMDApIHsJCS8qIHx4fDw5ICovCisJICAgIGlmIChpeDwweDM5ODAwMDAwKSAJCS8qIHx4fDwyKiotMTIgKi8KKwkJaWYoc2h1Z2UreD5vbmUpIHJldHVybiB4Oy8qIHNpbmgodGlueSkgPSB0aW55IHdpdGggaW5leGFjdCAqLworCSAgICB0ID0gZXhwbTFmKGZhYnNmKHgpKTsKKwkgICAgaWYoaXg8MHgzZjgwMDAwMCkgcmV0dXJuIGgqKChmbG9hdCkyLjAqdC10KnQvKHQrb25lKSk7CisJICAgIHJldHVybiBoKih0K3QvKHQrb25lKSk7CisJfQorCisgICAgLyogfHh8IGluIFs5LCBsb2dmKG1heGZsb2F0KV0gcmV0dXJuIDAuNSpleHAofHh8KSAqLworCWlmIChpeCA8IDB4NDJiMTcyMTcpICByZXR1cm4gaCpfX2llZWU3NTRfZXhwZihmYWJzZih4KSk7CisKKyAgICAvKiB8eHwgaW4gW2xvZ2YobWF4ZmxvYXQpLCBvdmVyZmxvd3RocmVzb2xkXSAqLworCWlmIChpeDw9MHg0MmIyZDRmYykgeworCSAgICB3ID0gX19pZWVlNzU0X2V4cGYoKGZsb2F0KTAuNSpmYWJzZih4KSk7CisJICAgIHQgPSBoKnc7CisJICAgIHJldHVybiB0Knc7CisJfQorCisgICAgLyogfHh8ID4gb3ZlcmZsb3d0aHJlc29sZCwgc2luaCh4KSBvdmVyZmxvdyAqLworCXJldHVybiB4KnNodWdlOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9zcXJ0LmMgYi9saWJtL3NyYy9lX3NxcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzVjYjEwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9zcXJ0LmMKQEAgLTAsMCArMSw0NDYgQEAKKworLyogQCgjKWVfc3FydC5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX3NxcnQuYyx2IDEuMTAgMjAwNS8wMi8wNCAxODoyNjowNiBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9zcXJ0KHgpCisgKiBSZXR1cm4gY29ycmVjdGx5IHJvdW5kZWQgc3FydC4KKyAqICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCSAgICAgfCAgVXNlIHRoZSBoYXJkd2FyZSBzcXJ0IGlmIHlvdSBoYXZlIG9uZSB8CisgKiAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBNZXRob2Q6IAorICogICBCaXQgYnkgYml0IG1ldGhvZCB1c2luZyBpbnRlZ2VyIGFyaXRobWV0aWMuIChTbG93LCBidXQgcG9ydGFibGUpIAorICogICAxLiBOb3JtYWxpemF0aW9uCisgKglTY2FsZSB4IHRvIHkgaW4gWzEsNCkgd2l0aCBldmVuIHBvd2VycyBvZiAyOiAKKyAqCWZpbmQgYW4gaW50ZWdlciBrIHN1Y2ggdGhhdCAgMSA8PSAoeT14KjJeKDJrKSkgPCA0LCB0aGVuCisgKgkJc3FydCh4KSA9IDJeayAqIHNxcnQoeSkKKyAqICAgMi4gQml0IGJ5IGJpdCBjb21wdXRhdGlvbgorICoJTGV0IHEgID0gc3FydCh5KSB0cnVuY2F0ZWQgdG8gaSBiaXQgYWZ0ZXIgYmluYXJ5IHBvaW50IChxID0gMSksCisgKgkgICAgIGkJCQkJCQkJIDAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrMSAgICAgICAgIDIKKyAqCSAgICBzICA9IDIqcSAsIGFuZAl5ICA9ICAyICAgKiAoIHkgLSBxICApLgkJKDEpCisgKgkgICAgIGkgICAgICBpICAgICAgICAgICAgaSAgICAgICAgICAgICAgICAgaQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICoJVG8gY29tcHV0ZSBxICAgIGZyb20gcSAsIG9uZSBjaGVja3Mgd2hldGhlciAKKyAqCQkgICAgaSsxICAgICAgIGkgICAgICAgICAgICAgICAgICAgICAgIAorICoKKyAqCQkJICAgICAgLShpKzEpIDIKKyAqCQkJKHEgKyAyICAgICAgKSA8PSB5LgkJCSgyKQorICogICAgIAkJCSAgaQorICoJCQkJCQkJICAgICAgLShpKzEpCisgKglJZiAoMikgaXMgZmFsc2UsIHRoZW4gcSAgID0gcSA7IG90aGVyd2lzZSBxICAgPSBxICArIDIgICAgICAuCisgKgkJIAkgICAgICAgaSsxICAgaSAgICAgICAgICAgICBpKzEgICBpCisgKgorICoJV2l0aCBzb21lIGFsZ2VicmljIG1hbmlwdWxhdGlvbiwgaXQgaXMgbm90IGRpZmZpY3VsdCB0byBzZWUKKyAqCXRoYXQgKDIpIGlzIGVxdWl2YWxlbnQgdG8gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShpKzEpCisgKgkJCXMgICsgIDIgICAgICAgPD0geQkJCSgzKQorICoJCQkgaSAgICAgICAgICAgICAgICBpCisgKgorICoJVGhlIGFkdmFudGFnZSBvZiAoMykgaXMgdGhhdCBzICBhbmQgeSAgY2FuIGJlIGNvbXB1dGVkIGJ5IAorICoJCQkJICAgICAgaSAgICAgIGkKKyAqCXRoZSBmb2xsb3dpbmcgcmVjdXJyZW5jZSBmb3JtdWxhOgorICoJICAgIGlmICgzKSBpcyBmYWxzZQorICoKKyAqCSAgICBzICAgICA9ICBzICAsCXkgICAgPSB5ICAgOwkJCSg0KQorICoJICAgICBpKzEgICAgICBpCQkgaSsxICAgIGkKKyAqCisgKgkgICAgb3RoZXJ3aXNlLAorICogICAgICAgICAgICAgICAgICAgICAgICAgLWkgICAgICAgICAgICAgICAgICAgICAtKGkrMSkKKyAqCSAgICBzCSAgPSAgcyAgKyAyICAsICB5ICAgID0geSAgLSAgcyAgLSAyICAJCSg1KQorICogICAgICAgICAgIGkrMSAgICAgIGkgICAgICAgICAgaSsxICAgIGkgICAgIGkKKyAqCQkJCQorICoJT25lIG1heSBlYXNpbHkgdXNlIGluZHVjdGlvbiB0byBwcm92ZSAoNCkgYW5kICg1KS4gCisgKglOb3RlLiBTaW5jZSB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgKDMpIGNvbnRhaW4gb25seSBpKzIgYml0cywKKyAqCSAgICAgIGl0IGRvZXMgbm90IG5lY2Vzc2FyeSB0byBkbyBhIGZ1bGwgKDUzLWJpdCkgY29tcGFyaXNvbiAKKyAqCSAgICAgIGluICgzKS4KKyAqICAgMy4gRmluYWwgcm91bmRpbmcKKyAqCUFmdGVyIGdlbmVyYXRpbmcgdGhlIDUzIGJpdHMgcmVzdWx0LCB3ZSBjb21wdXRlIG9uZSBtb3JlIGJpdC4KKyAqCVRvZ2V0aGVyIHdpdGggdGhlIHJlbWFpbmRlciwgd2UgY2FuIGRlY2lkZSB3aGV0aGVyIHRoZQorICoJcmVzdWx0IGlzIGV4YWN0LCBiaWdnZXIgdGhhbiAxLzJ1bHAsIG9yIGxlc3MgdGhhbiAxLzJ1bHAKKyAqCShpdCB3aWxsIG5ldmVyIGVxdWFsIHRvIDEvMnVscCkuCisgKglUaGUgcm91bmRpbmcgbW9kZSBjYW4gYmUgZGV0ZWN0ZWQgYnkgY2hlY2tpbmcgd2hldGhlcgorICoJaHVnZSArIHRpbnkgaXMgZXF1YWwgdG8gaHVnZSwgYW5kIHdoZXRoZXIgaHVnZSAtIHRpbnkgaXMKKyAqCWVxdWFsIHRvIGh1Z2UgZm9yIHNvbWUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyICJodWdlIiBhbmQgInRpbnkiLgorICoJCQorICogU3BlY2lhbCBjYXNlczoKKyAqCXNxcnQoKy0wKSA9ICstMCAJLi4uIGV4YWN0CisgKglzcXJ0KGluZikgPSBpbmYKKyAqCXNxcnQoLXZlKSA9IE5hTgkJLi4uIHdpdGggaW52YWxpZCBzaWduYWwKKyAqCXNxcnQoTmFOKSA9IE5hTgkJLi4uIHdpdGggaW52YWxpZCBzaWduYWwgZm9yIHNpZ25hbGluZyBOYU4KKyAqCisgKiBPdGhlciBtZXRob2RzIDogc2VlIHRoZSBhcHBlbmRlZCBmaWxlIGF0IHRoZSBlbmQgb2YgdGhlIHByb2dyYW0gYmVsb3cuCisgKi0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYwljb25zdCBkb3VibGUJb25lCT0gMS4wLCB0aW55PTEuMGUtMzAwOworCitkb3VibGUKK19faWVlZTc1NF9zcXJ0KGRvdWJsZSB4KQoreworCWRvdWJsZSB6OworCWludDMyX3Qgc2lnbiA9IChpbnQpMHg4MDAwMDAwMDsKKwlpbnQzMl90IGl4MCxzMCxxLG0sdCxpOworCXVfaW50MzJfdCByLHQxLHMxLGl4MSxxMTsKKworCUVYVFJBQ1RfV09SRFMoaXgwLGl4MSx4KTsKKworICAgIC8qIHRha2UgY2FyZSBvZiBJbmYgYW5kIE5hTiAqLworCWlmKChpeDAmMHg3ZmYwMDAwMCk9PTB4N2ZmMDAwMDApIHsJCQkKKwkgICAgcmV0dXJuIHgqeCt4OwkJLyogc3FydChOYU4pPU5hTiwgc3FydCgraW5mKT0raW5mCisJCQkJCSAgIHNxcnQoLWluZik9c05hTiAqLworCX0gCisgICAgLyogdGFrZSBjYXJlIG9mIHplcm8gKi8KKwlpZihpeDA8PTApIHsKKwkgICAgaWYoKChpeDAmKH5zaWduKSl8aXgxKT09MCkgcmV0dXJuIHg7Lyogc3FydCgrLTApID0gKy0wICovCisJICAgIGVsc2UgaWYoaXgwPDApCisJCXJldHVybiAoeC14KS8oeC14KTsJCS8qIHNxcnQoLXZlKSA9IHNOYU4gKi8KKwl9CisgICAgLyogbm9ybWFsaXplIHggKi8KKwltID0gKGl4MD4+MjApOworCWlmKG09PTApIHsJCQkJLyogc3Vibm9ybWFsIHggKi8KKwkgICAgd2hpbGUoaXgwPT0wKSB7CisJCW0gLT0gMjE7CisJCWl4MCB8PSAoaXgxPj4xMSk7IGl4MSA8PD0gMjE7CisJICAgIH0KKwkgICAgZm9yKGk9MDsoaXgwJjB4MDAxMDAwMDApPT0wO2krKykgaXgwPDw9MTsKKwkgICAgbSAtPSBpLTE7CisJICAgIGl4MCB8PSAoaXgxPj4oMzItaSkpOworCSAgICBpeDEgPDw9IGk7CisJfQorCW0gLT0gMTAyMzsJLyogdW5iaWFzIGV4cG9uZW50ICovCisJaXgwID0gKGl4MCYweDAwMGZmZmZmKXwweDAwMTAwMDAwOworCWlmKG0mMSl7CS8qIG9kZCBtLCBkb3VibGUgeCB0byBtYWtlIGl0IGV2ZW4gKi8KKwkgICAgaXgwICs9IGl4MCArICgoaXgxJnNpZ24pPj4zMSk7CisJICAgIGl4MSArPSBpeDE7CisJfQorCW0gPj49IDE7CS8qIG0gPSBbbS8yXSAqLworCisgICAgLyogZ2VuZXJhdGUgc3FydCh4KSBiaXQgYnkgYml0ICovCisJaXgwICs9IGl4MCArICgoaXgxJnNpZ24pPj4zMSk7CisJaXgxICs9IGl4MTsKKwlxID0gcTEgPSBzMCA9IHMxID0gMDsJLyogW3EscTFdID0gc3FydCh4KSAqLworCXIgPSAweDAwMjAwMDAwOwkJLyogciA9IG1vdmluZyBiaXQgZnJvbSByaWdodCB0byBsZWZ0ICovCisKKwl3aGlsZShyIT0wKSB7CisJICAgIHQgPSBzMCtyOyAKKwkgICAgaWYodDw9aXgwKSB7IAorCQlzMCAgID0gdCtyOyAKKwkJaXgwIC09IHQ7IAorCQlxICAgKz0gcjsgCisJICAgIH0gCisJICAgIGl4MCArPSBpeDAgKyAoKGl4MSZzaWduKT4+MzEpOworCSAgICBpeDEgKz0gaXgxOworCSAgICByPj49MTsKKwl9CisKKwlyID0gc2lnbjsKKwl3aGlsZShyIT0wKSB7CisJICAgIHQxID0gczErcjsgCisJICAgIHQgID0gczA7CisJICAgIGlmKCh0PGl4MCl8fCgodD09aXgwKSYmKHQxPD1peDEpKSkgeyAKKwkJczEgID0gdDErcjsKKwkJaWYoKCh0MSZzaWduKT09c2lnbikmJihzMSZzaWduKT09MCkgczAgKz0gMTsKKwkJaXgwIC09IHQ7CisJCWlmIChpeDEgPCB0MSkgaXgwIC09IDE7CisJCWl4MSAtPSB0MTsKKwkJcTEgICs9IHI7CisJICAgIH0KKwkgICAgaXgwICs9IGl4MCArICgoaXgxJnNpZ24pPj4zMSk7CisJICAgIGl4MSArPSBpeDE7CisJICAgIHI+Pj0xOworCX0KKworICAgIC8qIHVzZSBmbG9hdGluZyBhZGQgdG8gZmluZCBvdXQgcm91bmRpbmcgZGlyZWN0aW9uICovCisJaWYoKGl4MHxpeDEpIT0wKSB7CisJICAgIHogPSBvbmUtdGlueTsgLyogdHJpZ2dlciBpbmV4YWN0IGZsYWcgKi8KKwkgICAgaWYgKHo+PW9uZSkgeworCSAgICAgICAgeiA9IG9uZSt0aW55OworCSAgICAgICAgaWYgKHExPT0odV9pbnQzMl90KTB4ZmZmZmZmZmYpIHsgcTE9MDsgcSArPSAxO30KKwkJZWxzZSBpZiAoej5vbmUpIHsKKwkJICAgIGlmIChxMT09KHVfaW50MzJfdCkweGZmZmZmZmZlKSBxKz0xOworCQkgICAgcTErPTI7IAorCQl9IGVsc2UKKwkgICAgICAgICAgICBxMSArPSAocTEmMSk7CisJICAgIH0KKwl9CisJaXgwID0gKHE+PjEpKzB4M2ZlMDAwMDA7CisJaXgxID0gIHExPj4xOworCWlmICgocSYxKT09MSkgaXgxIHw9IHNpZ247CisJaXgwICs9IChtIDw8MjApOworCUlOU0VSVF9XT1JEUyh6LGl4MCxpeDEpOworCXJldHVybiB6OworfQorCisvKgorT3RoZXIgbWV0aG9kcyAgKHVzZSBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljKQorLS0tLS0tLS0tLS0tLQorKFRoaXMgaXMgYSBjb3B5IG9mIGEgZHJhZnRlZCBwYXBlciBieSBQcm9mIFcuIEthaGFuIAorYW5kIEsuQy4gTmcsIHdyaXR0ZW4gaW4gTWF5LCAxOTg2KQorCisJVHdvIGFsZ29yaXRobXMgYXJlIGdpdmVuIGhlcmUgdG8gaW1wbGVtZW50IHNxcnQoeCkgCisJKElFRUUgZG91YmxlIHByZWNpc2lvbiBhcml0aG1ldGljKSBpbiBzb2Z0d2FyZS4KKwlCb3RoIHN1cHBseSBzcXJ0KHgpIGNvcnJlY3RseSByb3VuZGVkLiBUaGUgZmlyc3QgYWxnb3JpdGhtIChpbgorCVNlY3Rpb24gQSkgdXNlcyBuZXd0b24gaXRlcmF0aW9ucyBhbmQgaW52b2x2ZXMgZm91ciBkaXZpc2lvbnMuCisJVGhlIHNlY29uZCBvbmUgdXNlcyByZWNpcHJvb3QgaXRlcmF0aW9ucyB0byBhdm9pZCBkaXZpc2lvbiwgYnV0CisJcmVxdWlyZXMgbW9yZSBtdWx0aXBsaWNhdGlvbnMuIEJvdGggYWxnb3JpdGhtcyBuZWVkIHRoZSBhYmlsaXR5CisJdG8gY2hvcCByZXN1bHRzIG9mIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBpbnN0ZWFkIG9mIHJvdW5kIHRoZW0sIAorCWFuZCB0aGUgSU5FWEFDVCBmbGFnIHRvIGluZGljYXRlIHdoZW4gYW4gYXJpdGhtZXRpYyBvcGVyYXRpb24KKwlpcyBleGVjdXRlZCBleGFjdGx5IHdpdGggbm8gcm91bmRvZmYgZXJyb3IsIGFsbCBwYXJ0IG9mIHRoZSAKKwlzdGFuZGFyZCAoSUVFRSA3NTQtMTk4NSkuIFRoZSBhYmlsaXR5IHRvIHBlcmZvcm0gc2hpZnQsIGFkZCwKKwlzdWJ0cmFjdCBhbmQgbG9naWNhbCBBTkQgb3BlcmF0aW9ucyB1cG9uIDMyLWJpdCB3b3JkcyBpcyBuZWVkZWQKKwl0b28sIHRob3VnaCBub3QgcGFydCBvZiB0aGUgc3RhbmRhcmQuCisKK0EuICBzcXJ0KHgpIGJ5IE5ld3RvbiBJdGVyYXRpb24KKworICAgKDEpCUluaXRpYWwgYXBwcm94aW1hdGlvbgorCisJTGV0IHgwIGFuZCB4MSBiZSB0aGUgbGVhZGluZyBhbmQgdGhlIHRyYWlsaW5nIDMyLWJpdCB3b3JkcyBvZgorCWEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHggKGluIElFRUUgZG91YmxlIGZvcm1hdCkgcmVzcGVjdGl2ZWx5IAorCisJICAgIDEgICAgMTEJCSAgICAgNTIJCQkJICAuLi53aWR0aHMKKwkgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwl4OiB8c3wJICBlICAgICB8CSAgICAgIGYJCQkJfAorCSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgICAgIG1zYiAgICBsc2IgIG1zYgkJCQkgICAgICBsc2IgLi4ub3JkZXIKKworIAorCSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAJICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwl4MDogIHxzfCAgIGUgICAgfCAgICBmMSAgICAgfAkgeDE6IHwgICAgICAgICAgZjIgICAgICAgICAgIHwKKwkgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlCeSBwZXJmb3JtaW5nIHNoaWZ0cyBhbmQgc3VidHJhY3RzIG9uIHgwIGFuZCB4MSAoYm90aCByZWdhcmRlZAorCWFzIGludGVnZXJzKSwgd2Ugb2J0YWluIGFuIDgtYml0IGFwcHJveGltYXRpb24gb2Ygc3FydCh4KSBhcworCWZvbGxvd3MuCisKKwkJayAgOj0gKHgwPj4xKSArIDB4MWZmODAwMDA7CisJCXkwIDo9IGsgLSBUMVszMSYoaz4+MTUpXS4JLi4uIHkgfiBzcXJ0KHgpIHRvIDggYml0cworCUhlcmUgayBpcyBhIDMyLWJpdCBpbnRlZ2VyIGFuZCBUMVtdIGlzIGFuIGludGVnZXIgYXJyYXkgY29udGFpbmluZworCWNvcnJlY3Rpb24gdGVybXMuIE5vdyBtYWdpY2FsbHkgdGhlIGZsb2F0aW5nIHZhbHVlIG9mIHkgKHkncworCWxlYWRpbmcgMzItYml0IHdvcmQgaXMgeTAsIHRoZSB2YWx1ZSBvZiBpdHMgdHJhaWxpbmcgd29yZCBpcyAwKQorCWFwcHJveGltYXRlcyBzcXJ0KHgpIHRvIGFsbW9zdCA4LWJpdC4KKworCVZhbHVlIG9mIFQxOgorCXN0YXRpYyBpbnQgVDFbMzJdPSB7CisJMCwJMTAyNCwJMzA2MiwJNTc0NiwJOTE5MywJMTMzNDgsCTE4MTYyLAkyMzU5MiwKKwkyOTU5OCwJMzYxNDUsCTQzMjAyLAk1MDc0MCwJNTg3MzMsCTY3MTU4LAk3NTk5MiwJODUyMTUsCisJODM1OTksCTcxMzc4LAk2MDQyOCwJNTA2NDcsCTQxOTQ1LAkzNDI0NiwJMjc0NzgsCTIxNTgxLAorCTE2NDk5LAkxMjE4MywJODU4OCwJNTY3NCwJMzQwMywJMTc0MiwJNjYxLAkxMzAsfTsKKworICAgICgyKQlJdGVyYXRpdmUgcmVmaW5lbWVudAorCisJQXBwbHkgSGVyb24ncyBydWxlIHRocmVlIHRpbWVzIHRvIHksIHdlIGhhdmUgeSBhcHByb3hpbWF0ZXMgCisJc3FydCh4KSB0byB3aXRoaW4gMSB1bHAgKFVuaXQgaW4gdGhlIExhc3QgUGxhY2UpOgorCisJCXkgOj0gKHkreC95KS8yCQkuLi4gYWxtb3N0IDE3IHNpZy4gYml0cworCQl5IDo9ICh5K3gveSkvMgkJLi4uIGFsbW9zdCAzNSBzaWcuIGJpdHMKKwkJeSA6PSB5LSh5LXgveSkvMgkuLi4gd2l0aGluIDEgdWxwCisKKworCVJlbWFyayAxLgorCSAgICBBbm90aGVyIHdheSB0byBpbXByb3ZlIHkgdG8gd2l0aGluIDEgdWxwIGlzOgorCisJCXkgOj0gKHkreC95KQkJLi4uIGFsbW9zdCAxNyBzaWcuIGJpdHMgdG8gMipzcXJ0KHgpCisJCXkgOj0geSAtIDB4MDAxMDAwMDYJLi4uIGFsbW9zdCAxOCBzaWcuIGJpdHMgdG8gc3FydCh4KQorCisJCQkJMgorCQkJICAgICh4LXkgKSp5CisJCXkgOj0geSArIDIqIC0tLS0tLS0tLS0JLi4ud2l0aGluIDEgdWxwCisJCQkgICAgICAgMgorCQkJICAgICAzeSAgKyB4CisKKworCVRoaXMgZm9ybXVsYSBoYXMgb25lIGRpdmlzaW9uIGZld2VyIHRoYW4gdGhlIG9uZSBhYm92ZTsgaG93ZXZlciwKKwlpdCByZXF1aXJlcyBtb3JlIG11bHRpcGxpY2F0aW9ucyBhbmQgYWRkaXRpb25zLiBBbHNvIHggbXVzdCBiZQorCXNjYWxlZCBpbiBhZHZhbmNlIHRvIGF2b2lkIHNwdXJpb3VzIG92ZXJmbG93IGluIGV2YWx1YXRpbmcgdGhlCisJZXhwcmVzc2lvbiAzeSp5K3guIEhlbmNlIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB1bGVzcyBkaXZpc2lvbgorCWlzIHNsb3cuIElmIGRpdmlzaW9uIGlzIHZlcnkgc2xvdywgdGhlbiBvbmUgc2hvdWxkIHVzZSB0aGUgCisJcmVjaXByb290IGFsZ29yaXRobSBnaXZlbiBpbiBzZWN0aW9uIEIuCisKKyAgICAoMykgRmluYWwgYWRqdXN0bWVudAorCisJQnkgdHdpZGRsaW5nIHkncyBsYXN0IGJpdCBpdCBpcyBwb3NzaWJsZSB0byBmb3JjZSB5IHRvIGJlIAorCWNvcnJlY3RseSByb3VuZGVkIGFjY29yZGluZyB0byB0aGUgcHJldmFpbGluZyByb3VuZGluZyBtb2RlCisJYXMgZm9sbG93cy4gTGV0IHIgYW5kIGkgYmUgY29waWVzIG9mIHRoZSByb3VuZGluZyBtb2RlIGFuZAorCWluZXhhY3QgZmxhZyBiZWZvcmUgZW50ZXJpbmcgdGhlIHNxdWFyZSByb290IHByb2dyYW0uIEFsc28gd2UKKwl1c2UgdGhlIGV4cHJlc3Npb24geSstdWxwIGZvciB0aGUgbmV4dCByZXByZXNlbnRhYmxlIGZsb2F0aW5nCisJbnVtYmVycyAodXAgYW5kIGRvd24pIG9mIHkuIE5vdGUgdGhhdCB5Ky11bHAgPSBlaXRoZXIgZml4ZWQKKwlwb2ludCB5Ky0xLCBvciBtdWx0aXBseSB5IGJ5IG5leHRhZnRlcigxLCstaW5mKSBpbiBjaG9wcGVkCisJbW9kZS4KKworCQlJIDo9IEZBTFNFOwkuLi4gcmVzZXQgSU5FWEFDVCBmbGFnIEkKKwkJUiA6PSBSWjsJLi4uIHNldCByb3VuZGluZyBtb2RlIHRvIHJvdW5kLXRvd2FyZC16ZXJvCisJCXogOj0geC95OwkuLi4gY2hvcHBlZCBxdW90aWVudCwgcG9zc2libHkgaW5leGFjdAorCQlJZihub3QgSSkgdGhlbiB7CS4uLiBpZiB0aGUgcXVvdGllbnQgaXMgZXhhY3QKKwkJICAgIGlmKHo9eSkgeworCQkgICAgICAgIEkgOj0gaTsJIC4uLiByZXN0b3JlIGluZXhhY3QgZmxhZworCQkgICAgICAgIFIgOj0gcjsgIC4uLiByZXN0b3JlIHJvdW5kZWQgbW9kZQorCQkgICAgICAgIHJldHVybiBzcXJ0KHgpOj15LgorCQkgICAgfSBlbHNlIHsKKwkJCXogOj0geiAtIHVscDsJLi4uIHNwZWNpYWwgcm91bmRpbmcKKwkJICAgIH0KKwkJfQorCQlpIDo9IFRSVUU7CQkuLi4gc3FydCh4KSBpcyBpbmV4YWN0CisJCUlmIChyPVJOKSB0aGVuIHo9eit1bHAJLi4uIHJvdW5kZWQtdG8tbmVhcmVzdAorCQlJZiAocj1SUCkgdGhlbiB7CS4uLiByb3VuZC10b3dhcmQtK2luZgorCQkgICAgeSA9IHkrdWxwOyB6PXordWxwOworCQl9CisJCXkgOj0geSt6OwkJLi4uIGNob3BwZWQgc3VtCisJCXkwOj15MC0weDAwMTAwMDAwOwkuLi4geSA6PSB5LzIgaXMgY29ycmVjdGx5IHJvdW5kZWQuCisJICAgICAgICBJIDo9IGk7CSAJCS4uLiByZXN0b3JlIGluZXhhY3QgZmxhZworCSAgICAgICAgUiA6PSByOyAgCQkuLi4gcmVzdG9yZSByb3VuZGVkIG1vZGUKKwkgICAgICAgIHJldHVybiBzcXJ0KHgpOj15LgorCQkgICAgCisgICAgKDQpCVNwZWNpYWwgY2FzZXMKKworCVNxdWFyZSByb290IG9mICtpbmYsICstMCwgb3IgTmFOIGlzIGl0c2VsZjsKKwlTcXVhcmUgcm9vdCBvZiBhIG5lZ2F0aXZlIG51bWJlciBpcyBOYU4gd2l0aCBpbnZhbGlkIHNpZ25hbC4KKworCitCLiAgc3FydCh4KSBieSBSZWNpcHJvb3QgSXRlcmF0aW9uCisKKyAgICgxKQlJbml0aWFsIGFwcHJveGltYXRpb24KKworCUxldCB4MCBhbmQgeDEgYmUgdGhlIGxlYWRpbmcgYW5kIHRoZSB0cmFpbGluZyAzMi1iaXQgd29yZHMgb2YKKwlhIGZsb2F0aW5nIHBvaW50IG51bWJlciB4IChpbiBJRUVFIGRvdWJsZSBmb3JtYXQpIHJlc3BlY3RpdmVseQorCShzZWUgc2VjdGlvbiBBKS4gQnkgcGVyZm9ybWluZyBzaGlmcyBhbmQgc3VidHJhY3RzIG9uIHgwIGFuZCB5MCwKKwl3ZSBvYnRhaW4gYSA3LjgtYml0IGFwcHJveGltYXRpb24gb2YgMS9zcXJ0KHgpIGFzIGZvbGxvd3MuCisKKwkgICAgayA6PSAweDVmZTgwMDAwIC0gKHgwPj4xKTsKKwkgICAgeTA6PSBrIC0gVDJbNjMmKGs+PjE0KV0uCS4uLiB5IH4gMS9zcXJ0KHgpIHRvIDcuOCBiaXRzCisKKwlIZXJlIGsgaXMgYSAzMi1iaXQgaW50ZWdlciBhbmQgVDJbXSBpcyBhbiBpbnRlZ2VyIGFycmF5IAorCWNvbnRhaW5pbmcgY29ycmVjdGlvbiB0ZXJtcy4gTm93IG1hZ2ljYWxseSB0aGUgZmxvYXRpbmcKKwl2YWx1ZSBvZiB5ICh5J3MgbGVhZGluZyAzMi1iaXQgd29yZCBpcyB5MCwgdGhlIHZhbHVlIG9mCisJaXRzIHRyYWlsaW5nIHdvcmQgeTEgaXMgc2V0IHRvIHplcm8pIGFwcHJveGltYXRlcyAxL3NxcnQoeCkKKwl0byBhbG1vc3QgNy44LWJpdC4KKworCVZhbHVlIG9mIFQyOgorCXN0YXRpYyBpbnQgVDJbNjRdPSB7CisJMHgxNTAwLAkweDJlZjgsCTB4NGQ2NywJMHg2YjAyLAkweDg3YmUsCTB4YTM5NSwJMHhiZTdhLAkweGQ4NjYsCisJMHhmMTRhLAkweDEwOTFiLDB4MTFmY2QsMHgxMzU1MiwweDE0OTk5LDB4MTVjOTgsMHgxNmUzNCwweDE3ZTVmLAorCTB4MThkMDMsMHgxOWEwMSwweDFhNTQ1LDB4MWFlOGEsMHgxYjVjNCwweDFiYjAxLDB4MWJmZGUsMHgxYzI4ZCwKKwkweDFjMmRlLDB4MWMwZGIsMHgxYmE3MywweDFiMTFjLDB4MWE0YjUsMHgxOTUzZCwweDE4MjY2LDB4MTZiZTAsCisJMHgxNjgzZSwweDE3OWQ4LDB4MThhNGQsMHgxOTk5MiwweDFhNzg5LDB4MWI0NDUsMHgxYmY2MSwweDFjOTg5LAorCTB4MWQxNmQsMHgxZDc3YiwweDFkZGRmLDB4MWUyYWQsMHgxZTViZiwweDFlNmU4LDB4MWU2NTQsMHgxZTNjZCwKKwkweDFkZjJhLDB4MWQ2MzUsMHgxY2IxNiwweDFiZTJjLDB4MWFlNGUsMHgxOWJkZSwweDE4NjhlLDB4MTZlMmUsCisJMHgxNTI3ZiwweDEzMzRhLDB4MTEwNTEsMHhlOTUxLAkweGJlMDEsCTB4OGUwZCwJMHg1OTI0LAkweDFlZGQsfTsKKworICAgICgyKQlJdGVyYXRpdmUgcmVmaW5lbWVudAorCisJQXBwbHkgUmVjaXByb290IGl0ZXJhdGlvbiB0aHJlZSB0aW1lcyB0byB5IGFuZCBtdWx0aXBseSB0aGUKKwlyZXN1bHQgYnkgeCB0byBnZXQgYW4gYXBwcm94aW1hdGlvbiB6IHRoYXQgbWF0Y2hlcyBzcXJ0KHgpCisJdG8gYWJvdXQgMSB1bHAuIFRvIGJlIGV4YWN0LCB3ZSB3aWxsIGhhdmUgCisJCS0xdWxwIDwgc3FydCh4KS16PDEuMDYyNXVscC4KKwkKKwkuLi4gc2V0IHJvdW5kaW5nIG1vZGUgdG8gUm91bmQtdG8tbmVhcmVzdAorCSAgIHkgOj0geSooMS41LTAuNSp4KnkqeSkJLi4uIGFsbW9zdCAxNSBzaWcuIGJpdHMgdG8gMS9zcXJ0KHgpCisJICAgeSA6PSB5KigoMS41LTJeLTMwKSswLjUqeCp5KnkpLi4uIGFib3V0IDI5IHNpZy4gYml0cyB0byAxL3NxcnQoeCkKKwkuLi4gc3BlY2lhbCBhcnJhbmdlbWVudCBmb3IgYmV0dGVyIGFjY3VyYWN5CisJICAgeiA6PSB4KnkJCQkuLi4gMjkgYml0cyB0byBzcXJ0KHgpLCB3aXRoIHoqeTwxCisJICAgeiA6PSB6ICsgMC41KnoqKDEteip5KQkuLi4gYWJvdXQgMSB1bHAgdG8gc3FydCh4KQorCisJUmVtYXJrIDIuIFRoZSBjb25zdGFudCAxLjUtMl4tMzAgaXMgY2hvc2VuIHRvIGJpYXMgdGhlIGVycm9yIHNvIHRoYXQKKwkoYSkgdGhlIHRlcm0geip5IGluIHRoZSBmaW5hbCBpdGVyYXRpb24gaXMgYWx3YXlzIGxlc3MgdGhhbiAxOyAKKwkoYikgdGhlIGVycm9yIGluIHRoZSBmaW5hbCByZXN1bHQgaXMgYmlhc2VkIHVwd2FyZCBzbyB0aGF0CisJCS0xIHVscCA8IHNxcnQoeCkgLSB6IDwgMS4wNjI1IHVscAorCSAgICBpbnN0ZWFkIG9mIHxzcXJ0KHgpLXp8PDEuMDMxMjV1bHAuCisKKyAgICAoMykJRmluYWwgYWRqdXN0bWVudAorCisJQnkgdHdpZGRsaW5nIHkncyBsYXN0IGJpdCBpdCBpcyBwb3NzaWJsZSB0byBmb3JjZSB5IHRvIGJlIAorCWNvcnJlY3RseSByb3VuZGVkIGFjY29yZGluZyB0byB0aGUgcHJldmFpbGluZyByb3VuZGluZyBtb2RlCisJYXMgZm9sbG93cy4gTGV0IHIgYW5kIGkgYmUgY29waWVzIG9mIHRoZSByb3VuZGluZyBtb2RlIGFuZAorCWluZXhhY3QgZmxhZyBiZWZvcmUgZW50ZXJpbmcgdGhlIHNxdWFyZSByb290IHByb2dyYW0uIEFsc28gd2UKKwl1c2UgdGhlIGV4cHJlc3Npb24geSstdWxwIGZvciB0aGUgbmV4dCByZXByZXNlbnRhYmxlIGZsb2F0aW5nCisJbnVtYmVycyAodXAgYW5kIGRvd24pIG9mIHkuIE5vdGUgdGhhdCB5Ky11bHAgPSBlaXRoZXIgZml4ZWQKKwlwb2ludCB5Ky0xLCBvciBtdWx0aXBseSB5IGJ5IG5leHRhZnRlcigxLCstaW5mKSBpbiBjaG9wcGVkCisJbW9kZS4KKworCVIgOj0gUlo7CQkuLi4gc2V0IHJvdW5kaW5nIG1vZGUgdG8gcm91bmQtdG93YXJkLXplcm8KKwlzd2l0Y2gocikgeworCSAgICBjYXNlIFJOOgkJLi4uIHJvdW5kLXRvLW5lYXJlc3QKKwkgICAgICAgaWYoeDw9IHoqKHotdWxwKS4uLmNob3BwZWQpIHogPSB6IC0gdWxwOyBlbHNlCisJICAgICAgIGlmKHg8PSB6Kih6K3VscCkuLi5jaG9wcGVkKSB6ID0gejsgZWxzZSB6ID0geit1bHA7CisJICAgICAgIGJyZWFrOworCSAgICBjYXNlIFJaOmNhc2UgUk06CS4uLiByb3VuZC10by16ZXJvIG9yIHJvdW5kLXRvLS1pbmYKKwkgICAgICAgUjo9UlA7CQkuLi4gcmVzZXQgcm91bmRpbmcgbW9kIHRvIHJvdW5kLXRvLStpbmYKKwkgICAgICAgaWYoeDx6KnogLi4uIHJvdW5kZWQgdXApIHogPSB6IC0gdWxwOyBlbHNlCisJICAgICAgIGlmKHg+PSh6K3VscCkqKHordWxwKSAuLi5yb3VuZGVkIHVwKSB6ID0geit1bHA7CisJICAgICAgIGJyZWFrOworCSAgICBjYXNlIFJQOgkJLi4uIHJvdW5kLXRvLStpbmYKKwkgICAgICAgaWYoeD4oeit1bHApKih6K3VscCkuLi5jaG9wcGVkKSB6ID0geisyKnVscDsgZWxzZQorCSAgICAgICBpZih4PnoqeiAuLi5jaG9wcGVkKSB6ID0geit1bHA7CisJICAgICAgIGJyZWFrOworCX0KKworCVJlbWFyayAzLiBUaGUgYWJvdmUgY29tcGFyaXNvbnMgY2FuIGJlIGRvbmUgaW4gZml4ZWQgcG9pbnQuIEZvcgorCWV4YW1wbGUsIHRvIGNvbXBhcmUgeCBhbmQgdz16KnogY2hvcHBlZCwgaXQgc3VmZmljZXMgdG8gY29tcGFyZQorCXgxIGFuZCB3MSAodGhlIHRyYWlsaW5nIHBhcnRzIG9mIHggYW5kIHcpLCByZWdhcmRpbmcgdGhlbSBhcworCXR3bydzIGNvbXBsZW1lbnQgaW50ZWdlcnMuCisKKwkuLi5JcyB6IGFuIGV4YWN0IHNxdWFyZSByb290PworCVRvIGRldGVybWluZSB3aGV0aGVyIHogaXMgYW4gZXhhY3Qgc3F1YXJlIHJvb3Qgb2YgeCwgbGV0IHoxIGJlIHRoZQorCXRyYWlsaW5nIHBhcnQgb2YgeiwgYW5kIGFsc28gbGV0IHgwIGFuZCB4MSBiZSB0aGUgbGVhZGluZyBhbmQKKwl0cmFpbGluZyBwYXJ0cyBvZiB4LgorCisJSWYgKCh6MSYweDAzZmZmZmZmKSE9MCkJLi4uIG5vdCBleGFjdCBpZiB0cmFpbGluZyAyNiBiaXRzIG9mIHohPTAKKwkgICAgSSA6PSAxOwkJLi4uIFJhaXNlIEluZXhhY3QgZmxhZzogeiBpcyBub3QgZXhhY3QKKwllbHNlIHsKKwkgICAgaiA6PSAxIC0gWyh4MD4+MjApJjFdCS4uLiBqID0gbG9nYih4KSBtb2QgMgorCSAgICBrIDo9IHoxID4+IDI2OwkJLi4uIGdldCB6J3MgMjUtdGggYW5kIDI2LXRoIAorCQkJCQkgICAgZnJhY3Rpb24gYml0cworCSAgICBJIDo9IGkgb3IgKGsmaikgb3IgKChrJihqK2orMSkpIT0oeDEmMykpOworCX0KKwlSOj0gcgkJLi4uIHJlc3RvcmUgcm91bmRlZCBtb2RlCisJcmV0dXJuIHNxcnQoeCk6PXouCisKKwlJZiBtdWx0aXBsaWNhdGlvbiBpcyBjaGVhcGVyIHRoZW4gdGhlIGZvcmVnb2luZyByZWQgdGFwZSwgdGhlIAorCUluZXhhY3QgZmxhZyBjYW4gYmUgZXZhbHVhdGVkIGJ5CisKKwkgICAgSSA6PSBpOworCSAgICBJIDo9ICh6KnohPXgpIG9yIEkuCisKKwlOb3RlIHRoYXQgeip6IGNhbiBvdmVyd3JpdGUgSTsgdGhpcyB2YWx1ZSBtdXN0IGJlIHNlbnNlZCBpZiBpdCBpcyAKKwlUcnVlLgorCisJUmVtYXJrIDQuIElmIHoqeiA9IHggZXhhY3RseSwgdGhlbiBiaXQgMjUgdG8gYml0IDAgb2YgejEgbXVzdCBiZQorCXplcm8uCisKKwkJICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCXoxOiB8ICAgICAgICBmMiAgICAgICAgfCAKKwkJICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCWJpdCAzMQkJICAgYml0IDAKKworCUZ1cnRoZXIgbW9yZSwgYml0IDI3IGFuZCAyNiBvZiB6MSwgYml0IDAgYW5kIDEgb2YgeDEsIGFuZCB0aGUgb2RkCisJb3IgZXZlbiBvZiBsb2diKHgpIGhhdmUgdGhlIGZvbGxvd2luZyByZWxhdGlvbnM6CisKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJYml0IDI3LDI2IG9mIHoxCQliaXQgMSwwIG9mIHgxCWxvZ2IoeCkKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJMDAJCQkwMAkJb2RkIGFuZCBldmVuCisJMDEJCQkwMQkJZXZlbgorCTEwCQkJMTAJCW9kZAorCTEwCQkJMDAJCWV2ZW4KKwkxMQkJCTAxCQlldmVuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgKDQpCVNwZWNpYWwgY2FzZXMgKHNlZSAoNCkgb2YgU2VjdGlvbiBBKS4JCisgCisgKi8KKyAKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2Vfc3FydGYuYyBiL2xpYm0vc3JjL2Vfc3FydGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGM5ZWYyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9zcXJ0Zi5jCkBAIC0wLDAgKzEsODkgQEAKKy8qIGVfc3FydGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfc3FydC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9zcXJ0Zi5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMJY29uc3QgZmxvYXQJb25lCT0gMS4wLCB0aW55PTEuMGUtMzA7CisKK2Zsb2F0CitfX2llZWU3NTRfc3FydGYoZmxvYXQgeCkKK3sKKwlmbG9hdCB6OworCWludDMyX3Qgc2lnbiA9IChpbnQpMHg4MDAwMDAwMDsKKwlpbnQzMl90IGl4LHMscSxtLHQsaTsKKwl1X2ludDMyX3QgcjsKKworCUdFVF9GTE9BVF9XT1JEKGl4LHgpOworCisgICAgLyogdGFrZSBjYXJlIG9mIEluZiBhbmQgTmFOICovCisJaWYoKGl4JjB4N2Y4MDAwMDApPT0weDdmODAwMDAwKSB7CisJICAgIHJldHVybiB4KngreDsJCS8qIHNxcnQoTmFOKT1OYU4sIHNxcnQoK2luZik9K2luZgorCQkJCQkgICBzcXJ0KC1pbmYpPXNOYU4gKi8KKwl9CisgICAgLyogdGFrZSBjYXJlIG9mIHplcm8gKi8KKwlpZihpeDw9MCkgeworCSAgICBpZigoaXgmKH5zaWduKSk9PTApIHJldHVybiB4Oy8qIHNxcnQoKy0wKSA9ICstMCAqLworCSAgICBlbHNlIGlmKGl4PDApCisJCXJldHVybiAoeC14KS8oeC14KTsJCS8qIHNxcnQoLXZlKSA9IHNOYU4gKi8KKwl9CisgICAgLyogbm9ybWFsaXplIHggKi8KKwltID0gKGl4Pj4yMyk7CisJaWYobT09MCkgewkJCQkvKiBzdWJub3JtYWwgeCAqLworCSAgICBmb3IoaT0wOyhpeCYweDAwODAwMDAwKT09MDtpKyspIGl4PDw9MTsKKwkgICAgbSAtPSBpLTE7CisJfQorCW0gLT0gMTI3OwkvKiB1bmJpYXMgZXhwb25lbnQgKi8KKwlpeCA9IChpeCYweDAwN2ZmZmZmKXwweDAwODAwMDAwOworCWlmKG0mMSkJLyogb2RkIG0sIGRvdWJsZSB4IHRvIG1ha2UgaXQgZXZlbiAqLworCSAgICBpeCArPSBpeDsKKwltID4+PSAxOwkvKiBtID0gW20vMl0gKi8KKworICAgIC8qIGdlbmVyYXRlIHNxcnQoeCkgYml0IGJ5IGJpdCAqLworCWl4ICs9IGl4OworCXEgPSBzID0gMDsJCS8qIHEgPSBzcXJ0KHgpICovCisJciA9IDB4MDEwMDAwMDA7CQkvKiByID0gbW92aW5nIGJpdCBmcm9tIHJpZ2h0IHRvIGxlZnQgKi8KKworCXdoaWxlKHIhPTApIHsKKwkgICAgdCA9IHMrcjsKKwkgICAgaWYodDw9aXgpIHsKKwkJcyAgICA9IHQrcjsKKwkJaXggIC09IHQ7CisJCXEgICArPSByOworCSAgICB9CisJICAgIGl4ICs9IGl4OworCSAgICByPj49MTsKKwl9CisKKyAgICAvKiB1c2UgZmxvYXRpbmcgYWRkIHRvIGZpbmQgb3V0IHJvdW5kaW5nIGRpcmVjdGlvbiAqLworCWlmKGl4IT0wKSB7CisJICAgIHogPSBvbmUtdGlueTsgLyogdHJpZ2dlciBpbmV4YWN0IGZsYWcgKi8KKwkgICAgaWYgKHo+PW9uZSkgeworCSAgICAgICAgeiA9IG9uZSt0aW55OworCQlpZiAoej5vbmUpCisJCSAgICBxICs9IDI7CisJCWVsc2UKKwkJICAgIHEgKz0gKHEmMSk7CisJICAgIH0KKwl9CisJaXggPSAocT4+MSkrMHgzZjAwMDAwMDsKKwlpeCArPSAobSA8PDIzKTsKKwlTRVRfRkxPQVRfV09SRCh6LGl4KTsKKwlyZXR1cm4gejsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2ZwbWF0aC5oIGIvbGlibS9zcmMvZnBtYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc5YmQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2ZwbWF0aC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pa2UgQmFyY3JvZnQgPG1pa2VARnJlZUJTRC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9saWJjL2luY2x1ZGUvZnBtYXRoLmgsdiAxLjMgMjAwNS8wMi8wNiAwMzoyMzozMSBkYXMgRXhwICQKKyAqLworCisjaW5jbHVkZSA8ZW5kaWFuLmg+CisjaW5jbHVkZSAiX2ZwbWF0aC5oIgorCit1bmlvbiBJRUVFZjJiaXRzIHsKKwlmbG9hdAlmOworCXN0cnVjdCB7CisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCQl1bnNpZ25lZCBpbnQJbWFuCToyMzsKKwkJdW5zaWduZWQgaW50CWV4cAk6ODsKKwkJdW5zaWduZWQgaW50CXNpZ24JOjE7CisjZWxzZSAvKiBfQklHX0VORElBTiAqLworCQl1bnNpZ25lZCBpbnQJc2lnbgk6MTsKKwkJdW5zaWduZWQgaW50CWV4cAk6ODsKKwkJdW5zaWduZWQgaW50CW1hbgk6MjM7CisjZW5kaWYKKwl9IGJpdHM7Cit9OworCisjZGVmaW5lCURCTF9NQU5IX1NJWkUJMjAKKyNkZWZpbmUJREJMX01BTkxfU0laRQkzMgorCit1bmlvbiBJRUVFZDJiaXRzIHsKKwlkb3VibGUJZDsKKwlzdHJ1Y3QgeworLyogI2lmZGVmIF9fQVJNRUJfXyAqLworI2lmIChfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOKSB8fCAoZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX1ZGUF9GUF9fKSkKKwkJdW5zaWduZWQgaW50CW1hbmgJOjIwOworCQl1bnNpZ25lZCBpbnQJZXhwCToxMTsKKwkJdW5zaWduZWQgaW50CXNpZ24JOjE7CisJCXVuc2lnbmVkIGludAltYW5sCTozMjsKKyNlbGlmICBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOIAorCQl1bnNpZ25lZCBpbnQJbWFubAk6MzI7CisJCXVuc2lnbmVkIGludAltYW5oCToyMDsKKwkJdW5zaWduZWQgaW50CWV4cAk6MTE7CisJCXVuc2lnbmVkIGludAlzaWduCToxOworI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCQl1bnNpZ25lZCBpbnQJc2lnbgk6MTsKKwkJdW5zaWduZWQgaW50CWV4cAk6MTE7CisJCXVuc2lnbmVkIGludAltYW5oCToyMDsKKwkJdW5zaWduZWQgaW50CW1hbmwJOjMyOworI2VuZGlmCisJfSBiaXRzOworfTsKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2tfY29zLmMgYi9saWJtL3NyYy9rX2Nvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOTE2ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9rX2Nvcy5jCkBAIC0wLDAgKzEsNzkgQEAKKworLyogQCgjKWtfY29zLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2tfY29zLmMsdiAxLjEwIDIwMDUvMTAvMjYgMTI6MzY6MTggYmRlIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogX19rZXJuZWxfY29zKCB4LCAgeSApCisgKiBrZXJuZWwgY29zIGZ1bmN0aW9uIG9uIFstcGkvNCwgcGkvNF0sIHBpLzQgfiAwLjc4NTM5ODE2NAorICogSW5wdXQgeCBpcyBhc3N1bWVkIHRvIGJlIGJvdW5kZWQgYnkgfnBpLzQgaW4gbWFnbml0dWRlLgorICogSW5wdXQgeSBpcyB0aGUgdGFpbCBvZiB4LiAKKyAqCisgKiBBbGdvcml0aG0KKyAqCTEuIFNpbmNlIGNvcygteCkgPSBjb3MoeCksIHdlIG5lZWQgb25seSB0byBjb25zaWRlciBwb3NpdGl2ZSB4LgorICoJMi4gaWYgeCA8IDJeLTI3IChoeDwweDNlNDAwMDAwIDApLCByZXR1cm4gMSB3aXRoIGluZXhhY3QgaWYgeCE9MC4KKyAqCTMuIGNvcyh4KSBpcyBhcHByb3hpbWF0ZWQgYnkgYSBwb2x5bm9taWFsIG9mIGRlZ3JlZSAxNCBvbgorICoJICAgWzAscGkvNF0KKyAqCQkgIAkgICAgICAgICAgICAgICAgIDQgICAgICAgICAgICAxNAorICoJICAgCWNvcyh4KSB+IDEgLSB4KngvMiArIEMxKnggKyAuLi4gKyBDNip4CisgKgkgICB3aGVyZSB0aGUgcmVtZXogZXJyb3IgaXMKKyAqCQorICogCXwgICAgICAgICAgICAgIDIgICAgIDQgICAgIDYgICAgIDggICAgIDEwICAgIDEyICAgICAxNCB8ICAgICAtNTgKKyAqIAl8Y29zKHgpLSgxLS41KnggK0MxKnggK0MyKnggK0MzKnggK0M0KnggK0M1KnggICtDNip4ICApfCA8PSAyCisgKiAJfCAgICAJCQkJCSAgICAgICAgICAgICAgIHwgCisgKiAKKyAqIAkgICAgICAgICAgICAgICA0ICAgICA2ICAgICA4ICAgICAxMCAgICAxMiAgICAgMTQgCisgKgk0LiBsZXQgciA9IEMxKnggK0MyKnggK0MzKnggK0M0KnggK0M1KnggICtDNip4ICAsIHRoZW4KKyAqCSAgICAgICBjb3MoeCkgfiAxIC0geCp4LzIgKyByCisgKgkgICBzaW5jZSBjb3MoeCt5KSB+IGNvcyh4KSAtIHNpbih4KSp5IAorICoJCQkgIH4gY29zKHgpIC0geCp5LAorICoJICAgYSBjb3JyZWN0aW9uIHRlcm0gaXMgbmVjZXNzYXJ5IGluIGNvcyh4KSBhbmQgaGVuY2UKKyAqCQljb3MoeCt5KSA9IDEgLSAoeCp4LzIgLSAociAtIHgqeSkpCisgKgkgICBGb3IgYmV0dGVyIGFjY3VyYWN5LCByZWFycmFuZ2UgdG8KKyAqCQljb3MoeCt5KSB+IHcgKyAodG1wICsgKHIteCp5KSkKKyAqCSAgIHdoZXJlIHcgPSAxIC0geCp4LzIgYW5kIHRtcCBpcyBhIHRpbnkgY29ycmVjdGlvbiB0ZXJtCisgKgkgICAoMSAtIHgqeC8yID09IHcgKyB0bXAgZXhhY3RseSBpbiBpbmZpbml0ZSBwcmVjaXNpb24pLgorICoJICAgVGhlIGV4YWN0bmVzcyBvZiB3ICsgdG1wIGluIGluZmluaXRlIHByZWNpc2lvbiBkZXBlbmRzIG9uIHcKKyAqCSAgIGFuZCB0bXAgaGF2aW5nIHRoZSBzYW1lIHByZWNpc2lvbiBhcyB4LiAgSWYgdGhleSBoYXZlIGV4dHJhCisgKgkgICBwcmVjaXNpb24gZHVlIHRvIGNvbXBpbGVyIGJ1Z3MsIHRoZW4gdGhlIGV4dHJhIHByZWNpc2lvbiBpcworICoJICAgb25seSBnb29kIHByb3ZpZGVkIGl0IGlzIHJldGFpbmVkIGluIGFsbCB0ZXJtcyBvZiB0aGUgZmluYWwKKyAqCSAgIGV4cHJlc3Npb24gZm9yIGNvcygpLiAgUmV0ZW50aW9uIGhhcHBlbnMgaW4gYWxsIGNhc2VzIHRlc3RlZAorICoJICAgdW5kZXIgRnJlZUJTRCwgc28gZG9uJ3QgcGVzc2ltaXplIHRoaW5ncyBieSBmb3JjaWJseSBjbGlwcGluZworICoJICAgYW55IGV4dHJhIHByZWNpc2lvbiBpbiB3LgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK29uZSA9ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMCwgLyogMHgzRkYwMDAwMCwgMHgwMDAwMDAwMCAqLworQzEgID0gIDQuMTY2NjY2NjY2NjY2NjYwMTkwMzdlLTAyLCAvKiAweDNGQTU1NTU1LCAweDU1NTU1NTRDICovCitDMiAgPSAtMS4zODg4ODg4ODg4ODc0MTA5NTc0OWUtMDMsIC8qIDB4QkY1NkMxNkMsIDB4MTZDMTUxNzcgKi8KK0MzICA9ICAyLjQ4MDE1ODcyODk0NzY3Mjk0MTc4ZS0wNSwgLyogMHgzRUZBMDFBMCwgMHgxOUNCMTU5MCAqLworQzQgID0gLTIuNzU1NzMxNDM1MTM5MDY2MzMwMzVlLTA3LCAvKiAweEJFOTI3RTRGLCAweDgwOUM1MkFEICovCitDNSAgPSAgMi4wODc1NzIzMjEyOTgxNzQ4Mjc5MGUtMDksIC8qIDB4M0UyMUVFOUUsIDB4QkRCNEIxQzQgKi8KK0M2ICA9IC0xLjEzNTk2NDc1NTc3ODgxOTQ4MjY1ZS0xMTsgLyogMHhCREE4RkFFOSwgMHhCRTg4MzhENCAqLworCitkb3VibGUKK19fa2VybmVsX2Nvcyhkb3VibGUgeCwgZG91YmxlIHkpCit7CisJZG91YmxlIGh6LHoscix3OworCisJeiAgPSB4Kng7CisJciAgPSB6KihDMSt6KihDMit6KihDMyt6KihDNCt6KihDNSt6KkM2KSkpKSk7CisJaHogPSAoZmxvYXQpMC41Kno7CisJdyAgPSBvbmUtaHo7CisJcmV0dXJuIHcgKyAoKChvbmUtdyktaHopICsgKHoqci14KnkpKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2tfY29zZi5jIGIvbGlibS9zcmMva19jb3NmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYwOGQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2tfY29zZi5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIGtfY29zZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Yga19jb3MuYworICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKiBEZWJ1Z2dlZCBhbmQgb3B0aW1pemVkIGJ5IEJydWNlIEQuIEV2YW5zLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBJTkxJTkVfS0VSTkVMX0NPU0RGCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMva19jb3NmLmMsdiAxLjE1IDIwMDUvMTEvMzAgMTE6NTE6MTcgYmRlIEV4cCAkIjsKKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKy8qIHxjb3MoeCkgLSBjKHgpfCA8IDIqKi0zNC4xICh+Wy01LjM3ZS0xMSwgNS4yOTVlLTExXSkuICovCitzdGF0aWMgY29uc3QgZG91YmxlCitvbmUgPSAgMS4wLAorQzAgID0gLTB4MWZmZmZmZmQwYzVlODEuMHAtNTQsCS8qIC0wLjQ5OTk5OTk5NzI1MTAzMTAwMzEyMCAqLworQzEgID0gIDB4MTU1NTUzZTEwNTNhNDIuMHAtNTcsCS8qICAwLjA0MTY2NjYyMzMyMzczOTA2MzE4OTQgKi8KK0MyICA9IC0weDE2YzA4N2U4MGYxZTI3LjBwLTYyLAkvKiAtMC4wMDEzODg2NzYzNzc0NjA5OTI5NDY5MiAqLworQzMgID0gIDB4MTk5MzQyZTBlZTUwNjkuMHAtNjg7CS8qICAwLjAwMDAyNDM5MDQ0ODc5NjI3NzQwOTA2NTQgKi8KKworI2lmZGVmIElOTElORV9LRVJORUxfQ09TREYKK2V4dGVybiBpbmxpbmUKKyNlbmRpZgorZmxvYXQKK19fa2VybmVsX2Nvc2RmKGRvdWJsZSB4KQoreworCWRvdWJsZSByLCB3LCB6OworCisJLyogVHJ5IHRvIG9wdGltaXplIGZvciBwYXJhbGxlbCBldmFsdWF0aW9uIGFzIGluIGtfdGFuZi5jLiAqLworCXogPSB4Kng7CisJdyA9IHoqejsKKwlyID0gQzIreipDMzsKKwlyZXR1cm4gKChvbmUreipDMCkgKyB3KkMxKSArICh3KnopKnI7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9rX3JlbV9waW8yLmMgYi9saWJtL3NyYy9rX3JlbV9waW8yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExNmYzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2tfcmVtX3BpbzIuYwpAQCAtMCwwICsxLDMwNCBAQAorCisvKiBAKCMpa19yZW1fcGlvMi5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9rX3JlbV9waW8yLmMsdiAxLjcgMjAwNS8wMi8wNCAxODoyNjowNiBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBfX2tlcm5lbF9yZW1fcGlvMih4LHksZTAsbngscHJlYyxpcGlvMikKKyAqIGRvdWJsZSB4W10seVtdOyBpbnQgZTAsbngscHJlYzsgaW50IGlwaW8yW107CisgKiAKKyAqIF9fa2VybmVsX3JlbV9waW8yIHJldHVybiB0aGUgbGFzdCB0aHJlZSBkaWdpdHMgb2YgTiB3aXRoIAorICoJCXkgPSB4IC0gTipwaS8yCisgKiBzbyB0aGF0IHx5fCA8IHBpLzIuCisgKgorICogVGhlIG1ldGhvZCBpcyB0byBjb21wdXRlIHRoZSBpbnRlZ2VyIChtb2QgOCkgYW5kIGZyYWN0aW9uIHBhcnRzIG9mIAorICogKDIvcGkpKnggd2l0aG91dCBkb2luZyB0aGUgZnVsbCBtdWx0aXBsaWNhdGlvbi4gSW4gZ2VuZXJhbCB3ZQorICogc2tpcCB0aGUgcGFydCBvZiB0aGUgcHJvZHVjdCB0aGF0IGFyZSBrbm93biB0byBiZSBhIGh1Z2UgaW50ZWdlciAoCisgKiBtb3JlIGFjY3VyYXRlbHksID0gMCBtb2QgOCApLiBUaHVzIHRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBhcmUKKyAqIGluZGVwZW5kZW50IG9mIHRoZSBleHBvbmVudCBvZiB0aGUgaW5wdXQuCisgKgorICogKDIvcGkpIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGFycmF5IG9mIDI0LWJpdCBpbnRlZ2VycyBpbiBpcGlvMltdLgorICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAJeFtdCVRoZSBpbnB1dCB2YWx1ZSAobXVzdCBiZSBwb3NpdGl2ZSkgaXMgYnJva2VuIGludG8gbnggCisgKgkJcGllY2VzIG9mIDI0LWJpdCBpbnRlZ2VycyBpbiBkb3VibGUgcHJlY2lzaW9uIGZvcm1hdC4KKyAqCQl4W2ldIHdpbGwgYmUgdGhlIGktdGggMjQgYml0IG9mIHguIFRoZSBzY2FsZWQgZXhwb25lbnQgCisgKgkJb2YgeFswXSBpcyBnaXZlbiBpbiBpbnB1dCBwYXJhbWV0ZXIgZTAgKGkuZS4sIHhbMF0qMl5lMCAKKyAqCQltYXRjaCB4J3MgdXAgdG8gMjQgYml0cy4KKyAqCisgKgkJRXhhbXBsZSBvZiBicmVha2luZyBhIGRvdWJsZSBwb3NpdGl2ZSB6IGludG8geFswXSt4WzFdK3hbMl06CisgKgkJCWUwID0gaWxvZ2IoeiktMjMKKyAqCQkJeiAgPSBzY2FsYm4oeiwtZTApCisgKgkJZm9yIGkgPSAwLDEsMgorICoJCQl4W2ldID0gZmxvb3IoeikKKyAqCQkJeiAgICA9ICh6LXhbaV0pKjIqKjI0CisgKgorICoKKyAqCXlbXQlvdXB1dCByZXN1bHQgaW4gYW4gYXJyYXkgb2YgZG91YmxlIHByZWNpc2lvbiBudW1iZXJzLgorICoJCVRoZSBkaW1lbnNpb24gb2YgeVtdIGlzOgorICoJCQkyNC1iaXQgIHByZWNpc2lvbgkxCisgKgkJCTUzLWJpdCAgcHJlY2lzaW9uCTIKKyAqCQkJNjQtYml0ICBwcmVjaXNpb24JMgorICoJCQkxMTMtYml0IHByZWNpc2lvbgkzCisgKgkJVGhlIGFjdHVhbCB2YWx1ZSBpcyB0aGUgc3VtIG9mIHRoZW0uIFRodXMgZm9yIDExMy1iaXQKKyAqCQlwcmVjaXNvbiwgb25lIG1heSBoYXZlIHRvIGRvIHNvbWV0aGluZyBsaWtlOgorICoKKyAqCQlsb25nIGRvdWJsZSB0LHcscl9oZWFkLCByX3RhaWw7CisgKgkJdCA9IChsb25nIGRvdWJsZSl5WzJdICsgKGxvbmcgZG91YmxlKXlbMV07CisgKgkJdyA9IChsb25nIGRvdWJsZSl5WzBdOworICoJCXJfaGVhZCA9IHQrdzsKKyAqCQlyX3RhaWwgPSB3IC0gKHJfaGVhZCAtIHQpOworICoKKyAqCWUwCVRoZSBleHBvbmVudCBvZiB4WzBdCisgKgorICoJbngJZGltZW5zaW9uIG9mIHhbXQorICoKKyAqICAJcHJlYwlhbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIHByZWNpc2lvbjoKKyAqCQkJMAkyNCAgYml0cyAoc2luZ2xlKQorICoJCQkxCTUzICBiaXRzIChkb3VibGUpCisgKgkJCTIJNjQgIGJpdHMgKGV4dGVuZGVkKQorICoJCQkzCTExMyBiaXRzIChxdWFkKQorICoKKyAqCWlwaW8yW10KKyAqCQlpbnRlZ2VyIGFycmF5LCBjb250YWlucyB0aGUgKDI0KmkpLXRoIHRvICgyNCppKzIzKS10aCAKKyAqCQliaXQgb2YgMi9waSBhZnRlciBiaW5hcnkgcG9pbnQuIFRoZSBjb3JyZXNwb25kaW5nIAorICoJCWZsb2F0aW5nIHZhbHVlIGlzCisgKgorICoJCQlpcGlvMltpXSAqIDJeKC0yNChpKzEpKS4KKyAqCisgKiBFeHRlcm5hbCBmdW5jdGlvbjoKKyAqCWRvdWJsZSBzY2FsYm4oKSwgZmxvb3IoKTsKKyAqCisgKgorICogSGVyZSBpcyB0aGUgZGVzY3JpcHRpb24gb2Ygc29tZSBsb2NhbCB2YXJpYWJsZXM6CisgKgorICogCWprCWprKzEgaXMgdGhlIGluaXRpYWwgbnVtYmVyIG9mIHRlcm1zIG9mIGlwaW8yW10gbmVlZGVkCisgKgkJaW4gdGhlIGNvbXB1dGF0aW9uLiBUaGUgcmVjb21tZW5kZWQgdmFsdWUgaXMgMiwzLDQsCisgKgkJNiBmb3Igc2luZ2xlLCBkb3VibGUsIGV4dGVuZGVkLGFuZCBxdWFkLgorICoKKyAqIAlqeglsb2NhbCBpbnRlZ2VyIHZhcmlhYmxlIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiAKKyAqCQl0ZXJtcyBvZiBpcGlvMltdIHVzZWQuIAorICoKKyAqCWp4CW54IC0gMQorICoKKyAqCWp2CWluZGV4IGZvciBwb2ludGluZyB0byB0aGUgc3VpdGFibGUgaXBpbzJbXSBmb3IgdGhlCisgKgkJY29tcHV0YXRpb24uIEluIGdlbmVyYWwsIHdlIHdhbnQKKyAqCQkJKCAyXmUwKnhbMF0gKiBpcGlvMltqdi0xXSoyXigtMjRqdikgKS84CisgKgkJaXMgYW4gaW50ZWdlci4gVGh1cworICoJCQllMC0zLTI0Kmp2ID49IDAgb3IgKGUwLTMpLzI0ID49IGp2CisgKgkJSGVuY2UganYgPSBtYXgoMCwoZTAtMykvMjQpLgorICoKKyAqCWpwCWpwKzEgaXMgdGhlIG51bWJlciBvZiB0ZXJtcyBpbiBQSW8yW10gbmVlZGVkLCBqcCA9IGprLgorICoKKyAqIAlxW10JZG91YmxlIGFycmF5IHdpdGggaW50ZWdyYWwgdmFsdWUsIHJlcHJlc2VudGluZyB0aGUKKyAqCQkyNC1iaXRzIGNodW5rIG9mIHRoZSBwcm9kdWN0IG9mIHggYW5kIDIvcGkuCisgKgorICoJcTAJdGhlIGNvcnJlc3BvbmRpbmcgZXhwb25lbnQgb2YgcVswXS4gTm90ZSB0aGF0IHRoZQorICoJCWV4cG9uZW50IGZvciBxW2ldIHdvdWxkIGJlIHEwLTI0KmkuCisgKgorICoJUElvMltdCWRvdWJsZSBwcmVjaXNpb24gYXJyYXksIG9idGFpbmVkIGJ5IGN1dHRpbmcgcGkvMgorICoJCWludG8gMjQgYml0cyBjaHVua3MuIAorICoKKyAqCWZbXQlpcGlvMltdIGluIGZsb2F0aW5nIHBvaW50IAorICoKKyAqCWlxW10JaW50ZWdlciBhcnJheSBieSBicmVha2luZyB1cCBxW10gaW4gMjQtYml0cyBjaHVuay4KKyAqCisgKglmcVtdCWZpbmFsIHByb2R1Y3Qgb2YgeCooMi9waSkgaW4gZnFbMF0sLi4sZnFbamtdCisgKgorICoJaWgJaW50ZWdlci4gSWYgPjAgaXQgaW5kaWNhdGVzIHFbXSBpcyA+PSAwLjUsIGhlbmNlCisgKgkJaXQgYWxzbyBpbmRpY2F0ZXMgdGhlICpzaWduKiBvZiB0aGUgcmVzdWx0LgorICoKKyAqLworCisKKy8qCisgKiBDb25zdGFudHM6CisgKiBUaGUgaGV4YWRlY2ltYWwgdmFsdWVzIGFyZSB0aGUgaW50ZW5kZWQgb25lcyBmb3IgdGhlIGZvbGxvd2luZyAKKyAqIGNvbnN0YW50cy4gVGhlIGRlY2ltYWwgdmFsdWVzIG1heSBiZSB1c2VkLCBwcm92aWRlZCB0aGF0IHRoZSAKKyAqIGNvbXBpbGVyIHdpbGwgY29udmVydCBmcm9tIGRlY2ltYWwgdG8gYmluYXJ5IGFjY3VyYXRlbHkgZW5vdWdoIAorICogdG8gcHJvZHVjZSB0aGUgaGV4YWRlY2ltYWwgdmFsdWVzIHNob3duLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBpbnQgaW5pdF9qa1tdID0gezIsMyw0LDZ9OyAvKiBpbml0aWFsIHZhbHVlIGZvciBqayAqLworCitzdGF0aWMgY29uc3QgZG91YmxlIFBJbzJbXSA9IHsKKyAgMS41NzA3OTYyNTEyOTY5OTcwNzAzMWUrMDAsIC8qIDB4M0ZGOTIxRkIsIDB4NDAwMDAwMDAgKi8KKyAgNy41NDk3ODk0MTU4NjE1OTYzNTMzNWUtMDgsIC8qIDB4M0U3NDQ0MkQsIDB4MDAwMDAwMDAgKi8KKyAgNS4zOTAzMDI1Mjk5NTc3NjQ3NjU1NGUtMTUsIC8qIDB4M0NGODQ2OTgsIDB4ODAwMDAwMDAgKi8KKyAgMy4yODIwMDM0MTU4MDc5MTI5NDEyM2UtMjIsIC8qIDB4M0I3OENDNTEsIDB4NjAwMDAwMDAgKi8KKyAgMS4yNzA2NTU3NTMwODA2NzYwNzM0OWUtMjksIC8qIDB4MzlGMDFCODMsIDB4ODAwMDAwMDAgKi8KKyAgMS4yMjkzMzMwODk4MTExMTMyODkzMmUtMzYsIC8qIDB4Mzg3QTI1MjAsIDB4NDAwMDAwMDAgKi8KKyAgMi43MzM3MDA1MzgxNjQ2NDU1OTYyNGUtNDQsIC8qIDB4MzZFMzgyMjIsIDB4ODAwMDAwMDAgKi8KKyAgMi4xNjc0MTY4Mzg3NzgwNDgxOTQ0NGUtNTEsIC8qIDB4MzU2OUYzMUQsIDB4MDAwMDAwMDAgKi8KK307CisKK3N0YXRpYyBjb25zdCBkb3VibGUJCQkKK3plcm8gICA9IDAuMCwKK29uZSAgICA9IDEuMCwKK3R3bzI0ICAgPSAgMS42Nzc3MjE2MDAwMDAwMDAwMDAwMGUrMDcsIC8qIDB4NDE3MDAwMDAsIDB4MDAwMDAwMDAgKi8KK3R3b24yNCAgPSAgNS45NjA0NjQ0Nzc1MzkwNjI1MDAwMGUtMDg7IC8qIDB4M0U3MDAwMDAsIDB4MDAwMDAwMDAgKi8KKworCWludCBfX2tlcm5lbF9yZW1fcGlvMihkb3VibGUgKngsIGRvdWJsZSAqeSwgaW50IGUwLCBpbnQgbngsIGludCBwcmVjLCBjb25zdCBpbnQzMl90ICppcGlvMikKK3sKKwlpbnQzMl90IGp6LGp4LGp2LGpwLGprLGNhcnJ5LG4saXFbMjBdLGksaixrLG0scTAsaWg7CisJZG91YmxlIHosZncsZlsyMF0sZnFbMjBdLHFbMjBdOworCisgICAgLyogaW5pdGlhbGl6ZSBqayovCisJamsgPSBpbml0X2prW3ByZWNdOworCWpwID0gams7CisKKyAgICAvKiBkZXRlcm1pbmUgangsanYscTAsIG5vdGUgdGhhdCAzPnEwICovCisJanggPSAgbngtMTsKKwlqdiA9IChlMC0zKS8yNDsgaWYoanY8MCkganY9MDsKKwlxMCA9ICBlMC0yNCooanYrMSk7CisKKyAgICAvKiBzZXQgdXAgZlswXSB0byBmW2p4K2prXSB3aGVyZSBmW2p4K2prXSA9IGlwaW8yW2p2K2prXSAqLworCWogPSBqdi1qeDsgbSA9IGp4K2prOworCWZvcihpPTA7aTw9bTtpKyssaisrKSBmW2ldID0gKGo8MCk/IHplcm8gOiAoZG91YmxlKSBpcGlvMltqXTsKKworICAgIC8qIGNvbXB1dGUgcVswXSxxWzFdLC4uLnFbamtdICovCisJZm9yIChpPTA7aTw9ams7aSsrKSB7CisJICAgIGZvcihqPTAsZnc9MC4wO2o8PWp4O2orKykgZncgKz0geFtqXSpmW2p4K2ktal07IHFbaV0gPSBmdzsKKwl9CisKKwlqeiA9IGprOworcmVjb21wdXRlOgorICAgIC8qIGRpc3RpbGwgcVtdIGludG8gaXFbXSByZXZlcnNpbmdseSAqLworCWZvcihpPTAsaj1qeix6PXFbanpdO2o+MDtpKyssai0tKSB7CisJICAgIGZ3ICAgID0gIChkb3VibGUpKChpbnQzMl90KSh0d29uMjQqIHopKTsKKwkgICAgaXFbaV0gPSAgKGludDMyX3QpKHotdHdvMjQqZncpOworCSAgICB6ICAgICA9ICBxW2otMV0rZnc7CisJfQorCisgICAgLyogY29tcHV0ZSBuICovCisJeiAgPSBzY2FsYm4oeixxMCk7CQkvKiBhY3R1YWwgdmFsdWUgb2YgeiAqLworCXogLT0gOC4wKmZsb29yKHoqMC4xMjUpOwkJLyogdHJpbSBvZmYgaW50ZWdlciA+PSA4ICovCisJbiAgPSAoaW50MzJfdCkgejsKKwl6IC09IChkb3VibGUpbjsKKwlpaCA9IDA7CisJaWYocTA+MCkgewkvKiBuZWVkIGlxW2p6LTFdIHRvIGRldGVybWluZSBuICovCisJICAgIGkgID0gKGlxW2p6LTFdPj4oMjQtcTApKTsgbiArPSBpOworCSAgICBpcVtqei0xXSAtPSBpPDwoMjQtcTApOworCSAgICBpaCA9IGlxW2p6LTFdPj4oMjMtcTApOworCX0gCisJZWxzZSBpZihxMD09MCkgaWggPSBpcVtqei0xXT4+MjM7CisJZWxzZSBpZih6Pj0wLjUpIGloPTI7CisKKwlpZihpaD4wKSB7CS8qIHEgPiAwLjUgKi8KKwkgICAgbiArPSAxOyBjYXJyeSA9IDA7CisJICAgIGZvcihpPTA7aTxqeiA7aSsrKSB7CS8qIGNvbXB1dGUgMS1xICovCisJCWogPSBpcVtpXTsKKwkJaWYoY2Fycnk9PTApIHsKKwkJICAgIGlmKGohPTApIHsKKwkJCWNhcnJ5ID0gMTsgaXFbaV0gPSAweDEwMDAwMDAtIGo7CisJCSAgICB9CisJCX0gZWxzZSAgaXFbaV0gPSAweGZmZmZmZiAtIGo7CisJICAgIH0KKwkgICAgaWYocTA+MCkgewkJLyogcmFyZSBjYXNlOiBjaGFuY2UgaXMgMSBpbiAxMiAqLworCSAgICAgICAgc3dpdGNoKHEwKSB7CisJICAgICAgICBjYXNlIDE6CisJICAgIAkgICBpcVtqei0xXSAmPSAweDdmZmZmZjsgYnJlYWs7CisJICAgIAljYXNlIDI6CisJICAgIAkgICBpcVtqei0xXSAmPSAweDNmZmZmZjsgYnJlYWs7CisJICAgICAgICB9CisJICAgIH0KKwkgICAgaWYoaWg9PTIpIHsKKwkJeiA9IG9uZSAtIHo7CisJCWlmKGNhcnJ5IT0wKSB6IC09IHNjYWxibihvbmUscTApOworCSAgICB9CisJfQorCisgICAgLyogY2hlY2sgaWYgcmVjb21wdXRhdGlvbiBpcyBuZWVkZWQgKi8KKwlpZih6PT16ZXJvKSB7CisJICAgIGogPSAwOworCSAgICBmb3IgKGk9anotMTtpPj1qaztpLS0pIGogfD0gaXFbaV07CisJICAgIGlmKGo9PTApIHsgLyogbmVlZCByZWNvbXB1dGF0aW9uICovCisJCWZvcihrPTE7aXFbamsta109PTA7aysrKTsgICAvKiBrID0gbm8uIG9mIHRlcm1zIG5lZWRlZCAqLworCisJCWZvcihpPWp6KzE7aTw9anoraztpKyspIHsgICAvKiBhZGQgcVtqeisxXSB0byBxW2p6K2tdICovCisJCSAgICBmW2p4K2ldID0gKGRvdWJsZSkgaXBpbzJbanYraV07CisJCSAgICBmb3Ioaj0wLGZ3PTAuMDtqPD1qeDtqKyspIGZ3ICs9IHhbal0qZltqeCtpLWpdOworCQkgICAgcVtpXSA9IGZ3OworCQl9CisJCWp6ICs9IGs7CisJCWdvdG8gcmVjb21wdXRlOworCSAgICB9CisJfQorCisgICAgLyogY2hvcCBvZmYgemVybyB0ZXJtcyAqLworCWlmKHo9PTAuMCkgeworCSAgICBqeiAtPSAxOyBxMCAtPSAyNDsKKwkgICAgd2hpbGUoaXFbanpdPT0wKSB7IGp6LS07IHEwLT0yNDt9CisJfSBlbHNlIHsgLyogYnJlYWsgeiBpbnRvIDI0LWJpdCBpZiBuZWNlc3NhcnkgKi8KKwkgICAgeiA9IHNjYWxibih6LC1xMCk7CisJICAgIGlmKHo+PXR3bzI0KSB7IAorCQlmdyA9IChkb3VibGUpKChpbnQzMl90KSh0d29uMjQqeikpOworCQlpcVtqel0gPSAoaW50MzJfdCkoei10d28yNCpmdyk7CisJCWp6ICs9IDE7IHEwICs9IDI0OworCQlpcVtqel0gPSAoaW50MzJfdCkgZnc7CisJICAgIH0gZWxzZSBpcVtqel0gPSAoaW50MzJfdCkgeiA7CisJfQorCisgICAgLyogY29udmVydCBpbnRlZ2VyICJiaXQiIGNodW5rIHRvIGZsb2F0aW5nLXBvaW50IHZhbHVlICovCisJZncgPSBzY2FsYm4ob25lLHEwKTsKKwlmb3IoaT1qejtpPj0wO2ktLSkgeworCSAgICBxW2ldID0gZncqKGRvdWJsZSlpcVtpXTsgZncqPXR3b24yNDsKKwl9CisKKyAgICAvKiBjb21wdXRlIFBJbzJbMCwuLi4sanBdKnFbanosLi4uLDBdICovCisJZm9yKGk9ano7aT49MDtpLS0pIHsKKwkgICAgZm9yKGZ3PTAuMCxrPTA7azw9anAmJms8PWp6LWk7aysrKSBmdyArPSBQSW8yW2tdKnFbaStrXTsKKwkgICAgZnFbanotaV0gPSBmdzsKKwl9CisKKyAgICAvKiBjb21wcmVzcyBmcVtdIGludG8geVtdICovCisJc3dpdGNoKHByZWMpIHsKKwkgICAgY2FzZSAwOgorCQlmdyA9IDAuMDsKKwkJZm9yIChpPWp6O2k+PTA7aS0tKSBmdyArPSBmcVtpXTsKKwkJeVswXSA9IChpaD09MCk/IGZ3OiAtZnc7IAorCQlicmVhazsKKwkgICAgY2FzZSAxOgorCSAgICBjYXNlIDI6CisJCWZ3ID0gMC4wOworCQlmb3IgKGk9ano7aT49MDtpLS0pIGZ3ICs9IGZxW2ldOyAKKwkJeVswXSA9IChpaD09MCk/IGZ3OiAtZnc7IAorCQlmdyA9IGZxWzBdLWZ3OworCQlmb3IgKGk9MTtpPD1qejtpKyspIGZ3ICs9IGZxW2ldOworCQl5WzFdID0gKGloPT0wKT8gZnc6IC1mdzsgCisJCWJyZWFrOworCSAgICBjYXNlIDM6CS8qIHBhaW5mdWwgKi8KKwkJZm9yIChpPWp6O2k+MDtpLS0pIHsKKwkJICAgIGZ3ICAgICAgPSBmcVtpLTFdK2ZxW2ldOyAKKwkJICAgIGZxW2ldICArPSBmcVtpLTFdLWZ3OworCQkgICAgZnFbaS0xXSA9IGZ3OworCQl9CisJCWZvciAoaT1qejtpPjE7aS0tKSB7CisJCSAgICBmdyAgICAgID0gZnFbaS0xXStmcVtpXTsgCisJCSAgICBmcVtpXSAgKz0gZnFbaS0xXS1mdzsKKwkJICAgIGZxW2ktMV0gPSBmdzsKKwkJfQorCQlmb3IgKGZ3PTAuMCxpPWp6O2k+PTI7aS0tKSBmdyArPSBmcVtpXTsgCisJCWlmKGloPT0wKSB7CisJCSAgICB5WzBdID0gIGZxWzBdOyB5WzFdID0gIGZxWzFdOyB5WzJdID0gIGZ3OworCQl9IGVsc2UgeworCQkgICAgeVswXSA9IC1mcVswXTsgeVsxXSA9IC1mcVsxXTsgeVsyXSA9IC1mdzsKKwkJfQorCX0KKwlyZXR1cm4gbiY3OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMva19yZW1fcGlvMmYuYyBiL2xpYm0vc3JjL2tfcmVtX3BpbzJmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVjMjhmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2tfcmVtX3BpbzJmLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qIGtfcmVtX3BpbzJmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBrX3JlbV9waW8yLmMKKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2tfcmVtX3BpbzJmLmMsdiAxLjggMjAwNS8xMC8xMSAwNzo1NjowNSBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKy8qIEluIHRoZSBmbG9hdCB2ZXJzaW9uLCB0aGUgaW5wdXQgcGFyYW1ldGVyIHggY29udGFpbnMgOCBiaXQKKyAgIGludGVnZXJzLCBub3QgMjQgYml0IGludGVnZXJzLiAgMTEzIGJpdCBwcmVjaXNpb24gaXMgbm90IHN1cHBvcnRlZC4gICovCisKK3N0YXRpYyBjb25zdCBpbnQgaW5pdF9qa1tdID0gezQsNyw5fTsgLyogaW5pdGlhbCB2YWx1ZSBmb3IgamsgKi8KKworc3RhdGljIGNvbnN0IGZsb2F0IFBJbzJbXSA9IHsKKyAgMS41NzAzMTI1MDAwZSswMCwgLyogMHgzZmM5MDAwMCAqLworICA0LjU3NzYzNjcxODhlLTA0LCAvKiAweDM5ZjAwMDAwICovCisgIDIuNTk4NzYyNTEyMmUtMDUsIC8qIDB4MzdkYTAwMDAgKi8KKyAgNy41NDM3MTI4NTQ0ZS0wOCwgLyogMHgzM2EyMDAwMCAqLworICA2LjAwMjY2NTAzMTdlLTExLCAvKiAweDJlODQwMDAwICovCisgIDcuMzg5NjQ0NDUxOWUtMTMsIC8qIDB4MmI1MDAwMDAgKi8KKyAgNS4zODQ1ODE2Njk0ZS0xNSwgLyogMHgyN2MyMDAwMCAqLworICA1LjYzNzg1MTI5NjllLTE4LCAvKiAweDIyZDAwMDAwICovCisgIDguMzAwOTIyODgzMWUtMjAsIC8qIDB4MWZjNDAwMDAgKi8KKyAgMy4yNzU2MzUyMjU3ZS0yMiwgLyogMHgxYmM2MDAwMCAqLworICA2LjMzMzEwMTU2NDllLTI1LCAvKiAweDE3NDQwMDAwICovCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQKK3plcm8gICA9IDAuMCwKK29uZSAgICA9IDEuMCwKK3R3bzggICA9ICAyLjU2MDAwMDAwMDBlKzAyLCAvKiAweDQzODAwMDAwICovCit0d29uOCAgPSAgMy45MDYyNTAwMDAwZS0wMzsgLyogMHgzYjgwMDAwMCAqLworCisJaW50IF9fa2VybmVsX3JlbV9waW8yZihmbG9hdCAqeCwgZmxvYXQgKnksIGludCBlMCwgaW50IG54LCBpbnQgcHJlYywgY29uc3QgaW50MzJfdCAqaXBpbzIpCit7CisJaW50MzJfdCBqeixqeCxqdixqcCxqayxjYXJyeSxuLGlxWzIwXSxpLGosayxtLHEwLGloOworCWZsb2F0IHosZncsZlsyMF0sZnFbMjBdLHFbMjBdOworCisgICAgLyogaW5pdGlhbGl6ZSBqayovCisJamsgPSBpbml0X2prW3ByZWNdOworCWpwID0gams7CisKKyAgICAvKiBkZXRlcm1pbmUgangsanYscTAsIG5vdGUgdGhhdCAzPnEwICovCisJanggPSAgbngtMTsKKwlqdiA9IChlMC0zKS84OyBpZihqdjwwKSBqdj0wOworCXEwID0gIGUwLTgqKGp2KzEpOworCisgICAgLyogc2V0IHVwIGZbMF0gdG8gZltqeCtqa10gd2hlcmUgZltqeCtqa10gPSBpcGlvMltqditqa10gKi8KKwlqID0ganYtang7IG0gPSBqeCtqazsKKwlmb3IoaT0wO2k8PW07aSsrLGorKykgZltpXSA9IChqPDApPyB6ZXJvIDogKGZsb2F0KSBpcGlvMltqXTsKKworICAgIC8qIGNvbXB1dGUgcVswXSxxWzFdLC4uLnFbamtdICovCisJZm9yIChpPTA7aTw9ams7aSsrKSB7CisJICAgIGZvcihqPTAsZnc9MC4wO2o8PWp4O2orKykgZncgKz0geFtqXSpmW2p4K2ktal07IHFbaV0gPSBmdzsKKwl9CisKKwlqeiA9IGprOworcmVjb21wdXRlOgorICAgIC8qIGRpc3RpbGwgcVtdIGludG8gaXFbXSByZXZlcnNpbmdseSAqLworCWZvcihpPTAsaj1qeix6PXFbanpdO2o+MDtpKyssai0tKSB7CisJICAgIGZ3ICAgID0gIChmbG9hdCkoKGludDMyX3QpKHR3b244KiB6KSk7CisJICAgIGlxW2ldID0gIChpbnQzMl90KSh6LXR3bzgqZncpOworCSAgICB6ICAgICA9ICBxW2otMV0rZnc7CisJfQorCisgICAgLyogY29tcHV0ZSBuICovCisJeiAgPSBzY2FsYm5mKHoscTApOwkJLyogYWN0dWFsIHZhbHVlIG9mIHogKi8KKwl6IC09IChmbG9hdCk4LjAqZmxvb3JmKHoqKGZsb2F0KTAuMTI1KTsJLyogdHJpbSBvZmYgaW50ZWdlciA+PSA4ICovCisJbiAgPSAoaW50MzJfdCkgejsKKwl6IC09IChmbG9hdCluOworCWloID0gMDsKKwlpZihxMD4wKSB7CS8qIG5lZWQgaXFbanotMV0gdG8gZGV0ZXJtaW5lIG4gKi8KKwkgICAgaSAgPSAoaXFbanotMV0+Pig4LXEwKSk7IG4gKz0gaTsKKwkgICAgaXFbanotMV0gLT0gaTw8KDgtcTApOworCSAgICBpaCA9IGlxW2p6LTFdPj4oNy1xMCk7CisJfQorCWVsc2UgaWYocTA9PTApIGloID0gaXFbanotMV0+Pjc7CisJZWxzZSBpZih6Pj0oZmxvYXQpMC41KSBpaD0yOworCisJaWYoaWg+MCkgewkvKiBxID4gMC41ICovCisJICAgIG4gKz0gMTsgY2FycnkgPSAwOworCSAgICBmb3IoaT0wO2k8anogO2krKykgewkvKiBjb21wdXRlIDEtcSAqLworCQlqID0gaXFbaV07CisJCWlmKGNhcnJ5PT0wKSB7CisJCSAgICBpZihqIT0wKSB7CisJCQljYXJyeSA9IDE7IGlxW2ldID0gMHgxMDAtIGo7CisJCSAgICB9CisJCX0gZWxzZSAgaXFbaV0gPSAweGZmIC0gajsKKwkgICAgfQorCSAgICBpZihxMD4wKSB7CQkvKiByYXJlIGNhc2U6IGNoYW5jZSBpcyAxIGluIDEyICovCisJICAgICAgICBzd2l0Y2gocTApIHsKKwkgICAgICAgIGNhc2UgMToKKwkgICAgCSAgIGlxW2p6LTFdICY9IDB4N2Y7IGJyZWFrOworCSAgICAJY2FzZSAyOgorCSAgICAJICAgaXFbanotMV0gJj0gMHgzZjsgYnJlYWs7CisJICAgICAgICB9CisJICAgIH0KKwkgICAgaWYoaWg9PTIpIHsKKwkJeiA9IG9uZSAtIHo7CisJCWlmKGNhcnJ5IT0wKSB6IC09IHNjYWxibmYob25lLHEwKTsKKwkgICAgfQorCX0KKworICAgIC8qIGNoZWNrIGlmIHJlY29tcHV0YXRpb24gaXMgbmVlZGVkICovCisJaWYoej09emVybykgeworCSAgICBqID0gMDsKKwkgICAgZm9yIChpPWp6LTE7aT49ams7aS0tKSBqIHw9IGlxW2ldOworCSAgICBpZihqPT0wKSB7IC8qIG5lZWQgcmVjb21wdXRhdGlvbiAqLworCQlmb3Ioaz0xO2lxW2prLWtdPT0wO2srKyk7ICAgLyogayA9IG5vLiBvZiB0ZXJtcyBuZWVkZWQgKi8KKworCQlmb3IoaT1qeisxO2k8PWp6K2s7aSsrKSB7ICAgLyogYWRkIHFbanorMV0gdG8gcVtqeitrXSAqLworCQkgICAgZltqeCtpXSA9IChmbG9hdCkgaXBpbzJbanYraV07CisJCSAgICBmb3Ioaj0wLGZ3PTAuMDtqPD1qeDtqKyspIGZ3ICs9IHhbal0qZltqeCtpLWpdOworCQkgICAgcVtpXSA9IGZ3OworCQl9CisJCWp6ICs9IGs7CisJCWdvdG8gcmVjb21wdXRlOworCSAgICB9CisJfQorCisgICAgLyogY2hvcCBvZmYgemVybyB0ZXJtcyAqLworCWlmKHo9PShmbG9hdCkwLjApIHsKKwkgICAganogLT0gMTsgcTAgLT0gODsKKwkgICAgd2hpbGUoaXFbanpdPT0wKSB7IGp6LS07IHEwLT04O30KKwl9IGVsc2UgeyAvKiBicmVhayB6IGludG8gOC1iaXQgaWYgbmVjZXNzYXJ5ICovCisJICAgIHogPSBzY2FsYm5mKHosLXEwKTsKKwkgICAgaWYoej49dHdvOCkgeworCQlmdyA9IChmbG9hdCkoKGludDMyX3QpKHR3b244KnopKTsKKwkJaXFbanpdID0gKGludDMyX3QpKHotdHdvOCpmdyk7CisJCWp6ICs9IDE7IHEwICs9IDg7CisJCWlxW2p6XSA9IChpbnQzMl90KSBmdzsKKwkgICAgfSBlbHNlIGlxW2p6XSA9IChpbnQzMl90KSB6IDsKKwl9CisKKyAgICAvKiBjb252ZXJ0IGludGVnZXIgImJpdCIgY2h1bmsgdG8gZmxvYXRpbmctcG9pbnQgdmFsdWUgKi8KKwlmdyA9IHNjYWxibmYob25lLHEwKTsKKwlmb3IoaT1qejtpPj0wO2ktLSkgeworCSAgICBxW2ldID0gZncqKGZsb2F0KWlxW2ldOyBmdyo9dHdvbjg7CisJfQorCisgICAgLyogY29tcHV0ZSBQSW8yWzAsLi4uLGpwXSpxW2p6LC4uLiwwXSAqLworCWZvcihpPWp6O2k+PTA7aS0tKSB7CisJICAgIGZvcihmdz0wLjAsaz0wO2s8PWpwJiZrPD1qei1pO2srKykgZncgKz0gUElvMltrXSpxW2kra107CisJICAgIGZxW2p6LWldID0gZnc7CisJfQorCisgICAgLyogY29tcHJlc3MgZnFbXSBpbnRvIHlbXSAqLworCXN3aXRjaChwcmVjKSB7CisJICAgIGNhc2UgMDoKKwkJZncgPSAwLjA7CisJCWZvciAoaT1qejtpPj0wO2ktLSkgZncgKz0gZnFbaV07CisJCXlbMF0gPSAoaWg9PTApPyBmdzogLWZ3OworCQlicmVhazsKKwkgICAgY2FzZSAxOgorCSAgICBjYXNlIDI6CisJCWZ3ID0gMC4wOworCQlmb3IgKGk9ano7aT49MDtpLS0pIGZ3ICs9IGZxW2ldOworCQlmdyA9ICoodm9sYXRpbGUgZmxvYXQgKikmZnc7CS8qIGNsaXAgYW55IGV4dHJhIHByZWNpc2lvbiAqLworCQl5WzBdID0gKGloPT0wKT8gZnc6IC1mdzsKKwkJZncgPSBmcVswXS1mdzsKKwkJZm9yIChpPTE7aTw9ano7aSsrKSBmdyArPSBmcVtpXTsKKwkJeVsxXSA9IChpaD09MCk/IGZ3OiAtZnc7CisJCWJyZWFrOworCSAgICBjYXNlIDM6CS8qIHBhaW5mdWwgKi8KKwkJZm9yIChpPWp6O2k+MDtpLS0pIHsKKwkJICAgIGZ3ICAgICAgPSBmcVtpLTFdK2ZxW2ldOworCQkgICAgZnFbaV0gICs9IGZxW2ktMV0tZnc7CisJCSAgICBmcVtpLTFdID0gZnc7CisJCX0KKwkJZm9yIChpPWp6O2k+MTtpLS0pIHsKKwkJICAgIGZ3ICAgICAgPSBmcVtpLTFdK2ZxW2ldOworCQkgICAgZnFbaV0gICs9IGZxW2ktMV0tZnc7CisJCSAgICBmcVtpLTFdID0gZnc7CisJCX0KKwkJZm9yIChmdz0wLjAsaT1qejtpPj0yO2ktLSkgZncgKz0gZnFbaV07CisJCWlmKGloPT0wKSB7CisJCSAgICB5WzBdID0gIGZxWzBdOyB5WzFdID0gIGZxWzFdOyB5WzJdID0gIGZ3OworCQl9IGVsc2UgeworCQkgICAgeVswXSA9IC1mcVswXTsgeVsxXSA9IC1mcVsxXTsgeVsyXSA9IC1mdzsKKwkJfQorCX0KKwlyZXR1cm4gbiY3OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMva19zaW4uYyBiL2xpYm0vc3JjL2tfc2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUwNmE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2tfc2luLmMKQEAgLTAsMCArMSw3MCBAQAorCisvKiBAKCMpa19zaW4uYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMva19zaW4uYyx2IDEuMTAgMjAwNS8xMS8wMiAxMzowNjo0OSBiZGUgRXhwICQiOworI2VuZGlmCisKKy8qIF9fa2VybmVsX3NpbiggeCwgeSwgaXkpCisgKiBrZXJuZWwgc2luIGZ1bmN0aW9uIG9uIH5bLXBpLzQsIHBpLzRdIChleGNlcHQgb24gLTApLCBwaS80IH4gMC43ODU0CisgKiBJbnB1dCB4IGlzIGFzc3VtZWQgdG8gYmUgYm91bmRlZCBieSB+cGkvNCBpbiBtYWduaXR1ZGUuCisgKiBJbnB1dCB5IGlzIHRoZSB0YWlsIG9mIHguCisgKiBJbnB1dCBpeSBpbmRpY2F0ZXMgd2hldGhlciB5IGlzIDAuIChpZiBpeT0wLCB5IGFzc3VtZSB0byBiZSAwKS4gCisgKgorICogQWxnb3JpdGhtCisgKgkxLiBTaW5jZSBzaW4oLXgpID0gLXNpbih4KSwgd2UgbmVlZCBvbmx5IHRvIGNvbnNpZGVyIHBvc2l0aXZlIHguIAorICoJMi4gQ2FsbGVycyBtdXN0IHJldHVybiBzaW4oLTApID0gLTAgd2l0aG91dCBjYWxsaW5nIGhlcmUgc2luY2Ugb3VyCisgKgkgICBvZGQgcG9seW5vbWlhbCBpcyBub3QgZXZhbHVhdGVkIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIC0wLgorICoJICAgQ2FsbGVycyBtYXkgZG8gdGhlIG9wdGltaXphdGlvbiBzaW4oeCkgfiB4IGZvciB0aW55IHguCisgKgkzLiBzaW4oeCkgaXMgYXBwcm94aW1hdGVkIGJ5IGEgcG9seW5vbWlhbCBvZiBkZWdyZWUgMTMgb24KKyAqCSAgIFswLHBpLzRdCisgKgkJICAJICAgICAgICAgMyAgICAgICAgICAgIDEzCisgKgkgICAJc2luKHgpIH4geCArIFMxKnggKyAuLi4gKyBTNip4CisgKgkgICB3aGVyZQorICoJCisgKiAJfHNpbih4KSAgICAgICAgIDIgICAgIDQgICAgIDYgICAgIDggICAgIDEwICAgICAxMiAgfCAgICAgLTU4CisgKiAJfC0tLS0tIC0gKDErUzEqeCArUzIqeCArUzMqeCArUzQqeCArUzUqeCAgK1M2KnggICApfCA8PSAyCisgKiAJfCAgeCAJCQkJCSAgICAgICAgICAgfCAKKyAqIAorICoJNC4gc2luKHgreSkgPSBzaW4oeCkgKyBzaW4nKHgnKSp5CisgKgkJICAgIH4gc2luKHgpICsgKDEteCp4LzIpKnkKKyAqCSAgIEZvciBiZXR0ZXIgYWNjdXJhY3ksIGxldCAKKyAqCQkgICAgIDMgICAgICAyICAgICAgMiAgICAgIDIgICAgICAyCisgKgkJciA9IHggKihTMit4ICooUzMreCAqKFM0K3ggKihTNSt4ICpTNikpKSkKKyAqCSAgIHRoZW4gICAgICAgICAgICAgICAgICAgMyAgICAyCisgKgkJc2luKHgpID0geCArIChTMSp4ICsgKHggKihyLXkvMikreSkpCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQoraGFsZiA9ICA1LjAwMDAwMDAwMDAwMDAwMDAwMDAwZS0wMSwgLyogMHgzRkUwMDAwMCwgMHgwMDAwMDAwMCAqLworUzEgID0gLTEuNjY2NjY2NjY2NjY2NjYzMjQzNDhlLTAxLCAvKiAweEJGQzU1NTU1LCAweDU1NTU1NTQ5ICovCitTMiAgPSAgOC4zMzMzMzMzMzMzMjI0ODk0NjEyNGUtMDMsIC8qIDB4M0Y4MTExMTEsIDB4MTExMEY4QTYgKi8KK1MzICA9IC0xLjk4NDEyNjk4Mjk4NTc5NDkzMTM0ZS0wNCwgLyogMHhCRjJBMDFBMCwgMHgxOUMxNjFENSAqLworUzQgID0gIDIuNzU1NzMxMzcwNzA3MDA2NzY3ODllLTA2LCAvKiAweDNFQzcxREUzLCAweDU3QjFGRTdEICovCitTNSAgPSAtMi41MDUwNzYwMjUzNDA2ODYzNDE5NWUtMDgsIC8qIDB4QkU1QUU1RTYsIDB4OEEyQjlDRUIgKi8KK1M2ICA9ICAxLjU4OTY5MDk5NTIxMTU1MDEwMjIxZS0xMDsgLyogMHgzREU1RDkzQSwgMHg1QUNGRDU3QyAqLworCitkb3VibGUKK19fa2VybmVsX3Npbihkb3VibGUgeCwgZG91YmxlIHksIGludCBpeSkKK3sKKwlkb3VibGUgeixyLHY7CisKKwl6CT0gIHgqeDsKKwl2CT0gIHoqeDsKKwlyCT0gIFMyK3oqKFMzK3oqKFM0K3oqKFM1K3oqUzYpKSk7CisJaWYoaXk9PTApIHJldHVybiB4K3YqKFMxK3oqcik7CisJZWxzZSAgICAgIHJldHVybiB4LSgoeiooaGFsZip5LXYqcikteSktdipTMSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9rX3NpbmYuYyBiL2xpYm0vc3JjL2tfc2luZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NWRjNDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9rX3NpbmYuYwpAQCAtMCwwICsxLDQ3IEBACisvKiBrX3NpbmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGtfc2luLmMKKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICogT3B0aW1pemVkIGJ5IEJydWNlIEQuIEV2YW5zLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBJTkxJTkVfS0VSTkVMX1NJTkRGCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMva19zaW5mLmMsdiAxLjEzIDIwMDUvMTEvMzAgMTE6NTE6MTcgYmRlIEV4cCAkIjsKKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKy8qIHxzaW4oeCkveCAtIHMoeCl8IDwgMioqLTM3LjUgKH5bLTQuODllLTEyLCA0LjgyNGUtMTJdKS4gKi8KK3N0YXRpYyBjb25zdCBkb3VibGUKK1MxID0gLTB4MTU1NTU1NTRjYmFjNzcuMHAtNTUsCS8qIC0wLjE2NjY2NjY2NjQxNjI2NTIzNTU5NSAqLworUzIgPSAgMHgxMTExMTA4OTZlZmJiMi4wcC01OSwJLyogIDAuMDA4MzMzMzI5Mzg1ODg5NDYzMTc1NiAqLworUzMgPSAtMHgxYTAwZjllMmNhZTc3NC4wcC02NSwJLyogLTAuMDAwMTk4MzkzMzQ4MzYwOTY2MzE3MzQ3ICovCitTNCA9ICAweDE2Y2Q4NzhjM2I0NmE3LjBwLTcxOwkvKiAgMC4wMDAwMDI3MTgzMTE0OTM5ODk4MjE5MDY0ICovCisKKyNpZmRlZiBJTkxJTkVfS0VSTkVMX1NJTkRGCitleHRlcm4gaW5saW5lCisjZW5kaWYKK2Zsb2F0CitfX2tlcm5lbF9zaW5kZihkb3VibGUgeCkKK3sKKwlkb3VibGUgciwgcywgdywgejsKKworCS8qIFRyeSB0byBvcHRpbWl6ZSBmb3IgcGFyYWxsZWwgZXZhbHVhdGlvbiBhcyBpbiBrX3RhbmYuYy4gKi8KKwl6ID0geCp4OworCXcgPSB6Kno7CisJciA9IFMzK3oqUzQ7CisJcyA9IHoqeDsKKwlyZXR1cm4gKHggKyBzKihTMSt6KlMyKSkgKyBzKncqcjsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2tfdGFuLmMgYi9saWJtL3NyYy9rX3Rhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZmUxNTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9rX3Rhbi5jCkBAIC0wLDAgKzEsMTMzIEBACisvKiBAKCMpa190YW4uYyAxLjUgMDQvMDQvMjIgU01JICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwNCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyogSU5ERU5UIE9GRiAqLworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2tfdGFuLmMsdiAxLjEyIDIwMDUvMTEvMDIgMTQ6MDE6NDUgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2tlcm5lbF90YW4oIHgsIHksIGsgKQorICoga2VybmVsIHRhbiBmdW5jdGlvbiBvbiB+Wy1waS80LCBwaS80XSAoZXhjZXB0IG9uIC0wKSwgcGkvNCB+IDAuNzg1NAorICogSW5wdXQgeCBpcyBhc3N1bWVkIHRvIGJlIGJvdW5kZWQgYnkgfnBpLzQgaW4gbWFnbml0dWRlLgorICogSW5wdXQgeSBpcyB0aGUgdGFpbCBvZiB4LgorICogSW5wdXQgayBpbmRpY2F0ZXMgd2hldGhlciB0YW4gKGlmIGsgPSAxKSBvciAtMS90YW4gKGlmIGsgPSAtMSkgaXMgcmV0dXJuZWQuCisgKgorICogQWxnb3JpdGhtCisgKgkxLiBTaW5jZSB0YW4oLXgpID0gLXRhbih4KSwgd2UgbmVlZCBvbmx5IHRvIGNvbnNpZGVyIHBvc2l0aXZlIHguCisgKgkyLiBDYWxsZXJzIG11c3QgcmV0dXJuIHRhbigtMCkgPSAtMCB3aXRob3V0IGNhbGxpbmcgaGVyZSBzaW5jZSBvdXIKKyAqCSAgIG9kZCBwb2x5bm9taWFsIGlzIG5vdCBldmFsdWF0ZWQgaW4gYSB3YXkgdGhhdCBwcmVzZXJ2ZXMgLTAuCisgKgkgICBDYWxsZXJzIG1heSBkbyB0aGUgb3B0aW1pemF0aW9uIHRhbih4KSB+IHggZm9yIHRpbnkgeC4KKyAqCTMuIHRhbih4KSBpcyBhcHByb3hpbWF0ZWQgYnkgYSBvZGQgcG9seW5vbWlhbCBvZiBkZWdyZWUgMjcgb24KKyAqCSAgIFswLDAuNjc0MzRdCisgKgkJICAJICAgICAgICAgMyAgICAgICAgICAgICAyNworICoJICAgCXRhbih4KSB+IHggKyBUMSp4ICsgLi4uICsgVDEzKngKKyAqCSAgIHdoZXJlCisgKgorICogCSAgICAgICAgfHRhbih4KSAgICAgICAgIDIgICAgIDQgICAgICAgICAgICAyNiAgIHwgICAgIC01OS4yCisgKiAJICAgICAgICB8LS0tLS0gLSAoMStUMSp4ICtUMip4ICsuLi4uICtUMTMqeCAgICApfCA8PSAyCisgKiAJICAgICAgICB8ICB4IAkJCQkJfAorICoKKyAqCSAgIE5vdGU6IHRhbih4K3kpID0gdGFuKHgpICsgdGFuJyh4KSp5CisgKgkJICAgICAgICAgIH4gdGFuKHgpICsgKDEreCp4KSp5CisgKgkgICBUaGVyZWZvcmUsIGZvciBiZXR0ZXIgYWNjdXJhY3kgaW4gY29tcHV0aW5nIHRhbih4K3kpLCBsZXQKKyAqCQkgICAgIDMgICAgICAyICAgICAgMiAgICAgICAyICAgICAgIDIKKyAqCQlyID0geCAqKFQyK3ggKihUMyt4ICooLi4uK3ggKihUMTIreCAqVDEzKSkpKQorICoJICAgdGhlbgorICoJCSAJCSAgICAzICAgIDIKKyAqCQl0YW4oeCt5KSA9IHggKyAoVDEqeCArICh4ICoocit5KSt5KSkKKyAqCisgKiAgICAgIDQuIEZvciB4IGluIFswLjY3NDM0LHBpLzRdLCAgbGV0IHkgPSBwaS80IC0geCwgdGhlbgorICoJCXRhbih4KSA9IHRhbihwaS80LXkpID0gKDEtdGFuKHkpKS8oMSt0YW4oeSkpCisgKgkJICAgICAgID0gMSAtIDIqKHRhbih5KSAtICh0YW4oeSleMikvKDErdGFuKHkpKSkKKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorc3RhdGljIGNvbnN0IGRvdWJsZSB4eHhbXSA9IHsKKwkJIDMuMzMzMzMzMzMzMzMzMzQwOTE5ODZlLTAxLAkvKiAzRkQ1NTU1NSwgNTU1NTU1NjMgKi8KKwkJIDEuMzMzMzMzMzMzMzMyMDEyNDI2OTllLTAxLAkvKiAzRkMxMTExMSwgMTExMEZFN0EgKi8KKwkJIDUuMzk2ODI1Mzk3NjIyNjA1MjEzNzdlLTAyLAkvKiAzRkFCQTFCQSwgMUJCMzQxRkUgKi8KKwkJIDIuMTg2OTQ4ODI5NDg1OTU0MjQ1OTllLTAyLAkvKiAzRjk2NjRGNCwgODQwNkQ2MzcgKi8KKwkJIDguODYzMjM5ODIzNTk5MzAwMDU3MzdlLTAzLAkvKiAzRjgyMjZFMywgRTk2RTg0OTMgKi8KKwkJIDMuNTkyMDc5MTA3NTkxMzEyMzUzNTZlLTAzLAkvKiAzRjZENkQyMiwgQzk1NjAzMjggKi8KKwkJIDEuNDU2MjA5NDU0MzI1MjkwMjU1MTZlLTAzLAkvKiAzRjU3REJDOCwgRkVFMDgzMTUgKi8KKwkJIDUuODgwNDEyNDA4MjAyNjQwOTY4NzRlLTA0LAkvKiAzRjQzNDREOCwgRjJGMjY1MDEgKi8KKwkJIDIuNDY0NjMxMzQ4MTg0Njk5MDY4MTJlLTA0LAkvKiAzRjMwMjZGNywgMUE4RDEwNjggKi8KKwkJIDcuODE3OTQ0NDI5Mzk1NTcwOTIzMDBlLTA1LAkvKiAzRjE0N0U4OCwgQTAzNzkyQTYgKi8KKwkJIDcuMTQwNzI0OTEzODI2MDgxOTAzMDVlLTA1LAkvKiAzRjEyQjgwRiwgMzJGMEE3RTkgKi8KKwkJLTEuODU1ODYzNzQ4NTUyNzU0NTY2NTRlLTA1LAkvKiBCRUYzNzVDQiwgREI2MDUzNzMgKi8KKwkJIDIuNTkwNzMwNTE4NjM2MzM3MTI4ODRlLTA1LAkvKiAzRUZCMkE3MCwgNzRCRjdBRDQgKi8KKy8qIG9uZSAqLwkgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMGUrMDAsCS8qIDNGRjAwMDAwLCAwMDAwMDAwMCAqLworLyogcGlvNCAqLwkgNy44NTM5ODE2MzM5NzQ0ODI3ODk5OWUtMDEsCS8qIDNGRTkyMUZCLCA1NDQ0MkQxOCAqLworLyogcGlvNGxvICovCSAzLjA2MTYxNjk5Nzg2ODM4MzAxNzkzZS0xNwkvKiAzQzgxQTYyNiwgMzMxNDVDMDcgKi8KK307CisjZGVmaW5lCW9uZQl4eHhbMTNdCisjZGVmaW5lCXBpbzQJeHh4WzE0XQorI2RlZmluZQlwaW80bG8JeHh4WzE1XQorI2RlZmluZQlUCXh4eAorLyogSU5ERU5UIE9OICovCisKK2RvdWJsZQorX19rZXJuZWxfdGFuKGRvdWJsZSB4LCBkb3VibGUgeSwgaW50IGl5KSB7CisJZG91YmxlIHosIHIsIHYsIHcsIHM7CisJaW50MzJfdCBpeCwgaHg7CisKKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCWl4ID0gaHggJiAweDdmZmZmZmZmOwkJCS8qIGhpZ2ggd29yZCBvZiB8eHwgKi8KKwlpZiAoaXggPj0gMHgzRkU1OTQyOCkgewkvKiB8eHwgPj0gMC42NzQ0ICovCisJCWlmIChoeCA8IDApIHsKKwkJCXggPSAteDsKKwkJCXkgPSAteTsKKwkJfQorCQl6ID0gcGlvNCAtIHg7CisJCXcgPSBwaW80bG8gLSB5OworCQl4ID0geiArIHc7CisJCXkgPSAwLjA7CisJfQorCXogPSB4ICogeDsKKwl3ID0geiAqIHo7CisJLyoKKwkgKiBCcmVhayB4XjUqKFRbMV0reF4yKlRbMl0rLi4uKSBpbnRvCisJICogeF41KFRbMV0reF40KlRbM10rLi4uK3heMjAqVFsxMV0pICsKKwkgKiB4XjUoeF4yKihUWzJdK3heNCpUWzRdKy4uLit4XjIyKltUMTJdKSkKKwkgKi8KKwlyID0gVFsxXSArIHcgKiAoVFszXSArIHcgKiAoVFs1XSArIHcgKiAoVFs3XSArIHcgKiAoVFs5XSArCisJCXcgKiBUWzExXSkpKSk7CisJdiA9IHogKiAoVFsyXSArIHcgKiAoVFs0XSArIHcgKiAoVFs2XSArIHcgKiAoVFs4XSArIHcgKiAoVFsxMF0gKworCQl3ICogVFsxMl0pKSkpKTsKKwlzID0geiAqIHg7CisJciA9IHkgKyB6ICogKHMgKiAociArIHYpICsgeSk7CisJciArPSBUWzBdICogczsKKwl3ID0geCArIHI7CisJaWYgKGl4ID49IDB4M0ZFNTk0MjgpIHsKKwkJdiA9IChkb3VibGUpIGl5OworCQlyZXR1cm4gKGRvdWJsZSkgKDEgLSAoKGh4ID4+IDMwKSAmIDIpKSAqCisJCQkodiAtIDIuMCAqICh4IC0gKHcgKiB3IC8gKHcgKyB2KSAtIHIpKSk7CisJfQorCWlmIChpeSA9PSAxKQorCQlyZXR1cm4gdzsKKwllbHNlIHsKKwkJLyoKKwkJICogaWYgYWxsb3cgZXJyb3IgdXAgdG8gMiB1bHAsIHNpbXBseSByZXR1cm4KKwkJICogLTEuMCAvICh4K3IpIGhlcmUKKwkJICovCisJCS8qIGNvbXB1dGUgLTEuMCAvICh4K3IpIGFjY3VyYXRlbHkgKi8KKwkJZG91YmxlIGEsIHQ7CisJCXogPSB3OworCQlTRVRfTE9XX1dPUkQoeiwwKTsKKwkJdiA9IHIgLSAoeiAtIHgpOwkvKiB6K3YgPSByK3ggKi8KKwkJdCA9IGEgPSAtMS4wIC8gdzsJLyogYSA9IC0xLjAvdyAqLworCQlTRVRfTE9XX1dPUkQodCwwKTsKKwkJcyA9IDEuMCArIHQgKiB6OworCQlyZXR1cm4gdCArIGEgKiAocyArIHQgKiB2KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9rX3RhbmYuYyBiL2xpYm0vc3JjL2tfdGFuZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NzQwMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9rX3RhbmYuYwpAQCAtMCwwICsxLDY3IEBACisvKiBrX3RhbmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGtfdGFuLmMKKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICogT3B0aW1pemVkIGJ5IEJydWNlIEQuIEV2YW5zLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwNCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBJTkxJTkVfS0VSTkVMX1RBTkRGCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMva190YW5mLmMsdiAxLjIwIDIwMDUvMTEvMjggMTE6NDY6MjAgYmRlIEV4cCAkIjsKKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKy8qIHx0YW4oeCkveCAtIHQoeCl8IDwgMioqLTI1LjUgKH5bLTJlLTA4LCAyZS0wOF0pLiAqLworc3RhdGljIGNvbnN0IGRvdWJsZQorVFtdID0gIHsKKyAgMHgxNTU1NGQzNDE4Yzk5Zi4wcC01NCwJLyogMC4zMzMzMzEzOTUwMzA3OTEzOTk3NTggKi8KKyAgMHgxMTEyZmQzODk5OWY3Mi4wcC01NSwJLyogMC4xMzMzOTIwMDI3MTI5NzY3NDI3MTggKi8KKyAgMHgxYjU0YzkxZDg2NWFmZS4wcC01NywJLyogMC4wNTMzODEyMzc4NDQ1NjcwMzkzNTIzICovCisgIDB4MTkxZGYzOTA4YzMzY2UuMHAtNTgsCS8qIDAuMDI0NTI4MzE4MTE2NjU0NzI3ODg3MyAqLworICAweDE4NWRhZGZjZWNmNDRlLjBwLTYxLAkvKiAwLjAwMjk3NDM1NzQzMzU5OTY3MzA0OTI3ICovCisgIDB4MTM2MmI5YmY5NzFiY2QuMHAtNTksCS8qIDAuMDA5NDY1NjQ3ODQ5NDM2NzMxNjY3MjggKi8KK307CisKKyNpZmRlZiBJTkxJTkVfS0VSTkVMX1RBTkRGCitleHRlcm4gaW5saW5lCisjZW5kaWYKK2Zsb2F0CitfX2tlcm5lbF90YW5kZihkb3VibGUgeCwgaW50IGl5KQoreworCWRvdWJsZSB6LHIsdyxzLHQsdTsKKworCXoJPSAgeCp4OworCS8qCisJICogU3BsaXQgdXAgdGhlIHBvbHlub21pYWwgaW50byBzbWFsbCBpbmRlcGVuZGVudCB0ZXJtcyB0byBnaXZlCisJICogb3Bwb3J0dW5pdGllcyBmb3IgcGFyYWxsZWwgZXZhbHVhdGlvbi4gIFRoZSBjaG9zZW4gc3BsaXR0aW5nIGlzCisJICogbWljcm8tb3B0aW1pemVkIGZvciBBdGhsb25zIChYUCwgWDY0KS4gIEl0IGNvc3RzIDIgbXVsdGlwbGljYXRpb25zCisJICogcmVsYXRpdmUgdG8gSG9ybmVyJ3MgbWV0aG9kIG9uIHNlcXVlbnRpYWwgbWFjaGluZXMuCisJICoKKwkgKiBXZSBhZGQgdGhlIHNtYWxsIHRlcm1zIGZyb20gbG93ZXN0IGRlZ3JlZSB1cCBmb3IgZWZmaWNpZW5jeSBvbgorCSAqIG5vbi1zZXF1ZW50aWFsIG1hY2hpbmVzICh0aGUgbG93ZXN0IGRlZ3JlZSB0ZXJtcyB0ZW5kIHRvIGJlIHJlYWR5CisJICogZWFybGllcikuICBBcGFydCBmcm9tIHRoaXMsIHdlIGRvbid0IGNhcmUgYWJvdXQgb3JkZXIgb2YKKwkgKiBvcGVyYXRpb25zLCBhbmQgZG9uJ3QgbmVlZCB0byB0byBjYXJlIHNpbmNlIHdlIGhhdmUgcHJlY2lzaW9uIHRvCisJICogc3BhcmUuICBIb3dldmVyLCB0aGUgY2hvc2VuIHNwbGl0dGluZyBpcyBnb29kIGZvciBhY2N1cmFjeSB0b28sCisJICogYW5kIHdvdWxkIGdpdmUgcmVzdWx0cyBhcyBhY2N1cmF0ZSBhcyBIb3JuZXIncyBtZXRob2QgaWYgdGhlCisJICogc21hbGwgdGVybXMgd2VyZSBhZGRlZCBmcm9tIGhpZ2hlc3QgZGVncmVlIGRvd24uCisJICovCisJciA9IFRbNF0reipUWzVdOworCXQgPSBUWzJdK3oqVFszXTsKKwl3ID0geip6OworCXMgPSB6Kng7CisJdSA9IFRbMF0reipUWzFdOworCXIgPSAoeCtzKnUpKyhzKncpKih0K3cqcik7CisJaWYoaXk9PTEpIHJldHVybiByOworCWVsc2UgcmV0dXJuIC0xLjAvcjsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL21hdGhfcHJpdmF0ZS5oIGIvbGlibS9zcmMvbWF0aF9wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNiY2QzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL21hdGhfcHJpdmF0ZS5oCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qCisgKiBmcm9tOiBAKCMpZmRsaWJtLmggNS4xIDkzLzA5LzI0CisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9tYXRoX3ByaXZhdGUuaCx2IDEuMjAgMjAwNS8xMS8yOCAwNDo1ODo1NyBiZGUgRXhwICQKKyAqLworCisjaWZuZGVmIF9NQVRIX1BSSVZBVEVfSF8KKyNkZWZpbmUJX01BVEhfUFJJVkFURV9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZW5kaWFuLmg+CisKKy8qCisgKiBUaGUgb3JpZ2luYWwgZmRsaWJtIGNvZGUgdXNlZCBzdGF0ZW1lbnRzIGxpa2U6CisgKgluMCA9ICgoKihpbnQqKSZvbmUpPj4yOSleMTsJCSogaW5kZXggb2YgaGlnaCB3b3JkICoKKyAqCWl4MCA9ICoobjArKGludCopJngpOwkJCSogaGlnaCB3b3JkIG9mIHggKgorICoJaXgxID0gKigoMS1uMCkrKGludCopJngpOwkJKiBsb3cgd29yZCBvZiB4ICoKKyAqIHRvIGRpZyB0d28gMzIgYml0IHdvcmRzIG91dCBvZiB0aGUgNjQgYml0IElFRUUgZmxvYXRpbmcgcG9pbnQKKyAqIHZhbHVlLiAgVGhhdCBpcyBub24tQU5TSSwgYW5kLCBtb3Jlb3ZlciwgdGhlIGdjYyBpbnN0cnVjdGlvbgorICogc2NoZWR1bGVyIGdldHMgaXQgd3JvbmcuICBXZSBpbnN0ZWFkIHVzZSB0aGUgZm9sbG93aW5nIG1hY3Jvcy4KKyAqIFVubGlrZSB0aGUgb3JpZ2luYWwgY29kZSwgd2UgZGV0ZXJtaW5lIHRoZSBlbmRpYW5uZXNzIGF0IGNvbXBpbGUKKyAqIHRpbWUsIG5vdCBhdCBydW4gdGltZTsgSSBkb24ndCBzZWUgbXVjaCBiZW5lZml0IHRvIHNlbGVjdGluZworICogZW5kaWFubmVzcyBhdCBydW4gdGltZS4KKyAqLworCisvKgorICogQSB1bmlvbiB3aGljaCBwZXJtaXRzIHVzIHRvIGNvbnZlcnQgYmV0d2VlbiBhIGRvdWJsZSBhbmQgdHdvIDMyIGJpdAorICogaW50cy4KKyAqLworCisjaWYgKF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4pIHx8IChkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fVkZQX0ZQX18pKQorCit0eXBlZGVmIHVuaW9uCit7CisgIGRvdWJsZSB2YWx1ZTsKKyAgc3RydWN0CisgIHsKKyAgICB1X2ludDMyX3QgbXN3OworICAgIHVfaW50MzJfdCBsc3c7CisgIH0gcGFydHM7Cit9IGllZWVfZG91YmxlX3NoYXBlX3R5cGU7CisKKyNlbmRpZgorCisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTiAgJiYgIShkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fVkZQX0ZQX18pKQorCit0eXBlZGVmIHVuaW9uCit7CisgIGRvdWJsZSB2YWx1ZTsKKyAgc3RydWN0CisgIHsKKyAgICB1X2ludDMyX3QgbHN3OworICAgIHVfaW50MzJfdCBtc3c7CisgIH0gcGFydHM7Cit9IGllZWVfZG91YmxlX3NoYXBlX3R5cGU7CisKKyNlbmRpZgorCisvKiBHZXQgdHdvIDMyIGJpdCBpbnRzIGZyb20gYSBkb3VibGUuICAqLworCisjZGVmaW5lIEVYVFJBQ1RfV09SRFMoaXgwLGl4MSxkKQkJCQlcCitkbyB7CQkJCQkJCQlcCisgIGllZWVfZG91YmxlX3NoYXBlX3R5cGUgZXdfdTsJCQkJCVwKKyAgZXdfdS52YWx1ZSA9IChkKTsJCQkJCQlcCisgIChpeDApID0gZXdfdS5wYXJ0cy5tc3c7CQkJCQlcCisgIChpeDEpID0gZXdfdS5wYXJ0cy5sc3c7CQkJCQlcCit9IHdoaWxlICgwKQorCisvKiBHZXQgdGhlIG1vcmUgc2lnbmlmaWNhbnQgMzIgYml0IGludCBmcm9tIGEgZG91YmxlLiAgKi8KKworI2RlZmluZSBHRVRfSElHSF9XT1JEKGksZCkJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWVlZV9kb3VibGVfc2hhcGVfdHlwZSBnaF91OwkJCQkJXAorICBnaF91LnZhbHVlID0gKGQpOwkJCQkJCVwKKyAgKGkpID0gZ2hfdS5wYXJ0cy5tc3c7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyogR2V0IHRoZSBsZXNzIHNpZ25pZmljYW50IDMyIGJpdCBpbnQgZnJvbSBhIGRvdWJsZS4gICovCisKKyNkZWZpbmUgR0VUX0xPV19XT1JEKGksZCkJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWVlZV9kb3VibGVfc2hhcGVfdHlwZSBnbF91OwkJCQkJXAorICBnbF91LnZhbHVlID0gKGQpOwkJCQkJCVwKKyAgKGkpID0gZ2xfdS5wYXJ0cy5sc3c7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyogU2V0IGEgZG91YmxlIGZyb20gdHdvIDMyIGJpdCBpbnRzLiAgKi8KKworI2RlZmluZSBJTlNFUlRfV09SRFMoZCxpeDAsaXgxKQkJCQkJXAorZG8gewkJCQkJCQkJXAorICBpZWVlX2RvdWJsZV9zaGFwZV90eXBlIGl3X3U7CQkJCQlcCisgIGl3X3UucGFydHMubXN3ID0gKGl4MCk7CQkJCQlcCisgIGl3X3UucGFydHMubHN3ID0gKGl4MSk7CQkJCQlcCisgIChkKSA9IGl3X3UudmFsdWU7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyogU2V0IHRoZSBtb3JlIHNpZ25pZmljYW50IDMyIGJpdHMgb2YgYSBkb3VibGUgZnJvbSBhbiBpbnQuICAqLworCisjZGVmaW5lIFNFVF9ISUdIX1dPUkQoZCx2KQkJCQkJXAorZG8gewkJCQkJCQkJXAorICBpZWVlX2RvdWJsZV9zaGFwZV90eXBlIHNoX3U7CQkJCQlcCisgIHNoX3UudmFsdWUgPSAoZCk7CQkJCQkJXAorICBzaF91LnBhcnRzLm1zdyA9ICh2KTsJCQkJCQlcCisgIChkKSA9IHNoX3UudmFsdWU7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyogU2V0IHRoZSBsZXNzIHNpZ25pZmljYW50IDMyIGJpdHMgb2YgYSBkb3VibGUgZnJvbSBhbiBpbnQuICAqLworCisjZGVmaW5lIFNFVF9MT1dfV09SRChkLHYpCQkJCQlcCitkbyB7CQkJCQkJCQlcCisgIGllZWVfZG91YmxlX3NoYXBlX3R5cGUgc2xfdTsJCQkJCVwKKyAgc2xfdS52YWx1ZSA9IChkKTsJCQkJCQlcCisgIHNsX3UucGFydHMubHN3ID0gKHYpOwkJCQkJCVwKKyAgKGQpID0gc2xfdS52YWx1ZTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisvKgorICogQSB1bmlvbiB3aGljaCBwZXJtaXRzIHVzIHRvIGNvbnZlcnQgYmV0d2VlbiBhIGZsb2F0IGFuZCBhIDMyIGJpdAorICogaW50LgorICovCisKK3R5cGVkZWYgdW5pb24KK3sKKyAgZmxvYXQgdmFsdWU7CisgIC8qIEZJWE1FOiBBc3N1bWVzIDMyIGJpdCBpbnQuICAqLworICB1bnNpZ25lZCBpbnQgd29yZDsKK30gaWVlZV9mbG9hdF9zaGFwZV90eXBlOworCisvKiBHZXQgYSAzMiBiaXQgaW50IGZyb20gYSBmbG9hdC4gICovCisKKyNkZWZpbmUgR0VUX0ZMT0FUX1dPUkQoaSxkKQkJCQkJXAorZG8gewkJCQkJCQkJXAorICBpZWVlX2Zsb2F0X3NoYXBlX3R5cGUgZ2ZfdTsJCQkJCVwKKyAgZ2ZfdS52YWx1ZSA9IChkKTsJCQkJCQlcCisgIChpKSA9IGdmX3Uud29yZDsJCQkJCQlcCit9IHdoaWxlICgwKQorCisvKiBTZXQgYSBmbG9hdCBmcm9tIGEgMzIgYml0IGludC4gICovCisKKyNkZWZpbmUgU0VUX0ZMT0FUX1dPUkQoZCxpKQkJCQkJXAorZG8gewkJCQkJCQkJXAorICBpZWVlX2Zsb2F0X3NoYXBlX3R5cGUgc2ZfdTsJCQkJCVwKKyAgc2ZfdS53b3JkID0gKGkpOwkJCQkJCVwKKyAgKGQpID0gc2ZfdS52YWx1ZTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisjaWZkZWYgX0NPTVBMRVhfSAorLyoKKyAqIElubGluZSBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25zdHJ1Y3QgY29tcGxleCB2YWx1ZXMuCisgKgorICogVGhlIEM5OSBzdGFuZGFyZCBpbnRlbmRzIHgrSSp5IHRvIGJlIHVzZWQgZm9yIHRoaXMsIGJ1dCB4K0kqeSBpcworICogY3VycmVudGx5IHVudXNhYmxlIGluIGdlbmVyYWwgc2luY2UgZ2NjIGludHJvZHVjZXMgbWFueSBvdmVyZmxvdywKKyAqIHVuZGVyZmxvdywgc2lnbiBhbmQgZWZmaWNpZW5jeSBidWdzIGJ5IHJld3JpdGluZyBJKnkgYXMKKyAqICgwLjArSSkqKHkrMC4wKkkpIGFuZCBsYWJvcmlvdXNseSBjb21wdXRpbmcgdGhlIGZ1bGwgY29tcGxleCBwcm9kdWN0LgorICogSW4gcGFydGljdWxhciwgSSpJbmYgaXMgY29ycnVwdGVkIHRvIE5hTitJKkluZiwgYW5kIEkqLTAgaXMgY29ycnVwdGVkCisgKiB0byAtMC4wK0kqMC4wLgorICovCitzdGF0aWMgX19pbmxpbmUgZmxvYXQgY29tcGxleAorY3BhY2tmKGZsb2F0IHgsIGZsb2F0IHkpCit7CisJZmxvYXQgY29tcGxleCB6OworCisJX19yZWFsX18geiA9IHg7CisJX19pbWFnX18geiA9IHk7CisJcmV0dXJuICh6KTsKK30KKworc3RhdGljIF9faW5saW5lIGRvdWJsZSBjb21wbGV4CitjcGFjayhkb3VibGUgeCwgZG91YmxlIHkpCit7CisJZG91YmxlIGNvbXBsZXggejsKKworCV9fcmVhbF9fIHogPSB4OworCV9faW1hZ19fIHogPSB5OworCXJldHVybiAoeik7Cit9CisKK3N0YXRpYyBfX2lubGluZSBsb25nIGRvdWJsZSBjb21wbGV4CitjcGFja2wobG9uZyBkb3VibGUgeCwgbG9uZyBkb3VibGUgeSkKK3sKKwlsb25nIGRvdWJsZSBjb21wbGV4IHo7CisKKwlfX3JlYWxfXyB6ID0geDsKKwlfX2ltYWdfXyB6ID0geTsKKwlyZXR1cm4gKHopOworfQorI2VuZGlmIC8qIF9DT01QTEVYX0ggKi8KKyAKKy8qCisgKiBpZWVlIHN0eWxlIGVsZW1lbnRhcnkgZnVuY3Rpb25zCisgKgorICogV2UgcmVuYW1lIGZ1bmN0aW9ucyBoZXJlIHRvIGltcHJvdmUgb3RoZXIgc291cmNlcycgZGlmZmFiaWxpdHkKKyAqIGFnYWluc3QgZmRsaWJtLgorICovCisjZGVmaW5lCV9faWVlZTc1NF9zcXJ0CXNxcnQKKyNkZWZpbmUJX19pZWVlNzU0X2Fjb3MJYWNvcworI2RlZmluZQlfX2llZWU3NTRfYWNvc2gJYWNvc2gKKyNkZWZpbmUJX19pZWVlNzU0X2xvZwlsb2cKKyNkZWZpbmUJX19pZWVlNzU0X2F0YW5oCWF0YW5oCisjZGVmaW5lCV9faWVlZTc1NF9hc2luCWFzaW4KKyNkZWZpbmUJX19pZWVlNzU0X2F0YW4yCWF0YW4yCisjZGVmaW5lCV9faWVlZTc1NF9leHAJZXhwCisjZGVmaW5lCV9faWVlZTc1NF9jb3NoCWNvc2gKKyNkZWZpbmUJX19pZWVlNzU0X2Ztb2QJZm1vZAorI2RlZmluZQlfX2llZWU3NTRfcG93CXBvdworI2RlZmluZQlfX2llZWU3NTRfbGdhbW1hIGxnYW1tYQorI2RlZmluZQlfX2llZWU3NTRfZ2FtbWEJZ2FtbWEKKyNkZWZpbmUJX19pZWVlNzU0X2xnYW1tYV9yIGxnYW1tYV9yCisjZGVmaW5lCV9faWVlZTc1NF9nYW1tYV9yIGdhbW1hX3IKKyNkZWZpbmUJX19pZWVlNzU0X2xvZzEwCWxvZzEwCisjZGVmaW5lCV9faWVlZTc1NF9zaW5oCXNpbmgKKyNkZWZpbmUJX19pZWVlNzU0X2h5cG90CWh5cG90CisjZGVmaW5lCV9faWVlZTc1NF9qMAlqMAorI2RlZmluZQlfX2llZWU3NTRfajEJajEKKyNkZWZpbmUJX19pZWVlNzU0X3kwCXkwCisjZGVmaW5lCV9faWVlZTc1NF95MQl5MQorI2RlZmluZQlfX2llZWU3NTRfam4Jam4KKyNkZWZpbmUJX19pZWVlNzU0X3luCXluCisjZGVmaW5lCV9faWVlZTc1NF9yZW1haW5kZXIgcmVtYWluZGVyCisjZGVmaW5lCV9faWVlZTc1NF9zY2FsYglzY2FsYgorI2RlZmluZQlfX2llZWU3NTRfc3FydGYJc3FydGYKKyNkZWZpbmUJX19pZWVlNzU0X2Fjb3NmCWFjb3NmCisjZGVmaW5lCV9faWVlZTc1NF9hY29zaGYgYWNvc2hmCisjZGVmaW5lCV9faWVlZTc1NF9sb2dmCWxvZ2YKKyNkZWZpbmUJX19pZWVlNzU0X2F0YW5oZiBhdGFuaGYKKyNkZWZpbmUJX19pZWVlNzU0X2FzaW5mCWFzaW5mCisjZGVmaW5lCV9faWVlZTc1NF9hdGFuMmYgYXRhbjJmCisjZGVmaW5lCV9faWVlZTc1NF9leHBmCWV4cGYKKyNkZWZpbmUJX19pZWVlNzU0X2Nvc2hmCWNvc2hmCisjZGVmaW5lCV9faWVlZTc1NF9mbW9kZglmbW9kZgorI2RlZmluZQlfX2llZWU3NTRfcG93Zglwb3dmCisjZGVmaW5lCV9faWVlZTc1NF9sZ2FtbWFmIGxnYW1tYWYKKyNkZWZpbmUJX19pZWVlNzU0X2dhbW1hZiBnYW1tYWYKKyNkZWZpbmUJX19pZWVlNzU0X2xnYW1tYWZfciBsZ2FtbWFmX3IKKyNkZWZpbmUJX19pZWVlNzU0X2dhbW1hZl9yIGdhbW1hZl9yCisjZGVmaW5lCV9faWVlZTc1NF9sb2cxMGYgbG9nMTBmCisjZGVmaW5lCV9faWVlZTc1NF9zaW5oZglzaW5oZgorI2RlZmluZQlfX2llZWU3NTRfaHlwb3RmIGh5cG90ZgorI2RlZmluZQlfX2llZWU3NTRfajBmCWowZgorI2RlZmluZQlfX2llZWU3NTRfajFmCWoxZgorI2RlZmluZQlfX2llZWU3NTRfeTBmCXkwZgorI2RlZmluZQlfX2llZWU3NTRfeTFmCXkxZgorI2RlZmluZQlfX2llZWU3NTRfam5mCWpuZgorI2RlZmluZQlfX2llZWU3NTRfeW5mCXluZgorI2RlZmluZQlfX2llZWU3NTRfcmVtYWluZGVyZiByZW1haW5kZXJmCisjZGVmaW5lCV9faWVlZTc1NF9zY2FsYmYgc2NhbGJmCisKKy8qIGZkbGlibSBrZXJuZWwgZnVuY3Rpb24gKi8KK2ludAlfX2llZWU3NTRfcmVtX3BpbzIoZG91YmxlLGRvdWJsZSopOworZG91YmxlCV9fa2VybmVsX3Npbihkb3VibGUsZG91YmxlLGludCk7Citkb3VibGUJX19rZXJuZWxfY29zKGRvdWJsZSxkb3VibGUpOworZG91YmxlCV9fa2VybmVsX3Rhbihkb3VibGUsZG91YmxlLGludCk7CitpbnQJX19rZXJuZWxfcmVtX3BpbzIoZG91YmxlKixkb3VibGUqLGludCxpbnQsaW50LGNvbnN0IGludCopOworCisvKiBmbG9hdCB2ZXJzaW9ucyBvZiBmZGxpYm0ga2VybmVsIGZ1bmN0aW9ucyAqLworaW50CV9faWVlZTc1NF9yZW1fcGlvMmYoZmxvYXQsZmxvYXQqKTsKK2Zsb2F0CV9fa2VybmVsX3NpbmRmKGRvdWJsZSk7CitmbG9hdAlfX2tlcm5lbF9jb3NkZihkb3VibGUpOworZmxvYXQJX19rZXJuZWxfdGFuZGYoZG91YmxlLGludCk7CitpbnQJX19rZXJuZWxfcmVtX3BpbzJmKGZsb2F0KixmbG9hdCosaW50LGludCxpbnQsY29uc3QgaW50Kik7CisKKyNlbmRpZiAvKiAhX01BVEhfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19hc2luaC5jIGIvbGlibS9zcmMvc19hc2luaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OTAwN2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2FzaW5oLmMKQEAgLTAsMCArMSw1NyBAQAorLyogQCgjKXNfYXNpbmguYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfYXNpbmguYyx2IDEuOCAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworLyogYXNpbmgoeCkKKyAqIE1ldGhvZCA6CisgKglCYXNlZCBvbgorICoJCWFzaW5oKHgpID0gc2lnbih4KSAqIGxvZyBbIHx4fCArIHNxcnQoeCp4KzEpIF0KKyAqCXdlIGhhdmUKKyAqCWFzaW5oKHgpIDo9IHggIGlmICAxK3gqeD0xLAorICoJCSA6PSBzaWduKHgpKihsb2coeCkrbG4yKSkgZm9yIGxhcmdlIHx4fCwgZWxzZQorICoJCSA6PSBzaWduKHgpKmxvZygyfHh8KzEvKHx4fCtzcXJ0KHgqeCsxKSkpIGlmfHh8PjIsIGVsc2UKKyAqCQkgOj0gc2lnbih4KSpsb2cxcCh8eHwgKyB4XjIvKDEgKyBzcXJ0KDEreF4yKSkpCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQorb25lID0gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwLCAvKiAweDNGRjAwMDAwLCAweDAwMDAwMDAwICovCitsbjIgPSAgNi45MzE0NzE4MDU1OTk0NTI4NjIyN2UtMDEsIC8qIDB4M0ZFNjJFNDIsIDB4RkVGQTM5RUYgKi8KK2h1Z2U9ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSszMDA7CisKK2RvdWJsZQorYXNpbmgoZG91YmxlIHgpCit7CisJZG91YmxlIHQsdzsKKwlpbnQzMl90IGh4LGl4OworCUdFVF9ISUdIX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmKGl4Pj0weDdmZjAwMDAwKSByZXR1cm4geCt4OwkvKiB4IGlzIGluZiBvciBOYU4gKi8KKwlpZihpeDwgMHgzZTMwMDAwMCkgewkvKiB8eHw8MioqLTI4ICovCisJICAgIGlmKGh1Z2UreD5vbmUpIHJldHVybiB4OwkvKiByZXR1cm4geCBpbmV4YWN0IGV4Y2VwdCAwICovCisJfQorCWlmKGl4PjB4NDFiMDAwMDApIHsJLyogfHh8ID4gMioqMjggKi8KKwkgICAgdyA9IF9faWVlZTc1NF9sb2coZmFicyh4KSkrbG4yOworCX0gZWxzZSBpZiAoaXg+MHg0MDAwMDAwMCkgewkvKiAyKioyOCA+IHx4fCA+IDIuMCAqLworCSAgICB0ID0gZmFicyh4KTsKKwkgICAgdyA9IF9faWVlZTc1NF9sb2coMi4wKnQrb25lLyhfX2llZWU3NTRfc3FydCh4Kngrb25lKSt0KSk7CisJfSBlbHNlIHsJCS8qIDIuMCA+IHx4fCA+IDIqKi0yOCAqLworCSAgICB0ID0geCp4OworCSAgICB3ID1sb2cxcChmYWJzKHgpK3QvKG9uZStfX2llZWU3NTRfc3FydChvbmUrdCkpKTsKKwl9CisJaWYoaHg+MCkgcmV0dXJuIHc7IGVsc2UgcmV0dXJuIC13OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19hc2luaGYuYyBiL2xpYm0vc3JjL3NfYXNpbmhmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNkYzc5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfYXNpbmhmLmMKQEAgLTAsMCArMSw0OSBAQAorLyogc19hc2luaGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfYXNpbmguYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfYXNpbmhmLmMsdiAxLjggMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdAorb25lID0gIDEuMDAwMDAwMDAwMGUrMDAsIC8qIDB4M0Y4MDAwMDAgKi8KK2xuMiA9ICA2LjkzMTQ3MTgyNDZlLTAxLCAvKiAweDNmMzE3MjE4ICovCitodWdlPSAgMS4wMDAwMDAwMDAwZSszMDsKKworZmxvYXQKK2FzaW5oZihmbG9hdCB4KQoreworCWZsb2F0IHQsdzsKKwlpbnQzMl90IGh4LGl4OworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg3ZjgwMDAwMCkgcmV0dXJuIHgreDsJLyogeCBpcyBpbmYgb3IgTmFOICovCisJaWYoaXg8IDB4MzE4MDAwMDApIHsJLyogfHh8PDIqKi0yOCAqLworCSAgICBpZihodWdlK3g+b25lKSByZXR1cm4geDsJLyogcmV0dXJuIHggaW5leGFjdCBleGNlcHQgMCAqLworCX0KKwlpZihpeD4weDRkODAwMDAwKSB7CS8qIHx4fCA+IDIqKjI4ICovCisJICAgIHcgPSBfX2llZWU3NTRfbG9nZihmYWJzZih4KSkrbG4yOworCX0gZWxzZSBpZiAoaXg+MHg0MDAwMDAwMCkgewkvKiAyKioyOCA+IHx4fCA+IDIuMCAqLworCSAgICB0ID0gZmFic2YoeCk7CisJICAgIHcgPSBfX2llZWU3NTRfbG9nZigoZmxvYXQpMi4wKnQrb25lLyhfX2llZWU3NTRfc3FydGYoeCp4K29uZSkrdCkpOworCX0gZWxzZSB7CQkvKiAyLjAgPiB8eHwgPiAyKiotMjggKi8KKwkgICAgdCA9IHgqeDsKKwkgICAgdyA9bG9nMXBmKGZhYnNmKHgpK3QvKG9uZStfX2llZWU3NTRfc3FydGYob25lK3QpKSk7CisJfQorCWlmKGh4PjApIHJldHVybiB3OyBlbHNlIHJldHVybiAtdzsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfYXRhbi5jIGIvbGlibS9zcmMvc19hdGFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkN2FhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfYXRhbi5jCkBAIC0wLDAgKzEsMTE5IEBACisvKiBAKCMpc19hdGFuLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2F0YW4uYyx2IDEuOSAyMDAzLzA3LzIzIDA0OjUzOjQ2IHBldGVyIEV4cCAkIjsKKyNlbmRpZgorCisvKiBhdGFuKHgpCisgKiBNZXRob2QKKyAqICAgMS4gUmVkdWNlIHggdG8gcG9zaXRpdmUgYnkgYXRhbih4KSA9IC1hdGFuKC14KS4KKyAqICAgMi4gQWNjb3JkaW5nIHRvIHRoZSBpbnRlZ2VyIGs9NHQrMC4yNSBjaG9wcGVkLCB0PXgsIHRoZSBhcmd1bWVudAorICogICAgICBpcyBmdXJ0aGVyIHJlZHVjZWQgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgaW50ZXJ2YWxzIGFuZCB0aGUKKyAqICAgICAgYXJjdGFuZ2VudCBvZiB0IGlzIGV2YWx1YXRlZCBieSB0aGUgY29ycmVzcG9uZGluZyBmb3JtdWxhOgorICoKKyAqICAgICAgWzAsNy8xNl0gICAgICBhdGFuKHgpID0gdC10XjMqKGExK3ReMiooYTIrLi4uKGExMCt0XjIqYTExKS4uLikKKyAqICAgICAgWzcvMTYsMTEvMTZdICBhdGFuKHgpID0gYXRhbigxLzIpICsgYXRhbiggKHQtMC41KS8oMSt0LzIpICkKKyAqICAgICAgWzExLzE2LjE5LzE2XSBhdGFuKHgpID0gYXRhbiggMSApICsgYXRhbiggKHQtMSkvKDErdCkgKQorICogICAgICBbMTkvMTYsMzkvMTZdIGF0YW4oeCkgPSBhdGFuKDMvMikgKyBhdGFuKCAodC0xLjUpLygxKzEuNXQpICkKKyAqICAgICAgWzM5LzE2LElORl0gICBhdGFuKHgpID0gYXRhbihJTkYpICsgYXRhbiggLTEvdCApCisgKgorICogQ29uc3RhbnRzOgorICogVGhlIGhleGFkZWNpbWFsIHZhbHVlcyBhcmUgdGhlIGludGVuZGVkIG9uZXMgZm9yIHRoZSBmb2xsb3dpbmcKKyAqIGNvbnN0YW50cy4gVGhlIGRlY2ltYWwgdmFsdWVzIG1heSBiZSB1c2VkLCBwcm92aWRlZCB0aGF0IHRoZQorICogY29tcGlsZXIgd2lsbCBjb252ZXJ0IGZyb20gZGVjaW1hbCB0byBiaW5hcnkgYWNjdXJhdGVseSBlbm91Z2gKKyAqIHRvIHByb2R1Y2UgdGhlIGhleGFkZWNpbWFsIHZhbHVlcyBzaG93bi4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlIGF0YW5oaVtdID0geworICA0LjYzNjQ3NjA5MDAwODA2MDkzNTE1ZS0wMSwgLyogYXRhbigwLjUpaGkgMHgzRkREQUM2NywgMHgwNTYxQkI0RiAqLworICA3Ljg1Mzk4MTYzMzk3NDQ4Mjc4OTk5ZS0wMSwgLyogYXRhbigxLjApaGkgMHgzRkU5MjFGQiwgMHg1NDQ0MkQxOCAqLworICA5LjgyNzkzNzIzMjQ3MzI5MDU0MDgyZS0wMSwgLyogYXRhbigxLjUpaGkgMHgzRkVGNzMwQiwgMHhEMjgxRjY5QiAqLworICAxLjU3MDc5NjMyNjc5NDg5NjU1ODAwZSswMCwgLyogYXRhbihpbmYpaGkgMHgzRkY5MjFGQiwgMHg1NDQ0MkQxOCAqLworfTsKKworc3RhdGljIGNvbnN0IGRvdWJsZSBhdGFubG9bXSA9IHsKKyAgMi4yNjk4Nzc3NDUyOTYxNjg3MDkyNGUtMTcsIC8qIGF0YW4oMC41KWxvIDB4M0M3QTJCN0YsIDB4MjIyRjY1RTIgKi8KKyAgMy4wNjE2MTY5OTc4NjgzODMwMTc5M2UtMTcsIC8qIGF0YW4oMS4wKWxvIDB4M0M4MUE2MjYsIDB4MzMxNDVDMDcgKi8KKyAgMS4zOTAzMzExMDMxMjMwOTk4NDUxNmUtMTcsIC8qIGF0YW4oMS41KWxvIDB4M0M3MDA3ODgsIDB4N0FGMENCQkQgKi8KKyAgNi4xMjMyMzM5OTU3MzY3NjYwMzU4N2UtMTcsIC8qIGF0YW4oaW5mKWxvIDB4M0M5MUE2MjYsIDB4MzMxNDVDMDcgKi8KK307CisKK3N0YXRpYyBjb25zdCBkb3VibGUgYVRbXSA9IHsKKyAgMy4zMzMzMzMzMzMzMzMyOTMxODAyN2UtMDEsIC8qIDB4M0ZENTU1NTUsIDB4NTU1NTU1MEQgKi8KKyAtMS45OTk5OTk5OTk5ODc2NDgzMjQ3NmUtMDEsIC8qIDB4QkZDOTk5OTksIDB4OTk5OEVCQzQgKi8KKyAgMS40Mjg1NzE0MjcyNTAzNDY2MzcxMWUtMDEsIC8qIDB4M0ZDMjQ5MjQsIDB4OTIwMDgzRkYgKi8KKyAtMS4xMTExMTEwNDA1NDYyMzU1Nzg4MGUtMDEsIC8qIDB4QkZCQzcxQzYsIDB4RkUyMzE2NzEgKi8KKyAgOS4wOTA4ODcxMzM0MzY1MDY1NjE5NmUtMDIsIC8qIDB4M0ZCNzQ1Q0QsIDB4QzU0QzIwNkUgKi8KKyAtNy42OTE4NzYyMDUwNDQ4Mjk5OTQ5NWUtMDIsIC8qIDB4QkZCM0IwRjIsIDB4QUY3NDlBNkQgKi8KKyAgNi42NjEwNzMxMzczODc1MzEyMDY2OWUtMDIsIC8qIDB4M0ZCMTBENjYsIDB4QTBEMDNENTEgKi8KKyAtNS44MzM1NzAxMzM3OTA1NzM0ODY0NWUtMDIsIC8qIDB4QkZBRERFMkQsIDB4NTJERUZEOUEgKi8KKyAgNC45NzY4Nzc5OTQ2MTU5MzIzNjAxN2UtMDIsIC8qIDB4M0ZBOTdCNEIsIDB4MjQ3NjBERUIgKi8KKyAtMy42NTMxNTcyNzQ0MjE2OTE1NTI3MGUtMDIsIC8qIDB4QkZBMkI0NDQsIDB4MkM2QTZDMkYgKi8KKyAgMS42Mjg1ODIwMTE1MzY1NzgyMzYyM2UtMDIsIC8qIDB4M0Y5MEFEM0EsIDB4RTMyMkRBMTEgKi8KK307CisKKwlzdGF0aWMgY29uc3QgZG91YmxlCitvbmUgICA9IDEuMCwKK2h1Z2UgICA9IDEuMGUzMDA7CisKK2RvdWJsZQorYXRhbihkb3VibGUgeCkKK3sKKwlkb3VibGUgdyxzMSxzMix6OworCWludDMyX3QgaXgsaHgsaWQ7CisKKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg0NDEwMDAwMCkgewkvKiBpZiB8eHwgPj0gMl42NiAqLworCSAgICB1X2ludDMyX3QgbG93OworCSAgICBHRVRfTE9XX1dPUkQobG93LHgpOworCSAgICBpZihpeD4weDdmZjAwMDAwfHwKKwkJKGl4PT0weDdmZjAwMDAwJiYobG93IT0wKSkpCisJCXJldHVybiB4K3g7CQkvKiBOYU4gKi8KKwkgICAgaWYoaHg+MCkgcmV0dXJuICBhdGFuaGlbM10rYXRhbmxvWzNdOworCSAgICBlbHNlICAgICByZXR1cm4gLWF0YW5oaVszXS1hdGFubG9bM107CisJfSBpZiAoaXggPCAweDNmZGMwMDAwKSB7CS8qIHx4fCA8IDAuNDM3NSAqLworCSAgICBpZiAoaXggPCAweDNlMjAwMDAwKSB7CS8qIHx4fCA8IDJeLTI5ICovCisJCWlmKGh1Z2UreD5vbmUpIHJldHVybiB4OwkvKiByYWlzZSBpbmV4YWN0ICovCisJICAgIH0KKwkgICAgaWQgPSAtMTsKKwl9IGVsc2UgeworCXggPSBmYWJzKHgpOworCWlmIChpeCA8IDB4M2ZmMzAwMDApIHsJCS8qIHx4fCA8IDEuMTg3NSAqLworCSAgICBpZiAoaXggPCAweDNmZTYwMDAwKSB7CS8qIDcvMTYgPD18eHw8MTEvMTYgKi8KKwkJaWQgPSAwOyB4ID0gKDIuMCp4LW9uZSkvKDIuMCt4KTsKKwkgICAgfSBlbHNlIHsJCQkvKiAxMS8xNjw9fHh8PCAxOS8xNiAqLworCQlpZCA9IDE7IHggID0gKHgtb25lKS8oeCtvbmUpOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgaWYgKGl4IDwgMHg0MDAzODAwMCkgewkvKiB8eHwgPCAyLjQzNzUgKi8KKwkJaWQgPSAyOyB4ICA9ICh4LTEuNSkvKG9uZSsxLjUqeCk7CisJICAgIH0gZWxzZSB7CQkJLyogMi40Mzc1IDw9IHx4fCA8IDJeNjYgKi8KKwkJaWQgPSAzOyB4ICA9IC0xLjAveDsKKwkgICAgfQorCX19CisgICAgLyogZW5kIG9mIGFyZ3VtZW50IHJlZHVjdGlvbiAqLworCXogPSB4Kng7CisJdyA9IHoqejsKKyAgICAvKiBicmVhayBzdW0gZnJvbSBpPTAgdG8gMTAgYVRbaV16KiooaSsxKSBpbnRvIG9kZCBhbmQgZXZlbiBwb2x5ICovCisJczEgPSB6KihhVFswXSt3KihhVFsyXSt3KihhVFs0XSt3KihhVFs2XSt3KihhVFs4XSt3KmFUWzEwXSkpKSkpOworCXMyID0gdyooYVRbMV0rdyooYVRbM10rdyooYVRbNV0rdyooYVRbN10rdyphVFs5XSkpKSk7CisJaWYgKGlkPDApIHJldHVybiB4IC0geCooczErczIpOworCWVsc2UgeworCSAgICB6ID0gYXRhbmhpW2lkXSAtICgoeCooczErczIpIC0gYXRhbmxvW2lkXSkgLSB4KTsKKwkgICAgcmV0dXJuIChoeDwwKT8gLXo6ejsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2F0YW5mLmMgYi9saWJtL3NyYy9zX2F0YW5mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkwYjM1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfYXRhbmYuYwpAQCAtMCwwICsxLDk5IEBACisvKiBzX2F0YW5mLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2F0YW4uYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfYXRhbmYuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0IGF0YW5oaVtdID0geworICA0LjYzNjQ3NjAzOTllLTAxLCAvKiBhdGFuKDAuNSloaSAweDNlZWQ2MzM4ICovCisgIDcuODUzOTgxMjU2NWUtMDEsIC8qIGF0YW4oMS4wKWhpIDB4M2Y0OTBmZGEgKi8KKyAgOS44Mjc5MzY4ODc3ZS0wMSwgLyogYXRhbigxLjUpaGkgMHgzZjdiOTg1ZSAqLworICAxLjU3MDc5NjI1MTNlKzAwLCAvKiBhdGFuKGluZiloaSAweDNmYzkwZmRhICovCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgYXRhbmxvW10gPSB7CisgIDUuMDEyMTU4MjQ0MGUtMDksIC8qIGF0YW4oMC41KWxvIDB4MzFhYzM3NjkgKi8KKyAgMy43NzQ4OTQ3MDc5ZS0wOCwgLyogYXRhbigxLjApbG8gMHgzMzIyMjE2OCAqLworICAzLjQ0NzMyMTcxNzBlLTA4LCAvKiBhdGFuKDEuNSlsbyAweDMzMTQwZmI0ICovCisgIDcuNTQ5Nzg5NDE1OWUtMDgsIC8qIGF0YW4oaW5mKWxvIDB4MzNhMjIxNjggKi8KK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBhVFtdID0geworICAzLjMzMzMzMzQzMjdlLTAxLCAvKiAweDNlYWFhYWFhICovCisgLTIuMDAwMDAwMDI5OGUtMDEsIC8qIDB4YmU0Y2NjY2QgKi8KKyAgMS40Mjg1NzE0OTI0ZS0wMSwgLyogMHgzZTEyNDkyNSAqLworIC0xLjExMTExMTA0NDllLTAxLCAvKiAweGJkZTM4ZTM4ICovCisgIDkuMDkwODg3MDEwMWUtMDIsIC8qIDB4M2RiYTJlNmUgKi8KKyAtNy42OTE4NzU4NDUyZS0wMiwgLyogMHhiZDlkODc5NSAqLworICA2LjY2MTA3MzExODRlLTAyLCAvKiAweDNkODg2YjM1ICovCisgLTUuODMzNTcwMjg2NmUtMDIsIC8qIDB4YmQ2ZWYxNmIgKi8KKyAgNC45NzY4Nzc5NDI3ZS0wMiwgLyogMHgzZDRiZGE1OSAqLworIC0zLjY1MzE1NzEyOTllLTAyLCAvKiAweGJkMTVhMjIxICovCisgIDEuNjI4NTgxOTkzM2UtMDIsIC8qIDB4M2M4NTY5ZDcgKi8KK307CisKKwlzdGF0aWMgY29uc3QgZmxvYXQKK29uZSAgID0gMS4wLAoraHVnZSAgID0gMS4wZTMwOworCitmbG9hdAorYXRhbmYoZmxvYXQgeCkKK3sKKwlmbG9hdCB3LHMxLHMyLHo7CisJaW50MzJfdCBpeCxoeCxpZDsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg1MDgwMDAwMCkgewkvKiBpZiB8eHwgPj0gMl4zNCAqLworCSAgICBpZihpeD4weDdmODAwMDAwKQorCQlyZXR1cm4geCt4OwkJLyogTmFOICovCisJICAgIGlmKGh4PjApIHJldHVybiAgYXRhbmhpWzNdK2F0YW5sb1szXTsKKwkgICAgZWxzZSAgICAgcmV0dXJuIC1hdGFuaGlbM10tYXRhbmxvWzNdOworCX0gaWYgKGl4IDwgMHgzZWUwMDAwMCkgewkvKiB8eHwgPCAwLjQzNzUgKi8KKwkgICAgaWYgKGl4IDwgMHgzMTAwMDAwMCkgewkvKiB8eHwgPCAyXi0yOSAqLworCQlpZihodWdlK3g+b25lKSByZXR1cm4geDsJLyogcmFpc2UgaW5leGFjdCAqLworCSAgICB9CisJICAgIGlkID0gLTE7CisJfSBlbHNlIHsKKwl4ID0gZmFic2YoeCk7CisJaWYgKGl4IDwgMHgzZjk4MDAwMCkgewkJLyogfHh8IDwgMS4xODc1ICovCisJICAgIGlmIChpeCA8IDB4M2YzMDAwMDApIHsJLyogNy8xNiA8PXx4fDwxMS8xNiAqLworCQlpZCA9IDA7IHggPSAoKGZsb2F0KTIuMCp4LW9uZSkvKChmbG9hdCkyLjAreCk7CisJICAgIH0gZWxzZSB7CQkJLyogMTEvMTY8PXx4fDwgMTkvMTYgKi8KKwkJaWQgPSAxOyB4ICA9ICh4LW9uZSkvKHgrb25lKTsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGlmIChpeCA8IDB4NDAxYzAwMDApIHsJLyogfHh8IDwgMi40Mzc1ICovCisJCWlkID0gMjsgeCAgPSAoeC0oZmxvYXQpMS41KS8ob25lKyhmbG9hdCkxLjUqeCk7CisJICAgIH0gZWxzZSB7CQkJLyogMi40Mzc1IDw9IHx4fCA8IDJeNjYgKi8KKwkJaWQgPSAzOyB4ICA9IC0oZmxvYXQpMS4wL3g7CisJICAgIH0KKwl9fQorICAgIC8qIGVuZCBvZiBhcmd1bWVudCByZWR1Y3Rpb24gKi8KKwl6ID0geCp4OworCXcgPSB6Kno7CisgICAgLyogYnJlYWsgc3VtIGZyb20gaT0wIHRvIDEwIGFUW2ldeioqKGkrMSkgaW50byBvZGQgYW5kIGV2ZW4gcG9seSAqLworCXMxID0geiooYVRbMF0rdyooYVRbMl0rdyooYVRbNF0rdyooYVRbNl0rdyooYVRbOF0rdyphVFsxMF0pKSkpKTsKKwlzMiA9IHcqKGFUWzFdK3cqKGFUWzNdK3cqKGFUWzVdK3cqKGFUWzddK3cqYVRbOV0pKSkpOworCWlmIChpZDwwKSByZXR1cm4geCAtIHgqKHMxK3MyKTsKKwllbHNlIHsKKwkgICAgeiA9IGF0YW5oaVtpZF0gLSAoKHgqKHMxK3MyKSAtIGF0YW5sb1tpZF0pIC0geCk7CisJICAgIHJldHVybiAoaHg8MCk/IC16Ono7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jYnJ0LmMgYi9saWJtL3NyYy9zX2NicnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjAwNjc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jYnJ0LmMKQEAgLTAsMCArMSw5MiBAQAorLyogQCgjKXNfY2JydC5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBPcHRpbWl6ZWQgYnkgQnJ1Y2UgRC4gRXZhbnMuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY2JydC5jLHYgMS4xMCAyMDA1LzEyLzEzIDIwOjE3OjIzIGJkZSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworLyogY2JydCh4KQorICogUmV0dXJuIGN1YmUgcm9vdCBvZiB4CisgKi8KK3N0YXRpYyBjb25zdCB1X2ludDMyX3QKKwlCMSA9IDcxNTA5NDE2MywgLyogQjEgPSAoMTAyMy0xMDIzLzMtMC4wMzMwNjIzNTY1MSkqMioqMjAgKi8KKwlCMiA9IDY5NjIxOTc5NTsgLyogQjIgPSAoMTAyMy0xMDIzLzMtNTQvMy0wLjAzMzA2MjM1NjUxKSoyKioyMCAqLworCitzdGF0aWMgY29uc3QgZG91YmxlCitDID0gIDUuNDI4NTcxNDI4NTcxNDI4MTU5MDZlLTAxLCAvKiAxOS8zNSAgICAgPSAweDNGRTE1RjE1LCAweEYxNUYxNUYxICovCitEID0gLTcuMDUzMDYxMjI0NDg5Nzk2MTEwNTBlLTAxLCAvKiAtODY0LzEyMjUgPSAweEJGRTY5MURFLCAweDI1MzJDODM0ICovCitFID0gIDEuNDE0Mjg1NzE0Mjg1NzE0MzY4MTllKzAwLCAvKiA5OS83MCAgICAgPSAweDNGRjZBMEVBLCAweDBFQTBFQTBGICovCitGID0gIDEuNjA3MTQyODU3MTQyODU3MjA2MzBlKzAwLCAvKiA0NS8yOCAgICAgPSAweDNGRjlCNkRCLCAweDZEQjZEQjZFICovCitHID0gIDMuNTcxNDI4NTcxNDI4NTcxNTA3ODdlLTAxOyAvKiA1LzE0ICAgICAgPSAweDNGRDZEQjZELCAweEI2REI2REI3ICovCisKK2RvdWJsZQorY2JydChkb3VibGUgeCkKK3sKKwlpbnQzMl90CWh4OworCWRvdWJsZSByLHMsdD0wLjAsdzsKKwl1X2ludDMyX3Qgc2lnbjsKKwl1X2ludDMyX3QgaGlnaCxsb3c7CisKKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCXNpZ249aHgmMHg4MDAwMDAwMDsgCQkvKiBzaWduPSBzaWduKHgpICovCisJaHggIF49c2lnbjsKKwlpZihoeD49MHg3ZmYwMDAwMCkgcmV0dXJuKHgreCk7IC8qIGNicnQoTmFOLElORikgaXMgaXRzZWxmICovCisJR0VUX0xPV19XT1JEKGxvdyx4KTsKKwlpZigoaHh8bG93KT09MCkKKwkgICAgcmV0dXJuKHgpOwkJLyogY2JydCgwKSBpcyBpdHNlbGYgKi8KKworICAgIC8qCisgICAgICogUm91Z2ggY2JydCB0byA1IGJpdHM6CisgICAgICogICAgY2JydCgyKiplKigxK20pIH49IDIqKihlLzMpKigxKyhlJTMrbSkvMykKKyAgICAgKiB3aGVyZSBlIGlzIGludGVncmFsIGFuZCA+PSAwLCBtIGlzIHJlYWwgYW5kIGluIFswLCAxKSwgYW5kICIvIiBhbmQKKyAgICAgKiAiJSIgYXJlIGludGVnZXIgZGl2aXNpb24gYW5kIG1vZHVsdXMgd2l0aCByb3VuZGluZyB0b3dhcmRzIG1pbnVzCisgICAgICogaW5maW5pdHkuICBUaGUgUkhTIGlzIGFsd2F5cyA+PSB0aGUgTEhTIGFuZCBoYXMgYSBtYXhpbXVtIHJlbGF0aXZlCisgICAgICogZXJyb3Igb2YgYWJvdXQgMSBpbiAxNi4gIEFkZGluZyBhIGJpYXMgb2YgLTAuMDMzMDYyMzU2NTEgdG8gdGhlCisgICAgICogKGUlMyttKS8zIHRlcm0gcmVkdWNlcyB0aGUgZXJyb3IgdG8gYWJvdXQgMSBpbiAzMi4gV2l0aCB0aGUgSUVFRQorICAgICAqIGZsb2F0aW5nIHBvaW50IHJlcHJlc2VudGF0aW9uLCBmb3IgZmluaXRlIHBvc2l0aXZlIG5vcm1hbCB2YWx1ZXMsCisgICAgICogb3JkaW5hcnkgaW50ZWdlciBkaXZpc29uIG9mIHRoZSB2YWx1ZSBpbiBiaXRzIG1hZ2ljYWxseSBnaXZlcworICAgICAqIGFsbW9zdCBleGFjdGx5IHRoZSBSSFMgb2YgdGhlIGFib3ZlIHByb3ZpZGVkIHdlIGZpcnN0IHN1YnRyYWN0IHRoZQorICAgICAqIGV4cG9uZW50IGJpYXMgKDEwMjMgZm9yIGRvdWJsZXMpIGFuZCBsYXRlciBhZGQgaXQgYmFjay4gIFdlIGRvIHRoZQorICAgICAqIHN1YnRyYWN0aW9uIHZpcnR1YWxseSB0byBrZWVwIGUgPj0gMCBzbyB0aGF0IG9yZGluYXJ5IGludGVnZXIKKyAgICAgKiBkaXZpc2lvbiByb3VuZHMgdG93YXJkcyBtaW51cyBpbmZpbml0eTsgdGhpcyBpcyBhbHNvIGVmZmljaWVudC4KKyAgICAgKi8KKwlpZihoeDwweDAwMTAwMDAwKSB7IAkJLyogc3Vibm9ybWFsIG51bWJlciAqLworCSAgICBTRVRfSElHSF9XT1JEKHQsMHg0MzUwMDAwMCk7IC8qIHNldCB0PSAyKio1NCAqLworCSAgICB0Kj14OworCSAgICBHRVRfSElHSF9XT1JEKGhpZ2gsdCk7CisJICAgIFNFVF9ISUdIX1dPUkQodCxzaWdufCgoaGlnaCYweDdmZmZmZmZmKS8zK0IyKSk7CisJfSBlbHNlCisJICAgIFNFVF9ISUdIX1dPUkQodCxzaWdufChoeC8zK0IxKSk7CisKKyAgICAvKiBuZXcgY2JydCB0byAyMyBiaXRzOyBtYXkgYmUgaW1wbGVtZW50ZWQgaW4gc2luZ2xlIHByZWNpc2lvbiAqLworCXI9dCp0L3g7CisJcz1DK3IqdDsKKwl0Kj1HK0YvKHMrRStEL3MpOworCisgICAgLyogY2hvcCB0IHRvIDIwIGJpdHMgYW5kIG1ha2UgaXQgbGFyZ2VyIGluIG1hZ25pdHVkZSB0aGFuIGNicnQoeCkgKi8KKwlHRVRfSElHSF9XT1JEKGhpZ2gsdCk7CisJSU5TRVJUX1dPUkRTKHQsaGlnaCsweDAwMDAwMDAxLDApOworCisgICAgLyogb25lIHN0ZXAgTmV3dG9uIGl0ZXJhdGlvbiB0byA1MyBiaXRzIHdpdGggZXJyb3IgbGVzcyB0aGFuIDAuNjY3IHVscHMgKi8KKwlzPXQqdDsJCS8qIHQqdCBpcyBleGFjdCAqLworCXI9eC9zOworCXc9dCt0OworCXI9KHItdCkvKHcrcik7CS8qIHItdCBpcyBleGFjdCAqLworCXQ9dCt0KnI7CisKKwlyZXR1cm4odCk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NicnRmLmMgYi9saWJtL3NyYy9zX2NicnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1NjlhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY2JydGYuYwpAQCAtMCwwICsxLDc5IEBACisvKiBzX2NicnRmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2NicnQuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICogRGVidWdnZWQgYW5kIG9wdGltaXplZCBieSBCcnVjZSBELiBFdmFucy4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NicnRmLmMsdiAxLjEyIDIwMDUvMTIvMTMgMjA6MTc6MjMgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisvKiBjYnJ0Zih4KQorICogUmV0dXJuIGN1YmUgcm9vdCBvZiB4CisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZAorCUIxID0gNzA5OTU4MTMwLCAvKiBCMSA9ICgxMjctMTI3LjAvMy0wLjAzMzA2MjM1NjUxKSoyKioyMyAqLworCUIyID0gNjQyODQ5MjY2OyAvKiBCMiA9ICgxMjctMTI3LjAvMy0yNC8zLTAuMDMzMDYyMzU2NTEpKjIqKjIzICovCisKK3N0YXRpYyBjb25zdCBmbG9hdAorQyA9ICA1LjQyODU3MTcwMTBlLTAxLCAvKiAxOS8zNSAgICAgPSAweDNmMGFmOGIwICovCitEID0gLTcuMDUzMDYxMTI3N2UtMDEsIC8qIC04NjQvMTIyNSA9IDB4YmYzNDhlZjEgKi8KK0UgPSAgMS40MTQyODU2NTk4ZSswMCwgLyogOTkvNzAgICAgID0gMHgzZmI1MDc1MCAqLworRiA9ICAxLjYwNzE0MjgwNjFlKzAwLCAvKiA0NS8yOCAgICAgPSAweDNmY2RiNmRiICovCitHID0gIDMuNTcxNDI4NjU2NmUtMDE7IC8qIDUvMTQgICAgICA9IDB4M2ViNmRiNmUgKi8KKworZmxvYXQKK2NicnRmKGZsb2F0IHgpCit7CisJZmxvYXQgcixzLHQsdzsKKwlpbnQzMl90IGh4OworCXVfaW50MzJfdCBzaWduOworCXVfaW50MzJfdCBoaWdoOworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJc2lnbj1oeCYweDgwMDAwMDAwOyAJCS8qIHNpZ249IHNpZ24oeCkgKi8KKwloeCAgXj1zaWduOworCWlmKGh4Pj0weDdmODAwMDAwKSByZXR1cm4oeCt4KTsgLyogY2JydChOYU4sSU5GKSBpcyBpdHNlbGYgKi8KKwlpZihoeD09MCkKKwkgICAgcmV0dXJuKHgpOwkJLyogY2JydCgwKSBpcyBpdHNlbGYgKi8KKworICAgIC8qIHJvdWdoIGNicnQgdG8gNSBiaXRzICovCisJaWYoaHg8MHgwMDgwMDAwMCkgeyAJCS8qIHN1Ym5vcm1hbCBudW1iZXIgKi8KKwkgICAgU0VUX0ZMT0FUX1dPUkQodCwweDRiODAwMDAwKTsgLyogc2V0IHQ9IDIqKjI0ICovCisJICAgIHQqPXg7CisJICAgIEdFVF9GTE9BVF9XT1JEKGhpZ2gsdCk7CisJICAgIFNFVF9GTE9BVF9XT1JEKHQsc2lnbnwoKGhpZ2gmMHg3ZmZmZmZmZikvMytCMikpOworCX0gZWxzZQorCSAgICBTRVRfRkxPQVRfV09SRCh0LHNpZ258KGh4LzMrQjEpKTsKKworICAgIC8qIG5ldyBjYnJ0IHRvIDIzIGJpdHMgKi8KKwlyPXQqdC94OworCXM9QytyKnQ7CisJdCo9RytGLyhzK0UrRC9zKTsKKworICAgIC8qIGNob3AgdCB0byAxMiBiaXRzIGFuZCBtYWtlIGl0IGxhcmdlciBpbiBtYWduaXR1ZGUgdGhhbiBjYnJ0KHgpICovCisJR0VUX0ZMT0FUX1dPUkQoaGlnaCx0KTsKKwlTRVRfRkxPQVRfV09SRCh0LChoaWdoJjB4ZmZmZmYwMDApKzB4MDAwMDEwMDApOworCisgICAgLyogb25lIHN0ZXAgTmV3dG9uIGl0ZXJhdGlvbiB0byAyNCBiaXRzIHdpdGggZXJyb3IgbGVzcyB0aGFuIDAuNjY3IHVscHMgKi8KKwlzPXQqdDsJCS8qIHQqdCBpcyBleGFjdCAqLworCXI9eC9zOworCXc9dCt0OworCXI9KHItdCkvKHcrcik7CS8qIHItdCBpcyBleGFjdCAqLworCXQ9dCt0KnI7CisKKwlyZXR1cm4odCk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NlaWwuYyBiL2xpYm0vc3JjL3NfY2VpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NDQwZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NlaWwuYwpAQCAtMCwwICsxLDcyIEBACisvKiBAKCMpc19jZWlsLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NlaWwuYyx2IDEuOSAyMDAzLzA3LzIzIDA0OjUzOjQ2IHBldGVyIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogY2VpbCh4KQorICogUmV0dXJuIHggcm91bmRlZCB0b3dhcmQgLWluZiB0byBpbnRlZ3JhbCB2YWx1ZQorICogTWV0aG9kOgorICoJQml0IHR3aWRkbGluZy4KKyAqIEV4Y2VwdGlvbjoKKyAqCUluZXhhY3QgZmxhZyByYWlzZWQgaWYgeCBub3QgZXF1YWwgdG8gY2VpbCh4KS4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlIGh1Z2UgPSAxLjBlMzAwOworCitkb3VibGUKK2NlaWwoZG91YmxlIHgpCit7CisJaW50MzJfdCBpMCxpMSxqMDsKKwl1X2ludDMyX3QgaSxqOworCUVYVFJBQ1RfV09SRFMoaTAsaTEseCk7CisJajAgPSAoKGkwPj4yMCkmMHg3ZmYpLTB4M2ZmOworCWlmKGowPDIwKSB7CisJICAgIGlmKGowPDApIHsgCS8qIHJhaXNlIGluZXhhY3QgaWYgeCAhPSAwICovCisJCWlmKGh1Z2UreD4wLjApIHsvKiByZXR1cm4gMCpzaWduKHgpIGlmIHx4fDwxICovCisJCSAgICBpZihpMDwwKSB7aTA9MHg4MDAwMDAwMDtpMT0wO30KKwkJICAgIGVsc2UgaWYoKGkwfGkxKSE9MCkgeyBpMD0weDNmZjAwMDAwO2kxPTA7fQorCQl9CisJICAgIH0gZWxzZSB7CisJCWkgPSAoMHgwMDBmZmZmZik+PmowOworCQlpZigoKGkwJmkpfGkxKT09MCkgcmV0dXJuIHg7IC8qIHggaXMgaW50ZWdyYWwgKi8KKwkJaWYoaHVnZSt4PjAuMCkgewkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJICAgIGlmKGkwPjApIGkwICs9ICgweDAwMTAwMDAwKT4+ajA7CisJCSAgICBpMCAmPSAofmkpOyBpMT0wOworCQl9CisJICAgIH0KKwl9IGVsc2UgaWYgKGowPjUxKSB7CisJICAgIGlmKGowPT0weDQwMCkgcmV0dXJuIHgreDsJLyogaW5mIG9yIE5hTiAqLworCSAgICBlbHNlIHJldHVybiB4OwkJLyogeCBpcyBpbnRlZ3JhbCAqLworCX0gZWxzZSB7CisJICAgIGkgPSAoKHVfaW50MzJfdCkoMHhmZmZmZmZmZikpPj4oajAtMjApOworCSAgICBpZigoaTEmaSk9PTApIHJldHVybiB4OwkvKiB4IGlzIGludGVncmFsICovCisJICAgIGlmKGh1Z2UreD4wLjApIHsgCQkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJaWYoaTA+MCkgeworCQkgICAgaWYoajA9PTIwKSBpMCs9MTsKKwkJICAgIGVsc2UgeworCQkJaiA9IGkxICsgKDE8PCg1Mi1qMCkpOworCQkJaWYoajxpMSkgaTArPTE7CS8qIGdvdCBhIGNhcnJ5ICovCisJCQlpMSA9IGo7CisJCSAgICB9CisJCX0KKwkJaTEgJj0gKH5pKTsKKwkgICAgfQorCX0KKwlJTlNFUlRfV09SRFMoeCxpMCxpMSk7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NlaWxmLmMgYi9saWJtL3NyYy9zX2NlaWxmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM0NjViMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY2VpbGYuYwpAQCAtMCwwICsxLDUzIEBACisvKiBzX2NlaWxmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2NlaWwuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY2VpbGYuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0IGh1Z2UgPSAxLjBlMzA7CisKK2Zsb2F0CitjZWlsZihmbG9hdCB4KQoreworCWludDMyX3QgaTAsajA7CisJdV9pbnQzMl90IGk7CisKKwlHRVRfRkxPQVRfV09SRChpMCx4KTsKKwlqMCA9ICgoaTA+PjIzKSYweGZmKS0weDdmOworCWlmKGowPDIzKSB7CisJICAgIGlmKGowPDApIHsgCS8qIHJhaXNlIGluZXhhY3QgaWYgeCAhPSAwICovCisJCWlmKGh1Z2UreD4oZmxvYXQpMC4wKSB7LyogcmV0dXJuIDAqc2lnbih4KSBpZiB8eHw8MSAqLworCQkgICAgaWYoaTA8MCkge2kwPTB4ODAwMDAwMDA7fQorCQkgICAgZWxzZSBpZihpMCE9MCkgeyBpMD0weDNmODAwMDAwO30KKwkJfQorCSAgICB9IGVsc2UgeworCQlpID0gKDB4MDA3ZmZmZmYpPj5qMDsKKwkJaWYoKGkwJmkpPT0wKSByZXR1cm4geDsgLyogeCBpcyBpbnRlZ3JhbCAqLworCQlpZihodWdlK3g+KGZsb2F0KTAuMCkgewkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJICAgIGlmKGkwPjApIGkwICs9ICgweDAwODAwMDAwKT4+ajA7CisJCSAgICBpMCAmPSAofmkpOworCQl9CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBpZihqMD09MHg4MCkgcmV0dXJuIHgreDsJLyogaW5mIG9yIE5hTiAqLworCSAgICBlbHNlIHJldHVybiB4OwkJLyogeCBpcyBpbnRlZ3JhbCAqLworCX0KKwlTRVRfRkxPQVRfV09SRCh4LGkwKTsKKwlyZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY2VpbGwuYyBiL2xpYm0vc3JjL3NfY2VpbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTg4MTdjCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jZWlsbC5jCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIEZyb206IEAoIylzX2NlaWwuYyA1LjEgOTMvMDkvMjQKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jZWlsbC5jLHYgMS40IDIwMDUvMDQvMjggMTk6NDU6NTUgc3RlZmFuZiBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIGNlaWxsKHgpCisgKiBSZXR1cm4geCByb3VuZGVkIHRvd2FyZCAtaW5mIHRvIGludGVncmFsIHZhbHVlCisgKiBNZXRob2Q6CisgKglCaXQgdHdpZGRsaW5nLgorICogRXhjZXB0aW9uOgorICoJSW5leGFjdCBmbGFnIHJhaXNlZCBpZiB4IG5vdCBlcXVhbCB0byBjZWlsbCh4KS4KKyAqLworCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworI2lmZGVmIExEQkxfSU1QTElDSVRfTkJJVAorI2RlZmluZQlNQU5IX1NJWkUJKExEQkxfTUFOSF9TSVpFICsgMSkKKyNkZWZpbmUJSU5DX01BTkgodSwgYykJZG8gewkJCQkJXAorCXVpbnQ2NF90IG8gPSB1LmJpdHMubWFuaDsJCQkJXAorCXUuYml0cy5tYW5oICs9IChjKTsJCQkJCVwKKwlpZiAodS5iaXRzLm1hbmggPCBvKQkJCQkJXAorCQl1LmJpdHMuZXhwKys7CQkJCQlcCit9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUJTUFOSF9TSVpFCUxEQkxfTUFOSF9TSVpFCisjZGVmaW5lCUlOQ19NQU5IKHUsIGMpCWRvIHsJCQkJCVwKKwl1aW50NjRfdCBvID0gdS5iaXRzLm1hbmg7CQkJCVwKKwl1LmJpdHMubWFuaCArPSAoYyk7CQkJCQlcCisJaWYgKHUuYml0cy5tYW5oIDwgbykgewkJCQkJXAorCQl1LmJpdHMuZXhwKys7CQkJCQlcCisJCXUuYml0cy5tYW5oIHw9IDFsbHUgPDwgKExEQkxfTUFOSF9TSVpFIC0gMSk7CVwKKwl9CQkJCQkJCVwKK30gd2hpbGUgKDApCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGxvbmcgZG91YmxlIGh1Z2UgPSAxLjBlMzAwOworCitsb25nIGRvdWJsZQorY2VpbGwobG9uZyBkb3VibGUgeCkKK3sKKwl1bmlvbiBJRUVFbDJiaXRzIHUgPSB7IC5lID0geCB9OworCWludCBlID0gdS5iaXRzLmV4cCAtIExEQkxfTUFYX0VYUCArIDE7CisKKwlpZiAoZSA8IE1BTkhfU0laRSAtIDEpIHsKKwkJaWYgKGUgPCAwKSB7CQkJLyogcmFpc2UgaW5leGFjdCBpZiB4ICE9IDAgKi8KKwkJCWlmIChodWdlICsgeCA+IDAuMCkKKwkJCQlpZiAodS5iaXRzLmV4cCA+IDAgfHwKKwkJCQkgICAgKHUuYml0cy5tYW5oIHwgdS5iaXRzLm1hbmwpICE9IDApCisJCQkJCXUuZSA9IHUuYml0cy5zaWduID8gMC4wIDogMS4wOworCQl9IGVsc2UgeworCQkJdWludDY0X3QgbSA9ICgoMWxsdSA8PCBNQU5IX1NJWkUpIC0gMSkgPj4gKGUgKyAxKTsKKwkJCWlmICgoKHUuYml0cy5tYW5oICYgbSkgfCB1LmJpdHMubWFubCkgPT0gMCkKKwkJCQlyZXR1cm4gKHgpOwkvKiB4IGlzIGludGVncmFsICovCisJCQlpZiAoIXUuYml0cy5zaWduKSB7CisjaWZkZWYgTERCTF9JTVBMSUNJVF9OQklUCisJCQkJaWYgKGUgPT0gMCkKKwkJCQkJdS5iaXRzLmV4cCsrOworCQkJCWVsc2UKKyNlbmRpZgorCQkJCUlOQ19NQU5IKHUsIDFsbHUgPDwgKE1BTkhfU0laRSAtIGUgLSAxKSk7CisJCQl9CisJCQlpZiAoaHVnZSArIHggPiAwLjApIHsJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJCQkJdS5iaXRzLm1hbmggJj0gfm07CisJCQkJdS5iaXRzLm1hbmwgPSAwOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChlIDwgTERCTF9NQU5UX0RJRyAtIDEpIHsKKwkJdWludDY0X3QgbSA9ICh1aW50NjRfdCktMSA+PiAoNjQgLSBMREJMX01BTlRfRElHICsgZSArIDEpOworCQlpZiAoKHUuYml0cy5tYW5sICYgbSkgPT0gMCkKKwkJCXJldHVybiAoeCk7CS8qIHggaXMgaW50ZWdyYWwgKi8KKwkJaWYgKCF1LmJpdHMuc2lnbikgeworCQkJaWYgKGUgPT0gTUFOSF9TSVpFIC0gMSkKKwkJCQlJTkNfTUFOSCh1LCAxKTsKKwkJCWVsc2UgeworCQkJCXVpbnQ2NF90IG8gPSB1LmJpdHMubWFubDsKKwkJCQl1LmJpdHMubWFubCArPSAxbGx1IDw8IChMREJMX01BTlRfRElHIC0gZSAtIDEpOworCQkJCWlmICh1LmJpdHMubWFubCA8IG8pCS8qIGdvdCBhIGNhcnJ5ICovCisJCQkJCUlOQ19NQU5IKHUsIDEpOworCQkJfQorCQl9CisJCWlmIChodWdlICsgeCA+IDAuMCkJCS8qIHJhaXNlIGluZXhhY3QgZmxhZyAqLworCQkJdS5iaXRzLm1hbmwgJj0gfm07CisJfQorCXJldHVybiAodS5lKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY2ltYWcuYyBiL2xpYm0vc3JjL3NfY2ltYWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGJlMGIzCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jaW1hZy5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IFN0ZWZhbiBGYXJmZWxlZGVyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NpbWFnLmMsdiAxLjEgMjAwNC8wNS8zMCAwOToyMTo1NiBzdGVmYW5mIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGNvbXBsZXguaD4KKworZG91YmxlCitjaW1hZyhkb3VibGUgY29tcGxleCB6KQoreworCXJldHVybiAteiAqIEk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NpbWFnZi5jIGIvbGlibS9zcmMvc19jaW1hZ2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTBmNTNmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jaW1hZ2YuYwpAQCAtMCwwICsxLDM1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBTdGVmYW4gRmFyZmVsZWRlcgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jaW1hZ2YuYyx2IDEuMSAyMDA0LzA1LzMwIDA5OjIxOjU2IHN0ZWZhbmYgRXhwICQKKyAqLworCisjaW5jbHVkZSA8Y29tcGxleC5oPgorCitmbG9hdAorY2ltYWdmKGZsb2F0IGNvbXBsZXggeikKK3sKKwlyZXR1cm4gLXogKiBJOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jaW1hZ2wuYyBiL2xpYm0vc3JjL3NfY2ltYWdsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3Njc3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY2ltYWdsLmMKQEAgLTAsMCArMSwzNSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU3RlZmFuIEZhcmZlbGVkZXIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY2ltYWdsLmMsdiAxLjEgMjAwNC8wNS8zMCAwOToyMTo1NiBzdGVmYW5mIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGNvbXBsZXguaD4KKworbG9uZyBkb3VibGUKK2NpbWFnbChsb25nIGRvdWJsZSBjb21wbGV4IHopCit7CisJcmV0dXJuIC16ICogSTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY29uai5jIGIvbGlibS9zcmMvc19jb25qLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ3YTE1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY29uai5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IFN0ZWZhbiBGYXJmZWxlZGVyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NvbmouYyx2IDEuMSAyMDA0LzA1LzMwIDA5OjIxOjU2IHN0ZWZhbmYgRXhwICQKKyAqLworCisjaW5jbHVkZSA8Y29tcGxleC5oPgorCitkb3VibGUgY29tcGxleAorY29uaihkb3VibGUgY29tcGxleCB6KQoreworCXJldHVybiBjcmVhbCh6KSAtIEkgKiBjaW1hZyh6KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY29uamYuYyBiL2xpYm0vc3JjL3NfY29uamYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGUwMzk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jb25qZi5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IFN0ZWZhbiBGYXJmZWxlZGVyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NvbmpmLmMsdiAxLjEgMjAwNC8wNS8zMCAwOToyMTo1NiBzdGVmYW5mIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGNvbXBsZXguaD4KKworZmxvYXQgY29tcGxleAorY29uamYoZmxvYXQgY29tcGxleCB6KQoreworCXJldHVybiBjcmVhbGYoeikgLSBJICogY2ltYWdmKHopOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jb25qbC5jIGIvbGlibS9zcmMvc19jb25qbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZDgwYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NvbmpsLmMKQEAgLTAsMCArMSwzNSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU3RlZmFuIEZhcmZlbGVkZXIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY29uamwuYyx2IDEuMSAyMDA0LzA1LzMwIDA5OjIxOjU2IHN0ZWZhbmYgRXhwICQKKyAqLworCisjaW5jbHVkZSA8Y29tcGxleC5oPgorCitsb25nIGRvdWJsZSBjb21wbGV4Citjb25qbChsb25nIGRvdWJsZSBjb21wbGV4IHopCit7CisJcmV0dXJuIGNyZWFsbCh6KSAtIEkgKiBjaW1hZ2woeik7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NvcHlzaWduLmMgYi9saWJtL3NyYy9zX2NvcHlzaWduLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3YmUwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY29weXNpZ24uYwpAQCAtMCwwICsxLDM0IEBACisvKiBAKCMpc19jb3B5c2lnbi5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jb3B5c2lnbi5jLHYgMS45IDIwMDMvMDcvMjMgMDQ6NTM6NDYgcGV0ZXIgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBjb3B5c2lnbihkb3VibGUgeCwgZG91YmxlIHkpCisgKiBjb3B5c2lnbih4LHkpIHJldHVybnMgYSB2YWx1ZSB3aXRoIHRoZSBtYWduaXR1ZGUgb2YgeCBhbmQKKyAqIHdpdGggdGhlIHNpZ24gYml0IG9mIHkuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZG91YmxlCitjb3B5c2lnbihkb3VibGUgeCwgZG91YmxlIHkpCit7CisJdV9pbnQzMl90IGh4LGh5OworCUdFVF9ISUdIX1dPUkQoaHgseCk7CisJR0VUX0hJR0hfV09SRChoeSx5KTsKKwlTRVRfSElHSF9XT1JEKHgsKGh4JjB4N2ZmZmZmZmYpfChoeSYweDgwMDAwMDAwKSk7CisgICAgICAgIHJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jb3B5c2lnbmYuYyBiL2xpYm0vc3JjL3NfY29weXNpZ25mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljNDQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY29weXNpZ25mLmMKQEAgLTAsMCArMSwzNyBAQAorLyogc19jb3B5c2lnbmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfY29weXNpZ24uYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY29weXNpZ25mLmMsdiAxLjkgMjAwMy8wNy8yMyAwNDo1Mzo0NiBwZXRlciBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIGNvcHlzaWduZihmbG9hdCB4LCBmbG9hdCB5KQorICogY29weXNpZ25mKHgseSkgcmV0dXJucyBhIHZhbHVlIHdpdGggdGhlIG1hZ25pdHVkZSBvZiB4IGFuZAorICogd2l0aCB0aGUgc2lnbiBiaXQgb2YgeS4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitmbG9hdAorY29weXNpZ25mKGZsb2F0IHgsIGZsb2F0IHkpCit7CisJdV9pbnQzMl90IGl4LGl5OworCUdFVF9GTE9BVF9XT1JEKGl4LHgpOworCUdFVF9GTE9BVF9XT1JEKGl5LHkpOworCVNFVF9GTE9BVF9XT1JEKHgsKGl4JjB4N2ZmZmZmZmYpfChpeSYweDgwMDAwMDAwKSk7CisgICAgICAgIHJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jb3B5c2lnbmwuYyBiL2xpYm0vc3JjL3NfY29weXNpZ25sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1YmQzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY29weXNpZ25sLmMKQEAgLTAsMCArMSw0MiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU3RlZmFuIEZhcmZlbGVkZXIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY29weXNpZ25sLmMsdiAxLjEgMjAwNC8wNS8wNyAxODo1NjozMSBzdGVmYW5mIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorCitsb25nIGRvdWJsZQorY29weXNpZ25sKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpCit7CisJdW5pb24gSUVFRWwyYml0cyB1eCwgdXk7CisKKwl1eC5lID0geDsKKwl1eS5lID0geTsKKwl1eC5iaXRzLnNpZ24gPSB1eS5iaXRzLnNpZ247CisJcmV0dXJuICh1eC5lKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY29zLmMgYi9saWJtL3NyYy9zX2Nvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYWY5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2Nvcy5jCkBAIC0wLDAgKzEsODIgQEAKKy8qIEAoIylzX2Nvcy5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jb3MuYyx2IDEuMTAgMjAwNS8xMC8yNCAxNDowODozNiBiZGUgRXhwICQiOworI2VuZGlmCisKKy8qIGNvcyh4KQorICogUmV0dXJuIGNvc2luZSBmdW5jdGlvbiBvZiB4LgorICoKKyAqIGtlcm5lbCBmdW5jdGlvbjoKKyAqCV9fa2VybmVsX3NpbgkJLi4uIHNpbmUgZnVuY3Rpb24gb24gWy1waS80LHBpLzRdCisgKglfX2tlcm5lbF9jb3MJCS4uLiBjb3NpbmUgZnVuY3Rpb24gb24gWy1waS80LHBpLzRdCisgKglfX2llZWU3NTRfcmVtX3BpbzIJLi4uIGFyZ3VtZW50IHJlZHVjdGlvbiByb3V0aW5lCisgKgorICogTWV0aG9kLgorICogICAgICBMZXQgUyxDIGFuZCBUIGRlbm90ZSB0aGUgc2luLCBjb3MgYW5kIHRhbiByZXNwZWN0aXZlbHkgb24KKyAqCVstUEkvNCwgK1BJLzRdLiBSZWR1Y2UgdGhlIGFyZ3VtZW50IHggdG8geTEreTIgPSB4LWsqcGkvMgorICoJaW4gWy1waS80ICwgK3BpLzRdLCBhbmQgbGV0IG4gPSBrIG1vZCA0LgorICoJV2UgaGF2ZQorICoKKyAqICAgICAgICAgIG4gICAgICAgIHNpbih4KSAgICAgIGNvcyh4KSAgICAgICAgdGFuKHgpCisgKiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJICAgIDAJICAgICAgIFMJICAgQwkJIFQKKyAqCSAgICAxCSAgICAgICBDCSAgLVMJCS0xL1QKKyAqCSAgICAyCSAgICAgIC1TCSAgLUMJCSBUCisgKgkgICAgMwkgICAgICAtQwkgICBTCQktMS9UCisgKiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNwZWNpYWwgY2FzZXM6CisgKiAgICAgIExldCB0cmlnIGJlIGFueSBvZiBzaW4sIGNvcywgb3IgdGFuLgorICogICAgICB0cmlnKCstSU5GKSAgaXMgTmFOLCB3aXRoIHNpZ25hbHM7CisgKiAgICAgIHRyaWcoTmFOKSAgICBpcyB0aGF0IE5hTjsKKyAqCisgKiBBY2N1cmFjeToKKyAqCVRSSUcoeCkgcmV0dXJucyB0cmlnKHgpIG5lYXJseSByb3VuZGVkCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZG91YmxlCitjb3MoZG91YmxlIHgpCit7CisJZG91YmxlIHlbMl0sej0wLjA7CisJaW50MzJfdCBuLCBpeDsKKworICAgIC8qIEhpZ2ggd29yZCBvZiB4LiAqLworCUdFVF9ISUdIX1dPUkQoaXgseCk7CisKKyAgICAvKiB8eHwgfjwgcGkvNCAqLworCWl4ICY9IDB4N2ZmZmZmZmY7CisJaWYoaXggPD0gMHgzZmU5MjFmYikgeworCSAgICBpZihpeDwweDNlNDAwMDAwKQkJCS8qIGlmIHggPCAyKiotMjcgKi8KKwkJaWYoKChpbnQpeCk9PTApIHJldHVybiAxLjA7CS8qIGdlbmVyYXRlIGluZXhhY3QgKi8KKwkgICAgcmV0dXJuIF9fa2VybmVsX2Nvcyh4LHopOworCX0KKworICAgIC8qIGNvcyhJbmYgb3IgTmFOKSBpcyBOYU4gKi8KKwllbHNlIGlmIChpeD49MHg3ZmYwMDAwMCkgcmV0dXJuIHgteDsKKworICAgIC8qIGFyZ3VtZW50IHJlZHVjdGlvbiBuZWVkZWQgKi8KKwllbHNlIHsKKwkgICAgbiA9IF9faWVlZTc1NF9yZW1fcGlvMih4LHkpOworCSAgICBzd2l0Y2gobiYzKSB7CisJCWNhc2UgMDogcmV0dXJuICBfX2tlcm5lbF9jb3MoeVswXSx5WzFdKTsKKwkJY2FzZSAxOiByZXR1cm4gLV9fa2VybmVsX3Npbih5WzBdLHlbMV0sMSk7CisJCWNhc2UgMjogcmV0dXJuIC1fX2tlcm5lbF9jb3MoeVswXSx5WzFdKTsKKwkJZGVmYXVsdDoKKwkJICAgICAgICByZXR1cm4gIF9fa2VybmVsX3Npbih5WzBdLHlbMV0sMSk7CisJICAgIH0KKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2Nvc2YuYyBiL2xpYm0vc3JjL3NfY29zZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYWRhZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2Nvc2YuYwpAQCAtMCwwICsxLDg0IEBACisvKiBzX2Nvc2YuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfY29zLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqIE9wdGltaXplZCBieSBCcnVjZSBELiBFdmFucy4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2Nvc2YuYyx2IDEuMTUgMjAwNS8xMS8zMCAwNjo0NzoxOCBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjZGVmaW5lCUlOTElORV9LRVJORUxfQ09TREYKKyNkZWZpbmUJSU5MSU5FX0tFUk5FTF9TSU5ERgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImtfY29zZi5jIgorI2luY2x1ZGUgImtfc2luZi5jIgorCisvKiBTbWFsbCBtdWx0aXBsZXMgb2YgcGkvMiByb3VuZGVkIHRvIGRvdWJsZSBwcmVjaXNpb24uICovCitzdGF0aWMgY29uc3QgZG91YmxlCitjMXBpbzIgPSAxKk1fUElfMiwJCQkvKiAweDNGRjkyMUZCLCAweDU0NDQyRDE4ICovCitjMnBpbzIgPSAyKk1fUElfMiwJCQkvKiAweDQwMDkyMUZCLCAweDU0NDQyRDE4ICovCitjM3BpbzIgPSAzKk1fUElfMiwJCQkvKiAweDQwMTJEOTdDLCAweDdGMzMyMUQyICovCitjNHBpbzIgPSA0Kk1fUElfMjsJCQkvKiAweDQwMTkyMUZCLCAweDU0NDQyRDE4ICovCisKK2Zsb2F0Citjb3NmKGZsb2F0IHgpCit7CisJZmxvYXQgeVsyXTsKKwlpbnQzMl90IG4sIGh4LCBpeDsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWl4ID0gaHggJiAweDdmZmZmZmZmOworCisJaWYoaXggPD0gMHgzZjQ5MGZkYSkgewkJLyogfHh8IH48PSBwaS80ICovCisJICAgIGlmKGl4PDB4Mzk4MDAwMDApCQkvKiB8eHwgPCAyKiotMTIgKi8KKwkJaWYoKChpbnQpeCk9PTApIHJldHVybiAxLjA7CS8qIDEgd2l0aCBpbmV4YWN0IGlmIHggIT0gMCAqLworCSAgICByZXR1cm4gX19rZXJuZWxfY29zZGYoeCk7CisJfQorCWlmKGl4PD0weDQwN2I1M2QxKSB7CQkvKiB8eHwgfjw9IDUqcGkvNCAqLworCSAgICBpZihpeD4weDQwMTZjYmUzKQkJLyogfHh8ICB+PiAzKnBpLzQgKi8KKwkJcmV0dXJuIC1fX2tlcm5lbF9jb3NkZih4ICsgKGh4ID4gMCA/IC1jMnBpbzIgOiBjMnBpbzIpKTsKKwkgICAgZWxzZSB7CisJCWlmKGh4PjApCisJCSAgICByZXR1cm4gX19rZXJuZWxfc2luZGYoYzFwaW8yIC0geCk7CisJCWVsc2UKKwkJICAgIHJldHVybiBfX2tlcm5lbF9zaW5kZih4ICsgYzFwaW8yKTsKKwkgICAgfQorCX0KKwlpZihpeDw9MHg0MGUyMzFkNSkgewkJLyogfHh8IH48PSA5KnBpLzQgKi8KKwkgICAgaWYoaXg+MHg0MGFmZWRkZikJCS8qIHx4fCAgfj4gNypwaS80ICovCisJCXJldHVybiBfX2tlcm5lbF9jb3NkZih4ICsgKGh4ID4gMCA/IC1jNHBpbzIgOiBjNHBpbzIpKTsKKwkgICAgZWxzZSB7CisJCWlmKGh4PjApCisJCSAgICByZXR1cm4gX19rZXJuZWxfc2luZGYoeCAtIGMzcGlvMik7CisJCWVsc2UKKwkJICAgIHJldHVybiBfX2tlcm5lbF9zaW5kZigtYzNwaW8yIC0geCk7CisJICAgIH0KKwl9CisKKyAgICAvKiBjb3MoSW5mIG9yIE5hTikgaXMgTmFOICovCisJZWxzZSBpZiAoaXg+PTB4N2Y4MDAwMDApIHJldHVybiB4LXg7CisKKyAgICAvKiBnZW5lcmFsIGFyZ3VtZW50IHJlZHVjdGlvbiBuZWVkZWQgKi8KKwllbHNlIHsKKwkgICAgbiA9IF9faWVlZTc1NF9yZW1fcGlvMmYoeCx5KTsKKwkgICAgc3dpdGNoKG4mMykgeworCQljYXNlIDA6IHJldHVybiAgX19rZXJuZWxfY29zZGYoKGRvdWJsZSl5WzBdK3lbMV0pOworCQljYXNlIDE6IHJldHVybiAgX19rZXJuZWxfc2luZGYoLShkb3VibGUpeVswXS15WzFdKTsKKwkJY2FzZSAyOiByZXR1cm4gLV9fa2VybmVsX2Nvc2RmKChkb3VibGUpeVswXSt5WzFdKTsKKwkJZGVmYXVsdDoKKwkJICAgICAgICByZXR1cm4gIF9fa2VybmVsX3NpbmRmKChkb3VibGUpeVswXSt5WzFdKTsKKwkgICAgfQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY3JlYWwuYyBiL2xpYm0vc3JjL3NfY3JlYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDE0Y2RmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jcmVhbC5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IFN0ZWZhbiBGYXJmZWxlZGVyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NyZWFsLmMsdiAxLjEgMjAwNC8wNS8zMCAwOToyMTo1NiBzdGVmYW5mIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGNvbXBsZXguaD4KKworZG91YmxlCitjcmVhbChkb3VibGUgY29tcGxleCB6KQoreworCXJldHVybiB6OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jcmVhbGYuYyBiL2xpYm0vc3JjL3NfY3JlYWxmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVjMTU2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY3JlYWxmLmMKQEAgLTAsMCArMSwzNSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU3RlZmFuIEZhcmZlbGVkZXIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY3JlYWxmLmMsdiAxLjEgMjAwNC8wNS8zMCAwOToyMTo1NiBzdGVmYW5mIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGNvbXBsZXguaD4KKworZmxvYXQKK2NyZWFsZihmbG9hdCBjb21wbGV4IHopCit7CisJcmV0dXJuIHo7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NyZWFsbC5jIGIvbGlibS9zcmMvc19jcmVhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTMxZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jcmVhbGwuYwpAQCAtMCwwICsxLDM1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBTdGVmYW4gRmFyZmVsZWRlcgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jcmVhbGwuYyx2IDEuMSAyMDA0LzA1LzMwIDA5OjIxOjU2IHN0ZWZhbmYgRXhwICQKKyAqLworCisjaW5jbHVkZSA8Y29tcGxleC5oPgorCitsb25nIGRvdWJsZQorY3JlYWxsKGxvbmcgZG91YmxlIGNvbXBsZXggeikKK3sKKwlyZXR1cm4gejsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZXJmLmMgYi9saWJtL3NyYy9zX2VyZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzM2EyYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2VyZi5jCkBAIC0wLDAgKzEsMzAyIEBACisvKiBAKCMpc19lcmYuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZXJmLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKy8qIGRvdWJsZSBlcmYoZG91YmxlIHgpCisgKiBkb3VibGUgZXJmYyhkb3VibGUgeCkKKyAqCQkJICAgICB4CisgKgkJICAgICAgMiAgICAgIHxcCisgKiAgICAgZXJmKHgpICA9ICAtLS0tLS0tLS0gIHwgZXhwKC10KnQpZHQKKyAqCSAJICAgc3FydChwaSkgXHwKKyAqCQkJICAgICAwCisgKgorICogICAgIGVyZmMoeCkgPSAgMS1lcmYoeCkKKyAqICBOb3RlIHRoYXQKKyAqCQllcmYoLXgpID0gLWVyZih4KQorICoJCWVyZmMoLXgpID0gMiAtIGVyZmMoeCkKKyAqCisgKiBNZXRob2Q6CisgKgkxLiBGb3IgfHh8IGluIFswLCAwLjg0Mzc1XQorICoJICAgIGVyZih4KSAgPSB4ICsgeCpSKHheMikKKyAqICAgICAgICAgIGVyZmMoeCkgPSAxIC0gZXJmKHgpICAgICAgICAgICBpZiB4IGluIFstLjg0Mzc1LDAuMjVdCisgKiAgICAgICAgICAgICAgICAgID0gMC41ICsgKCgwLjUteCkteCpSKSAgaWYgeCBpbiBbMC4yNSwwLjg0Mzc1XQorICoJICAgd2hlcmUgUiA9IFAvUSB3aGVyZSBQIGlzIGFuIG9kZCBwb2x5IG9mIGRlZ3JlZSA4IGFuZAorICoJICAgUSBpcyBhbiBvZGQgcG9seSBvZiBkZWdyZWUgMTAuCisgKgkJCQkJCSAtNTcuOTAKKyAqCQkJfCBSIC0gKGVyZih4KS14KS94IHwgPD0gMgorICoKKyAqCisgKgkgICBSZW1hcmsuIFRoZSBmb3JtdWxhIGlzIGRlcml2ZWQgYnkgbm90aW5nCisgKiAgICAgICAgICBlcmYoeCkgPSAoMi9zcXJ0KHBpKSkqKHggLSB4XjMvMyArIHheNS8xMCAtIHheNy80MiArIC4uLi4pCisgKgkgICBhbmQgdGhhdAorICogICAgICAgICAgMi9zcXJ0KHBpKSA9IDEuMTI4Mzc5MTY3MDk1NTEyNTczODk2MTU4OTAzMTIxNTQ1MTcxNjg4CisgKgkgICBpcyBjbG9zZSB0byBvbmUuIFRoZSBpbnRlcnZhbCBpcyBjaG9zZW4gYmVjYXVzZSB0aGUgZml4CisgKgkgICBwb2ludCBvZiBlcmYoeCkgaXMgbmVhciAwLjYxNzQgKGkuZS4sIGVyZih4KT14IHdoZW4geCBpcworICoJICAgbmVhciAwLjYxNzQpLCBhbmQgYnkgc29tZSBleHBlcmltZW50LCAwLjg0Mzc1IGlzIGNob3NlbiB0bworICogCSAgIGd1YXJhbnRlZSB0aGUgZXJyb3IgaXMgbGVzcyB0aGFuIG9uZSB1bHAgZm9yIGVyZi4KKyAqCisgKiAgICAgIDIuIEZvciB8eHwgaW4gWzAuODQzNzUsMS4yNV0sIGxldCBzID0gfHh8IC0gMSwgYW5kCisgKiAgICAgICAgIGMgPSAwLjg0NTA2MjkxMTUxIHJvdW5kZWQgdG8gc2luZ2xlICgyNCBiaXRzKQorICogICAgICAgICAJZXJmKHgpICA9IHNpZ24oeCkgKiAoYyAgKyBQMShzKS9RMShzKSkKKyAqICAgICAgICAgCWVyZmMoeCkgPSAoMS1jKSAgLSBQMShzKS9RMShzKSBpZiB4ID4gMAorICoJCQkgIDErKGMrUDEocykvUTEocykpICAgIGlmIHggPCAwCisgKiAgICAgICAgIAl8UDEvUTEgLSAoZXJmKHx4fCktYyl8IDw9IDIqKi01OS4wNgorICoJICAgUmVtYXJrOiBoZXJlIHdlIHVzZSB0aGUgdGF5bG9yIHNlcmllcyBleHBhbnNpb24gYXQgeD0xLgorICoJCWVyZigxK3MpID0gZXJmKDEpICsgcypQb2x5KHMpCisgKgkJCSA9IDAuODQ1Li4gKyBQMShzKS9RMShzKQorICoJICAgVGhhdCBpcywgd2UgdXNlIHJhdGlvbmFsIGFwcHJveGltYXRpb24gdG8gYXBwcm94aW1hdGUKKyAqCQkJZXJmKDErcykgLSAoYyA9IChzaW5nbGUpMC44NDUwNjI5MTE1MSkKKyAqCSAgIE5vdGUgdGhhdCB8UDEvUTF8PCAwLjA3OCBmb3IgeCBpbiBbMC44NDM3NSwxLjI1XQorICoJICAgd2hlcmUKKyAqCQlQMShzKSA9IGRlZ3JlZSA2IHBvbHkgaW4gcworICoJCVExKHMpID0gZGVncmVlIDYgcG9seSBpbiBzCisgKgorICogICAgICAzLiBGb3IgeCBpbiBbMS4yNSwxLzAuMzUofjIuODU3MTQzKV0sCisgKiAgICAgICAgIAllcmZjKHgpID0gKDEveCkqZXhwKC14KngtMC41NjI1K1IxL1MxKQorICogICAgICAgICAJZXJmKHgpICA9IDEgLSBlcmZjKHgpCisgKgkgICB3aGVyZQorICoJCVIxKHopID0gZGVncmVlIDcgcG9seSBpbiB6LCAoej0xL3heMikKKyAqCQlTMSh6KSA9IGRlZ3JlZSA4IHBvbHkgaW4gegorICoKKyAqICAgICAgNC4gRm9yIHggaW4gWzEvMC4zNSwyOF0KKyAqICAgICAgICAgCWVyZmMoeCkgPSAoMS94KSpleHAoLXgqeC0wLjU2MjUrUjIvUzIpIGlmIHggPiAwCisgKgkJCT0gMi4wIC0gKDEveCkqZXhwKC14KngtMC41NjI1K1IyL1MyKSBpZiAtNjx4PDAKKyAqCQkJPSAyLjAgLSB0aW55CQkoaWYgeCA8PSAtNikKKyAqICAgICAgICAgCWVyZih4KSAgPSBzaWduKHgpKigxLjAgLSBlcmZjKHgpKSBpZiB4IDwgNiwgZWxzZQorICogICAgICAgICAJZXJmKHgpICA9IHNpZ24oeCkqKDEuMCAtIHRpbnkpCisgKgkgICB3aGVyZQorICoJCVIyKHopID0gZGVncmVlIDYgcG9seSBpbiB6LCAoej0xL3heMikKKyAqCQlTMih6KSA9IGRlZ3JlZSA3IHBvbHkgaW4gegorICoKKyAqICAgICAgTm90ZTE6CisgKgkgICBUbyBjb21wdXRlIGV4cCgteCp4LTAuNTYyNStSL1MpLCBsZXQgcyBiZSBhIHNpbmdsZQorICoJICAgcHJlY2lzaW9uIG51bWJlciBhbmQgcyA6PSB4OyB0aGVuCisgKgkJLXgqeCA9IC1zKnMgKyAocy14KSoocyt4KQorICoJICAgICAgICBleHAoLXgqeC0wLjU2MjYrUi9TKSA9CisgKgkJCWV4cCgtcypzLTAuNTYyNSkqZXhwKChzLXgpKihzK3gpK1IvUyk7CisgKiAgICAgIE5vdGUyOgorICoJICAgSGVyZSA0IGFuZCA1IG1ha2UgdXNlIG9mIHRoZSBhc3ltcHRvdGljIHNlcmllcworICoJCQkgIGV4cCgteCp4KQorICoJCWVyZmMoeCkgfiAtLS0tLS0tLS0tICogKCAxICsgUG9seSgxL3heMikgKQorICoJCQkgIHgqc3FydChwaSkKKyAqCSAgIFdlIHVzZSByYXRpb25hbCBhcHByb3hpbWF0aW9uIHRvIGFwcHJveGltYXRlCisgKiAgICAgIAlnKHMpPWYoMS94XjIpID0gbG9nKGVyZmMoeCkqeCkgLSB4KnggKyAwLjU2MjUKKyAqCSAgIEhlcmUgaXMgdGhlIGVycm9yIGJvdW5kIGZvciBSMS9TMSBhbmQgUjIvUzIKKyAqICAgICAgCXxSMS9TMSAtIGYoeCl8ICA8IDIqKigtNjIuNTcpCisgKiAgICAgIAl8UjIvUzIgLSBmKHgpfCAgPCAyKiooLTYxLjUyKQorICoKKyAqICAgICAgNS4gRm9yIGluZiA+IHggPj0gMjgKKyAqICAgICAgICAgCWVyZih4KSAgPSBzaWduKHgpICooMSAtIHRpbnkpICAocmFpc2UgaW5leGFjdCkKKyAqICAgICAgICAgCWVyZmMoeCkgPSB0aW55KnRpbnkgKHJhaXNlIHVuZGVyZmxvdykgaWYgeCA+IDAKKyAqCQkJPSAyIC0gdGlueSBpZiB4PDAKKyAqCisgKiAgICAgIDcuIFNwZWNpYWwgY2FzZToKKyAqICAgICAgICAgCWVyZigwKSAgPSAwLCBlcmYoaW5mKSAgPSAxLCBlcmYoLWluZikgPSAtMSwKKyAqICAgICAgICAgCWVyZmMoMCkgPSAxLCBlcmZjKGluZikgPSAwLCBlcmZjKC1pbmYpID0gMiwKKyAqCSAgIAllcmZjL2VyZihOYU4pIGlzIE5hTgorICovCisKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQordGlueQkgICAgPSAxZS0zMDAsCitoYWxmPSAgNS4wMDAwMDAwMDAwMDAwMDAwMDAwMGUtMDEsIC8qIDB4M0ZFMDAwMDAsIDB4MDAwMDAwMDAgKi8KK29uZSA9ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMCwgLyogMHgzRkYwMDAwMCwgMHgwMDAwMDAwMCAqLwordHdvID0gIDIuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwLCAvKiAweDQwMDAwMDAwLCAweDAwMDAwMDAwICovCisJLyogYyA9IChmbG9hdCkwLjg0NTA2MjkxMTUxICovCitlcnggPSAgOC40NTA2MjkxMTUxMDQ2NzUyOTI5N2UtMDEsIC8qIDB4M0ZFQjBBQzEsIDB4NjAwMDAwMDAgKi8KKy8qCisgKiBDb2VmZmljaWVudHMgZm9yIGFwcHJveGltYXRpb24gdG8gIGVyZiBvbiBbMCwwLjg0Mzc1XQorICovCitlZnggPSAgMS4yODM3OTE2NzA5NTUxMjU4NjMxNmUtMDEsIC8qIDB4M0ZDMDZFQkEsIDB4ODIxNERCNjkgKi8KK2VmeDg9ICAxLjAyNzAzMzMzNjc2NDEwMDY5MDUzZSswMCwgLyogMHgzRkYwNkVCQSwgMHg4MjE0REI2OSAqLworcHAwICA9ICAxLjI4Mzc5MTY3MDk1NTEyNTU4NTYxZS0wMSwgLyogMHgzRkMwNkVCQSwgMHg4MjE0REI2OCAqLworcHAxICA9IC0zLjI1MDQyMTA3MjQ3MDAxNDk5MzcwZS0wMSwgLyogMHhCRkQ0Q0Q3RCwgMHg2OTFDQjkxMyAqLworcHAyICA9IC0yLjg0ODE3NDk1NzU1OTg1MTA0NzY2ZS0wMiwgLyogMHhCRjlEMkE1MSwgMHhEQkQ3MTk0RiAqLworcHAzICA9IC01Ljc3MDI3MDI5NjQ4OTQ0MTU5MTU3ZS0wMywgLyogMHhCRjc3QTI5MSwgMHgyMzY2NjhFNCAqLworcHA0ICA9IC0yLjM3NjMwMTY2NTY2NTAxNjI2MDg0ZS0wNSwgLyogMHhCRUY4RUFENiwgMHgxMjAwMTZBQyAqLworcXExICA9ICAzLjk3OTE3MjIzOTU5MTU1MzUyODE5ZS0wMSwgLyogMHgzRkQ5Nzc3OSwgMHhDRERBREMwOSAqLworcXEyICA9ICA2LjUwMjIyNDk5ODg3NjcyOTQ0NDg1ZS0wMiwgLyogMHgzRkIwQTU0QywgMHg1NTM2Q0VCQSAqLworcXEzICA9ICA1LjA4MTMwNjI4MTg3NTc2NTYyNzc2ZS0wMywgLyogMHgzRjc0RDAyMiwgMHhDNEQzNkIwRiAqLworcXE0ICA9ICAxLjMyNDk0NzM4MDA0MzIxNjQ0NTI2ZS0wNCwgLyogMHgzRjIxNURDOSwgMHgyMjFDMUExMCAqLworcXE1ICA9IC0zLjk2MDIyODI3ODc3NTM2ODEyMzIwZS0wNiwgLyogMHhCRUQwOUM0MywgMHg0MkEyNjEyMCAqLworLyoKKyAqIENvZWZmaWNpZW50cyBmb3IgYXBwcm94aW1hdGlvbiB0byAgZXJmICBpbiBbMC44NDM3NSwxLjI1XQorICovCitwYTAgID0gLTIuMzYyMTE4NTYwNzUyNjU5NDQwNzdlLTAzLCAvKiAweEJGNjM1OUI4LCAweEJFRjc3NTM4ICovCitwYTEgID0gIDQuMTQ4NTYxMTg2ODM3NDgzMzE2NjZlLTAxLCAvKiAweDNGREE4RDAwLCAweEFEOTJCMzREICovCitwYTIgID0gLTMuNzIyMDc4NzYwMzU3MDEzMjM4NDdlLTAxLCAvKiAweEJGRDdEMjQwLCAweEZCQjhDM0YxICovCitwYTMgID0gIDMuMTgzNDY2MTk5MDExNjE3NTM2NzRlLTAxLCAvKiAweDNGRDQ1RkNBLCAweDgwNTEyMEU0ICovCitwYTQgID0gLTEuMTA4OTQ2OTQyODIzOTY2Nzc0NzZlLTAxLCAvKiAweEJGQkM2Mzk4LCAweDNEM0UyOEVDICovCitwYTUgID0gIDMuNTQ3ODMwNDMyNTYxODIzNTkzNzFlLTAyLCAvKiAweDNGQTIyQTM2LCAweDU5OTc5NUVCICovCitwYTYgID0gLTIuMTY2Mzc1NTk0ODY4NzkwODQzMDBlLTAzLCAvKiAweEJGNjFCRjM4LCAweDBBOTYwNzNGICovCitxYTEgID0gIDEuMDY0MjA4ODA0MDA4NDQyMjgyODZlLTAxLCAvKiAweDNGQkIzRTY2LCAweDE4RUVFMzIzICovCitxYTIgID0gIDUuNDAzOTc5MTc3MDIxNzEwNDg5MzdlLTAxLCAvKiAweDNGRTE0QUYwLCAweDkyRUI2RjMzICovCitxYTMgID0gIDcuMTgyODY1NDQxNDE5NjI2NjI4NjhlLTAyLCAvKiAweDNGQjI2MzVDLCAweEQ5OUZFOUE3ICovCitxYTQgID0gIDEuMjYxNzEyMTk4MDg3NjE2NDIxMTJlLTAxLCAvKiAweDNGQzAyNjYwLCAweEU3NjMzNTFGICovCitxYTUgID0gIDEuMzYzNzA4MzkxMjAyOTA1MDczNjJlLTAyLCAvKiAweDNGOEJFREMyLCAweDZCNTFERDFDICovCitxYTYgID0gIDEuMTk4NDQ5OTg0Njc5OTEwNzQxNzBlLTAyLCAvKiAweDNGODg4QjU0LCAweDU3MzUxNTFEICovCisvKgorICogQ29lZmZpY2llbnRzIGZvciBhcHByb3hpbWF0aW9uIHRvICBlcmZjIGluIFsxLjI1LDEvMC4zNV0KKyAqLworcmEwICA9IC05Ljg2NDk0NDAzNDg0NzE0ODIyNzA1ZS0wMywgLyogMHhCRjg0MzQxMiwgMHg2MDBENjQzNSAqLworcmExICA9IC02LjkzODU4NTcyNzA3MTgxNzY0MzcyZS0wMSwgLyogMHhCRkU2MzQxNiwgMHhFNEJBNzM2MCAqLworcmEyICA9IC0xLjA1NTg2MjYyMjUzMjMyOTA5ODE0ZSswMSwgLyogMHhDMDI1MUUwNCwgMHg0MUIwRTcyNiAqLworcmEzICA9IC02LjIzNzUzMzI0NTAzMjYwMDYwMzk2ZSswMSwgLyogMHhDMDRGMzAwQSwgMHhFNENCQTM4RCAqLworcmE0ICA9IC0xLjYyMzk2NjY5NDYyNTczNDcwMzU1ZSswMiwgLyogMHhDMDY0NENCMSwgMHg4NDI4MjI2NiAqLworcmE1ICA9IC0xLjg0NjA1MDkyOTA2NzExMDM1OTk0ZSswMiwgLyogMHhDMDY3MTM1QywgMHhFQkNDQUJCMiAqLworcmE2ICA9IC04LjEyODc0MzU1MDYzMDY1OTM0MjQ2ZSswMSwgLyogMHhDMDU0NTI2NSwgMHg1N0U0RDJGMiAqLworcmE3ICA9IC05LjgxNDMyOTM0NDE2OTE0NTQ4NTkyZSswMCwgLyogMHhDMDIzQTBFRiwgMHhDNjlBQzI1QyAqLworc2ExICA9ICAxLjk2NTEyNzE2Njc0MzkyNTcxMjkyZSswMSwgLyogMHg0MDMzQTZCOSwgMHhCRDcwNzY4NyAqLworc2EyICA9ICAxLjM3NjU3NzU0MTQzNTE5MDQyNjAwZSswMiwgLyogMHg0MDYxMzUwQywgMHg1MjZBRTcyMSAqLworc2EzICA9ICA0LjM0NTY1ODc3NDc1MjI5MjI4ODIxZSswMiwgLyogMHg0MDdCMjkwRCwgMHhENThBMUE3MSAqLworc2E0ICA9ICA2LjQ1Mzg3MjcxNzMzMjY3ODgwMzM2ZSswMiwgLyogMHg0MDg0MkIxOSwgMHgyMUVDMjg2OCAqLworc2E1ICA9ICA0LjI5MDA4MTQwMDI3NTY3ODMzMzg2ZSswMiwgLyogMHg0MDdBRDAyMSwgMHg1NzcwMDMxNCAqLworc2E2ICA9ICAxLjA4NjM1MDA1NTQxNzc5NDM1MTM0ZSswMiwgLyogMHg0MDVCMjhBMywgMHhFRTQ4QUUyQyAqLworc2E3ICA9ICA2LjU3MDI0OTc3MDMxOTI4MTcwMTM1ZSswMCwgLyogMHg0MDFBNDdFRiwgMHg4RTQ4NEE5MyAqLworc2E4ICA9IC02LjA0MjQ0MTUyMTQ4NTgwOTg3NDM4ZS0wMiwgLyogMHhCRkFFRUZGMiwgMHhFRTc0OUE2MiAqLworLyoKKyAqIENvZWZmaWNpZW50cyBmb3IgYXBwcm94aW1hdGlvbiB0byAgZXJmYyBpbiBbMS8uMzUsMjhdCisgKi8KK3JiMCAgPSAtOS44NjQ5NDI5MjQ3MDAwOTkyODU5N2UtMDMsIC8qIDB4QkY4NDM0MTIsIDB4MzlFODZGNEEgKi8KK3JiMSAgPSAtNy45OTI4MzIzNzY4MDUyMzAwNjU3NGUtMDEsIC8qIDB4QkZFOTkzQkEsIDB4NzBDMjg1REUgKi8KK3JiMiAgPSAtMS43NzU3OTU0OTE3NzU0NzUxOTg4OWUrMDEsIC8qIDB4QzAzMUMyMDksIDB4NTU1Rjk5NUEgKi8KK3JiMyAgPSAtMS42MDYzNjM4NDg1NTgyMTkxNjA2MmUrMDIsIC8qIDB4QzA2NDE0NUQsIDB4NDNDNUVEOTggKi8KK3JiNCAgPSAtNi4zNzU2NjQ0MzM2ODM4OTYyNzcyMmUrMDIsIC8qIDB4QzA4M0VDODgsIDB4MTM3NUYyMjggKi8KK3JiNSAgPSAtMS4wMjUwOTUxMzE2MTEwNzcyNDk1NGUrMDMsIC8qIDB4QzA5MDA0NjEsIDB4NkEyRTU5OTIgKi8KK3JiNiAgPSAtNC44MzUxOTE5MTYwODY1MTM5NzAxOWUrMDIsIC8qIDB4QzA3RTM4NEUsIDB4OUJEQzM4M0YgKi8KK3NiMSAgPSAgMy4wMzM4MDYwNzQzNDgyNDU4MjkyNGUrMDEsIC8qIDB4NDAzRTU2OEIsIDB4MjYxRDUxOTAgKi8KK3NiMiAgPSAgMy4yNTc5MjUxMjk5NjU3MzkxODgyNmUrMDIsIC8qIDB4NDA3NDVDQUUsIDB4MjIxQjlGMEEgKi8KK3NiMyAgPSAgMS41MzY3Mjk1ODYwODQ0MzY5NTk5NGUrMDMsIC8qIDB4NDA5ODAyRUIsIDB4MTg5RDUxMTggKi8KK3NiNCAgPSAgMy4xOTk4NTgyMTk1MDg1OTU1MzkwOGUrMDMsIC8qIDB4NDBBOEZGQjcsIDB4Njg4QzI0NkEgKi8KK3NiNSAgPSAgMi41NTMwNTA0MDY0MzMxNjQ0MjU4M2UrMDMsIC8qIDB4NDBBM0YyMTksIDB4Q0VERjNCRTYgKi8KK3NiNiAgPSAgNC43NDUyODU0MTIwNjk1NTM2NzIxNWUrMDIsIC8qIDB4NDA3REE4NzQsIDB4RTc5RkU3NjMgKi8KK3NiNyAgPSAtMi4yNDQwOTUyNDQ2NTg1ODE4MzM2MmUrMDE7IC8qIDB4QzAzNjcwRTIsIDB4NDI3MTJENjIgKi8KKworZG91YmxlCitlcmYoZG91YmxlIHgpCit7CisJaW50MzJfdCBoeCxpeCxpOworCWRvdWJsZSBSLFMsUCxRLHMseSx6LHI7CisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4N2ZmMDAwMDApIHsJCS8qIGVyZihuYW4pPW5hbiAqLworCSAgICBpID0gKCh1X2ludDMyX3QpaHg+PjMxKTw8MTsKKwkgICAgcmV0dXJuIChkb3VibGUpKDEtaSkrb25lL3g7CS8qIGVyZigrLWluZik9Ky0xICovCisJfQorCisJaWYoaXggPCAweDNmZWIwMDAwKSB7CQkvKiB8eHw8MC44NDM3NSAqLworCSAgICBpZihpeCA8IDB4M2UzMDAwMDApIHsgCS8qIHx4fDwyKiotMjggKi8KKwkgICAgICAgIGlmIChpeCA8IDB4MDA4MDAwMDApCisJCSAgICByZXR1cm4gMC4xMjUqKDguMCp4K2VmeDgqeCk7ICAvKmF2b2lkIHVuZGVyZmxvdyAqLworCQlyZXR1cm4geCArIGVmeCp4OworCSAgICB9CisJICAgIHogPSB4Kng7CisJICAgIHIgPSBwcDAreioocHAxK3oqKHBwMit6KihwcDMreipwcDQpKSk7CisJICAgIHMgPSBvbmUreioocXExK3oqKHFxMit6KihxcTMreioocXE0K3oqcXE1KSkpKTsKKwkgICAgeSA9IHIvczsKKwkgICAgcmV0dXJuIHggKyB4Knk7CisJfQorCWlmKGl4IDwgMHgzZmY0MDAwMCkgewkJLyogMC44NDM3NSA8PSB8eHwgPCAxLjI1ICovCisJICAgIHMgPSBmYWJzKHgpLW9uZTsKKwkgICAgUCA9IHBhMCtzKihwYTErcyoocGEyK3MqKHBhMytzKihwYTQrcyoocGE1K3MqcGE2KSkpKSk7CisJICAgIFEgPSBvbmUrcyoocWExK3MqKHFhMitzKihxYTMrcyoocWE0K3MqKHFhNStzKnFhNikpKSkpOworCSAgICBpZihoeD49MCkgcmV0dXJuIGVyeCArIFAvUTsgZWxzZSByZXR1cm4gLWVyeCAtIFAvUTsKKwl9CisJaWYgKGl4ID49IDB4NDAxODAwMDApIHsJCS8qIGluZj58eHw+PTYgKi8KKwkgICAgaWYoaHg+PTApIHJldHVybiBvbmUtdGlueTsgZWxzZSByZXR1cm4gdGlueS1vbmU7CisJfQorCXggPSBmYWJzKHgpOworIAlzID0gb25lLyh4KngpOworCWlmKGl4PCAweDQwMDZEQjZFKSB7CS8qIHx4fCA8IDEvMC4zNSAqLworCSAgICBSPXJhMCtzKihyYTErcyoocmEyK3MqKHJhMytzKihyYTQrcyooCisJCQkJcmE1K3MqKHJhNitzKnJhNykpKSkpKTsKKwkgICAgUz1vbmUrcyooc2ExK3MqKHNhMitzKihzYTMrcyooc2E0K3MqKAorCQkJCXNhNStzKihzYTYrcyooc2E3K3Mqc2E4KSkpKSkpKTsKKwl9IGVsc2UgewkvKiB8eHwgPj0gMS8wLjM1ICovCisJICAgIFI9cmIwK3MqKHJiMStzKihyYjIrcyoocmIzK3MqKHJiNCtzKigKKwkJCQlyYjUrcypyYjYpKSkpKTsKKwkgICAgUz1vbmUrcyooc2IxK3MqKHNiMitzKihzYjMrcyooc2I0K3MqKAorCQkJCXNiNStzKihzYjYrcypzYjcpKSkpKSk7CisJfQorCXogID0geDsKKwlTRVRfTE9XX1dPUkQoeiwwKTsKKwlyICA9ICBfX2llZWU3NTRfZXhwKC16KnotMC41NjI1KSpfX2llZWU3NTRfZXhwKCh6LXgpKih6K3gpK1IvUyk7CisJaWYoaHg+PTApIHJldHVybiBvbmUtci94OyBlbHNlIHJldHVybiAgci94LW9uZTsKK30KKworZG91YmxlCitlcmZjKGRvdWJsZSB4KQoreworCWludDMyX3QgaHgsaXg7CisJZG91YmxlIFIsUyxQLFEscyx5LHoscjsKKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg3ZmYwMDAwMCkgewkJCS8qIGVyZmMobmFuKT1uYW4gKi8KKwkJCQkJCS8qIGVyZmMoKy1pbmYpPTAsMiAqLworCSAgICByZXR1cm4gKGRvdWJsZSkoKCh1X2ludDMyX3QpaHg+PjMxKTw8MSkrb25lL3g7CisJfQorCisJaWYoaXggPCAweDNmZWIwMDAwKSB7CQkvKiB8eHw8MC44NDM3NSAqLworCSAgICBpZihpeCA8IDB4M2M3MDAwMDApICAJLyogfHh8PDIqKi01NiAqLworCQlyZXR1cm4gb25lLXg7CisJICAgIHogPSB4Kng7CisJICAgIHIgPSBwcDAreioocHAxK3oqKHBwMit6KihwcDMreipwcDQpKSk7CisJICAgIHMgPSBvbmUreioocXExK3oqKHFxMit6KihxcTMreioocXE0K3oqcXE1KSkpKTsKKwkgICAgeSA9IHIvczsKKwkgICAgaWYoaHggPCAweDNmZDAwMDAwKSB7ICAJLyogeDwxLzQgKi8KKwkJcmV0dXJuIG9uZS0oeCt4KnkpOworCSAgICB9IGVsc2UgeworCQlyID0geCp5OworCQlyICs9ICh4LWhhbGYpOworCSAgICAgICAgcmV0dXJuIGhhbGYgLSByIDsKKwkgICAgfQorCX0KKwlpZihpeCA8IDB4M2ZmNDAwMDApIHsJCS8qIDAuODQzNzUgPD0gfHh8IDwgMS4yNSAqLworCSAgICBzID0gZmFicyh4KS1vbmU7CisJICAgIFAgPSBwYTArcyoocGExK3MqKHBhMitzKihwYTMrcyoocGE0K3MqKHBhNStzKnBhNikpKSkpOworCSAgICBRID0gb25lK3MqKHFhMStzKihxYTIrcyoocWEzK3MqKHFhNCtzKihxYTUrcypxYTYpKSkpKTsKKwkgICAgaWYoaHg+PTApIHsKKwkgICAgICAgIHogID0gb25lLWVyeDsgcmV0dXJuIHogLSBQL1E7CisJICAgIH0gZWxzZSB7CisJCXogPSBlcngrUC9ROyByZXR1cm4gb25lK3o7CisJICAgIH0KKwl9CisJaWYgKGl4IDwgMHg0MDNjMDAwMCkgewkJLyogfHh8PDI4ICovCisJICAgIHggPSBmYWJzKHgpOworIAkgICAgcyA9IG9uZS8oeCp4KTsKKwkgICAgaWYoaXg8IDB4NDAwNkRCNkQpIHsJLyogfHh8IDwgMS8uMzUgfiAyLjg1NzE0MyovCisJICAgICAgICBSPXJhMCtzKihyYTErcyoocmEyK3MqKHJhMytzKihyYTQrcyooCisJCQkJcmE1K3MqKHJhNitzKnJhNykpKSkpKTsKKwkgICAgICAgIFM9b25lK3MqKHNhMStzKihzYTIrcyooc2EzK3MqKHNhNCtzKigKKwkJCQlzYTUrcyooc2E2K3MqKHNhNytzKnNhOCkpKSkpKSk7CisJICAgIH0gZWxzZSB7CQkJLyogfHh8ID49IDEvLjM1IH4gMi44NTcxNDMgKi8KKwkJaWYoaHg8MCYmaXg+PTB4NDAxODAwMDApIHJldHVybiB0d28tdGlueTsvKiB4IDwgLTYgKi8KKwkgICAgICAgIFI9cmIwK3MqKHJiMStzKihyYjIrcyoocmIzK3MqKHJiNCtzKigKKwkJCQlyYjUrcypyYjYpKSkpKTsKKwkgICAgICAgIFM9b25lK3MqKHNiMStzKihzYjIrcyooc2IzK3MqKHNiNCtzKigKKwkJCQlzYjUrcyooc2I2K3Mqc2I3KSkpKSkpOworCSAgICB9CisJICAgIHogID0geDsKKwkgICAgU0VUX0xPV19XT1JEKHosMCk7CisJICAgIHIgID0gIF9faWVlZTc1NF9leHAoLXoqei0wLjU2MjUpKgorCQkJX19pZWVlNzU0X2V4cCgoei14KSooeit4KStSL1MpOworCSAgICBpZihoeD4wKSByZXR1cm4gci94OyBlbHNlIHJldHVybiB0d28tci94OworCX0gZWxzZSB7CisJICAgIGlmKGh4PjApIHJldHVybiB0aW55KnRpbnk7IGVsc2UgcmV0dXJuIHR3by10aW55OworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZXJmZi5jIGIvbGlibS9zcmMvc19lcmZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlMDUzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZXJmZi5jCkBAIC0wLDAgKzEsMjExIEBACisvKiBzX2VyZmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfZXJmLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2VyZmYuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0Cit0aW55CSAgICA9IDFlLTMwLAoraGFsZj0gIDUuMDAwMDAwMDAwMGUtMDEsIC8qIDB4M0YwMDAwMDAgKi8KK29uZSA9ICAxLjAwMDAwMDAwMDBlKzAwLCAvKiAweDNGODAwMDAwICovCit0d28gPSAgMi4wMDAwMDAwMDAwZSswMCwgLyogMHg0MDAwMDAwMCAqLworCS8qIGMgPSAoc3ViZmxvYXQpMC44NDUwNjI5MTE1MSAqLworZXJ4ID0gIDguNDUwNjI5MTE1MWUtMDEsIC8qIDB4M2Y1ODU2MGIgKi8KKy8qCisgKiBDb2VmZmljaWVudHMgZm9yIGFwcHJveGltYXRpb24gdG8gIGVyZiBvbiBbMCwwLjg0Mzc1XQorICovCitlZnggPSAgMS4yODM3OTE2NjEzZS0wMSwgLyogMHgzZTAzNzVkNCAqLworZWZ4OD0gIDEuMDI3MDMzMzI5MGUrMDAsIC8qIDB4M2Y4Mzc1ZDQgKi8KK3BwMCAgPSAgMS4yODM3OTE2NjEzZS0wMSwgLyogMHgzZTAzNzVkNCAqLworcHAxICA9IC0zLjI1MDQyMDk4NzZlLTAxLCAvKiAweGJlYTY2YmViICovCitwcDIgID0gLTIuODQ4MTc0OTgxOGUtMDIsIC8qIDB4YmNlOTUyOGYgKi8KK3BwMyAgPSAtNS43NzAyNzAyNDcwZS0wMywgLyogMHhiYmJkMTQ4OSAqLworcHA0ICA9IC0yLjM3NjMwMTc0NTJlLTA1LCAvKiAweGI3Yzc1NmIxICovCitxcTEgID0gIDMuOTc5MTcyMTEwNmUtMDEsIC8qIDB4M2VjYmJiY2UgKi8KK3FxMiAgPSAgNi41MDIyMjUyNTAwZS0wMiwgLyogMHgzZDg1MmE2MyAqLworcXEzICA9ICA1LjA4MTMwNjIxMTdlLTAzLCAvKiAweDNiYTY4MTE2ICovCitxcTQgID0gIDEuMzI0OTQ3MzcwNGUtMDQsIC8qIDB4MzkwYWVlNDkgKi8KK3FxNSAgPSAtMy45NjAyMjgyNDEzZS0wNiwgLyogMHhiNjg0ZTIxYSAqLworLyoKKyAqIENvZWZmaWNpZW50cyBmb3IgYXBwcm94aW1hdGlvbiB0byAgZXJmICBpbiBbMC44NDM3NSwxLjI1XQorICovCitwYTAgID0gLTIuMzYyMTE4NTY4M2UtMDMsIC8qIDB4YmIxYWNkYzYgKi8KK3BhMSAgPSAgNC4xNDg1NjEwNjA0ZS0wMSwgLyogMHgzZWQ0NjgwNSAqLworcGEyICA9IC0zLjcyMjA3ODgwMDJlLTAxLCAvKiAweGJlYmU5MjA4ICovCitwYTMgID0gIDMuMTgzNDY2MTk2MWUtMDEsIC8qIDB4M2VhMmZlNTQgKi8KK3BhNCAgPSAtMS4xMDg5NDY5NDkyZS0wMSwgLyogMHhiZGUzMWNjMiAqLworcGE1ICA9ICAzLjU0NzgzMDUwNzJlLTAyLCAvKiAweDNkMTE1MWIzICovCitwYTYgID0gLTIuMTY2Mzc1NTE3OGUtMDMsIC8qIDB4YmIwZGY5YzAgKi8KK3FhMSAgPSAgMS4wNjQyMDg4MjA1ZS0wMSwgLyogMHgzZGQ5ZjMzMSAqLworcWEyICA9ICA1LjQwMzk3OTQyMDdlLTAxLCAvKiAweDNmMGE1Nzg1ICovCitxYTMgID0gIDcuMTgyODY1NTg5OWUtMDIsIC8qIDB4M2Q5MzFhZTcgKi8KK3FhNCAgPSAgMS4yNjE3MTIxNjM3ZS0wMSwgLyogMHgzZTAxMzMwNyAqLworcWE1ICA9ICAxLjM2MzcwODM1ODNlLTAyLCAvKiAweDNjNWY2ZTEzICovCitxYTYgID0gIDEuMTk4NDUwMDEwM2UtMDIsIC8qIDB4M2M0NDVhYTMgKi8KKy8qCisgKiBDb2VmZmljaWVudHMgZm9yIGFwcHJveGltYXRpb24gdG8gIGVyZmMgaW4gWzEuMjUsMS8wLjM1XQorICovCityYTAgID0gLTkuODY0OTQ0MDMzM2UtMDMsIC8qIDB4YmMyMWEwOTMgKi8KK3JhMSAgPSAtNi45Mzg1ODU2MzkwZS0wMSwgLyogMHhiZjMxYTBiNyAqLworcmEyICA9IC0xLjA1NTg2MjYxNzVlKzAxLCAvKiAweGMxMjhmMDIyICovCityYTMgID0gLTYuMjM3NTMzMTg3OWUrMDEsIC8qIDB4YzI3OTgwNTcgKi8KK3JhNCAgPSAtMS42MjM5NjY2NzQ4ZSswMiwgLyogMHhjMzIyNjU4YyAqLworcmE1ICA9IC0xLjg0NjA1MDg3MjhlKzAyLCAvKiAweGMzMzg5YWU3ICovCityYTYgID0gLTguMTI4NzQzNzQzOWUrMDEsIC8qIDB4YzJhMjkzMmIgKi8KK3JhNyAgPSAtOS44MTQzMjkxNDczZSswMCwgLyogMHhjMTFkMDc3ZSAqLworc2ExICA9ICAxLjk2NTEyNzE4MjBlKzAxLCAvKiAweDQxOWQzNWNlICovCitzYTIgID0gIDEuMzc2NTc3NjA2MmUrMDIsIC8qIDB4NDMwOWE4NjMgKi8KK3NhMyAgPSAgNC4zNDU2NTg4NzQ1ZSswMiwgLyogMHg0M2Q5NDg2ZiAqLworc2E0ICA9ICA2LjQ1Mzg3MjY4MDdlKzAyLCAvKiAweDQ0MjE1OGM5ICovCitzYTUgID0gIDQuMjkwMDgxNDgxOWUrMDIsIC8qIDB4NDNkNjgxMGIgKi8KK3NhNiAgPSAgMS4wODYzNTAwMjE0ZSswMiwgLyogMHg0MmQ5NDUxZiAqLworc2E3ICA9ICA2LjU3MDI0OTU1NzVlKzAwLCAvKiAweDQwZDIzZjdjICovCitzYTggID0gLTYuMDQyNDQxMzUzMmUtMDIsIC8qIDB4YmQ3NzdmOTcgKi8KKy8qCisgKiBDb2VmZmljaWVudHMgZm9yIGFwcHJveGltYXRpb24gdG8gIGVyZmMgaW4gWzEvLjM1LDI4XQorICovCityYjAgID0gLTkuODY0OTQzMTAyMGUtMDMsIC8qIDB4YmMyMWEwOTIgKi8KK3JiMSAgPSAtNy45OTI4MzI2NjA3ZS0wMSwgLyogMHhiZjRjOWRkNCAqLworcmIyICA9IC0xLjc3NTc5NTU1NTFlKzAxLCAvKiAweGMxOGUxMDRiICovCityYjMgID0gLTEuNjA2MzYzODMwNmUrMDIsIC8qIDB4YzMyMGEyZWEgKi8KK3JiNCAgPSAtNi4zNzU2NjQ2NzI5ZSswMiwgLyogMHhjNDFmNjQ0MSAqLworcmI1ICA9IC0xLjAyNTA5NTA5MjhlKzAzLCAvKiAweGM0ODAyMzBiICovCityYjYgID0gLTQuODM1MTkxOTU1NmUrMDIsIC8qIDB4YzNmMWMyNzUgKi8KK3NiMSAgPSAgMy4wMzM4MDYwMzc5ZSswMSwgLyogMHg0MWYyYjQ1OSAqLworc2IyICA9ICAzLjI1NzkyNTEwOTllKzAyLCAvKiAweDQzYTJlNTcxICovCitzYjMgID0gIDEuNTM2NzI5NjE0M2UrMDMsIC8qIDB4NDRjMDE3NTkgKi8KK3NiNCAgPSAgMy4xOTk4NTgxNTQzZSswMywgLyogMHg0NTQ3ZmRiYiAqLworc2I1ICA9ICAyLjU1MzA1MDI5MzBlKzAzLCAvKiAweDQ1MWY5MGNlICovCitzYjYgID0gIDQuNzQ1Mjg1MzM5NGUrMDIsIC8qIDB4NDNlZDQzYTcgKi8KK3NiNyAgPSAtMi4yNDQwOTUyMzAxZSswMTsgLyogMHhjMWIzODcxMiAqLworCitmbG9hdAorZXJmZihmbG9hdCB4KQoreworCWludDMyX3QgaHgsaXgsaTsKKwlmbG9hdCBSLFMsUCxRLHMseSx6LHI7CisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmKGl4Pj0weDdmODAwMDAwKSB7CQkvKiBlcmYobmFuKT1uYW4gKi8KKwkgICAgaSA9ICgodV9pbnQzMl90KWh4Pj4zMSk8PDE7CisJICAgIHJldHVybiAoZmxvYXQpKDEtaSkrb25lL3g7CS8qIGVyZigrLWluZik9Ky0xICovCisJfQorCisJaWYoaXggPCAweDNmNTgwMDAwKSB7CQkvKiB8eHw8MC44NDM3NSAqLworCSAgICBpZihpeCA8IDB4MzE4MDAwMDApIHsgCS8qIHx4fDwyKiotMjggKi8KKwkgICAgICAgIGlmIChpeCA8IDB4MDQwMDAwMDApCisJCSAgICAvKmF2b2lkIHVuZGVyZmxvdyAqLworCQkgICAgcmV0dXJuIChmbG9hdCkwLjEyNSooKGZsb2F0KTguMCp4K2VmeDgqeCk7CisJCXJldHVybiB4ICsgZWZ4Kng7CisJICAgIH0KKwkgICAgeiA9IHgqeDsKKwkgICAgciA9IHBwMCt6KihwcDEreioocHAyK3oqKHBwMyt6KnBwNCkpKTsKKwkgICAgcyA9IG9uZSt6KihxcTEreioocXEyK3oqKHFxMyt6KihxcTQreipxcTUpKSkpOworCSAgICB5ID0gci9zOworCSAgICByZXR1cm4geCArIHgqeTsKKwl9CisJaWYoaXggPCAweDNmYTAwMDAwKSB7CQkvKiAwLjg0Mzc1IDw9IHx4fCA8IDEuMjUgKi8KKwkgICAgcyA9IGZhYnNmKHgpLW9uZTsKKwkgICAgUCA9IHBhMCtzKihwYTErcyoocGEyK3MqKHBhMytzKihwYTQrcyoocGE1K3MqcGE2KSkpKSk7CisJICAgIFEgPSBvbmUrcyoocWExK3MqKHFhMitzKihxYTMrcyoocWE0K3MqKHFhNStzKnFhNikpKSkpOworCSAgICBpZihoeD49MCkgcmV0dXJuIGVyeCArIFAvUTsgZWxzZSByZXR1cm4gLWVyeCAtIFAvUTsKKwl9CisJaWYgKGl4ID49IDB4NDBjMDAwMDApIHsJCS8qIGluZj58eHw+PTYgKi8KKwkgICAgaWYoaHg+PTApIHJldHVybiBvbmUtdGlueTsgZWxzZSByZXR1cm4gdGlueS1vbmU7CisJfQorCXggPSBmYWJzZih4KTsKKyAJcyA9IG9uZS8oeCp4KTsKKwlpZihpeDwgMHg0MDM2REI2RSkgewkvKiB8eHwgPCAxLzAuMzUgKi8KKwkgICAgUj1yYTArcyoocmExK3MqKHJhMitzKihyYTMrcyoocmE0K3MqKAorCQkJCXJhNStzKihyYTYrcypyYTcpKSkpKSk7CisJICAgIFM9b25lK3MqKHNhMStzKihzYTIrcyooc2EzK3MqKHNhNCtzKigKKwkJCQlzYTUrcyooc2E2K3MqKHNhNytzKnNhOCkpKSkpKSk7CisJfSBlbHNlIHsJLyogfHh8ID49IDEvMC4zNSAqLworCSAgICBSPXJiMCtzKihyYjErcyoocmIyK3MqKHJiMytzKihyYjQrcyooCisJCQkJcmI1K3MqcmI2KSkpKSk7CisJICAgIFM9b25lK3MqKHNiMStzKihzYjIrcyooc2IzK3MqKHNiNCtzKigKKwkJCQlzYjUrcyooc2I2K3Mqc2I3KSkpKSkpOworCX0KKwlHRVRfRkxPQVRfV09SRChpeCx4KTsKKwlTRVRfRkxPQVRfV09SRCh6LGl4JjB4ZmZmZmYwMDApOworCXIgID0gIF9faWVlZTc1NF9leHBmKC16KnotKGZsb2F0KTAuNTYyNSkqX19pZWVlNzU0X2V4cGYoKHoteCkqKHoreCkrUi9TKTsKKwlpZihoeD49MCkgcmV0dXJuIG9uZS1yL3g7IGVsc2UgcmV0dXJuICByL3gtb25lOworfQorCitmbG9hdAorZXJmY2YoZmxvYXQgeCkKK3sKKwlpbnQzMl90IGh4LGl4OworCWZsb2F0IFIsUyxQLFEscyx5LHoscjsKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4N2Y4MDAwMDApIHsJCQkvKiBlcmZjKG5hbik9bmFuICovCisJCQkJCQkvKiBlcmZjKCstaW5mKT0wLDIgKi8KKwkgICAgcmV0dXJuIChmbG9hdCkoKCh1X2ludDMyX3QpaHg+PjMxKTw8MSkrb25lL3g7CisJfQorCisJaWYoaXggPCAweDNmNTgwMDAwKSB7CQkvKiB8eHw8MC44NDM3NSAqLworCSAgICBpZihpeCA8IDB4MjM4MDAwMDApICAJLyogfHh8PDIqKi01NiAqLworCQlyZXR1cm4gb25lLXg7CisJICAgIHogPSB4Kng7CisJICAgIHIgPSBwcDAreioocHAxK3oqKHBwMit6KihwcDMreipwcDQpKSk7CisJICAgIHMgPSBvbmUreioocXExK3oqKHFxMit6KihxcTMreioocXE0K3oqcXE1KSkpKTsKKwkgICAgeSA9IHIvczsKKwkgICAgaWYoaHggPCAweDNlODAwMDAwKSB7ICAJLyogeDwxLzQgKi8KKwkJcmV0dXJuIG9uZS0oeCt4KnkpOworCSAgICB9IGVsc2UgeworCQlyID0geCp5OworCQlyICs9ICh4LWhhbGYpOworCSAgICAgICAgcmV0dXJuIGhhbGYgLSByIDsKKwkgICAgfQorCX0KKwlpZihpeCA8IDB4M2ZhMDAwMDApIHsJCS8qIDAuODQzNzUgPD0gfHh8IDwgMS4yNSAqLworCSAgICBzID0gZmFic2YoeCktb25lOworCSAgICBQID0gcGEwK3MqKHBhMStzKihwYTIrcyoocGEzK3MqKHBhNCtzKihwYTUrcypwYTYpKSkpKTsKKwkgICAgUSA9IG9uZStzKihxYTErcyoocWEyK3MqKHFhMytzKihxYTQrcyoocWE1K3MqcWE2KSkpKSk7CisJICAgIGlmKGh4Pj0wKSB7CisJICAgICAgICB6ICA9IG9uZS1lcng7IHJldHVybiB6IC0gUC9ROworCSAgICB9IGVsc2UgeworCQl6ID0gZXJ4K1AvUTsgcmV0dXJuIG9uZSt6OworCSAgICB9CisJfQorCWlmIChpeCA8IDB4NDFlMDAwMDApIHsJCS8qIHx4fDwyOCAqLworCSAgICB4ID0gZmFic2YoeCk7CisgCSAgICBzID0gb25lLyh4KngpOworCSAgICBpZihpeDwgMHg0MDM2REI2RCkgewkvKiB8eHwgPCAxLy4zNSB+IDIuODU3MTQzKi8KKwkgICAgICAgIFI9cmEwK3MqKHJhMStzKihyYTIrcyoocmEzK3MqKHJhNCtzKigKKwkJCQlyYTUrcyoocmE2K3MqcmE3KSkpKSkpOworCSAgICAgICAgUz1vbmUrcyooc2ExK3MqKHNhMitzKihzYTMrcyooc2E0K3MqKAorCQkJCXNhNStzKihzYTYrcyooc2E3K3Mqc2E4KSkpKSkpKTsKKwkgICAgfSBlbHNlIHsJCQkvKiB8eHwgPj0gMS8uMzUgfiAyLjg1NzE0MyAqLworCQlpZihoeDwwJiZpeD49MHg0MGMwMDAwMCkgcmV0dXJuIHR3by10aW55Oy8qIHggPCAtNiAqLworCSAgICAgICAgUj1yYjArcyoocmIxK3MqKHJiMitzKihyYjMrcyoocmI0K3MqKAorCQkJCXJiNStzKnJiNikpKSkpOworCSAgICAgICAgUz1vbmUrcyooc2IxK3MqKHNiMitzKihzYjMrcyooc2I0K3MqKAorCQkJCXNiNStzKihzYjYrcypzYjcpKSkpKSk7CisJICAgIH0KKwkgICAgR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJICAgIFNFVF9GTE9BVF9XT1JEKHosaXgmMHhmZmZmZjAwMCk7CisJICAgIHIgID0gIF9faWVlZTc1NF9leHBmKC16KnotKGZsb2F0KTAuNTYyNSkqCisJCQlfX2llZWU3NTRfZXhwZigoei14KSooeit4KStSL1MpOworCSAgICBpZihoeD4wKSByZXR1cm4gci94OyBlbHNlIHJldHVybiB0d28tci94OworCX0gZWxzZSB7CisJICAgIGlmKGh4PjApIHJldHVybiB0aW55KnRpbnk7IGVsc2UgcmV0dXJuIHR3by10aW55OworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZXhwMi5jIGIvbGlibS9zcmMvc19leHAyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRkZWYwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZXhwMi5jCkBAIC0wLDAgKzEsMzg5IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2V4cDIuYyx2IDEuMSAyMDA1LzA0LzA1IDAyOjU3OjE1IGRhcyBFeHAgJCIpOyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisjZGVmaW5lCVRCTEJJVFMJOAorI2RlZmluZQlUQkxTSVpFCSgxIDw8IFRCTEJJVFMpCisKK3N0YXRpYyBjb25zdCBkb3VibGUKKyAgICBodWdlICAgICA9IDB4MXAxMDAwLAorICAgIHR3b20xMDAwID0gMHgxcC0xMDAwLAorICAgIHJlZHV4ICAgID0gMHgxLjhwNTIgLyBUQkxTSVpFLAorICAgIFAxCSAgICAgPSAweDEuNjJlNDJmZWZhMzllZnAtMSwKKyAgICBQMgkgICAgID0gMHgxLmViZmJkZmY4MmM1NzVwLTMsCisgICAgUDMJICAgICA9IDB4MS5jNmIwOGQ3MDRhMGE2cC01LAorICAgIFA0CSAgICAgPSAweDEuM2IyYWI4OGY3MDQwMHAtNywKKyAgICBQNQkgICAgID0gMHgxLjVkODgwMDM4NzVjNzRwLTEwOworCitzdGF0aWMgY29uc3QgZG91YmxlIHRibFtUQkxTSVpFICogMl0gPSB7CisvKglleHAyKHogKyBlcHMpCQllcHMJKi8KKwkweDEuNmEwOWU2NjdmM2Q1ZHAtMSwJIDB4MS45ODgwcC00NCwKKwkweDEuNmIwNTJmYTc1MTc0NHAtMSwJIDB4MS44MDAwcC01MCwKKwkweDEuNmMwMTI3NTBiZDlmZXAtMSwJLTB4MS44NzgwcC00NSwKKwkweDEuNmNmZGNkZGQ0NzZiZnAtMSwJIDB4MS5lYzAwcC00NiwKKwkweDEuNmRmYjIzYzY1MWEyOXAtMSwJLTB4MS44MDAwcC01MCwKKwkweDEuNmVmOTI5ODU5M2FlM3AtMSwJLTB4MS5jMDAwcC01MiwKKwkweDEuNmZmN2RmOTUxOTM4NnAtMSwJLTB4MS5mZDgwcC00NSwKKwkweDEuNzBmNzQ2NmY0MmRhM3AtMSwJLTB4MS5jODgwcC00NSwKKwkweDEuNzFmNzVlOGVjNWZjM3AtMSwJIDB4MS4zYzAwcC00NiwKKwkweDEuNzJmODI4NmVhY2YwNXAtMSwJLTB4MS44MzAwcC00NCwKKwkweDEuNzNmOWE0OGE1ODE1MnAtMSwJLTB4MS4wYzAwcC00NywKKwkweDEuNzRmYmQzNWQ3Y2NmY3AtMSwJIDB4MS5mODgwcC00NSwKKwkweDEuNzVmZWI1NjQyNjdmMXAtMSwJIDB4MS4zZTAwcC00NywKKwkweDEuNzcwMjRiMWFiNmQ0OHAtMSwJLTB4MS43ZDAwcC00NSwKKwkweDEuNzgwNjk0ZmRlNWQzOHAtMSwJLTB4MS5kMDAwcC01MCwKKwkweDEuNzkwYjkzOGFjMWQwMHAtMSwJIDB4MS4zMDAwcC00OSwKKwkweDEuN2ExMTQ3M2ViMDE3OHAtMSwJLTB4MS5kMDAwcC00OSwKKwkweDEuN2IxN2IwOTc2ZDA2MHAtMSwJIDB4MS4wNDAwcC00NSwKKwkweDEuN2MxZWQwMTMwYzEzM3AtMSwJIDB4MS4wMDAwcC01MywKKwkweDEuN2QyNmE2MmZmODYzNnAtMSwJLTB4MS42OTAwcC00NSwKKwkweDEuN2UyZjMzNmNmNGUzYnAtMSwJLTB4MS4yZTAwcC00NywKKwkweDEuN2YzODc4NDkxYzNlOHAtMSwJLTB4MS40NTgwcC00NSwKKwkweDEuODA0Mjc1NDNlMWI0ZXAtMSwJIDB4MS4zMDAwcC00NCwKKwkweDEuODE0ZDJhZGQxMDcxYXAtMSwJIDB4MS5mMDAwcC00NywKKwkweDEuODI1ODk5OTRjY2Q3ZXAtMSwJLTB4MS4xYzAwcC00NSwKKwkweDEuODM2NGMxZWI5NDJkMHAtMSwJIDB4MS45ZDAwcC00NSwKKwkweDEuODQ3MWE0NjIzY2FiNXAtMSwJIDB4MS43MTAwcC00MywKKwkweDEuODU3ZjQxNzlmNWJiY3AtMSwJIDB4MS4yNjAwcC00NSwKKwkweDEuODY4ZDk5YjQ0OTFhZnAtMSwJLTB4MS4yYzQwcC00NCwKKwkweDEuODc5Y2FkOTMxYTM5NXAtMSwJLTB4MS4zMDAwcC00NSwKKwkweDEuODhhYzdkOThhNjViOHAtMSwJLTB4MS5hODAwcC00NSwKKwkweDEuODliZDBhNDc4NTgwMHAtMSwJLTB4MS5kMDAwcC00OSwKKwkweDEuOGFjZTU0MjJhYTIyM3AtMSwJIDB4MS4zMjgwcC00NCwKKwkweDEuOGJlMDViYWQ2MTlmYXAtMSwJIDB4MS4yYjQwcC00MywKKwkweDEuOGNmMzIxNmI1NDM4M3AtMSwJLTB4MS5lZDAwcC00NSwKKwkweDEuOGUwNmE1ZTA4NjY0Y3AtMSwJLTB4MS4wNTAwcC00NSwKKwkweDEuOGYxYWU5OTE1NzgwN3AtMSwJIDB4MS44MjgwcC00NSwKKwkweDEuOTAyZmVkMDI4MmMwZXAtMSwJLTB4MS5jYjAwcC00NiwKKwkweDEuOTE0NWIwYjkxZmY5NnAtMSwJLTB4MS41ZTAwcC00NywKKwkweDEuOTI1YzM1M2FhMmZmOXAtMSwJIDB4MS41NDAwcC00OCwKKwkweDEuOTM3MzdiMGNkYzY0YXAtMSwJIDB4MS43MjAwcC00NiwKKwkweDEuOTQ4YjgyYjVmOThhZXAtMSwJLTB4MS45MDAwcC00NywKKwkweDEuOTVhNDRjYmM4NTJjYnAtMSwJIDB4MS41NjgwcC00NSwKKwkweDEuOTZiZGQ5YTc2NmYyMXAtMSwJLTB4MS42ZDAwcC00NCwKKwkweDEuOTdkODI5ZmRlNGUyYXAtMSwJLTB4MS4xMDAwcC00NywKKwkweDEuOThmMzNlNDdhMjNhM3AtMSwJIDB4MS5kMDAwcC00NSwKKwkweDEuOWEwZjE3MGNhMDYwNHAtMSwJLTB4MS44YTQwcC00NCwKKwkweDEuOWIyYmI0ZDUzZmY4OXAtMSwJIDB4MS41NWMwcC00NCwKKwkweDEuOWM0OTE4MmEzZjE1YnAtMSwJIDB4MS42YjgwcC00NSwKKwkweDEuOWQ2NzQxOTRiYjhjNXAtMSwJLTB4MS5jMDAwcC00OSwKKwkweDEuOWU4NjMxOWUzMjM4ZXAtMSwJIDB4MS43ZDAwcC00NiwKKwkweDEuOWZhNWU4ZDA3ZjMwMnAtMSwJIDB4MS42NDAwcC00NiwKKwkweDEuYTBjNjY3YjVkZTU0ZHAtMSwJLTB4MS41MDAwcC00OCwKKwkweDEuYTFlN2FlZDhlYjhmNnAtMSwJIDB4MS45ZTAwcC00NywKKwkweDEuYTMwOWJlYzRhMmUyN3AtMSwJIDB4MS5hZDgwcC00NSwKKwkweDEuYTQyYzk4MDQ2MGE1ZHAtMSwJLTB4MS5hZjAwcC00NiwKKwkweDEuYTU1MDNiMjNlMjU5YnAtMSwJIDB4MS5iNjAwcC00NywKKwkweDEuYTY3NGE4YWY0NjIxM3AtMSwJIDB4MS44ODgwcC00NCwKKwkweDEuYTc5OWUxMzMwYjNhN3AtMSwJIDB4MS4xMjAwcC00NiwKKwkweDEuYThiZmU1M2MxMmU4ZHAtMSwJIDB4MS42YzAwcC00NywKKwkweDEuYTllNmI1NTc5ZmNkMnAtMSwJLTB4MS45YjgwcC00NSwKKwkweDEuYWIwZTUyMTM1NmZiOHAtMSwJIDB4MS5iNzAwcC00NSwKKwkweDEuYWMzNmJiZmQzZjM4MXAtMSwJIDB4MS45MDAwcC01MCwKKwkweDEuYWQ1ZmYzYTNjMjc4MHAtMSwJIDB4MS40MDAwcC00OSwKKwkweDEuYWU4OWY5OTVhZDJhM3AtMSwJLTB4MS5jOTAwcC00NSwKKwkweDEuYWZiNGNlNjIyZjM2N3AtMSwJIDB4MS42NTAwcC00NiwKKwkweDEuYjBlMDcyOThkYjc5MHAtMSwJIDB4MS5mZDQwcC00NSwKKwkweDEuYjIwY2U2YzlhODlhOXAtMSwJIDB4MS4yNzAwcC00NiwKKwkweDEuYjMzYTJiODRmMWE0YnAtMSwJIDB4MS5kNDcwcC00MywKKwkweDEuYjQ2ODQxNWI3NDdlN3AtMSwJLTB4MS44MzgwcC00NCwKKwkweDEuYjU5NzI4ZGU1NTkzYXAtMSwJIDB4MS44MDAwcC01NCwKKwkweDEuYjZjNmUyOWYxYzU2YXAtMSwJIDB4MS5hZDAwcC00NywKKwkweDEuYjdmNzZmMmZiNWU1MHAtMSwJIDB4MS5lODAwcC01MCwKKwkweDEuYjkyOGNmMjI3NDliMnAtMSwJLTB4MS40YzAwcC00NywKKwkweDEuYmE1YjAzMGExMDYwM3AtMSwJLTB4MS5kNzAwcC00NywKKwkweDEuYmI4ZTBiNzlhNmY2NnAtMSwJIDB4MS5kOTAwcC00NywKKwkweDEuYmNjMWU5MDRiYzFmZnAtMSwJIDB4MS4yYTAwcC00NywKKwkweDEuYmRmNjljM2YzYTE2ZnAtMSwJLTB4MS5mNzgwcC00NiwKKwkweDEuYmYyYzI1YmQ3MWRiOHAtMSwJLTB4MS4wYTAwcC00NiwKKwkweDEuYzA2Mjg2MTQxYjJlOXAtMSwJLTB4MS4xNDAwcC00NiwKKwkweDEuYzE5OWJkZDg1NTJlMHAtMSwJIDB4MS5iZTAwcC00NywKKwkweDEuYzJkMWNkOWZhNjRlZXAtMSwJLTB4MS45NDAwcC00NywKKwkweDEuYzQwYWI1ZmZmZDAyZnAtMSwJLTB4MS5lZDAwcC00NywKKwkweDEuYzU0NDc3OGZhZmQxNXAtMSwJIDB4MS45NjYwcC00NCwKKwkweDEuYzY3ZjEyZTU3ZDBjYnAtMSwJLTB4MS5hMTAwcC00NiwKKwkweDEuYzdiYTg4OTg4YzFiNnAtMSwJLTB4MS44NDU4cC00MiwKKwkweDEuYzhmNmQ5NDA2ZTczM3AtMSwJLTB4MS5hNDgwcC00NiwKKwkweDEuY2EzNDA1NzUxYzRkZnAtMSwJIDB4MS5iMDAwcC01MSwKKwkweDEuY2I3MjBkY2VmOTA5NHAtMSwJIDB4MS4xNDAwcC00NywKKwkweDEuY2NiMGYyZTZkMTY4OXAtMSwJIDB4MS4wMjAwcC00OCwKKwkweDEuY2RmMGI1NTVkYzQxMnAtMSwJIDB4MS4zNjAwcC00OCwKKwkweDEuY2YzMTU1YjViYWIzYnAtMSwJLTB4MS42OTAwcC00NywKKwkweDEuZDA3MmQ0YTA3ODliY3AtMSwJIDB4MS45YTAwcC00NywKKwkweDEuZDFiNTMyYjA4YzhmYXAtMSwJLTB4MS41ZTAwcC00NiwKKwkweDEuZDJmODcwODBkOGE4NXAtMSwJIDB4MS5kMjgwcC00NiwKKwkweDEuZDQzYzhlYWNhYTIwM3AtMSwJIDB4MS4xYTAwcC00NywKKwkweDEuZDU4MThkY2ZiYTQ5MXAtMSwJIDB4MS5mMDAwcC01MCwKKwkweDEuZDZjNzZlODYyZTZhMXAtMSwJLTB4MS4zYTAwcC00NywKKwkweDEuZDgwZTMxNmM5ODM0ZXAtMSwJLTB4MS5jZDgwcC00NywKKwkweDEuZDk1NWQ3MWZmNjA5MHAtMSwJIDB4MS40YzAwcC00OCwKKwkweDEuZGE5ZTYwM2RiMzJhZXAtMSwJIDB4MS5mOTAwcC00OCwKKwkweDEuZGJlN2NkNjNhODMyNXAtMSwJIDB4MS45ODAwcC00OSwKKwkweDEuZGQzMjFmMzAxYjQ0NXAtMSwJLTB4MS41MjAwcC00OCwKKwkweDEuZGU3ZDU2NDFjMDViZnAtMSwJLTB4MS5kNzAwcC00NiwKKwkweDEuZGZjOTczMzdiOWFlY3AtMSwJLTB4MS42MTQwcC00NiwKKwkweDEuZTExNjc2YjE5N2Q1ZXAtMSwJIDB4MS5iNDgwcC00NywKKwkweDEuZTI2NDYxNGY1YTNlN3AtMSwJIDB4MS4wY2UwcC00MywKKwkweDEuZTNiMzMzYjE2ZWU1Y3AtMSwJIDB4MS5jNjgwcC00NywKKwkweDEuZTUwMmVlNzhiM2ZiNHAtMSwJLTB4MS45MzAwcC00NywKKwkweDEuZTY1MzkyNDY3NmQ2OHAtMSwJLTB4MS41MDAwcC00OSwKKwkweDEuZTdhNTFmYmM3NGM0NHAtMSwJLTB4MS43ZjgwcC00NywKKwkweDEuZThmNzk3N2NkYjcyNnAtMSwJLTB4MS4zNzAwcC00OCwKKwkweDEuZWE0YWZhMmE0OTBlOHAtMSwJIDB4MS41ZDAwcC00OSwKKwkweDEuZWI5ZjQ4NjdjY2FlNHAtMSwJIDB4MS42MWEwcC00NiwKKwkweDEuZWNmNDgyZDhlNjgwZHAtMSwJIDB4MS41NTAwcC00OCwKKwkweDEuZWU0YWFhMjE4ODUxNHAtMSwJIDB4MS42NDAwcC01MSwKKwkweDEuZWZhMWJlZTYxNWExM3AtMSwJLTB4MS5lODAwcC00OSwKKwkweDEuZjBmOWMxY2I2NDEwNnAtMSwJLTB4MS5hODgwcC00OCwKKwkweDEuZjI1MmIzNzZiYjk2M3AtMSwJLTB4MS5jOTAwcC00NSwKKwkweDEuZjNhYzk0OGRkNzI3NXAtMSwJIDB4MS5hMDAwcC01MywKKwkweDEuZjUwNzY1YjZlNDUyNHAtMSwJLTB4MS40ZjAwcC00OCwKKwkweDEuZjY2MzI3OTg4NDRmZHAtMSwJIDB4MS5hODAwcC01MSwKKwkweDEuZjdiZmRhZDljYmUzOHAtMSwJIDB4MS5hYmMwcC00OCwKKwkweDEuZjkxZDgwMjI0M2M4MnAtMSwJLTB4MS40NjAwcC01MCwKKwkweDEuZmE3YzE4MTllOTA4ZXAtMSwJLTB4MS5iMGMwcC00NywKKwkweDEuZmJkYmEzNjkyZDUxMXAtMSwJLTB4MS4wZTAwcC01MSwKKwkweDEuZmQzYzIyYjhmNzE5NHAtMSwJLTB4MS4wZGU4cC00NiwKKwkweDEuZmU5ZDk2YjJhMjNlZXAtMSwJIDB4MS5lNDMwcC00OSwKKwkweDEuMDAwMDAwMDAwMDAwMHArMCwJIDB4MC4wMDAwcCswLAorCTB4MS4wMGIxYWZhNWFiY2JlcCswLAktMHgxLjM0MDBwLTUyLAorCTB4MS4wMTYzZGE5ZmIzMzAzcCswLAktMHgxLjIxNzBwLTQ2LAorCTB4MS4wMjE2ODE0M2IwMjgycCswLAkgMHgxLmE0MDBwLTUyLAorCTB4MS4wMmM5YTNlNzc4MDZjcCswLAkgMHgxLmY5ODBwLTQ5LAorCTB4MS4wMzdkNDJlMTFiYmNhcCswLAktMHgxLjc0MDBwLTUxLAorCTB4MS4wNDMxNWU4NmU3Zjg5cCswLAkgMHgxLjgzMDBwLTUwLAorCTB4MS4wNGU1ZjcyZjY1NDY3cCswLAktMHgxLmEzZjBwLTQ2LAorCTB4MS4wNTliMGQzMTU4NTVhcCswLAktMHgxLjI4NDBwLTQ3LAorCTB4MS4wNjUwYTBlM2MxZjk1cCswLAkgMHgxLjE2MDBwLTQ4LAorCTB4MS4wNzA2YjI5ZGRmNzFhcCswLAkgMHgxLjUyNDBwLTQ2LAorCTB4MS4wN2JkNDJiNzJhODJkcCswLAktMHgxLjlhMDBwLTQ5LAorCTB4MS4wODc0NTE4NzU5YmQwcCswLAkgMHgxLjY0MDBwLTQ5LAorCTB4MS4wOTJiZGY2NjYwN2M4cCswLAktMHgxLjA3ODBwLTQ3LAorCTB4MS4wOWUzZWNhYzZmMzgzcCswLAktMHgxLjgwMDBwLTU0LAorCTB4MS4wYTljNzliMWYzOTMwcCswLAkgMHgxLmZhMDBwLTQ4LAorCTB4MS4wYjU1ODZjZjk4OGZjcCswLAktMHgxLmFjODBwLTQ4LAorCTB4MS4wYzBmMTQ1ZTQ2YzhhcCswLAkgMHgxLjljMDBwLTUwLAorCTB4MS4wY2M5MjJiNzI0ODE2cCswLAkgMHgxLjUyMDBwLTQ3LAorCTB4MS4wZDgzYjIzMzk1ZGQ4cCswLAktMHgxLmFkMDBwLTQ4LAorCTB4MS4wZTNlYzMyZDNkMWYzcCswLAkgMHgxLmJhYzBwLTQ2LAorCTB4MS4wZWZhNTVmZGZhOWE2cCswLAktMHgxLjRlODBwLTQ3LAorCTB4MS4wZmI2NmFmZmVkMmYwcCswLAktMHgxLmQzMDBwLTQ3LAorCTB4MS4xMDczMDI4ZDcyMzRicCswLAkgMHgxLjE1MDBwLTQ4LAorCTB4MS4xMTMwMWQwMTI1YjVicCswLAkgMHgxLmMwMDBwLTQ5LAorCTB4MS4xMWVkYmFiNWUyYWY5cCswLAkgMHgxLjZiYzBwLTQ2LAorCTB4MS4xMmFiZGMwNmMzMWQ1cCswLAkgMHgxLjg0MDBwLTQ5LAorCTB4MS4xMzZhODE0ZjIwNDdkcCswLAktMHgxLmVkMDBwLTQ3LAorCTB4MS4xNDI5YWFlYTkyZGU5cCswLAkgMHgxLjhlMDBwLTQ5LAorCTB4MS4xNGU5NTkzNGYzMTM4cCswLAkgMHgxLmI0MDBwLTQ5LAorCTB4MS4xNWE5OGM4YTU4ZTcxcCswLAkgMHgxLjUzMDBwLTQ3LAorCTB4MS4xNjZhNDU0NzFjM2RmcCswLAkgMHgxLjMzODBwLTQ3LAorCTB4MS4xNzJiODNjN2Q1MjExcCswLAkgMHgxLjhkNDBwLTQ1LAorCTB4MS4xN2VkNDg2OTViYjlmcCswLAktMHgxLjVkMDBwLTQ3LAorCTB4MS4xOGFmOTM4OGM4ZDkzcCswLAktMHgxLmM4ODBwLTQ2LAorCTB4MS4xOTcyNjU4Mzc1ZDY2cCswLAkgMHgxLjFmMDBwLTQ2LAorCTB4MS4xYTM1YmViNmZjYmE3cCswLAkgMHgxLjA0ODBwLTQ2LAorCTB4MS4xYWY5OWY4MTM4N2UzcCswLAktMHgxLjczOTBwLTQzLAorCTB4MS4xYmJlMDg0MDQ1ZDU0cCswLAkgMHgxLjRlNDBwLTQ1LAorCTB4MS4xYzgyZjk1MjgxYzQzcCswLAktMHgxLmEyMDBwLTQ3LAorCTB4MS4xZDQ4NzMxNjhiOWIycCswLAkgMHgxLjM4MDBwLTQ5LAorCTB4MS4xZTBlNzVlYjQ0MDMxcCswLAkgMHgxLmFjMDBwLTQ5LAorCTB4MS4xZWQ1MDIyZmNkOTM4cCswLAkgMHgxLjE5MDBwLTQ3LAorCTB4MS4xZjljMTg0MzhjZGY3cCswLAktMHgxLmI3ODBwLTQ2LAorCTB4MS4yMDYzYjg4NjI4ZDhmcCswLAkgMHgxLmQ5NDBwLTQ1LAorCTB4MS4yMTJiZTM1NzhhODFlcCswLAkgMHgxLjgwMDBwLTUwLAorCTB4MS4yMWY0OTkxN2RkZDQxcCswLAkgMHgxLmIzNDBwLTQ1LAorCTB4MS4yMmJkZGEyNzkxMzIzcCswLAkgMHgxLjlmODBwLTQ2LAorCTB4MS4yMzg3YTZlNzU2MWU3cCswLAktMHgxLjljODBwLTQ2LAorCTB4MS4yNDUxZmZiODIxNDI3cCswLAkgMHgxLjIzMDBwLTQ3LAorCTB4MS4yNTFjZTRmYjJhNjAycCswLAktMHgxLjM0ODBwLTQ2LAorCTB4MS4yNWU4NTcxMWVjZWIwcCswLAkgMHgxLjI3MDBwLTQ2LAorCTB4MS4yNmI0NTY1ZTI3ZDE2cCswLAkgMHgxLjFkMDBwLTQ2LAorCTB4MS4yNzgwZTM0MWRlMDBmcCswLAkgMHgxLjFlZTBwLTQ0LAorCTB4MS4yODRkZmUxZjU2MzNlcCswLAktMHgxLjRjMDBwLTQ2LAorCTB4MS4yOTFiYTc1OTFiYjMwcCswLAktMHgxLjNkODBwLTQ2LAorCTB4MS4yOWU5ZGY1MWZkZjA5cCswLAkgMHgxLjhiMDBwLTQ3LAorCTB4MS4yYWI4YTY2ZDEwZTlicCswLAktMHgxLjI3YzBwLTQ1LAorCTB4MS4yYjg3ZmQwZGFkYTNhcCswLAkgMHgxLmEzNDBwLTQ1LAorCTB4MS4yYzU3ZTM5NzcxYWY5cCswLAktMHgxLjA4MDBwLTQ2LAorCTB4MS4yZDI4NWE2ZTQwMmQ5cCswLAktMHgxLmVkMDBwLTQ3LAorCTB4MS4yZGY5NjFmNjQxNTc5cCswLAktMHgxLjQyMDBwLTQ4LAorCTB4MS4yZWNhZmE5M2UyZWNmcCswLAktMHgxLjQ5ODBwLTQ1LAorCTB4MS4yZjlkMjRhYmQ4ODIycCswLAktMHgxLjYzMDBwLTQ2LAorCTB4MS4zMDZmZTBhMzFiNjI1cCswLAktMHgxLjIzNjBwLTQ0LAorCTB4MS4zMTQzMmVkZWVhNTBicCswLAktMHgxLjBkZjhwLTQwLAorCTB4MS4zMjE3MGZjNGNkN2I4cCswLAktMHgxLjI0ODBwLTQ1LAorCTB4MS4zMmViODNiYThlOWEycCswLAktMHgxLjU5ODBwLTQ1LAorCTB4MS4zM2MwOGIyNjQxNzY2cCswLAkgMHgxLmVkMDBwLTQ2LAorCTB4MS4zNDk2MjY2ZTNmYTI3cCswLAktMHgxLmMwMDBwLTUwLAorCTB4MS4zNTZjNTVmOTI5ZjBmcCswLAktMHgxLjBkODBwLTQ0LAorCTB4MS4zNjQzMWEyZGU4OGI5cCswLAkgMHgxLjJjODBwLTQ1LAorCTB4MS4zNzFhNzM3M2FhYTM5cCswLAkgMHgxLjA2MDBwLTQ1LAorCTB4MS4zN2YyNjIzMWU3NGZlcCswLAktMHgxLjY2MDBwLTQ2LAorCTB4MS4zOGNhZTZkMDVkODM4cCswLAktMHgxLmFlMDBwLTQ3LAorCTB4MS4zOWE0MDFiNzEzZWMzcCswLAktMHgxLjQ3MjBwLTQzLAorCTB4MS4zYTdkYjM0ZTVhMDIwcCswLAkgMHgxLjgyMDBwLTQ3LAorCTB4MS4zYjU3ZmJmZWM2ZTk1cCswLAkgMHgxLmU4MDBwLTQ0LAorCTB4MS4zYzMyZGMzMTNhOGYycCswLAkgMHgxLmY4MDBwLTQ5LAorCTB4MS4zZDBlNTQ0ZWRlMTIycCswLAktMHgxLjdhMDBwLTQ2LAorCTB4MS4zZGVhNjRjMTIzNGJicCswLAkgMHgxLjYzMDBwLTQ1LAorCTB4MS4zZWM3MGRmMWM0ZWNjcCswLAktMHgxLjhhNjBwLTQzLAorCTB4MS4zZmE0NTA0YWM3ZThjcCswLAktMHgxLmNkYzBwLTQ0LAorCTB4MS40MDgyMmMzNjdhMGJicCswLAkgMHgxLjViODBwLTQ1LAorCTB4MS40MTYwYTIxZjcyZTk1cCswLAkgMHgxLmVjMDBwLTQ2LAorCTB4MS40MjNmYjI3MDk0NjQ2cCswLAktMHgxLjM2MDBwLTQ2LAorCTB4MS40MzFmNWQ5NTBhOTIwcCswLAkgMHgxLjM5ODBwLTQ1LAorCTB4MS40M2ZmYTNmODRiOWVicCswLAkgMHgxLmEwMDBwLTQ4LAorCTB4MS40NGUwODYwNjE4OTE5cCswLAktMHgxLjZjMDBwLTQ4LAorCTB4MS40NWMyMDQyYTdkMjAxcCswLAktMHgxLmJjMDBwLTQ3LAorCTB4MS40NmE0MWVkMWQwMDE2cCswLAktMHgxLjI4MDBwLTQ2LAorCTB4MS40Nzg2ZDY2OGIzMzI2cCswLAkgMHgxLjBlMDBwLTQ0LAorCTB4MS40ODZhMmI1YzEzYzAwcCswLAktMHgxLmQ0MDBwLTQ1LAorCTB4MS40OTRlMWUxOTJhZjA0cCswLAkgMHgxLmMyMDBwLTQ3LAorCTB4MS40YTMyYWYwZDdkMzcycCswLAktMHgxLmU1MDBwLTQ2LAorCTB4MS40YjE3ZGVhNmRiODAxcCswLAkgMHgxLjc4MDBwLTQ3LAorCTB4MS40YmZkYWQ1MzYyOWUxcCswLAktMHgxLjM4MDBwLTQ2LAorCTB4MS40Y2U0MWI4MTdjMTMycCswLAkgMHgxLjA4MDBwLTQ3LAorCTB4MS40ZGNiMjk5ZmRkZGRicCswLAkgMHgxLmM3MDBwLTQ1LAorCTB4MS40ZWIyZDgxZDhhYjk2cCswLAktMHgxLmNlMDBwLTQ2LAorCTB4MS40ZjliMjc2OWQyZDAycCswLAkgMHgxLjkyMDBwLTQ2LAorCTB4MS41MDg0MTdmNDUzMWMxcCswLAktMHgxLjhjMDBwLTQ3LAorCTB4MS41MTZkYWEyY2Y2NjJhcCswLAktMHgxLmEwMDBwLTQ4LAorCTB4MS41MjU3ZGU4M2Y1MWVhcCswLAkgMHgxLmEwODBwLTQzLAorCTB4MS41MzQyYjU2OWQ0ZWRhcCswLAktMHgxLjZkODBwLTQ1LAorCTB4MS41NDJlMmY0ZjZhYzFhcCswLAktMHgxLjI0NDBwLTQ0LAorCTB4MS41NTFhNGNhNWQ5NGRicCswLAkgMHgxLjgzYzBwLTQzLAorCTB4MS41NjA3MGRkZTkxMTZicCswLAkgMHgxLjRiMDBwLTQ1LAorCTB4MS41NmY0NzM2YjUyOWRlcCswLAkgMHgxLjE1YTBwLTQzLAorCTB4MS41N2UyN2RiZTJjNDBlcCswLAktMHgxLjllMDBwLTQ1LAorCTB4MS41OGQxMmQ0OTdjNzZmcCswLAktMHgxLjMwODBwLTQ1LAorCTB4MS41OWMwODI3ZmYwYjRjcCswLAkgMHgxLmRlYzBwLTQzLAorCTB4MS41YWIwN2RkNDg1NDI3cCswLAktMHgxLjQwMDBwLTUxLAorCTB4MS41YmExMWZiYTg3YWY0cCswLAkgMHgxLjAwODBwLTQ0LAorCTB4MS41YzkyNjhhNTk0NjBicCswLAktMHgxLjZjODBwLTQ1LAorCTB4MS41ZDg0NTkwOTk4ZTNmcCswLAkgMHgxLjY5YTBwLTQzLAorCTB4MS41ZTc2ZjE1YWQyMGUxcCswLAktMHgxLmI0MDBwLTQ2LAorCTB4MS41ZjZhMzIwZGNlYmNhcCswLAkgMHgxLjc3MDBwLTQ2LAorCTB4MS42MDVlMWI5NzZkY2I4cCswLAkgMHgxLjZmODBwLTQ1LAorCTB4MS42MTUyYWU2Y2RmNzE1cCswLAkgMHgxLjEwMDBwLTQ3LAorCTB4MS42MjQ3ZWIwM2E1NTMxcCswLAktMHgxLjVkMDBwLTQ2LAorCTB4MS42MzNkZDFkMTkyOWI1cCswLAktMHgxLjJkMDBwLTQ2LAorCTB4MS42NDM0NjM0Y2NjMzEzcCswLAktMHgxLmE4MDBwLTQ5LAorCTB4MS42NTJiOWZlYmM4ZWZhcCswLAktMHgxLjg2MDBwLTQ1LAorCTB4MS42NjIzODgyNTUzMzk3cCswLAkgMHgxLjFmZTBwLTQwLAorCTB4MS42NzFjMWM3MDgzMjhlcCswLAktMHgxLjcyMDBwLTQ0LAorCTB4MS42ODE1NWQ0NGNhOTdlcCswLAkgMHgxLjY4MDBwLTQ5LAorCTB4MS42OTBmNGIxOWU5NDcxcCswLAktMHgxLjk3ODBwLTQ1LAorfTsKKworLyoKKyAqIGV4cDIoeCk6IGNvbXB1dGUgdGhlIGJhc2UgMiBleHBvbmVudGlhbCBvZiB4CisgKgorICogQWNjdXJhY3k6IFBlYWsgZXJyb3IgPCAwLjUwMyB1bHAgZm9yIG5vcm1hbGl6ZWQgcmVzdWx0cy4KKyAqCisgKiBNZXRob2Q6IChhY2N1cmF0ZSB0YWJsZXMpCisgKgorICogICBSZWR1Y2UgeDoKKyAqICAgICB4ID0gMioqayArIHksIGZvciBpbnRlZ2VyIGsgYW5kIHx5fCA8PSAxLzIuCisgKiAgICAgVGh1cyB3ZSBoYXZlIGV4cDIoeCkgPSAyKiprICogZXhwMih5KS4KKyAqCisgKiAgIFJlZHVjZSB5OgorICogICAgIHkgPSBpL1RCTFNJWkUgKyB6IC0gZXBzW2ldIGZvciBpbnRlZ2VyIGkgbmVhciB5ICogVEJMU0laRS4KKyAqICAgICBUaHVzIHdlIGhhdmUgZXhwMih5KSA9IGV4cDIoaS9UQkxTSVpFKSAqIGV4cDIoeiAtIGVwc1tpXSksCisgKiAgICAgd2l0aCB8eiAtIGVwc1tpXXwgPD0gMioqLTkgKyAyKiotMzkgZm9yIHRoZSB0YWJsZSB1c2VkLgorICoKKyAqICAgV2UgY29tcHV0ZSBleHAyKGkvVEJMU0laRSkgdmlhIHRhYmxlIGxvb2t1cCBhbmQgZXhwMih6IC0gZXBzW2ldKSB2aWEKKyAqICAgYSBkZWdyZWUtNSBtaW5pbWF4IHBvbHlub21pYWwgd2l0aCBtYXhpbXVtIGVycm9yIHVuZGVyIDEuMyAqIDIqKi02MS4KKyAqICAgVGhlIHZhbHVlcyBpbiBleHAydFtdIGFuZCBlcHNbXSBhcmUgY2hvc2VuIHN1Y2ggdGhhdAorICogICBleHAydFtpXSA9IGV4cDIoaS9UQkxTSVpFICsgZXBzW2ldKSwgYW5kIGVwc1tpXSBpcyBhIHNtYWxsIG9mZnNldCBzdWNoCisgKiAgIHRoYXQgZXhwMnRbaV0gaXMgYWNjdXJhdGUgdG8gMioqLTY0LgorICoKKyAqICAgTm90ZSB0aGF0IHRoZSByYW5nZSBvZiBpIGlzICstVEJMU0laRS8yLCBzbyB3ZSBhY3R1YWxseSBpbmRleCB0aGUgdGFibGVzCisgKiAgIGJ5IGkwID0gaSArIFRCTFNJWkUvMi4gIEZvciBjYWNoZSBlZmZpY2llbmN5LCBleHAydFtdIGFuZCBlcHNbXSBhcmUKKyAqICAgdmlydHVhbCB0YWJsZXMsIGludGVybGVhdmVkIGluIHRoZSByZWFsIHRhYmxlIHRibFtdLgorICoKKyAqICAgVGhpcyBtZXRob2QgaXMgZHVlIHRvIEdhbCwgd2l0aCBtYW55IGRldGFpbHMgZHVlIHRvIEdhbCBhbmQgQmFjaGVsaXM6CisgKgorICoJR2FsLCBTLiBhbmQgQmFjaGVsaXMsIEIuICBBbiBBY2N1cmF0ZSBFbGVtZW50YXJ5IE1hdGhlbWF0aWNhbCBMaWJyYXJ5CisgKglmb3IgdGhlIElFRUUgRmxvYXRpbmcgUG9pbnQgU3RhbmRhcmQuICBUT01TIDE3KDEpLCAyNi00NiAoMTk5MSkuCisgKi8KK2RvdWJsZQorZXhwMihkb3VibGUgeCkKK3sKKwlkb3VibGUgciwgdCwgejsKKwl1aW50MzJfdCBoeCwgaHIsIGl4LCBseCwgaTA7CisJaW50IGs7CisKKwkvKiBGaWx0ZXIgb3V0IGV4Y2VwdGlvbmFsIGNhc2VzLiAqLworCUdFVF9ISUdIX1dPUkQoaHgseCk7CisJaXggPSBoeCAmIDB4N2ZmZmZmZmY7CQkvKiBoaWdoIHdvcmQgb2YgfHh8ICovCisJaWYoaXggPj0gMHg0MDkwMDAwMCkgewkJCS8qIHx4fCA+PSAxMDI0ICovCisJCWlmKGl4ID49IDB4N2ZmMDAwMDApIHsKKwkJCUdFVF9MT1dfV09SRChseCx4KTsKKwkJCWlmKCgoaXggJiAweGZmZmZmKSB8IGx4KSAhPSAwIHx8IChoeCAmIDB4ODAwMDAwMDApID09IDApCisJCQkJcmV0dXJuICh4KTsgCS8qIHggaXMgTmFOIG9yICtJbmYgKi8KKwkJCWVsc2UgCisJCQkJcmV0dXJuICgwLjApOwkvKiB4IGlzIC1JbmYgKi8KKwkJfQorCQlpZih4ID49IDB4MS4wcDEwKQorCQkJcmV0dXJuIChodWdlICogaHVnZSk7IC8qIG92ZXJmbG93ICovCisJCWlmKHggPD0gLTB4MS4wY2NwMTApCisJCQlyZXR1cm4gKHR3b20xMDAwICogdHdvbTEwMDApOyAvKiB1bmRlcmZsb3cgKi8KKwl9IGVsc2UgaWYgKGl4IDwgMHgzYzkwMDAwMCkgewkJLyogfHh8IDwgMHgxcC01NCAqLworCQlyZXR1cm4gKDEuMCArIHgpOworCX0KKworCS8qIFJlZHVjZSB4LCBjb21wdXRpbmcgeiwgaTAsIGFuZCBrLiAqLworCXQgPSB4ICsgcmVkdXg7CisJR0VUX0xPV19XT1JEKGkwLCB0KTsKKwlpMCArPSBUQkxTSVpFIC8gMjsKKwlrID0gKGkwID4+IFRCTEJJVFMpIDw8IDIwOworCWkwID0gKGkwICYgKFRCTFNJWkUgLSAxKSkgPDwgMTsKKwl0IC09IHJlZHV4OworCXogPSB4IC0gdDsKKworCS8qIENvbXB1dGUgciA9IGV4cDIoeSkgPSBleHAydFtpMF0gKiBwKHogLSBlcHNbaV0pLiAqLworCXQgPSB0YmxbaTBdOwkJLyogZXhwMnRbaTBdICovCisJeiAtPSB0YmxbaTAgKyAxXTsJLyogZXBzW2kwXSAgICovCisJciA9IHQgKyB0ICogeiAqIChQMSArIHogKiAoUDIgKyB6ICogKFAzICsgeiAqIChQNCArIHogKiBQNSkpKSk7CisKKwkvKiBTY2FsZSBieSAyKiooaz4+MjApLiAqLworCWlmKGsgPj0gLTEwMjEgPDwgMjApIHsKKwkJaWYgKGsgIT0gMCkgeworCQkJR0VUX0hJR0hfV09SRChociwgcik7CisJCQlTRVRfSElHSF9XT1JEKHIsIGhyICsgayk7CisJCX0KKwkJcmV0dXJuIChyKTsKKwl9IGVsc2UgeworCQlHRVRfSElHSF9XT1JEKGhyLCByKTsKKwkJU0VUX0hJR0hfV09SRChyLCBociArIChrICsgKDEwMDAgPDwgMjApKSk7CisJCXJldHVybiAociAqIHR3b20xMDAwKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2V4cDJmLmMgYi9saWJtL3NyYy9zX2V4cDJmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU5OGU4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZXhwMmYuYwpAQCAtMCwwICsxLDE0MSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19leHAyZi5jLHYgMS4xIDIwMDUvMDQvMDUgMDI6NTc6MTUgZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKyNkZWZpbmUJVEJMQklUUwk0CisjZGVmaW5lCVRCTFNJWkUJKDEgPDwgVEJMQklUUykKKworc3RhdGljIGNvbnN0IGZsb2F0CisgICAgaHVnZSAgICA9IDB4MXAxMDBmLAorICAgIHR3b20xMDAgPSAweDFwLTEwMGYsCisgICAgcmVkdXggICA9IDB4MS44cDIzZiAvIFRCTFNJWkUsCisgICAgUDEJICAgID0gMHgxLjYyZTQzMHAtMWYsCisgICAgUDIJICAgID0gMHgxLmViZmJlMHAtM2YsCisgICAgUDMJICAgID0gMHgxLmM2YjM0OHAtNWYsCisgICAgUDQJICAgID0gMHgxLjNiMmM5Y3AtN2Y7CisKK3N0YXRpYyBjb25zdCBkb3VibGUgZXhwMmZ0W1RCTFNJWkVdID0geworCTB4MS42YTA5ZTY2N2YzYmNkcC0xLAorCTB4MS43YTExNDczZWIwMTg3cC0xLAorCTB4MS44YWNlNTQyMmFhMGRicC0xLAorCTB4MS45YzQ5MTgyYTNmMDkwcC0xLAorCTB4MS5hZTg5Zjk5NWFkM2FkcC0xLAorCTB4MS5jMTk5YmRkODU1MjljcC0xLAorCTB4MS5kNTgxOGRjZmJhNDg3cC0xLAorCTB4MS5lYTRhZmEyYTQ5MGRhcC0xLAorCTB4MS4wMDAwMDAwMDAwMDAwcCswLAorCTB4MS4wYjU1ODZjZjk4OTBmcCswLAorCTB4MS4xNzJiODNjN2Q1MTdicCswLAorCTB4MS4yMzg3YTZlNzU2MjM4cCswLAorCTB4MS4zMDZmZTBhMzFiNzE1cCswLAorCTB4MS4zZGVhNjRjMTIzNDIycCswLAorCTB4MS40YmZkYWQ1MzYyYTI3cCswLAorCTB4MS41YWIwN2RkNDg1NDI5cCswLAorfTsKKwkKKy8qCisgKiBleHAyZih4KTogY29tcHV0ZSB0aGUgYmFzZSAyIGV4cG9uZW50aWFsIG9mIHgKKyAqCisgKiBBY2N1cmFjeTogUGVhayBlcnJvciA8IDAuNTAxIHVscDsgbG9jYXRpb24gb2YgcGVhazogLTAuMDMwMTEwOTI3LgorICoKKyAqIE1ldGhvZDogKGVxdWFsbHktc3BhY2VkIHRhYmxlcykKKyAqCisgKiAgIFJlZHVjZSB4OgorICogICAgIHggPSAyKiprICsgeSwgZm9yIGludGVnZXIgayBhbmQgfHl8IDw9IDEvMi4KKyAqICAgICBUaHVzIHdlIGhhdmUgZXhwMmYoeCkgPSAyKiprICogZXhwMih5KS4KKyAqCisgKiAgIFJlZHVjZSB5OgorICogICAgIHkgPSBpL1RCTFNJWkUgKyB6IGZvciBpbnRlZ2VyIGkgbmVhciB5ICogVEJMU0laRS4KKyAqICAgICBUaHVzIHdlIGhhdmUgZXhwMih5KSA9IGV4cDIoaS9UQkxTSVpFKSAqIGV4cDIoeiksCisgKiAgICAgd2l0aCB8enwgPD0gMioqLShUQkxTSVpFKzEpLgorICoKKyAqICAgV2UgY29tcHV0ZSBleHAyKGkvVEJMU0laRSkgdmlhIHRhYmxlIGxvb2t1cCBhbmQgZXhwMih6KSB2aWEgYQorICogICBkZWdyZWUtNCBtaW5pbWF4IHBvbHlub21pYWwgd2l0aCBtYXhpbXVtIGVycm9yIHVuZGVyIDEuNCAqIDIqKi0zMy4KKyAqICAgVXNpbmcgZG91YmxlIHByZWNpc2lvbiBpbiB0aGUgZmluYWwgY2FsY3VsYXRpb24gYXZvaWRzIHJvdW5kb2ZmIGVycm9yLgorICoKKyAqICAgVGhpcyBtZXRob2QgaXMgZHVlIHRvIFRhbmcsIGJ1dCBJIGRvIG5vdCB1c2UgaGlzIHN1Z2dlc3RlZCBwYXJhbWV0ZXJzOgorICoKKyAqCVRhbmcsIFAuICBUYWJsZS1kcml2ZW4gSW1wbGVtZW50YXRpb24gb2YgdGhlIEV4cG9uZW50aWFsIEZ1bmN0aW9uCisgKglpbiBJRUVFIEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuICBUT01TIDE1KDIpLCAxNDQtMTU3ICgxOTg5KS4KKyAqLworZmxvYXQKK2V4cDJmKGZsb2F0IHgpCit7CisJZG91YmxlIHR2OworCWZsb2F0IHIsIHo7CisJdm9sYXRpbGUgZmxvYXQgdDsJLyogcHJldmVudCBnY2MgZnJvbSB1c2luZyB0b28gbXVjaCBwcmVjaXNpb24gKi8KKwl1aW50MzJfdCBoeCwgaHIsIGl4LCBpMDsKKwlpbnQzMl90IGs7CisKKwkvKiBGaWx0ZXIgb3V0IGV4Y2VwdGlvbmFsIGNhc2VzLiAqLworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWl4ID0gaHggJiAweDdmZmZmZmZmOwkJLyogaGlnaCB3b3JkIG9mIHx4fCAqLworCWlmKGl4ID49IDB4NDMwMDAwMDApIHsJCQkvKiB8eHwgPj0gMTI4ICovCisJCWlmKGl4ID49IDB4N2Y4MDAwMDApIHsKKwkJCWlmICgoaXggJiAweDdmZmZmZikgIT0gMCB8fCAoaHggJiAweDgwMDAwMDAwKSA9PSAwKQorCQkJCXJldHVybiAoeCk7IAkvKiB4IGlzIE5hTiBvciArSW5mICovCisJCQllbHNlIAorCQkJCXJldHVybiAoMC4wKTsJLyogeCBpcyAtSW5mICovCisJCX0KKwkJaWYoeCA+PSAweDEuMHA3ZikKKwkJCXJldHVybiAoaHVnZSAqIGh1Z2UpOwkvKiBvdmVyZmxvdyAqLworCQlpZih4IDw9IC0weDEuMmNwN2YpCisJCQlyZXR1cm4gKHR3b20xMDAgKiB0d29tMTAwKTsgLyogdW5kZXJmbG93ICovCisJfSBlbHNlIGlmIChpeCA8PSAweDMzMDAwMDAwKSB7CQkvKiB8eHwgPD0gMHgxcC0yNSAqLworCQlyZXR1cm4gKDEuMGYgKyB4KTsKKwl9CisKKwkvKiBSZWR1Y2UgeCwgY29tcHV0aW5nIHosIGkwLCBhbmQgay4gKi8KKwl0ID0geCArIHJlZHV4OworCUdFVF9GTE9BVF9XT1JEKGkwLCB0KTsKKwlpMCArPSBUQkxTSVpFIC8gMjsKKwlrID0gKGkwID4+IFRCTEJJVFMpIDw8IDIzOworCWkwICY9IFRCTFNJWkUgLSAxOworCXQgLT0gcmVkdXg7CisJeiA9IHggLSB0OworCisJLyogQ29tcHV0ZSByID0gZXhwMih5KSA9IGV4cDJmdFtpMF0gKiBwKHopLiAqLworCXR2ID0gZXhwMmZ0W2kwXTsKKwlyID0gdHYgKyB0diAqICh6ICogKFAxICsgeiAqIChQMiArIHogKiAoUDMgKyB6ICogUDQpKSkpOworCisJLyogU2NhbGUgYnkgMioqKGs+PjIzKS4gKi8KKwlpZihrID49IC0xMjUgPDwgMjMpIHsKKwkJaWYgKGsgIT0gMCkgeworCQkJR0VUX0ZMT0FUX1dPUkQoaHIsIHIpOworCQkJU0VUX0ZMT0FUX1dPUkQociwgaHIgKyBrKTsKKwkJfQorCQlyZXR1cm4gKHIpOworCX0gZWxzZSB7CisJCUdFVF9GTE9BVF9XT1JEKGhyLCByKTsKKwkJU0VUX0ZMT0FUX1dPUkQociwgaHIgKyAoayArICgxMDAgPDwgMjMpKSk7CisJCXJldHVybiAociAqIHR3b20xMDApOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZXhwbTEuYyBiL2xpYm0vc3JjL3NfZXhwbTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2FhM2YyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19leHBtMS5jCkBAIC0wLDAgKzEsMjIwIEBACisvKiBAKCMpc19leHBtMS5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19leHBtMS5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisvKiBleHBtMSh4KQorICogUmV0dXJucyBleHAoeCktMSwgdGhlIGV4cG9uZW50aWFsIG9mIHggbWludXMgMS4KKyAqCisgKiBNZXRob2QKKyAqICAgMS4gQXJndW1lbnQgcmVkdWN0aW9uOgorICoJR2l2ZW4geCwgZmluZCByIGFuZCBpbnRlZ2VyIGsgc3VjaCB0aGF0CisgKgorICogICAgICAgICAgICAgICB4ID0gaypsbjIgKyByLCAgfHJ8IDw9IDAuNSpsbjIgfiAwLjM0NjU4CisgKgorICogICAgICBIZXJlIGEgY29ycmVjdGlvbiB0ZXJtIGMgd2lsbCBiZSBjb21wdXRlZCB0byBjb21wZW5zYXRlCisgKgl0aGUgZXJyb3IgaW4gciB3aGVuIHJvdW5kZWQgdG8gYSBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgKgorICogICAyLiBBcHByb3hpbWF0aW5nIGV4cG0xKHIpIGJ5IGEgc3BlY2lhbCByYXRpb25hbCBmdW5jdGlvbiBvbgorICoJdGhlIGludGVydmFsIFswLDAuMzQ2NThdOgorICoJU2luY2UKKyAqCSAgICByKihleHAocikrMSkvKGV4cChyKS0xKSA9IDIrIHJeMi82IC0gcl40LzM2MCArIC4uLgorICoJd2UgZGVmaW5lIFIxKHIqcikgYnkKKyAqCSAgICByKihleHAocikrMSkvKGV4cChyKS0xKSA9IDIrIHJeMi82ICogUjEocipyKQorICoJVGhhdCBpcywKKyAqCSAgICBSMShyKioyKSA9IDYvciAqKChleHAocikrMSkvKGV4cChyKS0xKSAtIDIvcikKKyAqCQkgICAgID0gNi9yICogKCAxICsgMi4wKigxLyhleHAociktMSkgLSAxL3IpKQorICoJCSAgICAgPSAxIC0gcl4yLzYwICsgcl40LzI1MjAgLSByXjYvMTAwODAwICsgLi4uCisgKiAgICAgIFdlIHVzZSBhIHNwZWNpYWwgUmVtZSBhbGdvcml0aG0gb24gWzAsMC4zNDddIHRvIGdlbmVyYXRlCisgKiAJYSBwb2x5bm9taWFsIG9mIGRlZ3JlZSA1IGluIHIqciB0byBhcHByb3hpbWF0ZSBSMS4gVGhlCisgKgltYXhpbXVtIGVycm9yIG9mIHRoaXMgcG9seW5vbWlhbCBhcHByb3hpbWF0aW9uIGlzIGJvdW5kZWQKKyAqCWJ5IDIqKi02MS4gSW4gb3RoZXIgd29yZHMsCisgKgkgICAgUjEoeikgfiAxLjAgKyBRMSp6ICsgUTIqeioqMiArIFEzKnoqKjMgKyBRNCp6Kio0ICsgUTUqeioqNQorICoJd2hlcmUgCVExICA9ICAtMS42NjY2NjY2NjY2NjY2NTY3Mzg0RS0yLAorICogCQlRMiAgPSAgIDMuOTY4MjUzOTY4MTM3MDM2NTg3M0UtNCwKKyAqIAkJUTMgID0gIC05LjkyMDYzNDQ3MzM0MzU5ODczNTdFLTYsCisgKiAJCVE0ICA9ICAgMi41MDUxMzYxNDIwODA4NTE3MDAyRS03LAorICogCQlRNSAgPSAgLTYuMjg0MzUwNTY4MjM4MjYxNzEwMkUtOTsKKyAqICAJKHdoZXJlIHo9cipyLCBhbmQgdGhlIHZhbHVlcyBvZiBRMSB0byBRNSBhcmUgbGlzdGVkIGJlbG93KQorICoJd2l0aCBlcnJvciBib3VuZGVkIGJ5CisgKgkgICAgfCAgICAgICAgICAgICAgICAgIDUgICAgICAgICAgIHwgICAgIC02MQorICoJICAgIHwgMS4wK1ExKnorLi4uK1E1KnogICAtICBSMSh6KSB8IDw9IDIKKyAqCSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICoKKyAqCWV4cG0xKHIpID0gZXhwKHIpLTEgaXMgdGhlbiBjb21wdXRlZCBieSB0aGUgZm9sbG93aW5nCisgKiAJc3BlY2lmaWMgd2F5IHdoaWNoIG1pbmltaXplIHRoZSBhY2N1bXVsYXRpb24gcm91bmRpbmcgZXJyb3I6CisgKgkJCSAgICAgICAyICAgICAzCisgKgkJCSAgICAgIHIgICAgIHIgICAgWyAzIC0gKFIxICsgUjEqci8yKSAgXQorICoJICAgICAgZXhwbTEocikgPSByICsgLS0tICsgLS0tICogWy0tLS0tLS0tLS0tLS0tLS0tLS0tXQorICoJCSAgICAgICAgICAgICAgMiAgICAgMiAgICBbIDYgLSByKigzIC0gUjEqci8yKSBdCisgKgorICoJVG8gY29tcGVuc2F0ZSB0aGUgZXJyb3IgaW4gdGhlIGFyZ3VtZW50IHJlZHVjdGlvbiwgd2UgdXNlCisgKgkJZXhwbTEocitjKSA9IGV4cG0xKHIpICsgYyArIGV4cG0xKHIpKmMKKyAqCQkJICAgfiBleHBtMShyKSArIGMgKyByKmMKKyAqCVRodXMgYytyKmMgd2lsbCBiZSBhZGRlZCBpbiBhcyB0aGUgY29ycmVjdGlvbiB0ZXJtcyBmb3IKKyAqCWV4cG0xKHIrYykuIE5vdyByZWFycmFuZ2UgdGhlIHRlcm0gdG8gYXZvaWQgb3B0aW1pemF0aW9uCisgKiAJc2NyZXcgdXA6CisgKgkJICAgICAgICAoICAgICAgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKQorICoJCSAgICAgICAgKHsgICggciAgICBbIFIxIC0gICgzIC0gUjEqci8yKSBdICApICB9ICAgIHIgICkKKyAqCSBleHBtMShyK2MpfnIgLSAoe3IqKC0tLSAqIFstLS0tLS0tLS0tLS0tLS0tLS0tLV0tYyktY30gLSAtLS0gKQorICoJICAgICAgICAgICAgICAgICh7ICAoIDIgICAgWyA2IC0gciooMyAtIFIxKnIvMikgXSAgKSAgfSAgICAyICApCisgKiAgICAgICAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICoKKyAqCQkgICA9IHIgLSBFCisgKiAgIDMuIFNjYWxlIGJhY2sgdG8gb2J0YWluIGV4cG0xKHgpOgorICoJRnJvbSBzdGVwIDEsIHdlIGhhdmUKKyAqCSAgIGV4cG0xKHgpID0gZWl0aGVyIDJeaypbZXhwbTEocikrMV0gLSAxCisgKgkJICAgID0gb3IgICAgIDJeaypbZXhwbTEocikgKyAoMS0yXi1rKV0KKyAqICAgNC4gSW1wbGVtZW50YXRpb24gbm90ZXM6CisgKgkoQSkuIFRvIHNhdmUgb25lIG11bHRpcGxpY2F0aW9uLCB3ZSBzY2FsZSB0aGUgY29lZmZpY2llbnQgUWkKKyAqCSAgICAgdG8gUWkqMl5pLCBhbmQgcmVwbGFjZSB6IGJ5ICh4XjIpLzIuCisgKgkoQikuIFRvIGFjaGlldmUgbWF4aW11bSBhY2N1cmFjeSwgd2UgY29tcHV0ZSBleHBtMSh4KSBieQorICoJICAoaSkgICBpZiB4IDwgLTU2KmxuMiwgcmV0dXJuIC0xLjAsIChyYWlzZSBpbmV4YWN0IGlmIHghPWluZikKKyAqCSAgKGlpKSAgaWYgaz0wLCByZXR1cm4gci1FCisgKgkgIChpaWkpIGlmIGs9LTEsIHJldHVybiAwLjUqKHItRSktMC41CisgKiAgICAgICAgKGl2KQlpZiBrPTEgaWYgciA8IC0wLjI1LCByZXR1cm4gMiooKHIrMC41KS0gRSkKKyAqCSAgICAgICAJICAgICAgIGVsc2UJICAgICByZXR1cm4gIDEuMCsyLjAqKHItRSk7CisgKgkgICh2KSAgIGlmIChrPC0yfHxrPjU2KSByZXR1cm4gMl5rKDEtKEUtcikpIC0gMSAob3IgZXhwKHgpLTEpCisgKgkgICh2aSkgIGlmIGsgPD0gMjAsIHJldHVybiAyXmsoKDEtMl4tayktKEUtcikpLCBlbHNlCisgKgkgICh2aWkpIHJldHVybiAyXmsoMS0oKEUrMl4tayktcikpCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqCWV4cG0xKElORikgaXMgSU5GLCBleHBtMShOYU4pIGlzIE5hTjsKKyAqCWV4cG0xKC1JTkYpIGlzIC0xLCBhbmQKKyAqCWZvciBmaW5pdGUgYXJndW1lbnQsIG9ubHkgZXhwbTEoMCk9MCBpcyBleGFjdC4KKyAqCisgKiBBY2N1cmFjeToKKyAqCWFjY29yZGluZyB0byBhbiBlcnJvciBhbmFseXNpcywgdGhlIGVycm9yIGlzIGFsd2F5cyBsZXNzIHRoYW4KKyAqCTEgdWxwICh1bml0IGluIHRoZSBsYXN0IHBsYWNlKS4KKyAqCisgKiBNaXNjLiBpbmZvLgorICoJRm9yIElFRUUgZG91YmxlCisgKgkgICAgaWYgeCA+ICA3LjA5NzgyNzEyODkzMzgzOTczMDk2ZSswMiB0aGVuIGV4cG0xKHgpIG92ZXJmbG93CisgKgorICogQ29uc3RhbnRzOgorICogVGhlIGhleGFkZWNpbWFsIHZhbHVlcyBhcmUgdGhlIGludGVuZGVkIG9uZXMgZm9yIHRoZSBmb2xsb3dpbmcKKyAqIGNvbnN0YW50cy4gVGhlIGRlY2ltYWwgdmFsdWVzIG1heSBiZSB1c2VkLCBwcm92aWRlZCB0aGF0IHRoZQorICogY29tcGlsZXIgd2lsbCBjb252ZXJ0IGZyb20gZGVjaW1hbCB0byBiaW5hcnkgYWNjdXJhdGVseSBlbm91Z2gKKyAqIHRvIHByb2R1Y2UgdGhlIGhleGFkZWNpbWFsIHZhbHVlcyBzaG93bi4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlCitvbmUJCT0gMS4wLAoraHVnZQkJPSAxLjBlKzMwMCwKK3RpbnkJCT0gMS4wZS0zMDAsCitvX3RocmVzaG9sZAk9IDcuMDk3ODI3MTI4OTMzODM5NzMwOTZlKzAyLC8qIDB4NDA4NjJFNDIsIDB4RkVGQTM5RUYgKi8KK2xuMl9oaQkJPSA2LjkzMTQ3MTgwMzY5MTIzODE2NDkwZS0wMSwvKiAweDNmZTYyZTQyLCAweGZlZTAwMDAwICovCitsbjJfbG8JCT0gMS45MDgyMTQ5MjkyNzA1ODc3MDAwMmUtMTAsLyogMHgzZGVhMzllZiwgMHgzNTc5M2M3NiAqLworaW52bG4yCQk9IDEuNDQyNjk1MDQwODg4OTYzMzg3MDBlKzAwLC8qIDB4M2ZmNzE1NDcsIDB4NjUyYjgyZmUgKi8KKwkvKiBzY2FsZWQgY29lZmZpY2llbnRzIHJlbGF0ZWQgdG8gZXhwbTEgKi8KK1ExICA9ICAtMy4zMzMzMzMzMzMzMzMzMTMxNjQyOGUtMDIsIC8qIEJGQTExMTExIDExMTExMEY0ICovCitRMiAgPSAgIDEuNTg3MzAxNTg3MjU0ODE0NjAxNjVlLTAzLCAvKiAzRjVBMDFBMCAxOUZFNTU4NSAqLworUTMgID0gIC03LjkzNjUwNzU3ODY3NDg3OTQyNDczZS0wNSwgLyogQkYxNENFMTkgOUVBQURCQjcgKi8KK1E0ICA9ICAgNC4wMDgyMTc4MjczMjkzNjIzOTU1MmUtMDYsIC8qIDNFRDBDRkNBIDg2RTY1MjM5ICovCitRNSAgPSAgLTIuMDEwOTkyMTgxODM2MjQzNzEzMjZlLTA3OyAvKiBCRThBRkRCNyA2RTA5QzMyRCAqLworCitkb3VibGUKK2V4cG0xKGRvdWJsZSB4KQoreworCWRvdWJsZSB5LGhpLGxvLGMsdCxlLGh4cyxoZngscjE7CisJaW50MzJfdCBrLHhzYjsKKwl1X2ludDMyX3QgaHg7CisKKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCXhzYiA9IGh4JjB4ODAwMDAwMDA7CQkvKiBzaWduIGJpdCBvZiB4ICovCisJaWYoeHNiPT0wKSB5PXg7IGVsc2UgeT0gLXg7CS8qIHkgPSB8eHwgKi8KKwloeCAmPSAweDdmZmZmZmZmOwkJLyogaGlnaCB3b3JkIG9mIHx4fCAqLworCisgICAgLyogZmlsdGVyIG91dCBodWdlIGFuZCBub24tZmluaXRlIGFyZ3VtZW50ICovCisJaWYoaHggPj0gMHg0MDQzNjg3QSkgewkJCS8qIGlmIHx4fD49NTYqbG4yICovCisJICAgIGlmKGh4ID49IDB4NDA4NjJFNDIpIHsJCS8qIGlmIHx4fD49NzA5Ljc4Li4uICovCisgICAgICAgICAgICAgICAgaWYoaHg+PTB4N2ZmMDAwMDApIHsKKwkJICAgIHVfaW50MzJfdCBsb3c7CisJCSAgICBHRVRfTE9XX1dPUkQobG93LHgpOworCQkgICAgaWYoKChoeCYweGZmZmZmKXxsb3cpIT0wKQorCQkgICAgICAgICByZXR1cm4geCt4OyAJIC8qIE5hTiAqLworCQkgICAgZWxzZSByZXR1cm4gKHhzYj09MCk/IHg6LTEuMDsvKiBleHAoKy1pbmYpPXtpbmYsLTF9ICovCisJICAgICAgICB9CisJICAgICAgICBpZih4ID4gb190aHJlc2hvbGQpIHJldHVybiBodWdlKmh1Z2U7IC8qIG92ZXJmbG93ICovCisJICAgIH0KKwkgICAgaWYoeHNiIT0wKSB7IC8qIHggPCAtNTYqbG4yLCByZXR1cm4gLTEuMCB3aXRoIGluZXhhY3QgKi8KKwkJaWYoeCt0aW55PDAuMCkJCS8qIHJhaXNlIGluZXhhY3QgKi8KKwkJcmV0dXJuIHRpbnktb25lOwkvKiByZXR1cm4gLTEgKi8KKwkgICAgfQorCX0KKworICAgIC8qIGFyZ3VtZW50IHJlZHVjdGlvbiAqLworCWlmKGh4ID4gMHgzZmQ2MmU0MikgewkJLyogaWYgIHx4fCA+IDAuNSBsbjIgKi8KKwkgICAgaWYoaHggPCAweDNGRjBBMkIyKSB7CS8qIGFuZCB8eHwgPCAxLjUgbG4yICovCisJCWlmKHhzYj09MCkKKwkJICAgIHtoaSA9IHggLSBsbjJfaGk7IGxvID0gIGxuMl9sbzsgIGsgPSAgMTt9CisJCWVsc2UKKwkJICAgIHtoaSA9IHggKyBsbjJfaGk7IGxvID0gLWxuMl9sbzsgIGsgPSAtMTt9CisJICAgIH0gZWxzZSB7CisJCWsgID0gaW52bG4yKngrKCh4c2I9PTApPzAuNTotMC41KTsKKwkJdCAgPSBrOworCQloaSA9IHggLSB0KmxuMl9oaTsJLyogdCpsbjJfaGkgaXMgZXhhY3QgaGVyZSAqLworCQlsbyA9IHQqbG4yX2xvOworCSAgICB9CisJICAgIHggID0gaGkgLSBsbzsKKwkgICAgYyAgPSAoaGkteCktbG87CisJfQorCWVsc2UgaWYoaHggPCAweDNjOTAwMDAwKSB7ICAJLyogd2hlbiB8eHw8MioqLTU0LCByZXR1cm4geCAqLworCSAgICB0ID0gaHVnZSt4OwkvKiByZXR1cm4geCB3aXRoIGluZXhhY3QgZmxhZ3Mgd2hlbiB4IT0wICovCisJICAgIHJldHVybiB4IC0gKHQtKGh1Z2UreCkpOworCX0KKwllbHNlIGsgPSAwOworCisgICAgLyogeCBpcyBub3cgaW4gcHJpbWFyeSByYW5nZSAqLworCWhmeCA9IDAuNSp4OworCWh4cyA9IHgqaGZ4OworCXIxID0gb25lK2h4cyooUTEraHhzKihRMitoeHMqKFEzK2h4cyooUTQraHhzKlE1KSkpKTsKKwl0ICA9IDMuMC1yMSpoZng7CisJZSAgPSBoeHMqKChyMS10KS8oNi4wIC0geCp0KSk7CisJaWYoaz09MCkgcmV0dXJuIHggLSAoeCplLWh4cyk7CQkvKiBjIGlzIDAgKi8KKwllbHNlIHsKKwkgICAgZSAgPSAoeCooZS1jKS1jKTsKKwkgICAgZSAtPSBoeHM7CisJICAgIGlmKGs9PSAtMSkgcmV0dXJuIDAuNSooeC1lKS0wLjU7CisJICAgIGlmKGs9PTEpCisJICAgICAgIAlpZih4IDwgLTAuMjUpIHJldHVybiAtMi4wKihlLSh4KzAuNSkpOworCSAgICAgICAJZWxzZSAJICAgICAgcmV0dXJuICBvbmUrMi4wKih4LWUpOworCSAgICBpZiAoayA8PSAtMiB8fCBrPjU2KSB7ICAgLyogc3VmZmljZSB0byByZXR1cm4gZXhwKHgpLTEgKi8KKwkgICAgICAgIHVfaW50MzJfdCBoaWdoOworCSAgICAgICAgeSA9IG9uZS0oZS14KTsKKwkJR0VUX0hJR0hfV09SRChoaWdoLHkpOworCQlTRVRfSElHSF9XT1JEKHksaGlnaCsoazw8MjApKTsJLyogYWRkIGsgdG8geSdzIGV4cG9uZW50ICovCisJICAgICAgICByZXR1cm4geS1vbmU7CisJICAgIH0KKwkgICAgdCA9IG9uZTsKKwkgICAgaWYoazwyMCkgeworCSAgICAgICAgdV9pbnQzMl90IGhpZ2g7CisJICAgICAgICBTRVRfSElHSF9XT1JEKHQsMHgzZmYwMDAwMCAtICgweDIwMDAwMD4+aykpOyAgLyogdD0xLTJeLWsgKi8KKwkgICAgICAgCXkgPSB0LShlLXgpOworCQlHRVRfSElHSF9XT1JEKGhpZ2gseSk7CisJCVNFVF9ISUdIX1dPUkQoeSxoaWdoKyhrPDwyMCkpOwkvKiBhZGQgayB0byB5J3MgZXhwb25lbnQgKi8KKwkgICB9IGVsc2UgeworCSAgICAgICAgdV9pbnQzMl90IGhpZ2g7CisJCVNFVF9ISUdIX1dPUkQodCwoKDB4M2ZmLWspPDwyMCkpOwkvKiAyXi1rICovCisJICAgICAgIAl5ID0geC0oZSt0KTsKKwkgICAgICAgCXkgKz0gb25lOworCQlHRVRfSElHSF9XT1JEKGhpZ2gseSk7CisJCVNFVF9ISUdIX1dPUkQoeSxoaWdoKyhrPDwyMCkpOwkvKiBhZGQgayB0byB5J3MgZXhwb25lbnQgKi8KKwkgICAgfQorCX0KKwlyZXR1cm4geTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZXhwbTFmLmMgYi9saWJtL3NyYy9zX2V4cG0xZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NzBhNzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2V4cG0xZi5jCkBAIC0wLDAgKzEsMTI1IEBACisvKiBzX2V4cG0xZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19leHBtMS5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19leHBtMWYuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0CitvbmUJCT0gMS4wLAoraHVnZQkJPSAxLjBlKzMwLAordGlueQkJPSAxLjBlLTMwLAorb190aHJlc2hvbGQJPSA4Ljg3MjE2Nzk2ODhlKzAxLC8qIDB4NDJiMTcxODAgKi8KK2xuMl9oaQkJPSA2LjkzMTM4MTIyNTZlLTAxLC8qIDB4M2YzMTcxODAgKi8KK2xuMl9sbwkJPSA5LjA1ODAwMDYxNDVlLTA2LC8qIDB4MzcxN2Y3ZDEgKi8KK2ludmxuMgkJPSAxLjQ0MjY5NTAyMTZlKzAwLC8qIDB4M2ZiOGFhM2IgKi8KKwkvKiBzY2FsZWQgY29lZmZpY2llbnRzIHJlbGF0ZWQgdG8gZXhwbTEgKi8KK1ExICA9ICAtMy4zMzMzMzM1MDcyZS0wMiwgLyogMHhiZDA4ODg4OSAqLworUTIgID0gICAxLjU4NzMwMTYwOTFlLTAzLCAvKiAweDNhZDAwZDAxICovCitRMyAgPSAgLTcuOTM2NTA3NjA5MGUtMDUsIC8qIDB4YjhhNjcwY2QgKi8KK1E0ICA9ICAgNC4wMDgyMTc3MjkzZS0wNiwgLyogMHgzNjg2N2U1NCAqLworUTUgID0gIC0yLjAxMDk5MjExOTVlLTA3OyAvKiAweGI0NTdlZGJiICovCisKK2Zsb2F0CitleHBtMWYoZmxvYXQgeCkKK3sKKwlmbG9hdCB5LGhpLGxvLGMsdCxlLGh4cyxoZngscjE7CisJaW50MzJfdCBrLHhzYjsKKwl1X2ludDMyX3QgaHg7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwl4c2IgPSBoeCYweDgwMDAwMDAwOwkJLyogc2lnbiBiaXQgb2YgeCAqLworCWlmKHhzYj09MCkgeT14OyBlbHNlIHk9IC14OwkvKiB5ID0gfHh8ICovCisJaHggJj0gMHg3ZmZmZmZmZjsJCS8qIGhpZ2ggd29yZCBvZiB8eHwgKi8KKworICAgIC8qIGZpbHRlciBvdXQgaHVnZSBhbmQgbm9uLWZpbml0ZSBhcmd1bWVudCAqLworCWlmKGh4ID49IDB4NDE5NWI4NDQpIHsJCQkvKiBpZiB8eHw+PTI3KmxuMiAqLworCSAgICBpZihoeCA+PSAweDQyYjE3MjE4KSB7CQkvKiBpZiB8eHw+PTg4LjcyMS4uLiAqLworICAgICAgICAgICAgICAgIGlmKGh4PjB4N2Y4MDAwMDApCisJCSAgICByZXR1cm4geCt4OyAJIC8qIE5hTiAqLworCQlpZihoeD09MHg3ZjgwMDAwMCkKKwkJICAgIHJldHVybiAoeHNiPT0wKT8geDotMS4wOy8qIGV4cCgrLWluZik9e2luZiwtMX0gKi8KKwkgICAgICAgIGlmKHggPiBvX3RocmVzaG9sZCkgcmV0dXJuIGh1Z2UqaHVnZTsgLyogb3ZlcmZsb3cgKi8KKwkgICAgfQorCSAgICBpZih4c2IhPTApIHsgLyogeCA8IC0yNypsbjIsIHJldHVybiAtMS4wIHdpdGggaW5leGFjdCAqLworCQlpZih4K3Rpbnk8KGZsb2F0KTAuMCkJLyogcmFpc2UgaW5leGFjdCAqLworCQlyZXR1cm4gdGlueS1vbmU7CS8qIHJldHVybiAtMSAqLworCSAgICB9CisJfQorCisgICAgLyogYXJndW1lbnQgcmVkdWN0aW9uICovCisJaWYoaHggPiAweDNlYjE3MjE4KSB7CQkvKiBpZiAgfHh8ID4gMC41IGxuMiAqLworCSAgICBpZihoeCA8IDB4M0Y4NTE1OTIpIHsJLyogYW5kIHx4fCA8IDEuNSBsbjIgKi8KKwkJaWYoeHNiPT0wKQorCQkgICAge2hpID0geCAtIGxuMl9oaTsgbG8gPSAgbG4yX2xvOyAgayA9ICAxO30KKwkJZWxzZQorCQkgICAge2hpID0geCArIGxuMl9oaTsgbG8gPSAtbG4yX2xvOyAgayA9IC0xO30KKwkgICAgfSBlbHNlIHsKKwkJayAgPSBpbnZsbjIqeCsoKHhzYj09MCk/KGZsb2F0KTAuNTooZmxvYXQpLTAuNSk7CisJCXQgID0gazsKKwkJaGkgPSB4IC0gdCpsbjJfaGk7CS8qIHQqbG4yX2hpIGlzIGV4YWN0IGhlcmUgKi8KKwkJbG8gPSB0KmxuMl9sbzsKKwkgICAgfQorCSAgICB4ICA9IGhpIC0gbG87CisJICAgIGMgID0gKGhpLXgpLWxvOworCX0KKwllbHNlIGlmKGh4IDwgMHgzMzAwMDAwMCkgeyAgCS8qIHdoZW4gfHh8PDIqKi0yNSwgcmV0dXJuIHggKi8KKwkgICAgdCA9IGh1Z2UreDsJLyogcmV0dXJuIHggd2l0aCBpbmV4YWN0IGZsYWdzIHdoZW4geCE9MCAqLworCSAgICByZXR1cm4geCAtICh0LShodWdlK3gpKTsKKwl9CisJZWxzZSBrID0gMDsKKworICAgIC8qIHggaXMgbm93IGluIHByaW1hcnkgcmFuZ2UgKi8KKwloZnggPSAoZmxvYXQpMC41Kng7CisJaHhzID0geCpoZng7CisJcjEgPSBvbmUraHhzKihRMStoeHMqKFEyK2h4cyooUTMraHhzKihRNCtoeHMqUTUpKSkpOworCXQgID0gKGZsb2F0KTMuMC1yMSpoZng7CisJZSAgPSBoeHMqKChyMS10KS8oKGZsb2F0KTYuMCAtIHgqdCkpOworCWlmKGs9PTApIHJldHVybiB4IC0gKHgqZS1oeHMpOwkJLyogYyBpcyAwICovCisJZWxzZSB7CisJICAgIGUgID0gKHgqKGUtYyktYyk7CisJICAgIGUgLT0gaHhzOworCSAgICBpZihrPT0gLTEpIHJldHVybiAoZmxvYXQpMC41Kih4LWUpLShmbG9hdCkwLjU7CisJICAgIGlmKGs9PTEpCisJICAgICAgIAlpZih4IDwgKGZsb2F0KS0wLjI1KSByZXR1cm4gLShmbG9hdCkyLjAqKGUtKHgrKGZsb2F0KTAuNSkpOworCSAgICAgICAJZWxzZSAJICAgICAgcmV0dXJuICBvbmUrKGZsb2F0KTIuMCooeC1lKTsKKwkgICAgaWYgKGsgPD0gLTIgfHwgaz41NikgeyAgIC8qIHN1ZmZpY2UgdG8gcmV0dXJuIGV4cCh4KS0xICovCisJICAgICAgICBpbnQzMl90IGk7CisJICAgICAgICB5ID0gb25lLShlLXgpOworCQlHRVRfRkxPQVRfV09SRChpLHkpOworCQlTRVRfRkxPQVRfV09SRCh5LGkrKGs8PDIzKSk7CS8qIGFkZCBrIHRvIHkncyBleHBvbmVudCAqLworCSAgICAgICAgcmV0dXJuIHktb25lOworCSAgICB9CisJICAgIHQgPSBvbmU7CisJICAgIGlmKGs8MjMpIHsKKwkgICAgICAgIGludDMyX3QgaTsKKwkgICAgICAgIFNFVF9GTE9BVF9XT1JEKHQsMHgzZjgwMDAwMCAtICgweDEwMDAwMDA+PmspKTsgLyogdD0xLTJeLWsgKi8KKwkgICAgICAgCXkgPSB0LShlLXgpOworCQlHRVRfRkxPQVRfV09SRChpLHkpOworCQlTRVRfRkxPQVRfV09SRCh5LGkrKGs8PDIzKSk7CS8qIGFkZCBrIHRvIHkncyBleHBvbmVudCAqLworCSAgIH0gZWxzZSB7CisJICAgICAgICBpbnQzMl90IGk7CisJCVNFVF9GTE9BVF9XT1JEKHQsKCgweDdmLWspPDwyMykpOwkvKiAyXi1rICovCisJICAgICAgIAl5ID0geC0oZSt0KTsKKwkgICAgICAgCXkgKz0gb25lOworCQlHRVRfRkxPQVRfV09SRChpLHkpOworCQlTRVRfRkxPQVRfV09SRCh5LGkrKGs8PDIzKSk7CS8qIGFkZCBrIHRvIHkncyBleHBvbmVudCAqLworCSAgICB9CisJfQorCXJldHVybiB5OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mYWJzLmMgYi9saWJtL3NyYy9zX2ZhYnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGZhOTQwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mYWJzLmMKQEAgLTAsMCArMSwzMSBAQAorLyogQCgjKXNfZmFicy5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mYWJzLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBmYWJzKHgpIHJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHguCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZG91YmxlCitmYWJzKGRvdWJsZSB4KQoreworCXVfaW50MzJfdCBoaWdoOworCUdFVF9ISUdIX1dPUkQoaGlnaCx4KTsKKwlTRVRfSElHSF9XT1JEKHgsaGlnaCYweDdmZmZmZmZmKTsKKyAgICAgICAgcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2ZhYnNmLmMgYi9saWJtL3NyYy9zX2ZhYnNmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwMDcwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZmFic2YuYwpAQCAtMCwwICsxLDM0IEBACisvKiBzX2ZhYnNmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2ZhYnMuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZmFic2YuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIGZhYnNmKHgpIHJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHguCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZmxvYXQKK2ZhYnNmKGZsb2F0IHgpCit7CisJdV9pbnQzMl90IGl4OworCUdFVF9GTE9BVF9XT1JEKGl4LHgpOworCVNFVF9GTE9BVF9XT1JEKHgsaXgmMHg3ZmZmZmZmZik7CisgICAgICAgIHJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mYWJzbC5jIGIvbGlibS9zcmMvc19mYWJzbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMGE5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2ZhYnNsLmMKQEAgLTAsMCArMSw0MyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRGFnLUVybGluZyBDb+9kYW4gU234cmdyYXYKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiAgICBpbiB0aGlzIHBvc2l0aW9uIGFuZCB1bmNoYW5nZWQuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZmFic2wuYyx2IDEuMiAyMDAzLzEwLzI1IDE5OjUzOjI4IGRlcyBFeHAgJAorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworbG9uZyBkb3VibGUKK2ZhYnNsKGxvbmcgZG91YmxlIHgpCit7CisJdW5pb24gSUVFRWwyYml0cyB1OworCisJdS5lID0geDsKKwl1LmJpdHMuc2lnbiA9IDA7CisJcmV0dXJuICh1LmUpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mZGltLmMgYi9saWJtL3NyYy9zX2ZkaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTM0N2MxCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mZGltLmMKQEAgLTAsMCArMSw0NiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mZGltLmMsdiAxLjEgMjAwNC8wNi8zMCAwNzowNDowMSBkYXMgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2RlZmluZQlERUNMKHR5cGUsIGZuKQkJCVwKK3R5cGUJCQkJCVwKK2ZuKHR5cGUgeCwgdHlwZSB5KQkJCVwKK3sJCQkJCVwKKwkJCQkJXAorCWlmIChpc25hbih4KSkJCQlcCisJCXJldHVybiAoeCk7CQlcCisJaWYgKGlzbmFuKHkpKQkJCVwKKwkJcmV0dXJuICh5KTsJCVwKKwlyZXR1cm4gKHggPiB5ID8geCAtIHkgOiAwLjApOwlcCit9CisKK0RFQ0woZG91YmxlLCBmZGltKQorREVDTChmbG9hdCwgZmRpbWYpCitERUNMKGxvbmcgZG91YmxlLCBmZGltbCkKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZmluaXRlLmMgYi9saWJtL3NyYy9zX2Zpbml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNGQxZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2Zpbml0ZS5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIEAoIylzX2Zpbml0ZS5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19maW5pdGUuYyx2IDEuOCAyMDAzLzA3LzIzIDA0OjUzOjQ2IHBldGVyIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogZmluaXRlKHgpIHJldHVybnMgMSBpcyB4IGlzIGZpbml0ZSwgZWxzZSAwOworICogbm8gYnJhbmNoaW5nIQorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKwlpbnQgZmluaXRlKGRvdWJsZSB4KQoreworCWludDMyX3QgaHg7CisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlyZXR1cm4gKGludCkoKHVfaW50MzJfdCkoKGh4JjB4N2ZmZmZmZmYpLTB4N2ZmMDAwMDApPj4zMSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2Zpbml0ZWYuYyBiL2xpYm0vc3JjL3NfZmluaXRlZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MzA2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2Zpbml0ZWYuYwpAQCAtMCwwICsxLDMzIEBACisvKiBzX2Zpbml0ZWYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfZmluaXRlLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2Zpbml0ZWYuYyx2IDEuNiAyMDAyLzA1LzI4IDE3OjUxOjQ2IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIGZpbml0ZWYoeCkgcmV0dXJucyAxIGlzIHggaXMgZmluaXRlLCBlbHNlIDA7CisgKiBubyBicmFuY2hpbmchCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworCWludCBmaW5pdGVmKGZsb2F0IHgpCit7CisJaW50MzJfdCBpeDsKKwlHRVRfRkxPQVRfV09SRChpeCx4KTsKKwlyZXR1cm4gKGludCkoKHVfaW50MzJfdCkoKGl4JjB4N2ZmZmZmZmYpLTB4N2Y4MDAwMDApPj4zMSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2Zsb29yLmMgYi9saWJtL3NyYy9zX2Zsb29yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNjMzIxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZmxvb3IuYwpAQCAtMCwwICsxLDczIEBACisvKiBAKCMpc19mbG9vci5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mbG9vci5jLHYgMS45IDIwMDMvMDcvMjMgMDQ6NTM6NDYgcGV0ZXIgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBmbG9vcih4KQorICogUmV0dXJuIHggcm91bmRlZCB0b3dhcmQgLWluZiB0byBpbnRlZ3JhbCB2YWx1ZQorICogTWV0aG9kOgorICoJQml0IHR3aWRkbGluZy4KKyAqIEV4Y2VwdGlvbjoKKyAqCUluZXhhY3QgZmxhZyByYWlzZWQgaWYgeCBub3QgZXF1YWwgdG8gZmxvb3IoeCkuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZSBodWdlID0gMS4wZTMwMDsKKworZG91YmxlCitmbG9vcihkb3VibGUgeCkKK3sKKwlpbnQzMl90IGkwLGkxLGowOworCXVfaW50MzJfdCBpLGo7CisJRVhUUkFDVF9XT1JEUyhpMCxpMSx4KTsKKwlqMCA9ICgoaTA+PjIwKSYweDdmZiktMHgzZmY7CisJaWYoajA8MjApIHsKKwkgICAgaWYoajA8MCkgeyAJLyogcmFpc2UgaW5leGFjdCBpZiB4ICE9IDAgKi8KKwkJaWYoaHVnZSt4PjAuMCkgey8qIHJldHVybiAwKnNpZ24oeCkgaWYgfHh8PDEgKi8KKwkJICAgIGlmKGkwPj0wKSB7aTA9aTE9MDt9CisJCSAgICBlbHNlIGlmKCgoaTAmMHg3ZmZmZmZmZil8aTEpIT0wKQorCQkJeyBpMD0weGJmZjAwMDAwO2kxPTA7fQorCQl9CisJICAgIH0gZWxzZSB7CisJCWkgPSAoMHgwMDBmZmZmZik+PmowOworCQlpZigoKGkwJmkpfGkxKT09MCkgcmV0dXJuIHg7IC8qIHggaXMgaW50ZWdyYWwgKi8KKwkJaWYoaHVnZSt4PjAuMCkgewkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJICAgIGlmKGkwPDApIGkwICs9ICgweDAwMTAwMDAwKT4+ajA7CisJCSAgICBpMCAmPSAofmkpOyBpMT0wOworCQl9CisJICAgIH0KKwl9IGVsc2UgaWYgKGowPjUxKSB7CisJICAgIGlmKGowPT0weDQwMCkgcmV0dXJuIHgreDsJLyogaW5mIG9yIE5hTiAqLworCSAgICBlbHNlIHJldHVybiB4OwkJLyogeCBpcyBpbnRlZ3JhbCAqLworCX0gZWxzZSB7CisJICAgIGkgPSAoKHVfaW50MzJfdCkoMHhmZmZmZmZmZikpPj4oajAtMjApOworCSAgICBpZigoaTEmaSk9PTApIHJldHVybiB4OwkvKiB4IGlzIGludGVncmFsICovCisJICAgIGlmKGh1Z2UreD4wLjApIHsgCQkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJaWYoaTA8MCkgeworCQkgICAgaWYoajA9PTIwKSBpMCs9MTsKKwkJICAgIGVsc2UgeworCQkJaiA9IGkxKygxPDwoNTItajApKTsKKwkJCWlmKGo8aTEpIGkwICs9MSA7IAkvKiBnb3QgYSBjYXJyeSAqLworCQkJaTE9ajsKKwkJICAgIH0KKwkJfQorCQlpMSAmPSAofmkpOworCSAgICB9CisJfQorCUlOU0VSVF9XT1JEUyh4LGkwLGkxKTsKKwlyZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZmxvb3JmLmMgYi9saWJtL3NyYy9zX2Zsb29yZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYTcxZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2Zsb29yZi5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qIHNfZmxvb3JmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2Zsb29yLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2Zsb29yZi5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogZmxvb3JmKHgpCisgKiBSZXR1cm4geCByb3VuZGVkIHRvd2FyZCAtaW5mIHRvIGludGVncmFsIHZhbHVlCisgKiBNZXRob2Q6CisgKglCaXQgdHdpZGRsaW5nLgorICogRXhjZXB0aW9uOgorICoJSW5leGFjdCBmbGFnIHJhaXNlZCBpZiB4IG5vdCBlcXVhbCB0byBmbG9vcmYoeCkuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0IGh1Z2UgPSAxLjBlMzA7CisKK2Zsb2F0CitmbG9vcmYoZmxvYXQgeCkKK3sKKwlpbnQzMl90IGkwLGowOworCXVfaW50MzJfdCBpOworCUdFVF9GTE9BVF9XT1JEKGkwLHgpOworCWowID0gKChpMD4+MjMpJjB4ZmYpLTB4N2Y7CisJaWYoajA8MjMpIHsKKwkgICAgaWYoajA8MCkgeyAJLyogcmFpc2UgaW5leGFjdCBpZiB4ICE9IDAgKi8KKwkJaWYoaHVnZSt4PihmbG9hdCkwLjApIHsvKiByZXR1cm4gMCpzaWduKHgpIGlmIHx4fDwxICovCisJCSAgICBpZihpMD49MCkge2kwPTA7fQorCQkgICAgZWxzZSBpZigoaTAmMHg3ZmZmZmZmZikhPTApCisJCQl7IGkwPTB4YmY4MDAwMDA7fQorCQl9CisJICAgIH0gZWxzZSB7CisJCWkgPSAoMHgwMDdmZmZmZik+PmowOworCQlpZigoaTAmaSk9PTApIHJldHVybiB4OyAvKiB4IGlzIGludGVncmFsICovCisJCWlmKGh1Z2UreD4oZmxvYXQpMC4wKSB7CS8qIHJhaXNlIGluZXhhY3QgZmxhZyAqLworCQkgICAgaWYoaTA8MCkgaTAgKz0gKDB4MDA4MDAwMDApPj5qMDsKKwkJICAgIGkwICY9ICh+aSk7CisJCX0KKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGlmKGowPT0weDgwKSByZXR1cm4geCt4OwkvKiBpbmYgb3IgTmFOICovCisJICAgIGVsc2UgcmV0dXJuIHg7CQkvKiB4IGlzIGludGVncmFsICovCisJfQorCVNFVF9GTE9BVF9XT1JEKHgsaTApOworCXJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mbG9vcmwuYyBiL2xpYm0vc3JjL3NfZmxvb3JsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVmMGFjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZmxvb3JsLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogRnJvbTogQCgjKXNfZmxvb3IuYyA1LjEgOTMvMDkvMjQKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mbG9vcmwuYyx2IDEuNCAyMDA1LzA0LzI4IDE5OjQ1OjU1IHN0ZWZhbmYgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBmbG9vcmwoeCkKKyAqIFJldHVybiB4IHJvdW5kZWQgdG93YXJkIC1pbmYgdG8gaW50ZWdyYWwgdmFsdWUKKyAqIE1ldGhvZDoKKyAqCUJpdCB0d2lkZGxpbmcuCisgKiBFeGNlcHRpb246CisgKglJbmV4YWN0IGZsYWcgcmFpc2VkIGlmIHggbm90IGVxdWFsIHRvIGZsb29ybCh4KS4KKyAqLworCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworI2lmZGVmIExEQkxfSU1QTElDSVRfTkJJVAorI2RlZmluZQlNQU5IX1NJWkUJKExEQkxfTUFOSF9TSVpFICsgMSkKKyNkZWZpbmUJSU5DX01BTkgodSwgYykJZG8gewkJCQkJXAorCXVpbnQ2NF90IG8gPSB1LmJpdHMubWFuaDsJCQkJXAorCXUuYml0cy5tYW5oICs9IChjKTsJCQkJCVwKKwlpZiAodS5iaXRzLm1hbmggPCBvKQkJCQkJXAorCQl1LmJpdHMuZXhwKys7CQkJCQlcCit9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUJTUFOSF9TSVpFCUxEQkxfTUFOSF9TSVpFCisjZGVmaW5lCUlOQ19NQU5IKHUsIGMpCWRvIHsJCQkJCVwKKwl1aW50NjRfdCBvID0gdS5iaXRzLm1hbmg7CQkJCVwKKwl1LmJpdHMubWFuaCArPSAoYyk7CQkJCQlcCisJaWYgKHUuYml0cy5tYW5oIDwgbykgewkJCQkJXAorCQl1LmJpdHMuZXhwKys7CQkJCQlcCisJCXUuYml0cy5tYW5oIHw9IDFsbHUgPDwgKExEQkxfTUFOSF9TSVpFIC0gMSk7CVwKKwl9CQkJCQkJCVwKK30gd2hpbGUgKDApCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGxvbmcgZG91YmxlIGh1Z2UgPSAxLjBlMzAwOworCitsb25nIGRvdWJsZQorZmxvb3JsKGxvbmcgZG91YmxlIHgpCit7CisJdW5pb24gSUVFRWwyYml0cyB1ID0geyAuZSA9IHggfTsKKwlpbnQgZSA9IHUuYml0cy5leHAgLSBMREJMX01BWF9FWFAgKyAxOworCisJaWYgKGUgPCBNQU5IX1NJWkUgLSAxKSB7CisJCWlmIChlIDwgMCkgewkJCS8qIHJhaXNlIGluZXhhY3QgaWYgeCAhPSAwICovCisJCQlpZiAoaHVnZSArIHggPiAwLjApCisJCQkJaWYgKHUuYml0cy5leHAgPiAwIHx8CisJCQkJICAgICh1LmJpdHMubWFuaCB8IHUuYml0cy5tYW5sKSAhPSAwKQorCQkJCQl1LmUgPSB1LmJpdHMuc2lnbiA/IC0xLjAgOiAwLjA7CisJCX0gZWxzZSB7CisJCQl1aW50NjRfdCBtID0gKCgxbGx1IDw8IE1BTkhfU0laRSkgLSAxKSA+PiAoZSArIDEpOworCQkJaWYgKCgodS5iaXRzLm1hbmggJiBtKSB8IHUuYml0cy5tYW5sKSA9PSAwKQorCQkJCXJldHVybiAoeCk7CS8qIHggaXMgaW50ZWdyYWwgKi8KKwkJCWlmICh1LmJpdHMuc2lnbikgeworI2lmZGVmIExEQkxfSU1QTElDSVRfTkJJVAorCQkJCWlmIChlID09IDApCisJCQkJCXUuYml0cy5leHArKzsKKwkJCQllbHNlCisjZW5kaWYKKwkJCQlJTkNfTUFOSCh1LCAxbGx1IDw8IChNQU5IX1NJWkUgLSBlIC0gMSkpOworCQkJfQorCQkJaWYgKGh1Z2UgKyB4ID4gMC4wKSB7CS8qIHJhaXNlIGluZXhhY3QgZmxhZyAqLworCQkJCXUuYml0cy5tYW5oICY9IH5tOworCQkJCXUuYml0cy5tYW5sID0gMDsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoZSA8IExEQkxfTUFOVF9ESUcgLSAxKSB7CisJCXVpbnQ2NF90IG0gPSAodWludDY0X3QpLTEgPj4gKDY0IC0gTERCTF9NQU5UX0RJRyArIGUgKyAxKTsKKwkJaWYgKCh1LmJpdHMubWFubCAmIG0pID09IDApCisJCQlyZXR1cm4gKHgpOwkvKiB4IGlzIGludGVncmFsICovCisJCWlmICh1LmJpdHMuc2lnbikgeworCQkJaWYgKGUgPT0gTUFOSF9TSVpFIC0gMSkKKwkJCQlJTkNfTUFOSCh1LCAxKTsKKwkJCWVsc2UgeworCQkJCXVpbnQ2NF90IG8gPSB1LmJpdHMubWFubDsKKwkJCQl1LmJpdHMubWFubCArPSAxbGx1IDw8IChMREJMX01BTlRfRElHIC0gZSAtIDEpOworCQkJCWlmICh1LmJpdHMubWFubCA8IG8pCS8qIGdvdCBhIGNhcnJ5ICovCisJCQkJCUlOQ19NQU5IKHUsIDEpOworCQkJfQorCQl9CisJCWlmIChodWdlICsgeCA+IDAuMCkJCS8qIHJhaXNlIGluZXhhY3QgZmxhZyAqLworCQkJdS5iaXRzLm1hbmwgJj0gfm07CisJfQorCXJldHVybiAodS5lKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZm1hLmMgYi9saWJtL3NyYy9zX2ZtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmY2MyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2ZtYS5jCkBAIC0wLDAgKzEsMjAyIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZtYS5jLHYgMS40IDIwMDUvMDMvMTggMDI6Mjc6NTkgZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlIDxmZW52Lmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKy8qCisgKiBGdXNlZCBtdWx0aXBseS1hZGQ6IENvbXB1dGUgeCAqIHkgKyB6IHdpdGggYSBzaW5nbGUgcm91bmRpbmcgZXJyb3IuCisgKgorICogV2UgdXNlIHNjYWxpbmcgdG8gYXZvaWQgb3ZlcmZsb3cvdW5kZXJmbG93LCBhbG9uZyB3aXRoIHRoZQorICogY2Fub25pY2FsIHByZWNpc2lvbi1kb3VibGluZyB0ZWNobmlxdWUgYWRhcHRlZCBmcm9tOgorICoKKyAqCURla2tlciwgVC4gIEEgRmxvYXRpbmctUG9pbnQgVGVjaG5pcXVlIGZvciBFeHRlbmRpbmcgdGhlCisgKglBdmFpbGFibGUgUHJlY2lzaW9uLiAgTnVtZXIuIE1hdGguIDE4LCAyMjQtMjQyICgxOTcxKS4KKyAqCisgKiBUaGlzIGFsZ29yaXRobSBpcyBzZW5zaXRpdmUgdG8gdGhlIHJvdW5kaW5nIHByZWNpc2lvbi4gIEZQVXMgc3VjaAorICogYXMgdGhlIGkzODcgbXVzdCBiZSBzZXQgaW4gZG91YmxlLXByZWNpc2lvbiBtb2RlIGlmIHZhcmlhYmxlcyBhcmUKKyAqIHRvIGJlIHN0b3JlZCBpbiBGUCByZWdpc3RlcnMgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb3JyZWN0IHJlc3VsdHMuCisgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IG9uIEZyZWVCU0QsIGJ1dCBub3Qgb24gbWFueSBvdGhlciBzeXN0ZW1zLgorICoKKyAqIEhhcmR3YXJlIGluc3RydWN0aW9ucyBzaG91bGQgYmUgdXNlZCBvbiBhcmNoaXRlY3R1cmVzIHRoYXQgc3VwcG9ydCBpdCwKKyAqIHNpbmNlIHRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCBsaWtlbHkgYmUgc2V2ZXJhbCB0aW1lcyBzbG93ZXIuCisgKi8KKyNpZiBMREJMX01BTlRfRElHICE9IDExMworZG91YmxlCitmbWEoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeikKK3sKKwlzdGF0aWMgY29uc3QgZG91YmxlIHNwbGl0ID0gMHgxcDI3ICsgMS4wOworCWRvdWJsZSB4cywgeXMsIHpzOworCWRvdWJsZSBjLCBjYywgaHgsIGh5LCBwLCBxLCB0eCwgdHk7CisJZG91YmxlIHIsIHJyLCBzOworCWludCBvcm91bmQ7CisJaW50IGV4LCBleSwgZXo7CisJaW50IHNwcmVhZDsKKworCWlmICh6ID09IDAuMCkKKwkJcmV0dXJuICh4ICogeSk7CisJaWYgKHggPT0gMC4wIHx8IHkgPT0gMC4wKQorCQlyZXR1cm4gKHggKiB5ICsgeik7CisKKwkvKiBSZXN1bHRzIG9mIGZyZXhwKCkgYXJlIHVuZGVmaW5lZCBmb3IgdGhlc2UgY2FzZXMuICovCisJaWYgKCFpc2Zpbml0ZSh4KSB8fCAhaXNmaW5pdGUoeSkgfHwgIWlzZmluaXRlKHopKQorCQlyZXR1cm4gKHggKiB5ICsgeik7CisKKwl4cyA9IGZyZXhwKHgsICZleCk7CisJeXMgPSBmcmV4cCh5LCAmZXkpOworCXpzID0gZnJleHAoeiwgJmV6KTsKKwlvcm91bmQgPSBmZWdldHJvdW5kKCk7CisJc3ByZWFkID0gZXggKyBleSAtIGV6OworCisJLyoKKwkgKiBJZiB4ICogeSBhbmQgeiBhcmUgbWFueSBvcmRlcnMgb2YgbWFnbml0dWRlIGFwYXJ0LCB0aGUgc2NhbGluZworCSAqIHdpbGwgb3ZlcmZsb3csIHNvIHdlIGhhbmRsZSB0aGVzZSBjYXNlcyBzcGVjaWFsbHkuICBSb3VuZGluZworCSAqIG1vZGVzIG90aGVyIHRoYW4gRkVfVE9ORUFSRVNUIGFyZSBwYWluZnVsLgorCSAqLworCWlmIChzcHJlYWQgPiBEQkxfTUFOVF9ESUcgKiAyKSB7CisJCWZlbnZfdCBlbnY7CisJCWZlcmFpc2VleGNlcHQoRkVfSU5FWEFDVCk7CisJCXN3aXRjaChvcm91bmQpIHsKKwkJY2FzZSBGRV9UT05FQVJFU1Q6CisJCQlyZXR1cm4gKHggKiB5KTsKKwkJY2FzZSBGRV9UT1dBUkRaRVJPOgorCQkJaWYgKHggPiAwLjAgXiB5IDwgMC4wIF4geiA8IDAuMCkKKwkJCQlyZXR1cm4gKHggKiB5KTsKKwkJCWZlaG9sZGV4Y2VwdCgmZW52KTsKKwkJCXIgPSB4ICogeTsKKwkJCWlmICghZmV0ZXN0ZXhjZXB0KEZFX0lORVhBQ1QpKQorCQkJCXIgPSBuZXh0YWZ0ZXIociwgMCk7CisJCQlmZXVwZGF0ZWVudigmZW52KTsKKwkJCXJldHVybiAocik7CisJCWNhc2UgRkVfRE9XTldBUkQ6CisJCQlpZiAoeiA+IDAuMCkKKwkJCQlyZXR1cm4gKHggKiB5KTsKKwkJCWZlaG9sZGV4Y2VwdCgmZW52KTsKKwkJCXIgPSB4ICogeTsKKwkJCWlmICghZmV0ZXN0ZXhjZXB0KEZFX0lORVhBQ1QpKQorCQkJCXIgPSBuZXh0YWZ0ZXIociwgLUlORklOSVRZKTsKKwkJCWZldXBkYXRlZW52KCZlbnYpOworCQkJcmV0dXJuIChyKTsKKwkJZGVmYXVsdDoJLyogRkVfVVBXQVJEICovCisJCQlpZiAoeiA8IDAuMCkKKwkJCQlyZXR1cm4gKHggKiB5KTsKKwkJCWZlaG9sZGV4Y2VwdCgmZW52KTsKKwkJCXIgPSB4ICogeTsKKwkJCWlmICghZmV0ZXN0ZXhjZXB0KEZFX0lORVhBQ1QpKQorCQkJCXIgPSBuZXh0YWZ0ZXIociwgSU5GSU5JVFkpOworCQkJZmV1cGRhdGVlbnYoJmVudik7CisJCQlyZXR1cm4gKHIpOworCQl9CisJfQorCWlmIChzcHJlYWQgPCAtREJMX01BTlRfRElHKSB7CisJCWZlcmFpc2VleGNlcHQoRkVfSU5FWEFDVCk7CisJCWlmICghaXNub3JtYWwoeikpCisJCQlmZXJhaXNlZXhjZXB0KEZFX1VOREVSRkxPVyk7CisJCXN3aXRjaCAob3JvdW5kKSB7CisJCWNhc2UgRkVfVE9ORUFSRVNUOgorCQkJcmV0dXJuICh6KTsKKwkJY2FzZSBGRV9UT1dBUkRaRVJPOgorCQkJaWYgKHggPiAwLjAgXiB5IDwgMC4wIF4geiA8IDAuMCkKKwkJCQlyZXR1cm4gKHopOworCQkJZWxzZQorCQkJCXJldHVybiAobmV4dGFmdGVyKHosIDApKTsKKwkJY2FzZSBGRV9ET1dOV0FSRDoKKwkJCWlmICh4ID4gMC4wIF4geSA8IDAuMCkKKwkJCQlyZXR1cm4gKHopOworCQkJZWxzZQorCQkJCXJldHVybiAobmV4dGFmdGVyKHosIC1JTkZJTklUWSkpOworCQlkZWZhdWx0OgkvKiBGRV9VUFdBUkQgKi8KKwkJCWlmICh4ID4gMC4wIF4geSA8IDAuMCkKKwkJCQlyZXR1cm4gKG5leHRhZnRlcih6LCBJTkZJTklUWSkpOworCQkJZWxzZQorCQkJCXJldHVybiAoeik7CisJCX0KKwl9CisKKwkvKgorCSAqIFVzZSBEZWtrZXIncyBhbGdvcml0aG0gdG8gcGVyZm9ybSB0aGUgbXVsdGlwbGljYXRpb24gYW5kCisJICogc3Vic2VxdWVudCBhZGRpdGlvbiBpbiB0d2ljZSB0aGUgbWFjaGluZSBwcmVjaXNpb24uCisJICogQXJyYW5nZSBzbyB0aGF0IHggKiB5ID0gYyArIGNjLCBhbmQgeCAqIHkgKyB6ID0gciArIHJyLgorCSAqLworCWZlc2V0cm91bmQoRkVfVE9ORUFSRVNUKTsKKworCXAgPSB4cyAqIHNwbGl0OworCWh4ID0geHMgLSBwOworCWh4ICs9IHA7CisJdHggPSB4cyAtIGh4OworCisJcCA9IHlzICogc3BsaXQ7CisJaHkgPSB5cyAtIHA7CisJaHkgKz0gcDsKKwl0eSA9IHlzIC0gaHk7CisKKwlwID0gaHggKiBoeTsKKwlxID0gaHggKiB0eSArIHR4ICogaHk7CisJYyA9IHAgKyBxOworCWNjID0gcCAtIGMgKyBxICsgdHggKiB0eTsKKworCXpzID0gbGRleHAoenMsIC1zcHJlYWQpOworCXIgPSBjICsgenM7CisJcyA9IHIgLSBjOworCXJyID0gKGMgLSAociAtIHMpKSArICh6cyAtIHMpICsgY2M7CisKKwlzcHJlYWQgPSBleCArIGV5OworCWlmIChzcHJlYWQgKyBpbG9nYihyKSA+IC0xMDIzKSB7CisJCWZlc2V0cm91bmQob3JvdW5kKTsKKwkJciA9IHIgKyBycjsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGUgcmVzdWx0IGlzIHN1Ym5vcm1hbCwgc28gd2Ugcm91bmQgYmVmb3JlIHNjYWxpbmcgdG8KKwkJICogYXZvaWQgZG91YmxlIHJvdW5kaW5nLgorCQkgKi8KKwkJcCA9IGxkZXhwKGNvcHlzaWduKDB4MXAtMTAyMiwgciksIC1zcHJlYWQpOworCQljID0gciArIHA7CisJCXMgPSBjIC0gcjsKKwkJY2MgPSAociAtIChjIC0gcykpICsgKHAgLSBzKSArIHJyOworCQlmZXNldHJvdW5kKG9yb3VuZCk7CisJCXIgPSAoYyArIGNjKSAtIHA7CisJfQorCXJldHVybiAobGRleHAociwgc3ByZWFkKSk7Cit9CisjZWxzZQkvKiBMREJMX01BTlRfRElHID09IDExMyAqLworLyoKKyAqIDExMyBiaXRzIG9mIHByZWNpc2lvbiBpcyBtb3JlIHRoYW4gdHdpY2UgdGhlIHByZWNpc2lvbiBvZiBhIGRvdWJsZSwKKyAqIHNvIGl0IGlzIGVub3VnaCB0byByZXByZXNlbnQgdGhlIGludGVybWVkaWF0ZSBwcm9kdWN0IGV4YWN0bHkuCisgKi8KK2RvdWJsZQorZm1hKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopCit7CisJcmV0dXJuICgobG9uZyBkb3VibGUpeCAqIHkgKyB6KTsKK30KKyNlbmRpZgkvKiBMREJMX01BTlRfRElHICE9IDExMyAqLworCisjaWYgKExEQkxfTUFOVF9ESUcgPT0gNTMpCitfX3dlYWtfcmVmZXJlbmNlKGZtYSwgZm1hbCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZm1hZi5jIGIvbGlibS9zcmMvc19mbWFmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFhYWFhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZm1hZi5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZm1hZi5jLHYgMS4xIDIwMDUvMDEvMjIgMDk6NTM6MTggZGFzIEV4cCAkIik7ICovCisKKy8qCisgKiBGdXNlZCBtdWx0aXBseS1hZGQ6IENvbXB1dGUgeCAqIHkgKyB6IHdpdGggYSBzaW5nbGUgcm91bmRpbmcgZXJyb3IuCisgKgorICogQSBkb3VibGUgaGFzIG1vcmUgdGhhbiB0d2ljZSBhcyBtdWNoIHByZWNpc2lvbiB0aGFuIGEgZmxvYXQsIHNvCisgKiBkaXJlY3QgZG91YmxlLXByZWNpc2lvbiBhcml0aG1ldGljIHN1ZmZpY2VzLgorICoKKyAqIFhYWCBXZSBhcmUgcmVseWluZyBvbiB0aGUgY29tcGlsZXIgdG8gY29udmVydCBmcm9tIGRvdWJsZSB0byBmbG9hdAorICogICAgIHVzaW5nIHRoZSBjdXJyZW50IHJvdW5kaW5nIG1vZGUgYW5kIHdpdGggdGhlIGFwcHJvcHJpYXRlCisgKiAgICAgc2lkZS1lZmZlY3RzLiAgQnV0IG9uIGF0IGxlYXN0IG9uZSBwbGF0Zm9ybSAoZ2NjIDMuNC4yL3NwYXJjNjQpLAorICogICAgIHRoaXMgYXBwZWFycyB0byBiZSB0b28gbXVjaCB0byBhc2sgZm9yLiAgVGhlIHByZWNpc2lvbgorICogICAgIHJlZHVjdGlvbiBzaG91bGQgYmUgZG9uZSBtYW51YWxseS4KKyAqLworZmxvYXQKK2ZtYWYoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKK3sKKworCXJldHVybiAoKGRvdWJsZSl4ICogeSArIHopOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mbWFsLmMgYi9saWJtL3NyYy9zX2ZtYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTczNmZhCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mbWFsLmMKQEAgLTAsMCArMSwxODIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZm1hbC5jLHYgMS4yIDIwMDUvMDMvMTggMDI6Mjc6NTkgZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlIDxmZW52Lmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKy8qCisgKiBGdXNlZCBtdWx0aXBseS1hZGQ6IENvbXB1dGUgeCAqIHkgKyB6IHdpdGggYSBzaW5nbGUgcm91bmRpbmcgZXJyb3IuCisgKgorICogV2UgdXNlIHNjYWxpbmcgdG8gYXZvaWQgb3ZlcmZsb3cvdW5kZXJmbG93LCBhbG9uZyB3aXRoIHRoZQorICogY2Fub25pY2FsIHByZWNpc2lvbi1kb3VibGluZyB0ZWNobmlxdWUgYWRhcHRlZCBmcm9tOgorICoKKyAqCURla2tlciwgVC4gIEEgRmxvYXRpbmctUG9pbnQgVGVjaG5pcXVlIGZvciBFeHRlbmRpbmcgdGhlCisgKglBdmFpbGFibGUgUHJlY2lzaW9uLiAgTnVtZXIuIE1hdGguIDE4LCAyMjQtMjQyICgxOTcxKS4KKyAqLworbG9uZyBkb3VibGUKK2ZtYWwobG9uZyBkb3VibGUgeCwgbG9uZyBkb3VibGUgeSwgbG9uZyBkb3VibGUgeikKK3sKKyNpZiBMREJMX01BTlRfRElHID09IDY0CisJc3RhdGljIGNvbnN0IGxvbmcgZG91YmxlIHNwbGl0ID0gMHgxcDMyTCArIDEuMDsKKyNlbGlmIExEQkxfTUFOVF9ESUcgPT0gMTEzCisJc3RhdGljIGNvbnN0IGxvbmcgZG91YmxlIHNwbGl0ID0gMHgxcDU3TCArIDEuMDsKKyNlbmRpZgorCWxvbmcgZG91YmxlIHhzLCB5cywgenM7CisJbG9uZyBkb3VibGUgYywgY2MsIGh4LCBoeSwgcCwgcSwgdHgsIHR5OworCWxvbmcgZG91YmxlIHIsIHJyLCBzOworCWludCBvcm91bmQ7CisJaW50IGV4LCBleSwgZXo7CisJaW50IHNwcmVhZDsKKworCWlmICh6ID09IDAuMCkKKwkJcmV0dXJuICh4ICogeSk7CisJaWYgKHggPT0gMC4wIHx8IHkgPT0gMC4wKQorCQlyZXR1cm4gKHggKiB5ICsgeik7CisKKwkvKiBSZXN1bHRzIG9mIGZyZXhwKCkgYXJlIHVuZGVmaW5lZCBmb3IgdGhlc2UgY2FzZXMuICovCisJaWYgKCFpc2Zpbml0ZSh4KSB8fCAhaXNmaW5pdGUoeSkgfHwgIWlzZmluaXRlKHopKQorCQlyZXR1cm4gKHggKiB5ICsgeik7CisKKwl4cyA9IGZyZXhwbCh4LCAmZXgpOworCXlzID0gZnJleHBsKHksICZleSk7CisJenMgPSBmcmV4cGwoeiwgJmV6KTsKKwlvcm91bmQgPSBmZWdldHJvdW5kKCk7CisJc3ByZWFkID0gZXggKyBleSAtIGV6OworCisJLyoKKwkgKiBJZiB4ICogeSBhbmQgeiBhcmUgbWFueSBvcmRlcnMgb2YgbWFnbml0dWRlIGFwYXJ0LCB0aGUgc2NhbGluZworCSAqIHdpbGwgb3ZlcmZsb3csIHNvIHdlIGhhbmRsZSB0aGVzZSBjYXNlcyBzcGVjaWFsbHkuICBSb3VuZGluZworCSAqIG1vZGVzIG90aGVyIHRoYW4gRkVfVE9ORUFSRVNUIGFyZSBwYWluZnVsLgorCSAqLworCWlmIChzcHJlYWQgPiBMREJMX01BTlRfRElHICogMikgeworCQlmZW52X3QgZW52OworCQlmZXJhaXNlZXhjZXB0KEZFX0lORVhBQ1QpOworCQlzd2l0Y2gob3JvdW5kKSB7CisJCWNhc2UgRkVfVE9ORUFSRVNUOgorCQkJcmV0dXJuICh4ICogeSk7CisJCWNhc2UgRkVfVE9XQVJEWkVSTzoKKwkJCWlmICh4ID4gMC4wIF4geSA8IDAuMCBeIHogPCAwLjApCisJCQkJcmV0dXJuICh4ICogeSk7CisJCQlmZWhvbGRleGNlcHQoJmVudik7CisJCQlyID0geCAqIHk7CisJCQlpZiAoIWZldGVzdGV4Y2VwdChGRV9JTkVYQUNUKSkKKwkJCQlyID0gbmV4dGFmdGVybChyLCAwKTsKKwkJCWZldXBkYXRlZW52KCZlbnYpOworCQkJcmV0dXJuIChyKTsKKwkJY2FzZSBGRV9ET1dOV0FSRDoKKwkJCWlmICh6ID4gMC4wKQorCQkJCXJldHVybiAoeCAqIHkpOworCQkJZmVob2xkZXhjZXB0KCZlbnYpOworCQkJciA9IHggKiB5OworCQkJaWYgKCFmZXRlc3RleGNlcHQoRkVfSU5FWEFDVCkpCisJCQkJciA9IG5leHRhZnRlcmwociwgLUlORklOSVRZKTsKKwkJCWZldXBkYXRlZW52KCZlbnYpOworCQkJcmV0dXJuIChyKTsKKwkJZGVmYXVsdDoJLyogRkVfVVBXQVJEICovCisJCQlpZiAoeiA8IDAuMCkKKwkJCQlyZXR1cm4gKHggKiB5KTsKKwkJCWZlaG9sZGV4Y2VwdCgmZW52KTsKKwkJCXIgPSB4ICogeTsKKwkJCWlmICghZmV0ZXN0ZXhjZXB0KEZFX0lORVhBQ1QpKQorCQkJCXIgPSBuZXh0YWZ0ZXJsKHIsIElORklOSVRZKTsKKwkJCWZldXBkYXRlZW52KCZlbnYpOworCQkJcmV0dXJuIChyKTsKKwkJfQorCX0KKwlpZiAoc3ByZWFkIDwgLUxEQkxfTUFOVF9ESUcpIHsKKwkJZmVyYWlzZWV4Y2VwdChGRV9JTkVYQUNUKTsKKwkJaWYgKCFpc25vcm1hbCh6KSkKKwkJCWZlcmFpc2VleGNlcHQoRkVfVU5ERVJGTE9XKTsKKwkJc3dpdGNoIChvcm91bmQpIHsKKwkJY2FzZSBGRV9UT05FQVJFU1Q6CisJCQlyZXR1cm4gKHopOworCQljYXNlIEZFX1RPV0FSRFpFUk86CisJCQlpZiAoeCA+IDAuMCBeIHkgPCAwLjAgXiB6IDwgMC4wKQorCQkJCXJldHVybiAoeik7CisJCQllbHNlCisJCQkJcmV0dXJuIChuZXh0YWZ0ZXJsKHosIDApKTsKKwkJY2FzZSBGRV9ET1dOV0FSRDoKKwkJCWlmICh4ID4gMC4wIF4geSA8IDAuMCkKKwkJCQlyZXR1cm4gKHopOworCQkJZWxzZQorCQkJCXJldHVybiAobmV4dGFmdGVybCh6LCAtSU5GSU5JVFkpKTsKKwkJZGVmYXVsdDoJLyogRkVfVVBXQVJEICovCisJCQlpZiAoeCA+IDAuMCBeIHkgPCAwLjApCisJCQkJcmV0dXJuIChuZXh0YWZ0ZXJsKHosIElORklOSVRZKSk7CisJCQllbHNlCisJCQkJcmV0dXJuICh6KTsKKwkJfQorCX0KKworCS8qCisJICogVXNlIERla2tlcidzIGFsZ29yaXRobSB0byBwZXJmb3JtIHRoZSBtdWx0aXBsaWNhdGlvbiBhbmQKKwkgKiBzdWJzZXF1ZW50IGFkZGl0aW9uIGluIHR3aWNlIHRoZSBtYWNoaW5lIHByZWNpc2lvbi4KKwkgKiBBcnJhbmdlIHNvIHRoYXQgeCAqIHkgPSBjICsgY2MsIGFuZCB4ICogeSArIHogPSByICsgcnIuCisJICovCisJZmVzZXRyb3VuZChGRV9UT05FQVJFU1QpOworCisJcCA9IHhzICogc3BsaXQ7CisJaHggPSB4cyAtIHA7CisJaHggKz0gcDsKKwl0eCA9IHhzIC0gaHg7CisKKwlwID0geXMgKiBzcGxpdDsKKwloeSA9IHlzIC0gcDsKKwloeSArPSBwOworCXR5ID0geXMgLSBoeTsKKworCXAgPSBoeCAqIGh5OworCXEgPSBoeCAqIHR5ICsgdHggKiBoeTsKKwljID0gcCArIHE7CisJY2MgPSBwIC0gYyArIHEgKyB0eCAqIHR5OworCisJenMgPSBsZGV4cGwoenMsIC1zcHJlYWQpOworCXIgPSBjICsgenM7CisJcyA9IHIgLSBjOworCXJyID0gKGMgLSAociAtIHMpKSArICh6cyAtIHMpICsgY2M7CisKKwlzcHJlYWQgPSBleCArIGV5OworCWlmIChzcHJlYWQgKyBpbG9nYmwocikgPiAtMTYzODMpIHsKKwkJZmVzZXRyb3VuZChvcm91bmQpOworCQlyID0gciArIHJyOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoZSByZXN1bHQgaXMgc3Vibm9ybWFsLCBzbyB3ZSByb3VuZCBiZWZvcmUgc2NhbGluZyB0bworCQkgKiBhdm9pZCBkb3VibGUgcm91bmRpbmcuCisJCSAqLworCQlwID0gbGRleHBsKGNvcHlzaWdubCgweDFwLTE2MzgyTCwgciksIC1zcHJlYWQpOworCQljID0gciArIHA7CisJCXMgPSBjIC0gcjsKKwkJY2MgPSAociAtIChjIC0gcykpICsgKHAgLSBzKSArIHJyOworCQlmZXNldHJvdW5kKG9yb3VuZCk7CisJCXIgPSAoYyArIGNjKSAtIHA7CisJfQorCXJldHVybiAobGRleHBsKHIsIHNwcmVhZCkpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mbWF4LmMgYi9saWJtL3NyYy9zX2ZtYXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzQ1ZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mbWF4LmMKQEAgLTAsMCArMSw1MyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mbWF4LmMsdiAxLjEgMjAwNC8wNi8zMCAwNzowNDowMSBkYXMgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorCitkb3VibGUKK2ZtYXgoZG91YmxlIHgsIGRvdWJsZSB5KQoreworCXVuaW9uIElFRUVkMmJpdHMgdVsyXTsKKworCXVbMF0uZCA9IHg7CisJdVsxXS5kID0geTsKKworCS8qIENoZWNrIGZvciBOYU5zIHRvIGF2b2lkIHJhaXNpbmcgc3B1cmlvdXMgZXhjZXB0aW9ucy4gKi8KKwlpZiAodVswXS5iaXRzLmV4cCA9PSAyMDQ3ICYmICh1WzBdLmJpdHMubWFuaCB8IHVbMF0uYml0cy5tYW5sKSAhPSAwKQorCQlyZXR1cm4gKHkpOworCWlmICh1WzFdLmJpdHMuZXhwID09IDIwNDcgJiYgKHVbMV0uYml0cy5tYW5oIHwgdVsxXS5iaXRzLm1hbmwpICE9IDApCisJCXJldHVybiAoeCk7CisKKwkvKiBIYW5kbGUgY29tcGFyaXNvbnMgb2Ygc2lnbmVkIHplcm9lcy4gKi8KKwlpZiAodVswXS5iaXRzLnNpZ24gIT0gdVsxXS5iaXRzLnNpZ24pCisJCXJldHVybiAodVt1WzBdLmJpdHMuc2lnbl0uZCk7CisKKwlyZXR1cm4gKHggPiB5ID8geCA6IHkpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mbWF4Zi5jIGIvbGlibS9zcmMvc19mbWF4Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2N2Y2NTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2ZtYXhmLmMKQEAgLTAsMCArMSw1MyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mbWF4Zi5jLHYgMS4xIDIwMDQvMDYvMzAgMDc6MDQ6MDEgZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworZmxvYXQKK2ZtYXhmKGZsb2F0IHgsIGZsb2F0IHkpCit7CisJdW5pb24gSUVFRWYyYml0cyB1WzJdOworCisJdVswXS5mID0geDsKKwl1WzFdLmYgPSB5OworCisJLyogQ2hlY2sgZm9yIE5hTnMgdG8gYXZvaWQgcmFpc2luZyBzcHVyaW91cyBleGNlcHRpb25zLiAqLworCWlmICh1WzBdLmJpdHMuZXhwID09IDI1NSAmJiB1WzBdLmJpdHMubWFuICE9IDApCisJCXJldHVybiAoeSk7CisJaWYgKHVbMV0uYml0cy5leHAgPT0gMjU1ICYmIHVbMV0uYml0cy5tYW4gIT0gMCkKKwkJcmV0dXJuICh4KTsKKworCS8qIEhhbmRsZSBjb21wYXJpc29ucyBvZiBzaWduZWQgemVyb2VzLiAqLworCWlmICh1WzBdLmJpdHMuc2lnbiAhPSB1WzFdLmJpdHMuc2lnbikKKwkJcmV0dXJuICh1W3VbMF0uYml0cy5zaWduXS5mKTsKKworCXJldHVybiAoeCA+IHkgPyB4IDogeSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2ZtYXhsLmMgYi9saWJtL3NyYy9zX2ZtYXhsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhOWRiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZm1heGwuYwpAQCAtMCwwICsxLDU1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZtYXhsLmMsdiAxLjEgMjAwNC8wNi8zMCAwNzowNDowMSBkYXMgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorCitsb25nIGRvdWJsZQorZm1heGwobG9uZyBkb3VibGUgeCwgbG9uZyBkb3VibGUgeSkKK3sKKwl1bmlvbiBJRUVFbDJiaXRzIHVbMl07CisKKwl1WzBdLmUgPSB4OworCW1hc2tfbmJpdF9sKHVbMF0pOworCXVbMV0uZSA9IHk7CisJbWFza19uYml0X2wodVsxXSk7CisKKwkvKiBDaGVjayBmb3IgTmFOcyB0byBhdm9pZCByYWlzaW5nIHNwdXJpb3VzIGV4Y2VwdGlvbnMuICovCisJaWYgKHVbMF0uYml0cy5leHAgPT0gMzI3NjcgJiYgKHVbMF0uYml0cy5tYW5oIHwgdVswXS5iaXRzLm1hbmwpICE9IDApCisJCXJldHVybiAoeSk7CisJaWYgKHVbMV0uYml0cy5leHAgPT0gMzI3NjcgJiYgKHVbMV0uYml0cy5tYW5oIHwgdVsxXS5iaXRzLm1hbmwpICE9IDApCisJCXJldHVybiAoeCk7CisKKwkvKiBIYW5kbGUgY29tcGFyaXNvbnMgb2Ygc2lnbmVkIHplcm9lcy4gKi8KKwlpZiAodVswXS5iaXRzLnNpZ24gIT0gdVsxXS5iaXRzLnNpZ24pCisJCXJldHVybiAodVswXS5iaXRzLnNpZ24gPyB5IDogeCk7CisKKwlyZXR1cm4gKHggPiB5ID8geCA6IHkpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mbWluLmMgYi9saWJtL3NyYy9zX2ZtaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWI5Y2M0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mbWluLmMKQEAgLTAsMCArMSw1MyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mbWluLmMsdiAxLjEgMjAwNC8wNi8zMCAwNzowNDowMSBkYXMgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorCitkb3VibGUKK2ZtaW4oZG91YmxlIHgsIGRvdWJsZSB5KQoreworCXVuaW9uIElFRUVkMmJpdHMgdVsyXTsKKworCXVbMF0uZCA9IHg7CisJdVsxXS5kID0geTsKKworCS8qIENoZWNrIGZvciBOYU5zIHRvIGF2b2lkIHJhaXNpbmcgc3B1cmlvdXMgZXhjZXB0aW9ucy4gKi8KKwlpZiAodVswXS5iaXRzLmV4cCA9PSAyMDQ3ICYmICh1WzBdLmJpdHMubWFuaCB8IHVbMF0uYml0cy5tYW5sKSAhPSAwKQorCQlyZXR1cm4gKHkpOworCWlmICh1WzFdLmJpdHMuZXhwID09IDIwNDcgJiYgKHVbMV0uYml0cy5tYW5oIHwgdVsxXS5iaXRzLm1hbmwpICE9IDApCisJCXJldHVybiAoeCk7CisKKwkvKiBIYW5kbGUgY29tcGFyaXNvbnMgb2Ygc2lnbmVkIHplcm9lcy4gKi8KKwlpZiAodVswXS5iaXRzLnNpZ24gIT0gdVsxXS5iaXRzLnNpZ24pCisJCXJldHVybiAodVt1WzFdLmJpdHMuc2lnbl0uZCk7CisKKwlyZXR1cm4gKHggPCB5ID8geCA6IHkpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mbWluZi5jIGIvbGlibS9zcmMvc19mbWluZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZmI1NzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2ZtaW5mLmMKQEAgLTAsMCArMSw1MyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mbWluZi5jLHYgMS4xIDIwMDQvMDYvMzAgMDc6MDQ6MDEgZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworZmxvYXQKK2ZtaW5mKGZsb2F0IHgsIGZsb2F0IHkpCit7CisJdW5pb24gSUVFRWYyYml0cyB1WzJdOworCisJdVswXS5mID0geDsKKwl1WzFdLmYgPSB5OworCisJLyogQ2hlY2sgZm9yIE5hTnMgdG8gYXZvaWQgcmFpc2luZyBzcHVyaW91cyBleGNlcHRpb25zLiAqLworCWlmICh1WzBdLmJpdHMuZXhwID09IDI1NSAmJiB1WzBdLmJpdHMubWFuICE9IDApCisJCXJldHVybiAoeSk7CisJaWYgKHVbMV0uYml0cy5leHAgPT0gMjU1ICYmIHVbMV0uYml0cy5tYW4gIT0gMCkKKwkJcmV0dXJuICh4KTsKKworCS8qIEhhbmRsZSBjb21wYXJpc29ucyBvZiBzaWduZWQgemVyb2VzLiAqLworCWlmICh1WzBdLmJpdHMuc2lnbiAhPSB1WzFdLmJpdHMuc2lnbikKKwkJcmV0dXJuICh1W3VbMV0uYml0cy5zaWduXS5mKTsKKworCXJldHVybiAoeCA8IHkgPyB4IDogeSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2ZtaW5sLmMgYi9saWJtL3NyYy9zX2ZtaW5sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY4YzUwZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZm1pbmwuYwpAQCAtMCwwICsxLDU1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZtaW5sLmMsdiAxLjEgMjAwNC8wNi8zMCAwNzowNDowMSBkYXMgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorCitsb25nIGRvdWJsZQorZm1pbmwobG9uZyBkb3VibGUgeCwgbG9uZyBkb3VibGUgeSkKK3sKKwl1bmlvbiBJRUVFbDJiaXRzIHVbMl07CisKKwl1WzBdLmUgPSB4OworCW1hc2tfbmJpdF9sKHVbMF0pOworCXVbMV0uZSA9IHk7CisJbWFza19uYml0X2wodVsxXSk7CisKKwkvKiBDaGVjayBmb3IgTmFOcyB0byBhdm9pZCByYWlzaW5nIHNwdXJpb3VzIGV4Y2VwdGlvbnMuICovCisJaWYgKHVbMF0uYml0cy5leHAgPT0gMzI3NjcgJiYgKHVbMF0uYml0cy5tYW5oIHwgdVswXS5iaXRzLm1hbmwpICE9IDApCisJCXJldHVybiAoeSk7CisJaWYgKHVbMV0uYml0cy5leHAgPT0gMzI3NjcgJiYgKHVbMV0uYml0cy5tYW5oIHwgdVsxXS5iaXRzLm1hbmwpICE9IDApCisJCXJldHVybiAoeCk7CisKKwkvKiBIYW5kbGUgY29tcGFyaXNvbnMgb2Ygc2lnbmVkIHplcm9lcy4gKi8KKwlpZiAodVswXS5iaXRzLnNpZ24gIT0gdVsxXS5iaXRzLnNpZ24pCisJCXJldHVybiAodVsxXS5iaXRzLnNpZ24gPyB5IDogeCk7CisKKwlyZXR1cm4gKHggPCB5ID8geCA6IHkpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mcmV4cC5jIGIvbGlibS9zcmMvc19mcmV4cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OWUxMzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2ZyZXhwLmMKQEAgLTAsMCArMSw1OCBAQAorLyogQCgjKXNfZnJleHAuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZnJleHAuYyx2IDEuMTAgMjAwNS8wMy8wNyAyMToyNzozNyBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBmb3Igbm9uLXplcm8geAorICoJeCA9IGZyZXhwKGFyZywmZXhwKTsKKyAqIHJldHVybiBhIGRvdWJsZSBmcCBxdWFudGl0eSB4IHN1Y2ggdGhhdCAwLjUgPD0gfHh8IDwxLjAKKyAqIGFuZCB0aGUgY29ycmVzcG9uZGluZyBiaW5hcnkgZXhwb25lbnQgImV4cCIuIFRoYXQgaXMKKyAqCWFyZyA9IHgqMl5leHAuCisgKiBJZiBhcmcgaXMgaW5mLCAwLjAsIG9yIE5hTiwgdGhlbiBmcmV4cChhcmcsJmV4cCkgcmV0dXJucyBhcmcKKyAqIHdpdGggKmV4cD0wLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlCit0d281NCA9ICAxLjgwMTQzOTg1MDk0ODE5ODQwMDAwZSsxNjsgLyogMHg0MzUwMDAwMCwgMHgwMDAwMDAwMCAqLworCitkb3VibGUKK2ZyZXhwKGRvdWJsZSB4LCBpbnQgKmVwdHIpCit7CisJaW50MzJfdCBoeCwgaXgsIGx4OworCUVYVFJBQ1RfV09SRFMoaHgsbHgseCk7CisJaXggPSAweDdmZmZmZmZmJmh4OworCSplcHRyID0gMDsKKwlpZihpeD49MHg3ZmYwMDAwMHx8KChpeHxseCk9PTApKSByZXR1cm4geDsJLyogMCxpbmYsbmFuICovCisJaWYgKGl4PDB4MDAxMDAwMDApIHsJCS8qIHN1Ym5vcm1hbCAqLworCSAgICB4ICo9IHR3bzU0OworCSAgICBHRVRfSElHSF9XT1JEKGh4LHgpOworCSAgICBpeCA9IGh4JjB4N2ZmZmZmZmY7CisJICAgICplcHRyID0gLTU0OworCX0KKwkqZXB0ciArPSAoaXg+PjIwKS0xMDIyOworCWh4ID0gKGh4JjB4ODAwZmZmZmYpfDB4M2ZlMDAwMDA7CisJU0VUX0hJR0hfV09SRCh4LGh4KTsKKwlyZXR1cm4geDsKK30KKworI2lmIChMREJMX01BTlRfRElHID09IDUzKQorX193ZWFrX3JlZmVyZW5jZShmcmV4cCwgZnJleHBsKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mcmV4cGYuYyBiL2xpYm0vc3JjL3NfZnJleHBmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkNDY0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZnJleHBmLmMKQEAgLTAsMCArMSw0NCBAQAorLyogc19mcmV4cGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfZnJleHAuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZnJleHBmLmMsdiAxLjggMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdAordHdvMjUgPSAgMy4zNTU0NDMyMDAwZSswNzsgLyogMHg0YzAwMDAwMCAqLworCitmbG9hdAorZnJleHBmKGZsb2F0IHgsIGludCAqZXB0cikKK3sKKwlpbnQzMl90IGh4LGl4OworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWl4ID0gMHg3ZmZmZmZmZiZoeDsKKwkqZXB0ciA9IDA7CisJaWYoaXg+PTB4N2Y4MDAwMDB8fChpeD09MCkpIHJldHVybiB4OwkvKiAwLGluZixuYW4gKi8KKwlpZiAoaXg8MHgwMDgwMDAwMCkgewkJLyogc3Vibm9ybWFsICovCisJICAgIHggKj0gdHdvMjU7CisJICAgIEdFVF9GTE9BVF9XT1JEKGh4LHgpOworCSAgICBpeCA9IGh4JjB4N2ZmZmZmZmY7CisJICAgICplcHRyID0gLTI1OworCX0KKwkqZXB0ciArPSAoaXg+PjIzKS0xMjY7CisJaHggPSAoaHgmMHg4MDdmZmZmZil8MHgzZjAwMDAwMDsKKwkqKGludCopJnggPSBoeDsKKwlyZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZnJleHBsLmMgYi9saWJtL3NyYy9zX2ZyZXhwbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYjMxNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2ZyZXhwbC5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZyZXhwbC5jLHYgMS4xIDIwMDUvMDMvMDcgMDQ6NTQ6NTEgZGFzIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKKyNpZiBMREJMX01BWF9FWFAgIT0gMHg0MDAwCisjZXJyb3IgIlVuc3VwcG9ydGVkIGxvbmcgZG91YmxlIGZvcm1hdCIKKyNlbmRpZgorCitsb25nIGRvdWJsZQorZnJleHBsKGxvbmcgZG91YmxlIHgsIGludCAqZXgpCit7CisJdW5pb24gSUVFRWwyYml0cyB1OworCisJdS5lID0geDsKKwlzd2l0Y2ggKHUuYml0cy5leHApIHsKKwljYXNlIDA6CQkvKiAwIG9yIHN1Ym5vcm1hbCAqLworCQlpZiAoKHUuYml0cy5tYW5sIHwgdS5iaXRzLm1hbmgpID09IDApIHsKKwkJCSpleCA9IDA7CisJCX0gZWxzZSB7CisJCQl1LmUgKj0gMHgxLjBwNTE0OworCQkJKmV4ID0gdS5iaXRzLmV4cCAtIDB4NDIwMDsKKwkJCXUuYml0cy5leHAgPSAweDNmZmU7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAweDdmZmY6CS8qIGluZmluaXR5IG9yIE5hTjsgdmFsdWUgb2YgKmV4IGlzIHVuc3BlY2lmaWVkICovCisJCWJyZWFrOworCWRlZmF1bHQ6CS8qIG5vcm1hbCAqLworCQkqZXggPSB1LmJpdHMuZXhwIC0gMHgzZmZlOworCQl1LmJpdHMuZXhwID0gMHgzZmZlOworCQlicmVhazsKKwl9CisJcmV0dXJuICh1LmUpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19pbG9nYi5jIGIvbGlibS9zcmMvc19pbG9nYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNGE0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2lsb2diLmMKQEAgLTAsMCArMSw0OSBAQAorLyogQCgjKXNfaWxvZ2IuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfaWxvZ2IuYyx2IDEuOSAyMDA0LzEwLzA5IDE3OjE0OjI4IHN0ZWZhbmYgRXhwICQiOworI2VuZGlmCisKKy8qIGlsb2diKGRvdWJsZSB4KQorICogcmV0dXJuIHRoZSBiaW5hcnkgZXhwb25lbnQgb2Ygbm9uLXplcm8geAorICogaWxvZ2IoMCkgPSBGUF9JTE9HQjAKKyAqIGlsb2diKE5hTikgPSBGUF9JTE9HQk5BTiAobm8gc2lnbmFsIGlzIHJhaXNlZCkKKyAqIGlsb2diKGluZikgPSBJTlRfTUFYIChubyBzaWduYWwgaXMgcmFpc2VkKQorICovCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworCWludCBpbG9nYihkb3VibGUgeCkKK3sKKwlpbnQzMl90IGh4LGx4LGl4OworCisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKwloeCAmPSAweDdmZmZmZmZmOworCWlmKGh4PDB4MDAxMDAwMDApIHsKKwkgICAgaWYoKGh4fGx4KT09MCkKKwkJcmV0dXJuIEZQX0lMT0dCMDsKKwkgICAgZWxzZQkJCS8qIHN1Ym5vcm1hbCB4ICovCisJCWlmKGh4PT0wKSB7CisJCSAgICBmb3IgKGl4ID0gLTEwNDM7IGx4PjA7IGx4PDw9MSkgaXggLT0xOworCQl9IGVsc2UgeworCQkgICAgZm9yIChpeCA9IC0xMDIyLGh4PDw9MTE7IGh4PjA7IGh4PDw9MSkgaXggLT0xOworCQl9CisJICAgIHJldHVybiBpeDsKKwl9CisJZWxzZSBpZiAoaHg8MHg3ZmYwMDAwMCkgcmV0dXJuIChoeD4+MjApLTEwMjM7CisJZWxzZSBpZiAoaHg+MHg3ZmYwMDAwMCB8fCBseCE9MCkgcmV0dXJuIEZQX0lMT0dCTkFOOworCWVsc2UgcmV0dXJuIElOVF9NQVg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2lsb2diZi5jIGIvbGlibS9zcmMvc19pbG9nYmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzljNGRlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19pbG9nYmYuYwpAQCAtMCwwICsxLDQxIEBACisvKiBzX2lsb2diZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19pbG9nYi5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19pbG9nYmYuYyx2IDEuNyAyMDA0LzEwLzA5IDE3OjE0OjI4IHN0ZWZhbmYgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworCWludCBpbG9nYmYoZmxvYXQgeCkKK3sKKwlpbnQzMl90IGh4LGl4OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaHggJj0gMHg3ZmZmZmZmZjsKKwlpZihoeDwweDAwODAwMDAwKSB7CisJICAgIGlmKGh4PT0wKQorCQlyZXR1cm4gRlBfSUxPR0IwOworCSAgICBlbHNlCQkJLyogc3Vibm9ybWFsIHggKi8KKwkgICAgICAgIGZvciAoaXggPSAtMTI2LGh4PDw9ODsgaHg+MDsgaHg8PD0xKSBpeCAtPTE7CisJICAgIHJldHVybiBpeDsKKwl9CisJZWxzZSBpZiAoaHg8MHg3ZjgwMDAwMCkgcmV0dXJuIChoeD4+MjMpLTEyNzsKKwllbHNlIGlmIChoeD4weDdmODAwMDAwKSByZXR1cm4gRlBfSUxPR0JOQU47CisJZWxzZSByZXR1cm4gSU5UX01BWDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfaWxvZ2JsLmMgYi9saWJtL3NyYy9zX2lsb2dibC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNmFkNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2lsb2dibC5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBGcm9tOiBAKCMpc19pbG9nYi5jIDUuMSA5My8wOS8yNAorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2lsb2dibC5jLHYgMS4xIDIwMDQvMTAvMTEgMTg6MTM6NTIgc3RlZmFuZiBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKK2ludAoraWxvZ2JsKGxvbmcgZG91YmxlIHgpCit7CisJdW5pb24gSUVFRWwyYml0cyB1OworCXVuc2lnbmVkIGxvbmcgbTsKKwlpbnQgYjsKKworCXUuZSA9IHg7CisJaWYgKHUuYml0cy5leHAgPT0gMCkgeworCQlpZiAoKHUuYml0cy5tYW5sIHwgdS5iaXRzLm1hbmgpID09IDApCisJCQlyZXR1cm4gKEZQX0lMT0dCMCk7CisJCS8qIGRlbm9ybWFsaXplZCAqLworCQlpZiAodS5iaXRzLm1hbmggPT0gMCkgeworCQkJbSA9IDFsdSA8PCAoTERCTF9NQU5MX1NJWkUgLSAxKTsKKwkJCWZvciAoYiA9IExEQkxfTUFOSF9TSVpFOyAhKHUuYml0cy5tYW5sICYgbSk7IG0gPj49IDEpCisJCQkJYisrOworCQl9IGVsc2UgeworCQkJbSA9IDFsdSA8PCAoTERCTF9NQU5IX1NJWkUgLSAxKTsKKwkJCWZvciAoYiA9IDA7ICEodS5iaXRzLm1hbmggJiBtKTsgbSA+Pj0gMSkKKwkJCQliKys7CisJCX0KKyNpZmRlZiBMREJMX0lNUExJQ0lUX05CSVQKKwkJYisrOworI2VuZGlmCisJCXJldHVybiAoTERCTF9NSU5fRVhQIC0gYiAtIDEpOworCX0gZWxzZSBpZiAodS5iaXRzLmV4cCA8IChMREJMX01BWF9FWFAgPDwgMSkgLSAxKQorCQlyZXR1cm4gKHUuYml0cy5leHAgLSBMREJMX01BWF9FWFAgKyAxKTsKKwllbHNlIGlmICh1LmJpdHMubWFubCAhPSAwIHx8IHUuYml0cy5tYW5oICE9IDApCisJCXJldHVybiAoRlBfSUxPR0JOQU4pOworCWVsc2UKKwkJcmV0dXJuIChJTlRfTUFYKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfaXNmaW5pdGUuYyBiL2xpYm0vc3JjL3NfaXNmaW5pdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTQ1MDVkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19pc2Zpbml0ZS5jCkBAIC0wLDAgKzEsNTggQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19pc2Zpbml0ZS5jLHYgMS4xIDIwMDQvMDcvMDkgMDM6MzI6MzkgZGFzIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorCitpbnQKK19faXNmaW5pdGUoZG91YmxlIGQpCit7CisJdW5pb24gSUVFRWQyYml0cyB1OworCisJdS5kID0gZDsKKwlyZXR1cm4gKHUuYml0cy5leHAgIT0gMjA0Nyk7Cit9CisKK2ludAorX19pc2Zpbml0ZWYoZmxvYXQgZikKK3sKKwl1bmlvbiBJRUVFZjJiaXRzIHU7CisKKwl1LmYgPSBmOworCXJldHVybiAodS5iaXRzLmV4cCAhPSAyNTUpOworfQorCitpbnQKK19faXNmaW5pdGVsKGxvbmcgZG91YmxlIGUpCit7CisJdW5pb24gSUVFRWwyYml0cyB1OworCisJdS5lID0gZTsKKwlyZXR1cm4gKHUuYml0cy5leHAgIT0gMzI3NjcpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19pc25hbi5jIGIvbGlibS9zcmMvc19pc25hbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NjM1MmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2lzbmFuLmMKQEAgLTAsMCArMSw2MiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2lzbmFuLmMsdiAxLjggMjAwNC8wOC8wNSAwMTo0NjoxMSBkYXMgRXhwICQKKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKKy8qIFByb3ZpZGVkIGJ5IGxpYmMgKi8KKyNpZiAxCitpbnQKKyhpc25hbikoZG91YmxlIGQpCit7CisJdW5pb24gSUVFRWQyYml0cyB1OworCisJdS5kID0gZDsKKwlyZXR1cm4gKHUuYml0cy5leHAgPT0gMjA0NyAmJiAodS5iaXRzLm1hbmwgIT0gMCB8fCB1LmJpdHMubWFuaCAhPSAwKSk7Cit9CisjZW5kaWYKKworaW50Citpc25hbmYoZmxvYXQgZikKK3sKKwl1bmlvbiBJRUVFZjJiaXRzIHU7CisKKwl1LmYgPSBmOworCXJldHVybiAodS5iaXRzLmV4cCA9PSAyNTUgJiYgdS5iaXRzLm1hbiAhPSAwKTsKK30KKworaW50CitfX2lzbmFubChsb25nIGRvdWJsZSBlKQoreworCXVuaW9uIElFRUVsMmJpdHMgdTsKKworCXUuZSA9IGU7CisJbWFza19uYml0X2wodSk7CisJcmV0dXJuICh1LmJpdHMuZXhwID09IDMyNzY3ICYmICh1LmJpdHMubWFubCAhPSAwIHx8IHUuYml0cy5tYW5oICE9IDApKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfaXNub3JtYWwuYyBiL2xpYm0vc3JjL3NfaXNub3JtYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzQ1ZGJhCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19pc25vcm1hbC5jCkBAIC0wLDAgKzEsNTggQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19pc25vcm1hbC5jLHYgMS4xIDIwMDQvMDcvMDkgMDM6MzI6MzkgZGFzIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorCitpbnQKK19faXNub3JtYWwoZG91YmxlIGQpCit7CisJdW5pb24gSUVFRWQyYml0cyB1OworCisJdS5kID0gZDsKKwlyZXR1cm4gKHUuYml0cy5leHAgIT0gMCAmJiB1LmJpdHMuZXhwICE9IDIwNDcpOworfQorCitpbnQKK19faXNub3JtYWxmKGZsb2F0IGYpCit7CisJdW5pb24gSUVFRWYyYml0cyB1OworCisJdS5mID0gZjsKKwlyZXR1cm4gKHUuYml0cy5leHAgIT0gMCAmJiB1LmJpdHMuZXhwICE9IDI1NSk7Cit9CisKK2ludAorX19pc25vcm1hbGwobG9uZyBkb3VibGUgZSkKK3sKKwl1bmlvbiBJRUVFbDJiaXRzIHU7CisKKwl1LmUgPSBlOworCXJldHVybiAodS5iaXRzLmV4cCAhPSAwICYmIHUuYml0cy5leHAgIT0gMzI3NjcpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19sbHJpbnQuYyBiL2xpYm0vc3JjL3NfbGxyaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2N2YzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbGxyaW50LmMKQEAgLTAsMCArMSw5IEBACisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19sbHJpbnQuYyx2IDEuMSAyMDA1LzAxLzExIDIzOjEyOjU1IGRhcyBFeHAgJCIpOyAqLworCisjZGVmaW5lIHR5cGUJCWRvdWJsZQorI2RlZmluZQlyb3VuZGl0CQlyaW50CisjZGVmaW5lIGR0eXBlCQlsb25nIGxvbmcKKyNkZWZpbmUJZm4JCWxscmludAorCisjaW5jbHVkZSAic19scmludC5jIgpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19sbHJpbnRmLmMgYi9saWJtL3NyYy9zX2xscmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDc1ZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19sbHJpbnRmLmMKQEAgLTAsMCArMSw5IEBACisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19sbHJpbnRmLmMsdiAxLjEgMjAwNS8wMS8xMSAyMzoxMjo1NSBkYXMgRXhwICQiKTsgKi8KKworI2RlZmluZSB0eXBlCQlmbG9hdAorI2RlZmluZQlyb3VuZGl0CQlyaW50ZgorI2RlZmluZSBkdHlwZQkJbG9uZyBsb25nCisjZGVmaW5lCWZuCQlsbHJpbnRmCisKKyNpbmNsdWRlICJzX2xyaW50LmMiCmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2xscm91bmQuYyBiL2xpYm0vc3JjL3NfbGxyb3VuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YWIxM2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2xscm91bmQuYwpAQCAtMCwwICsxLDExIEBACisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19sbHJvdW5kLmMsdiAxLjIgMjAwNS8wNC8wOCAwMDo1MjoyNyBkYXMgRXhwICQiKTsgKi8KKworI2RlZmluZSB0eXBlCQlkb3VibGUKKyNkZWZpbmUJcm91bmRpdAkJcm91bmQKKyNkZWZpbmUgZHR5cGUJCWxvbmcgbG9uZworI2RlZmluZQlEVFlQRV9NSU4JTE9OR0xPTkdfTUlOCisjZGVmaW5lCURUWVBFX01BWAlMT05HTE9OR19NQVgKKyNkZWZpbmUJZm4JCWxscm91bmQKKworI2luY2x1ZGUgInNfbHJvdW5kLmMiCmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2xscm91bmRmLmMgYi9saWJtL3NyYy9zX2xscm91bmRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkNjkwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbGxyb3VuZGYuYwpAQCAtMCwwICsxLDExIEBACisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19sbHJvdW5kZi5jLHYgMS4yIDIwMDUvMDQvMDggMDA6NTI6MjcgZGFzIEV4cCAkIik7ICovCisKKyNkZWZpbmUgdHlwZQkJZmxvYXQKKyNkZWZpbmUJcm91bmRpdAkJcm91bmRmCisjZGVmaW5lIGR0eXBlCQlsb25nIGxvbmcKKyNkZWZpbmUJRFRZUEVfTUlOCUxPTkdMT05HX01JTgorI2RlZmluZQlEVFlQRV9NQVgJTE9OR0xPTkdfTUFYCisjZGVmaW5lCWZuCQlsbHJvdW5kZgorCisjaW5jbHVkZSAic19scm91bmQuYyIKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbGxyb3VuZGwuYyBiL2xpYm0vc3JjL3NfbGxyb3VuZGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWJhZTU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19sbHJvdW5kbC5jCkBAIC0wLDAgKzEsMTEgQEAKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2xscm91bmRsLmMsdiAxLjEgMjAwNS8wNC8wOCAwMToyNDowOCBkYXMgRXhwICQiKTsgKi8KKworI2RlZmluZSB0eXBlCQlsb25nIGRvdWJsZQorI2RlZmluZQlyb3VuZGl0CQlyb3VuZGwKKyNkZWZpbmUgZHR5cGUJCWxvbmcgbG9uZworI2RlZmluZQlEVFlQRV9NSU4JTE9OR0xPTkdfTUlOCisjZGVmaW5lCURUWVBFX01BWAlMT05HTE9OR19NQVgKKyNkZWZpbmUJZm4JCWxscm91bmRsCisKKyNpbmNsdWRlICJzX2xyb3VuZC5jIgpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19sb2cxcC5jIGIvbGlibS9zcmMvc19sb2cxcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZTE1MTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2xvZzFwLmMKQEAgLTAsMCArMSwxNjggQEAKKy8qIEAoIylzX2xvZzFwLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2xvZzFwLmMsdiAxLjggMjAwNS8xMi8wNCAxMjoyODozMyBiZGUgRXhwICQiOworI2VuZGlmCisKKy8qIGRvdWJsZSBsb2cxcChkb3VibGUgeCkKKyAqCisgKiBNZXRob2QgOgorICogICAxLiBBcmd1bWVudCBSZWR1Y3Rpb246IGZpbmQgayBhbmQgZiBzdWNoIHRoYXQKKyAqCQkJMSt4ID0gMl5rICogKDErZiksCisgKgkgICB3aGVyZSAgc3FydCgyKS8yIDwgMStmIDwgc3FydCgyKSAuCisgKgorICogICAgICBOb3RlLiBJZiBrPTAsIHRoZW4gZj14IGlzIGV4YWN0LiBIb3dldmVyLCBpZiBrIT0wLCB0aGVuIGYKKyAqCW1heSBub3QgYmUgcmVwcmVzZW50YWJsZSBleGFjdGx5LiBJbiB0aGF0IGNhc2UsIGEgY29ycmVjdGlvbgorICoJdGVybSBpcyBuZWVkLiBMZXQgdT0xK3ggcm91bmRlZC4gTGV0IGMgPSAoMSt4KS11LCB0aGVuCisgKglsb2coMSt4KSAtIGxvZyh1KSB+IGMvdS4gVGh1cywgd2UgcHJvY2VlZCB0byBjb21wdXRlIGxvZyh1KSwKKyAqCWFuZCBhZGQgYmFjayB0aGUgY29ycmVjdGlvbiB0ZXJtIGMvdS4KKyAqCShOb3RlOiB3aGVuIHggPiAyKio1Mywgb25lIGNhbiBzaW1wbHkgcmV0dXJuIGxvZyh4KSkKKyAqCisgKiAgIDIuIEFwcHJveGltYXRpb24gb2YgbG9nMXAoZikuCisgKglMZXQgcyA9IGYvKDIrZikgOyBiYXNlZCBvbiBsb2coMStmKSA9IGxvZygxK3MpIC0gbG9nKDEtcykKKyAqCQkgPSAycyArIDIvMyBzKiozICsgMi81IHMqKjUgKyAuLi4uLiwKKyAqCSAgICAgCSA9IDJzICsgcypSCisgKiAgICAgIFdlIHVzZSBhIHNwZWNpYWwgUmVtZSBhbGdvcml0aG0gb24gWzAsMC4xNzE2XSB0byBnZW5lcmF0ZQorICogCWEgcG9seW5vbWlhbCBvZiBkZWdyZWUgMTQgdG8gYXBwcm94aW1hdGUgUiBUaGUgbWF4aW11bSBlcnJvcgorICoJb2YgdGhpcyBwb2x5bm9taWFsIGFwcHJveGltYXRpb24gaXMgYm91bmRlZCBieSAyKiotNTguNDUuIEluCisgKglvdGhlciB3b3JkcywKKyAqCQkgICAgICAgIDIgICAgICA0ICAgICAgNiAgICAgIDggICAgICAxMCAgICAgIDEyICAgICAgMTQKKyAqCSAgICBSKHopIH4gTHAxKnMgK0xwMipzICtMcDMqcyArTHA0KnMgK0xwNSpzICArTHA2KnMgICtMcDcqcworICogIAkodGhlIHZhbHVlcyBvZiBMcDEgdG8gTHA3IGFyZSBsaXN0ZWQgaW4gdGhlIHByb2dyYW0pCisgKglhbmQKKyAqCSAgICB8ICAgICAgMiAgICAgICAgICAxNCAgICAgICAgICB8ICAgICAtNTguNDUKKyAqCSAgICB8IExwMSpzICsuLi4rTHA3KnMgICAgLSAgUih6KSB8IDw9IDIKKyAqCSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKglOb3RlIHRoYXQgMnMgPSBmIC0gcypmID0gZiAtIGhmc3EgKyBzKmhmc3EsIHdoZXJlIGhmc3EgPSBmKmYvMi4KKyAqCUluIG9yZGVyIHRvIGd1YXJhbnRlZSBlcnJvciBpbiBsb2cgYmVsb3cgMXVscCwgd2UgY29tcHV0ZSBsb2cKKyAqCWJ5CisgKgkJbG9nMXAoZikgPSBmIC0gKGhmc3EgLSBzKihoZnNxK1IpKS4KKyAqCisgKgkzLiBGaW5hbGx5LCBsb2cxcCh4KSA9IGsqbG4yICsgbG9nMXAoZikuCisgKgkJIAkgICAgID0gaypsbjJfaGkrKGYtKGhmc3EtKHMqKGhmc3ErUikraypsbjJfbG8pKSkKKyAqCSAgIEhlcmUgbG4yIGlzIHNwbGl0IGludG8gdHdvIGZsb2F0aW5nIHBvaW50IG51bWJlcjoKKyAqCQkJbG4yX2hpICsgbG4yX2xvLAorICoJICAgd2hlcmUgbipsbjJfaGkgaXMgYWx3YXlzIGV4YWN0IGZvciB8bnwgPCAyMDAwLgorICoKKyAqIFNwZWNpYWwgY2FzZXM6CisgKglsb2cxcCh4KSBpcyBOYU4gd2l0aCBzaWduYWwgaWYgeCA8IC0xIChpbmNsdWRpbmcgLUlORikgOworICoJbG9nMXAoK0lORikgaXMgK0lORjsgbG9nMXAoLTEpIGlzIC1JTkYgd2l0aCBzaWduYWw7CisgKglsb2cxcChOYU4pIGlzIHRoYXQgTmFOIHdpdGggbm8gc2lnbmFsLgorICoKKyAqIEFjY3VyYWN5OgorICoJYWNjb3JkaW5nIHRvIGFuIGVycm9yIGFuYWx5c2lzLCB0aGUgZXJyb3IgaXMgYWx3YXlzIGxlc3MgdGhhbgorICoJMSB1bHAgKHVuaXQgaW4gdGhlIGxhc3QgcGxhY2UpLgorICoKKyAqIENvbnN0YW50czoKKyAqIFRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgYXJlIHRoZSBpbnRlbmRlZCBvbmVzIGZvciB0aGUgZm9sbG93aW5nCisgKiBjb25zdGFudHMuIFRoZSBkZWNpbWFsIHZhbHVlcyBtYXkgYmUgdXNlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGNvbXBpbGVyIHdpbGwgY29udmVydCBmcm9tIGRlY2ltYWwgdG8gYmluYXJ5IGFjY3VyYXRlbHkgZW5vdWdoCisgKiB0byBwcm9kdWNlIHRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgc2hvd24uCisgKgorICogTm90ZTogQXNzdW1pbmcgbG9nKCkgcmV0dXJuIGFjY3VyYXRlIGFuc3dlciwgdGhlIGZvbGxvd2luZworICogCSBhbGdvcml0aG0gY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSBsb2cxcCh4KSB0byB3aXRoaW4gYSBmZXcgVUxQOgorICoKKyAqCQl1ID0gMSt4OworICoJCWlmKHU9PTEuMCkgcmV0dXJuIHggOyBlbHNlCisgKgkJCSAgIHJldHVybiBsb2codSkqKHgvKHUtMS4wKSk7CisgKgorICoJIFNlZSBIUC0xNUMgQWR2YW5jZWQgRnVuY3Rpb25zIEhhbmRib29rLCBwLjE5My4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlCitsbjJfaGkgID0gIDYuOTMxNDcxODAzNjkxMjM4MTY0OTBlLTAxLAkvKiAzZmU2MmU0MiBmZWUwMDAwMCAqLworbG4yX2xvICA9ICAxLjkwODIxNDkyOTI3MDU4NzcwMDAyZS0xMCwJLyogM2RlYTM5ZWYgMzU3OTNjNzYgKi8KK3R3bzU0ICAgPSAgMS44MDE0Mzk4NTA5NDgxOTg0MDAwMGUrMTYsICAvKiA0MzUwMDAwMCAwMDAwMDAwMCAqLworTHAxID0gNi42NjY2NjY2NjY2NjY3MzUxMzBlLTAxLCAgLyogM0ZFNTU1NTUgNTU1NTU1OTMgKi8KK0xwMiA9IDMuOTk5OTk5OTk5OTQwOTQxOTA4ZS0wMSwgIC8qIDNGRDk5OTk5IDk5OTdGQTA0ICovCitMcDMgPSAyLjg1NzE0Mjg3NDM2NjIzOTE0OWUtMDEsICAvKiAzRkQyNDkyNCA5NDIyOTM1OSAqLworTHA0ID0gMi4yMjIyMTk4NDMyMTQ5NzgzOTZlLTAxLCAgLyogM0ZDQzcxQzUgMUQ4RTc4QUYgKi8KK0xwNSA9IDEuODE4MzU3MjE2MTYxODA1MDEyZS0wMSwgIC8qIDNGQzc0NjY0IDk2Q0IwM0RFICovCitMcDYgPSAxLjUzMTM4Mzc2OTkyMDkzNzMzMmUtMDEsICAvKiAzRkMzOUEwOSBEMDc4QzY5RiAqLworTHA3ID0gMS40Nzk4MTk4NjA1MTE2NTg1OTFlLTAxOyAgLyogM0ZDMkYxMTIgREYzRTUyNDQgKi8KKworc3RhdGljIGNvbnN0IGRvdWJsZSB6ZXJvID0gMC4wOworCitkb3VibGUKK2xvZzFwKGRvdWJsZSB4KQoreworCWRvdWJsZSBoZnNxLGYsYyxzLHosUix1OworCWludDMyX3QgayxoeCxodSxheDsKKworCUdFVF9ISUdIX1dPUkQoaHgseCk7CisJYXggPSBoeCYweDdmZmZmZmZmOworCisJayA9IDE7CisJaWYgKGh4IDwgMHgzRkRBODI3QSkgewkJCS8qIDEreCA8IHNxcnQoMikrICovCisJICAgIGlmKGF4Pj0weDNmZjAwMDAwKSB7CQkvKiB4IDw9IC0xLjAgKi8KKwkJaWYoeD09LTEuMCkgcmV0dXJuIC10d281NC96ZXJvOyAvKiBsb2cxcCgtMSk9K2luZiAqLworCQllbHNlIHJldHVybiAoeC14KS8oeC14KTsJLyogbG9nMXAoeDwtMSk9TmFOICovCisJICAgIH0KKwkgICAgaWYoYXg8MHgzZTIwMDAwMCkgewkJCS8qIHx4fCA8IDIqKi0yOSAqLworCQlpZih0d281NCt4Pnplcm8JCQkvKiByYWlzZSBpbmV4YWN0ICovCisJICAgICAgICAgICAgJiZheDwweDNjOTAwMDAwKSAJCS8qIHx4fCA8IDIqKi01NCAqLworCQkgICAgcmV0dXJuIHg7CisJCWVsc2UKKwkJICAgIHJldHVybiB4IC0geCp4KjAuNTsKKwkgICAgfQorCSAgICBpZihoeD4wfHxoeDw9KChpbnQzMl90KTB4YmZkMmJlYzQpKSB7CisJCWs9MDtmPXg7aHU9MTt9CQkvKiBzcXJ0KDIpLzItIDw9IDEreCA8IHNxcnQoMikrICovCisJfQorCWlmIChoeCA+PSAweDdmZjAwMDAwKSByZXR1cm4geCt4OworCWlmKGshPTApIHsKKwkgICAgaWYoaHg8MHg0MzQwMDAwMCkgeworCQl1ICA9IDEuMCt4OworCQlHRVRfSElHSF9XT1JEKGh1LHUpOworCSAgICAgICAgayAgPSAoaHU+PjIwKS0xMDIzOworCSAgICAgICAgYyAgPSAoaz4wKT8gMS4wLSh1LXgpOngtKHUtMS4wKTsvKiBjb3JyZWN0aW9uIHRlcm0gKi8KKwkJYyAvPSB1OworCSAgICB9IGVsc2UgeworCQl1ICA9IHg7CisJCUdFVF9ISUdIX1dPUkQoaHUsdSk7CisJICAgICAgICBrICA9IChodT4+MjApLTEwMjM7CisJCWMgID0gMDsKKwkgICAgfQorCSAgICBodSAmPSAweDAwMGZmZmZmOworCSAgICAvKgorCSAgICAgKiBUaGUgYXBwcm94aW1hdGlvbiB0byBzcXJ0KDIpIHVzZWQgaW4gdGhyZXNob2xkcyBpcyBub3QKKwkgICAgICogY3JpdGljYWwuICBIb3dldmVyLCB0aGUgb25lcyB1c2VkIGFib3ZlIG11c3QgZ2l2ZSBsZXNzCisJICAgICAqIHN0cmljdCBib3VuZHMgdGhhbiB0aGUgb25lIGhlcmUgc28gdGhhdCB0aGUgaz09MCBjYXNlIGlzCisJICAgICAqIG5ldmVyIHJlYWNoZWQgZnJvbSBoZXJlLCBzaW5jZSBoZXJlIHdlIGhhdmUgY29tbWl0dGVkIHRvCisJICAgICAqIHVzaW5nIHRoZSBjb3JyZWN0aW9uIHRlcm0gYnV0IGRvbid0IHVzZSBpdCBpZiBrPT0wLgorCSAgICAgKi8KKwkgICAgaWYoaHU8MHg2YTA5ZSkgewkJCS8qIHUgfjwgc3FydCgyKSAqLworCSAgICAgICAgU0VUX0hJR0hfV09SRCh1LGh1fDB4M2ZmMDAwMDApOwkvKiBub3JtYWxpemUgdSAqLworCSAgICB9IGVsc2UgeworCSAgICAgICAgayArPSAxOworCQlTRVRfSElHSF9XT1JEKHUsaHV8MHgzZmUwMDAwMCk7CS8qIG5vcm1hbGl6ZSB1LzIgKi8KKwkgICAgICAgIGh1ID0gKDB4MDAxMDAwMDAtaHUpPj4yOworCSAgICB9CisJICAgIGYgPSB1LTEuMDsKKwl9CisJaGZzcT0wLjUqZipmOworCWlmKGh1PT0wKSB7CS8qIHxmfCA8IDIqKi0yMCAqLworCSAgICBpZihmPT16ZXJvKSBpZihrPT0wKSByZXR1cm4gemVybzsKKwkJCWVsc2Uge2MgKz0gaypsbjJfbG87IHJldHVybiBrKmxuMl9oaStjO30KKwkgICAgUiA9IGhmc3EqKDEuMC0wLjY2NjY2NjY2NjY2NjY2NjY2KmYpOworCSAgICBpZihrPT0wKSByZXR1cm4gZi1SOyBlbHNlCisJICAgIAkgICAgIHJldHVybiBrKmxuMl9oaS0oKFItKGsqbG4yX2xvK2MpKS1mKTsKKwl9CisgCXMgPSBmLygyLjArZik7CisJeiA9IHMqczsKKwlSID0geiooTHAxK3oqKExwMit6KihMcDMreiooTHA0K3oqKExwNSt6KihMcDYreipMcDcpKSkpKSk7CisJaWYoaz09MCkgcmV0dXJuIGYtKGhmc3EtcyooaGZzcStSKSk7IGVsc2UKKwkJIHJldHVybiBrKmxuMl9oaS0oKGhmc3EtKHMqKGhmc3ErUikrKGsqbG4yX2xvK2MpKSktZik7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2xvZzFwZi5jIGIvbGlibS9zcmMvc19sb2cxcGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzY0ZGEwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19sb2cxcGYuYwpAQCAtMCwwICsxLDEwNyBAQAorLyogc19sb2cxcGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfbG9nMXAuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbG9nMXBmLmMsdiAxLjkgMjAwNS8xMi8wNCAxMjozMDo0NCBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdAorbG4yX2hpID0gICA2LjkzMTM4MTIyNTZlLTAxLAkvKiAweDNmMzE3MTgwICovCitsbjJfbG8gPSAgIDkuMDU4MDAwNjE0NWUtMDYsCS8qIDB4MzcxN2Y3ZDEgKi8KK3R3bzI1ID0gICAgMy4zNTU0NDMyMDBlKzA3LAkvKiAweDRjMDAwMDAwICovCitMcDEgPSA2LjY2NjY2Njg2NTNlLTAxLAkvKiAzRjJBQUFBQiAqLworTHAyID0gNC4wMDAwMDAwNTk2ZS0wMSwJLyogM0VDQ0NDQ0QgKi8KK0xwMyA9IDIuODU3MTQyOTg0OWUtMDEsIC8qIDNFOTI0OTI1ICovCitMcDQgPSAyLjIyMjIxOTg1NDZlLTAxLCAvKiAzRTYzOEUyOSAqLworTHA1ID0gMS44MTgzNTcyNTkwZS0wMSwgLyogM0UzQTMzMjUgKi8KK0xwNiA9IDEuNTMxMzgzODQyMmUtMDEsIC8qIDNFMUNEMDRGICovCitMcDcgPSAxLjQ3OTgxOTg2NDBlLTAxOyAvKiAzRTE3ODg5NyAqLworCitzdGF0aWMgY29uc3QgZmxvYXQgemVybyA9IDAuMDsKKworZmxvYXQKK2xvZzFwZihmbG9hdCB4KQoreworCWZsb2F0IGhmc3EsZixjLHMseixSLHU7CisJaW50MzJfdCBrLGh4LGh1LGF4OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJYXggPSBoeCYweDdmZmZmZmZmOworCisJayA9IDE7CisJaWYgKGh4IDwgMHgzZWQ0MTNkMCkgewkJCS8qIDEreCA8IHNxcnQoMikrICAqLworCSAgICBpZihheD49MHgzZjgwMDAwMCkgewkJLyogeCA8PSAtMS4wICovCisJCWlmKHg9PShmbG9hdCktMS4wKSByZXR1cm4gLXR3bzI1L3plcm87IC8qIGxvZzFwKC0xKT0raW5mICovCisJCWVsc2UgcmV0dXJuICh4LXgpLyh4LXgpOwkvKiBsb2cxcCh4PC0xKT1OYU4gKi8KKwkgICAgfQorCSAgICBpZihheDwweDMxMDAwMDAwKSB7CQkJLyogfHh8IDwgMioqLTI5ICovCisJCWlmKHR3bzI1K3g+emVybwkJCS8qIHJhaXNlIGluZXhhY3QgKi8KKwkgICAgICAgICAgICAmJmF4PDB4MjQ4MDAwMDApIAkJLyogfHh8IDwgMioqLTU0ICovCisJCSAgICByZXR1cm4geDsKKwkJZWxzZQorCQkgICAgcmV0dXJuIHggLSB4KngqKGZsb2F0KTAuNTsKKwkgICAgfQorCSAgICBpZihoeD4wfHxoeDw9KChpbnQzMl90KTB4YmU5NWY2MTkpKSB7CisJCWs9MDtmPXg7aHU9MTt9CQkvKiBzcXJ0KDIpLzItIDw9IDEreCA8IHNxcnQoMikrICovCisJfQorCWlmIChoeCA+PSAweDdmODAwMDAwKSByZXR1cm4geCt4OworCWlmKGshPTApIHsKKwkgICAgaWYoaHg8MHg1YTAwMDAwMCkgeworCQkqKHZvbGF0aWxlIGZsb2F0ICopJnUgPSAoZmxvYXQpMS4wK3g7CisJCUdFVF9GTE9BVF9XT1JEKGh1LHUpOworCSAgICAgICAgayAgPSAoaHU+PjIzKS0xMjc7CisJCS8qIGNvcnJlY3Rpb24gdGVybSAqLworCSAgICAgICAgYyAgPSAoaz4wKT8gKGZsb2F0KTEuMC0odS14KTp4LSh1LShmbG9hdCkxLjApOworCQljIC89IHU7CisJICAgIH0gZWxzZSB7CisJCXUgID0geDsKKwkJR0VUX0ZMT0FUX1dPUkQoaHUsdSk7CisJICAgICAgICBrICA9IChodT4+MjMpLTEyNzsKKwkJYyAgPSAwOworCSAgICB9CisJICAgIGh1ICY9IDB4MDA3ZmZmZmY7CisJICAgIC8qCisJICAgICAqIFRoZSBhcHByb3hpbWF0aW9uIHRvIHNxcnQoMikgdXNlZCBpbiB0aHJlc2hvbGRzIGlzIG5vdAorCSAgICAgKiBjcml0aWNhbC4gIEhvd2V2ZXIsIHRoZSBvbmVzIHVzZWQgYWJvdmUgbXVzdCBnaXZlIGxlc3MKKwkgICAgICogc3RyaWN0IGJvdW5kcyB0aGFuIHRoZSBvbmUgaGVyZSBzbyB0aGF0IHRoZSBrPT0wIGNhc2UgaXMKKwkgICAgICogbmV2ZXIgcmVhY2hlZCBmcm9tIGhlcmUsIHNpbmNlIGhlcmUgd2UgaGF2ZSBjb21taXR0ZWQgdG8KKwkgICAgICogdXNpbmcgdGhlIGNvcnJlY3Rpb24gdGVybSBidXQgZG9uJ3QgdXNlIGl0IGlmIGs9PTAuCisJICAgICAqLworCSAgICBpZihodTwweDM1MDRmNCkgewkJCS8qIHUgPCBzcXJ0KDIpICovCisJICAgICAgICBTRVRfRkxPQVRfV09SRCh1LGh1fDB4M2Y4MDAwMDApOy8qIG5vcm1hbGl6ZSB1ICovCisJICAgIH0gZWxzZSB7CisJICAgICAgICBrICs9IDE7CisJCVNFVF9GTE9BVF9XT1JEKHUsaHV8MHgzZjAwMDAwMCk7CS8qIG5vcm1hbGl6ZSB1LzIgKi8KKwkgICAgICAgIGh1ID0gKDB4MDA4MDAwMDAtaHUpPj4yOworCSAgICB9CisJICAgIGYgPSB1LShmbG9hdCkxLjA7CisJfQorCWhmc3E9KGZsb2F0KTAuNSpmKmY7CisJaWYoaHU9PTApIHsJLyogfGZ8IDwgMioqLTIwICovCisJICAgIGlmKGY9PXplcm8pIGlmKGs9PTApIHJldHVybiB6ZXJvOworCQkJZWxzZSB7YyArPSBrKmxuMl9sbzsgcmV0dXJuIGsqbG4yX2hpK2M7fQorCSAgICBSID0gaGZzcSooKGZsb2F0KTEuMC0oZmxvYXQpMC42NjY2NjY2NjY2NjY2NjY2NipmKTsKKwkgICAgaWYoaz09MCkgcmV0dXJuIGYtUjsgZWxzZQorCSAgICAJICAgICByZXR1cm4gaypsbjJfaGktKChSLShrKmxuMl9sbytjKSktZik7CisJfQorIAlzID0gZi8oKGZsb2F0KTIuMCtmKTsKKwl6ID0gcypzOworCVIgPSB6KihMcDEreiooTHAyK3oqKExwMyt6KihMcDQreiooTHA1K3oqKExwNit6KkxwNykpKSkpKTsKKwlpZihrPT0wKSByZXR1cm4gZi0oaGZzcS1zKihoZnNxK1IpKTsgZWxzZQorCQkgcmV0dXJuIGsqbG4yX2hpLSgoaGZzcS0ocyooaGZzcStSKSsoaypsbjJfbG8rYykpKS1mKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbG9nYi5jIGIvbGlibS9zcmMvc19sb2diLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBlZGI4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbG9nYi5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qIEAoIylzX2xvZ2IuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbG9nYi5jLHYgMS4xMCAyMDA1LzEyLzAzIDExOjU3OjE5IGJkZSBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIGRvdWJsZSBsb2diKHgpCisgKiBJRUVFIDc1NCBsb2diLiBJbmNsdWRlZCB0byBwYXNzIElFRUUgdGVzdCBzdWl0ZS4gTm90IHJlY29tbWVuZC4KKyAqIFVzZSBpbG9nYiBpbnN0ZWFkLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK3R3bzU0ID0gMS44MDE0Mzk4NTA5NDgxOTg0MDAwMGUrMTY7CS8qIDQzNTAwMDAwIDAwMDAwMDAwICovCisKK2RvdWJsZQorbG9nYihkb3VibGUgeCkKK3sKKwlpbnQzMl90IGx4LGl4OworCUVYVFJBQ1RfV09SRFMoaXgsbHgseCk7CisJaXggJj0gMHg3ZmZmZmZmZjsJCQkvKiBoaWdoIHx4fCAqLworCWlmKChpeHxseCk9PTApIHJldHVybiAtMS4wL2ZhYnMoeCk7CisJaWYoaXg+PTB4N2ZmMDAwMDApIHJldHVybiB4Kng7CisJaWYoaXg8MHgwMDEwMDAwMCkgeworCQl4ICo9IHR3bzU0OwkJIC8qIGNvbnZlcnQgc3Vibm9ybWFsIHggdG8gbm9ybWFsICovCisJCUdFVF9GTE9BVF9XT1JEKGl4LHgpOworCQlpeCAmPSAweDdmZmZmZmZmOworCQlyZXR1cm4gKGZsb2F0KSAoKGl4Pj4yMCktMTAyMy01NCk7CisJfSBlbHNlCisJCXJldHVybiAoZG91YmxlKSAoKGl4Pj4yMCktMTAyMyk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2xvZ2JmLmMgYi9saWJtL3NyYy9zX2xvZ2JmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU0OTI4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbG9nYmYuYwpAQCAtMCwwICsxLDQxIEBACisvKiBzX2xvZ2JmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2xvZ2IuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbG9nYmYuYyx2IDEuOCAyMDA1LzEyLzAzIDExOjU3OjE5IGJkZSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0Cit0d28yNSA9IDMuMzU1NDQzMjAwZSswNzsJCS8qIDB4NGMwMDAwMDAgKi8KKworZmxvYXQKK2xvZ2JmKGZsb2F0IHgpCit7CisJaW50MzJfdCBpeDsKKwlHRVRfRkxPQVRfV09SRChpeCx4KTsKKwlpeCAmPSAweDdmZmZmZmZmOwkJCS8qIGhpZ2ggfHh8ICovCisJaWYoaXg9PTApIHJldHVybiAoZmxvYXQpLTEuMC9mYWJzZih4KTsKKwlpZihpeD49MHg3ZjgwMDAwMCkgcmV0dXJuIHgqeDsKKwlpZihpeDwweDAwODAwMDAwKSB7CisJCXggKj0gdHdvMjU7CQkgLyogY29udmVydCBzdWJub3JtYWwgeCB0byBub3JtYWwgKi8KKwkJR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJCWl4ICY9IDB4N2ZmZmZmZmY7CisJCXJldHVybiAoZmxvYXQpICgoaXg+PjIzKS0xMjctMjUpOworCX0gZWxzZQorCQlyZXR1cm4gKGZsb2F0KSAoKGl4Pj4yMyktMTI3KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbHJpbnQuYyBiL2xpYm0vc3JjL3NfbHJpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGEwOWQzCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19scmludC5jCkBAIC0wLDAgKzEsNTggQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPGZlbnYuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpZm5kZWYgdHlwZQorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbHJpbnQuYyx2IDEuMSAyMDA1LzAxLzExIDIzOjEyOjU1IGRhcyBFeHAgJCIpOyAqLworI2RlZmluZSB0eXBlCQlkb3VibGUKKyNkZWZpbmUJcm91bmRpdAkJcmludAorI2RlZmluZSBkdHlwZQkJbG9uZworI2RlZmluZQlmbgkJbHJpbnQKKyNlbmRpZgorCisvKgorICogQzk5IHNheXMgd2Ugc2hvdWxkIG5vdCByYWlzZSBhIHNwdXJpb3VzIGluZXhhY3QgZXhjZXB0aW9uIHdoZW4gYW4KKyAqIGludmFsaWQgZXhjZXB0aW9uIGlzIHJhaXNlZC4gIFVuZm9ydHVuYXRlbHksIHRoZSBzZXQgb2YgaW5wdXRzCisgKiB0aGF0IG92ZXJmbG93cyBkZXBlbmRzIG9uIHRoZSByb3VuZGluZyBtb2RlIHdoZW4gJ2R0eXBlJyBoYXMgbW9yZQorICogc2lnbmlmaWNhbnQgYml0cyB0aGFuICd0eXBlJy4gIEhlbmNlLCB3ZSBiZW5kIG92ZXIgYmFja3dhcmRzIGZvciB0aGUKKyAqIHNha2Ugb2YgY29ycmVjdG5lc3M7IGFuIE1EIGltcGxlbWVudGF0aW9uIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50LgorICovCitkdHlwZQorZm4odHlwZSB4KQoreworCWZlbnZfdCBlbnY7CisJZHR5cGUgZDsKKworCWZlaG9sZGV4Y2VwdCgmZW52KTsKKwlkID0gKGR0eXBlKXJvdW5kaXQoeCk7CisJaWYgKGZldGVzdGV4Y2VwdChGRV9JTlZBTElEKSkKKwkJZmVjbGVhcmV4Y2VwdChGRV9JTkVYQUNUKTsKKwlmZXVwZGF0ZWVudigmZW52KTsKKwlyZXR1cm4gKGQpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19scmludGYuYyBiL2xpYm0vc3JjL3NfbHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI1OGUwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbHJpbnRmLmMKQEAgLTAsMCArMSw5IEBACisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19scmludGYuYyx2IDEuMSAyMDA1LzAxLzExIDIzOjEyOjU1IGRhcyBFeHAgJCIpOyAqLworCisjZGVmaW5lIHR5cGUJCWZsb2F0CisjZGVmaW5lCXJvdW5kaXQJCXJpbnRmCisjZGVmaW5lIGR0eXBlCQlsb25nCisjZGVmaW5lCWZuCQlscmludGYKKworI2luY2x1ZGUgInNfbHJpbnQuYyIKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbHJvdW5kLmMgYi9saWJtL3NyYy9zX2xyb3VuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OWY0NmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2xyb3VuZC5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGZlbnYuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpZm5kZWYgdHlwZQorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbHJvdW5kLmMsdiAxLjIgMjAwNS8wNC8wOCAwMDo1MjoxNiBkYXMgRXhwICQiKTsgKi8KKyNkZWZpbmUgdHlwZQkJZG91YmxlCisjZGVmaW5lCXJvdW5kaXQJCXJvdW5kCisjZGVmaW5lIGR0eXBlCQlsb25nCisjZGVmaW5lCURUWVBFX01JTglMT05HX01JTgorI2RlZmluZQlEVFlQRV9NQVgJTE9OR19NQVgKKyNkZWZpbmUJZm4JCWxyb3VuZAorI2VuZGlmCisKKy8qCisgKiBJZiB0eXBlIGhhcyBtb3JlIHByZWNpc2lvbiB0aGFuIGR0eXBlLCB0aGUgZW5kcG9pbnRzIGR0eXBlXyhtaW58bWF4KSBhcmUKKyAqIG9mIHRoZSBmb3JtIHh4eC41OyB0aGV5IGFyZSAib3V0IG9mIHJhbmdlIiBiZWNhdXNlIGxyb3VuZCgpIHJvdW5kcyBhd2F5CisgKiBmcm9tIDAuICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdHlwZSBoYXMgbGVzcyBwcmVjaXNpb24gdGhhbiBkdHlwZSwgdGhlbgorICogYWxsIHZhbHVlcyB0aGF0IGFyZSBvdXQgb2YgcmFuZ2UgYXJlIGludGVncmFsLCBzbyB3ZSBtaWdodCBhcyB3ZWxsIGFzc3VtZQorICogdGhhdCBldmVyeXRoaW5nIGlzIGluIHJhbmdlLiAgQXQgY29tcGlsZSB0aW1lLCBJTlJBTkdFKHgpIHNob3VsZCByZWR1Y2UgdG8KKyAqIHR3byBmbG9hdGluZy1wb2ludCBjb21wYXJpc29ucyBpbiB0aGUgZm9ybWVyIGNhc2UsIG9yIFRSVUUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgY29uc3QgdHlwZSBkdHlwZV9taW4gPSBEVFlQRV9NSU4gLSAwLjU7CitzdGF0aWMgY29uc3QgdHlwZSBkdHlwZV9tYXggPSBEVFlQRV9NQVggKyAwLjU7CisjZGVmaW5lCUlOUkFOR0UoeCkJKGR0eXBlX21heCAtIERUWVBFX01BWCAhPSAwLjUgfHwgXAorCQkJICgoeCkgPiBkdHlwZV9taW4gJiYgKHgpIDwgZHR5cGVfbWF4KSkKKworZHR5cGUKK2ZuKHR5cGUgeCkKK3sKKworCWlmIChJTlJBTkdFKHgpKSB7CisJCXggPSByb3VuZGl0KHgpOworCQlyZXR1cm4gKChkdHlwZSl4KTsKKwl9IGVsc2UgeworCQlmZXJhaXNlZXhjZXB0KEZFX0lOVkFMSUQpOworCQlyZXR1cm4gKERUWVBFX01BWCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19scm91bmRmLmMgYi9saWJtL3NyYy9zX2xyb3VuZGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDY5YzljCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19scm91bmRmLmMKQEAgLTAsMCArMSwxMSBAQAorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbHJvdW5kZi5jLHYgMS4yIDIwMDUvMDQvMDggMDA6NTI6MjcgZGFzIEV4cCAkIik7ICovCisKKyNkZWZpbmUgdHlwZQkJZmxvYXQKKyNkZWZpbmUJcm91bmRpdAkJcm91bmRmCisjZGVmaW5lIGR0eXBlCQlsb25nCisjZGVmaW5lCURUWVBFX01JTglMT05HX01JTgorI2RlZmluZQlEVFlQRV9NQVgJTE9OR19NQVgKKyNkZWZpbmUJZm4JCWxyb3VuZGYKKworI2luY2x1ZGUgInNfbHJvdW5kLmMiCmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2xyb3VuZGwuYyBiL2xpYm0vc3JjL3NfbHJvdW5kbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjM2Y4NTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2xyb3VuZGwuYwpAQCAtMCwwICsxLDExIEBACisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19scm91bmRsLmMsdiAxLjEgMjAwNS8wNC8wOCAwMToyNDowOCBkYXMgRXhwICQiKTsgKi8KKworI2RlZmluZSB0eXBlCQlsb25nIGRvdWJsZQorI2RlZmluZQlyb3VuZGl0CQlyb3VuZGwKKyNkZWZpbmUgZHR5cGUJCWxvbmcKKyNkZWZpbmUJRFRZUEVfTUlOCUxPTkdfTUlOCisjZGVmaW5lCURUWVBFX01BWAlMT05HX01BWAorI2RlZmluZQlmbgkJbHJvdW5kbAorCisjaW5jbHVkZSAic19scm91bmQuYyIKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbW9kZi5jIGIvbGlibS9zcmMvc19tb2RmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgzZmJkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbW9kZi5jCkBAIC0wLDAgKzEsNzUgQEAKKy8qIEAoIylzX21vZGYuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbW9kZi5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogbW9kZihkb3VibGUgeCwgZG91YmxlICppcHRyKQorICogcmV0dXJuIGZyYWN0aW9uIHBhcnQgb2YgeCwgYW5kIHJldHVybiB4J3MgaW50ZWdyYWwgcGFydCBpbiAqaXB0ci4KKyAqIE1ldGhvZDoKKyAqCUJpdCB0d2lkZGxpbmcuCisgKgorICogRXhjZXB0aW9uOgorICoJTm8gZXhjZXB0aW9uLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUgb25lID0gMS4wOworCitkb3VibGUKK21vZGYoZG91YmxlIHgsIGRvdWJsZSAqaXB0cikKK3sKKwlpbnQzMl90IGkwLGkxLGowOworCXVfaW50MzJfdCBpOworCUVYVFJBQ1RfV09SRFMoaTAsaTEseCk7CisJajAgPSAoKGkwPj4yMCkmMHg3ZmYpLTB4M2ZmOwkvKiBleHBvbmVudCBvZiB4ICovCisJaWYoajA8MjApIHsJCQkvKiBpbnRlZ2VyIHBhcnQgaW4gaGlnaCB4ICovCisJICAgIGlmKGowPDApIHsJCQkvKiB8eHw8MSAqLworCSAgICAgICAgSU5TRVJUX1dPUkRTKCppcHRyLGkwJjB4ODAwMDAwMDAsMCk7CS8qICppcHRyID0gKy0wICovCisJCXJldHVybiB4OworCSAgICB9IGVsc2UgeworCQlpID0gKDB4MDAwZmZmZmYpPj5qMDsKKwkJaWYoKChpMCZpKXxpMSk9PTApIHsJCS8qIHggaXMgaW50ZWdyYWwgKi8KKwkJICAgIHVfaW50MzJfdCBoaWdoOworCQkgICAgKmlwdHIgPSB4OworCQkgICAgR0VUX0hJR0hfV09SRChoaWdoLHgpOworCQkgICAgSU5TRVJUX1dPUkRTKHgsaGlnaCYweDgwMDAwMDAwLDApOwkvKiByZXR1cm4gKy0wICovCisJCSAgICByZXR1cm4geDsKKwkJfSBlbHNlIHsKKwkJICAgIElOU0VSVF9XT1JEUygqaXB0cixpMCYofmkpLDApOworCQkgICAgcmV0dXJuIHggLSAqaXB0cjsKKwkJfQorCSAgICB9CisJfSBlbHNlIGlmIChqMD41MSkgewkJLyogbm8gZnJhY3Rpb24gcGFydCAqLworCSAgICB1X2ludDMyX3QgaGlnaDsKKwkgICAgKmlwdHIgPSB4Km9uZTsKKwkgICAgR0VUX0hJR0hfV09SRChoaWdoLHgpOworCSAgICBJTlNFUlRfV09SRFMoeCxoaWdoJjB4ODAwMDAwMDAsMCk7CS8qIHJldHVybiArLTAgKi8KKwkgICAgcmV0dXJuIHg7CisJfSBlbHNlIHsJCQkvKiBmcmFjdGlvbiBwYXJ0IGluIGxvdyB4ICovCisJICAgIGkgPSAoKHVfaW50MzJfdCkoMHhmZmZmZmZmZikpPj4oajAtMjApOworCSAgICBpZigoaTEmaSk9PTApIHsgCQkvKiB4IGlzIGludGVncmFsICovCisJICAgICAgICB1X2ludDMyX3QgaGlnaDsKKwkJKmlwdHIgPSB4OworCQlHRVRfSElHSF9XT1JEKGhpZ2gseCk7CisJCUlOU0VSVF9XT1JEUyh4LGhpZ2gmMHg4MDAwMDAwMCwwKTsJLyogcmV0dXJuICstMCAqLworCQlyZXR1cm4geDsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgIElOU0VSVF9XT1JEUygqaXB0cixpMCxpMSYofmkpKTsKKwkJcmV0dXJuIHggLSAqaXB0cjsKKwkgICAgfQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbW9kZmYuYyBiL2xpYm0vc3JjL3NfbW9kZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzc1ZmZkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19tb2RmZi5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qIHNfbW9kZmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfbW9kZi5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19tb2RmZi5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQgb25lID0gMS4wOworCitmbG9hdAorbW9kZmYoZmxvYXQgeCwgZmxvYXQgKmlwdHIpCit7CisJaW50MzJfdCBpMCxqMDsKKwl1X2ludDMyX3QgaTsKKwlHRVRfRkxPQVRfV09SRChpMCx4KTsKKwlqMCA9ICgoaTA+PjIzKSYweGZmKS0weDdmOwkvKiBleHBvbmVudCBvZiB4ICovCisJaWYoajA8MjMpIHsJCQkvKiBpbnRlZ2VyIHBhcnQgaW4geCAqLworCSAgICBpZihqMDwwKSB7CQkJLyogfHh8PDEgKi8KKwkgICAgICAgIFNFVF9GTE9BVF9XT1JEKCppcHRyLGkwJjB4ODAwMDAwMDApOwkvKiAqaXB0ciA9ICstMCAqLworCQlyZXR1cm4geDsKKwkgICAgfSBlbHNlIHsKKwkJaSA9ICgweDAwN2ZmZmZmKT4+ajA7CisJCWlmKChpMCZpKT09MCkgewkJCS8qIHggaXMgaW50ZWdyYWwgKi8KKwkJICAgIHVfaW50MzJfdCBpeDsKKwkJICAgICppcHRyID0geDsKKwkJICAgIEdFVF9GTE9BVF9XT1JEKGl4LHgpOworCQkgICAgU0VUX0ZMT0FUX1dPUkQoeCxpeCYweDgwMDAwMDAwKTsJLyogcmV0dXJuICstMCAqLworCQkgICAgcmV0dXJuIHg7CisJCX0gZWxzZSB7CisJCSAgICBTRVRfRkxPQVRfV09SRCgqaXB0cixpMCYofmkpKTsKKwkJICAgIHJldHVybiB4IC0gKmlwdHI7CisJCX0KKwkgICAgfQorCX0gZWxzZSB7CQkJLyogbm8gZnJhY3Rpb24gcGFydCAqLworCSAgICB1X2ludDMyX3QgaXg7CisJICAgICppcHRyID0geCpvbmU7CisJICAgIEdFVF9GTE9BVF9XT1JEKGl4LHgpOworCSAgICBTRVRfRkxPQVRfV09SRCh4LGl4JjB4ODAwMDAwMDApOwkvKiByZXR1cm4gKy0wICovCisJICAgIHJldHVybiB4OworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbmVhcmJ5aW50LmMgYi9saWJtL3NyYy9zX25lYXJieWludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NmQzMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX25lYXJieWludC5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbmVhcmJ5aW50LmMsdiAxLjEgMjAwNC8wNy8wNiAwNDo0NjowOCBkYXMgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgPGZlbnYuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKy8qCisgKiBXZSBzYXZlIGFuZCByZXN0b3JlIHRoZSBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCB0byBhdm9pZCByYWlzaW5nCisgKiBhbiBpbmV4YWN0IGV4Y2VwdGlvbi4gIFdlIGNhbiBnZXQgYXdheSB3aXRoIHVzaW5nIGZlc2V0ZW52KCkKKyAqIGluc3RlYWQgb2YgZmVjbGVhcmV4Y2VwdCgpL2ZldXBkYXRlZW52KCkgdG8gcmVzdG9yZSB0aGUgZW52aXJvbm1lbnQKKyAqIGJlY2F1c2UgdGhlIG9ubHkgZXhjZXB0aW9uIGRlZmluZWQgZm9yIHJpbnQoKSBpcyBvdmVyZmxvdywgYW5kCisgKiByb3VuZGluZyBjYW4ndCBvdmVyZmxvdyBhcyBsb25nIGFzIGVtYXggPj0gcC4KKyAqLworI2RlZmluZQlERUNMKHR5cGUsIGZuLCByaW50KQlcCit0eXBlCQkJCVwKK2ZuKHR5cGUgeCkJCQlcCit7CQkJCVwKKwl0eXBlIHJldDsJCVwKKwlmZW52X3QgZW52OwkJXAorCQkJCVwKKwlmZWdldGVudigmZW52KTsJCVwKKwlyZXQgPSByaW50KHgpOwkJXAorCWZlc2V0ZW52KCZlbnYpOwkJXAorCXJldHVybiAocmV0KTsJCVwKK30KKworREVDTChkb3VibGUsIG5lYXJieWludCwgcmludCkKK0RFQ0woZmxvYXQsIG5lYXJieWludGYsIHJpbnRmKQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19uZXh0YWZ0ZXIuYyBiL2xpYm0vc3JjL3NfbmV4dGFmdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkMDM2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbmV4dGFmdGVyLmMKQEAgLTAsMCArMSw4NSBAQAorLyogQCgjKXNfbmV4dGFmdGVyLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX25leHRhZnRlci5jLHYgMS4xMSAyMDA1LzAzLzA3IDIxOjI3OjM3IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogSUVFRSBmdW5jdGlvbnMKKyAqCW5leHRhZnRlcih4LHkpCisgKglyZXR1cm4gdGhlIG5leHQgbWFjaGluZSBmbG9hdGluZy1wb2ludCBudW1iZXIgb2YgeCBpbiB0aGUKKyAqCWRpcmVjdGlvbiB0b3dhcmQgeS4KKyAqICAgU3BlY2lhbCBjYXNlczoKKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZG91YmxlCituZXh0YWZ0ZXIoZG91YmxlIHgsIGRvdWJsZSB5KQoreworCXZvbGF0aWxlIGRvdWJsZSB0OworCWludDMyX3QgaHgsaHksaXgsaXk7CisJdV9pbnQzMl90IGx4LGx5OworCisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKwlFWFRSQUNUX1dPUkRTKGh5LGx5LHkpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsJCS8qIHx4fCAqLworCWl5ID0gaHkmMHg3ZmZmZmZmZjsJCS8qIHx5fCAqLworCisJaWYoKChpeD49MHg3ZmYwMDAwMCkmJigoaXgtMHg3ZmYwMDAwMCl8bHgpIT0wKSB8fCAgIC8qIHggaXMgbmFuICovCisJICAgKChpeT49MHg3ZmYwMDAwMCkmJigoaXktMHg3ZmYwMDAwMCl8bHkpIT0wKSkgICAgIC8qIHkgaXMgbmFuICovCisJICAgcmV0dXJuIHgreTsKKwlpZih4PT15KSByZXR1cm4geTsJCS8qIHg9eSwgcmV0dXJuIHkgKi8KKwlpZigoaXh8bHgpPT0wKSB7CQkJLyogeCA9PSAwICovCisJICAgIElOU0VSVF9XT1JEUyh4LGh5JjB4ODAwMDAwMDAsMSk7CS8qIHJldHVybiArLW1pbnN1Ym5vcm1hbCAqLworCSAgICB0ID0geCp4OworCSAgICBpZih0PT14KSByZXR1cm4gdDsgZWxzZSByZXR1cm4geDsJLyogcmFpc2UgdW5kZXJmbG93IGZsYWcgKi8KKwl9CisJaWYoaHg+PTApIHsJCQkJLyogeCA+IDAgKi8KKwkgICAgaWYoaHg+aHl8fCgoaHg9PWh5KSYmKGx4Pmx5KSkpIHsJLyogeCA+IHksIHggLT0gdWxwICovCisJCWlmKGx4PT0wKSBoeCAtPSAxOworCQlseCAtPSAxOworCSAgICB9IGVsc2UgewkJCQkvKiB4IDwgeSwgeCArPSB1bHAgKi8KKwkJbHggKz0gMTsKKwkJaWYobHg9PTApIGh4ICs9IDE7CisJICAgIH0KKwl9IGVsc2UgewkJCQkvKiB4IDwgMCAqLworCSAgICBpZihoeT49MHx8aHg+aHl8fCgoaHg9PWh5KSYmKGx4Pmx5KSkpey8qIHggPCB5LCB4IC09IHVscCAqLworCQlpZihseD09MCkgaHggLT0gMTsKKwkJbHggLT0gMTsKKwkgICAgfSBlbHNlIHsJCQkJLyogeCA+IHksIHggKz0gdWxwICovCisJCWx4ICs9IDE7CisJCWlmKGx4PT0wKSBoeCArPSAxOworCSAgICB9CisJfQorCWh5ID0gaHgmMHg3ZmYwMDAwMDsKKwlpZihoeT49MHg3ZmYwMDAwMCkgcmV0dXJuIHgreDsJLyogb3ZlcmZsb3cgICovCisJaWYoaHk8MHgwMDEwMDAwMCkgewkJLyogdW5kZXJmbG93ICovCisJICAgIHQgPSB4Kng7CisJICAgIGlmKHQhPXgpIHsJCS8qIHJhaXNlIHVuZGVyZmxvdyBmbGFnICovCisJICAgICAgICBJTlNFUlRfV09SRFMoeSxoeCxseCk7CisJCXJldHVybiB5OworCSAgICB9CisJfQorCUlOU0VSVF9XT1JEUyh4LGh4LGx4KTsKKwlyZXR1cm4geDsKK30KKworI2lmIChMREJMX01BTlRfRElHID09IDUzKQorX193ZWFrX3JlZmVyZW5jZShuZXh0YWZ0ZXIsIG5leHR0b3dhcmQpOworX193ZWFrX3JlZmVyZW5jZShuZXh0YWZ0ZXIsIG5leHR0b3dhcmRsKTsKK19fd2Vha19yZWZlcmVuY2UobmV4dGFmdGVyLCBuZXh0YWZ0ZXJsKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19uZXh0YWZ0ZXJmLmMgYi9saWJtL3NyYy9zX25leHRhZnRlcmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmVhYzRhCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19uZXh0YWZ0ZXJmLmMKQEAgLTAsMCArMSw2NyBAQAorLyogc19uZXh0YWZ0ZXJmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX25leHRhZnRlci5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19uZXh0YWZ0ZXJmLmMsdiAxLjEwIDIwMDUvMDMvMDcgMDQ6NTU6NTggZGFzIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitmbG9hdAorbmV4dGFmdGVyZihmbG9hdCB4LCBmbG9hdCB5KQoreworCXZvbGF0aWxlIGZsb2F0IHQ7CisJaW50MzJfdCBoeCxoeSxpeCxpeTsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCUdFVF9GTE9BVF9XT1JEKGh5LHkpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsJCS8qIHx4fCAqLworCWl5ID0gaHkmMHg3ZmZmZmZmZjsJCS8qIHx5fCAqLworCisJaWYoKGl4PjB4N2Y4MDAwMDApIHx8ICAgLyogeCBpcyBuYW4gKi8KKwkgICAoaXk+MHg3ZjgwMDAwMCkpICAgICAvKiB5IGlzIG5hbiAqLworCSAgIHJldHVybiB4K3k7CisJaWYoeD09eSkgcmV0dXJuIHk7CQkvKiB4PXksIHJldHVybiB5ICovCisJaWYoaXg9PTApIHsJCQkJLyogeCA9PSAwICovCisJICAgIFNFVF9GTE9BVF9XT1JEKHgsKGh5JjB4ODAwMDAwMDApfDEpOy8qIHJldHVybiArLW1pbnN1Ym5vcm1hbCAqLworCSAgICB0ID0geCp4OworCSAgICBpZih0PT14KSByZXR1cm4gdDsgZWxzZSByZXR1cm4geDsJLyogcmFpc2UgdW5kZXJmbG93IGZsYWcgKi8KKwl9CisJaWYoaHg+PTApIHsJCQkJLyogeCA+IDAgKi8KKwkgICAgaWYoaHg+aHkpIHsJCQkJLyogeCA+IHksIHggLT0gdWxwICovCisJCWh4IC09IDE7CisJICAgIH0gZWxzZSB7CQkJCS8qIHggPCB5LCB4ICs9IHVscCAqLworCQloeCArPSAxOworCSAgICB9CisJfSBlbHNlIHsJCQkJLyogeCA8IDAgKi8KKwkgICAgaWYoaHk+PTB8fGh4Pmh5KXsJCQkvKiB4IDwgeSwgeCAtPSB1bHAgKi8KKwkJaHggLT0gMTsKKwkgICAgfSBlbHNlIHsJCQkJLyogeCA+IHksIHggKz0gdWxwICovCisJCWh4ICs9IDE7CisJICAgIH0KKwl9CisJaHkgPSBoeCYweDdmODAwMDAwOworCWlmKGh5Pj0weDdmODAwMDAwKSByZXR1cm4geCt4OwkvKiBvdmVyZmxvdyAgKi8KKwlpZihoeTwweDAwODAwMDAwKSB7CQkvKiB1bmRlcmZsb3cgKi8KKwkgICAgdCA9IHgqeDsKKwkgICAgaWYodCE9eCkgewkJLyogcmFpc2UgdW5kZXJmbG93IGZsYWcgKi8KKwkgICAgICAgIFNFVF9GTE9BVF9XT1JEKHksaHgpOworCQlyZXR1cm4geTsKKwkgICAgfQorCX0KKwlTRVRfRkxPQVRfV09SRCh4LGh4KTsKKwlyZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbmV4dGFmdGVybC5jIGIvbGlibS9zcmMvc19uZXh0YWZ0ZXJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjZmQzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbmV4dGFmdGVybC5jCkBAIC0wLDAgKzEsODIgQEAKKy8qIEAoIylzX25leHRhZnRlci5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19uZXh0YWZ0ZXJsLmMsdiAxLjEgMjAwNS8wMy8wNyAwNDo1Njo0NiBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIElFRUUgZnVuY3Rpb25zCisgKgluZXh0YWZ0ZXIoeCx5KQorICoJcmV0dXJuIHRoZSBuZXh0IG1hY2hpbmUgZmxvYXRpbmctcG9pbnQgbnVtYmVyIG9mIHggaW4gdGhlCisgKglkaXJlY3Rpb24gdG93YXJkIHkuCisgKiAgIFNwZWNpYWwgY2FzZXM6CisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKyNpZiBMREJMX01BWF9FWFAgIT0gMHg0MDAwCisjZXJyb3IgIlVuc3VwcG9ydGVkIGxvbmcgZG91YmxlIGZvcm1hdCIKKyNlbmRpZgorCitsb25nIGRvdWJsZQorbmV4dGFmdGVybChsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5KQoreworCXZvbGF0aWxlIGxvbmcgZG91YmxlIHQ7CisJdW5pb24gSUVFRWwyYml0cyB1eCwgdXk7CisKKwl1eC5lID0geDsKKwl1eS5lID0geTsKKworCWlmICgodXguYml0cy5leHAgPT0gMHg3ZmZmICYmCisJICAgICAoKHV4LmJpdHMubWFuaCZ+TERCTF9OQklUKXx1eC5iaXRzLm1hbmwpICE9IDApIHx8CisJICAgICh1eS5iaXRzLmV4cCA9PSAweDdmZmYgJiYKKwkgICAgICgodXkuYml0cy5tYW5oJn5MREJMX05CSVQpfHV5LmJpdHMubWFubCkgIT0gMCkpCisJICAgcmV0dXJuIHgreTsJLyogeCBvciB5IGlzIG5hbiAqLworCWlmKHg9PXkpIHJldHVybiB5OwkJLyogeD15LCByZXR1cm4geSAqLworCWlmKHg9PTAuMCkgeworCSAgICB1eC5iaXRzLm1hbmggPSAwOwkJCS8qIHJldHVybiArLW1pbnN1Ym5vcm1hbCAqLworCSAgICB1eC5iaXRzLm1hbmwgPSAxOworCSAgICB1eC5iaXRzLnNpZ24gPSB1eS5iaXRzLnNpZ247CisJICAgIHQgPSB1eC5lKnV4LmU7CisJICAgIGlmKHQ9PXV4LmUpIHJldHVybiB0OyBlbHNlIHJldHVybiB1eC5lOyAvKiByYWlzZSB1bmRlcmZsb3cgZmxhZyAqLworCX0KKwlpZih4PjAuMCBeIHg8eSkgewkJCS8qIHggLT0gdWxwICovCisJICAgIGlmKHV4LmJpdHMubWFubD09MCkgeworCQlpZiAoKHV4LmJpdHMubWFuaCZ+TERCTF9OQklUKT09MCkKKwkJICAgIHV4LmJpdHMuZXhwIC09IDE7CisJCXV4LmJpdHMubWFuaCA9ICh1eC5iaXRzLm1hbmggLSAxKSB8ICh1eC5iaXRzLm1hbmggJiBMREJMX05CSVQpOworCSAgICB9CisJICAgIHV4LmJpdHMubWFubCAtPSAxOworCX0gZWxzZSB7CQkJCS8qIHggKz0gdWxwICovCisJICAgIHV4LmJpdHMubWFubCArPSAxOworCSAgICBpZih1eC5iaXRzLm1hbmw9PTApIHsKKwkJdXguYml0cy5tYW5oID0gKHV4LmJpdHMubWFuaCArIDEpIHwgKHV4LmJpdHMubWFuaCAmIExEQkxfTkJJVCk7CisJCWlmICgodXguYml0cy5tYW5oJn5MREJMX05CSVQpPT0wKQorCQkgICAgdXguYml0cy5leHAgKz0gMTsKKwkgICAgfQorCX0KKwlpZih1eC5iaXRzLmV4cD09MHg3ZmZmKSByZXR1cm4geCt4OwkvKiBvdmVyZmxvdyAgKi8KKwlpZih1eC5iaXRzLmV4cD09MCkgewkJCS8qIHVuZGVyZmxvdyAqLworCSAgICBtYXNrX25iaXRfbCh1eCk7CisJICAgIHQgPSB1eC5lICogdXguZTsKKwkgICAgaWYodCE9dXguZSkJCQkvKiByYWlzZSB1bmRlcmZsb3cgZmxhZyAqLworCQlyZXR1cm4gdXguZTsKKwl9CisJcmV0dXJuIHV4LmU7Cit9CisKK19fc3Ryb25nX3JlZmVyZW5jZShuZXh0YWZ0ZXJsLCBuZXh0dG93YXJkbCk7CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX25leHR0b3dhcmQuYyBiL2xpYm0vc3JjL3NfbmV4dHRvd2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZGE0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX25leHR0b3dhcmQuYwpAQCAtMCwwICsxLDczIEBACisvKiBAKCMpc19uZXh0YWZ0ZXIuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbmV4dHRvd2FyZC5jLHYgMS4xIDIwMDUvMDMvMDcgMDQ6NTY6NDYgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogV2UgYXNzdW1lIHRoYXQgYSBsb25nIGRvdWJsZSBoYXMgYSAxNS1iaXQgZXhwb25lbnQuICBPbiBzeXN0ZW1zCisgKiB3aGVyZSBsb25nIGRvdWJsZSBpcyB0aGUgc2FtZSBhcyBkb3VibGUsIG5leHR0b3dhcmQoKSBpcyBhbiBhbGlhcworICogZm9yIG5leHRhZnRlcigpLCBzbyB3ZSBkb24ndCB1c2UgdGhpcyByb3V0aW5lLgorICovCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisjaWYgTERCTF9NQVhfRVhQICE9IDB4NDAwMAorI2Vycm9yICJVbnN1cHBvcnRlZCBsb25nIGRvdWJsZSBmb3JtYXQiCisjZW5kaWYKKworZG91YmxlCituZXh0dG93YXJkKGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5KQoreworCXVuaW9uIElFRUVsMmJpdHMgdXk7CisJdm9sYXRpbGUgZG91YmxlIHQ7CisJaW50MzJfdCBoeCxpeDsKKwl1X2ludDMyX3QgbHg7CisKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsJCS8qIHx4fCAqLworCXV5LmUgPSB5OworCisJaWYoKChpeD49MHg3ZmYwMDAwMCkmJigoaXgtMHg3ZmYwMDAwMCl8bHgpIT0wKSB8fAorCSAgICAodXkuYml0cy5leHAgPT0gMHg3ZmZmICYmCisJICAgICAoKHV5LmJpdHMubWFuaCZ+TERCTF9OQklUKXx1eS5iaXRzLm1hbmwpICE9IDApKQorCSAgIHJldHVybiB4K3k7CS8qIHggb3IgeSBpcyBuYW4gKi8KKwlpZih4PT15KSByZXR1cm4gKGRvdWJsZSl5OwkJLyogeD15LCByZXR1cm4geSAqLworCWlmKHg9PTAuMCkgeworCSAgICBJTlNFUlRfV09SRFMoeCx1eS5iaXRzLnNpZ248PDMxLDEpOwkvKiByZXR1cm4gKy1taW5zdWJub3JtYWwgKi8KKwkgICAgdCA9IHgqeDsKKwkgICAgaWYodD09eCkgcmV0dXJuIHQ7IGVsc2UgcmV0dXJuIHg7CS8qIHJhaXNlIHVuZGVyZmxvdyBmbGFnICovCisJfQorCWlmKGh4PjAuMCBeIHggPCB5KSB7CQkJLyogeCAtPSB1bHAgKi8KKwkgICAgaWYobHg9PTApIGh4IC09IDE7CisJICAgIGx4IC09IDE7CisJfSBlbHNlIHsJCQkJLyogeCArPSB1bHAgKi8KKwkgICAgbHggKz0gMTsKKwkgICAgaWYobHg9PTApIGh4ICs9IDE7CisJfQorCWl4ID0gaHgmMHg3ZmYwMDAwMDsKKwlpZihpeD49MHg3ZmYwMDAwMCkgcmV0dXJuIHgreDsJLyogb3ZlcmZsb3cgICovCisJaWYoaXg8MHgwMDEwMDAwMCkgewkJLyogdW5kZXJmbG93ICovCisJICAgIHQgPSB4Kng7CisJICAgIGlmKHQhPXgpIHsJCS8qIHJhaXNlIHVuZGVyZmxvdyBmbGFnICovCisJICAgICAgICBJTlNFUlRfV09SRFMoeSxoeCxseCk7CisJCXJldHVybiB5OworCSAgICB9CisJfQorCUlOU0VSVF9XT1JEUyh4LGh4LGx4KTsKKwlyZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbmV4dHRvd2FyZGYuYyBiL2xpYm0vc3JjL3NfbmV4dHRvd2FyZGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDE1NmU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19uZXh0dG93YXJkZi5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbmV4dHRvd2FyZGYuYyx2IDEuMSAyMDA1LzAzLzA3IDA0OjU3OjM4IGRhcyBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgPGZsb2F0Lmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKyNkZWZpbmUJTERCTF9JTkZOQU5fRVhQCShMREJMX01BWF9FWFAgKiAyIC0gMSkKKworZmxvYXQKK25leHR0b3dhcmRmKGZsb2F0IHgsIGxvbmcgZG91YmxlIHkpCit7CisJdW5pb24gSUVFRWwyYml0cyB1eTsKKwl2b2xhdGlsZSBmbG9hdCB0OworCWludDMyX3QgaHgsaXg7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CQkvKiB8eHwgKi8KKwl1eS5lID0geTsKKworCWlmKChpeD4weDdmODAwMDAwKSB8fAorCSAgICh1eS5iaXRzLmV4cCA9PSBMREJMX0lORk5BTl9FWFAgJiYKKwkgICAgKCh1eS5iaXRzLm1hbmgmfkxEQkxfTkJJVCl8dXkuYml0cy5tYW5sKSAhPSAwKSkKKwkgICByZXR1cm4geCt5OwkvKiB4IG9yIHkgaXMgbmFuICovCisJaWYoeD09eSkgcmV0dXJuIChmbG9hdCl5OwkJLyogeD15LCByZXR1cm4geSAqLworCWlmKGl4PT0wKSB7CQkJCS8qIHggPT0gMCAqLworCSAgICBTRVRfRkxPQVRfV09SRCh4LCh1eS5iaXRzLnNpZ248PDMxKXwxKTsvKiByZXR1cm4gKy1taW5zdWJub3JtYWwgKi8KKwkgICAgdCA9IHgqeDsKKwkgICAgaWYodD09eCkgcmV0dXJuIHQ7IGVsc2UgcmV0dXJuIHg7CS8qIHJhaXNlIHVuZGVyZmxvdyBmbGFnICovCisJfQorCWlmKGh4Pj0wIF4geCA8IHkpCQkJLyogeCAtPSB1bHAgKi8KKwkgICAgaHggLT0gMTsKKwllbHNlCQkJCQkvKiB4ICs9IHVscCAqLworCSAgICBoeCArPSAxOworCWl4ID0gaHgmMHg3ZjgwMDAwMDsKKwlpZihpeD49MHg3ZjgwMDAwMCkgcmV0dXJuIHgreDsJLyogb3ZlcmZsb3cgICovCisJaWYoaXg8MHgwMDgwMDAwMCkgewkJLyogdW5kZXJmbG93ICovCisJICAgIHQgPSB4Kng7CisJICAgIGlmKHQhPXgpIHsJCS8qIHJhaXNlIHVuZGVyZmxvdyBmbGFnICovCisJICAgICAgICBTRVRfRkxPQVRfV09SRCh5LGh4KTsKKwkJcmV0dXJuIHk7CisJICAgIH0KKwl9CisJU0VUX0ZMT0FUX1dPUkQoeCxoeCk7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3JlbXF1by5jIGIvbGlibS9zcmMvc19yZW1xdW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWU2NWRmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19yZW1xdW8uYwpAQCAtMCwwICsxLDE1MiBAQAorLyogQCgjKWVfZm1vZC5jIDEuMyA5NS8wMS8xOCAqLworLyotCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19yZW1xdW8uYyx2IDEuMSAyMDA1LzAzLzI1IDA0OjQwOjQ0IGRhcyBFeHAgJCIpOyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlIFplcm9bXSA9IHswLjAsIC0wLjAsfTsKKworLyoKKyAqIFJldHVybiB0aGUgSUVFRSByZW1haW5kZXIgYW5kIHNldCAqcXVvIHRvIHRoZSBsYXN0IG4gYml0cyBvZiB0aGUKKyAqIHF1b3RpZW50LCByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuICBXZSBjaG9vc2Ugbj0zMSBiZWNhdXNlCisgKiB3ZSB3aW5kIHVwIGNvbXB1dGluZyBhbGwgdGhlIGludGVnZXIgYml0cyBvZiB0aGUgcXVvdGllbnQgYW55d2F5IGFzCisgKiBhIHNpZGUtZWZmZWN0IG9mIGNvbXB1dGluZyB0aGUgcmVtYWluZGVyIGJ5IHRoZSBzaGlmdCBhbmQgc3VidHJhY3QKKyAqIG1ldGhvZC4gIEluIHByYWN0aWNlLCB0aGlzIGlzIGZhciBtb3JlIGJpdHMgdGhhbiBhcmUgbmVlZGVkIHRvIHVzZQorICogcmVtcXVvIGluIHJlZHVjdGlvbiBhbGdvcml0aG1zLgorICovCitkb3VibGUKK3JlbXF1byhkb3VibGUgeCwgZG91YmxlIHksIGludCAqcXVvKQoreworCWludDMyX3QgbixoeCxoeSxoeixpeCxpeSxzeCxpOworCXVfaW50MzJfdCBseCxseSxseixxLHN4eTsKKworCUVYVFJBQ1RfV09SRFMoaHgsbHgseCk7CisJRVhUUkFDVF9XT1JEUyhoeSxseSx5KTsKKwlzeHkgPSAoaHggXiBoeSkgJiAweDgwMDAwMDAwOworCXN4ID0gaHgmMHg4MDAwMDAwMDsJCS8qIHNpZ24gb2YgeCAqLworCWh4IF49c3g7CQkvKiB8eHwgKi8KKwloeSAmPSAweDdmZmZmZmZmOwkvKiB8eXwgKi8KKworICAgIC8qIHB1cmdlIG9mZiBleGNlcHRpb24gdmFsdWVzICovCisJaWYoKGh5fGx5KT09MHx8KGh4Pj0weDdmZjAwMDAwKXx8CS8qIHk9MCxvciB4IG5vdCBmaW5pdGUgKi8KKwkgICgoaHl8KChseXwtbHkpPj4zMSkpPjB4N2ZmMDAwMDApKQkvKiBvciB5IGlzIE5hTiAqLworCSAgICByZXR1cm4gKHgqeSkvKHgqeSk7CisJaWYoaHg8PWh5KSB7CisJICAgIGlmKChoeDxoeSl8fChseDxseSkpIHsKKwkJcSA9IDA7CisJCWdvdG8gZml4dXA7CS8qIHx4fDx8eXwgcmV0dXJuIHggb3IgeC15ICovCisJICAgIH0KKwkgICAgaWYobHg9PWx5KSB7CisJCSpxdW8gPSAxOworCQlyZXR1cm4gWmVyb1sodV9pbnQzMl90KXN4Pj4zMV07CS8qIHx4fD18eXwgcmV0dXJuIHgqMCovCisJICAgIH0KKwl9CisKKyAgICAvKiBkZXRlcm1pbmUgaXggPSBpbG9nYih4KSAqLworCWlmKGh4PDB4MDAxMDAwMDApIHsJLyogc3Vibm9ybWFsIHggKi8KKwkgICAgaWYoaHg9PTApIHsKKwkJZm9yIChpeCA9IC0xMDQzLCBpPWx4OyBpPjA7IGk8PD0xKSBpeCAtPTE7CisJICAgIH0gZWxzZSB7CisJCWZvciAoaXggPSAtMTAyMixpPShoeDw8MTEpOyBpPjA7IGk8PD0xKSBpeCAtPTE7CisJICAgIH0KKwl9IGVsc2UgaXggPSAoaHg+PjIwKS0xMDIzOworCisgICAgLyogZGV0ZXJtaW5lIGl5ID0gaWxvZ2IoeSkgKi8KKwlpZihoeTwweDAwMTAwMDAwKSB7CS8qIHN1Ym5vcm1hbCB5ICovCisJICAgIGlmKGh5PT0wKSB7CisJCWZvciAoaXkgPSAtMTA0MywgaT1seTsgaT4wOyBpPDw9MSkgaXkgLT0xOworCSAgICB9IGVsc2UgeworCQlmb3IgKGl5ID0gLTEwMjIsaT0oaHk8PDExKTsgaT4wOyBpPDw9MSkgaXkgLT0xOworCSAgICB9CisJfSBlbHNlIGl5ID0gKGh5Pj4yMCktMTAyMzsKKworICAgIC8qIHNldCB1cCB7aHgsbHh9LCB7aHksbHl9IGFuZCBhbGlnbiB5IHRvIHggKi8KKwlpZihpeCA+PSAtMTAyMikgCisJICAgIGh4ID0gMHgwMDEwMDAwMHwoMHgwMDBmZmZmZiZoeCk7CisJZWxzZSB7CQkvKiBzdWJub3JtYWwgeCwgc2hpZnQgeCB0byBub3JtYWwgKi8KKwkgICAgbiA9IC0xMDIyLWl4OworCSAgICBpZihuPD0zMSkgeworCSAgICAgICAgaHggPSAoaHg8PG4pfChseD4+KDMyLW4pKTsKKwkgICAgICAgIGx4IDw8PSBuOworCSAgICB9IGVsc2UgeworCQloeCA9IGx4PDwobi0zMik7CisJCWx4ID0gMDsKKwkgICAgfQorCX0KKwlpZihpeSA+PSAtMTAyMikgCisJICAgIGh5ID0gMHgwMDEwMDAwMHwoMHgwMDBmZmZmZiZoeSk7CisJZWxzZSB7CQkvKiBzdWJub3JtYWwgeSwgc2hpZnQgeSB0byBub3JtYWwgKi8KKwkgICAgbiA9IC0xMDIyLWl5OworCSAgICBpZihuPD0zMSkgeworCSAgICAgICAgaHkgPSAoaHk8PG4pfChseT4+KDMyLW4pKTsKKwkgICAgICAgIGx5IDw8PSBuOworCSAgICB9IGVsc2UgeworCQloeSA9IGx5PDwobi0zMik7CisJCWx5ID0gMDsKKwkgICAgfQorCX0KKworICAgIC8qIGZpeCBwb2ludCBmbW9kICovCisJbiA9IGl4IC0gaXk7CisJcSA9IDA7CisJd2hpbGUobi0tKSB7CisJICAgIGh6PWh4LWh5O2x6PWx4LWx5OyBpZihseDxseSkgaHogLT0gMTsKKwkgICAgaWYoaHo8MCl7aHggPSBoeCtoeCsobHg+PjMxKTsgbHggPSBseCtseDt9CisJICAgIGVsc2Uge2h4ID0gaHoraHorKGx6Pj4zMSk7IGx4ID0gbHorbHo7IHErKzt9CisJICAgIHEgPDw9IDE7CisJfQorCWh6PWh4LWh5O2x6PWx4LWx5OyBpZihseDxseSkgaHogLT0gMTsKKwlpZihoej49MCkge2h4PWh6O2x4PWx6O3ErKzt9CisKKyAgICAvKiBjb252ZXJ0IGJhY2sgdG8gZmxvYXRpbmcgdmFsdWUgYW5kIHJlc3RvcmUgdGhlIHNpZ24gKi8KKwlpZigoaHh8bHgpPT0wKSB7CQkJLyogcmV0dXJuIHNpZ24oeCkqMCAqLworCSAgICAqcXVvID0gKHN4eSA/IC1xIDogcSk7CisJICAgIHJldHVybiBaZXJvWyh1X2ludDMyX3Qpc3g+PjMxXTsKKwl9CisJd2hpbGUoaHg8MHgwMDEwMDAwMCkgewkJLyogbm9ybWFsaXplIHggKi8KKwkgICAgaHggPSBoeCtoeCsobHg+PjMxKTsgbHggPSBseCtseDsKKwkgICAgaXkgLT0gMTsKKwl9CisJaWYoaXk+PSAtMTAyMikgewkvKiBub3JtYWxpemUgb3V0cHV0ICovCisJICAgIGh4ID0gKChoeC0weDAwMTAwMDAwKXwoKGl5KzEwMjMpPDwyMCkpOworCX0gZWxzZSB7CQkvKiBzdWJub3JtYWwgb3V0cHV0ICovCisJICAgIG4gPSAtMTAyMiAtIGl5OworCSAgICBpZihuPD0yMCkgeworCQlseCA9IChseD4+bil8KCh1X2ludDMyX3QpaHg8PCgzMi1uKSk7CisJCWh4ID4+PSBuOworCSAgICB9IGVsc2UgaWYgKG48PTMxKSB7CisJCWx4ID0gKGh4PDwoMzItbikpfChseD4+bik7IGh4ID0gc3g7CisJICAgIH0gZWxzZSB7CisJCWx4ID0gaHg+PihuLTMyKTsgaHggPSBzeDsKKwkgICAgfQorCX0KK2ZpeHVwOgorCUlOU0VSVF9XT1JEUyh4LGh4LGx4KTsKKwl5ID0gZmFicyh5KTsKKwlpZiAoeSA8IDB4MXAtMTAyMSkgeworCSAgICBpZiAoeCt4PnkgfHwgKHgreD09eSAmJiAocSAmIDEpKSkgeworCQlxKys7CisJCXgtPXk7CisJICAgIH0KKwl9IGVsc2UgaWYgKHg+MC41KnkgfHwgKHg9PTAuNSp5ICYmIChxICYgMSkpKSB7CisJICAgIHErKzsKKwkgICAgeC09eTsKKwl9CisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlTRVRfSElHSF9XT1JEKHgsaHhec3gpOworCXEgJj0gMHg3ZmZmZmZmZjsKKwkqcXVvID0gKHN4eSA/IC1xIDogcSk7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3JlbXF1b2YuYyBiL2xpYm0vc3JjL3NfcmVtcXVvZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNzIyY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3JlbXF1b2YuYwpAQCAtMCwwICsxLDEyMSBAQAorLyogQCgjKWVfZm1vZC5jIDEuMyA5NS8wMS8xOCAqLworLyotCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19yZW1xdW9mLmMsdiAxLjEgMjAwNS8wMy8yNSAwNDo0MDo0NCBkYXMgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0IFplcm9bXSA9IHswLjAsIC0wLjAsfTsKKworLyoKKyAqIFJldHVybiB0aGUgSUVFRSByZW1haW5kZXIgYW5kIHNldCAqcXVvIHRvIHRoZSBsYXN0IG4gYml0cyBvZiB0aGUKKyAqIHF1b3RpZW50LCByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuICBXZSBjaG9vc2Ugbj0zMSBiZWNhdXNlCisgKiB3ZSB3aW5kIHVwIGNvbXB1dGluZyBhbGwgdGhlIGludGVnZXIgYml0cyBvZiB0aGUgcXVvdGllbnQgYW55d2F5IGFzCisgKiBhIHNpZGUtZWZmZWN0IG9mIGNvbXB1dGluZyB0aGUgcmVtYWluZGVyIGJ5IHRoZSBzaGlmdCBhbmQgc3VidHJhY3QKKyAqIG1ldGhvZC4gIEluIHByYWN0aWNlLCB0aGlzIGlzIGZhciBtb3JlIGJpdHMgdGhhbiBhcmUgbmVlZGVkIHRvIHVzZQorICogcmVtcXVvIGluIHJlZHVjdGlvbiBhbGdvcml0aG1zLgorICovCitmbG9hdAorcmVtcXVvZihmbG9hdCB4LCBmbG9hdCB5LCBpbnQgKnF1bykKK3sKKwlpbnQzMl90IG4saHgsaHksaHosaXgsaXksc3gsaTsKKwl1X2ludDMyX3QgcSxzeHk7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlHRVRfRkxPQVRfV09SRChoeSx5KTsKKwlzeHkgPSAoaHggXiBoeSkgJiAweDgwMDAwMDAwOworCXN4ID0gaHgmMHg4MDAwMDAwMDsJCS8qIHNpZ24gb2YgeCAqLworCWh4IF49c3g7CQkvKiB8eHwgKi8KKwloeSAmPSAweDdmZmZmZmZmOwkvKiB8eXwgKi8KKworICAgIC8qIHB1cmdlIG9mZiBleGNlcHRpb24gdmFsdWVzICovCisJaWYoaHk9PTB8fGh4Pj0weDdmODAwMDAwfHxoeT4weDdmODAwMDAwKSAvKiB5PTAsTmFOO29yIHggbm90IGZpbml0ZSAqLworCSAgICByZXR1cm4gKHgqeSkvKHgqeSk7CisJaWYoaHg8aHkpIHsKKwkgICAgcSA9IDA7CisJICAgIGdvdG8gZml4dXA7CS8qIHx4fDx8eXwgcmV0dXJuIHggb3IgeC15ICovCisJfSBlbHNlIGlmKGh4PT1oeSkgeworCSAgICAqcXVvID0gMTsKKwkgICAgcmV0dXJuIFplcm9bKHVfaW50MzJfdClzeD4+MzFdOwkvKiB8eHw9fHl8IHJldHVybiB4KjAqLworCX0KKworICAgIC8qIGRldGVybWluZSBpeCA9IGlsb2diKHgpICovCisJaWYoaHg8MHgwMDgwMDAwMCkgewkvKiBzdWJub3JtYWwgeCAqLworCSAgICBmb3IgKGl4ID0gLTEyNixpPShoeDw8OCk7IGk+MDsgaTw8PTEpIGl4IC09MTsKKwl9IGVsc2UgaXggPSAoaHg+PjIzKS0xMjc7CisKKyAgICAvKiBkZXRlcm1pbmUgaXkgPSBpbG9nYih5KSAqLworCWlmKGh5PDB4MDA4MDAwMDApIHsJLyogc3Vibm9ybWFsIHkgKi8KKwkgICAgZm9yIChpeSA9IC0xMjYsaT0oaHk8PDgpOyBpPjA7IGk8PD0xKSBpeSAtPTE7CisJfSBlbHNlIGl5ID0gKGh5Pj4yMyktMTI3OworCisgICAgLyogc2V0IHVwIHtoeCxseH0sIHtoeSxseX0gYW5kIGFsaWduIHkgdG8geCAqLworCWlmKGl4ID49IC0xMjYpCisJICAgIGh4ID0gMHgwMDgwMDAwMHwoMHgwMDdmZmZmZiZoeCk7CisJZWxzZSB7CQkvKiBzdWJub3JtYWwgeCwgc2hpZnQgeCB0byBub3JtYWwgKi8KKwkgICAgbiA9IC0xMjYtaXg7CisJICAgIGh4IDw8PSBuOworCX0KKwlpZihpeSA+PSAtMTI2KQorCSAgICBoeSA9IDB4MDA4MDAwMDB8KDB4MDA3ZmZmZmYmaHkpOworCWVsc2UgewkJLyogc3Vibm9ybWFsIHksIHNoaWZ0IHkgdG8gbm9ybWFsICovCisJICAgIG4gPSAtMTI2LWl5OworCSAgICBoeSA8PD0gbjsKKwl9CisKKyAgICAvKiBmaXggcG9pbnQgZm1vZCAqLworCW4gPSBpeCAtIGl5OworCXEgPSAwOworCXdoaWxlKG4tLSkgeworCSAgICBoej1oeC1oeTsKKwkgICAgaWYoaHo8MCkgaHggPSBoeCA8PCAxOworCSAgICBlbHNlIHtoeCA9IGh6IDw8IDE7IHErKzt9CisJICAgIHEgPDw9IDE7CisJfQorCWh6PWh4LWh5OworCWlmKGh6Pj0wKSB7aHg9aHo7cSsrO30KKworICAgIC8qIGNvbnZlcnQgYmFjayB0byBmbG9hdGluZyB2YWx1ZSBhbmQgcmVzdG9yZSB0aGUgc2lnbiAqLworCWlmKGh4PT0wKSB7CQkJCS8qIHJldHVybiBzaWduKHgpKjAgKi8KKwkgICAgKnF1byA9IChzeHkgPyAtcSA6IHEpOworCSAgICByZXR1cm4gWmVyb1sodV9pbnQzMl90KXN4Pj4zMV07CisJfQorCXdoaWxlKGh4PDB4MDA4MDAwMDApIHsJCS8qIG5vcm1hbGl6ZSB4ICovCisJICAgIGh4IDw8PSAxOworCSAgICBpeSAtPSAxOworCX0KKwlpZihpeT49IC0xMjYpIHsJCS8qIG5vcm1hbGl6ZSBvdXRwdXQgKi8KKwkgICAgaHggPSAoKGh4LTB4MDA4MDAwMDApfCgoaXkrMTI3KTw8MjMpKTsKKwl9IGVsc2UgewkJLyogc3Vibm9ybWFsIG91dHB1dCAqLworCSAgICBuID0gLTEyNiAtIGl5OworCSAgICBoeCA+Pj0gbjsKKwl9CitmaXh1cDoKKwlTRVRfRkxPQVRfV09SRCh4LGh4KTsKKwl5ID0gZmFic2YoeSk7CisJaWYgKHkgPCAweDFwLTEyNWYpIHsKKwkgICAgaWYgKHgreD55IHx8ICh4K3g9PXkgJiYgKHEgJiAxKSkpIHsKKwkJcSsrOworCQl4LT15OworCSAgICB9CisJfSBlbHNlIGlmICh4PjAuNWYqeSB8fCAoeD09MC41Zip5ICYmIChxICYgMSkpKSB7CisJICAgIHErKzsKKwkgICAgeC09eTsKKwl9CisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJU0VUX0ZMT0FUX1dPUkQoeCxoeF5zeCk7CisJcSAmPSAweDdmZmZmZmZmOworCSpxdW8gPSAoc3h5ID8gLXEgOiBxKTsKKwlyZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfcmludC5jIGIvbGlibS9zcmMvc19yaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg4ZDdiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfcmludC5jCkBAIC0wLDAgKzEsODcgQEAKKy8qIEAoIylzX3JpbnQuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfcmludC5jLHYgMS4xMyAyMDA1LzEyLzAzIDA3OjM4OjM1IGJkZSBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIHJpbnQoeCkKKyAqIFJldHVybiB4IHJvdW5kZWQgdG8gaW50ZWdyYWwgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBwcmV2YWlsaW5nCisgKiByb3VuZGluZyBtb2RlLgorICogTWV0aG9kOgorICoJVXNpbmcgZmxvYXRpbmcgYWRkaXRpb24uCisgKiBFeGNlcHRpb246CisgKglJbmV4YWN0IGZsYWcgcmFpc2VkIGlmIHggbm90IGVxdWFsIHRvIHJpbnQoeCkuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQorVFdPNTJbMl09eworICA0LjUwMzU5OTYyNzM3MDQ5NjAwMDAwZSsxNSwgLyogMHg0MzMwMDAwMCwgMHgwMDAwMDAwMCAqLworIC00LjUwMzU5OTYyNzM3MDQ5NjAwMDAwZSsxNSwgLyogMHhDMzMwMDAwMCwgMHgwMDAwMDAwMCAqLworfTsKKworZG91YmxlCityaW50KGRvdWJsZSB4KQoreworCWludDMyX3QgaTAsajAsc3g7CisJdV9pbnQzMl90IGksaTE7CisJZG91YmxlIHcsdDsKKwlFWFRSQUNUX1dPUkRTKGkwLGkxLHgpOworCXN4ID0gKGkwPj4zMSkmMTsKKwlqMCA9ICgoaTA+PjIwKSYweDdmZiktMHgzZmY7CisJaWYoajA8MjApIHsKKwkgICAgaWYoajA8MCkgeworCQlpZigoKGkwJjB4N2ZmZmZmZmYpfGkxKT09MCkgcmV0dXJuIHg7CisJCWkxIHw9IChpMCYweDBmZmZmZik7CisJCWkwICY9IDB4ZmZmZTAwMDA7CisJCWkwIHw9ICgoaTF8LWkxKT4+MTIpJjB4ODAwMDA7CisJCVNFVF9ISUdIX1dPUkQoeCxpMCk7CisJICAgICAgICB3ID0gVFdPNTJbc3hdK3g7CisJICAgICAgICB0ID0gIHctVFdPNTJbc3hdOworCQlHRVRfSElHSF9XT1JEKGkwLHQpOworCQlTRVRfSElHSF9XT1JEKHQsKGkwJjB4N2ZmZmZmZmYpfChzeDw8MzEpKTsKKwkgICAgICAgIHJldHVybiB0OworCSAgICB9IGVsc2UgeworCQlpID0gKDB4MDAwZmZmZmYpPj5qMDsKKwkJaWYoKChpMCZpKXxpMSk9PTApIHJldHVybiB4OyAvKiB4IGlzIGludGVncmFsICovCisJCWk+Pj0xOworCQlpZigoKGkwJmkpfGkxKSE9MCkgeworCQkgICAgLyoKKwkJICAgICAqIFNvbWUgYml0IGlzIHNldCBhZnRlciB0aGUgMC41IGJpdC4gIFRvIGF2b2lkIHRoZQorCQkgICAgICogcG9zc2liaWxpdHkgb2YgZXJyb3JzIGZyb20gZG91YmxlIHJvdW5kaW5nIGluCisJCSAgICAgKiB3ID0gVFdPNTJbc3hdK3gsIGFkanVzdCB0aGUgMC4yNSBiaXQgdG8gYSBsb3dlcgorCQkgICAgICogZ3VhcmQgYml0LiAgV2UgZG8gdGhpcyBmb3IgYWxsIGowPD01MS4gIFRoZQorCQkgICAgICogYWRqdXN0bWVudCBpcyB0cmlja2llc3QgZm9yIGowPT0xOCBhbmQgajA9PTE5CisJCSAgICAgKiBzaW5jZSB0aGVuIGl0IHNwYW5zIHRoZSB3b3JkIGJvdW5kYXJ5LgorCQkgICAgICovCisJCSAgICBpZihqMD09MTkpIGkxID0gMHg0MDAwMDAwMDsgZWxzZQorCQkgICAgaWYoajA9PTE4KSBpMSA9IDB4ODAwMDAwMDA7IGVsc2UKKwkJICAgIGkwID0gKGkwJih+aSkpfCgoMHgyMDAwMCk+PmowKTsKKwkJfQorCSAgICB9CisJfSBlbHNlIGlmIChqMD41MSkgeworCSAgICBpZihqMD09MHg0MDApIHJldHVybiB4K3g7CS8qIGluZiBvciBOYU4gKi8KKwkgICAgZWxzZSByZXR1cm4geDsJCS8qIHggaXMgaW50ZWdyYWwgKi8KKwl9IGVsc2UgeworCSAgICBpID0gKCh1X2ludDMyX3QpKDB4ZmZmZmZmZmYpKT4+KGowLTIwKTsKKwkgICAgaWYoKGkxJmkpPT0wKSByZXR1cm4geDsJLyogeCBpcyBpbnRlZ3JhbCAqLworCSAgICBpPj49MTsKKwkgICAgaWYoKGkxJmkpIT0wKSBpMSA9IChpMSYofmkpKXwoKDB4NDAwMDAwMDApPj4oajAtMjApKTsKKwl9CisJSU5TRVJUX1dPUkRTKHgsaTAsaTEpOworCSoodm9sYXRpbGUgZG91YmxlICopJncgPSBUV081MltzeF0reDsJLyogY2xpcCBhbnkgZXh0cmEgcHJlY2lzaW9uICovCisJcmV0dXJuIHctVFdPNTJbc3hdOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19yaW50Zi5jIGIvbGlibS9zcmMvc19yaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NzQyMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3JpbnRmLmMKQEAgLTAsMCArMSw1MiBAQAorLyogc19yaW50Zi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19yaW50LmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3JpbnRmLmMsdiAxLjEwIDIwMDUvMTIvMDMgMDk6MDA6MjkgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK1RXTzIzWzJdPXsKKyAgOC4zODg2MDgwMDAwZSswNiwgLyogMHg0YjAwMDAwMCAqLworIC04LjM4ODYwODAwMDBlKzA2LCAvKiAweGNiMDAwMDAwICovCit9OworCitmbG9hdAorcmludGYoZmxvYXQgeCkKK3sKKwlpbnQzMl90IGkwLGowLHN4OworCXZvbGF0aWxlIGZsb2F0IHcsdDsJLyogdm9sYXRpbGUgd29ya3MgYXJvdW5kIGdjYyBidWcgKi8KKwlHRVRfRkxPQVRfV09SRChpMCx4KTsKKwlzeCA9IChpMD4+MzEpJjE7CisJajAgPSAoKGkwPj4yMykmMHhmZiktMHg3ZjsKKwlpZihqMDwyMykgeworCSAgICBpZihqMDwwKSB7CisJCWlmKChpMCYweDdmZmZmZmZmKT09MCkgcmV0dXJuIHg7CisJICAgICAgICB3ID0gVFdPMjNbc3hdK3g7CisJICAgICAgICB0ID0gIHctVFdPMjNbc3hdOworCQlHRVRfRkxPQVRfV09SRChpMCx0KTsKKwkJU0VUX0ZMT0FUX1dPUkQodCwoaTAmMHg3ZmZmZmZmZil8KHN4PDwzMSkpOworCSAgICAgICAgcmV0dXJuIHQ7CisJICAgIH0KKwkgICAgdyA9IFRXTzIzW3N4XSt4OworCSAgICByZXR1cm4gdy1UV08yM1tzeF07CisJfQorCWlmKGowPT0weDgwKSByZXR1cm4geCt4OwkvKiBpbmYgb3IgTmFOICovCisJZWxzZSByZXR1cm4geDsJCQkvKiB4IGlzIGludGVncmFsICovCit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3JvdW5kLmMgYi9saWJtL3NyYy9zX3JvdW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc0YzExOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3Nfcm91bmQuYwpAQCAtMCwwICsxLDUxIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMywgU3RldmVuIEcuIEthcmdsCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSB1bm1vZGlmaWVkLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3Nfcm91bmQuYyx2IDEuNCAyMDA1LzEyLzAyIDEzOjQ1OjA2IGJkZSBFeHAgJCIpOyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCitkb3VibGUKK3JvdW5kKGRvdWJsZSB4KQoreworCWRvdWJsZSB0OworCisJaWYgKCFpc2Zpbml0ZSh4KSkKKwkJcmV0dXJuICh4KTsKKworCWlmICh4ID49IDAuMCkgeworCQl0ID0gZmxvb3IoeCk7CisJCWlmICh0IC0geCA8PSAtMC41KQorCQkJdCArPSAxLjA7CisJCXJldHVybiAodCk7CisJfSBlbHNlIHsKKwkJdCA9IGZsb29yKC14KTsKKwkJaWYgKHQgKyB4IDw9IC0wLjUpCisJCQl0ICs9IDEuMDsKKwkJcmV0dXJuICgtdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19yb3VuZGYuYyBiL2xpYm0vc3JjL3Nfcm91bmRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIzYmU5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3Nfcm91bmRmLmMKQEAgLTAsMCArMSw1MSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIFN0ZXZlbiBHLiBLYXJnbAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UgdW5tb2RpZmllZCwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3JvdW5kZi5jLHYgMS40IDIwMDUvMTIvMDIgMTM6NDU6MDYgYmRlIEV4cCAkIik7ICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKK2Zsb2F0Cityb3VuZGYoZmxvYXQgeCkKK3sKKwlmbG9hdCB0OworCisJaWYgKCFpc2Zpbml0ZSh4KSkKKwkJcmV0dXJuICh4KTsKKworCWlmICh4ID49IDAuMCkgeworCQl0ID0gZmxvb3JmKHgpOworCQlpZiAodCAtIHggPD0gLTAuNSkKKwkJCXQgKz0gMS4wOworCQlyZXR1cm4gKHQpOworCX0gZWxzZSB7CisJCXQgPSBmbG9vcmYoLXgpOworCQlpZiAodCArIHggPD0gLTAuNSkKKwkJCXQgKz0gMS4wOworCQlyZXR1cm4gKC10KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3JvdW5kbC5jIGIvbGlibS9zcmMvc19yb3VuZGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjVmMzMwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19yb3VuZGwuYwpAQCAtMCwwICsxLDUxIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMywgU3RldmVuIEcuIEthcmdsCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSB1bm1vZGlmaWVkLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3Nfcm91bmRsLmMsdiAxLjIgMjAwNS8xMi8wMiAxMzo0NTowNiBiZGUgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworbG9uZyBkb3VibGUKK3JvdW5kbChsb25nIGRvdWJsZSB4KQoreworCWxvbmcgZG91YmxlIHQ7CisKKwlpZiAoIWlzZmluaXRlKHgpKQorCQlyZXR1cm4gKHgpOworCisJaWYgKHggPj0gMC4wKSB7CisJCXQgPSBmbG9vcmwoeCk7CisJCWlmICh0IC0geCA8PSAtMC41KQorCQkJdCArPSAxLjA7CisJCXJldHVybiAodCk7CisJfSBlbHNlIHsKKwkJdCA9IGZsb29ybCgteCk7CisJCWlmICh0ICsgeCA8PSAtMC41KQorCQkJdCArPSAxLjA7CisJCXJldHVybiAoLXQpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3Nfc2NhbGJsbi5jIGIvbGlibS9zcmMvc19zY2FsYmxuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE5MDhkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3Nfc2NhbGJsbi5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3Nfc2NhbGJsbi5jLHYgMS4yIDIwMDUvMDMvMDcgMDQ6NTc6NTAgZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKK2RvdWJsZQorc2NhbGJsbiAoZG91YmxlIHgsIGxvbmcgbikKK3sKKwlpbnQgaW47CisKKwlpbiA9IChpbnQpbjsKKwlpZiAoaW4gIT0gbikgeworCQlpZiAobiA+IDApCisJCQlpbiA9IElOVF9NQVg7CisJCWVsc2UKKwkJCWluID0gSU5UX01JTjsKKwl9CisJcmV0dXJuIChzY2FsYm4oeCwgaW4pKTsKK30KKworZmxvYXQKK3NjYWxibG5mIChmbG9hdCB4LCBsb25nIG4pCit7CisJaW50IGluOworCisJaW4gPSAoaW50KW47CisJaWYgKGluICE9IG4pIHsKKwkJaWYgKG4gPiAwKQorCQkJaW4gPSBJTlRfTUFYOworCQllbHNlCisJCQlpbiA9IElOVF9NSU47CisJfQorCXJldHVybiAoc2NhbGJuZih4LCBpbikpOworfQorCitsb25nIGRvdWJsZQorc2NhbGJsbmwgKGxvbmcgZG91YmxlIHgsIGxvbmcgbikKK3sKKwlpbnQgaW47CisKKwlpbiA9IChpbnQpbjsKKwlpZiAoaW4gIT0gbikgeworCQlpZiAobiA+IDApCisJCQlpbiA9IElOVF9NQVg7CisJCWVsc2UKKwkJCWluID0gSU5UX01JTjsKKwl9CisJcmV0dXJuIChzY2FsYm5sKHgsIChpbnQpbikpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19zY2FsYm4uYyBiL2xpYm0vc3JjL3Nfc2NhbGJuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIxOGMxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3Nfc2NhbGJuLmMKQEAgLTAsMCArMSw3OSBAQAorLyogQCgjKXNfc2NhbGJuLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3NjYWxibi5jLHYgMS4xMSAyMDA1LzAzLzA3IDIxOjI3OjM3IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIHNjYWxibiAoZG91YmxlIHgsIGludCBuKQorICogc2NhbGJuKHgsbikgcmV0dXJucyB4KiAyKipuICBjb21wdXRlZCBieSAgZXhwb25lbnQKKyAqIG1hbmlwdWxhdGlvbiByYXRoZXIgdGhhbiBieSBhY3R1YWxseSBwZXJmb3JtaW5nIGFuCisgKiBleHBvbmVudGlhdGlvbiBvciBhIG11bHRpcGxpY2F0aW9uLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlCit0d281NCAgID0gIDEuODAxNDM5ODUwOTQ4MTk4NDAwMDBlKzE2LCAvKiAweDQzNTAwMDAwLCAweDAwMDAwMDAwICovCit0d29tNTQgID0gIDUuNTUxMTE1MTIzMTI1NzgyNzAyMTJlLTE3LCAvKiAweDNDOTAwMDAwLCAweDAwMDAwMDAwICovCitodWdlICAgPSAxLjBlKzMwMCwKK3RpbnkgICA9IDEuMGUtMzAwOworCitkb3VibGUKK3NjYWxibiAoZG91YmxlIHgsIGludCBuKQoreworCWludDMyX3QgayxoeCxseDsKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworICAgICAgICBrID0gKGh4JjB4N2ZmMDAwMDApPj4yMDsJCS8qIGV4dHJhY3QgZXhwb25lbnQgKi8KKyAgICAgICAgaWYgKGs9PTApIHsJCQkJLyogMCBvciBzdWJub3JtYWwgeCAqLworICAgICAgICAgICAgaWYgKChseHwoaHgmMHg3ZmZmZmZmZikpPT0wKSByZXR1cm4geDsgLyogKy0wICovCisJICAgIHggKj0gdHdvNTQ7CisJICAgIEdFVF9ISUdIX1dPUkQoaHgseCk7CisJICAgIGsgPSAoKGh4JjB4N2ZmMDAwMDApPj4yMCkgLSA1NDsKKyAgICAgICAgICAgIGlmIChuPCAtNTAwMDApIHJldHVybiB0aW55Kng7IAkvKnVuZGVyZmxvdyovCisJICAgIH0KKyAgICAgICAgaWYgKGs9PTB4N2ZmKSByZXR1cm4geCt4OwkJLyogTmFOIG9yIEluZiAqLworICAgICAgICBrID0gaytuOworICAgICAgICBpZiAoayA+ICAweDdmZSkgcmV0dXJuIGh1Z2UqY29weXNpZ24oaHVnZSx4KTsgLyogb3ZlcmZsb3cgICovCisgICAgICAgIGlmIChrID4gMCkgCQkJCS8qIG5vcm1hbCByZXN1bHQgKi8KKwkgICAge1NFVF9ISUdIX1dPUkQoeCwoaHgmMHg4MDBmZmZmZil8KGs8PDIwKSk7IHJldHVybiB4O30KKyAgICAgICAgaWYgKGsgPD0gLTU0KQorICAgICAgICAgICAgaWYgKG4gPiA1MDAwMCkgCS8qIGluIGNhc2UgaW50ZWdlciBvdmVyZmxvdyBpbiBuK2sgKi8KKwkJcmV0dXJuIGh1Z2UqY29weXNpZ24oaHVnZSx4KTsJLypvdmVyZmxvdyovCisJICAgIGVsc2UgcmV0dXJuIHRpbnkqY29weXNpZ24odGlueSx4KTsgCS8qdW5kZXJmbG93Ki8KKyAgICAgICAgayArPSA1NDsJCQkJLyogc3Vibm9ybWFsIHJlc3VsdCAqLworCVNFVF9ISUdIX1dPUkQoeCwoaHgmMHg4MDBmZmZmZil8KGs8PDIwKSk7CisgICAgICAgIHJldHVybiB4KnR3b201NDsKK30KKworLy8gdGhpcyBpcyBub3JtYWxseSBpbiBGcmVlQlNEJ3MgbGliYy4KK2RvdWJsZQorbGRleHAgKGRvdWJsZSB4LCBpbnQgbikKK3sKKyAgICByZXR1cm4gc2NhbGJuKHgsbik7Cit9CisKKyNpZiAoTERCTF9NQU5UX0RJRyA9PSA1MykgICAgLy9YWFg6IGJyaWFuIEZJWE1FIF9fd2Vha19yZWZlcmVuY2UgZG9lc24gd29yaworbG9uZyBkb3VibGUgbGRleHBsIChsb25nIGRvdWJsZSB4LCBpbnQgbikgeworICAgIHJldHVybiBzY2FsYm4oKGRvdWJsZSl4LG4pOworfQorbG9uZyBkb3VibGUgc2NhbGJubCAobG9uZyBkb3VibGUgeCwgaW50IG4pIHsKKyAgICByZXR1cm4gc2NhbGJuKChkb3VibGUpeCxuKTsKK30KK19fd2Vha19yZWZlcmVuY2Uoc2NhbGJuLCBsZGV4cGwpOworX193ZWFrX3JlZmVyZW5jZShzY2FsYm4sIHNjYWxibmwpOworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3NjYWxibmYuYyBiL2xpYm0vc3JjL3Nfc2NhbGJuZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YzdiYWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3NjYWxibmYuYwpAQCAtMCwwICsxLDU4IEBACisvKiBzX3NjYWxibmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfc2NhbGJuLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3NjYWxibmYuYyx2IDEuOCAyMDA1LzAzLzA3IDA0OjUyOjQzIGRhcyBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK3R3bzI1ICAgPSAgMy4zNTU0NDMyMDBlKzA3LAkvKiAweDRjMDAwMDAwICovCit0d29tMjUgID0gIDIuOTgwMjMyMjM4OGUtMDgsCS8qIDB4MzMwMDAwMDAgKi8KK2h1Z2UgICA9IDEuMGUrMzAsCit0aW55ICAgPSAxLjBlLTMwOworCitmbG9hdAorc2NhbGJuZiAoZmxvYXQgeCwgaW50IG4pCit7CisJaW50MzJfdCBrLGl4OworCUdFVF9GTE9BVF9XT1JEKGl4LHgpOworICAgICAgICBrID0gKGl4JjB4N2Y4MDAwMDApPj4yMzsJCS8qIGV4dHJhY3QgZXhwb25lbnQgKi8KKyAgICAgICAgaWYgKGs9PTApIHsJCQkJLyogMCBvciBzdWJub3JtYWwgeCAqLworICAgICAgICAgICAgaWYgKChpeCYweDdmZmZmZmZmKT09MCkgcmV0dXJuIHg7IC8qICstMCAqLworCSAgICB4ICo9IHR3bzI1OworCSAgICBHRVRfRkxPQVRfV09SRChpeCx4KTsKKwkgICAgayA9ICgoaXgmMHg3ZjgwMDAwMCk+PjIzKSAtIDI1OworICAgICAgICAgICAgaWYgKG48IC01MDAwMCkgcmV0dXJuIHRpbnkqeDsgCS8qdW5kZXJmbG93Ki8KKwkgICAgfQorICAgICAgICBpZiAoaz09MHhmZikgcmV0dXJuIHgreDsJCS8qIE5hTiBvciBJbmYgKi8KKyAgICAgICAgayA9IGsrbjsKKyAgICAgICAgaWYgKGsgPiAgMHhmZSkgcmV0dXJuIGh1Z2UqY29weXNpZ25mKGh1Z2UseCk7IC8qIG92ZXJmbG93ICAqLworICAgICAgICBpZiAoayA+IDApIAkJCQkvKiBub3JtYWwgcmVzdWx0ICovCisJICAgIHtTRVRfRkxPQVRfV09SRCh4LChpeCYweDgwN2ZmZmZmKXwoazw8MjMpKTsgcmV0dXJuIHg7fQorICAgICAgICBpZiAoayA8PSAtMjUpCisgICAgICAgICAgICBpZiAobiA+IDUwMDAwKSAJLyogaW4gY2FzZSBpbnRlZ2VyIG92ZXJmbG93IGluIG4rayAqLworCQlyZXR1cm4gaHVnZSpjb3B5c2lnbmYoaHVnZSx4KTsJLypvdmVyZmxvdyovCisJICAgIGVsc2UgcmV0dXJuIHRpbnkqY29weXNpZ25mKHRpbnkseCk7CS8qdW5kZXJmbG93Ki8KKyAgICAgICAgayArPSAyNTsJCQkJLyogc3Vibm9ybWFsIHJlc3VsdCAqLworCVNFVF9GTE9BVF9XT1JEKHgsKGl4JjB4ODA3ZmZmZmYpfChrPDwyMykpOworICAgICAgICByZXR1cm4geCp0d29tMjU7Cit9CisKK19fc3Ryb25nX3JlZmVyZW5jZShzY2FsYm5mLCBsZGV4cGYpOwpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19zY2FsYm5sLmMgYi9saWJtL3NyYy9zX3NjYWxibmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjQ1ZDAwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19zY2FsYm5sLmMKQEAgLTAsMCArMSw3MSBAQAorLyogQCgjKXNfc2NhbGJuLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3NjYWxibmwuYyx2IDEuMSAyMDA1LzAzLzA3IDA0OjUyOjU4IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIHNjYWxibmwgKGxvbmcgZG91YmxlIHgsIGludCBuKQorICogc2NhbGJubCh4LG4pIHJldHVybnMgeCogMioqbiAgY29tcHV0ZWQgYnkgIGV4cG9uZW50CisgKiBtYW5pcHVsYXRpb24gcmF0aGVyIHRoYW4gYnkgYWN0dWFsbHkgcGVyZm9ybWluZyBhbgorICogZXhwb25lbnRpYXRpb24gb3IgYSBtdWx0aXBsaWNhdGlvbi4KKyAqLworCisvKgorICogV2UgYXNzdW1lIHRoYXQgYSBsb25nIGRvdWJsZSBoYXMgYSAxNS1iaXQgZXhwb25lbnQuICBPbiBzeXN0ZW1zCisgKiB3aGVyZSBsb25nIGRvdWJsZSBpcyB0aGUgc2FtZSBhcyBkb3VibGUsIHNjYWxibmwoKSBpcyBhbiBhbGlhcworICogZm9yIHNjYWxibigpLCBzbyB3ZSBkb24ndCB1c2UgdGhpcyByb3V0aW5lLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorCisjaWYgTERCTF9NQVhfRVhQICE9IDB4NDAwMAorI2Vycm9yICJVbnN1cHBvcnRlZCBsb25nIGRvdWJsZSBmb3JtYXQiCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGxvbmcgZG91YmxlCitodWdlID0gMHgxcDE2MDAwTCwKK3RpbnkgPSAweDFwLTE2MDAwTDsKKworbG9uZyBkb3VibGUKK3NjYWxibmwgKGxvbmcgZG91YmxlIHgsIGludCBuKQoreworCXVuaW9uIElFRUVsMmJpdHMgdTsKKwlpbnQgazsKKwl1LmUgPSB4OworICAgICAgICBrID0gdS5iaXRzLmV4cDsJCQkJLyogZXh0cmFjdCBleHBvbmVudCAqLworICAgICAgICBpZiAoaz09MCkgewkJCQkvKiAwIG9yIHN1Ym5vcm1hbCB4ICovCisgICAgICAgICAgICBpZiAoKHUuYml0cy5tYW5ofHUuYml0cy5tYW5sKT09MCkgcmV0dXJuIHg7CS8qICstMCAqLworCSAgICB1LmUgKj0gMHgxcCsxMjg7CisJICAgIGsgPSB1LmJpdHMuZXhwIC0gMTI4OworICAgICAgICAgICAgaWYgKG48IC01MDAwMCkgcmV0dXJuIHRpbnkqeDsgCS8qdW5kZXJmbG93Ki8KKwkgICAgfQorICAgICAgICBpZiAoaz09MHg3ZmZmKSByZXR1cm4geCt4OwkJLyogTmFOIG9yIEluZiAqLworICAgICAgICBrID0gaytuOworICAgICAgICBpZiAoayA+PSAweDdmZmYpIHJldHVybiBodWdlKmNvcHlzaWdubChodWdlLHgpOyAvKiBvdmVyZmxvdyAgKi8KKyAgICAgICAgaWYgKGsgPiAwKSAJCQkJLyogbm9ybWFsIHJlc3VsdCAqLworCSAgICB7dS5iaXRzLmV4cCA9IGs7IHJldHVybiB1LmU7fQorICAgICAgICBpZiAoayA8PSAtMTI4KQorICAgICAgICAgICAgaWYgKG4gPiA1MDAwMCkgCS8qIGluIGNhc2UgaW50ZWdlciBvdmVyZmxvdyBpbiBuK2sgKi8KKwkJcmV0dXJuIGh1Z2UqY29weXNpZ24oaHVnZSx4KTsJLypvdmVyZmxvdyovCisJICAgIGVsc2UgcmV0dXJuIHRpbnkqY29weXNpZ24odGlueSx4KTsgCS8qdW5kZXJmbG93Ki8KKyAgICAgICAgayArPSAxMjg7CQkJCS8qIHN1Ym5vcm1hbCByZXN1bHQgKi8KKwl1LmJpdHMuZXhwID0gazsKKyAgICAgICAgcmV0dXJuIHUuZSoweDFwLTEyODsKK30KKworX19zdHJvbmdfcmVmZXJlbmNlKHNjYWxibmwsIGxkZXhwbCk7CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3NpZ25iaXQuYyBiL2xpYm0vc3JjL3Nfc2lnbmJpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYzA4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3NpZ25iaXQuYwpAQCAtMCwwICsxLDU4IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWtlIEJhcmNyb2Z0IDxtaWtlQEZyZWVCU0Qub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3NpZ25iaXQuYyx2IDEuMSAyMDA0LzA3LzE5IDA4OjE2OjEwIGRhcyBFeHAgJAorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworaW50CitfX3NpZ25iaXQoZG91YmxlIGQpCit7CisJdW5pb24gSUVFRWQyYml0cyB1OworCisJdS5kID0gZDsKKwlyZXR1cm4gKHUuYml0cy5zaWduKTsKK30KKworaW50CitfX3NpZ25iaXRmKGZsb2F0IGYpCit7CisJdW5pb24gSUVFRWYyYml0cyB1OworCisJdS5mID0gZjsKKwlyZXR1cm4gKHUuYml0cy5zaWduKTsKK30KKworaW50CitfX3NpZ25iaXRsKGxvbmcgZG91YmxlIGUpCit7CisJdW5pb24gSUVFRWwyYml0cyB1OworCisJdS5lID0gZTsKKwlyZXR1cm4gKHUuYml0cy5zaWduKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3Nfc2lnbmdhbS5jIGIvbGlibS9zcmMvc19zaWduZ2FtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY3ZDU5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3Nfc2lnbmdhbS5jCkBAIC0wLDAgKzEsMyBAQAorI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKK2ludCBzaWduZ2FtID0gMDsKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3Nfc2lnbmlmaWNhbmQuYyBiL2xpYm0vc3JjL3Nfc2lnbmlmaWNhbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGJiMzAzCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19zaWduaWZpY2FuZC5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIEAoIylzX3NpZ25pZi5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19zaWduaWZpY2FuZC5jLHYgMS45IDIwMDMvMDcvMjMgMDQ6NTM6NDcgcGV0ZXIgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBzaWduaWZpY2FuZCh4KSBjb21wdXRlcyBqdXN0CisgKiAJc2NhbGIoeCwgKGRvdWJsZSkgLWlsb2diKHgpKSwKKyAqIGZvciBleGVyY2lzaW5nIHRoZSBmcmFjdGlvbi1wYXJ0KEYpIElFRUUgNzU0LTE5ODUgdGVzdCB2ZWN0b3IuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZG91YmxlCitzaWduaWZpY2FuZChkb3VibGUgeCkKK3sKKwlyZXR1cm4gX19pZWVlNzU0X3NjYWxiKHgsKGRvdWJsZSkgLWlsb2diKHgpKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3Nfc2lnbmlmaWNhbmRmLmMgYi9saWJtL3NyYy9zX3NpZ25pZmljYW5kZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZTM0MWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3NpZ25pZmljYW5kZi5jCkBAIC0wLDAgKzEsMjcgQEAKKy8qIHNfc2lnbmlmaWNhbmRmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX3NpZ25pZmljYW5kLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3NpZ25pZmljYW5kZi5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitmbG9hdAorc2lnbmlmaWNhbmRmKGZsb2F0IHgpCit7CisJcmV0dXJuIF9faWVlZTc1NF9zY2FsYmYoeCwoZmxvYXQpIC1pbG9nYmYoeCkpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19zaW4uYyBiL2xpYm0vc3JjL3Nfc2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg5M2UyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3Nfc2luLmMKQEAgLTAsMCArMSw4MiBAQAorLyogQCgjKXNfc2luLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3Npbi5jLHYgMS4xMCAyMDA1LzEwLzI0IDE0OjA4OjM2IGJkZSBFeHAgJCI7CisjZW5kaWYKKworLyogc2luKHgpCisgKiBSZXR1cm4gc2luZSBmdW5jdGlvbiBvZiB4LgorICoKKyAqIGtlcm5lbCBmdW5jdGlvbjoKKyAqCV9fa2VybmVsX3NpbgkJLi4uIHNpbmUgZnVuY3Rpb24gb24gWy1waS80LHBpLzRdCisgKglfX2tlcm5lbF9jb3MJCS4uLiBjb3NlIGZ1bmN0aW9uIG9uIFstcGkvNCxwaS80XQorICoJX19pZWVlNzU0X3JlbV9waW8yCS4uLiBhcmd1bWVudCByZWR1Y3Rpb24gcm91dGluZQorICoKKyAqIE1ldGhvZC4KKyAqICAgICAgTGV0IFMsQyBhbmQgVCBkZW5vdGUgdGhlIHNpbiwgY29zIGFuZCB0YW4gcmVzcGVjdGl2ZWx5IG9uCisgKglbLVBJLzQsICtQSS80XS4gUmVkdWNlIHRoZSBhcmd1bWVudCB4IHRvIHkxK3kyID0geC1rKnBpLzIKKyAqCWluIFstcGkvNCAsICtwaS80XSwgYW5kIGxldCBuID0gayBtb2QgNC4KKyAqCVdlIGhhdmUKKyAqCisgKiAgICAgICAgICBuICAgICAgICBzaW4oeCkgICAgICBjb3MoeCkgICAgICAgIHRhbih4KQorICogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCSAgICAwCSAgICAgICBTCSAgIEMJCSBUCisgKgkgICAgMQkgICAgICAgQwkgIC1TCQktMS9UCisgKgkgICAgMgkgICAgICAtUwkgIC1DCQkgVAorICoJICAgIDMJICAgICAgLUMJICAgUwkJLTEvVAorICogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICogICAgICBMZXQgdHJpZyBiZSBhbnkgb2Ygc2luLCBjb3MsIG9yIHRhbi4KKyAqICAgICAgdHJpZygrLUlORikgIGlzIE5hTiwgd2l0aCBzaWduYWxzOworICogICAgICB0cmlnKE5hTikgICAgaXMgdGhhdCBOYU47CisgKgorICogQWNjdXJhY3k6CisgKglUUklHKHgpIHJldHVybnMgdHJpZyh4KSBuZWFybHkgcm91bmRlZAorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2RvdWJsZQorc2luKGRvdWJsZSB4KQoreworCWRvdWJsZSB5WzJdLHo9MC4wOworCWludDMyX3QgbiwgaXg7CisKKyAgICAvKiBIaWdoIHdvcmQgb2YgeC4gKi8KKwlHRVRfSElHSF9XT1JEKGl4LHgpOworCisgICAgLyogfHh8IH48IHBpLzQgKi8KKwlpeCAmPSAweDdmZmZmZmZmOworCWlmKGl4IDw9IDB4M2ZlOTIxZmIpIHsKKwkgICAgaWYoaXg8MHgzZTQwMDAwMCkJCQkvKiB8eHwgPCAyKiotMjcgKi8KKwkgICAgICAge2lmKChpbnQpeD09MCkgcmV0dXJuIHg7fQkvKiBnZW5lcmF0ZSBpbmV4YWN0ICovCisJICAgIHJldHVybiBfX2tlcm5lbF9zaW4oeCx6LDApOworCX0KKworICAgIC8qIHNpbihJbmYgb3IgTmFOKSBpcyBOYU4gKi8KKwllbHNlIGlmIChpeD49MHg3ZmYwMDAwMCkgcmV0dXJuIHgteDsKKworICAgIC8qIGFyZ3VtZW50IHJlZHVjdGlvbiBuZWVkZWQgKi8KKwllbHNlIHsKKwkgICAgbiA9IF9faWVlZTc1NF9yZW1fcGlvMih4LHkpOworCSAgICBzd2l0Y2gobiYzKSB7CisJCWNhc2UgMDogcmV0dXJuICBfX2tlcm5lbF9zaW4oeVswXSx5WzFdLDEpOworCQljYXNlIDE6IHJldHVybiAgX19rZXJuZWxfY29zKHlbMF0seVsxXSk7CisJCWNhc2UgMjogcmV0dXJuIC1fX2tlcm5lbF9zaW4oeVswXSx5WzFdLDEpOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1fX2tlcm5lbF9jb3MoeVswXSx5WzFdKTsKKwkgICAgfQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3Nfc2luZi5jIGIvbGlibS9zcmMvc19zaW5mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRjM2NhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3Nfc2luZi5jCkBAIC0wLDAgKzEsODIgQEAKKy8qIHNfc2luZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19zaW4uYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICogT3B0aW1pemVkIGJ5IEJydWNlIEQuIEV2YW5zLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3Nfc2luZi5jLHYgMS4xNCAyMDA1LzExLzI4IDA2OjE1OjEwIGJkZSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNkZWZpbmUJSU5MSU5FX0tFUk5FTF9DT1NERgorI2RlZmluZQlJTkxJTkVfS0VSTkVMX1NJTkRGCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisjaW5jbHVkZSAia19jb3NmLmMiCisjaW5jbHVkZSAia19zaW5mLmMiCisKKy8qIFNtYWxsIG11bHRpcGxlcyBvZiBwaS8yIHJvdW5kZWQgdG8gZG91YmxlIHByZWNpc2lvbi4gKi8KK3N0YXRpYyBjb25zdCBkb3VibGUKK3MxcGlvMiA9IDEqTV9QSV8yLAkJCS8qIDB4M0ZGOTIxRkIsIDB4NTQ0NDJEMTggKi8KK3MycGlvMiA9IDIqTV9QSV8yLAkJCS8qIDB4NDAwOTIxRkIsIDB4NTQ0NDJEMTggKi8KK3MzcGlvMiA9IDMqTV9QSV8yLAkJCS8qIDB4NDAxMkQ5N0MsIDB4N0YzMzIxRDIgKi8KK3M0cGlvMiA9IDQqTV9QSV8yOwkJCS8qIDB4NDAxOTIxRkIsIDB4NTQ0NDJEMTggKi8KKworZmxvYXQKK3NpbmYoZmxvYXQgeCkKK3sKKwlmbG9hdCB5WzJdOworCWludDMyX3QgbiwgaHgsIGl4OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSBoeCAmIDB4N2ZmZmZmZmY7CisKKwlpZihpeCA8PSAweDNmNDkwZmRhKSB7CQkvKiB8eHwgfjw9IHBpLzQgKi8KKwkgICAgaWYoaXg8MHgzOTgwMDAwMCkJCS8qIHx4fCA8IDIqKi0xMiAqLworCQlpZigoKGludCl4KT09MCkgcmV0dXJuIHg7CS8qIHggd2l0aCBpbmV4YWN0IGlmIHggIT0gMCAqLworCSAgICByZXR1cm4gX19rZXJuZWxfc2luZGYoeCk7CisJfQorCWlmKGl4PD0weDQwN2I1M2QxKSB7CQkvKiB8eHwgfjw9IDUqcGkvNCAqLworCSAgICBpZihpeDw9MHg0MDE2Y2JlMykgewkvKiB8eHwgfjw9IDNwaS80ICovCisJCWlmKGh4PjApCisJCSAgICByZXR1cm4gX19rZXJuZWxfY29zZGYoeCAtIHMxcGlvMik7CisJCWVsc2UKKwkJICAgIHJldHVybiAtX19rZXJuZWxfY29zZGYoeCArIHMxcGlvMik7CisJICAgIH0gZWxzZQorCQlyZXR1cm4gX19rZXJuZWxfc2luZGYoKGh4ID4gMCA/IHMycGlvMiA6IC1zMnBpbzIpIC0geCk7CisJfQorCWlmKGl4PD0weDQwZTIzMWQ1KSB7CQkvKiB8eHwgfjw9IDkqcGkvNCAqLworCSAgICBpZihpeDw9MHg0MGFmZWRkZikgewkvKiB8eHwgfjw9IDcqcGkvNCAqLworCQlpZihoeD4wKQorCQkgICAgcmV0dXJuIC1fX2tlcm5lbF9jb3NkZih4IC0gczNwaW8yKTsKKwkJZWxzZQorCQkgICAgcmV0dXJuIF9fa2VybmVsX2Nvc2RmKHggKyBzM3BpbzIpOworCSAgICB9IGVsc2UKKwkJcmV0dXJuIF9fa2VybmVsX3NpbmRmKHggKyAoaHggPiAwID8gLXM0cGlvMiA6IHM0cGlvMikpOworCX0KKworICAgIC8qIHNpbihJbmYgb3IgTmFOKSBpcyBOYU4gKi8KKwllbHNlIGlmIChpeD49MHg3ZjgwMDAwMCkgcmV0dXJuIHgteDsKKworICAgIC8qIGdlbmVyYWwgYXJndW1lbnQgcmVkdWN0aW9uIG5lZWRlZCAqLworCWVsc2UgeworCSAgICBuID0gX19pZWVlNzU0X3JlbV9waW8yZih4LHkpOworCSAgICBzd2l0Y2gobiYzKSB7CisJCWNhc2UgMDogcmV0dXJuICBfX2tlcm5lbF9zaW5kZigoZG91YmxlKXlbMF0reVsxXSk7CisJCWNhc2UgMTogcmV0dXJuICBfX2tlcm5lbF9jb3NkZigoZG91YmxlKXlbMF0reVsxXSk7CisJCWNhc2UgMjogcmV0dXJuICBfX2tlcm5lbF9zaW5kZigtKGRvdWJsZSl5WzBdLXlbMV0pOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1fX2tlcm5lbF9jb3NkZigoZG91YmxlKXlbMF0reVsxXSk7CisJICAgIH0KKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3Rhbi5jIGIvbGlibS9zcmMvc190YW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjBiNGEwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc190YW4uYwpAQCAtMCwwICsxLDc2IEBACisvKiBAKCMpc190YW4uYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfdGFuLmMsdiAxLjEwIDIwMDUvMTEvMDIgMTQ6MDE6NDUgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisvKiB0YW4oeCkKKyAqIFJldHVybiB0YW5nZW50IGZ1bmN0aW9uIG9mIHguCisgKgorICoga2VybmVsIGZ1bmN0aW9uOgorICoJX19rZXJuZWxfdGFuCQkuLi4gdGFuZ2VudCBmdW5jdGlvbiBvbiBbLXBpLzQscGkvNF0KKyAqCV9faWVlZTc1NF9yZW1fcGlvMgkuLi4gYXJndW1lbnQgcmVkdWN0aW9uIHJvdXRpbmUKKyAqCisgKiBNZXRob2QuCisgKiAgICAgIExldCBTLEMgYW5kIFQgZGVub3RlIHRoZSBzaW4sIGNvcyBhbmQgdGFuIHJlc3BlY3RpdmVseSBvbgorICoJWy1QSS80LCArUEkvNF0uIFJlZHVjZSB0aGUgYXJndW1lbnQgeCB0byB5MSt5MiA9IHgtaypwaS8yCisgKglpbiBbLXBpLzQgLCArcGkvNF0sIGFuZCBsZXQgbiA9IGsgbW9kIDQuCisgKglXZSBoYXZlCisgKgorICogICAgICAgICAgbiAgICAgICAgc2luKHgpICAgICAgY29zKHgpICAgICAgICB0YW4oeCkKKyAqICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgkgICAgMAkgICAgICAgUwkgICBDCQkgVAorICoJICAgIDEJICAgICAgIEMJICAtUwkJLTEvVAorICoJICAgIDIJICAgICAgLVMJICAtQwkJIFQKKyAqCSAgICAzCSAgICAgIC1DCSAgIFMJCS0xL1QKKyAqICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqICAgICAgTGV0IHRyaWcgYmUgYW55IG9mIHNpbiwgY29zLCBvciB0YW4uCisgKiAgICAgIHRyaWcoKy1JTkYpICBpcyBOYU4sIHdpdGggc2lnbmFsczsKKyAqICAgICAgdHJpZyhOYU4pICAgIGlzIHRoYXQgTmFOOworICoKKyAqIEFjY3VyYWN5OgorICoJVFJJRyh4KSByZXR1cm5zIHRyaWcoeCkgbmVhcmx5IHJvdW5kZWQKKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitkb3VibGUKK3Rhbihkb3VibGUgeCkKK3sKKwlkb3VibGUgeVsyXSx6PTAuMDsKKwlpbnQzMl90IG4sIGl4OworCisgICAgLyogSGlnaCB3b3JkIG9mIHguICovCisJR0VUX0hJR0hfV09SRChpeCx4KTsKKworICAgIC8qIHx4fCB+PCBwaS80ICovCisJaXggJj0gMHg3ZmZmZmZmZjsKKwlpZihpeCA8PSAweDNmZTkyMWZiKSB7CisJICAgIGlmKGl4PDB4M2UzMDAwMDApCQkJLyogeCA8IDIqKi0yOCAqLworCQlpZigoaW50KXg9PTApIHJldHVybiB4OwkJLyogZ2VuZXJhdGUgaW5leGFjdCAqLworCSAgICByZXR1cm4gX19rZXJuZWxfdGFuKHgseiwxKTsKKwl9CisKKyAgICAvKiB0YW4oSW5mIG9yIE5hTikgaXMgTmFOICovCisJZWxzZSBpZiAoaXg+PTB4N2ZmMDAwMDApIHJldHVybiB4LXg7CQkvKiBOYU4gKi8KKworICAgIC8qIGFyZ3VtZW50IHJlZHVjdGlvbiBuZWVkZWQgKi8KKwllbHNlIHsKKwkgICAgbiA9IF9faWVlZTc1NF9yZW1fcGlvMih4LHkpOworCSAgICByZXR1cm4gX19rZXJuZWxfdGFuKHlbMF0seVsxXSwxLSgobiYxKTw8MSkpOyAvKiAgIDEgLS0gbiBldmVuCisJCQkJCQkJLTEgLS0gbiBvZGQgKi8KKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3RhbmYuYyBiL2xpYm0vc3JjL3NfdGFuZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlODBkNjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3RhbmYuYwpAQCAtMCwwICsxLDY5IEBACisvKiBzX3RhbmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfdGFuLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqIE9wdGltaXplZCBieSBCcnVjZSBELiBFdmFucy4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3RhbmYuYyx2IDEuMTQgMjAwNS8xMS8yOCAwNTozNTozMiBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjZGVmaW5lCUlOTElORV9LRVJORUxfVEFOREYKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJrX3RhbmYuYyIKKworLyogU21hbGwgbXVsdGlwbGVzIG9mIHBpLzIgcm91bmRlZCB0byBkb3VibGUgcHJlY2lzaW9uLiAqLworc3RhdGljIGNvbnN0IGRvdWJsZQordDFwaW8yID0gMSpNX1BJXzIsCQkJLyogMHgzRkY5MjFGQiwgMHg1NDQ0MkQxOCAqLwordDJwaW8yID0gMipNX1BJXzIsCQkJLyogMHg0MDA5MjFGQiwgMHg1NDQ0MkQxOCAqLwordDNwaW8yID0gMypNX1BJXzIsCQkJLyogMHg0MDEyRDk3QywgMHg3RjMzMjFEMiAqLwordDRwaW8yID0gNCpNX1BJXzI7CQkJLyogMHg0MDE5MjFGQiwgMHg1NDQ0MkQxOCAqLworCitmbG9hdAordGFuZihmbG9hdCB4KQoreworCWZsb2F0IHlbMl07CisJaW50MzJfdCBuLCBoeCwgaXg7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4ICYgMHg3ZmZmZmZmZjsKKworCWlmKGl4IDw9IDB4M2Y0OTBmZGEpIHsJCS8qIHx4fCB+PD0gcGkvNCAqLworCSAgICBpZihpeDwweDM5ODAwMDAwKQkJLyogfHh8IDwgMioqLTEyICovCisJCWlmKCgoaW50KXgpPT0wKSByZXR1cm4geDsJLyogeCB3aXRoIGluZXhhY3QgaWYgeCAhPSAwICovCisJICAgIHJldHVybiBfX2tlcm5lbF90YW5kZih4LDEpOworCX0KKwlpZihpeDw9MHg0MDdiNTNkMSkgewkJLyogfHh8IH48PSA1KnBpLzQgKi8KKwkgICAgaWYoaXg8PTB4NDAxNmNiZTMpCQkvKiB8eHwgfjw9IDNwaS80ICovCisJCXJldHVybiBfX2tlcm5lbF90YW5kZih4ICsgKGh4PjAgPyAtdDFwaW8yIDogdDFwaW8yKSwgLTEpOworCSAgICBlbHNlCisJCXJldHVybiBfX2tlcm5lbF90YW5kZih4ICsgKGh4PjAgPyAtdDJwaW8yIDogdDJwaW8yKSwgMSk7CisJfQorCWlmKGl4PD0weDQwZTIzMWQ1KSB7CQkvKiB8eHwgfjw9IDkqcGkvNCAqLworCSAgICBpZihpeDw9MHg0MGFmZWRkZikJCS8qIHx4fCB+PD0gNypwaS80ICovCisJCXJldHVybiBfX2tlcm5lbF90YW5kZih4ICsgKGh4PjAgPyAtdDNwaW8yIDogdDNwaW8yKSwgLTEpOworCSAgICBlbHNlCisJCXJldHVybiBfX2tlcm5lbF90YW5kZih4ICsgKGh4PjAgPyAtdDRwaW8yIDogdDRwaW8yKSwgMSk7CisJfQorCisgICAgLyogdGFuKEluZiBvciBOYU4pIGlzIE5hTiAqLworCWVsc2UgaWYgKGl4Pj0weDdmODAwMDAwKSByZXR1cm4geC14OworCisgICAgLyogZ2VuZXJhbCBhcmd1bWVudCByZWR1Y3Rpb24gbmVlZGVkICovCisJZWxzZSB7CisJICAgIG4gPSBfX2llZWU3NTRfcmVtX3BpbzJmKHgseSk7CisJICAgIC8qIGludGVnZXIgcGFyYW1ldGVyOiAxIC0tIG4gZXZlbjsgLTEgLS0gbiBvZGQgKi8KKwkgICAgcmV0dXJuIF9fa2VybmVsX3RhbmRmKChkb3VibGUpeVswXSt5WzFdLDEtKChuJjEpPDwxKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc190YW5oLmMgYi9saWJtL3NyYy9zX3RhbmguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzI5MTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc190YW5oLmMKQEAgLTAsMCArMSw3OCBAQAorLyogQCgjKXNfdGFuaC5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc190YW5oLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKy8qIFRhbmgoeCkKKyAqIFJldHVybiB0aGUgSHlwZXJib2xpYyBUYW5nZW50IG9mIHgKKyAqCisgKiBNZXRob2QgOgorICoJCQkJICAgICAgIHggICAgLXgKKyAqCQkJCSAgICAgIGUgIC0gZQorICoJMC4gdGFuaCh4KSBpcyBkZWZpbmVkIHRvIGJlIC0tLS0tLS0tLS0tCisgKgkJCQkgICAgICAgeCAgICAteAorICoJCQkJICAgICAgZSAgKyBlCisgKgkxLiByZWR1Y2UgeCB0byBub24tbmVnYXRpdmUgYnkgdGFuaCgteCkgPSAtdGFuaCh4KS4KKyAqCTIuICAwICAgICAgPD0geCA8PSAyKiotNTUgOiB0YW5oKHgpIDo9IHgqKG9uZSt4KQorICoJCQkJCSAgICAgICAgLXQKKyAqCSAgICAyKiotNTUgPCAgeCA8PSAgMSAgICAgOiB0YW5oKHgpIDo9IC0tLS0tOyB0ID0gZXhwbTEoLTJ4KQorICoJCQkJCSAgICAgICB0ICsgMgorICoJCQkJCQkgICAgIDIKKyAqCSAgICAxICAgICAgPD0geCA8PSAgMjIuMCAgOiB0YW5oKHgpIDo9IDEtICAtLS0tLSA7IHQ9ZXhwbTEoMngpCisgKgkJCQkJCSAgIHQgKyAyCisgKgkgICAgMjIuMCAgIDwgIHggPD0gSU5GICAgIDogdGFuaCh4KSA6PSAxLgorICoKKyAqIFNwZWNpYWwgY2FzZXM6CisgKgl0YW5oKE5hTikgaXMgTmFOOworICoJb25seSB0YW5oKDApPTAgaXMgZXhhY3QgZm9yIGZpbml0ZSBhcmd1bWVudC4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlIG9uZT0xLjAsIHR3bz0yLjAsIHRpbnkgPSAxLjBlLTMwMDsKKworZG91YmxlCit0YW5oKGRvdWJsZSB4KQoreworCWRvdWJsZSB0LHo7CisJaW50MzJfdCBqeCxpeDsKKworICAgIC8qIEhpZ2ggd29yZCBvZiB8eHwuICovCisJR0VUX0hJR0hfV09SRChqeCx4KTsKKwlpeCA9IGp4JjB4N2ZmZmZmZmY7CisKKyAgICAvKiB4IGlzIElORiBvciBOYU4gKi8KKwlpZihpeD49MHg3ZmYwMDAwMCkgeworCSAgICBpZiAoang+PTApIHJldHVybiBvbmUveCtvbmU7ICAgIC8qIHRhbmgoKy1pbmYpPSstMSAqLworCSAgICBlbHNlICAgICAgIHJldHVybiBvbmUveC1vbmU7ICAgIC8qIHRhbmgoTmFOKSA9IE5hTiAqLworCX0KKworICAgIC8qIHx4fCA8IDIyICovCisJaWYgKGl4IDwgMHg0MDM2MDAwMCkgewkJLyogfHh8PDIyICovCisJICAgIGlmIChpeDwweDNjODAwMDAwKSAJCS8qIHx4fDwyKiotNTUgKi8KKwkJcmV0dXJuIHgqKG9uZSt4KTsgICAgCS8qIHRhbmgoc21hbGwpID0gc21hbGwgKi8KKwkgICAgaWYgKGl4Pj0weDNmZjAwMDAwKSB7CS8qIHx4fD49MSAgKi8KKwkJdCA9IGV4cG0xKHR3bypmYWJzKHgpKTsKKwkJeiA9IG9uZSAtIHR3by8odCt0d28pOworCSAgICB9IGVsc2UgeworCSAgICAgICAgdCA9IGV4cG0xKC10d28qZmFicyh4KSk7CisJICAgICAgICB6PSAtdC8odCt0d28pOworCSAgICB9CisgICAgLyogfHh8ID4gMjIsIHJldHVybiArLTEgKi8KKwl9IGVsc2UgeworCSAgICB6ID0gb25lIC0gdGlueTsJCS8qIHJhaXNlZCBpbmV4YWN0IGZsYWcgKi8KKwl9CisJcmV0dXJuIChqeD49MCk/IHo6IC16OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc190YW5oZi5jIGIvbGlibS9zcmMvc190YW5oZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhY2E2Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3RhbmhmLmMKQEAgLTAsMCArMSw1NiBAQAorLyogc190YW5oZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc190YW5oLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3RhbmhmLmMsdiAxLjggMjAwNS8xMi8xMSAxMTo0MDo1NSBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdCBvbmU9MS4wLCB0d289Mi4wLCB0aW55ID0gMS4wZS0zMCwgaHVnZSA9IDEuMGUzMDsKK2Zsb2F0Cit0YW5oZihmbG9hdCB4KQoreworCWZsb2F0IHQsejsKKwlpbnQzMl90IGp4LGl4OworCisJR0VUX0ZMT0FUX1dPUkQoangseCk7CisJaXggPSBqeCYweDdmZmZmZmZmOworCisgICAgLyogeCBpcyBJTkYgb3IgTmFOICovCisJaWYoaXg+PTB4N2Y4MDAwMDApIHsKKwkgICAgaWYgKGp4Pj0wKSByZXR1cm4gb25lL3grb25lOyAgICAvKiB0YW5oKCstaW5mKT0rLTEgKi8KKwkgICAgZWxzZSAgICAgICByZXR1cm4gb25lL3gtb25lOyAgICAvKiB0YW5oKE5hTikgPSBOYU4gKi8KKwl9CisKKyAgICAvKiB8eHwgPCA5ICovCisJaWYgKGl4IDwgMHg0MTEwMDAwMCkgewkJLyogfHh8PDkgKi8KKwkgICAgaWYgKGl4PDB4Mzk4MDAwMDApIHsJLyogfHh8PDIqKi0xMiAqLworCQlpZihodWdlK3g+b25lKSByZXR1cm4geDsgLyogdGFuaCh0aW55KSA9IHRpbnkgd2l0aCBpbmV4YWN0ICovCisJICAgIH0KKwkgICAgaWYgKGl4Pj0weDNmODAwMDAwKSB7CS8qIHx4fD49MSAgKi8KKwkJdCA9IGV4cG0xZih0d28qZmFic2YoeCkpOworCQl6ID0gb25lIC0gdHdvLyh0K3R3byk7CisJICAgIH0gZWxzZSB7CisJICAgICAgICB0ID0gZXhwbTFmKC10d28qZmFic2YoeCkpOworCSAgICAgICAgej0gLXQvKHQrdHdvKTsKKwkgICAgfQorICAgIC8qIHx4fCA+PSA5LCByZXR1cm4gKy0xICovCisJfSBlbHNlIHsKKwkgICAgeiA9IG9uZSAtIHRpbnk7CQkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwl9CisJcmV0dXJuIChqeD49MCk/IHo6IC16OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc190cnVuYy5jIGIvbGlibS9zcmMvc190cnVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Mjg3ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3RydW5jLmMKQEAgLTAsMCArMSw2MSBAQAorLyogQCgjKXNfZmxvb3IuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfdHJ1bmMuYyx2IDEuMSAyMDA0LzA2LzIwIDA5OjI1OjQzIGRhcyBFeHAgJCIpOyAqLworCisvKgorICogdHJ1bmMoeCkKKyAqIFJldHVybiB4IHJvdW5kZWQgdG93YXJkIDAgdG8gaW50ZWdyYWwgdmFsdWUKKyAqIE1ldGhvZDoKKyAqCUJpdCB0d2lkZGxpbmcuCisgKiBFeGNlcHRpb246CisgKglJbmV4YWN0IGZsYWcgcmFpc2VkIGlmIHggbm90IGVxdWFsIHRvIHRydW5jKHgpLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUgaHVnZSA9IDEuMGUzMDA7CisKK2RvdWJsZQordHJ1bmMoZG91YmxlIHgpCit7CisJaW50MzJfdCBpMCxpMSxqMDsKKwl1X2ludDMyX3QgaSxqOworCUVYVFJBQ1RfV09SRFMoaTAsaTEseCk7CisJajAgPSAoKGkwPj4yMCkmMHg3ZmYpLTB4M2ZmOworCWlmKGowPDIwKSB7CisJICAgIGlmKGowPDApIHsgCS8qIHJhaXNlIGluZXhhY3QgaWYgeCAhPSAwICovCisJCWlmKGh1Z2UreD4wLjApIHsvKiB8eHw8MSwgc28gcmV0dXJuIDAqc2lnbih4KSAqLworCQkgICAgaTAgJj0gMHg4MDAwMDAwMFU7CisJCSAgICBpMSA9IDA7CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJaSA9ICgweDAwMGZmZmZmKT4+ajA7CisJCWlmKCgoaTAmaSl8aTEpPT0wKSByZXR1cm4geDsgLyogeCBpcyBpbnRlZ3JhbCAqLworCQlpZihodWdlK3g+MC4wKSB7CS8qIHJhaXNlIGluZXhhY3QgZmxhZyAqLworCQkgICAgaTAgJj0gKH5pKTsgaTE9MDsKKwkJfQorCSAgICB9CisJfSBlbHNlIGlmIChqMD41MSkgeworCSAgICBpZihqMD09MHg0MDApIHJldHVybiB4K3g7CS8qIGluZiBvciBOYU4gKi8KKwkgICAgZWxzZSByZXR1cm4geDsJCS8qIHggaXMgaW50ZWdyYWwgKi8KKwl9IGVsc2UgeworCSAgICBpID0gKCh1X2ludDMyX3QpKDB4ZmZmZmZmZmYpKT4+KGowLTIwKTsKKwkgICAgaWYoKGkxJmkpPT0wKSByZXR1cm4geDsJLyogeCBpcyBpbnRlZ3JhbCAqLworCSAgICBpZihodWdlK3g+MC4wKQkJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJCWkxICY9ICh+aSk7CisJfQorCUlOU0VSVF9XT1JEUyh4LGkwLGkxKTsKKwlyZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfdHJ1bmNmLmMgYi9saWJtL3NyYy9zX3RydW5jZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YjcyNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3RydW5jZi5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qIEAoIylzX2Zsb29yLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3RydW5jZi5jLHYgMS4xIDIwMDQvMDYvMjAgMDk6MjU6NDMgZGFzIEV4cCAkIik7ICovCisKKy8qCisgKiB0cnVuY2YoeCkKKyAqIFJldHVybiB4IHJvdW5kZWQgdG93YXJkIDAgdG8gaW50ZWdyYWwgdmFsdWUKKyAqIE1ldGhvZDoKKyAqCUJpdCB0d2lkZGxpbmcuCisgKiBFeGNlcHRpb246CisgKglJbmV4YWN0IGZsYWcgcmFpc2VkIGlmIHggbm90IGVxdWFsIHRvIHRydW5jZih4KS4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQgaHVnZSA9IDEuMGUzMEY7CisKK2Zsb2F0Cit0cnVuY2YoZmxvYXQgeCkKK3sKKwlpbnQzMl90IGkwLGowOworCXVfaW50MzJfdCBpOworCUdFVF9GTE9BVF9XT1JEKGkwLHgpOworCWowID0gKChpMD4+MjMpJjB4ZmYpLTB4N2Y7CisJaWYoajA8MjMpIHsKKwkgICAgaWYoajA8MCkgeyAJLyogcmFpc2UgaW5leGFjdCBpZiB4ICE9IDAgKi8KKwkJaWYoaHVnZSt4PjAuMEYpCQkvKiB8eHw8MSwgc28gcmV0dXJuIDAqc2lnbih4KSAqLworCQkgICAgaTAgJj0gMHg4MDAwMDAwMDsKKwkgICAgfSBlbHNlIHsKKwkJaSA9ICgweDAwN2ZmZmZmKT4+ajA7CisJCWlmKChpMCZpKT09MCkgcmV0dXJuIHg7IC8qIHggaXMgaW50ZWdyYWwgKi8KKwkJaWYoaHVnZSt4PjAuMEYpCQkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJICAgIGkwICY9ICh+aSk7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBpZihqMD09MHg4MCkgcmV0dXJuIHgreDsJLyogaW5mIG9yIE5hTiAqLworCSAgICBlbHNlIHJldHVybiB4OwkJLyogeCBpcyBpbnRlZ3JhbCAqLworCX0KKwlTRVRfRkxPQVRfV09SRCh4LGkwKTsKKwlyZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfdHJ1bmNsLmMgYi9saWJtL3NyYy9zX3RydW5jbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OTI2YTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3RydW5jbC5jCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogRnJvbTogQCgjKXNfZmxvb3IuYyA1LjEgOTMvMDkvMjQKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc190cnVuY2wuYyx2IDEuNCAyMDA1LzA0LzI4IDE5OjQ1OjU1IHN0ZWZhbmYgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiB0cnVuY2woeCkKKyAqIFJldHVybiB4IHJvdW5kZWQgdG93YXJkIDAgdG8gaW50ZWdyYWwgdmFsdWUKKyAqIE1ldGhvZDoKKyAqCUJpdCB0d2lkZGxpbmcuCisgKiBFeGNlcHRpb246CisgKglJbmV4YWN0IGZsYWcgcmFpc2VkIGlmIHggbm90IGVxdWFsIHRvIHRydW5jbCh4KS4KKyAqLworCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworI2lmZGVmIExEQkxfSU1QTElDSVRfTkJJVAorI2RlZmluZQlNQU5IX1NJWkUJKExEQkxfTUFOSF9TSVpFICsgMSkKKyNlbHNlCisjZGVmaW5lCU1BTkhfU0laRQlMREJMX01BTkhfU0laRQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBsb25nIGRvdWJsZSBodWdlID0gMS4wZTMwMDsKKworbG9uZyBkb3VibGUKK3RydW5jbChsb25nIGRvdWJsZSB4KQoreworCXVuaW9uIElFRUVsMmJpdHMgdSA9IHsgLmUgPSB4IH07CisJaW50IGUgPSB1LmJpdHMuZXhwIC0gTERCTF9NQVhfRVhQICsgMTsKKworCWlmIChlIDwgTUFOSF9TSVpFIC0gMSkgeworCQlpZiAoZSA8IDApIHsJCQkvKiByYWlzZSBpbmV4YWN0IGlmIHggIT0gMCAqLworCQkJaWYgKGh1Z2UgKyB4ID4gMC4wKQorCQkJCXUuZSA9IDAuMDsKKwkJfSBlbHNlIHsKKwkJCXVpbnQ2NF90IG0gPSAoKDFsbHUgPDwgTUFOSF9TSVpFKSAtIDEpID4+IChlICsgMSk7CisJCQlpZiAoKCh1LmJpdHMubWFuaCAmIG0pIHwgdS5iaXRzLm1hbmwpID09IDApCisJCQkJcmV0dXJuICh4KTsJLyogeCBpcyBpbnRlZ3JhbCAqLworCQkJaWYgKGh1Z2UgKyB4ID4gMC4wKSB7CS8qIHJhaXNlIGluZXhhY3QgZmxhZyAqLworCQkJCXUuYml0cy5tYW5oICY9IH5tOworCQkJCXUuYml0cy5tYW5sID0gMDsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoZSA8IExEQkxfTUFOVF9ESUcgLSAxKSB7CisJCXVpbnQ2NF90IG0gPSAodWludDY0X3QpLTEgPj4gKDY0IC0gTERCTF9NQU5UX0RJRyArIGUgKyAxKTsKKwkJaWYgKCh1LmJpdHMubWFubCAmIG0pID09IDApCisJCQlyZXR1cm4gKHgpOwkvKiB4IGlzIGludGVncmFsICovCisJCWlmIChodWdlICsgeCA+IDAuMCkJCS8qIHJhaXNlIGluZXhhY3QgZmxhZyAqLworCQkJdS5iaXRzLm1hbmwgJj0gfm07CisJfQorCXJldHVybiAodS5lKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3dfY2Ficy5jIGIvbGlibS9zcmMvd19jYWJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc3ZTVlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3dfY2Ficy5jCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBjYWJzKCkgd3JhcHBlciBmb3IgaHlwb3QoKS4KKyAqCisgKiBXcml0dGVuIGJ5IEouVC4gQ29ua2xpbiwgPGp0Y0B3aW1zZXkuY29tPgorICogUGxhY2VkIGludG8gdGhlIFB1YmxpYyBEb21haW4sIDE5OTQuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdID0KKyAgIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3dfY2Ficy5jLHYgMS40IDIwMDEvMDYvMTMgMTU6MTY6MzAgcnUgRXhwICQiOworI2VuZGlmIC8qIG5vdCBsaW50ICovCisKKyNpbmNsdWRlIDxjb21wbGV4Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCitkb3VibGUKK2NhYnMoeikKKwlkb3VibGUgY29tcGxleCB6OworeworCXJldHVybiBoeXBvdChjcmVhbCh6KSwgY2ltYWcoeikpOworfQorCitkb3VibGUKK3pfYWJzKHopCisJZG91YmxlIGNvbXBsZXggKno7Cit7CisJcmV0dXJuIGh5cG90KGNyZWFsKCp6KSwgY2ltYWcoKnopKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3dfY2Fic2YuYyBiL2xpYm0vc3JjL3dfY2Fic2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWMxNTJmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvd19jYWJzZi5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBjYWJzZigpIHdyYXBwZXIgZm9yIGh5cG90ZigpLgorICoKKyAqIFdyaXR0ZW4gYnkgSi5ULiBDb25rbGluLCA8anRjQHdpbXNleS5jb20+CisgKiBQbGFjZWQgaW50byB0aGUgUHVibGljIERvbWFpbiwgMTk5NC4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gPQorICAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvd19jYWJzZi5jLHYgMS4zIDIwMDEvMDYvMTMgMTU6MTY6MzAgcnUgRXhwICQiOworI2VuZGlmIC8qIG5vdCBsaW50ICovCisKKyNpbmNsdWRlIDxjb21wbGV4Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitmbG9hdAorY2Fic2YoeikKKwlmbG9hdCBjb21wbGV4IHo7Cit7CisKKwlyZXR1cm4gaHlwb3RmKGNyZWFsZih6KSwgY2ltYWdmKHopKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3dfZHJlbS5jIGIvbGlibS9zcmMvd19kcmVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY2ODQwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3dfZHJlbS5jCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBkcmVtKCkgd3JhcHBlciBmb3IgcmVtYWluZGVyKCkuCisgKgorICogV3JpdHRlbiBieSBKLlQuIENvbmtsaW4sIDxqdGNAd2ltc2V5LmNvbT4KKyAqIFBsYWNlZCBpbnRvIHRoZSBQdWJsaWMgRG9tYWluLCAxOTk0LgorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKK2RvdWJsZQorZHJlbSh4LCB5KQorCWRvdWJsZSB4LCB5OworeworCXJldHVybiByZW1haW5kZXIoeCwgeSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy93X2RyZW1mLmMgYi9saWJtL3NyYy93X2RyZW1mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzYWMwZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3dfZHJlbWYuYwpAQCAtMCwwICsxLDE2IEBACisvKgorICogZHJlbWYoKSB3cmFwcGVyIGZvciByZW1haW5kZXJmKCkuCisgKgorICogV3JpdHRlbiBieSBKLlQuIENvbmtsaW4sIDxqdGNAd2ltc2V5LmNvbT4KKyAqIFBsYWNlZCBpbnRvIHRoZSBQdWJsaWMgRG9tYWluLCAxOTk0LgorICovCisvKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy93X2RyZW1mLmMsdiAxLjMgMjAwNC8wNy8yOCAwNTo1MzoxOCBrYW4gRXhwICQgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZmxvYXQKK2RyZW1mKGZsb2F0IHgsIGZsb2F0IHkpCit7CisJcmV0dXJuIHJlbWFpbmRlcmYoeCwgeSk7Cit9Cg==