ZGlmZiAtLWdpdCBhL0hlbHAvbWFudWFsL2NtYWtlLWxhbmd1YWdlLjcucnN0IGIvSGVscC9tYW51YWwvY21ha2UtbGFuZ3VhZ2UuNy5yc3QKaW5kZXggMjdiNWQzMC4uODdmOGY5ZCAxMDA2NDQKLS0tIGEvSGVscC9tYW51YWwvY21ha2UtbGFuZ3VhZ2UuNy5yc3QKKysrIGIvSGVscC9tYW51YWwvY21ha2UtbGFuZ3VhZ2UuNy5yc3QKQEAgLTE4MywxOCArMTgzLDE4IEBACiAKIC4uIHByb2R1Y3Rpb25saXN0OjoKICBicmFja2V0X2FyZ3VtZW50OiBgYnJhY2tldF9vcGVuYCBgYnJhY2tldF9jb250ZW50YCBgYnJhY2tldF9jbG9zZWAKLSBicmFja2V0X29wZW46ICdbJyAnPSd7bGVufSAnWycKLSBicmFja2V0X2NvbnRlbnQ6IDxhbnkgdGV4dCBub3QgY29udGFpbmluZyBhIGBicmFja2V0X2Nsb3NlYAotICAgICAgICAgICAgICAgIDogIG9mIHRoZSBzYW1lIHtsZW59IGFzIHRoZSBgYnJhY2tldF9vcGVuYD4KLSBicmFja2V0X2Nsb3NlOiAnXScgJz0ne2xlbn0gJ10nCisgYnJhY2tldF9vcGVuOiAnWycgJz0nKiAnWycKKyBicmFja2V0X2NvbnRlbnQ6IDxhbnkgdGV4dCBub3QgY29udGFpbmluZyBhIGBicmFja2V0X2Nsb3NlYCB3aXRoCisgICAgICAgICAgICAgICAgOiAgdGhlIHNhbWUgbnVtYmVyIG9mICc9JyBhcyB0aGUgYGJyYWNrZXRfb3BlbmA+CisgYnJhY2tldF9jbG9zZTogJ10nICc9JyogJ10nCiAKIC4uIHJhdzo6IGxhdGV4CiAKICAgIFxlbmR7c21hbGx9CiAKLUFuIG9wZW5pbmcgYnJhY2tldCBvZiBsZW5ndGggKmxlbiA+PSAwKiBpcyB3cml0dGVuIGBgW2BgIGZvbGxvd2VkCi1ieSAqbGVuKiBgYD1gYCBmb2xsb3dlZCBieSBgYFtgYCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY2xvc2luZwotYnJhY2tldCBpcyB3cml0dGVuIGBgXWBgIGZvbGxvd2VkIGJ5ICpsZW4qIGBgPWBgIGZvbGxvd2VkIGJ5IGBgXWBgLgorQW4gb3BlbmluZyBicmFja2V0IGlzIHdyaXR0ZW4gYGBbYGAgZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIGBgPWBgIGZvbGxvd2VkCitieSBgYFtgYC4gIFRoZSBjb3JyZXNwb25kaW5nIGNsb3NpbmcgYnJhY2tldCBpcyB3cml0dGVuIGBgXWBgIGZvbGxvd2VkCitieSB0aGUgc2FtZSBudW1iZXIgb2YgYGA9YGAgZm9sbG93ZWQgYnkgYGBdYGAuCiBCcmFja2V0cyBkbyBub3QgbmVzdC4gIEEgdW5pcXVlIGxlbmd0aCBtYXkgYWx3YXlzIGJlIGNob3NlbgogZm9yIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIGJyYWNrZXRzIHRvIGNvbnRhaW4gY2xvc2luZyBicmFja2V0cwogb2Ygb3RoZXIgbGVuZ3Rocy4KQEAgLTMzNCw2ICszMzQsOCBAQAogIGJlZ2lubmluZyBvZiBhbiB1bnF1b3RlZCBhcmd1bWVudCwgYW5kIGFyZSB0cmVhdGVkIGFzIHBhcnQgb2YgdGhlCiAgY29udGVudC4gIEZvciBleGFtcGxlLCB0aGUgdW5xdW90ZWQgYXJndW1lbnRzIGBgLURhPSJiIGMiYGAsCiAgYGAtRGE9JCh2KWBgLCBhbmQgYGBhIiAiYiJjImRgYCBhcmUgZWFjaCBpbnRlcnByZXRlZCBsaXRlcmFsbHkuCisgVGhleSBtYXkgaW5zdGVhZCBiZSB3cml0dGVuIGFzIHF1b3RlZCBhcmd1bWVudHMgYGAiLURhPVwiYiBjXCIiYGAsCisgYGAiLURhPSQodikiYGAsIGFuZCBgYCJhXCIgXCJiXCJjXCJkImBgLCByZXNwZWN0aXZlbHkuCiAKICBNYWtlLXN0eWxlIHJlZmVyZW5jZXMgYXJlIHRyZWF0ZWQgbGl0ZXJhbGx5IGFzIHBhcnQgb2YgdGhlIGNvbnRlbnQKICBhbmQgZG8gbm90IHVuZGVyZ28gdmFyaWFibGUgZXhwYW5zaW9uLiAgVGhleSBhcmUgdHJlYXRlZCBhcyBwYXJ0CkBAIC01MTQsNyArNTE2LDcgQEAKICBjcmVhdGUgY29tbWFuZHMgdGhhdCwgd2hlbiBpbnZva2VkLCBwcm9jZXNzIHRoZSByZWNvcmRlZCBjb21tYW5kcwogIGluIGEgbmV3IHZhcmlhYmxlIGJpbmRpbmcgc2NvcGUuICBBIHZhcmlhYmxlICJzZXQiIG9yICJ1bnNldCIKICBiaW5kcyBpbiB0aGlzIHNjb3BlIGFuZCBpcyB2aXNpYmxlIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbiBhbmQKLSBhbnkgbmVzdGVkIGNhbGxzLCBidXQgbm90IGFmdGVyIHRoZSBmdW5jdGlvbiByZXR1cm5zLgorIGFueSBuZXN0ZWQgY2FsbHMgd2l0aGluIGl0LCBidXQgbm90IGFmdGVyIHRoZSBmdW5jdGlvbiByZXR1cm5zLgogCiBEaXJlY3RvcnkgU2NvcGUKICBFYWNoIG9mIHRoZSBgRGlyZWN0b3JpZXNgXyBpbiBhIHNvdXJjZSB0cmVlIGhhcyBpdHMgb3duIHZhcmlhYmxlCmRpZmYgLS1naXQgYS9IZWxwL3Byb3Bfc2YvQVVUT1JDQ19PUFRJT05TLnJzdCBiL0hlbHAvcHJvcF9zZi9BVVRPUkNDX09QVElPTlMucnN0CmluZGV4IGQ5ZGM0ZDMuLjJiZWMwMzMgMTAwNjQ0Ci0tLSBhL0hlbHAvcHJvcF9zZi9BVVRPUkNDX09QVElPTlMucnN0CisrKyBiL0hlbHAvcHJvcF9zZi9BVVRPUkNDX09QVElPTlMucnN0CkBAIC05LDUgKzksMTQgQEAKIAogQnkgZGVmYXVsdCBpdCBpcyBlbXB0eS4KIAotVGhlIG9wdGlvbnMgc2V0IG9uIHRoZSBgYC5xcmNgYCBzb3VyY2UgZmlsZSBtYXkgb3ZlcnJpZGUgOnByb3BfdGd0OmBBVVRPUkNDX09QVElPTlNgIHNldAotb24gdGhlIHRhcmdldC4KK1RoZSBvcHRpb25zIHNldCBvbiB0aGUgYGAucXJjYGAgc291cmNlIGZpbGUgbWF5IG92ZXJyaWRlCis6cHJvcF90Z3Q6YEFVVE9SQ0NfT1BUSU9OU2Agc2V0IG9uIHRoZSB0YXJnZXQuCisKK0VYQU1QTEUKK15eXl5eXl4KKworLi4gY29kZS1ibG9jazo6IGNtYWtlCisKKyAgIyAuLi4KKyAgc2V0X3Byb3BlcnR5KFNPVVJDRSByZXNvdXJjZXMucXJjIFBST1BFUlRZIEFVVE9SQ0NfT1BUSU9OUyAiLS1jb21wcmVzczs5IikKKyAgIyAuLi4KZGlmZiAtLWdpdCBhL0hlbHAvcHJvcF9zZi9BVVRPVUlDX09QVElPTlMucnN0IGIvSGVscC9wcm9wX3NmL0FVVE9VSUNfT1BUSU9OUy5yc3QKaW5kZXggYmI0OGRhOS4uZTJmNDdlYyAxMDA2NDQKLS0tIGEvSGVscC9wcm9wX3NmL0FVVE9VSUNfT1BUSU9OUy5yc3QKKysrIGIvSGVscC9wcm9wX3NmL0FVVE9VSUNfT1BUSU9OUy5yc3QKQEAgLTQsMTEgKzQsMjAgQEAKIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgYGB1aWNgYCB3aGVuIHVzaW5nIDpwcm9wX3RndDpgQVVUT1VJQ2AKIAogVGhpcyBwcm9wZXJ0eSBob2xkcyBhZGRpdGlvbmFsIGNvbW1hbmQgbGluZSBvcHRpb25zCi13aGljaCB3aWxsIGJlIHVzZWQgd2hlbiBgYHVpY2BgIGlzIGV4ZWN1dGVkIGR1cmluZyB0aGUgYnVpbGQgdmlhIDpwcm9wX3RndDpgQVVUT1VJQ2AsCi1pLmUuIGl0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIG9wdGlvbmFsIGBgT1BUSU9OU2BgIGFyZ3VtZW50IG9mIHRoZQotOm1vZHVsZTpgcXQ0X3dyYXBfdWkoKSA8RmluZFF0ND5gIG1hY3JvLgord2hpY2ggd2lsbCBiZSB1c2VkIHdoZW4gYGB1aWNgYCBpcyBleGVjdXRlZCBkdXJpbmcgdGhlIGJ1aWxkIHZpYQorOnByb3BfdGd0OmBBVVRPVUlDYCwgaS5lLiBpdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBvcHRpb25hbCBgYE9QVElPTlNgYAorYXJndW1lbnQgb2YgdGhlIDptb2R1bGU6YHF0NF93cmFwX3VpKCkgPEZpbmRRdDQ+YCBtYWNyby4KIAogQnkgZGVmYXVsdCBpdCBpcyBlbXB0eS4KIAotVGhlIG9wdGlvbnMgc2V0IG9uIHRoZSBgYC51aWBgIHNvdXJjZSBmaWxlIG1heSBvdmVycmlkZSA6cHJvcF90Z3Q6YEFVVE9VSUNfT1BUSU9OU2Agc2V0Ci1vbiB0aGUgdGFyZ2V0LgorVGhlIG9wdGlvbnMgc2V0IG9uIHRoZSBgYC51aWBgIHNvdXJjZSBmaWxlIG1heSBvdmVycmlkZQorOnByb3BfdGd0OmBBVVRPVUlDX09QVElPTlNgIHNldCBvbiB0aGUgdGFyZ2V0LgorCitFWEFNUExFCiteXl5eXl5eCisKKy4uIGNvZGUtYmxvY2s6OiBjbWFrZQorCisgICMgLi4uCisgIHNldF9wcm9wZXJ0eShTT1VSQ0Ugd2lkZ2V0LnVpIFBST1BFUlRZIEFVVE9VSUNfT1BUSU9OUyAiLS1uby1wcm90ZWN0aW9uIikKKyAgIyAuLi4KZGlmZiAtLWdpdCBhL0hlbHAvcHJvcF9zZi9TS0lQX0FVVE9VSUMucnN0IGIvSGVscC9wcm9wX3NmL1NLSVBfQVVUT1VJQy5yc3QKaW5kZXggNGVkYTcyNi4uOGM5NjJkYiAxMDA2NDQKLS0tIGEvSGVscC9wcm9wX3NmL1NLSVBfQVVUT1VJQy5yc3QKKysrIGIvSGVscC9wcm9wX3NmL1NLSVBfQVVUT1VJQy5yc3QKQEAgLTMsNiArMyw5IEBACiAKIEV4Y2x1ZGUgdGhlIHNvdXJjZSBmaWxlIGZyb20gOnByb3BfdGd0OmBBVVRPVUlDYCBwcm9jZXNzaW5nIChmb3IgUXQgcHJvamVjdHMpLgogCis6cHJvcF9zZjpgU0tJUF9BVVRPVUlDYCBjYW4gYmUgc2V0IG9uIEMrKyBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlcyBhbmQgb24KK2BgLnVpYGAgZmlsZXMuCisKIEZvciBicm9hZGVyIGV4Y2x1c2lvbiBjb250cm9sIHNlZSA6cHJvcF9zZjpgU0tJUF9BVVRPR0VOYC4KIAogRVhBTVBMRQpAQCAtMTIsNCArMTUsNiBAQAogCiAgICMgLi4uCiAgIHNldF9wcm9wZXJ0eShTT1VSQ0UgZmlsZS5oIFBST1BFUlRZIFNLSVBfQVVUT1VJQyBPTikKKyAgc2V0X3Byb3BlcnR5KFNPVVJDRSBmaWxlLmNwcCBQUk9QRVJUWSBTS0lQX0FVVE9VSUMgT04pCisgIHNldF9wcm9wZXJ0eShTT1VSQ0Ugd2lkZ2V0LnVpIFBST1BFUlRZIFNLSVBfQVVUT1VJQyBPTikKICAgIyAuLi4KZGlmZiAtLWdpdCBhL0hlbHAvcHJvcF90Z3QvQVVUT01PQ19ERVBFTkRfRklMVEVSUy5yc3QgYi9IZWxwL3Byb3BfdGd0L0FVVE9NT0NfREVQRU5EX0ZJTFRFUlMucnN0CmluZGV4IDgxMGNiZjQuLmI3MzhlY2YgMTAwNjQ0Ci0tLSBhL0hlbHAvcHJvcF90Z3QvQVVUT01PQ19ERVBFTkRfRklMVEVSUy5yc3QKKysrIGIvSGVscC9wcm9wX3RndC9BVVRPTU9DX0RFUEVORF9GSUxURVJTLnJzdApAQCAtMjUsNyArMjUsNyBAQAogCiAKIEV4YW1wbGUKLS0tLS0tLS0KK15eXl5eXl4KIAogQ29uc2lkZXIgYSBmaWxlIGBgRk9PLmhwcGBgIGhvbGRzIGEgY3VzdG9tIG1hY3JvIGBgT0JKX0pTT05fRklMRWBgIGFuZCB3ZQogd2FudCB0aGUgYGBtb2NgYCBmaWxlIHRvIGRlcGVuZCBvbiB0aGUgbWFjcm9gcyBmaWxlIG5hbWUgYXJndW1lbnQ6OgpkaWZmIC0tZ2l0IGEvSGVscC9wcm9wX3RndC9BVVRPTU9DX01BQ1JPX05BTUVTLnJzdCBiL0hlbHAvcHJvcF90Z3QvQVVUT01PQ19NQUNST19OQU1FUy5yc3QKaW5kZXggMDUzNWZkZS4uYTVhZDlkNSAxMDA2NDQKLS0tIGEvSGVscC9wcm9wX3RndC9BVVRPTU9DX01BQ1JPX05BTUVTLnJzdAorKysgYi9IZWxwL3Byb3BfdGd0L0FVVE9NT0NfTUFDUk9fTkFNRVMucnN0CkBAIC0yMyw3ICsyMyw4IEBACiB3aXRoIFF0LgogCiBFeGFtcGxlCi0tLS0tLS0tCiteXl5eXl5eCisKIEluIHRoaXMgY2FzZSB0aGUgdGhlIGBgUV9PQkpFQ1RgYCBtYWNybyBpcyBoaWRkZW4gaW5zaWRlIGFuIG90aGVyIG1hY3JvCiBjYWxsZWQgYGBDVVNUT01fTUFDUk9gYC4gVG8gbGV0IENNYWtlIGtub3cgdGhhdCBzb3VyY2UgZmlsZXMsIHRoYXQgY29udGFpbgogYGBDVVNUT01fTUFDUk9gYCwgbmVlZCB0byBiZSBgYG1vY2BgIHByb2Nlc3NlZCwgd2UgY2FsbDo6CmRpZmYgLS1naXQgYS9IZWxwL3Byb3BfdGd0L0FVVE9SQ0NfT1BUSU9OUy5yc3QgYi9IZWxwL3Byb3BfdGd0L0FVVE9SQ0NfT1BUSU9OUy5yc3QKaW5kZXggOGEwZjYzMi4uZDZhZGU1YSAxMDA2NDQKLS0tIGEvSGVscC9wcm9wX3RndC9BVVRPUkNDX09QVElPTlMucnN0CisrKyBiL0hlbHAvcHJvcF90Z3QvQVVUT1JDQ19PUFRJT05TLnJzdApAQCAtMTksMyArMTksMTIgQEAKIAogU2VlIHRoZSA6bWFudWFsOmBjbWFrZS1xdCg3KWAgbWFudWFsIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHVzaW5nIENNYWtlCiB3aXRoIFF0LgorCitFWEFNUExFCiteXl5eXl5eCisKKy4uIGNvZGUtYmxvY2s6OiBjbWFrZQorCisgICMgLi4uCisgIHNldF9wcm9wZXJ0eShUQVJHRVQgdGd0IFBST1BFUlRZIEFVVE9SQ0NfT1BUSU9OUyAiLS1jb21wcmVzczs5IikKKyAgIyAuLi4KZGlmZiAtLWdpdCBhL0hlbHAvcHJvcF90Z3QvQVVUT1VJQ19PUFRJT05TLnJzdCBiL0hlbHAvcHJvcF90Z3QvQVVUT1VJQ19PUFRJT05TLnJzdAppbmRleCA5ZmIwNDJlLi4zZjYxM2I5IDEwMDY0NAotLS0gYS9IZWxwL3Byb3BfdGd0L0FVVE9VSUNfT1BUSU9OUy5yc3QKKysrIGIvSGVscC9wcm9wX3RndC9BVVRPVUlDX09QVElPTlMucnN0CkBAIC0yMywzICsyMywxMiBAQAogCiBTZWUgdGhlIDptYW51YWw6YGNtYWtlLXF0KDcpYCBtYW51YWwgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdXNpbmcgQ01ha2UKIHdpdGggUXQuCisKK0VYQU1QTEUKK15eXl5eXl4KKworLi4gY29kZS1ibG9jazo6IGNtYWtlCisKKyAgIyAuLi4KKyAgc2V0X3Byb3BlcnR5KFRBUkdFVCB0Z3QgUFJPUEVSVFkgQVVUT1VJQ19PUFRJT05TICItLW5vLXByb3RlY3Rpb24iKQorICAjIC4uLgpkaWZmIC0tZ2l0IGEvSGVscC9wcm9wX3RndC9NQUNPU1hfQlVORExFLnJzdCBiL0hlbHAvcHJvcF90Z3QvTUFDT1NYX0JVTkRMRS5yc3QKaW5kZXggN2NkODA0Ni4uZjllMTFlZSAxMDA2NDQKLS0tIGEvSGVscC9wcm9wX3RndC9NQUNPU1hfQlVORExFLnJzdAorKysgYi9IZWxwL3Byb3BfdGd0L01BQ09TWF9CVU5ETEUucnN0CkBAIC02LDcgKzYsNyBAQAogV2hlbiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBgYFRSVUVgYCB0aGUgZXhlY3V0YWJsZSB3aGVuIGJ1aWx0IG9uIE9TIFgKIG9yIGlPUyB3aWxsIGJlIGNyZWF0ZWQgYXMgYW4gYXBwbGljYXRpb24gYnVuZGxlLiAgVGhpcyBtYWtlcyBpdAogYSBHVUkgZXhlY3V0YWJsZSB0aGF0IGNhbiBiZSBsYXVuY2hlZCBmcm9tIHRoZSBGaW5kZXIuICBTZWUgdGhlCi06cHJvcF90Z3Q6YE1BQ09TWF9GUkFNRVdPUktfSU5GT19QTElTVGAgdGFyZ2V0IHByb3BlcnR5IGZvciBpbmZvcm1hdGlvbiBhYm91dAorOnByb3BfdGd0OmBNQUNPU1hfQlVORExFX0lORk9fUExJU1RgIHRhcmdldCBwcm9wZXJ0eSBmb3IgaW5mb3JtYXRpb24gYWJvdXQKIGNyZWF0aW9uIG9mIHRoZSBgYEluZm8ucGxpc3RgYCBmaWxlIGZvciB0aGUgYXBwbGljYXRpb24gYnVuZGxlLgogVGhpcyBwcm9wZXJ0eSBpcyBpbml0aWFsaXplZCBieSB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlCiA6dmFyaWFibGU6YENNQUtFX01BQ09TWF9CVU5ETEVgIGlmIGl0IGlzIHNldCB3aGVuIGEgdGFyZ2V0IGlzIGNyZWF0ZWQuCmRpZmYgLS1naXQgYS9IZWxwL3JlbGVhc2UvMy4xMC5yc3QgYi9IZWxwL3JlbGVhc2UvMy4xMC5yc3QKaW5kZXggMmUzMjQwMS4uMzVmZTYwMiAxMDA2NDQKLS0tIGEvSGVscC9yZWxlYXNlLzMuMTAucnN0CisrKyBiL0hlbHAvcmVsZWFzZS8zLjEwLnJzdApAQCAtMTYxLDI1ICsxNjEsMTYgQEAKIAogKiBXaGVuIHVzaW5nIDpwcm9wX3RndDpgQVVUT01PQ2AsIENNYWtlIHNlYXJjaGVzIGZvciB0aGUgc3RyaW5ncyBgYFFfT0JKRUNUYGAsCiAgIGBgUV9HQURHRVRgYCBvciBgYFFfTkFNRVNQQUNFYGAgaW4gYSBzb3VyY2UgZmlsZSB0byBkZXRlcm1pbmUgaWYgaXQgbmVlZHMKLSAgdG8gYmUgYGBtb2NgYCBwcm9jZXNzZWQuIFRoZSBuZXcgdmFyaWFibGUKLSAgOnZhcmlhYmxlOmBDTUFLRV9BVVRPTU9DX01BQ1JPX05BTUVTYCBhbGxvd3MgdG8gcmVnaXN0ZXIgYWRkaXRpb25hbAotICBzdHJpbmdzIChtYWNybyBuYW1lcykgc28gc2VhcmNoIGZvci4KKyAgdG8gYmUgYGBtb2NgYCBwcm9jZXNzZWQuICBUaGUgbmV3IDp2YXJpYWJsZTpgQ01BS0VfQVVUT01PQ19NQUNST19OQU1FU2AKKyAgdmFyaWFibGUgYW5kIDpwcm9wX3RndDpgQVVUT01PQ19NQUNST19OQU1FU2AgdGFyZ2V0IHByb3BlcnR5IG1heSBiZSBzZXQKKyAgdG8gcmVnaXN0ZXIgYWRkaXRpb25hbCBzdHJpbmdzIChtYWNybyBuYW1lcykgdG8gc2VhcmNoIGZvci4KIAotKiBXaGVuIHVzaW5nIDpwcm9wX3RndDpgQVVUT01PQ2AsIENNYWtlIHNlYXJjaGVzIGZvciB0aGUgc3RyaW5ncyBgYFFfT0JKRUNUYGAsCi0gIGBgUV9HQURHRVRgYCBvciBgYFFfTkFNRVNQQUNFYGAgaW4gYSBzb3VyY2UgZmlsZSB0byBkZXRlcm1pbmUgaWYgaXQgbmVlZHMKLSAgdG8gYmUgYGBtb2NgYCBwcm9jZXNzZWQuIFRoZSBuZXcgdGFyZ2V0IHByb3BlcnR5Ci0gIDpwcm9wX3RndDpgQVVUT01PQ19NQUNST19OQU1FU2AgYWxsb3dzIHRvIHJlZ2lzdGVyIGFkZGl0aW9uYWwgc3RyaW5ncwotICAobWFjcm8gbmFtZXMpIHNvIHNlYXJjaCBmb3IuCi0KLSogV2hlbiB1c2luZyA6cHJvcF90Z3Q6YEFVVE9NT0NgLCB0aGUgbmV3IHZhcmlhYmxlCi0gIDp2YXJpYWJsZTpgQ01BS0VfQVVUT01PQ19DT01QSUxFUl9QUkVERUZJTkVTYCBhbGxvd3MgdG8gZGVmYXVsdAotICBlbmFibGUgb3IgZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgY29tcGlsZXIgcHJlIGRlZmluaXRpb25zIGZpbGUKKyogV2hlbiB1c2luZyA6cHJvcF90Z3Q6YEFVVE9NT0NgLCB0aGUgbmV3CisgIDp2YXJpYWJsZTpgQ01BS0VfQVVUT01PQ19DT01QSUxFUl9QUkVERUZJTkVTYCB2YXJpYWJsZSBhbmQKKyAgOnByb3BfdGd0OmBBVVRPTU9DX0NPTVBJTEVSX1BSRURFRklORVNgIHRhcmdldCBwcm9wZXJ0eSBzcGVjaWZ5IHdoZXRoZXIKKyAgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIGNvbXBpbGVyIHByZSBkZWZpbml0aW9ucyBmaWxlCiAgIGBgbW9jX3ByZWRlZnMuaGBgLgogCi0qIFdoZW4gdXNpbmcgOnByb3BfdGd0OmBBVVRPTU9DYCwgdGhlIG5ldyBib29sZWFuIHRhcmdldCBwcm9wZXJ0eQotICA6cHJvcF90Z3Q6YEFVVE9NT0NfQ09NUElMRVJfUFJFREVGSU5FU2AgYWxsb3dzIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZQotICBnZW5lcmF0aW9uIG9mIHRoZSBjb21waWxlciBwcmUgZGVmaW5pdGlvbnMgZmlsZSBgYG1vY19wcmVkZWZzLmhgYC4KLQogQ1Rlc3QKIC0tLS0tCiAKQEAgLTIxOCw4ICsyMDksOCBAQAogKiBUaGUgOm1vZHVsZTpgQ1BhY2tJRldgIG1vZHVsZSBnYWluZWQgbmV3CiAgIDp2YXJpYWJsZTpgQ1BBQ0tfSUZXX1JFUE9TSVRPUklFU19ESVJFQ1RPUklFU2AgdmFyaWFibGUgdG8gc3BlY2lmeQogICBhZGRpdGlvbmFsIHJlcG9zaXRvcmllcyBkaXJzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJlc29sdmUgYW5kCi0gIHJlcGFjayBkZXBlbmRlbnQgY29tcG9uZW50cy4gVGhpcyBmZWF0dXJlIGF2YWlsYWJsZSBvbmx5Ci0gIHNpbmNlIFF0SUZXIDMuMS4KKyAgcmVwYWNrIGRlcGVuZGVudCBjb21wb25lbnRzLiBUaGlzIGZlYXR1cmUgaXMgb25seSBhdmFpbGFibGUgd2hlbgorICB1c2luZyBRdElGVyAzLjEgb3IgbGF0ZXIuCiAKICogTW9kdWxlcyA6bW9kdWxlOmBDUGFja1JQTWAgYW5kIDptb2R1bGU6YENQYWNrRGViYCBsZWFybmVkIHRvIHNldCBwYWNrYWdlIGVwb2NoCiAgIHZlcnNpb24uCmRpZmYgLS1naXQgYS9IZWxwL3JlbGVhc2UvZGV2LzAtc2FtcGxlLXRvcGljLnJzdCBiL0hlbHAvcmVsZWFzZS9kZXYvMC1zYW1wbGUtdG9waWMucnN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGNjMDFlLi4wMDAwMDAwCi0tLSBhL0hlbHAvcmVsZWFzZS9kZXYvMC1zYW1wbGUtdG9waWMucnN0CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0wLXNhbXBsZS10b3BpYwotLS0tLS0tLS0tLS0tLS0KLQotKiBUaGlzIGlzIGEgc2FtcGxlIHJlbGVhc2Ugbm90ZSBmb3IgdGhlIGNoYW5nZSBpbiBhIHRvcGljLgotICBEZXZlbG9wZXJzIHNob3VsZCBhZGQgc2ltaWxhciBub3RlcyBmb3IgZWFjaCB0b3BpYyBicmFuY2gKLSAgbWFraW5nIGEgbm90ZXdvcnRoeSBjaGFuZ2UuICBFYWNoIGRvY3VtZW50IHNob3VsZCBiZSBuYW1lZAotICBhbmQgdGl0bGVkIHRvIG1hdGNoIHRoZSB0b3BpYyBuYW1lIHRvIGF2b2lkIG1lcmdlIGNvbmZsaWN0cy4KZGlmZiAtLWdpdCBhL0hlbHAvcmVsZWFzZS9pbmRleC5yc3QgYi9IZWxwL3JlbGVhc2UvaW5kZXgucnN0CmluZGV4IDY0NzJiNTEuLjBjNzU3MmYgMTAwNjQ0Ci0tLSBhL0hlbHAvcmVsZWFzZS9pbmRleC5yc3QKKysrIGIvSGVscC9yZWxlYXNlL2luZGV4LnJzdApAQCAtNyw4ICs3LDYgQEAKICAgVGhpcyBmaWxlIHNob3VsZCBpbmNsdWRlIHRoZSBhZGphY2VudCAiZGV2LnR4dCIgZmlsZQogICBpbiBkZXZlbG9wbWVudCB2ZXJzaW9ucyBidXQgbm90IGluIHJlbGVhc2UgdmVyc2lvbnMuCiAKLS4uIGluY2x1ZGU6OiBkZXYudHh0Ci0KIFJlbGVhc2VzCiA9PT09PT09PQogCmRpZmYgLS1naXQgYS9IZWxwL3ZhcmlhYmxlL0NNQUtFX0FVVE9SQ0NfT1BUSU9OUy5yc3QgYi9IZWxwL3ZhcmlhYmxlL0NNQUtFX0FVVE9SQ0NfT1BUSU9OUy5yc3QKaW5kZXggMjk4Y2I2Yi4uODE1ZDM5ZCAxMDA2NDQKLS0tIGEvSGVscC92YXJpYWJsZS9DTUFLRV9BVVRPUkNDX09QVElPTlMucnN0CisrKyBiL0hlbHAvdmFyaWFibGUvQ01BS0VfQVVUT1JDQ19PUFRJT05TLnJzdApAQCAtMSw3ICsxLDE2IEBACiBDTUFLRV9BVVRPUkNDX09QVElPTlMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGV0aGVyIHRvIGhhbmRsZSBgYHJjY2BgIGF1dG9tYXRpY2FsbHkgZm9yIFF0IHRhcmdldHMuCitBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIGBgcmNjYGAgd2hlbiB1c2luZyA6dmFyaWFibGU6YENNQUtFX0FVVE9SQ0NgLgogCiBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgOnByb3BfdGd0OmBBVVRPUkNDX09QVElPTlNgIHByb3BlcnR5IG9uCiBhbGwgdGhlIHRhcmdldHMuICBTZWUgdGhhdCB0YXJnZXQgcHJvcGVydHkgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCisKK0VYQU1QTEUKK15eXl5eXl4KKworLi4gY29kZS1ibG9jazo6IGNtYWtlCisKKyAgIyAuLi4KKyAgc2V0KENNQUtFX0FVVE9SQ0NfT1BUSU9OUyAiLS1jb21wcmVzczs5IikKKyAgIyAuLi4KZGlmZiAtLWdpdCBhL0hlbHAvdmFyaWFibGUvQ01BS0VfQVVUT1VJQ19PUFRJT05TLnJzdCBiL0hlbHAvdmFyaWFibGUvQ01BS0VfQVVUT1VJQ19PUFRJT05TLnJzdAppbmRleCAzYzliOGM0Li4yOGZhOTJmIDEwMDY0NAotLS0gYS9IZWxwL3ZhcmlhYmxlL0NNQUtFX0FVVE9VSUNfT1BUSU9OUy5yc3QKKysrIGIvSGVscC92YXJpYWJsZS9DTUFLRV9BVVRPVUlDX09QVElPTlMucnN0CkBAIC0xLDcgKzEsMTYgQEAKIENNQUtFX0FVVE9VSUNfT1BUSU9OUwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVdoZXRoZXIgdG8gaGFuZGxlIGBgdWljYGAgYXV0b21hdGljYWxseSBmb3IgUXQgdGFyZ2V0cy4KK0FkZGl0aW9uYWwgb3B0aW9ucyBmb3IgYGB1aWNgYCB3aGVuIHVzaW5nIDp2YXJpYWJsZTpgQ01BS0VfQVVUT1VJQ2AuCiAKIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSA6cHJvcF90Z3Q6YEFVVE9VSUNfT1BUSU9OU2AgcHJvcGVydHkgb24KIGFsbCB0aGUgdGFyZ2V0cy4gIFNlZSB0aGF0IHRhcmdldCBwcm9wZXJ0eSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KKworRVhBTVBMRQorXl5eXl5eXgorCisuLiBjb2RlLWJsb2NrOjogY21ha2UKKworICAjIC4uLgorICBzZXRfcHJvcGVydHkoQ01BS0VfQVVUT1VJQ19PUFRJT05TICItLW5vLXByb3RlY3Rpb24iKQorICAjIC4uLgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9DUGFja0RlYi5jbWFrZSBiL01vZHVsZXMvQ1BhY2tEZWIuY21ha2UKaW5kZXggMzM3YmVjOC4uMTg3OTgyNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9DUGFja0RlYi5jbWFrZQorKysgYi9Nb2R1bGVzL0NQYWNrRGViLmNtYWtlCkBAIC0xMTAsNiArMTEwLDE0IEBACiAjICA6dmFyaWFibGU6YENQQUNLX0RFQklBTl9QQUNLQUdFX1JFTEVBU0VgIGlzIG5vdCBzZXQgdGhlbiBoeXBoZW5zIGFyZSBub3QKICMgIGFsbG93ZWQuCiAjCisjICAuLiBub3RlOjoKKyMKKyMgICAgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBDTWFrZSAzLjkgYW5kIGxvd2VyIGEgZmFpbGVkIHRlc3Qgb2YgdGhpcworIyAgICB2YXJpYWJsZSdzIGNvbnRlbnQgaXMgbm90IGEgaGFyZCBlcnJvciB3aGVuIGJvdGgKKyMgICAgOnZhcmlhYmxlOmBDUEFDS19ERUJJQU5fUEFDS0FHRV9SRUxFQVNFYCBhbmQKKyMgICAgOnZhcmlhYmxlOmBDUEFDS19ERUJJQU5fUEFDS0FHRV9FUE9DSGAgdmFyaWFibGVzIGFyZSBub3Qgc2V0LiBBbiBhdXRob3IKKyMgICAgd2FybmluZyBpcyByZXBvcnRlZCBpbnN0ZWFkLgorIwogIyAuLiB2YXJpYWJsZTo6IENQQUNLX0RFQklBTl9QQUNLQUdFX1JFTEVBU0UKICMKICMgIFRoZSBEZWJpYW4gcGFja2FnZSByZWxlYXNlIC0gRGViaWFuIHJldmlzaW9uIG51bWJlci4KQEAgLTc1Myw5ICs3NjEsMjIgQEAKICAgICBzZXQoQ1BBQ0tfREVCSUFOX1BBQ0tBR0VfVkVSU0lPTiAke0NQQUNLX1BBQ0tBR0VfVkVSU0lPTn0pCiAgIGVuZGlmKCkKIAotICBpZihOT1QgQ1BBQ0tfREVCSUFOX1BBQ0tBR0VfVkVSU0lPTiBNQVRDSEVTICJeWzAtOV1bQS1aYS16MC05Listfl0qJCIpCi0gICAgbWVzc2FnZShGQVRBTF9FUlJPUgotICAgICAgIkNQYWNrRGViOiBEZWJpYW4gcGFja2FnZSB2ZXJzaW9uIG11c3QgY29uZmlybSB0byBcIl5bMC05XVtBLVphLXowLTkuKy1+XSokXCIgcmVnZXghIikKKyAgaWYoREVGSU5FRCBDUEFDS19ERUJJQU5fUEFDS0FHRV9SRUxFQVNFIE9SIERFRklORUQgQ1BBQ0tfREVCSUFOX1BBQ0tBR0VfRVBPQ0gpCisgICAgIyBvbmx5IHRlc3QgdGhlIHZlcnNpb24gZm9ybWF0IGlmIENQQUNLX0RFQklBTl9QQUNLQUdFX1JFTEVBU0Ugb3IKKyAgICAjIENQQUNLX0RFQklBTl9QQUNLQUdFX0VQT0NIIGlzIHNldAorICAgIGlmKE5PVCBDUEFDS19ERUJJQU5fUEFDS0FHRV9WRVJTSU9OIE1BVENIRVMgIl5bMC05XVtBLVphLXowLTkuK34tXSokIikKKyAgICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IKKyAgICAgICAgIkNQYWNrRGViOiBEZWJpYW4gcGFja2FnZSB2ZXJzaW9uIG11c3QgY29uZmlybSB0byBcIl5bMC05XVtBLVphLXowLTkuK34tXSokXCIgcmVnZXghIikKKyAgICBlbmRpZigpCisgIGVsc2UoKQorICAgICMgYmVmb3JlIENNYWtlIDMuMTAgdmVyc2lvbiBmb3JtYXQgd2FzIG5vdCB0ZXN0ZWQgc28gb25seSB3YXJuIHRvIHByZXNlcnZlCisgICAgIyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgaWYoTk9UIENQQUNLX0RFQklBTl9QQUNLQUdFX1ZFUlNJT04gTUFUQ0hFUyAiXihbMC05XSs6KT9bMC05XVtBLVphLXowLTkuK34tXSokIikKKyAgICAgIG1lc3NhZ2UoQVVUSE9SX1dBUk5JTkcKKyAgICAgICAgIkNQYWNrRGViOiBEZWJpYW4gcGFja2FnZSB2ZXJzaW9uaW5nIChbPGVwb2NoPjpdPHZlcnNpb24+Wy08cmVsZWFzZT5dKSIKKyAgICAgICAgIiBzaG91bGQgY29uZmlybSB0byBcIl4oWzAtOV0rOik/WzAtOV1bQS1aYS16MC05Lit+LV0qJFwiIHJlZ2V4IGluIgorICAgICAgICAiIG9yZGVyIHRvIHNhdGlzZnkgRGViaWFuIHBhY2thZ2luZyBydWxlcy4iKQorICAgIGVuZGlmKCkKICAgZW5kaWYoKQogCiAgIGlmKENQQUNLX0RFQklBTl9QQUNLQUdFX1JFTEVBU0UpCkBAIC03NjUsOSArNzg2LDE1IEBACiAgICAgZW5kaWYoKQogICAgIHN0cmluZyhBUFBFTkQgQ1BBQ0tfREVCSUFOX1BBQ0tBR0VfVkVSU0lPTgogICAgICAgIi0ke0NQQUNLX0RFQklBTl9QQUNLQUdFX1JFTEVBU0V9IikKLSAgZWxzZWlmKENQQUNLX0RFQklBTl9QQUNLQUdFX1ZFUlNJT04gTUFUQ0hFUyAiLiotLioiKQotICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IKLSAgICAgICJDUGFja0RlYjogRGViaWFuIHBhY2thZ2UgdmVyc2lvbiBtdXN0IG5vdCBjb250YWluIGh5cGhlbnMgd2hlbiBDUEFDS19ERUJJQU5fUEFDS0FHRV9SRUxFQVNFIGlzIG5vdCBwcm92aWRlZCEiKQorICBlbHNlaWYoREVGSU5FRCBDUEFDS19ERUJJQU5fUEFDS0FHRV9FUE9DSCkKKyAgICAjIG9ubHkgdGVzdCB0aGUgdmVyc2lvbiBmb3JtYXQgaWYgQ1BBQ0tfREVCSUFOX1BBQ0tBR0VfUkVMRUFTRSBvcgorICAgICMgQ1BBQ0tfREVCSUFOX1BBQ0tBR0VfRVBPQ0ggaXMgc2V0IC0gdmVyc2lvbnMgQ1BhY2svRGViIGdlbmVyYXRvciBiZWZvcmUKKyAgICAjIENNYWtlIDMuMTAgZGlkIG5vdCBjaGVjayBmb3IgdmVyc2lvbiBmb3JtYXQgc28gd2UgaGF2ZSB0byBwcmVzZXJ2ZQorICAgICMgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgIGlmKENQQUNLX0RFQklBTl9QQUNLQUdFX1ZFUlNJT04gTUFUQ0hFUyAiLiotLioiKQorICAgICAgbWVzc2FnZShGQVRBTF9FUlJPUgorICAgICAgICAiQ1BhY2tEZWI6IERlYmlhbiBwYWNrYWdlIHZlcnNpb24gbXVzdCBub3QgY29udGFpbiBoeXBoZW5zIHdoZW4gQ1BBQ0tfREVCSUFOX1BBQ0tBR0VfUkVMRUFTRSBpcyBub3QgcHJvdmlkZWQhIikKKyAgICBlbmRpZigpCiAgIGVuZGlmKCkKIAogICBpZihDUEFDS19ERUJJQU5fUEFDS0FHRV9FUE9DSCkKZGlmZiAtLWdpdCBhL01vZHVsZXMvQ29tcGlsZXIvQ2xhbmcuY21ha2UgYi9Nb2R1bGVzL0NvbXBpbGVyL0NsYW5nLmNtYWtlCmluZGV4IDdkNDc2ZjkuLjlmNWU5MjEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvQ29tcGlsZXIvQ2xhbmcuY21ha2UKKysrIGIvTW9kdWxlcy9Db21waWxlci9DbGFuZy5jbWFrZQpAQCAtNjksMTUgKzY5LDE1IEBACiAgICAgZW5kaWYoKQogCiAgICAgc2V0KENNQUtFXyR7bGFuZ31fQVJDSElWRV9DUkVBVEVfSVBPCi0gICAgICAiJHtfX2FyfSBjciA8VEFSR0VUPiA8TElOS19GTEFHUz4gPE9CSkVDVFM+IgorICAgICAgIlwiJHtfX2FyfVwiIGNyIDxUQVJHRVQ+IDxMSU5LX0ZMQUdTPiA8T0JKRUNUUz4iCiAgICAgKQogCiAgICAgc2V0KENNQUtFXyR7bGFuZ31fQVJDSElWRV9BUFBFTkRfSVBPCi0gICAgICAiJHtfX2FyfSByIDxUQVJHRVQ+IDxMSU5LX0ZMQUdTPiA8T0JKRUNUUz4iCisgICAgICAiXCIke19fYXJ9XCIgciA8VEFSR0VUPiA8TElOS19GTEFHUz4gPE9CSkVDVFM+IgogICAgICkKIAogICAgIHNldChDTUFLRV8ke2xhbmd9X0FSQ0hJVkVfRklOSVNIX0lQTwotICAgICAgIiR7X19yYW5saWJ9IDxUQVJHRVQ+IgorICAgICAgIlwiJHtfX3JhbmxpYn1cIiA8VEFSR0VUPiIKICAgICApCiAgIGVuZG1hY3JvKCkKIGVuZGlmKCkKZGlmZiAtLWdpdCBhL01vZHVsZXMvQ29tcGlsZXIvR05VLmNtYWtlIGIvTW9kdWxlcy9Db21waWxlci9HTlUuY21ha2UKaW5kZXggNjc1ZTUwNS4uZDk2MjY4OCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9Db21waWxlci9HTlUuY21ha2UKKysrIGIvTW9kdWxlcy9Db21waWxlci9HTlUuY21ha2UKQEAgLTc1LDE1ICs3NSwxNSBAQAogICAgICMKICAgICAjIFsxXTogaHR0cHM6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2djYy00LjkuNC9nY2MvT3B0aW1pemUtT3B0aW9ucy5odG1sCiAgICAgc2V0KENNQUtFXyR7bGFuZ31fQVJDSElWRV9DUkVBVEVfSVBPCi0gICAgICAiJHtDTUFLRV8ke2xhbmd9X0NPTVBJTEVSX0FSfSBjciA8VEFSR0VUPiA8TElOS19GTEFHUz4gPE9CSkVDVFM+IgorICAgICAgIlwiJHtDTUFLRV8ke2xhbmd9X0NPTVBJTEVSX0FSfVwiIGNyIDxUQVJHRVQ+IDxMSU5LX0ZMQUdTPiA8T0JKRUNUUz4iCiAgICAgKQogCiAgICAgc2V0KENNQUtFXyR7bGFuZ31fQVJDSElWRV9BUFBFTkRfSVBPCi0gICAgICAiJHtDTUFLRV8ke2xhbmd9X0NPTVBJTEVSX0FSfSByIDxUQVJHRVQ+IDxMSU5LX0ZMQUdTPiA8T0JKRUNUUz4iCisgICAgICAiXCIke0NNQUtFXyR7bGFuZ31fQ09NUElMRVJfQVJ9XCIgciA8VEFSR0VUPiA8TElOS19GTEFHUz4gPE9CSkVDVFM+IgogICAgICkKIAogICAgIHNldChDTUFLRV8ke2xhbmd9X0FSQ0hJVkVfRklOSVNIX0lQTwotICAgICAgIiR7Q01BS0VfJHtsYW5nfV9DT01QSUxFUl9SQU5MSUJ9IDxUQVJHRVQ+IgorICAgICAgIlwiJHtDTUFLRV8ke2xhbmd9X0NPTVBJTEVSX1JBTkxJQn1cIiA8VEFSR0VUPiIKICAgICApCiAgIGVuZGlmKCkKIGVuZG1hY3JvKCkKZGlmZiAtLWdpdCBhL01vZHVsZXMvRXh0ZXJuYWxQcm9qZWN0LmNtYWtlIGIvTW9kdWxlcy9FeHRlcm5hbFByb2plY3QuY21ha2UKaW5kZXggNzZmNTA4MC4uNDE5YzlkNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9FeHRlcm5hbFByb2plY3QuY21ha2UKKysrIGIvTW9kdWxlcy9FeHRlcm5hbFByb2plY3QuY21ha2UKQEAgLTg1NCw2ICs4NTQsOSBAQAogCiAjXT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XQogCitjbWFrZV9wb2xpY3koUFVTSCkKK2NtYWtlX3BvbGljeShTRVQgQ01QMDA1NCBORVcpICMgaWYoKSBxdW90ZWQgdmFyaWFibGVzIG5vdCBkZXJlZmVyZW5jZWQKKwogIyBQcmUtY29tcHV0ZSBhIHJlZ2V4IHRvIG1hdGNoIGRvY3VtZW50ZWQga2V5d29yZHMgZm9yIGVhY2ggY29tbWFuZC4KIG1hdGgoRVhQUiBfZXBfZG9jdW1lbnRhdGlvbl9saW5lX2NvdW50ICIke0NNQUtFX0NVUlJFTlRfTElTVF9MSU5FfSAtIDQiKQogZmlsZShTVFJJTkdTICIke0NNQUtFX0NVUlJFTlRfTElTVF9GSUxFfSIgbGluZXMKQEAgLTMwMzUsMyArMzAzOCw1IEBACiAgICMKICAgX2VwX2FkZF90ZXN0X2NvbW1hbmQoJHtuYW1lfSkKIGVuZGZ1bmN0aW9uKCkKKworY21ha2VfcG9saWN5KFBPUCkKZGlmZiAtLWdpdCBhL01vZHVsZXMvRmluZENVREEuY21ha2UgYi9Nb2R1bGVzL0ZpbmRDVURBLmNtYWtlCmluZGV4IGJkN2QwYzAuLjFjOGFjMjYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvRmluZENVREEuY21ha2UKKysrIGIvTW9kdWxlcy9GaW5kQ1VEQS5jbWFrZQpAQCAtMzM5LDcgKzMzOSwyNyBAQAogIyAgIENVREFfbnBwY19MSUJSQVJZICAgICAtLSBOVklESUEgUGVyZm9ybWFuY2UgUHJpbWl0aXZlcyBsaWIgKGNvcmUpLgogIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IGF2YWlsYWJsZSBmb3IgQ1VEQSB2ZXJzaW9uIDUuNSsuCiAjICAgQ1VEQV9ucHBpX0xJQlJBUlkgICAgIC0tIE5WSURJQSBQZXJmb3JtYW5jZSBQcmltaXRpdmVzIGxpYiAoaW1hZ2UgcHJvY2Vzc2luZykuCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgYXZhaWxhYmxlIGZvciBDVURBIHZlcnNpb24gNS41Ky4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSBhdmFpbGFibGUgZm9yIENVREEgdmVyc2lvbiA1LjUgLSA4LjAuCisjICAgQ1VEQV9ucHBpYWxfTElCUkFSWSAgIC0tIE5WSURJQSBQZXJmb3JtYW5jZSBQcmltaXRpdmVzIGxpYiAoaW1hZ2UgcHJvY2Vzc2luZykuCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgYXZhaWxhYmxlIGZvciBDVURBIHZlcnNpb24gOS4wLgorIyAgIENVREFfbnBwaWNjX0xJQlJBUlkgICAtLSBOVklESUEgUGVyZm9ybWFuY2UgUHJpbWl0aXZlcyBsaWIgKGltYWdlIHByb2Nlc3NpbmcpLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IGF2YWlsYWJsZSBmb3IgQ1VEQSB2ZXJzaW9uIDkuMC4KKyMgICBDVURBX25wcGljb21fTElCUkFSWSAgLS0gTlZJRElBIFBlcmZvcm1hbmNlIFByaW1pdGl2ZXMgbGliIChpbWFnZSBwcm9jZXNzaW5nKS4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSBhdmFpbGFibGUgZm9yIENVREEgdmVyc2lvbiA5LjAuCisjICAgQ1VEQV9ucHBpZGVpX0xJQlJBUlkgIC0tIE5WSURJQSBQZXJmb3JtYW5jZSBQcmltaXRpdmVzIGxpYiAoaW1hZ2UgcHJvY2Vzc2luZykuCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgYXZhaWxhYmxlIGZvciBDVURBIHZlcnNpb24gOS4wLgorIyAgIENVREFfbnBwaWZfTElCUkFSWSAgICAtLSBOVklESUEgUGVyZm9ybWFuY2UgUHJpbWl0aXZlcyBsaWIgKGltYWdlIHByb2Nlc3NpbmcpLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IGF2YWlsYWJsZSBmb3IgQ1VEQSB2ZXJzaW9uIDkuMC4KKyMgICBDVURBX25wcGlnX0xJQlJBUlkgICAgLS0gTlZJRElBIFBlcmZvcm1hbmNlIFByaW1pdGl2ZXMgbGliIChpbWFnZSBwcm9jZXNzaW5nKS4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSBhdmFpbGFibGUgZm9yIENVREEgdmVyc2lvbiA5LjAuCisjICAgQ1VEQV9ucHBpbV9MSUJSQVJZICAgIC0tIE5WSURJQSBQZXJmb3JtYW5jZSBQcmltaXRpdmVzIGxpYiAoaW1hZ2UgcHJvY2Vzc2luZykuCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgYXZhaWxhYmxlIGZvciBDVURBIHZlcnNpb24gOS4wLgorIyAgIENVREFfbnBwaXN0X0xJQlJBUlkgICAtLSBOVklESUEgUGVyZm9ybWFuY2UgUHJpbWl0aXZlcyBsaWIgKGltYWdlIHByb2Nlc3NpbmcpLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IGF2YWlsYWJsZSBmb3IgQ1VEQSB2ZXJzaW9uIDkuMC4KKyMgICBDVURBX25wcGlzdV9MSUJSQVJZICAgLS0gTlZJRElBIFBlcmZvcm1hbmNlIFByaW1pdGl2ZXMgbGliIChpbWFnZSBwcm9jZXNzaW5nKS4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSBhdmFpbGFibGUgZm9yIENVREEgdmVyc2lvbiA5LjAuCisjICAgQ1VEQV9ucHBpdGNfTElCUkFSWSAgIC0tIE5WSURJQSBQZXJmb3JtYW5jZSBQcmltaXRpdmVzIGxpYiAoaW1hZ2UgcHJvY2Vzc2luZykuCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgYXZhaWxhYmxlIGZvciBDVURBIHZlcnNpb24gOS4wLgogIyAgIENVREFfbnBwc19MSUJSQVJZICAgICAtLSBOVklESUEgUGVyZm9ybWFuY2UgUHJpbWl0aXZlcyBsaWIgKHNpZ25hbCBwcm9jZXNzaW5nKS4KICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSBhdmFpbGFibGUgZm9yIENVREEgdmVyc2lvbiA1LjUrLgogIyAgIENVREFfbnZjdXZlbmNfTElCUkFSWSAtLSBDVURBIFZpZGVvIEVuY29kZXIgbGlicmFyeS4KQEAgLTkzOSw2ICs5NTksMjQgQEAKIGVuZGlmKCkKIGlmKENVREFfVkVSU0lPTiBWRVJTSU9OX0dSRUFURVIgIjUuMCIpCiAgIGZpbmRfY3VkYV9oZWxwZXJfbGlicyhjdWJsYXNfZGV2aWNlKQorZW5kaWYoKQorCitpZihOT1QgQ1VEQV9WRVJTSU9OIFZFUlNJT05fTEVTUyAiOS4wIikKKyAgIyBJbiBDVURBIDkuMCBOUFAgd2FzIG5wcGkgd2FzIHJlbW92ZWQKKyAgZmluZF9jdWRhX2hlbHBlcl9saWJzKG5wcGMpCisgIGZpbmRfY3VkYV9oZWxwZXJfbGlicyhucHBpYWwpCisgIGZpbmRfY3VkYV9oZWxwZXJfbGlicyhucHBpY2MpCisgIGZpbmRfY3VkYV9oZWxwZXJfbGlicyhucHBpY29tKQorICBmaW5kX2N1ZGFfaGVscGVyX2xpYnMobnBwaWRlaSkKKyAgZmluZF9jdWRhX2hlbHBlcl9saWJzKG5wcGlmKQorICBmaW5kX2N1ZGFfaGVscGVyX2xpYnMobnBwaWcpCisgIGZpbmRfY3VkYV9oZWxwZXJfbGlicyhucHBpbSkKKyAgZmluZF9jdWRhX2hlbHBlcl9saWJzKG5wcGlzdCkKKyAgZmluZF9jdWRhX2hlbHBlcl9saWJzKG5wcGlzdSkKKyAgZmluZF9jdWRhX2hlbHBlcl9saWJzKG5wcGl0YykKKyAgZmluZF9jdWRhX2hlbHBlcl9saWJzKG5wcHMpCisgIHNldChDVURBX25wcF9MSUJSQVJZICIke0NVREFfbnBwY19MSUJSQVJZfTske0NVREFfbnBwaWFsX0xJQlJBUll9OyR7Q1VEQV9ucHBpY2NfTElCUkFSWX07JHtDVURBX25wcGljb21fTElCUkFSWX07JHtDVURBX25wcGlkZWlfTElCUkFSWX07JHtDVURBX25wcGlmX0xJQlJBUll9OyR7Q1VEQV9ucHBpZ19MSUJSQVJZfTske0NVREFfbnBwaW1fTElCUkFSWX07JHtDVURBX25wcGlzdF9MSUJSQVJZfTske0NVREFfbnBwaXN1X0xJQlJBUll9OyR7Q1VEQV9ucHBpdGNfTElCUkFSWX07JHtDVURBX25wcHNfTElCUkFSWX0iKQorZWxzZWlmKENVREFfVkVSU0lPTiBWRVJTSU9OX0dSRUFURVIgIjUuMCIpCiAgICMgSW4gQ1VEQSA1LjUgTlBQIHdhcyBzcGxpdHRlZCBvbnRvIDMgc2VwYXJhdGUgbGlicmFyaWVzLgogICBmaW5kX2N1ZGFfaGVscGVyX2xpYnMobnBwYykKICAgZmluZF9jdWRhX2hlbHBlcl9saWJzKG5wcGkpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL0ZpbmRKYXZhLmNtYWtlIGIvTW9kdWxlcy9GaW5kSmF2YS5jbWFrZQppbmRleCBlYjIyNDJiLi5iOTEzZTE3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL0ZpbmRKYXZhLmNtYWtlCisrKyBiL01vZHVsZXMvRmluZEphdmEuY21ha2UKQEAgLTM5LDcgKzM5LDcgQEAKICMgICBKYXZhX1ZFUlNJT05fTUlOT1IgICAgICAgID0gVGhlIG1pbm9yIHZlcnNpb24gb2YgdGhlIHBhY2thZ2UgZm91bmQuCiAjICAgSmF2YV9WRVJTSU9OX1BBVENIICAgICAgICA9IFRoZSBwYXRjaCB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlIGZvdW5kLgogIyAgIEphdmFfVkVSU0lPTl9UV0VBSyAgICAgICAgPSBUaGUgdHdlYWsgdmVyc2lvbiBvZiB0aGUgcGFja2FnZSBmb3VuZCAoYWZ0ZXIgJ18nKQotIyAgIEphdmFfVkVSU0lPTiAgICAgICAgICAgICAgPSBUaGlzIGlzIHNldCB0bzogJG1ham9yLiRtaW5vci4kcGF0Y2goLiR0d2VhaykKKyMgICBKYXZhX1ZFUlNJT04gICAgICAgICAgICAgID0gVGhpcyBpcyBzZXQgdG86ICRtYWpvclsuJG1pbm9yWy4kcGF0Y2hbLiR0d2Vha11dXQogIwogIwogIwpAQCAtMTMzLDM5ICsxMzMsNTYgQEAKICAgICAgICAgbWVzc2FnZSggU1RBVFVTICJXYXJuaW5nLCBjb3VsZCBub3QgcnVuIGphdmEgLXZlcnNpb24iKQogICAgICAgZW5kaWYoKQogICAgIGVsc2UoKQotICAgICAgIyBleHRyYWN0IG1ham9yL21pbm9yIHZlcnNpb24gYW5kIHBhdGNoIGxldmVsIGZyb20gImphdmEgLXZlcnNpb24iIG91dHB1dAotICAgICAgIyBUZXN0ZWQgb24gbGludXggdXNpbmcKLSAgICAgICMgMS4gU3VuIC8gU3VuIE9FTQotICAgICAgIyAyLiBPcGVuSkRLIDEuNgotICAgICAgIyAzLiBHQ0ogMS41Ci0gICAgICAjIDQuIEthZmZlIDEuNC4yCi0gICAgICAjIDUuIE9wZW5KREsgMS43Lnggb24gT3BlbkJTRAotICAgICAgaWYodmFyIE1BVENIRVMgImphdmEgdmVyc2lvbiBcIihbMC05XStcXC5bMC05XStcXC5bMC05Xy5dKy4qKVwiIikKLSAgICAgICAgIyBUaGlzIGlzIG1vc3QgbGlrZWx5IFN1biAvIE9wZW5KREssIG9yIG1heWJlIEdDSi1qYXZhIGNvbXBhdCBsYXllcgorICAgICAgIyBFeHRyYWN0IHZlcnNpb24gY29tcG9uZW50cyAodXAgdG8gNCBsZXZlbHMpIGZyb20gImphdmEgLXZlcnNpb24iIG91dHB1dC4KKyAgICAgIHNldChfamF2YV92ZXJzaW9uX3JlZ2V4IFtbKChbMC05XSspKFwuKFswLTldKykoXC4oWzAtOV0rKShfKFswLTldKykpPyk/KT8uKildXSkKKyAgICAgIGlmKHZhciBNQVRDSEVTICJqYXZhIHZlcnNpb24gXCIke19qYXZhX3ZlcnNpb25fcmVnZXh9XCIiKQorICAgICAgICAjIFN1biwgR0NKLCBvbGRlciBPcGVuSkRLCiAgICAgICAgIHNldChKYXZhX1ZFUlNJT05fU1RSSU5HICIke0NNQUtFX01BVENIXzF9IikKKyAgICAgICAgc2V0KEphdmFfVkVSU0lPTl9NQUpPUiAiJHtDTUFLRV9NQVRDSF8yfSIpCisgICAgICAgIHNldChKYXZhX1ZFUlNJT05fTUlOT1IgIiR7Q01BS0VfTUFUQ0hfNH0iKQorICAgICAgICBzZXQoSmF2YV9WRVJTSU9OX1BBVENIICIke0NNQUtFX01BVENIXzZ9IikKKyAgICAgICAgc2V0KEphdmFfVkVSU0lPTl9UV0VBSyAiJHtDTUFLRV9NQVRDSF84fSIpCisgICAgICBlbHNlaWYodmFyIE1BVENIRVMgIm9wZW5qZGsgdmVyc2lvbiBcIiR7X2phdmFfdmVyc2lvbl9yZWdleH1cIiIpCisgICAgICAgICMgT3BlbkpESworICAgICAgICBzZXQoSmF2YV9WRVJTSU9OX1NUUklORyAiJHtDTUFLRV9NQVRDSF8xfSIpCisgICAgICAgIHNldChKYXZhX1ZFUlNJT05fTUFKT1IgIiR7Q01BS0VfTUFUQ0hfMn0iKQorICAgICAgICBzZXQoSmF2YV9WRVJTSU9OX01JTk9SICIke0NNQUtFX01BVENIXzR9IikKKyAgICAgICAgc2V0KEphdmFfVkVSU0lPTl9QQVRDSCAiJHtDTUFLRV9NQVRDSF82fSIpCisgICAgICAgIHNldChKYXZhX1ZFUlNJT05fVFdFQUsgIiR7Q01BS0VfTUFUQ0hfOH0iKQogICAgICAgZWxzZWlmKHZhciBNQVRDSEVTICJvcGVuamRrIHZlcnNpb24gXCIoWzAtOV0rKS1bQS1aYS16XStcIiIpCiAgICAgICAgICMgT3BlbkpESyA5IGVhcmx5IGFjY2VzcyBidWlsZHMgb3IgbG9jYWxseSBidWlsdAogICAgICAgICBzZXQoSmF2YV9WRVJTSU9OX1NUUklORyAiMS4ke0NNQUtFX01BVENIXzF9LjAiKQotICAgICAgZWxzZWlmKHZhciBNQVRDSEVTICJqYXZhIGZ1bGwgdmVyc2lvbiBcImthZmZlLShbMC05XStcXC5bMC05XStcXC5bMC05X10rKVwiIikKKyAgICAgICAgc2V0KEphdmFfVkVSU0lPTl9NQUpPUiAiMSIpCisgICAgICAgIHNldChKYXZhX1ZFUlNJT05fTUlOT1IgIiR7Q01BS0VfTUFUQ0hfMX0iKQorICAgICAgICBzZXQoSmF2YV9WRVJTSU9OX1BBVENIICIwIikKKyAgICAgICAgc2V0KEphdmFfVkVSU0lPTl9UV0VBSyAiIikKKyAgICAgIGVsc2VpZih2YXIgTUFUQ0hFUyAiamF2YSBmdWxsIHZlcnNpb24gXCJrYWZmZS0ke19qYXZhX3ZlcnNpb25fcmVnZXh9XCIiKQogICAgICAgICAjIEthZmZlIHN0eWxlCiAgICAgICAgIHNldChKYXZhX1ZFUlNJT05fU1RSSU5HICIke0NNQUtFX01BVENIXzF9IikKLSAgICAgIGVsc2VpZih2YXIgTUFUQ0hFUyAib3BlbmpkayB2ZXJzaW9uIFwiKFswLTldK1xcLlswLTldK1xcLlswLTlfXSsuKilcIiIpCi0gICAgICAgICMgT3BlbkpESyB2ZXIgMS43Lnggb24gT3BlbkJTRAotICAgICAgICBzZXQoSmF2YV9WRVJTSU9OX1NUUklORyAiJHtDTUFLRV9NQVRDSF8xfSIpCisgICAgICAgIHNldChKYXZhX1ZFUlNJT05fTUFKT1IgIiR7Q01BS0VfTUFUQ0hfMn0iKQorICAgICAgICBzZXQoSmF2YV9WRVJTSU9OX01JTk9SICIke0NNQUtFX01BVENIXzR9IikKKyAgICAgICAgc2V0KEphdmFfVkVSU0lPTl9QQVRDSCAiJHtDTUFLRV9NQVRDSF82fSIpCisgICAgICAgIHNldChKYXZhX1ZFUlNJT05fVFdFQUsgIiR7Q01BS0VfTUFUQ0hfOH0iKQogICAgICAgZWxzZSgpCiAgICAgICAgIGlmKE5PVCBKYXZhX0ZJTkRfUVVJRVRMWSkKLSAgICAgICAgICBtZXNzYWdlKFdBUk5JTkcgInJlZ2V4IG5vdCBzdXBwb3J0ZWQ6ICR7dmFyfS4gUGxlYXNlIHJlcG9ydCIpCisgICAgICAgICAgc3RyaW5nKFJFUExBQ0UgIlxuIiAiXG4gICIgdmVyX21zZyAiXG4ke3Zhcn0iKQorICAgICAgICAgIG1lc3NhZ2UoV0FSTklORyAiSmF2YSB2ZXJzaW9uIG5vdCByZWNvZ25pemVkOiR7dmVyX21zZ31cblBsZWFzZSByZXBvcnQuIikKICAgICAgICAgZW5kaWYoKQorICAgICAgICBzZXQoSmF2YV9WRVJTSU9OX1NUUklORyAiIikKKyAgICAgICAgc2V0KEphdmFfVkVSU0lPTl9NQUpPUiAiIikKKyAgICAgICAgc2V0KEphdmFfVkVSU0lPTl9NSU5PUiAiIikKKyAgICAgICAgc2V0KEphdmFfVkVSU0lPTl9QQVRDSCAiIikKKyAgICAgICAgc2V0KEphdmFfVkVSU0lPTl9UV0VBSyAiIikKICAgICAgIGVuZGlmKCkKLSAgICAgIHN0cmluZyggUkVHRVggUkVQTEFDRSAiKFswLTldKykuKiIgIlxcMSIgSmF2YV9WRVJTSU9OX01BSk9SICIke0phdmFfVkVSU0lPTl9TVFJJTkd9IiApCi0gICAgICBzdHJpbmcoIFJFR0VYIFJFUExBQ0UgIlswLTldK1xcLihbMC05XSspLioiICJcXDEiIEphdmFfVkVSU0lPTl9NSU5PUiAiJHtKYXZhX1ZFUlNJT05fU1RSSU5HfSIgKQotICAgICAgc3RyaW5nKCBSRUdFWCBSRVBMQUNFICJbMC05XStcXC5bMC05XStcXC4oWzAtOV0rKS4qIiAiXFwxIiBKYXZhX1ZFUlNJT05fUEFUQ0ggIiR7SmF2YV9WRVJTSU9OX1NUUklOR30iICkKLSAgICAgICMgd2FybmluZyB0d2VhayB2ZXJzaW9uIGNhbiBiZSBlbXB0eToKLSAgICAgIHN0cmluZyggUkVHRVggUkVQTEFDRSAiWzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rW19cXC5dPyhbMC05XSopLiokIiAiXFwxIiBKYXZhX1ZFUlNJT05fVFdFQUsgIiR7SmF2YV9WRVJTSU9OX1NUUklOR30iICkKLSAgICAgIGlmKCBKYXZhX1ZFUlNJT05fVFdFQUsgU1RSRVFVQUwgIiIgKSAjIGNoZWNrIGNhc2Ugd2hlcmUgdHdlYWsgaXMgbm90IGRlZmluZWQKLSAgICAgICAgc2V0KEphdmFfVkVSU0lPTiAke0phdmFfVkVSU0lPTl9NQUpPUn0uJHtKYXZhX1ZFUlNJT05fTUlOT1J9LiR7SmF2YV9WRVJTSU9OX1BBVENIfSkKLSAgICAgIGVsc2UoKQotICAgICAgICBzZXQoSmF2YV9WRVJTSU9OICR7SmF2YV9WRVJTSU9OX01BSk9SfS4ke0phdmFfVkVSU0lPTl9NSU5PUn0uJHtKYXZhX1ZFUlNJT05fUEFUQ0h9LiR7SmF2YV9WRVJTSU9OX1RXRUFLfSkKKyAgICAgIHNldChKYXZhX1ZFUlNJT04gIiR7SmF2YV9WRVJTSU9OX01BSk9SfSIpCisgICAgICBpZihOT1QgIngke0phdmFfVkVSU0lPTn0iIFNUUkVRVUFMICJ4IikKKyAgICAgICAgZm9yZWFjaChjIE1JTk9SIFBBVENIIFRXRUFLKQorICAgICAgICAgIGlmKE5PVCAieCR7SmF2YV9WRVJTSU9OXyR7Y319IiBTVFJFUVVBTCAieCIpCisgICAgICAgICAgICBzdHJpbmcoQVBQRU5EIEphdmFfVkVSU0lPTiAiLiR7SmF2YV9WRVJTSU9OXyR7Y319IikKKyAgICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgIGJyZWFrKCkKKyAgICAgICAgICBlbmRpZigpCisgICAgICAgIGVuZGZvcmVhY2goKQogICAgICAgZW5kaWYoKQogICAgIGVuZGlmKCkKIApAQCAtMjU0LDcgKzI3MSw3IEBACiAgIGZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhKYXZhCiAgICAgUkVRVUlSRURfVkFSUyBKYXZhX0pBVkFfRVhFQ1VUQUJMRSBKYXZhX0pBUl9FWEVDVVRBQkxFIEphdmFfSkFWQUNfRVhFQ1VUQUJMRQogICAgICAgICAgICAgICAgICAgSmF2YV9KQVZBSF9FWEVDVVRBQkxFIEphdmFfSkFWQURPQ19FWEVDVVRBQkxFCi0gICAgVkVSU0lPTl9WQVIgSmF2YV9WRVJTSU9OCisgICAgVkVSU0lPTl9WQVIgSmF2YV9WRVJTSU9OX1NUUklORwogICAgICkKIGVuZGlmKCkKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9GaW5kT3Blbk1QLmNtYWtlIGIvTW9kdWxlcy9GaW5kT3Blbk1QLmNtYWtlCmluZGV4IDI3MmY0ZGMuLjFkNmEwMzkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvRmluZE9wZW5NUC5jbWFrZQorKysgYi9Nb2R1bGVzL0ZpbmRPcGVuTVAuY21ha2UKQEAgLTE2NiwxNCArMTY2LDIzIEBACiAgIF9PUEVOTVBfRkxBR19DQU5ESURBVEVTKCIke0xBTkd9IikKICAgX09QRU5NUF9XUklURV9TT1VSQ0VfRklMRSgiJHtMQU5HfSIgIlRFU1RfU09VUkNFIiBPcGVuTVBUcnlGbGFnIF9PUEVOTVBfVEVTVF9TUkMpCiAKKyAgdW5zZXQoT3Blbk1QX1ZFUkJPU0VfQ09NUElMRV9PUFRJT05TKQorICBzZXBhcmF0ZV9hcmd1bWVudHMoT3Blbk1QX1ZFUkJPU0VfT1BUSU9OUyBOQVRJVkVfQ09NTUFORCAiJHtDTUFLRV8ke0xBTkd9X1ZFUkJPU0VfRkxBR30iKQorICBmb3JlYWNoKF9WRVJCT1NFX09QVElPTiBJTiBMSVNUUyBPcGVuTVBfVkVSQk9TRV9PUFRJT05TKQorICAgIGlmKE5PVCBfVkVSQk9TRV9PUFRJT04gTUFUQ0hFUyAiXi1XbCwiKQorICAgICAgbGlzdChBUFBFTkQgT3Blbk1QX1ZFUkJPU0VfQ09NUElMRV9PUFRJT05TICR7X1ZFUkJPU0VfT1BUSU9OfSkKKyAgICBlbmRpZigpCisgIGVuZGZvcmVhY2goKQorCiAgIGZvcmVhY2goT1BFTk1QX0ZMQUcgSU4gTElTVFMgT3Blbk1QXyR7TEFOR31fRkxBR19DQU5ESURBVEVTKQogICAgIHNldChPUEVOTVBfRkxBR1NfVEVTVCAiJHtPUEVOTVBfRkxBR30iKQotICAgIGlmKENNQUtFXyR7TEFOR31fVkVSQk9TRV9GTEFHKQotICAgICAgc3RyaW5nKEFQUEVORCBPUEVOTVBfRkxBR1NfVEVTVCAiICR7Q01BS0VfJHtMQU5HfV9WRVJCT1NFX0ZMQUd9IikKKyAgICBpZihPcGVuTVBfVkVSQk9TRV9DT01QSUxFX09QVElPTlMpCisgICAgICBzdHJpbmcoQVBQRU5EIE9QRU5NUF9GTEFHU19URVNUICIgJHtPcGVuTVBfVkVSQk9TRV9DT01QSUxFX09QVElPTlN9IikKICAgICBlbmRpZigpCiAgICAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlstLz0rXSIgIiIgT1BFTk1QX1BMQUlOX0ZMQUcgIiR7T1BFTk1QX0ZMQUd9IikKICAgICB0cnlfY29tcGlsZSggT3Blbk1QX0NPTVBJTEVfUkVTVUxUXyR7RkxBR19NT0RFfV8ke09QRU5NUF9QTEFJTl9GTEFHfSAke0NNQUtFX0JJTkFSWV9ESVJ9ICR7X09QRU5NUF9URVNUX1NSQ30KICAgICAgIENNQUtFX0ZMQUdTICItRENPTVBJTEVfREVGSU5JVElPTlM6U1RSSU5HPSR7T1BFTk1QX0ZMQUdTX1RFU1R9IgorICAgICAgTElOS19MSUJSQVJJRVMgJHtDTUFLRV8ke0xBTkd9X1ZFUkJPU0VfRkxBR30KICAgICAgIE9VVFBVVF9WQVJJQUJMRSBPcGVuTVBfVFJZX0NPTVBJTEVfT1VUUFVUCiAgICAgKQogCkBAIC0yMzAsNiArMjM5LDggQEAKICAgICBzZXQoIiR7T1BFTk1QX0xJQl9OQU1FU19WQVJ9IiAiTk9URk9VTkQiIFBBUkVOVF9TQ09QRSkKICAgICBzZXQoIiR7T1BFTk1QX0ZMQUdfVkFSfSIgIk5PVEZPVU5EIiBQQVJFTlRfU0NPUEUpCiAgIGVuZGZvcmVhY2goKQorCisgIHVuc2V0KE9wZW5NUF9WRVJCT1NFX0NPTVBJTEVfT1BUSU9OUykKIGVuZGZ1bmN0aW9uKCkKIAogc2V0KE9wZW5NUF9DX0NYWF9DSEVDS19WRVJTSU9OX1NPVVJDRQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9GaW5kUHJvdG9idWYuY21ha2UgYi9Nb2R1bGVzL0ZpbmRQcm90b2J1Zi5jbWFrZQppbmRleCA3MjkyYWVjLi5lMWE3MTVlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL0ZpbmRQcm90b2J1Zi5jbWFrZQorKysgYi9Nb2R1bGVzL0ZpbmRQcm90b2J1Zi5jbWFrZQpAQCAtMTAxLDcgKzEwMSw3IEBACiAjICAgYGBIRFJTYGAKICMgICAgIFZhcmlhYmxlIHRvIGRlZmluZSB3aXRoIGF1dG9nZW5lcmF0ZWQgaGVhZGVyIGZpbGVzCiAjICAgYGBERVNDUklQVE9SU2BgCi0jICAgICBWYXJpYWJsZSB0byBkZWZpbmUgd2l0aCBhdW90Z2VuZXJhdGVkIGRlc2NyaXB0b3IgZmlsZXMsIGlmIHJlcXVlc3RlZC4KKyMgICAgIFZhcmlhYmxlIHRvIGRlZmluZSB3aXRoIGF1dG9nZW5lcmF0ZWQgZGVzY3JpcHRvciBmaWxlcywgaWYgcmVxdWVzdGVkLgogIyAgIGBgRVhQT1JUX01BQ1JPYGAKICMgICAgIGlzIGEgbWFjcm8gd2hpY2ggc2hvdWxkIGV4cGFuZCB0byBgYF9fZGVjbHNwZWMoZGxsZXhwb3J0KWBgIG9yCiAjICAgICBgYF9fZGVjbHNwZWMoZGxsaW1wb3J0KWBgIGRlcGVuZGluZyBvbiB3aGF0IGlzIGJlaW5nIGNvbXBpbGVkLgpkaWZmIC0tZ2l0IGEvU291cmNlL0NNYWtlVmVyc2lvbi5jbWFrZSBiL1NvdXJjZS9DTWFrZVZlcnNpb24uY21ha2UKaW5kZXggNDdkODAyNS4uNGNlNjU3NSAxMDA2NDQKLS0tIGEvU291cmNlL0NNYWtlVmVyc2lvbi5jbWFrZQorKysgYi9Tb3VyY2UvQ01ha2VWZXJzaW9uLmNtYWtlCkBAIC0xLDUgKzEsNSBAQAogIyBDTWFrZSB2ZXJzaW9uIG51bWJlciBjb21wb25lbnRzLgogc2V0KENNYWtlX1ZFUlNJT05fTUFKT1IgMykKLXNldChDTWFrZV9WRVJTSU9OX01JTk9SIDkpCi1zZXQoQ01ha2VfVkVSU0lPTl9QQVRDSCAyMDE3MTAwNSkKLSNzZXQoQ01ha2VfVkVSU0lPTl9SQyAxKQorc2V0KENNYWtlX1ZFUlNJT05fTUlOT1IgMTApCitzZXQoQ01ha2VfVkVSU0lPTl9QQVRDSCAwKQorc2V0KENNYWtlX1ZFUlNJT05fUkMgMSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9DUGFjay9jbUNQYWNrUGFja2FnZU1ha2VyR2VuZXJhdG9yLmN4eCBiL1NvdXJjZS9DUGFjay9jbUNQYWNrUGFja2FnZU1ha2VyR2VuZXJhdG9yLmN4eAppbmRleCAwMjk5Mjc5Li5kYmNiMDIyIDEwMDY0NAotLS0gYS9Tb3VyY2UvQ1BhY2svY21DUGFja1BhY2thZ2VNYWtlckdlbmVyYXRvci5jeHgKKysrIGIvU291cmNlL0NQYWNrL2NtQ1BhY2tQYWNrYWdlTWFrZXJHZW5lcmF0b3IuY3h4CkBAIC0yODgsOCArMjg4LDggQEAKICAgdG1wRmlsZSArPSAiL2hkaXV0aWxPdXRwdXQubG9nIjsKICAgc3RkOjpvc3RyaW5nc3RyZWFtIGRtZ0NtZDsKICAgZG1nQ21kIDw8ICJcIiIgPDwgdGhpcy0+R2V0T3B0aW9uKCJDUEFDS19JTlNUQUxMRVJfUFJPR1JBTV9ESVNLX0lNQUdFIikKLSAgICAgICAgIDw8ICJcIiBjcmVhdGUgLW92IC1mb3JtYXQgVURaTyAtc3JjZm9sZGVyIFwiIiA8PCBwYWNrYWdlRGlyRmlsZU5hbWUKLSAgICAgICAgIDw8ICJcIiBcIiIgPDwgcGFja2FnZUZpbGVOYW1lc1swXSA8PCAiXCIiOworICAgICAgICAgPDwgIlwiIGNyZWF0ZSAtb3YgLWZzIEhGUysgLWZvcm1hdCBVRFpPIC1zcmNmb2xkZXIgXCIiCisgICAgICAgICA8PCBwYWNrYWdlRGlyRmlsZU5hbWUgPDwgIlwiIFwiIiA8PCBwYWNrYWdlRmlsZU5hbWVzWzBdIDw8ICJcIiI7CiAgIHN0ZDo6c3RyaW5nIG91dHB1dDsKICAgaW50IHJldFZhbCA9IDE7CiAgIGludCBudW1UcmllcyA9IDEwOwpkaWZmIC0tZ2l0IGEvU291cmNlL2NtR2VuZXJhdG9yVGFyZ2V0LmN4eCBiL1NvdXJjZS9jbUdlbmVyYXRvclRhcmdldC5jeHgKaW5kZXggZWE0MTIwNGUuLjEwM2QwMzQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9jbUdlbmVyYXRvclRhcmdldC5jeHgKKysrIGIvU291cmNlL2NtR2VuZXJhdG9yVGFyZ2V0LmN4eApAQCAtNDY1NCw3ICs0NjU0LDcgQEAKICAgICAgICAgIklOVEVSRkFDRV9MSU5LX0xJQlJBUklFUzpcbiIKICAgICAgICAgIiAgIiA8PCBuZXdFeHBsaWNpdExpYnJhcmllcyA8PCAiXG4iIDw8CiAgICAgICAgIGxpbmtJZmFjZVByb3AgPDwgIjpcbiIKLSAgICAgICAgIiAgIiA8PCAoZXhwbGljaXRMaWJyYXJpZXMgPyBleHBsaWNpdExpYnJhcmllcyA6ICIoZW1wdHkpIikgPDwgIlxuIjsKKyAgICAgICAgIiAgIiA8PCBleHBsaWNpdExpYnJhcmllcyA8PCAiXG4iOwogICAgICAgLyogY2xhbmctZm9ybWF0IG9uICovCiAgICAgICB0aGlzLT5Mb2NhbEdlbmVyYXRvci0+SXNzdWVNZXNzYWdlKGNtYWtlOjpBVVRIT1JfV0FSTklORywgdy5zdHIoKSk7CiAgICAgICB0aGlzLT5Qb2xpY3lXYXJuZWRDTVAwMDIyID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9jbUluc3RhbGxDb21tYW5kQXJndW1lbnRzLmN4eCBiL1NvdXJjZS9jbUluc3RhbGxDb21tYW5kQXJndW1lbnRzLmN4eAppbmRleCBmZjY0MjBkLi4xMmFiYWM4IDEwMDY0NAotLS0gYS9Tb3VyY2UvY21JbnN0YWxsQ29tbWFuZEFyZ3VtZW50cy5jeHgKKysrIGIvU291cmNlL2NtSW5zdGFsbENvbW1hbmRBcmd1bWVudHMuY3h4CkBAIC0zOSw3ICszOSw3IEBACiAgIGlmICh0aGlzLT5HZW5lcmljQXJndW1lbnRzICE9IG51bGxwdHIpIHsKICAgICByZXR1cm4gdGhpcy0+R2VuZXJpY0FyZ3VtZW50cy0+R2V0RGVzdGluYXRpb24oKTsKICAgfQotICByZXR1cm4gdGhpcy0+RW1wdHlTdHJpbmc7CisgIHJldHVybiBFbXB0eVN0cmluZzsKIH0KIAogY29uc3Qgc3RkOjpzdHJpbmcmIGNtSW5zdGFsbENvbW1hbmRBcmd1bWVudHM6OkdldENvbXBvbmVudCgpIGNvbnN0CkBAIC02NSw3ICs2NSw3IEBACiAgIGlmICh0aGlzLT5HZW5lcmljQXJndW1lbnRzICE9IG51bGxwdHIpIHsKICAgICByZXR1cm4gdGhpcy0+R2VuZXJpY0FyZ3VtZW50cy0+R2V0UmVuYW1lKCk7CiAgIH0KLSAgcmV0dXJuIHRoaXMtPkVtcHR5U3RyaW5nOworICByZXR1cm4gRW1wdHlTdHJpbmc7CiB9CiAKIGNvbnN0IHN0ZDo6c3RyaW5nJiBjbUluc3RhbGxDb21tYW5kQXJndW1lbnRzOjpHZXRQZXJtaXNzaW9ucygpIGNvbnN0CkBAIC03Niw3ICs3Niw3IEBACiAgIGlmICh0aGlzLT5HZW5lcmljQXJndW1lbnRzICE9IG51bGxwdHIpIHsKICAgICByZXR1cm4gdGhpcy0+R2VuZXJpY0FyZ3VtZW50cy0+R2V0UGVybWlzc2lvbnMoKTsKICAgfQotICByZXR1cm4gdGhpcy0+RW1wdHlTdHJpbmc7CisgIHJldHVybiBFbXB0eVN0cmluZzsKIH0KIAogYm9vbCBjbUluc3RhbGxDb21tYW5kQXJndW1lbnRzOjpHZXRPcHRpb25hbCgpIGNvbnN0CmRpZmYgLS1naXQgYS9Tb3VyY2UvY21Qcm9jZXNzVG9vbHMuY3h4IGIvU291cmNlL2NtUHJvY2Vzc1Rvb2xzLmN4eAppbmRleCAwNWIxYjAwLi43YWIxZmEzIDEwMDY0NAotLS0gYS9Tb3VyY2UvY21Qcm9jZXNzVG9vbHMuY3h4CisrKyBiL1NvdXJjZS9jbVByb2Nlc3NUb29scy5jeHgKQEAgLTM4LDcgKzM4LDcgQEAKICAgaWYgKGVycikgewogICAgIHByb2Nlc3NPdXRwdXQuRGVjb2RlVGV4dChzdGQ6OnN0cmluZygpLCBzdHJkYXRhLCAyKTsKICAgICBpZiAoIXN0cmRhdGEuZW1wdHkoKSkgewotICAgICAgb3V0LT5Qcm9jZXNzKHN0cmRhdGEuY19zdHIoKSwgaW50KHN0cmRhdGEuc2l6ZSgpKSk7CisgICAgICBlcnItPlByb2Nlc3Moc3RyZGF0YS5jX3N0cigpLCBpbnQoc3RyZGF0YS5zaXplKCkpKTsKICAgICB9CiAgIH0KICAgY21zeXNQcm9jZXNzX1dhaXRGb3JFeGl0KGNwLCBudWxscHRyKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9jbVF0QXV0b0dlbmVyYXRvckluaXRpYWxpemVyLmN4eCBiL1NvdXJjZS9jbVF0QXV0b0dlbmVyYXRvckluaXRpYWxpemVyLmN4eAppbmRleCAyMTc4NjViLi5lNzA4MGNkIDEwMDY0NAotLS0gYS9Tb3VyY2UvY21RdEF1dG9HZW5lcmF0b3JJbml0aWFsaXplci5jeHgKKysrIGIvU291cmNlL2NtUXRBdXRvR2VuZXJhdG9ySW5pdGlhbGl6ZXIuY3h4CkBAIC00NTIsOCArNDUyLDYgQEAKICAgY21HZW5lcmF0b3JUYXJnZXQgY29uc3QqIHRhcmdldCA9IGRpZ2VzdC5UYXJnZXQ7CiAgIGNtTWFrZWZpbGUqIG1ha2VmaWxlID0gdGFyZ2V0LT5UYXJnZXQtPkdldE1ha2VmaWxlKCk7CiAKLSAgQWRkRGVmaW5pdGlvbkVzY2FwZWQobWFrZWZpbGUsICJfdWljX3NraXAiLCBzZXR1cC5VaWNTa2lwKTsKLQogICAvLyBVaWMgc2VhcmNoIHBhdGhzCiAgIHsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdWljU2VhcmNoUGF0aHM7CkBAIC00ODksMjEgKzQ4NywyNSBAQAogICAgICAgfQogICAgIH0KICAgfQotICAvLyBVaWMgZmlsZXMgb3B0aW9ucworICAvLyAudWkgZmlsZXMgc2tpcCBhbmQgb3B0aW9ucwogICB7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHVpRmlsZUZpbGVzOwogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4gdWlGaWxlT3B0aW9uczsKICAgICB7CiAgICAgICBzdGQ6OnN0cmluZyBjb25zdCB1aUV4dCA9ICJ1aSI7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3RvcjxjbVNvdXJjZUZpbGUqPiYgc3JjRmlsZXMgPSBtYWtlZmlsZS0+R2V0U291cmNlRmlsZXMoKTsKLSAgICAgIGZvciAoY21Tb3VyY2VGaWxlKiBzZiA6IHNyY0ZpbGVzKSB7CisgICAgICBmb3IgKGNtU291cmNlRmlsZSogc2YgOiBtYWtlZmlsZS0+R2V0U291cmNlRmlsZXMoKSkgewogICAgICAgICAvLyBzZi0+R2V0RXh0ZW5zaW9uKCkgaXMgb25seSB2YWxpZCBhZnRlciBzZi0+R2V0RnVsbFBhdGgoKSAuLi4KICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIGZQYXRoID0gc2YtPkdldEZ1bGxQYXRoKCk7CiAgICAgICAgIGlmIChzZi0+R2V0RXh0ZW5zaW9uKCkgPT0gdWlFeHQpIHsKKyAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCBhYnNGaWxlID0gY21TeXN0ZW1Ub29sczo6R2V0UmVhbFBhdGgoZlBhdGgpOworICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIHNob3VsZCBiZSBza2lwcGVkCisgICAgICAgICAgaWYgKHNmLT5HZXRQcm9wZXJ0eUFzQm9vbCgiU0tJUF9BVVRPVUlDIikgfHwKKyAgICAgICAgICAgICAgc2YtPkdldFByb3BlcnR5QXNCb29sKCJTS0lQX0FVVE9HRU4iKSkgeworICAgICAgICAgICAgc2V0dXAuVWljU2tpcC5pbnNlcnQoYWJzRmlsZSk7CisgICAgICAgICAgfQogICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlcyBoYXMgdWljIG9wdGlvbnMKICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCB1aWNPcHRzID0gR2V0U2FmZVByb3BlcnR5KHNmLCAiQVVUT1VJQ19PUFRJT05TIik7CiAgICAgICAgICAgaWYgKCF1aWNPcHRzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0IGFic0ZpbGUgPSBjbVN5c3RlbVRvb2xzOjpHZXRSZWFsUGF0aChmUGF0aCk7CiAgICAgICAgICAgICAvLyBDaGVjayBpZiBmaWxlIGlzbid0IHNraXBwZWQKICAgICAgICAgICAgIGlmIChzZXR1cC5VaWNTa2lwLmNvdW50KGFic0ZpbGUpID09IDApIHsKICAgICAgICAgICAgICAgdWlGaWxlRmlsZXMucHVzaF9iYWNrKGFic0ZpbGUpOwpAQCAtNTE5LDYgKzUyMSw4IEBACiAgICAgQWRkRGVmaW5pdGlvbkVzY2FwZWQobWFrZWZpbGUsICJfcXRfdWljX29wdGlvbnNfb3B0aW9ucyIsIHVpRmlsZU9wdGlvbnMpOwogICB9CiAKKyAgQWRkRGVmaW5pdGlvbkVzY2FwZWQobWFrZWZpbGUsICJfdWljX3NraXAiLCBzZXR1cC5VaWNTa2lwKTsKKwogICAvLyBVaWMgZXhlY3V0YWJsZQogICB7CiAgICAgc3RkOjpzdHJpbmcgZXJyOwpkaWZmIC0tZ2l0IGEvU291cmNlL2NtY21kLmN4eCBiL1NvdXJjZS9jbWNtZC5jeHgKaW5kZXggYzBjN2QwMy4uZWQ1MDdmZCAxMDA2NDQKLS0tIGEvU291cmNlL2NtY21kLmN4eAorKysgYi9Tb3VyY2UvY21jbWQuY3h4CkBAIC0xNTU2LDExICsxNTU2LDEzIEBACiBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyRm9ybWF0dGVyIGNvbnN0JiBmb3JtYXR0ZXIpCiB7CisgIGF1dG8gY29uc3QmIGZsYWdzID0gc3RyZWFtLmZsYWdzKCk7CiAgIGlmIChmb3JtYXR0ZXIuRm9ybWF0ID09IEZPUk1BVF9ERUNJTUFMKSB7Ci0gICAgc3RyZWFtIDw8IGZvcm1hdHRlci5WYWx1ZTsKKyAgICBzdHJlYW0gPDwgc3RkOjpkZWMgPDwgZm9ybWF0dGVyLlZhbHVlOwogICB9IGVsc2UgewogICAgIHN0cmVhbSA8PCAiMHgiIDw8IHN0ZDo6aGV4IDw8IGZvcm1hdHRlci5WYWx1ZTsKICAgfQorICBzdHJlYW0uZmxhZ3MoZmxhZ3MpOwogICByZXR1cm4gc3RyZWFtOwogfQogc3RhdGljIGJvb2wgUnVuQ29tbWFuZChjb25zdCBjaGFyKiBjb21tZW50LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNvbW1hbmQsCmRpZmYgLS1naXQgYS9UZXN0cy9SdW5DTWFrZS9DUGFjay9SdW5DTWFrZVRlc3QuY21ha2UgYi9UZXN0cy9SdW5DTWFrZS9DUGFjay9SdW5DTWFrZVRlc3QuY21ha2UKaW5kZXggMDRhYzU4NC4uYWE1NWM0NCAxMDA2NDQKLS0tIGEvVGVzdHMvUnVuQ01ha2UvQ1BhY2svUnVuQ01ha2VUZXN0LmNtYWtlCisrKyBiL1Rlc3RzL1J1bkNNYWtlL0NQYWNrL1J1bkNNYWtlVGVzdC5jbWFrZQpAQCAtMjksMyArMjksNCBAQAogcnVuX2NwYWNrX3Rlc3QoVVNFUl9GSUxFTElTVCAiUlBNIiBmYWxzZSAiTU9OT0xJVEhJQyIpCiBydW5fY3BhY2tfdGVzdChNRDVTVU1TICJERUIiIGZhbHNlICJNT05PTElUSElDO0NPTVBPTkVOVCIpCiBydW5fY3BhY2tfdGVzdChDUEFDS19JTlNUQUxMX1NDUklQVCAiWklQIiBmYWxzZSAiTU9OT0xJVEhJQyIpCitydW5fY3BhY2tfdGVzdChERUJfUEFDS0FHRV9WRVJTSU9OX0JBQ0tfQ09NUEFUSUJJTElUWSAiREVCIiBmYWxzZSAiTU9OT0xJVEhJQztDT01QT05FTlQiKQpkaWZmIC0tZ2l0IGEvVGVzdHMvUnVuQ01ha2UvQ1BhY2svdGVzdHMvREVCX1BBQ0tBR0VfVkVSU0lPTl9CQUNLX0NPTVBBVElCSUxJVFkvRXhwZWN0ZWRGaWxlcy5jbWFrZSBiL1Rlc3RzL1J1bkNNYWtlL0NQYWNrL3Rlc3RzL0RFQl9QQUNLQUdFX1ZFUlNJT05fQkFDS19DT01QQVRJQklMSVRZL0V4cGVjdGVkRmlsZXMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0MmViMwotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RzL1J1bkNNYWtlL0NQYWNrL3Rlc3RzL0RFQl9QQUNLQUdFX1ZFUlNJT05fQkFDS19DT01QQVRJQklMSVRZL0V4cGVjdGVkRmlsZXMuY21ha2UKQEAgLTAsMCArMSwyIEBACitzZXQoRVhQRUNURURfRklMRVNfQ09VTlQgIjEiKQorc2V0KEVYUEVDVEVEX0ZJTEVfQ09OVEVOVF8xX0xJU1QgIi91c3I7L3Vzci9mb287L3Vzci9mb28vQ01ha2VMaXN0cy50eHQiKQpkaWZmIC0tZ2l0IGEvVGVzdHMvUnVuQ01ha2UvQ1BhY2svdGVzdHMvREVCX1BBQ0tBR0VfVkVSU0lPTl9CQUNLX0NPTVBBVElCSUxJVFkvVmVyaWZ5UmVzdWx0LmNtYWtlIGIvVGVzdHMvUnVuQ01ha2UvQ1BhY2svdGVzdHMvREVCX1BBQ0tBR0VfVkVSU0lPTl9CQUNLX0NPTVBBVElCSUxJVFkvVmVyaWZ5UmVzdWx0LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MWNjMTAKLS0tIC9kZXYvbnVsbAorKysgYi9UZXN0cy9SdW5DTWFrZS9DUGFjay90ZXN0cy9ERUJfUEFDS0FHRV9WRVJTSU9OX0JBQ0tfQ09NUEFUSUJJTElUWS9WZXJpZnlSZXN1bHQuY21ha2UKQEAgLTAsMCArMSwxMSBAQAorZnVuY3Rpb24oY2hlY2tQYWNrYWdlSW5mb18gVFlQRSBGSUxFIFJFR0VYKQorICBnZXRQYWNrYWdlSW5mbygiJHtGSUxFfSIgIkZJTEVfSU5GT18iKQorICBpZihOT1QgRklMRV9JTkZPXyBNQVRDSEVTICIke1JFR0VYfSIpCisgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiVW5leHBlY3RlZCAke1RZUEV9IGluICcke0ZJTEV9JyAke0VYUEVDVEVEX0ZJTEVfMV9WRVJTSU9OfSAke0VYUEVDVEVEX0ZJTEVfMV9SRVZJU0lPTn07IGZpbGUgaW5mbzogJyR7RklMRV9JTkZPX30nIikKKyAgZW5kaWYoKQorZW5kZnVuY3Rpb24oKQorCitzZXQod2hpdGVzcGFjZXNfICJbXHRcblxyIF0qIikKKworY2hlY2tQYWNrYWdlSW5mb18oInZlcnNpb24iICIke0ZPVU5EX0ZJTEVfMX0iCisgICIuKlZlcnNpb24ke3doaXRlc3BhY2VzX306JHt3aGl0ZXNwYWNlc199NS4wLjEtNzEtZzg4NDg1MmUiKQpkaWZmIC0tZ2l0IGEvVGVzdHMvUnVuQ01ha2UvQ1BhY2svdGVzdHMvREVCX1BBQ0tBR0VfVkVSU0lPTl9CQUNLX0NPTVBBVElCSUxJVFkvdGVzdC5jbWFrZSBiL1Rlc3RzL1J1bkNNYWtlL0NQYWNrL3Rlc3RzL0RFQl9QQUNLQUdFX1ZFUlNJT05fQkFDS19DT01QQVRJQklMSVRZL3Rlc3QuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAzZTYwZAotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3RzL1J1bkNNYWtlL0NQYWNrL3Rlc3RzL0RFQl9QQUNLQUdFX1ZFUlNJT05fQkFDS19DT01QQVRJQklMSVRZL3Rlc3QuY21ha2UKQEAgLTAsMCArMSw3IEBACitpbnN0YWxsKEZJTEVTIENNYWtlTGlzdHMudHh0IERFU1RJTkFUSU9OIGZvbyBDT01QT05FTlQgdGVzdCkKKworc2V0KENQQUNLX0RFQklBTl9QQUNLQUdFX1ZFUlNJT04gIjUuMC4xLTcxLWc4ODQ4NTJlIikKKworaWYoUEFDS0FHSU5HX1RZUEUgU1RSRVFVQUwgIkNPTVBPTkVOVCIpCisgIHNldChDUEFDS19DT01QT05FTlRTX0FMTCB0ZXN0KQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvVGVzdHMvUnVuQ01ha2UvWGNvZGVQcm9qZWN0L1J1bkNNYWtlVGVzdC5jbWFrZSBiL1Rlc3RzL1J1bkNNYWtlL1hjb2RlUHJvamVjdC9SdW5DTWFrZVRlc3QuY21ha2UKaW5kZXggNTU0YWEyZi4uN2Q0MzZiNiAxMDA2NDQKLS0tIGEvVGVzdHMvUnVuQ01ha2UvWGNvZGVQcm9qZWN0L1J1bkNNYWtlVGVzdC5jbWFrZQorKysgYi9UZXN0cy9SdW5DTWFrZS9YY29kZVByb2plY3QvUnVuQ01ha2VUZXN0LmNtYWtlCkBAIC0xLDUgKzEsOSBAQAogaW5jbHVkZShSdW5DTWFrZSkKIAoraWYoWENPREVfVkVSU0lPTiBWRVJTSU9OX0dSRUFURVJfRVFVQUwgOSkKKyAgc2V0KElPU19ERVBMT1lNRU5UX1RBUkdFVCAiLURDTUFLRV9YQ09ERV9BVFRSSUJVVEVfSVBIT05FT1NfREVQTE9ZTUVOVF9UQVJHRVQ9MTAiKQorZW5kaWYoKQorCiBydW5fY21ha2UoWGNvZGVGaWxlVHlwZSkKIHJ1bl9jbWFrZShYY29kZUF0dHJpYnV0ZUxvY2F0aW9uKQogcnVuX2NtYWtlKFhjb2RlQXR0cmlidXRlR2VuZXgpCkBAIC0yMCw3ICsyNCw5IEBACiBpZihOT1QgWENPREVfVkVSU0lPTiBWRVJTSU9OX0xFU1MgNSkKICAgc2V0KFJ1bkNNYWtlX1RFU1RfQklOQVJZX0RJUiAke1J1bkNNYWtlX0JJTkFSWV9ESVJ9L1hjb2RlSW5zdGFsbElPUy1idWlsZCkKICAgc2V0KFJ1bkNNYWtlX1RFU1RfTk9fQ0xFQU4gMSkKLSAgc2V0KFJ1bkNNYWtlX1RFU1RfT1BUSU9OUyAiLURDTUFLRV9JTlNUQUxMX1BSRUZJWDpQQVRIPSR7UnVuQ01ha2VfQklOQVJZX0RJUn0vaW9zX2luc3RhbGwiKQorICBzZXQoUnVuQ01ha2VfVEVTVF9PUFRJT05TCisgICAgIi1EQ01BS0VfSU5TVEFMTF9QUkVGSVg6UEFUSD0ke1J1bkNNYWtlX0JJTkFSWV9ESVJ9L2lvc19pbnN0YWxsIgorICAgICIke0lPU19ERVBMT1lNRU5UX1RBUkdFVH0iKQogCiAgIGZpbGUoUkVNT1ZFX1JFQ1VSU0UgIiR7UnVuQ01ha2VfVEVTVF9CSU5BUllfRElSfSIpCiAgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgIiR7UnVuQ01ha2VfVEVTVF9CSU5BUllfRElSfSIpCkBAIC01Myw3ICs1OSw4IEBACiAgIHNldChSdW5DTWFrZV9URVNUX05PX0NMRUFOIDEpCiAgIHNldChSdW5DTWFrZV9URVNUX09QVElPTlMKICAgICAiLURURVNUX0lPUz1PTiIKLSAgICAiLURDTUFLRV9JTlNUQUxMX1BSRUZJWDpQQVRIPSR7UnVuQ01ha2VfVEVTVF9CSU5BUllfRElSfS9faW5zdGFsbCIpCisgICAgIi1EQ01BS0VfSU5TVEFMTF9QUkVGSVg6UEFUSD0ke1J1bkNNYWtlX1RFU1RfQklOQVJZX0RJUn0vX2luc3RhbGwiCisgICAgIiR7SU9TX0RFUExPWU1FTlRfVEFSR0VUfSIpCiAKICAgZmlsZShSRU1PVkVfUkVDVVJTRSAiJHtSdW5DTWFrZV9URVNUX0JJTkFSWV9ESVJ9IikKICAgZmlsZShNQUtFX0RJUkVDVE9SWSAiJHtSdW5DTWFrZV9URVNUX0JJTkFSWV9ESVJ9IikKQEAgLTExNyw3ICsxMjQsOCBAQAogICBzZXQoUnVuQ01ha2VfVEVTVF9OT19DTEVBTiAxKQogICBzZXQoUnVuQ01ha2VfVEVTVF9PUFRJT05TCiAgICAgIi1EQ01BS0VfSU5TVEFMTF9QUkVGSVg6UEFUSD0ke1J1bkNNYWtlX1RFU1RfQklOQVJZX0RJUn0vX2luc3RhbGwiCi0gICAgIi1EQ01BS0VfSU9TX0lOU1RBTExfQ09NQklORUQ9WUVTIikKKyAgICAiLURDTUFLRV9JT1NfSU5TVEFMTF9DT01CSU5FRD1ZRVMiCisgICAgIiR7SU9TX0RFUExPWU1FTlRfVEFSR0VUfSIpCiAKICAgZmlsZShSRU1PVkVfUkVDVVJTRSAiJHtSdW5DTWFrZV9URVNUX0JJTkFSWV9ESVJ9IikKICAgZmlsZShNQUtFX0RJUkVDVE9SWSAiJHtSdW5DTWFrZV9URVNUX0JJTkFSWV9ESVJ9IikKQEAgLTEyOSwxNSArMTM3LDE0IEBACiAgIHVuc2V0KFJ1bkNNYWtlX1RFU1RfQklOQVJZX0RJUikKICAgdW5zZXQoUnVuQ01ha2VfVEVTVF9OT19DTEVBTikKICAgdW5zZXQoUnVuQ01ha2VfVEVTVF9PUFRJT05TKQotZW5kaWYoKQogCi1pZihYQ09ERV9WRVJTSU9OIFZFUlNJT05fR1JFQVRFUl9FUVVBTCA2IEFORCBYQ09ERV9WRVJTSU9OIFZFUlNJT05fTEVTUyA5KQogICAjIFhjb2RlSU9TSW5zdGFsbENvbWJpbmVkUHJ1bmUKICAgc2V0KFJ1bkNNYWtlX1RFU1RfQklOQVJZX0RJUiAke1J1bkNNYWtlX0JJTkFSWV9ESVJ9L1hjb2RlSU9TSW5zdGFsbENvbWJpbmVkUHJ1bmUtYnVpbGQpCiAgIHNldChSdW5DTWFrZV9URVNUX05PX0NMRUFOIDEpCiAgIHNldChSdW5DTWFrZV9URVNUX09QVElPTlMKICAgICAiLURDTUFLRV9JTlNUQUxMX1BSRUZJWDpQQVRIPSR7UnVuQ01ha2VfVEVTVF9CSU5BUllfRElSfS9faW5zdGFsbCIKLSAgICAiLURDTUFLRV9JT1NfSU5TVEFMTF9DT01CSU5FRD1ZRVMiKQorICAgICItRENNQUtFX0lPU19JTlNUQUxMX0NPTUJJTkVEPVlFUyIKKyAgICAiJHtJT1NfREVQTE9ZTUVOVF9UQVJHRVR9IikKIAogICBmaWxlKFJFTU9WRV9SRUNVUlNFICIke1J1bkNNYWtlX1RFU1RfQklOQVJZX0RJUn0iKQogICBmaWxlKE1BS0VfRElSRUNUT1JZICIke1J1bkNNYWtlX1RFU1RfQklOQVJZX0RJUn0iKQpAQCAtMTU1LDcgKzE2Miw4IEBACiAgIHNldChSdW5DTWFrZV9URVNUX05PX0NMRUFOIDEpCiAgIHNldChSdW5DTWFrZV9URVNUX09QVElPTlMKICAgICAiLURDTUFLRV9JTlNUQUxMX1BSRUZJWDpQQVRIPSR7UnVuQ01ha2VfVEVTVF9CSU5BUllfRElSfS9faW5zdGFsbCIKLSAgICAiLURDTUFLRV9JT1NfSU5TVEFMTF9DT01CSU5FRD1ZRVMiKQorICAgICItRENNQUtFX0lPU19JTlNUQUxMX0NPTUJJTkVEPVlFUyIKKyAgICAiJHtJT1NfREVQTE9ZTUVOVF9UQVJHRVR9IikKIAogICBmaWxlKFJFTU9WRV9SRUNVUlNFICIke1J1bkNNYWtlX1RFU1RfQklOQVJZX0RJUn0iKQogICBmaWxlKE1BS0VfRElSRUNUT1JZICIke1J1bkNNYWtlX1RFU1RfQklOQVJZX0RJUn0iKQpAQCAtMTcyLDYgKzE4MCw3IEBACiBpZihOT1QgWENPREVfVkVSU0lPTiBWRVJTSU9OX0xFU1MgNSkKICAgc2V0KFJ1bkNNYWtlX1RFU1RfQklOQVJZX0RJUiAke1J1bkNNYWtlX0JJTkFSWV9ESVJ9L1hjb2RlTXVsdGlwbGF0Zm9ybS1idWlsZCkKICAgc2V0KFJ1bkNNYWtlX1RFU1RfTk9fQ0xFQU4gMSkKKyAgc2V0KFJ1bkNNYWtlX1RFU1RfT1BUSU9OUyAiJHtJT1NfREVQTE9ZTUVOVF9UQVJHRVR9IikKIAogICBmaWxlKFJFTU9WRV9SRUNVUlNFICIke1J1bkNNYWtlX1RFU1RfQklOQVJZX0RJUn0iKQogICBmaWxlKE1BS0VfRElSRUNUT1JZICIke1J1bkNNYWtlX1RFU1RfQklOQVJZX0RJUn0iKQpkaWZmIC0tZ2l0IGEvVGVzdHMvUnVuQ01ha2UvWGNvZGVQcm9qZWN0L1hjb2RlQnVuZGxlcy5jbWFrZSBiL1Rlc3RzL1J1bkNNYWtlL1hjb2RlUHJvamVjdC9YY29kZUJ1bmRsZXMuY21ha2UKaW5kZXggY2VlNzFmYS4uMGI4NTRkOCAxMDA2NDQKLS0tIGEvVGVzdHMvUnVuQ01ha2UvWGNvZGVQcm9qZWN0L1hjb2RlQnVuZGxlcy5jbWFrZQorKysgYi9UZXN0cy9SdW5DTWFrZS9YY29kZVByb2plY3QvWGNvZGVCdW5kbGVzLmNtYWtlCkBAIC01LDExICs1LDcgQEAKIAogaWYoVEVTVF9JT1MpCiAgIHNldChDTUFLRV9PU1hfU1lTUk9PVCBpcGhvbmVvcykKLSAgaWYoWENPREVfVkVSU0lPTiBWRVJTSU9OX0dSRUFURVJfRVFVQUwgOSkKLSAgICBzZXQoQ01BS0VfT1NYX0FSQ0hJVEVDVFVSRVMgImFybTY0IikKLSAgZWxzZSgpCi0gICAgc2V0KENNQUtFX09TWF9BUkNISVRFQ1RVUkVTICJhcm12NyIpCi0gIGVuZGlmKCkKKyAgc2V0KENNQUtFX09TWF9BUkNISVRFQ1RVUkVTICJhcm12NyIpCiAgIHNldChDTUFLRV9YQ09ERV9BVFRSSUJVVEVfQ09ERV9TSUdOSU5HX1JFUVVJUkVEICJOTyIpCiAgIHNldChDTUFLRV9YQ09ERV9BVFRSSUJVVEVfRU5BQkxFX0JJVENPREUgIk5PIikKIGVuZGlmKFRFU1RfSU9TKQpkaWZmIC0tZ2l0IGEvVGVzdHMvUnVuQ01ha2UvWGNvZGVQcm9qZWN0L1hjb2RlSU9TSW5zdGFsbENvbWJpbmVkLWluc3RhbGwtY2hlY2suY21ha2UgYi9UZXN0cy9SdW5DTWFrZS9YY29kZVByb2plY3QvWGNvZGVJT1NJbnN0YWxsQ29tYmluZWQtaW5zdGFsbC1jaGVjay5jbWFrZQppbmRleCBjZDcxMjA1Li5hMWMwNjcxIDEwMDY0NAotLS0gYS9UZXN0cy9SdW5DTWFrZS9YY29kZVByb2plY3QvWGNvZGVJT1NJbnN0YWxsQ29tYmluZWQtaW5zdGFsbC1jaGVjay5jbWFrZQorKysgYi9UZXN0cy9SdW5DTWFrZS9YY29kZVByb2plY3QvWGNvZGVJT1NJbnN0YWxsQ29tYmluZWQtaW5zdGFsbC1jaGVjay5jbWFrZQpAQCAtMTMsMTEgKzEzLDcgQEAKICAgc3RyaW5nKFJFUExBQ0UgImFyY2hpdGVjdHVyZSAiICIiIGFjdHVhbCAiJHthcmNoaXRlY3R1cmVzfSIpCiAgIGxpc3QoU09SVCBhY3R1YWwpCiAKLSAgaWYoWENPREVfVkVSU0lPTiBWRVJTSU9OX0dSRUFURVJfRVFVQUwgOSkKLSAgICBzZXQoZXhwZWN0ZWQgYXJtNjQgeDg2XzY0KQotICBlbHNlKCkKLSAgICBzZXQoZXhwZWN0ZWQgYXJtNjQgYXJtdjcgaTM4NiB4ODZfNjQpCi0gIGVuZGlmKCkKKyAgc2V0KGV4cGVjdGVkIGFybTY0IGFybXY3IGkzODYgeDg2XzY0KQogCiAgIGlmKE5PVCBhY3R1YWwgU1RSRVFVQUwgZXhwZWN0ZWQpCiAgICAgbWVzc2FnZShTRU5EX0VSUk9SCmRpZmYgLS1naXQgYS9UZXN0cy9SdW5DTWFrZS9YY29kZVByb2plY3QvWGNvZGVJT1NJbnN0YWxsQ29tYmluZWQuY21ha2UgYi9UZXN0cy9SdW5DTWFrZS9YY29kZVByb2plY3QvWGNvZGVJT1NJbnN0YWxsQ29tYmluZWQuY21ha2UKaW5kZXggNmFiYmE0OS4uZmM4MzBiMSAxMDA2NDQKLS0tIGEvVGVzdHMvUnVuQ01ha2UvWGNvZGVQcm9qZWN0L1hjb2RlSU9TSW5zdGFsbENvbWJpbmVkLmNtYWtlCisrKyBiL1Rlc3RzL1J1bkNNYWtlL1hjb2RlUHJvamVjdC9YY29kZUlPU0luc3RhbGxDb21iaW5lZC5jbWFrZQpAQCAtNywxMSArNyw3IEBACiBzZXQoQ01BS0VfWENPREVfQVRUUklCVVRFX0RFQlVHX0lORk9STUFUSU9OX0ZPUk1BVCAiZHdhcmYiKQogc2V0KENNQUtFX1hDT0RFX0FUVFJJQlVURV9FTkFCTEVfQklUQ09ERSAiTk8iKQogCi1pZihYQ09ERV9WRVJTSU9OIFZFUlNJT05fR1JFQVRFUl9FUVVBTCA5KQotICAgIHNldChDTUFLRV9PU1hfQVJDSElURUNUVVJFUyAiYXJtNjQ7eDg2XzY0IikKLWVsc2UoKQotICAgIHNldChDTUFLRV9PU1hfQVJDSElURUNUVVJFUyAiYXJtdjc7YXJtNjQ7aTM4Njt4ODZfNjQiKQotZW5kaWYoKQorc2V0KENNQUtFX09TWF9BUkNISVRFQ1RVUkVTICJhcm12Nzthcm02NDtpMzg2O3g4Nl82NCIpCiAKIGFkZF9leGVjdXRhYmxlKGZvb19hcHAgTUFDT1NYX0JVTkRMRSBtYWluLmNwcCkKIGluc3RhbGwoVEFSR0VUUyBmb29fYXBwIEJVTkRMRSBERVNUSU5BVElPTiBiaW4pCmRpZmYgLS1naXQgYS9UZXN0cy9SdW5DTWFrZS9YY29kZVByb2plY3QvWGNvZGVJbnN0YWxsSU9TLmNtYWtlIGIvVGVzdHMvUnVuQ01ha2UvWGNvZGVQcm9qZWN0L1hjb2RlSW5zdGFsbElPUy5jbWFrZQppbmRleCBmNjI5ZjJlLi5hNzk3NDEwIDEwMDY0NAotLS0gYS9UZXN0cy9SdW5DTWFrZS9YY29kZVByb2plY3QvWGNvZGVJbnN0YWxsSU9TLmNtYWtlCisrKyBiL1Rlc3RzL1J1bkNNYWtlL1hjb2RlUHJvamVjdC9YY29kZUluc3RhbGxJT1MuY21ha2UKQEAgLTYsMTEgKzYsNyBAQAogc2V0KFhDT0RFX0FUVFJJQlVURV9DT0RFX1NJR05JTkdfUkVRVUlSRUQgIk5PIikKIHNldChDTUFLRV9YQ09ERV9BVFRSSUJVVEVfRU5BQkxFX0JJVENPREUgIk5PIikKIAotaWYoWENPREVfVkVSU0lPTiBWRVJTSU9OX0dSRUFURVJfRVFVQUwgOSkKLSAgc2V0KENNQUtFX09TWF9BUkNISVRFQ1RVUkVTICJhcm02NDt4ODZfNjQiKQotZWxzZSgpCi0gIHNldChDTUFLRV9PU1hfQVJDSElURUNUVVJFUyAiYXJtdjc7aTM4NiIpCi1lbmRpZigpCitzZXQoQ01BS0VfT1NYX0FSQ0hJVEVDVFVSRVMgImFybXY3O2kzODYiKQogCiBhZGRfbGlicmFyeShmb28gU1RBVElDIGZvby5jcHApCiBpbnN0YWxsKFRBUkdFVFMgZm9vIEFSQ0hJVkUgREVTVElOQVRJT04gbGliKQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL1JlbGVhc2UvdXBsb2FkX3JlbGVhc2UuY21ha2UgYi9VdGlsaXRpZXMvUmVsZWFzZS91cGxvYWRfcmVsZWFzZS5jbWFrZQppbmRleCA1YjJjYzU3Li4zYzgzOTU3IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvUmVsZWFzZS91cGxvYWRfcmVsZWFzZS5jbWFrZQorKysgYi9VdGlsaXRpZXMvUmVsZWFzZS91cGxvYWRfcmVsZWFzZS5jbWFrZQpAQCAtMSw2ICsxLDYgQEAKIHNldChDVEVTVF9SVU5fQ1VSUkVOVF9TQ1JJUFQgMCkKIGlmKE5PVCBWRVJTSU9OKQotIHNldChWRVJTSU9OIDMuOSkKKyBzZXQoVkVSU0lPTiAzLjEwKQogZW5kaWYoKQogaWYoTk9UIERFRklORUQgUFJPSkVDVF9QUkVGSVgpCiAgIHNldChQUk9KRUNUX1BSRUZJWCBjbWFrZS0ke1ZFUlNJT059KQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL1NjcmlwdHMvdXBkYXRlLWN1cmwuYmFzaCBiL1V0aWxpdGllcy9TY3JpcHRzL3VwZGF0ZS1jdXJsLmJhc2gKaW5kZXggNDY1ODQxYS4uYjI0NDgyNyAxMDA3NTUKLS0tIGEvVXRpbGl0aWVzL1NjcmlwdHMvdXBkYXRlLWN1cmwuYmFzaAorKysgYi9VdGlsaXRpZXMvU2NyaXB0cy91cGRhdGUtY3VybC5iYXNoCkBAIC04LDE0ICs4LDEzIEBACiByZWFkb25seSBvd25lcnNoaXA9IkN1cmwgVXBzdHJlYW0gPGN1cmwtbGlicmFyeUBjb29sLmhheHguc2U+IgogcmVhZG9ubHkgc3VidHJlZT0iVXRpbGl0aWVzL2NtY3VybCIKIHJlYWRvbmx5IHJlcG89Imh0dHBzOi8vZ2l0aHViLmNvbS9jdXJsL2N1cmwuZ2l0IgotcmVhZG9ubHkgdGFnPSJjdXJsLTdfNTRfMSIKK3JlYWRvbmx5IHRhZz0iY3VybC03XzU2XzAiCiByZWFkb25seSBzaG9ydGxvZz1mYWxzZQogcmVhZG9ubHkgcGF0aHM9IgogICBDTWFrZS8qCiAgIENNYWtlTGlzdHMudHh0CiAgIENPUFlJTkcKICAgaW5jbHVkZS9jdXJsLyouaAotICBpbmNsdWRlL2N1cmwvY3VybGJ1aWxkLmguY21ha2UKICAgbGliLyouYwogICBsaWIvKi5oCiAgIGxpYi9DTWFrZUxpc3RzLnR4dApAQCAtMzIsNiArMzEsMTUgQEAKICAgICBnaXRfYXJjaGl2ZQogICAgIHB1c2hkICIke2V4dHJhY3RkaXJ9LyR7bmFtZX0tcmVkdWNlZCIKICAgICBybSBsaWIvY29uZmlnLSouaAorICAgIGNobW9kIGEteCBsaWIvY29ubmVjdC5jCisgICAgZm9yIGYgaW4gXAorICAgICAgbGliL2Nvb2tpZS5jIFwKKyAgICAgIGxpYi9rcmI1LmMgXAorICAgICAgbGliL3NlY3VyaXR5LmMgXAorICAgICAgOyBkbworICAgICAgICBpY29udiAtZiBMQVRJTjEgLXQgVVRGOCAkZiAtbyAkZi51dGYtOAorICAgICAgICBtdiAkZi51dGYtOCAkZgorICAgIGRvbmUKICAgICBlY2hvICIqIC13aGl0ZXNwYWNlIiA+IC5naXRhdHRyaWJ1dGVzCiAgICAgcG9wZAogfQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9DTWFrZS9NYWNyb3MuY21ha2UgYi9VdGlsaXRpZXMvY21jdXJsL0NNYWtlL01hY3Jvcy5jbWFrZQppbmRleCBkYWIwMDVmLi44MmFhZGNhIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL0NNYWtlL01hY3Jvcy5jbWFrZQorKysgYi9VdGlsaXRpZXMvY21jdXJsL0NNYWtlL01hY3Jvcy5jbWFrZQpAQCAtOTMsMyArOTMsMzIgQEAKICAgICBlbmRpZigke0NVUkxfVEVTVH1fQ09NUElMRSBBTkQgTk9UICR7Q1VSTF9URVNUfSkKICAgZW5kaWYoKQogZW5kbWFjcm8oQ1VSTF9JTlRFUk5BTF9URVNUX1JVTikKKworbWFjcm8oQ1VSTF9OUk9GRl9DSEVDSykKKyAgZmluZF9wcm9ncmFtKE5ST0ZGIE5BTUVTIGducm9mZiBucm9mZikKKyAgaWYoTlJPRkYpCisgICAgIyBOZWVkIGEgd2F5IHRvIHdyaXRlIHRvIHN0ZGluLCB0aGlzIHdpbGwgZG8KKyAgICBmaWxlKFdSSVRFICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbnJvZmYtaW5wdXQudHh0IiAidGVzdCIpCisgICAgIyBUZXN0cyBmb3IgYSB2YWxpZCBucm9mZiBvcHRpb24gdG8gZ2VuZXJhdGUgYSBtYW5wYWdlCisgICAgZm9yZWFjaChfTUFOT1BUICItbWFuIiAiLW1hbmRvYyIpCisgICAgICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAiJHtOUk9GRn0iICR7X01BTk9QVH0KKyAgICAgICAgT1VUUFVUX1ZBUklBQkxFIE5ST0ZGX01BTk9QVF9PVVRQVVQKKyAgICAgICAgSU5QVVRfRklMRSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L25yb2ZmLWlucHV0LnR4dCIKKyAgICAgICAgRVJST1JfUVVJRVQpCisgICAgICAjIFNhdmUgdGhlIG9wdGlvbiBpZiBpdCB3YXMgdmFsaWQKKyAgICAgIGlmKE5ST0ZGX01BTk9QVF9PVVRQVVQpCisgICAgICAgIG1lc3NhZ2UoIkZvdW5kICpucm9mZiBvcHRpb246IC0tICR7X01BTk9QVH0iKQorICAgICAgICBzZXQoTlJPRkZfTUFOT1BUICR7X01BTk9QVH0pCisgICAgICAgIHNldChOUk9GRl9VU0VGVUwgT04pCisgICAgICAgIGJyZWFrKCkKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRmb3JlYWNoKCkKKyAgICAjIE5vIG5lZWQgZm9yIHRoZSB0ZW1wb3JhcnkgZmlsZQorICAgIGZpbGUoUkVNT1ZFICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbnJvZmYtaW5wdXQudHh0IikKKyAgICBpZihOT1QgTlJPRkZfVVNFRlVMKQorICAgICAgbWVzc2FnZShXQVJOSU5HICJGb3VuZCBubyAqbnJvZmYgb3B0aW9uIHRvIGdldCBwbGFpbnRleHQgZnJvbSBtYW4gcGFnZXMiKQorICAgIGVuZGlmKCkKKyAgZWxzZSgpCisgICAgbWVzc2FnZShXQVJOSU5HICJGb3VuZCBubyAqbnJvZmYgcHJvZ3JhbSIpCisgIGVuZGlmKCkKK2VuZG1hY3JvKENVUkxfTlJPRkZfQ0hFQ0spCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL0NNYWtlL090aGVyVGVzdHMuY21ha2UgYi9VdGlsaXRpZXMvY21jdXJsL0NNYWtlL090aGVyVGVzdHMuY21ha2UKaW5kZXggM2IyMDNjNS4uOTg5ZjA0ZSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9DTWFrZS9PdGhlclRlc3RzLmNtYWtlCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvQ01ha2UvT3RoZXJUZXN0cy5jbWFrZQpAQCAtMzIsOSArMzIsOSBAQAogaWYoY3VybF9jdl9yZWN2KQogICBpZihOT1QgREVGSU5FRCBjdXJsX2N2X2Z1bmNfcmVjdl9hcmdzIE9SICIke2N1cmxfY3ZfZnVuY19yZWN2X2FyZ3N9IiBTVFJFUVVBTCAidW5rbm93biIpCiAgICAgZm9yZWFjaChyZWN2X3JldHYgImludCIgInNzaXplX3QiICkKLSAgICAgIGZvcmVhY2gocmVjdl9hcmcxICJpbnQiICJzc2l6ZV90IiAiU09DS0VUIikKLSAgICAgICAgZm9yZWFjaChyZWN2X2FyZzIgInZvaWQgKiIgImNoYXIgKiIpCi0gICAgICAgICAgZm9yZWFjaChyZWN2X2FyZzMgInNpemVfdCIgImludCIgInNvY2tsZW5fdCIgInVuc2lnbmVkIGludCIpCisgICAgICBmb3JlYWNoKHJlY3ZfYXJnMSAiU09DS0VUIiAiaW50IiApCisgICAgICAgIGZvcmVhY2gocmVjdl9hcmcyICJjaGFyICoiICJ2b2lkICoiICkKKyAgICAgICAgICBmb3JlYWNoKHJlY3ZfYXJnMyAiaW50IiAic2l6ZV90IiAic29ja2xlbl90IiAidW5zaWduZWQgaW50IikKICAgICAgICAgICAgIGZvcmVhY2gocmVjdl9hcmc0ICJpbnQiICJ1bnNpZ25lZCBpbnQiKQogICAgICAgICAgICAgICBpZihOT1QgY3VybF9jdl9mdW5jX3JlY3ZfZG9uZSkKICAgICAgICAgICAgICAgICB1bnNldChjdXJsX2N2X2Z1bmNfcmVjdl90ZXN0IENBQ0hFKQpAQCAtOTYsOSArOTYsOSBAQAogaWYoY3VybF9jdl9zZW5kKQogICBpZihOT1QgREVGSU5FRCBjdXJsX2N2X2Z1bmNfc2VuZF9hcmdzIE9SICIke2N1cmxfY3ZfZnVuY19zZW5kX2FyZ3N9IiBTVFJFUVVBTCAidW5rbm93biIpCiAgICAgZm9yZWFjaChzZW5kX3JldHYgImludCIgInNzaXplX3QiICkKLSAgICAgIGZvcmVhY2goc2VuZF9hcmcxICJpbnQiICJzc2l6ZV90IiAiU09DS0VUIikKLSAgICAgICAgZm9yZWFjaChzZW5kX2FyZzIgImNvbnN0IHZvaWQgKiIgInZvaWQgKiIgImNoYXIgKiIgImNvbnN0IGNoYXIgKiIpCi0gICAgICAgICAgZm9yZWFjaChzZW5kX2FyZzMgInNpemVfdCIgImludCIgInNvY2tsZW5fdCIgInVuc2lnbmVkIGludCIpCisgICAgICBmb3JlYWNoKHNlbmRfYXJnMSAiU09DS0VUIiAiaW50IiAic3NpemVfdCIgKQorICAgICAgICBmb3JlYWNoKHNlbmRfYXJnMiAiY29uc3QgY2hhciAqIiAiY29uc3Qgdm9pZCAqIiAidm9pZCAqIiAiY2hhciAqIikKKyAgICAgICAgICBmb3JlYWNoKHNlbmRfYXJnMyAiaW50IiAic2l6ZV90IiAic29ja2xlbl90IiAidW5zaWduZWQgaW50IikKICAgICAgICAgICAgIGZvcmVhY2goc2VuZF9hcmc0ICJpbnQiICJ1bnNpZ25lZCBpbnQiKQogICAgICAgICAgICAgICBpZihOT1QgY3VybF9jdl9mdW5jX3NlbmRfZG9uZSkKICAgICAgICAgICAgICAgICB1bnNldChjdXJsX2N2X2Z1bmNfc2VuZF90ZXN0IENBQ0hFKQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9DTWFrZS9jbWFrZV91bmluc3RhbGwuY21ha2UuaW4gYi9VdGlsaXRpZXMvY21jdXJsL0NNYWtlL2NtYWtlX3VuaW5zdGFsbC5jbWFrZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDBhNTE2Ci0tLSAvZGV2L251bGwKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9DTWFrZS9jbWFrZV91bmluc3RhbGwuY21ha2UuaW4KQEAgLTAsMCArMSwyNiBAQAoraWYoTk9UIEVYSVNUUyAiQENNQUtFX0NVUlJFTlRfQklOQVJZX0RJUkAvaW5zdGFsbF9tYW5pZmVzdC50eHQiKQorICBtZXNzYWdlKEZBVEFMX0VSUk9SICJDYW5ub3QgZmluZCBpbnN0YWxsIG1hbmlmZXN0OiBAQ01BS0VfQ1VSUkVOVF9CSU5BUllfRElSQC9pbnN0YWxsX21hbmlmZXN0LnR4dCIpCitlbmRpZihOT1QgRVhJU1RTICJAQ01BS0VfQ1VSUkVOVF9CSU5BUllfRElSQC9pbnN0YWxsX21hbmlmZXN0LnR4dCIpCisKK2lmIChOT1QgREVGSU5FRCBDTUFLRV9JTlNUQUxMX1BSRUZJWCkKKyAgc2V0IChDTUFLRV9JTlNUQUxMX1BSRUZJWCAiQENNQUtFX0lOU1RBTExfUFJFRklYQCIpCitlbmRpZiAoKQorIG1lc3NhZ2UoJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0pCisKK2ZpbGUoUkVBRCAiQENNQUtFX0NVUlJFTlRfQklOQVJZX0RJUkAvaW5zdGFsbF9tYW5pZmVzdC50eHQiIGZpbGVzKQorc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlxuIiAiOyIgZmlsZXMgIiR7ZmlsZXN9IikKK2ZvcmVhY2goZmlsZSAke2ZpbGVzfSkKKyAgbWVzc2FnZShTVEFUVVMgIlVuaW5zdGFsbGluZyAkRU5We0RFU1RESVJ9JHtmaWxlfSIpCisgIGlmKElTX1NZTUxJTksgIiRFTlZ7REVTVERJUn0ke2ZpbGV9IiBPUiBFWElTVFMgIiRFTlZ7REVTVERJUn0ke2ZpbGV9IikKKyAgICBleGVjX3Byb2dyYW0oCisgICAgICAiQENNQUtFX0NPTU1BTkRAIiBBUkdTICItRSByZW1vdmUgXCIkRU5We0RFU1RESVJ9JHtmaWxlfVwiIgorICAgICAgT1VUUFVUX1ZBUklBQkxFIHJtX291dAorICAgICAgUkVUVVJOX1ZBTFVFIHJtX3JldHZhbAorICAgICAgKQorICAgIGlmKE5PVCAiJHtybV9yZXR2YWx9IiBTVFJFUVVBTCAwKQorICAgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiUHJvYmxlbSB3aGVuIHJlbW92aW5nICRFTlZ7REVTVERJUn0ke2ZpbGV9IikKKyAgICBlbmRpZihOT1QgIiR7cm1fcmV0dmFsfSIgU1RSRVFVQUwgMCkKKyAgZWxzZShJU19TWU1MSU5LICIkRU5We0RFU1RESVJ9JHtmaWxlfSIgT1IgRVhJU1RTICIkRU5We0RFU1RESVJ9JHtmaWxlfSIpCisgICAgbWVzc2FnZShTVEFUVVMgIkZpbGUgJEVOVntERVNURElSfSR7ZmlsZX0gZG9lcyBub3QgZXhpc3QuIikKKyAgZW5kaWYoSVNfU1lNTElOSyAiJEVOVntERVNURElSfSR7ZmlsZX0iIE9SIEVYSVNUUyAiJEVOVntERVNURElSfSR7ZmlsZX0iKQorZW5kZm9yZWFjaChmaWxlKQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9DTWFrZUxpc3RzLnR4dCBiL1V0aWxpdGllcy9jbWN1cmwvQ01ha2VMaXN0cy50eHQKaW5kZXggZDg1ZjM2Ni4uYTgzMWY3ZiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9DTWFrZUxpc3RzLnR4dAorKysgYi9VdGlsaXRpZXMvY21jdXJsL0NNYWtlTGlzdHMudHh0CkBAIC0yNCw2ICsyNCw3IEBACiBzZXQoQ1VSTF9ESVNBQkxFX1ZFUkJPU0VfU1RSSU5HUyBPRkYgQ0FDSEUgSU5URVJOQUwgIkRvIG5vdCBkaXNhYmxlIGN1cmwgdmVyYm9zaXR5IikKIHNldChDVVJMX0hJRERFTl9TWU1CT0xTIE9GRiBDQUNIRSBJTlRFUk5BTCAiTm8gY3VybCBoaWRkZW4gc3ltYm9scyIpCiBzZXQoQ1VSTF9TVEFUSUNMSUIgT04gQ0FDSEUgSU5URVJOQUwgIlN0YXRpYyBjdXJsIikKK3NldChDVVJMX1dFUlJPUiBPRkYgQ0FDSEUgSU5URVJOQUwgIlR1cm4gY29tcGlsZXIgd2FybmluZ3MgaW50byBlcnJvcnMiKQogc2V0KERJU0FCTEVEX1RIUkVBRFNBRkUgT0ZGIENBQ0hFIElOVEVSTkFMICJDdXJsIGNhbiB1c2UgdGhyZWFkLXNhZmUgZnVuY3Rpb25zIikKIHNldChFTkFCTEVfQVJFUyBPRkYgQ0FDSEUgSU5URVJOQUwgIk5vIGN1cmwgYy1hcmVzIHN1cHBvcnQiKQogc2V0KEVOQUJMRV9DVVJMREVCVUcgT0ZGIENBQ0hFIElOVEVSTkFMICJObyBjdXJsIFRyYWNrTWVtb3J5IGZlYXR1cmVzIikKQEAgLTMzLDYgKzM0LDcgQEAKIHNldChFTkFCTEVfVEhSRUFERURfUkVTT0xWRVIgT0ZGIENBQ0hFIElOVEVSTkFMICJObyBjdXJsIFBPU0lYIHRocmVhZGVkIEROUyBsb29rdXAiKQogc2V0KEVOQUJMRV9VTklYX1NPQ0tFVFMgT0ZGIENBQ0hFIElOVEVSTkFMICJObyBjdXJsIFVuaXggZG9tYWluIHNvY2tldHMgc3VwcG9ydCIpCiBzZXQoSFRUUF9PTkxZIE9GRiBDQUNIRSBJTlRFUk5BTCAiQ3VybCBpcyBub3QgaHR0cC1vbmx5IikKK3NldChQSUNLWV9DT01QSUxFUiBPRkYgQ0FDSEUgSU5URVJOQUwgIkVuYWJsZSBwaWNreSBjb21waWxlciBvcHRpb25zIikKIHNldChVU0VfV0lOMzJfTERBUCBPRkYgQ0FDSEUgSU5URVJOQUwgIk5vIGN1cmwgV2luZG93cyBMREFQIikKIGlmKENNQUtFX1VTRV9PUEVOU1NMKQogZWxzZWlmKFdJTjMyKQpAQCAtODgsNyArOTAsNyBAQAogIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICMKLSMgQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyMgQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICMKICMgVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICMgeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtMTI2LDYgKzEyOCw3IEBACiBpbmNsdWRlKFV0aWxpdGllcykKIGluY2x1ZGUoTWFjcm9zKQogaW5jbHVkZShDTWFrZURlcGVuZGVudE9wdGlvbikKK2luY2x1ZGUoQ2hlY2tDQ29tcGlsZXJGbGFnKQogCiBwcm9qZWN0KCBDVVJMIEMgKQogCkBAIC0xNTksMjAgKzE2MiwzNiBAQAogaW5jbHVkZV9kaXJlY3Rvcmllcygke1BST0pFQ1RfQklOQVJZX0RJUn0vaW5jbHVkZS9jdXJsKQogaW5jbHVkZV9kaXJlY3RvcmllcyggJHtDVVJMX1NPVVJDRV9ESVJ9L2luY2x1ZGUgKQogCitvcHRpb24oQ1VSTF9XRVJST1IgIlR1cm4gY29tcGlsZXIgd2FybmluZ3MgaW50byBlcnJvcnMiIE9GRikKK29wdGlvbihQSUNLWV9DT01QSUxFUiAiRW5hYmxlIHBpY2t5IGNvbXBpbGVyIG9wdGlvbnMiIE9OKQogb3B0aW9uKEJVSUxEX0NVUkxfRVhFICJTZXQgdG8gT04gdG8gYnVpbGQgY3VybCBleGVjdXRhYmxlLiIgT04pCiBvcHRpb24oQ1VSTF9TVEFUSUNMSUIgIlNldCB0byBPTiB0byBidWlsZCBsaWJjdXJsIHdpdGggc3RhdGljIGxpbmtpbmcuIiBPRkYpCiBvcHRpb24oRU5BQkxFX0FSRVMgIlNldCB0byBPTiB0byBlbmFibGUgYy1hcmVzIHN1cHBvcnQiIE9GRikKIGlmKFdJTjMyKQotICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEVOQUJMRV9USFJFQURFRF9SRVNPTFZFUgotICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdG8gT04gdG8gZW5hYmxlIHRocmVhZGVkIEROUyBsb29rdXAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgT04gIk5PVCBFTkFCTEVfQVJFUyIKLSAgICAgICAgICAgICAgICAgICAgICAgICBPRkYpCi1lbHNlKCkKLSAgb3B0aW9uKEVOQUJMRV9USFJFQURFRF9SRVNPTFZFUiAiU2V0IHRvIE9OIHRvIGVuYWJsZSBQT1NJWCB0aHJlYWRlZCBETlMgbG9va3VwIiBPRkYpCisgIG9wdGlvbihDVVJMX1NUQVRJQ19DUlQgIlNldCB0byBPTiB0byBidWlsZCBsaWJjdXJsIHdpdGggc3RhdGljIENSVCBvbiBXaW5kb3dzICgvTVQpLiIgT0ZGKQorICBvcHRpb24oRU5BQkxFX0lORVRfUFRPTiAiU2V0IHRvIE9GRiB0byBwcmV2ZW50IHVzYWdlIG9mIGluZXRfcHRvbiB3aGVuIGJ1aWxkaW5nIGFnYWluc3QgbW9kZXJuIFNES3Mgd2hpbGUgc3RpbGwgcmVxdWlyaW5nIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBXaW5kb3dzIHZlcnNpb25zLCBzdWNoIGFzIFdpbmRvd3MgWFAsIFdpbmRvd3MgU2VydmVyIDIwMDMgZXRjLiIgT04pCiBlbmRpZigpCisKK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oRU5BQkxFX1RIUkVBREVEX1JFU09MVkVSICJTZXQgdG8gT04gdG8gZW5hYmxlIHRocmVhZGVkIEROUyBsb29rdXAiCisgICAgICAgIE9OICJOT1QgRU5BQkxFX0FSRVMiCisgICAgICAgIE9GRikKKwogb3B0aW9uKEVOQUJMRV9ERUJVRyAiU2V0IHRvIE9OIHRvIGVuYWJsZSBjdXJsIGRlYnVnIGZlYXR1cmVzIiBPRkYpCiBvcHRpb24oRU5BQkxFX0NVUkxERUJVRyAiU2V0IHRvIE9OIHRvIGJ1aWxkIHdpdGggVHJhY2tNZW1vcnkgZmVhdHVyZSBlbmFibGVkIiBPRkYpCiAKK2lmKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNDIE9SIENNQUtFX0NPTVBJTEVSX0lTX0NMQU5HKQorICBpZiAoUElDS1lfQ09NUElMRVIpCisgICAgZm9yZWFjaCAoX0NDT1BUIC1wZWRhbnRpYyAtV2FsbCAtVyAtV3BvaW50ZXItYXJpdGggLVd3cml0ZS1zdHJpbmdzIC1XdW51c2VkIC1Xc2hhZG93IC1XaW5saW5lIC1XbmVzdGVkLWV4dGVybnMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV21pc3NpbmctcHJvdG90eXBlcyAtV25vLWxvbmctbG9uZyAtV2Zsb2F0LWVxdWFsIC1Xbm8tbXVsdGljaGFyIC1Xc2lnbi1jb21wYXJlIC1XdW5kZWYgLVduby1mb3JtYXQtbm9ubGl0ZXJhbCAtV2VuZGlmLWxhYmVscyAtV3N0cmljdC1wcm90b3R5cGVzIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IC1Xc3RyaWN0LWFsaWFzaW5nPTMgLVdjYXN0LWFsaWduIC1XdHlwZS1saW1pdHMgLVdvbGQtc3R5bGUtZGVjbGFyYXRpb24gLVdtaXNzaW5nLXBhcmFtZXRlci10eXBlIC1XZW1wdHktYm9keSAtV2Nsb2JiZXJlZCAtV2lnbm9yZWQtcXVhbGlmaWVycyAtV2NvbnZlcnNpb24gLVduby1zaWduLWNvbnZlcnNpb24gLVd2bGEgLVdkb3VibGUtcHJvbW90aW9uIC1Xbm8tc3lzdGVtLWhlYWRlcnMpCisgICAgICAjIHN1cnByaXNpbmdseSwgQ0hFQ0tfQ19DT01QSUxFUl9GTEFHIG5lZWRzIGEgbmV3IHZhcmlhYmxlIHRvIHN0b3JlIGVhY2ggbmV3CisgICAgICAjIHRlc3QgcmVzdWx0IGluLgorICAgICAgQ0hFQ0tfQ19DT01QSUxFUl9GTEFHKCR7X0NDT1BUfSBPUFQke19DQ09QVH0pCisgICAgICBpZihPUFQke19DQ09QVH0pCisgICAgICAgIHNldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9ICR7X0NDT1BUfSIpCisgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCisgIGVuZGlmKFBJQ0tZX0NPTVBJTEVSKQorZW5kaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ0MgT1IgQ01BS0VfQ09NUElMRVJfSVNfQ0xBTkcpCisKIGlmIChFTkFCTEVfREVCVUcpCiAgICMgREVCVUdCVUlMRCB3aWxsIGJlIGRlZmluZWQgb25seSBmb3IgRGVidWcgYnVpbGRzCiAgIGlmKE5PVCBDTUFLRV9WRVJTSU9OIFZFUlNJT05fTEVTUyAzLjApCkBAIC0xODcsMTMgKzIwNiwxNCBAQAogICBzZXRfcHJvcGVydHkoRElSRUNUT1JZIEFQUEVORCBQUk9QRVJUWSBDT01QSUxFX0RFRklOSVRJT05TIENVUkxERUJVRykKIGVuZGlmKCkKIAoraWYoMCkgIyBUaGlzIGNvZGUgbm90IG5lZWRlZCBmb3IgYnVpbGRpbmcgd2l0aGluIENNYWtlLgorIyBGb3IgZGVidWcgbGlicyBhbmQgZXhlcywgYWRkICItZCIgcG9zdGZpeAorc2V0KENNQUtFX0RFQlVHX1BPU1RGSVggIi1kIiBDQUNIRSBTVFJJTkcgIlNldCBkZWJ1ZyBsaWJyYXJ5IHBvc3RmaXgiKQorZW5kaWYoKQorCiAjIGluaXRpYWxpemUgQ1VSTF9MSUJTCiBzZXQoQ1VSTF9MSUJTICIiKQogCi1pZihFTkFCTEVfVEhSRUFERURfUkVTT0xWRVIgQU5EIEVOQUJMRV9BUkVTKQotICBtZXNzYWdlKEZBVEFMX0VSUk9SICJPcHRpb25zIEVOQUJMRV9USFJFQURFRF9SRVNPTFZFUiBhbmQgRU5BQkxFX0FSRVMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSIpCi1lbmRpZigpCi0KIGlmKEVOQUJMRV9BUkVTKQogICBzZXQoVVNFX0FSRVMgMSkKICAgZmluZF9wYWNrYWdlKENBUkVTIFJFUVVJUkVEKQpAQCAtMjAxLDExICsyMjEsNiBAQAogICBzZXQoQ1VSTF9MSUJTICR7Q1VSTF9MSUJTfSAke0NBUkVTX0xJQlJBUll9KQogZW5kaWYoKQogCi1pZihNU1ZDKQotICBvcHRpb24oQlVJTERfUkVMRUFTRV9ERUJVR19ESVJTICJTZXQgT0ZGIHRvIGJ1aWxkIGVhY2ggY29uZmlndXJhdGlvbiB0byBhIHNlcGFyYXRlIGRpcmVjdG9yeSIgT0ZGKQotICBtYXJrX2FzX2FkdmFuY2VkKEJVSUxEX1JFTEVBU0VfREVCVUdfRElSUykKLWVuZGlmKCkKLQogaWYoMCkgIyBUaGlzIGNvZGUgbm90IG5lZWRlZCBmb3IgYnVpbGRpbmcgd2l0aGluIENNYWtlLgogaW5jbHVkZShDdXJsU3ltYm9sSGlkaW5nKQogZW5kaWYoKQpAQCAtMjY1LDggKzI4MCw2IEBACiBtYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9DUllQVE9fQVVUSCkKIG9wdGlvbihDVVJMX0RJU0FCTEVfVkVSQk9TRV9TVFJJTkdTICJ0byBkaXNhYmxlIHZlcmJvc2Ugc3RyaW5ncyIgT0ZGKQogbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfVkVSQk9TRV9TVFJJTkdTKQotb3B0aW9uKERJU0FCTEVEX1RIUkVBRFNBRkUgIlNldCB0byBleHBsaWNpdGx5IHNwZWNpZnkgd2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhyZWFkLXNhZmUgZnVuY3Rpb25zIiBPRkYpCi1tYXJrX2FzX2FkdmFuY2VkKERJU0FCTEVEX1RIUkVBRFNBRkUpCiBvcHRpb24oRU5BQkxFX0lQVjYgIkRlZmluZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgSVB2NiBzdXBwb3J0IiBPTikKIG1hcmtfYXNfYWR2YW5jZWQoRU5BQkxFX0lQVjYpCiBpZihFTkFCTEVfSVBWNiBBTkQgTk9UIFdJTjMyKQpAQCAtMjgzLDUxICsyOTYsNDggQEAKICAgZW5kaWYoKQogZW5kaWYoKQogCi1vcHRpb24oRU5BQkxFX01BTlVBTCAidG8gcHJvdmlkZSB0aGUgYnVpbHQtaW4gbWFudWFsIiBPTikKLXVuc2V0KFVTRV9NQU5VQUwgQ0FDSEUpICMgVE9ETzogY2FjaGUgTlJPRkYvTlJPRkZfTUFOT1BUL1VTRV9NQU5VQUwgdmFycz8KLWlmKEVOQUJMRV9NQU5VQUwpCi0gIGZpbmRfcHJvZ3JhbShOUk9GRiBOQU1FUyBnbnJvZmYgbnJvZmYpCi0gIGlmKE5ST0ZGKQotICAgICMgTmVlZCBhIHdheSB0byB3cml0ZSB0byBzdGRpbiwgdGhpcyB3aWxsIGRvCi0gICAgZmlsZShXUklURSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L25yb2ZmLWlucHV0LnR4dCIgInRlc3QiKQotICAgICMgVGVzdHMgZm9yIGEgdmFsaWQgbnJvZmYgb3B0aW9uIHRvIGdlbmVyYXRlIGEgbWFucGFnZQotICAgIGZvcmVhY2goX01BTk9QVCAiLW1hbiIgIi1tYW5kb2MiKQotICAgICAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgIiR7TlJPRkZ9IiAke19NQU5PUFR9Ci0gICAgICAgIE9VVFBVVF9WQVJJQUJMRSBOUk9GRl9NQU5PUFRfT1VUUFVUCi0gICAgICAgIElOUFVUX0ZJTEUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9ucm9mZi1pbnB1dC50eHQiCi0gICAgICAgIEVSUk9SX1FVSUVUKQotICAgICAgIyBTYXZlIHRoZSBvcHRpb24gaWYgaXQgd2FzIHZhbGlkCi0gICAgICBpZihOUk9GRl9NQU5PUFRfT1VUUFVUKQotICAgICAgICBtZXNzYWdlKCJGb3VuZCAqbnJvZmYgb3B0aW9uOiAtLSAke19NQU5PUFR9IikKLSAgICAgICAgc2V0KE5ST0ZGX01BTk9QVCAke19NQU5PUFR9KQotICAgICAgICBzZXQoVVNFX01BTlVBTCAxKQotICAgICAgICBicmVhaygpCi0gICAgICBlbmRpZigpCi0gICAgZW5kZm9yZWFjaCgpCi0gICAgIyBObyBuZWVkIGZvciB0aGUgdGVtcG9yYXJ5IGZpbGUKLSAgICBmaWxlKFJFTU9WRSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L25yb2ZmLWlucHV0LnR4dCIpCi0gICAgaWYoTk9UIFVTRV9NQU5VQUwpCi0gICAgICBtZXNzYWdlKFdBUk5JTkcgIkZvdW5kIG5vICpucm9mZiBvcHRpb24gdG8gZ2V0IHBsYWludGV4dCBmcm9tIG1hbiBwYWdlcyIpCi0gICAgZW5kaWYoKQotICBlbHNlKCkKLSAgICBtZXNzYWdlKFdBUk5JTkcgIkZvdW5kIG5vICpucm9mZiBwcm9ncmFtIikKLSAgZW5kaWYoKQotZW5kaWYoKQotCiBpZigwKSAjIFRoaXMgY29kZSBub3QgbmVlZGVkIGZvciBidWlsZGluZyB3aXRoaW4gQ01ha2UuCitDVVJMX05ST0ZGX0NIRUNLKCkKICMgUmVxdWlyZWQgZm9yIGJ1aWxkaW5nIG1hbnVhbCwgZG9jcywgdGVzdHMKLWZpbmRfcGFja2FnZShQZXJsIFJFUVVJUkVEKQorZmluZF9wYWNrYWdlKFBlcmwpCisKK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oRU5BQkxFX01BTlVBTCAidG8gcHJvdmlkZSB0aGUgYnVpbHQtaW4gbWFudWFsIgorICAgIE9OICJOUk9GRl9VU0VGVUw7UEVSTF9GT1VORCIKKyAgICBPRkYpCisKK2lmKE5PVCBQRVJMX0ZPVU5EKQorICBtZXNzYWdlKFNUQVRVUyAiUGVybCBub3QgZm91bmQsIHRlc3RpbmcgZGlzYWJsZWQuIikKKyAgc2V0KEJVSUxEX1RFU1RJTkcgT0ZGKQorZW5kaWYoKQoraWYoRU5BQkxFX01BTlVBTCkKKyAgc2V0KFVTRV9NQU5VQUwgT04pCitlbmRpZigpCiBlbmRpZigpCiAKICMgV2UgbmVlZCBhbnNpIGMtZmxhZ3MsIGVzcGVjaWFsbHkgb24gSFAKIHNldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0FOU0lfQ0ZMQUdTfSAke0NNQUtFX0NfRkxBR1N9IikKIHNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAke0NNQUtFX0FOU0lfQ0ZMQUdTfSkKIAoraWYoQ1VSTF9TVEFUSUNfQ1JUKQorICBzZXQoQ01BS0VfQ19GTEFHU19SRUxFQVNFICIke0NNQUtFX0NfRkxBR1NfUkVMRUFTRX0gL01UIikKKyAgc2V0KENNQUtFX0NfRkxBR1NfREVCVUcgIiR7Q01BS0VfQ19GTEFHU19ERUJVR30gL01UZCIpCitlbmRpZigpCisKICMgRGlzYWJsZSB3YXJuaW5ncyBvbiBCb3JsYW5kIHRvIGF2b2lkIGNoYW5naW5nIDNyZCBwYXJ0eSBjb2RlLgogaWYoQk9STEFORCkKICAgc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gLXctIikKIGVuZGlmKEJPUkxBTkQpCiAKK2lmKENVUkxfV0VSUk9SKQorICBpZihNU1ZDX1ZFUlNJT04pCisgICAgc2V0KENNQUtFX0NfRkxBR1NfUkVMRUFTRSAiJHtDTUFLRV9DX0ZMQUdTX1JFTEVBU0V9IC9XWCIpCisgICAgc2V0KENNQUtFX0NfRkxBR1NfREVCVUcgIiR7Q01BS0VfQ19GTEFHU19ERUJVR30gL1dYIikKKyAgZWxzZSgpCisgICAgIyB0aGlzIGFzc3VtZXMgY2xhbmcgb3IgZ2NjIHN0eWxlIG9wdGlvbnMKKyAgICBzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAtV2Vycm9yIikKKyAgZW5kaWYoKQorZW5kaWYoQ1VSTF9XRVJST1IpCisKICMgSWYgd2UgYXJlIG9uIEFJWCwgZG8gdGhlIF9BTExfU09VUkNFIG1hZ2ljCiBpZigke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTIEFJWCkKICAgc2V0KF9BTExfU09VUkNFIDEpCkBAIC0zNDksMTkgKzM1OSwxNCBAQAogZW5kaWYoV0lOMzIpCiAKIGlmKEVOQUJMRV9USFJFQURFRF9SRVNPTFZFUikKKyAgZmluZF9wYWNrYWdlKFRocmVhZHMgUkVRVUlSRUQpCiAgIGlmKFdJTjMyKQogICAgIHNldChVU0VfVEhSRUFEU19XSU4zMiBPTikKICAgZWxzZSgpCi0gICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicHRocmVhZC5oIiBIQVZFX1BUSFJFQURfSCkKLSAgICBpZihIQVZFX1BUSFJFQURfSCkKLSAgICAgIHNldChDTUFLRV9USFJFQURfUFJFRkVSX1BUSFJFQUQgMSkKLSAgICAgIGZpbmRfcGFja2FnZShUaHJlYWRzKQotICAgICAgaWYoQ01BS0VfVVNFX1BUSFJFQURTX0lOSVQpCi0gICAgICAgIHNldChDVVJMX0xJQlMgJHtDVVJMX0xJQlN9ICR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH0pCi0gICAgICAgIHNldChVU0VfVEhSRUFEU19QT1NJWCAxKQotICAgICAgZW5kaWYoKQotICAgIGVuZGlmKCkKKyAgICBzZXQoVVNFX1RIUkVBRFNfUE9TSVggJHtDTUFLRV9VU0VfUFRIUkVBRFNfSU5JVH0pCisgICAgc2V0KEhBVkVfUFRIUkVBRF9IICR7Q01BS0VfVVNFX1BUSFJFQURTX0lOSVR9KQogICBlbmRpZigpCisgIHNldChDVVJMX0xJQlMgJHtDVVJMX0xJQlN9ICR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH0pCiBlbmRpZigpCiAKICMgQ2hlY2sgZm9yIGFsbCBuZWVkZWQgbGlicmFyaWVzCkBAIC05MTEsMTEgKzkxNiw2IEBACiBjaGVja190eXBlX3NpemUoIl9faW50NjQiICBTSVpFT0ZfX19JTlQ2NCkKIGNoZWNrX3R5cGVfc2l6ZSgidGltZV90IiAgU0laRU9GX1RJTUVfVCkKIAotIyBNYWtlIHB1YmxpYyB2ZXJzaW9ucyBvZiBzb21lIHR5cGUgc2l6ZXMgZm9yIGN1cmxidWlsZC5oLgotZm9yZWFjaCh0IElOVCBMT05HIExPTkdfTE9ORyBTU0laRV9UKQotICBzdHJpbmcoUkVQTEFDRSAiU0laRU9GXyIgIkNVUkxfU0laRU9GXyIgQ1VSTF9TSVpFT0ZfJHt0fV9DT0RFICIke1NJWkVPRl8ke3R9X0NPREV9IikKLWVuZGZvcmVhY2goKQotCiBpZihIQVZFX1NJWkVPRl9MT05HX0xPTkcpCiAgIHNldChIQVZFX0xPTkdMT05HIDEpCiAgIHNldChIQVZFX0xMIDEpCkBAIC0xMDAzLDcgKzEwMDMsMTggQEAKIGNoZWNrX3N5bWJvbF9leGlzdHMoc2V0c29ja29wdCAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0VUU09DS09QVCkKIAogIyBzeW1ib2wgZXhpc3RzIGluIHdpbjMyLCBidXQgZnVuY3Rpb24gZG9lcyBub3QuCi1jaGVja19mdW5jdGlvbl9leGlzdHMoaW5ldF9wdG9uIEhBVkVfSU5FVF9QVE9OKQoraWYoV0lOMzIpCisgIGlmKEVOQUJMRV9JTkVUX1BUT04pCisgICAgY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGluZXRfcHRvbiBIQVZFX0lORVRfUFRPTikKKyAgICAjIF9XSU4zMl9XSU5OVF9WSVNUQSAoMHgwNjAwKQorICAgIGFkZF9kZWZpbml0aW9ucygtRF9XSU4zMl9XSU5OVD0weDA2MDApCisgIGVsc2UoKQorICAgICMgX1dJTjMyX1dJTk5UX1dJTlhQICgweDA1MDEpCisgICAgYWRkX2RlZmluaXRpb25zKC1EX1dJTjMyX1dJTk5UPTB4MDUwMSkKKyAgZW5kaWYoKQorZWxzZSgpCisgICAgY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGluZXRfcHRvbiBIQVZFX0lORVRfUFRPTikKK2VuZGlmKCkKIAogY2hlY2tfc3ltYm9sX2V4aXN0cyhmc2V0eGF0dHIgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRlNFVFhBVFRSKQogaWYoSEFWRV9GU0VUWEFUVFIpCkBAIC0xMDc1LDYgKzEwODYsMTMgQEAKICAgc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTICItRF9GSUxFX09GRlNFVF9CSVRTPTY0IikKIGVuZGlmKEhBVkVfRklMRV9PRkZTRVRfQklUUykKIGNoZWNrX3R5cGVfc2l6ZSgib2ZmX3QiICBTSVpFT0ZfT0ZGX1QpCisKKyMgaW5jbHVkZSB0aGlzIGhlYWRlciB0byBnZXQgdGhlIHR5cGUKK3NldChDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAiJHtDVVJMX1NPVVJDRV9ESVJ9L2luY2x1ZGUiKQorc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMgImN1cmwvc3lzdGVtLmgiKQorY2hlY2tfdHlwZV9zaXplKCJjdXJsX29mZl90IiAgU0laRU9GX0NVUkxfT0ZGX1QpCitzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUyAiIikKKwogc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTKQogCiBmb3JlYWNoKENVUkxfVEVTVApAQCAtMTE5MCw3ICsxMjA4LDcgQEAKICAgc2V0KENVUkxfSEFWRV9TT0NLTEVOX1QgMCkKIGVuZGlmKCkKIAotIyBUT0RPIHRlc3Qgd2hpY2ggb2YgdGhlc2UgaGVhZGVycyBhcmUgcmVxdWlyZWQgZm9yIHRoZSB0eXBlZGVmcyB1c2VkIGluIGN1cmxidWlsZC5oCisjIFRPRE8gdGVzdCB3aGljaCBvZiB0aGVzZSBoZWFkZXJzIGFyZSByZXF1aXJlZAogaWYoV0lOMzIpCiAgIHNldChDVVJMX1BVTExfV1MyVENQSVBfSCAke0hBVkVfV1MyVENQSVBfSH0pCiBlbHNlKCkKQEAgLTEyMDUsMTEgKzEyMjMsNiBAQAogCiBhZGRfZGVmaW5pdGlvbnMoLURIQVZFX0NPTkZJR19IKQogCi0jIEZvciB3aW5kb3dzLCBkbyBub3QgYWxsb3cgdGhlIGNvbXBpbGVyIHRvIHVzZSBkZWZhdWx0IHRhcmdldCAoVmlzdGEpLgotaWYoV0lOMzIpCi0gIGFkZF9kZWZpbml0aW9ucygtRF9XSU4zMl9XSU5OVD0weDA1MDEpCi1lbmRpZihXSU4zMikKLQogIyBGb3Igd2luZG93cywgYWxsIGNvbXBpbGVycyB1c2VkIGJ5IGNtYWtlIHNob3VsZCBzdXBwb3J0IGxhcmdlIGZpbGVzCiBpZihXSU4zMikKICAgc2V0KFVTRV9XSU4zMl9MQVJHRV9GSUxFUyBPTikKQEAgLTEyMTcsNiArMTIzMCwxMSBAQAogCiBpZihNU1ZDKQogICBhZGRfZGVmaW5pdGlvbnMoLURfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgLURfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFKQorICBpZihDTUFLRV9DX0ZMQUdTIE1BVENIRVMgIi9XWzAtNF0iKQorICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFICIvV1swLTRdIiAiL1c0IiBDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9IikKKyAgZWxzZShDTUFLRV9DX0ZMQUdTIE1BVENIRVMgIi9XWzAtNF0iKQorICAgIHNldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9IC9XNCIpCisgIGVuZGlmKENNQUtFX0NfRkxBR1MgTUFUQ0hFUyAiL1dbMC00XSIpCiBlbmRpZihNU1ZDKQogCiAjIFVnbHkgKGJ1dCBmdW5jdGlvbmFsKSB3YXkgdG8gaW5jbHVkZSAiTWFrZWZpbGUuaW5jIiBieSB0cmFuc2Zvcm1pbmcgaXQgKD0gcmVnZW5lcmF0ZSBpdCkuCkBAIC0xMjM1LDEwICsxMjUzLDEyIEBACiAKIGVuZGZ1bmN0aW9uKCkKIAotaWYoMCkgIyBUaGlzIGNvZGUgbm90IG5lZWRlZCBmb3IgYnVpbGRpbmcgd2l0aGluIENNYWtlLgotYWRkX3N1YmRpcmVjdG9yeShkb2NzKQoraWYoVVNFX01BTlVBTCkKKyAgYWRkX3N1YmRpcmVjdG9yeShkb2NzKQogZW5kaWYoKQorCiBhZGRfc3ViZGlyZWN0b3J5KGxpYikKKwogaWYoQlVJTERfQ1VSTF9FWEUpCiAgIGFkZF9zdWJkaXJlY3Rvcnkoc3JjKQogZW5kaWYoKQpAQCAtMTM1NSw3ICsxMzc1LDcgQEAKIHNldChMSUJDVVJMX0xJQlMgICAgICAgICAgICAiIikKIHNldChsaWJkaXIgICAgICAgICAgICAgICAgICAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vbGliIikKIGZvcmVhY2goX2xpYiAke0NNQUtFX0NfSU1QTElDSVRfTElOS19MSUJSQVJJRVN9ICR7Q1VSTF9MSUJTfSkKLSAgaWYoX2xpYiBNQVRDSEVTICIuKi8uKiIpCisgIGlmKF9saWIgTUFUQ0hFUyAiLiovLioiIE9SIF9saWIgTUFUQ0hFUyAiXi0iKQogICAgIHNldChMSUJDVVJMX0xJQlMgICAgICAgICAgIiR7TElCQ1VSTF9MSUJTfSAke19saWJ9IikKICAgZWxzZSgpCiAgICAgc2V0KExJQkNVUkxfTElCUyAgICAgICAgICAiJHtMSUJDVVJMX0xJQlN9IC1sJHtfbGlifSIpCkBAIC0xMzkxLDE2ICsxNDExLDEwIEBACiAgIHNldChDVVJMX0NPTkZJR19IQVNfQkVFTl9SVU5fQkVGT1JFIDEgQ0FDSEUgSU5URVJOQUwgIkZsYWcgdG8gdHJhY2sgd2hldGhlciB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHJ1bm5pbmcgQ01ha2Ugb3IgaWYgQ01ha2UgaGFzIGJlZW4gY29uZmlndXJlZCBiZWZvcmUiKQogZW5kaWYoKQogCi0jIEluc3RhbGxhdGlvbi4KLSMgRmlyc3QsIGluc3RhbGwgZ2VuZXJhdGVkIGN1cmxidWlsZC5oCi1pbnN0YWxsKEZJTEVTICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vaW5jbHVkZS9jdXJsL2N1cmxidWlsZC5oIgotICAgIERFU1RJTkFUSU9OIGluY2x1ZGUvY3VybCApCi0jIE5leHQsIGluc3RhbGwgb3RoZXIgaGVhZGVycyBleGNsdWRpbmcgY3VybGJ1aWxkLmgKKyMgaW5zdGFsbCBoZWFkZXJzCiBpbnN0YWxsKERJUkVDVE9SWSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2luY2x1ZGUvY3VybCIKICAgICBERVNUSU5BVElPTiBpbmNsdWRlCi0gICAgRklMRVNfTUFUQ0hJTkcgUEFUVEVSTiAiKi5oIgotICAgIFBBVFRFUk4gImN1cmxidWlsZC5oIiBFWENMVURFKQotCisgICAgRklMRVNfTUFUQ0hJTkcgUEFUVEVSTiAiKi5oIikKIAogIyBXb3JrYXJvdW5kIGZvciBNU1ZTMTAgdG8gYXZvaWQgdGhlIERpYWxvZyBIZWxsCiAjIEZJWE1FOiBUaGlzIGNvdWxkIGJlIHJlbW92ZWQgd2l0aCBmdXR1cmUgdmVyc2lvbiBvZiBDTWFrZS4KQEAgLTE0MTAsNCArMTQyNCwxNSBAQAogICAgIGZpbGUoQVBQRU5EICIke0NVUkxfU0xOX0ZJTEVOQU1FfSIgIlxuIyBUaGlzIHNob3VsZCBiZSByZWdlbmVyYXRlZCFcbiIpCiAgIGVuZGlmKCkKIGVuZGlmKCkKKworaWYoTk9UIFRBUkdFVCB1bmluc3RhbGwpCisgIGNvbmZpZ3VyZV9maWxlKAorICAgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0NNYWtlL2NtYWtlX3VuaW5zdGFsbC5jbWFrZS5pbgorICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L0NNYWtlL2NtYWtlX3VuaW5zdGFsbC5jbWFrZQorICAgICAgSU1NRURJQVRFIEBPTkxZKQorCisgIGFkZF9jdXN0b21fdGFyZ2V0KHVuaW5zdGFsbAorICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1QCisgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vQ01ha2UvY21ha2VfdW5pbnN0YWxsLmNtYWtlKQorZW5kaWYoKQogZW5kaWYoKQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9pbmNsdWRlL2N1cmwvY3VybC5oIGIvVXRpbGl0aWVzL2NtY3VybC9pbmNsdWRlL2N1cmwvY3VybC5oCmluZGV4IDM5NTUyMTIuLjViNGZkMGYgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvaW5jbHVkZS9jdXJsL2N1cmwuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2luY2x1ZGUvY3VybC9jdXJsLmgKQEAgLTM2LDggKzM2LDYgQEAKIAogI2luY2x1ZGUgImN1cmx2ZXIuaCIgICAgICAgICAvKiBsaWJjdXJsIHZlcnNpb24gZGVmaW5lcyAgICovCiAjaW5jbHVkZSAic3lzdGVtLmgiICAgICAgICAgIC8qIGRldGVybWluZSB0aGluZ3MgcnVuLXRpbWUgKi8KLSNpbmNsdWRlICJjbWN1cmwvaW5jbHVkZS9jdXJsL2N1cmxidWlsZC5oIiAvKiBsaWJjdXJsIGJ1aWxkIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiY3VybHJ1bGVzLmgiICAgICAgIC8qIGxpYmN1cmwgcnVsZXMgZW5mb3JjZW1lbnQgKi8KIAogLyoKICAqIERlZmluZSBXSU4zMiB3aGVuIGJ1aWxkIHRhcmdldCBpcyBXaW4zMiBBUEkKQEAgLTc2LDYgKzc0LDcgQEAKICNpZiBkZWZpbmVkKF9BSVgpIHx8IGRlZmluZWQoX19OT1ZFTExfTElCQ19fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IFwKICAgICBkZWZpbmVkKF9fbWluaXgpIHx8IGRlZmluZWQoX19TWU1CSUFOMzJfXykgfHwgZGVmaW5lZChfX0lOVEVHUklUWSkgfHwgXAogICAgIGRlZmluZWQoQU5EUk9JRCkgfHwgZGVmaW5lZChfX0FORFJPSURfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykgfHwgXAorICAgIGRlZmluZWQoX19DWUdXSU5fXykgfHwgXAogICAgKGRlZmluZWQoX19GcmVlQlNEX3ZlcnNpb24pICYmIChfX0ZyZWVCU0RfdmVyc2lvbiA8IDgwMDAwMCkpCiAjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgogI2VuZGlmCkBAIC0xMzQsNiArMTMzLDI3IEBACiAjZGVmaW5lIGN1cmxfc29ja2V0X3R5cGVkZWYKICNlbmRpZiAvKiBjdXJsX3NvY2tldF90eXBlZGVmICovCiAKKy8qIGVudW0gZm9yIHRoZSBkaWZmZXJlbnQgc3VwcG9ydGVkIFNTTCBiYWNrZW5kcyAqLwordHlwZWRlZiBlbnVtIHsKKyAgQ1VSTFNTTEJBQ0tFTkRfTk9ORSA9IDAsCisgIENVUkxTU0xCQUNLRU5EX09QRU5TU0wgPSAxLAorICBDVVJMU1NMQkFDS0VORF9HTlVUTFMgPSAyLAorICBDVVJMU1NMQkFDS0VORF9OU1MgPSAzLAorICBDVVJMU1NMQkFDS0VORF9PQlNPTEVURTQgPSA0LCAgLyogV2FzIFFTT1NTTC4gKi8KKyAgQ1VSTFNTTEJBQ0tFTkRfR1NLSVQgPSA1LAorICBDVVJMU1NMQkFDS0VORF9QT0xBUlNTTCA9IDYsCisgIENVUkxTU0xCQUNLRU5EX1dPTEZTU0wgPSA3LAorICBDVVJMU1NMQkFDS0VORF9TQ0hBTk5FTCA9IDgsCisgIENVUkxTU0xCQUNLRU5EX0RBUldJTlNTTCA9IDksCisgIENVUkxTU0xCQUNLRU5EX0FYVExTID0gMTAsCisgIENVUkxTU0xCQUNLRU5EX01CRURUTFMgPSAxMQorfSBjdXJsX3NzbGJhY2tlbmQ7CisKKy8qIGFsaWFzZXMgZm9yIGxpYnJhcnkgY2xvbmVzIGFuZCByZW5hbWVzICovCisjZGVmaW5lIENVUkxTU0xCQUNLRU5EX0xJQlJFU1NMIENVUkxTU0xCQUNLRU5EX09QRU5TU0wKKyNkZWZpbmUgQ1VSTFNTTEJBQ0tFTkRfQk9SSU5HU1NMIENVUkxTU0xCQUNLRU5EX09QRU5TU0wKKyNkZWZpbmUgQ1VSTFNTTEJBQ0tFTkRfQ1lBU1NMIENVUkxTU0xCQUNLRU5EX1dPTEZTU0wKKwogc3RydWN0IGN1cmxfaHR0cHBvc3QgewogICBzdHJ1Y3QgY3VybF9odHRwcG9zdCAqbmV4dDsgICAgICAgLyogbmV4dCBlbnRyeSBpbiB0aGUgbGlzdCAqLwogICBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBhbGxvY2F0ZWQgbmFtZSAqLwpAQCAtMzM3LDcgKzM1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuaXRlbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmluc3RyZWFtKTsKIAotdHlwZWRlZiBlbnVtICB7Cit0eXBlZGVmIGVudW0gewogICBDVVJMU09DS1RZUEVfSVBDWE4sICAvKiBzb2NrZXQgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBJUCBjb25uZWN0aW9uICovCiAgIENVUkxTT0NLVFlQRV9BQ0NFUFQsIC8qIHNvY2tldCBjcmVhdGVkIGJ5IGFjY2VwdCgpIGNhbGwgKi8KICAgQ1VSTFNPQ0tUWVBFX0xBU1QgICAgLyogbmV2ZXIgdXNlICovCkBAIC0zNzksNyArMzk5LDcgQEAKICAgQ1VSTElPRV9MQVNUICAgICAgICAgICAvKiBuZXZlciB1c2UgKi8KIH0gY3VybGlvZXJyOwogCi10eXBlZGVmIGVudW0gIHsKK3R5cGVkZWYgZW51bSB7CiAgIENVUkxJT0NNRF9OT1AsICAgICAgICAgLyogbm8gb3BlcmF0aW9uICovCiAgIENVUkxJT0NNRF9SRVNUQVJUUkVBRCwgLyogcmVzdGFydCB0aGUgcmVhZCBzdHJlYW0gZnJvbSBzdGFydCAqLwogICBDVVJMSU9DTURfTEFTVCAgICAgICAgIC8qIG5ldmVyIHVzZSAqLwpAQCAtNjc5LDYgKzY5OSw4IEBACiAjZGVmaW5lIENVUkxBVVRIX05FR09USUFURSAgICAoKCh1bnNpZ25lZCBsb25nKTEpPDwyKQogLyogRGVwcmVjYXRlZCBzaW5jZSB0aGUgYWR2ZW50IG9mIENVUkxBVVRIX05FR09USUFURSAqLwogI2RlZmluZSBDVVJMQVVUSF9HU1NORUdPVElBVEUgQ1VSTEFVVEhfTkVHT1RJQVRFCisvKiBVc2VkIGZvciBDVVJMT1BUX1NPQ0tTNV9BVVRIIHRvIHN0YXkgdGVybWlub2xvZ2ljYWxseSBjb3JyZWN0ICovCisjZGVmaW5lIENVUkxBVVRIX0dTU0FQSSBDVVJMQVVUSF9ORUdPVElBVEUKICNkZWZpbmUgQ1VSTEFVVEhfTlRMTSAgICAgICAgICgoKHVuc2lnbmVkIGxvbmcpMSk8PDMpCiAjZGVmaW5lIENVUkxBVVRIX0RJR0VTVF9JRSAgICAoKCh1bnNpZ25lZCBsb25nKTEpPDw0KQogI2RlZmluZSBDVVJMQVVUSF9OVExNX1dCICAgICAgKCgodW5zaWduZWQgbG9uZykxKTw8NSkKQEAgLTE3ODIsNiArMTgwNCwxOCBAQAogICAvKiBTdXBwcmVzcyBwcm94eSBDT05ORUNUIHJlc3BvbnNlIGhlYWRlcnMgZnJvbSB1c2VyIGNhbGxiYWNrcyAqLwogICBDSU5JVChTVVBQUkVTU19DT05ORUNUX0hFQURFUlMsIExPTkcsIDI2NSksCiAKKyAgLyogVGhlIHJlcXVlc3QgdGFyZ2V0LCBpbnN0ZWFkIG9mIGV4dHJhY3RlZCBmcm9tIHRoZSBVUkwgKi8KKyAgQ0lOSVQoUkVRVUVTVF9UQVJHRVQsIFNUUklOR1BPSU5ULCAyNjYpLAorCisgIC8qIGJpdG1hc2sgb2YgYWxsb3dlZCBhdXRoIG1ldGhvZHMgZm9yIGNvbm5lY3Rpb25zIHRvIFNPQ0tTNSBwcm94aWVzICovCisgIENJTklUKFNPQ0tTNV9BVVRILCBMT05HLCAyNjcpLAorCisgIC8qIEVuYWJsZS9kaXNhYmxlIFNTSCBjb21wcmVzc2lvbiAqLworICBDSU5JVChTU0hfQ09NUFJFU1NJT04sIExPTkcsIDI2OCksCisKKyAgLyogUG9zdCBNSU1FIGRhdGEuICovCisgIENJTklUKE1JTUVQT1NULCBPQkpFQ1RQT0lOVCwgMjY5KSwKKwogICBDVVJMT1BUX0xBU1RFTlRSWSAvKiB0aGUgbGFzdCB1bnVzZWQgKi8KIH0gQ1VSTG9wdGlvbjsKIApAQCAtMTkyOCwxNSArMTk2MiwxNDAgQEAKICAgQ1VSTF9USU1FQ09ORF9MQVNUCiB9IGN1cmxfVGltZUNvbmQ7CiAKKy8qIFNwZWNpYWwgc2l6ZV90IHZhbHVlIHNpZ25hbGluZyBhIHplcm8tdGVybWluYXRlZCBzdHJpbmcuICovCisjZGVmaW5lIENVUkxfWkVST19URVJNSU5BVEVEICgoc2l6ZV90KSAtMSkKIAogLyogY3VybF9zdHJlcXVhbCgpIGFuZCBjdXJsX3N0cm5lcXVhbCgpIGFyZSBzdWJqZWN0IGZvciByZW1vdmFsIGluIGEgZnV0dXJlCi0gICBsaWJjdXJsLCBzZWUgbGliL1JFQURNRS5jdXJseCBmb3IgZGV0YWlscworICAgcmVsZWFzZSAqLworQ1VSTF9FWFRFUk4gaW50IGN1cmxfc3RyZXF1YWwoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKK0NVUkxfRVhURVJOIGludCBjdXJsX3N0cm5lcXVhbChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuKTsKIAotICAgIWNoZWNrc3JjISBkaXNhYmxlIFNQQUNFQkVGT1JFUEFSRU4gMgotKi8KLUNVUkxfRVhURVJOIGludCAoY3VybF9zdHJlcXVhbCkoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKLUNVUkxfRVhURVJOIGludCAoY3VybF9zdHJuZXF1YWwpKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IG4pOworLyogTWltZS9mb3JtIGhhbmRsaW5nIHN1cHBvcnQuICovCit0eXBlZGVmIHN0cnVjdCBjdXJsX21pbWVfcyAgICAgIGN1cmxfbWltZTsgICAgICAvKiBNaW1lIGNvbnRleHQuICovCit0eXBlZGVmIHN0cnVjdCBjdXJsX21pbWVwYXJ0X3MgIGN1cmxfbWltZXBhcnQ7ICAvKiBNaW1lIHBhcnQgY29udGV4dC4gKi8KIAorLyoKKyAqIE5BTUUgY3VybF9taW1lX2luaXQoKQorICoKKyAqIERFU0NSSVBUSU9OCisgKgorICogQ3JlYXRlIGEgbWltZSBjb250ZXh0IGFuZCByZXR1cm4gaXRzIGhhbmRsZS4gVGhlIGVhc3kgcGFyYW1ldGVyIGlzIHRoZQorICogdGFyZ2V0IGhhbmRsZS4KKyAqLworQ1VSTF9FWFRFUk4gY3VybF9taW1lICpjdXJsX21pbWVfaW5pdChDVVJMICplYXN5KTsKKworLyoKKyAqIE5BTUUgY3VybF9taW1lX2ZyZWUoKQorICoKKyAqIERFU0NSSVBUSU9OCisgKgorICogcmVsZWFzZSBhIG1pbWUgaGFuZGxlIGFuZCBpdHMgc3Vic3RydWN0dXJlcy4KKyAqLworQ1VSTF9FWFRFUk4gdm9pZCBjdXJsX21pbWVfZnJlZShjdXJsX21pbWUgKm1pbWUpOworCisvKgorICogTkFNRSBjdXJsX21pbWVfYWRkcGFydCgpCisgKgorICogREVTQ1JJUFRJT04KKyAqCisgKiBBcHBlbmQgYSBuZXcgZW1wdHkgcGFydCB0byB0aGUgZ2l2ZW4gbWltZSBjb250ZXh0IGFuZCByZXR1cm4gYSBoYW5kbGUgdG8KKyAqIHRoZSBjcmVhdGVkIHBhcnQuCisgKi8KK0NVUkxfRVhURVJOIGN1cmxfbWltZXBhcnQgKmN1cmxfbWltZV9hZGRwYXJ0KGN1cmxfbWltZSAqbWltZSk7CisKKy8qCisgKiBOQU1FIGN1cmxfbWltZV9uYW1lKCkKKyAqCisgKiBERVNDUklQVElPTgorICoKKyAqIFNldCBtaW1lL2Zvcm0gcGFydCBuYW1lLgorICovCitDVVJMX0VYVEVSTiBDVVJMY29kZSBjdXJsX21pbWVfbmFtZShjdXJsX21pbWVwYXJ0ICpwYXJ0LCBjb25zdCBjaGFyICpuYW1lKTsKKworLyoKKyAqIE5BTUUgY3VybF9taW1lX2ZpbGVuYW1lKCkKKyAqCisgKiBERVNDUklQVElPTgorICoKKyAqIFNldCBtaW1lIHBhcnQgcmVtb3RlIGZpbGUgbmFtZS4KKyAqLworQ1VSTF9FWFRFUk4gQ1VSTGNvZGUgY3VybF9taW1lX2ZpbGVuYW1lKGN1cmxfbWltZXBhcnQgKnBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpOworCisvKgorICogTkFNRSBjdXJsX21pbWVfdHlwZSgpCisgKgorICogREVTQ1JJUFRJT04KKyAqCisgKiBTZXQgbWltZSBwYXJ0IHR5cGUuCisgKi8KK0NVUkxfRVhURVJOIENVUkxjb2RlIGN1cmxfbWltZV90eXBlKGN1cmxfbWltZXBhcnQgKnBhcnQsIGNvbnN0IGNoYXIgKm1pbWV0eXBlKTsKKworLyoKKyAqIE5BTUUgY3VybF9taW1lX2VuY29kZXIoKQorICoKKyAqIERFU0NSSVBUSU9OCisgKgorICogU2V0IG1pbWUgZGF0YSB0cmFuc2ZlciBlbmNvZGVyLgorICovCitDVVJMX0VYVEVSTiBDVVJMY29kZSBjdXJsX21pbWVfZW5jb2RlcihjdXJsX21pbWVwYXJ0ICpwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcpOworCisvKgorICogTkFNRSBjdXJsX21pbWVfZGF0YSgpCisgKgorICogREVTQ1JJUFRJT04KKyAqCisgKiBTZXQgbWltZSBwYXJ0IGRhdGEgc291cmNlIGZyb20gbWVtb3J5IGRhdGEsCisgKi8KK0NVUkxfRVhURVJOIENVUkxjb2RlIGN1cmxfbWltZV9kYXRhKGN1cmxfbWltZXBhcnQgKnBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgZGF0YXNpemUpOworCisvKgorICogTkFNRSBjdXJsX21pbWVfZmlsZWRhdGEoKQorICoKKyAqIERFU0NSSVBUSU9OCisgKgorICogU2V0IG1pbWUgcGFydCBkYXRhIHNvdXJjZSBmcm9tIG5hbWVkIGZpbGUuCisgKi8KK0NVUkxfRVhURVJOIENVUkxjb2RlIGN1cmxfbWltZV9maWxlZGF0YShjdXJsX21pbWVwYXJ0ICpwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKworLyoKKyAqIE5BTUUgY3VybF9taW1lX2RhdGFfY2IoKQorICoKKyAqIERFU0NSSVBUSU9OCisgKgorICogU2V0IG1pbWUgcGFydCBkYXRhIHNvdXJjZSBmcm9tIGNhbGxiYWNrIGZ1bmN0aW9uLgorICovCitDVVJMX0VYVEVSTiBDVVJMY29kZSBjdXJsX21pbWVfZGF0YV9jYihjdXJsX21pbWVwYXJ0ICpwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9vZmZfdCBkYXRhc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfcmVhZF9jYWxsYmFjayByZWFkZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfc2Vla19jYWxsYmFjayBzZWVrZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfZnJlZV9jYWxsYmFjayBmcmVlZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZyk7CisKKy8qCisgKiBOQU1FIGN1cmxfbWltZV9zdWJwYXJ0cygpCisgKgorICogREVTQ1JJUFRJT04KKyAqCisgKiBTZXQgbWltZSBwYXJ0IGRhdGEgc291cmNlIGZyb20gc3VicGFydHMuCisgKi8KK0NVUkxfRVhURVJOIENVUkxjb2RlIGN1cmxfbWltZV9zdWJwYXJ0cyhjdXJsX21pbWVwYXJ0ICpwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfbWltZSAqc3VicGFydHMpOworLyoKKyAqIE5BTUUgY3VybF9taW1lX2hlYWRlcnMoKQorICoKKyAqIERFU0NSSVBUSU9OCisgKgorICogU2V0IG1pbWUgcGFydCBoZWFkZXJzLgorICovCitDVVJMX0VYVEVSTiBDVVJMY29kZSBjdXJsX21pbWVfaGVhZGVycyhjdXJsX21pbWVwYXJ0ICpwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGN1cmxfc2xpc3QgKmhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFrZV9vd25lcnNoaXApOworCisvKiBPbGQgZm9ybSBBUEkuICovCiAvKiBuYW1lIGlzIHVwcGVyY2FzZSBDVVJMRk9STV88bmFtZT4gKi8KICNpZmRlZiBDRklOSVQKICN1bmRlZiBDRklOSVQKQEAgLTIxNzksNiArMjMzOCw0NyBAQAogfTsKIAogLyoKKyAqIE5BTUUgY3VybF9nbG9iYWxfc3Nsc2V0KCkKKyAqCisgKiBERVNDUklQVElPTgorICoKKyAqIFdoZW4gYnVpbHQgd2l0aCBtdWx0aXBsZSBTU0wgYmFja2VuZHMsIGN1cmxfZ2xvYmFsX3NzbHNldCgpIGFsbG93cyB0bworICogY2hvb3NlIG9uZS4gVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgb25jZSwgYW5kIGl0IG11c3QgYmUgY2FsbGVkCisgKiAqYmVmb3JlKiBjdXJsX2dsb2JhbF9pbml0KCkuCisgKgorICogVGhlIGJhY2tlbmQgY2FuIGJlIGlkZW50aWZpZWQgYnkgdGhlIGlkIChlLmcuIENVUkxTU0xCQUNLRU5EX09QRU5TU0wpLiBUaGUKKyAqIGJhY2tlbmQgY2FuIGFsc28gYmUgc3BlY2lmaWVkIHZpYSB0aGUgbmFtZSBwYXJhbWV0ZXIgKHBhc3NpbmcgLTEgYXMgaWQpLgorICogSWYgYm90aCBpZCBhbmQgbmFtZSBhcmUgc3BlY2lmaWVkLCB0aGUgbmFtZSB3aWxsIGJlIGlnbm9yZWQuIElmIG5laXRoZXIgaWQKKyAqIG5vciBuYW1lIGFyZSBzcGVjaWZpZWQsIHRoZSBmdW5jdGlvbiB3aWxsIGZhaWwgd2l0aAorICogQ1VSTFNTTFNFVF9VTktOT1dOX0JBQ0tFTkQgYW5kIHNldCB0aGUgImF2YWlsIiBwb2ludGVyIHRvIHRoZQorICogTlVMTC10ZXJtaW5hdGVkIGxpc3Qgb2YgYXZhaWxhYmxlIGJhY2tlbmRzLgorICoKKyAqIFVwb24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgQ1VSTFNTTFNFVF9PSy4KKyAqCisgKiBJZiB0aGUgc3BlY2lmaWVkIFNTTCBiYWNrZW5kIGlzIG5vdCBhdmFpbGFibGUsIHRoZSBmdW5jdGlvbiByZXR1cm5zCisgKiBDVVJMU1NMU0VUX1VOS05PV05fQkFDS0VORCBhbmQgc2V0cyB0aGUgImF2YWlsIiBwb2ludGVyIHRvIGEgTlVMTC10ZXJtaW5hdGVkCisgKiBsaXN0IG9mIGF2YWlsYWJsZSBTU0wgYmFja2VuZHMuCisgKgorICogVGhlIFNTTCBiYWNrZW5kIGNhbiBiZSBzZXQgb25seSBvbmNlLiBJZiBpdCBoYXMgYWxyZWFkeSBiZWVuIHNldCwgYQorICogc3Vic2VxdWVudCBhdHRlbXB0IHRvIGNoYW5nZSBpdCB3aWxsIHJlc3VsdCBpbiBhIENVUkxTU0xTRVRfVE9PX0xBVEUuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBjdXJsX3NzbGJhY2tlbmQgaWQ7CisgIGNvbnN0IGNoYXIgKm5hbWU7Cit9IGN1cmxfc3NsX2JhY2tlbmQ7CisKK3R5cGVkZWYgZW51bSB7CisgIENVUkxTU0xTRVRfT0sgPSAwLAorICBDVVJMU1NMU0VUX1VOS05PV05fQkFDS0VORCwKKyAgQ1VSTFNTTFNFVF9UT09fTEFURSwKKyAgQ1VSTFNTTFNFVF9OT19CQUNLRU5EUyAvKiBsaWJjdXJsIHdhcyBidWlsdCB3aXRob3V0IGFueSBTU0wgc3VwcG9ydCAqLworfSBDVVJMc3Nsc2V0OworCitDVVJMX0VYVEVSTiBDVVJMc3Nsc2V0IGN1cmxfZ2xvYmFsX3NzbHNldChjdXJsX3NzbGJhY2tlbmQgaWQsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJsX3NzbF9iYWNrZW5kICoqKmF2YWlsKTsKKworLyoKICAqIE5BTUUgY3VybF9zbGlzdF9hcHBlbmQoKQogICoKICAqIERFU0NSSVBUSU9OCkBAIC0yMjE4LDI3ICsyNDE4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ICJuYW1lOiB2YWx1ZSIgKi8KIH07CiAKLS8qIGVudW0gZm9yIHRoZSBkaWZmZXJlbnQgc3VwcG9ydGVkIFNTTCBiYWNrZW5kcyAqLwotdHlwZWRlZiBlbnVtIHsKLSAgQ1VSTFNTTEJBQ0tFTkRfTk9ORSA9IDAsCi0gIENVUkxTU0xCQUNLRU5EX09QRU5TU0wgPSAxLAotICBDVVJMU1NMQkFDS0VORF9HTlVUTFMgPSAyLAotICBDVVJMU1NMQkFDS0VORF9OU1MgPSAzLAotICBDVVJMU1NMQkFDS0VORF9PQlNPTEVURTQgPSA0LCAgLyogV2FzIFFTT1NTTC4gKi8KLSAgQ1VSTFNTTEJBQ0tFTkRfR1NLSVQgPSA1LAotICBDVVJMU1NMQkFDS0VORF9QT0xBUlNTTCA9IDYsCi0gIENVUkxTU0xCQUNLRU5EX0NZQVNTTCA9IDcsCi0gIENVUkxTU0xCQUNLRU5EX1NDSEFOTkVMID0gOCwKLSAgQ1VSTFNTTEJBQ0tFTkRfREFSV0lOU1NMID0gOSwKLSAgQ1VSTFNTTEJBQ0tFTkRfQVhUTFMgPSAxMCwKLSAgQ1VSTFNTTEJBQ0tFTkRfTUJFRFRMUyA9IDExCi19IGN1cmxfc3NsYmFja2VuZDsKLQotLyogYWxpYXNlcyBmb3IgbGlicmFyeSBjbG9uZXMgYW5kIHJlbmFtZXMgKi8KLSNkZWZpbmUgQ1VSTFNTTEJBQ0tFTkRfTElCUkVTU0wgMQotI2RlZmluZSBDVVJMU1NMQkFDS0VORF9CT1JJTkdTU0wgMQotI2RlZmluZSBDVVJMU1NMQkFDS0VORF9XT0xGU1NMIDYKLQogLyogSW5mb3JtYXRpb24gYWJvdXQgdGhlIFNTTCBsaWJyYXJ5IHVzZWQgYW5kIHRoZSByZXNwZWN0aXZlIGludGVybmFsIFNTTAogICAgaGFuZGxlLCB3aGljaCBjYW4gYmUgdXNlZCB0byBvYnRhaW4gZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlCiAgICBjb25uZWN0aW9uLiBBc2tlZCBmb3Igd2l0aCBDVVJMSU5GT19UTFNfU1NMX1BUUiBvciBDVVJMSU5GT19UTFNfU0VTU0lPTi4gKi8KQEAgLTIyNTMsNiArMjQzMiw3IEBACiAjZGVmaW5lIENVUkxJTkZPX1NMSVNUICAgIDB4NDAwMDAwCiAjZGVmaW5lIENVUkxJTkZPX1BUUiAgICAgIDB4NDAwMDAwIC8qIHNhbWUgYXMgU0xJU1QgKi8KICNkZWZpbmUgQ1VSTElORk9fU09DS0VUICAgMHg1MDAwMDAKKyNkZWZpbmUgQ1VSTElORk9fT0ZGX1QgICAgMHg2MDAwMDAKICNkZWZpbmUgQ1VSTElORk9fTUFTSyAgICAgMHgwZmZmZmYKICNkZWZpbmUgQ1VSTElORk9fVFlQRU1BU0sgMHhmMDAwMDAKIApAQCAtMjI2NSwxNSArMjQ0NSwyMSBAQAogICBDVVJMSU5GT19DT05ORUNUX1RJTUUgICAgID0gQ1VSTElORk9fRE9VQkxFICsgNSwKICAgQ1VSTElORk9fUFJFVFJBTlNGRVJfVElNRSA9IENVUkxJTkZPX0RPVUJMRSArIDYsCiAgIENVUkxJTkZPX1NJWkVfVVBMT0FEICAgICAgPSBDVVJMSU5GT19ET1VCTEUgKyA3LAorICBDVVJMSU5GT19TSVpFX1VQTE9BRF9UICAgID0gQ1VSTElORk9fT0ZGX1QgICsgNywKICAgQ1VSTElORk9fU0laRV9ET1dOTE9BRCAgICA9IENVUkxJTkZPX0RPVUJMRSArIDgsCisgIENVUkxJTkZPX1NJWkVfRE9XTkxPQURfVCAgPSBDVVJMSU5GT19PRkZfVCAgKyA4LAogICBDVVJMSU5GT19TUEVFRF9ET1dOTE9BRCAgID0gQ1VSTElORk9fRE9VQkxFICsgOSwKKyAgQ1VSTElORk9fU1BFRURfRE9XTkxPQURfVCA9IENVUkxJTkZPX09GRl9UICArIDksCiAgIENVUkxJTkZPX1NQRUVEX1VQTE9BRCAgICAgPSBDVVJMSU5GT19ET1VCTEUgKyAxMCwKKyAgQ1VSTElORk9fU1BFRURfVVBMT0FEX1QgICA9IENVUkxJTkZPX09GRl9UICArIDEwLAogICBDVVJMSU5GT19IRUFERVJfU0laRSAgICAgID0gQ1VSTElORk9fTE9ORyAgICsgMTEsCiAgIENVUkxJTkZPX1JFUVVFU1RfU0laRSAgICAgPSBDVVJMSU5GT19MT05HICAgKyAxMiwKICAgQ1VSTElORk9fU1NMX1ZFUklGWVJFU1VMVCA9IENVUkxJTkZPX0xPTkcgICArIDEzLAogICBDVVJMSU5GT19GSUxFVElNRSAgICAgICAgID0gQ1VSTElORk9fTE9ORyAgICsgMTQsCiAgIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEICAgPSBDVVJMSU5GT19ET1VCTEUgKyAxNSwKKyAgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQURfVCA9IENVUkxJTkZPX09GRl9UICArIDE1LAogICBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9VUExPQUQgICAgID0gQ1VSTElORk9fRE9VQkxFICsgMTYsCisgIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX1VQTE9BRF9UICAgPSBDVVJMSU5GT19PRkZfVCAgKyAxNiwKICAgQ1VSTElORk9fU1RBUlRUUkFOU0ZFUl9USU1FID0gQ1VSTElORk9fRE9VQkxFICsgMTcsCiAgIENVUkxJTkZPX0NPTlRFTlRfVFlQRSAgICAgPSBDVVJMSU5GT19TVFJJTkcgKyAxOCwKICAgQ1VSTElORk9fUkVESVJFQ1RfVElNRSAgICA9IENVUkxJTkZPX0RPVUJMRSArIDE5LApAQCAtMjQ3MSw2ICsyNjU3LDcgQEAKICNkZWZpbmUgQ1VSTF9WRVJTSU9OX1BTTCAgICAgICAgICAoMTw8MjApIC8qIE1vemlsbGEncyBQdWJsaWMgU3VmZml4IExpc3QsIHVzZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBjb29raWUgZG9tYWluIHZlcmlmaWNhdGlvbiAqLwogI2RlZmluZSBDVVJMX1ZFUlNJT05fSFRUUFNfUFJPWFkgICgxPDwyMSkgLyogSFRUUFMtcHJveHkgc3VwcG9ydCBidWlsdC1pbiAqLworI2RlZmluZSBDVVJMX1ZFUlNJT05fTVVMVElfU1NMICAgICgxPDwyMikgLyogTXVsdGlwbGUgU1NMIGJhY2tlbmRzIGF2YWlsYWJsZSAqLwogCiAgLyoKICAqIE5BTUUgY3VybF92ZXJzaW9uX2luZm8oKQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9pbmNsdWRlL2N1cmwvY3VybGJ1aWxkLmguY21ha2UgYi9VdGlsaXRpZXMvY21jdXJsL2luY2x1ZGUvY3VybC9jdXJsYnVpbGQuaC5jbWFrZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhiNGY1Mi4uMDAwMDAwMAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2luY2x1ZGUvY3VybC9jdXJsYnVpbGQuaC5jbWFrZQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0jaWZuZGVmIF9fQ1VSTF9DVVJMQlVJTERfSAotI2RlZmluZSBfX0NVUkxfQ1VSTEJVSUxEX0gKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KLSAqICBQcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMDgsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKLSAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKLSAqIGFyZSBhbHNvIGF2YWlsYWJsZSBhdCBodHRwczovL2N1cmwuaGF4eC5zZS9kb2NzL2NvcHlyaWdodC5odG1sLgotICoKLSAqIFlvdSBtYXkgb3B0IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSBhbmQvb3Igc2VsbAotICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCi0gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ09QWUlORyBmaWxlLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogICAgICAgICAgICAgICBOT1RFUyBGT1IgQ09ORklHVVJFIENBUEFCTEUgU1lTVEVNUyAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0vKgotICogTk9URSAxOgotICogLS0tLS0tLQotICoKLSAqIE5vdGhpbmcgaW4gdGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIGJlIG1vZGlmaWVkIG9yIGFkanVzdGVkIGJ5IHRoZQotICogY3VybCBsaWJyYXJ5IHVzZXIgbm9yIGJ5IHRoZSBjdXJsIGxpYnJhcnkgYnVpbGRlci4KLSAqCi0gKiBJZiB5b3UgdGhpbmsgdGhhdCBzb21ldGhpbmcgYWN0dWFsbHkgbmVlZHMgdG8gYmUgY2hhbmdlZCwgYWRqdXN0ZWQKLSAqIG9yIGZpeGVkIGluIHRoaXMgZmlsZSwgdGhlbiwgcmVwb3J0IGl0IG9uIHRoZSBsaWJjdXJsIGRldmVsb3BtZW50Ci0gKiBtYWlsaW5nIGxpc3Q6IGh0dHBzOi8vY29vbC5oYXh4LnNlL21haWxtYW4vbGlzdGluZm8vY3VybC1saWJyYXJ5LwotICoKLSAqIFRoaXMgaGVhZGVyIGZpbGUgc2hhbGwgb25seSBleHBvcnQgc3ltYm9scyB3aGljaCBhcmUgJ2N1cmwnIG9yICdDVVJMJwotICogcHJlZml4ZWQsIG90aGVyd2lzZSBwdWJsaWMgbmFtZSBzcGFjZSB3b3VsZCBiZSBwb2xsdXRlZC4KLSAqCi0gKiBOT1RFIDI6Ci0gKiAtLS0tLS0tCi0gKgotICogUmlnaHQgbm93IHlvdSBtaWdodCBiZSBzdGFyaW5nIGF0IGZpbGUgaW5jbHVkZS9jdXJsL2N1cmxidWlsZC5oLmluIG9yCi0gKiBhdCBmaWxlIGluY2x1ZGUvY3VybC9jdXJsYnVpbGQuaCwgdGhpcyBpcyBkdWUgdG8gdGhlIGZvbGxvd2luZyByZWFzb246Ci0gKgotICogT24gc3lzdGVtcyBjYXBhYmxlIG9mIHJ1bm5pbmcgdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIHRoZSBjb25maWd1cmUgcHJvY2VzcwotICogd2lsbCBvdmVyd3JpdGUgdGhlIGRpc3RyaWJ1dGVkIGluY2x1ZGUvY3VybC9jdXJsYnVpbGQuaCBmaWxlIHdpdGggb25lIHRoYXQKLSAqIGlzIHN1aXRhYmxlIGFuZCBzcGVjaWZpYyB0byB0aGUgbGlicmFyeSBiZWluZyBjb25maWd1cmVkIGFuZCBidWlsdCwgd2hpY2gKLSAqIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBpbmNsdWRlL2N1cmwvY3VybGJ1aWxkLmguaW4gdGVtcGxhdGUgZmlsZS4KLSAqCi0gKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIERFRklOSVRJT04gT0YgVEhFU0UgU1lNQk9MUyBTSEFMTCBOT1QgVEFLRSBQTEFDRSBBTllXSEVSRSBFTFNFICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0jaWZkZWYgQ1VSTF9TSVpFT0ZfTE9ORwotI2Vycm9yICJDVVJMX1NJWkVPRl9MT05HIHNoYWxsIG5vdCBiZSBkZWZpbmVkIGV4Y2VwdCBpbiBjdXJsYnVpbGQuaCIKLSAgIEVycm9yIENvbXBpbGF0aW9uX2Fib3J0ZWRfQ1VSTF9TSVpFT0ZfTE9OR19hbHJlYWR5X2RlZmluZWQKLSNlbmRpZgotCi0jaWZkZWYgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QKLSNlcnJvciAiQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1Qgc2hhbGwgbm90IGJlIGRlZmluZWQgZXhjZXB0IGluIGN1cmxidWlsZC5oIgotICAgRXJyb3IgQ29tcGlsYXRpb25fYWJvcnRlZF9DVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVF9hbHJlYWR5X2RlZmluZWQKLSNlbmRpZgotCi0jaWZkZWYgQ1VSTF9TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QKLSNlcnJvciAiQ1VSTF9TSVpFT0ZfQ1VSTF9TT0NLTEVOX1Qgc2hhbGwgbm90IGJlIGRlZmluZWQgZXhjZXB0IGluIGN1cmxidWlsZC5oIgotICAgRXJyb3IgQ29tcGlsYXRpb25fYWJvcnRlZF9DVVJMX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVF9hbHJlYWR5X2RlZmluZWQKLSNlbmRpZgotCi0jaWZkZWYgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVAotI2Vycm9yICJDVVJMX1RZUEVPRl9DVVJMX09GRl9UIHNoYWxsIG5vdCBiZSBkZWZpbmVkIGV4Y2VwdCBpbiBjdXJsYnVpbGQuaCIKLSAgIEVycm9yIENvbXBpbGF0aW9uX2Fib3J0ZWRfQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVF9hbHJlYWR5X2RlZmluZWQKLSNlbmRpZgotCi0jaWZkZWYgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVAotI2Vycm9yICJDVVJMX0ZPUk1BVF9DVVJMX09GRl9UIHNoYWxsIG5vdCBiZSBkZWZpbmVkIGV4Y2VwdCBpbiBjdXJsYnVpbGQuaCIKLSAgIEVycm9yIENvbXBpbGF0aW9uX2Fib3J0ZWRfQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVF9hbHJlYWR5X2RlZmluZWQKLSNlbmRpZgotCi0jaWZkZWYgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUKLSNlcnJvciAiQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgc2hhbGwgbm90IGJlIGRlZmluZWQgZXhjZXB0IGluIGN1cmxidWlsZC5oIgotICAgRXJyb3IgQ29tcGlsYXRpb25fYWJvcnRlZF9DVVJMX0ZPUk1BVF9DVVJMX09GRl9UVV9hbHJlYWR5X2RlZmluZWQKLSNlbmRpZgotCi0jaWZkZWYgQ1VSTF9GT1JNQVRfT0ZGX1QKLSNlcnJvciAiQ1VSTF9GT1JNQVRfT0ZGX1Qgc2hhbGwgbm90IGJlIGRlZmluZWQgZXhjZXB0IGluIGN1cmxidWlsZC5oIgotICAgRXJyb3IgQ29tcGlsYXRpb25fYWJvcnRlZF9DVVJMX0ZPUk1BVF9PRkZfVF9hbHJlYWR5X2RlZmluZWQKLSNlbmRpZgotCi0jaWZkZWYgQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVAotI2Vycm9yICJDVVJMX1NJWkVPRl9DVVJMX09GRl9UIHNoYWxsIG5vdCBiZSBkZWZpbmVkIGV4Y2VwdCBpbiBjdXJsYnVpbGQuaCIKLSAgIEVycm9yIENvbXBpbGF0aW9uX2Fib3J0ZWRfQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVF9hbHJlYWR5X2RlZmluZWQKLSNlbmRpZgotCi0jaWZkZWYgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVAotI2Vycm9yICJDVVJMX1NVRkZJWF9DVVJMX09GRl9UIHNoYWxsIG5vdCBiZSBkZWZpbmVkIGV4Y2VwdCBpbiBjdXJsYnVpbGQuaCIKLSAgIEVycm9yIENvbXBpbGF0aW9uX2Fib3J0ZWRfQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVF9hbHJlYWR5X2RlZmluZWQKLSNlbmRpZgotCi0jaWZkZWYgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUKLSNlcnJvciAiQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgc2hhbGwgbm90IGJlIGRlZmluZWQgZXhjZXB0IGluIGN1cmxidWlsZC5oIgotICAgRXJyb3IgQ29tcGlsYXRpb25fYWJvcnRlZF9DVVJMX1NVRkZJWF9DVVJMX09GRl9UVV9hbHJlYWR5X2RlZmluZWQKLSNlbmRpZgotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRVhURVJOQUwgSU5URVJGQUNFIFNFVFRJTkdTIEZPUiBDT05GSUdVUkUgQ0FQQUJMRSBTWVNURU1TIE9OTFkgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLS8qIENvbmZpZ3VyZSBwcm9jZXNzIGRlZmluZXMgdGhpcyB0byAxIHdoZW4gaXQgZmluZHMgb3V0IHRoYXQgc3lzdGVtICAqLwotLyogaGVhZGVyIGZpbGUgd3MydGNwaXAuaCBtdXN0IGJlIGluY2x1ZGVkIGJ5IHRoZSBleHRlcm5hbCBpbnRlcmZhY2UuICovCi0jY21ha2VkZWZpbmUgQ1VSTF9QVUxMX1dTMlRDUElQX0gKLSNpZmRlZiBDVVJMX1BVTExfV1MyVENQSVBfSAotIyAgaWZuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KLSMgICAgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSMgIGVuZGlmCi0jICBpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jICBpbmNsdWRlIDx3aW5zb2NrMi5oPgotIyAgaW5jbHVkZSA8d3MydGNwaXAuaD4KLSNlbmRpZgotCi0vKiBDb25maWd1cmUgcHJvY2VzcyBkZWZpbmVzIHRoaXMgdG8gMSB3aGVuIGl0IGZpbmRzIG91dCB0aGF0IHN5c3RlbSAgICovCi0vKiBoZWFkZXIgZmlsZSBzeXMvdHlwZXMuaCBtdXN0IGJlIGluY2x1ZGVkIGJ5IHRoZSBleHRlcm5hbCBpbnRlcmZhY2UuICovCi0jY21ha2VkZWZpbmUgQ1VSTF9QVUxMX1NZU19UWVBFU19ICi0jaWZkZWYgQ1VSTF9QVUxMX1NZU19UWVBFU19ICi0jICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZgotCi0vKiBDb25maWd1cmUgcHJvY2VzcyBkZWZpbmVzIHRoaXMgdG8gMSB3aGVuIGl0IGZpbmRzIG91dCB0aGF0IHN5c3RlbSAqLwotLyogaGVhZGVyIGZpbGUgc3RkaW50LmggbXVzdCBiZSBpbmNsdWRlZCBieSB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlLiAgKi8KLSNjbWFrZWRlZmluZSBDVVJMX1BVTExfU1RESU5UX0gKLSNpZmRlZiBDVVJMX1BVTExfU1RESU5UX0gKLSMgIGluY2x1ZGUgPHN0ZGludC5oPgotI2VuZGlmCi0KLS8qIENvbmZpZ3VyZSBwcm9jZXNzIGRlZmluZXMgdGhpcyB0byAxIHdoZW4gaXQgZmluZHMgb3V0IHRoYXQgc3lzdGVtICAqLwotLyogaGVhZGVyIGZpbGUgaW50dHlwZXMuaCBtdXN0IGJlIGluY2x1ZGVkIGJ5IHRoZSBleHRlcm5hbCBpbnRlcmZhY2UuICovCi0jY21ha2VkZWZpbmUgQ1VSTF9QVUxMX0lOVFRZUEVTX0gKLSNpZmRlZiBDVVJMX1BVTExfSU5UVFlQRVNfSAotIyAgaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNlbmRpZgotCi0vKiBDb25maWd1cmUgcHJvY2VzcyBkZWZpbmVzIHRoaXMgdG8gMSB3aGVuIGl0IGZpbmRzIG91dCB0aGF0IHN5c3RlbSAgICAqLwotLyogaGVhZGVyIGZpbGUgc3lzL3NvY2tldC5oIG11c3QgYmUgaW5jbHVkZWQgYnkgdGhlIGV4dGVybmFsIGludGVyZmFjZS4gKi8KLSNjbWFrZWRlZmluZSBDVVJMX1BVTExfU1lTX1NPQ0tFVF9ICi0jaWZkZWYgQ1VSTF9QVUxMX1NZU19TT0NLRVRfSAotIyAgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2VuZGlmCi0KLS8qIENvbmZpZ3VyZSBwcm9jZXNzIGRlZmluZXMgdGhpcyB0byAxIHdoZW4gaXQgZmluZHMgb3V0IHRoYXQgc3lzdGVtICAqLwotLyogaGVhZGVyIGZpbGUgc3lzL3BvbGwuaCBtdXN0IGJlIGluY2x1ZGVkIGJ5IHRoZSBleHRlcm5hbCBpbnRlcmZhY2UuICovCi0jY21ha2VkZWZpbmUgQ1VSTF9QVUxMX1NZU19QT0xMX0gKLSNpZmRlZiBDVVJMX1BVTExfU1lTX1BPTExfSAotIyAgaW5jbHVkZSA8c3lzL3BvbGwuaD4KLSNlbmRpZgotCi0vKiBUaGUgc2l6ZSBvZiBgaW50JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLwotQENVUkxfU0laRU9GX0lOVF9DT0RFQAotCi0vKiBUaGUgc2l6ZSBvZiBgbG9uZycsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KLUBDVVJMX1NJWkVPRl9MT05HX0NPREVACi0KLS8qIFRoZSBzaXplIG9mIGBsb25nIGxvbmcnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCi1AQ1VSTF9TSVpFT0ZfTE9OR19MT05HX0NPREVACi0KLS8qIFRoZSBzaXplIG9mIGBzc2l6ZV90JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLwotQENVUkxfU0laRU9GX1NTSVpFX1RfQ09ERUAKLQotI2RlZmluZSBDVVJMX0hBVkVfU09DS0xFTl9UIEBDVVJMX0hBVkVfU09DS0xFTl9UQAotI2lmIENVUkxfSEFWRV9TT0NLTEVOX1QKLS8qIEludGVncmFsIGRhdGEgdHlwZSB1c2VkIGZvciBjdXJsX3NvY2tsZW5fdC4gKi8KLSNkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1Qgc29ja2xlbl90Ci0KLS8qIFRoZSBzaXplIG9mIGBjdXJsX3NvY2tsZW5fdCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KLUBDVVJMX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVF9DT0RFQAotI2Vsc2UKLSMgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UIGludAotIyBkZWZpbmUgQ1VSTF9TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QgQ1VSTF9TSVpFT0ZfSU5UCi0jZW5kaWYKLQotLyogRGF0YSB0eXBlIGRlZmluaXRpb24gb2YgY3VybF9zb2NrbGVuX3QuICovCi10eXBlZGVmIENVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UIGN1cmxfc29ja2xlbl90OwotCi0jaWYgQ1VSTF9TSVpFT0ZfTE9ORyA9PSA4Ci0jIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UIGxvbmcKLSMgZGVmaW5lIENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgOAotIyBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAibGQiCi0jIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibHUiCi0jIGRlZmluZSBDVVJMX0ZPUk1BVF9PRkZfVCAiJWxkIgotIyBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCBMCi0jIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBVTAotI2VsaWYgQ1VSTF9TSVpFT0ZfTE9OR19MT05HID09IDgKLSMgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgbG9uZyBsb25nCi0jIGRlZmluZSBDVVJMX1NJWkVPRl9DVVJMX09GRl9UIDgKLSMgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgImxsZCIKLSMgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICJsbHUiCi0jIGRlZmluZSBDVVJMX0ZPUk1BVF9PRkZfVCAiJWxsZCIKLSMgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgTEwKLSMgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVIFVMTAotI2Vsc2UKLSMgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1Qgc3NpemVfdAotIyBkZWZpbmUgQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCBDVVJMX1NJWkVPRl9TU0laRV9UCi0vKiBUT0RPOiBuZWVkIGFkanVzdG1lbnQgaGVyZS4gKi8KLSMgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgImxkIgotIyBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgImx1IgotIyBkZWZpbmUgQ1VSTF9GT1JNQVRfT0ZGX1QgIiVsZCIKLSMgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgTAotIyBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgVUwKLSNlbmRpZgotCi0vKiBEYXRhIHR5cGUgZGVmaW5pdGlvbiBvZiBjdXJsX29mZl90LiAqLwotdHlwZWRlZiBDVVJMX1RZUEVPRl9DVVJMX09GRl9UIGN1cmxfb2ZmX3Q7Ci0KLSNlbmRpZiAvKiBfX0NVUkxfQ1VSTEJVSUxEX0ggKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvaW5jbHVkZS9jdXJsL2N1cmxydWxlcy5oIGIvVXRpbGl0aWVzL2NtY3VybC9pbmNsdWRlL2N1cmwvY3VybHJ1bGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYmQ5ZjcuLjAwMDAwMDAKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9pbmNsdWRlL2N1cmwvY3VybHJ1bGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotI2lmbmRlZiBfX0NVUkxfQ1VSTFJVTEVTX0gKLSNkZWZpbmUgX19DVVJMX0NVUkxSVUxFU19ICi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfICAgXyBfX19fICBfCi0gKiAgUHJvamVjdCAgICAgICAgICAgICAgICAgICAgIF9fX3wgfCB8IHwgIF8gXHwgfAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gX198IHwgfCB8IHxfKSB8IHwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCi0gKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCi0gKiBhcmUgYWxzbyBhdmFpbGFibGUgYXQgaHR0cHM6Ly9jdXJsLmhheHguc2UvZG9jcy9jb3B5cmlnaHQuaHRtbC4KLSAqCi0gKiBZb3UgbWF5IG9wdCB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUgYW5kL29yIHNlbGwKLSAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwotICogZnVybmlzaGVkIHRvIGRvIHNvLCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENPUFlJTkcgZmlsZS4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICAgICAgICAgICAgICAgICAgICBDT01QSUxFIFRJTUUgU0FOSVRZIENIRUNLUyAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotLyoKLSAqIE5PVEUgMToKLSAqIC0tLS0tLS0KLSAqCi0gKiBBbGwgY2hlY2tzIGRvbmUgaW4gdGhpcyBmaWxlIGFyZSBpbnRlbnRpb25hbGx5IHBsYWNlZCBpbiBhIHB1YmxpYwotICogaGVhZGVyIGZpbGUgd2hpY2ggaXMgcHVsbGVkIGJ5IGN1cmwvY3VybC5oIHdoZW4gYW4gYXBwbGljYXRpb24gaXMKLSAqIGJlaW5nIGJ1aWx0IHVzaW5nIGFuIGFscmVhZHkgYnVpbHQgbGliY3VybCBsaWJyYXJ5LiBBZGRpdGlvbmFsbHkKLSAqIHRoaXMgZmlsZSBpcyBhbHNvIGluY2x1ZGVkIGFuZCB1c2VkIHdoZW4gYnVpbGRpbmcgdGhlIGxpYnJhcnkuCi0gKgotICogSWYgY29tcGlsYXRpb24gZmFpbHMgb24gdGhpcyBmaWxlIGl0IGlzIGNlcnRhaW5seSBzdXJlIHRoYXQgdGhlCi0gKiBwcm9ibGVtIGlzIGVsc2V3aGVyZS4gSXQgY291bGQgYmUgYSBwcm9ibGVtIGluIHRoZSBjdXJsYnVpbGQuaAotICogaGVhZGVyIGZpbGUsIG9yIHNpbXBseSB0aGF0IHlvdSBhcmUgdXNpbmcgZGlmZmVyZW50IGNvbXBpbGF0aW9uCi0gKiBzZXR0aW5ncyB0aGFuIHRob3NlIHVzZWQgdG8gYnVpbGQgdGhlIGxpYnJhcnkuCi0gKgotICogTm90aGluZyBpbiB0aGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgbW9kaWZpZWQgb3IgYWRqdXN0ZWQgYnkgdGhlCi0gKiBjdXJsIGxpYnJhcnkgdXNlciBub3IgYnkgdGhlIGN1cmwgbGlicmFyeSBidWlsZGVyLgotICoKLSAqIERvIG5vdCBkZWFjdGl2YXRlIGFueSBjaGVjaywgdGhlc2UgYXJlIGRvbmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlCi0gKiBsaWJyYXJ5IGlzIHByb3Blcmx5IGJ1aWx0IGFuZCB1c2VkLgotICoKLSAqIFlvdSBjYW4gZmluZCBmdXJ0aGVyIGhlbHAgb24gdGhlIGxpYmN1cmwgZGV2ZWxvcG1lbnQgbWFpbGluZyBsaXN0OgotICogaHR0cHM6Ly9jb29sLmhheHguc2UvbWFpbG1hbi9saXN0aW5mby9jdXJsLWxpYnJhcnkvCi0gKgotICogTk9URSAyCi0gKiAtLS0tLS0KLSAqCi0gKiBTb21lIG9mIHRoZSBmb2xsb3dpbmcgY29tcGlsZSB0aW1lIGNoZWNrcyBhcmUgYmFzZWQgb24gdGhlIGZhY3QKLSAqIHRoYXQgdGhlIGRpbWVuc2lvbiBvZiBhIGNvbnN0YW50IGFycmF5IGNhbiBub3QgYmUgYSBuZWdhdGl2ZSBvbmUuCi0gKiBJbiB0aGlzIHdheSBpZiB0aGUgY29tcGlsZSB0aW1lIHZlcmlmaWNhdGlvbiBmYWlscywgdGhlIGNvbXBpbGF0aW9uCi0gKiB3aWxsIGZhaWwgaXNzdWluZyBhbiBlcnJvci4gVGhlIGVycm9yIGRlc2NyaXB0aW9uIHdvcmRpbmcgaXMgY29tcGlsZXIKLSAqIGRlcGVuZGVudCBidXQgaXQgd2lsbCBiZSBxdWl0ZSBzaW1pbGFyIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICoKLSAqICAgIm5lZ2F0aXZlIHN1YnNjcmlwdCBvciBzdWJzY3JpcHQgaXMgdG9vIGxhcmdlIgotICogICAiYXJyYXkgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBlbGVtZW50IgotICogICAiLTEgaXMgYW4gaWxsZWdhbCBhcnJheSBzaXplIgotICogICAic2l6ZSBvZiBhcnJheSBpcyBuZWdhdGl2ZSIKLSAqCi0gKiBJZiB5b3UgYXJlIGJ1aWxkaW5nIGFuIGFwcGxpY2F0aW9uIHdoaWNoIHRyaWVzIHRvIHVzZSBhbiBhbHJlYWR5Ci0gKiBidWlsdCBsaWJjdXJsIGxpYnJhcnkgYW5kIHlvdSBhcmUgZ2V0dGluZyB0aGlzIGtpbmQgb2YgZXJyb3JzIG9uCi0gKiB0aGlzIGZpbGUsIGl0IGlzIGEgY2xlYXIgaW5kaWNhdGlvbiB0aGF0IHRoZXJlIGlzIGEgbWlzbWF0Y2ggYmV0d2VlbgotICogaG93IHRoZSBsaWJyYXJ5IHdhcyBidWlsdCBhbmQgaG93IHlvdSBhcmUgdHJ5aW5nIHRvIHVzZSBpdCBmb3IgeW91cgotICogYXBwbGljYXRpb24uIFlvdXIgYWxyZWFkeSBjb21waWxlZCBvciBiaW5hcnkgbGlicmFyeSBwcm92aWRlciBpcyB0aGUKLSAqIG9ubHkgb25lIHdobyBjYW4gZ2l2ZSB5b3UgdGhlIGRldGFpbHMgeW91IG5lZWQgdG8gcHJvcGVybHkgdXNlIGl0LgotICovCi0KLS8qCi0gKiBWZXJpZnkgdGhhdCBzb21lIG1hY3JvcyBhcmUgYWN0dWFsbHkgZGVmaW5lZC4KLSAqLwotCi0jaWZuZGVmIENVUkxfU0laRU9GX0xPTkcKLSMgIGVycm9yICJDVVJMX1NJWkVPRl9MT05HIGRlZmluaXRpb24gaXMgbWlzc2luZyEiCi0gICBFcnJvciBDb21waWxhdGlvbl9hYm9ydGVkX0NVUkxfU0laRU9GX0xPTkdfaXNfbWlzc2luZwotI2VuZGlmCi0KLSNpZm5kZWYgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QKLSMgIGVycm9yICJDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBkZWZpbml0aW9uIGlzIG1pc3NpbmchIgotICAgRXJyb3IgQ29tcGlsYXRpb25fYWJvcnRlZF9DVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVF9pc19taXNzaW5nCi0jZW5kaWYKLQotI2lmbmRlZiBDVVJMX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVAotIyAgZXJyb3IgIkNVUkxfU0laRU9GX0NVUkxfU09DS0xFTl9UIGRlZmluaXRpb24gaXMgbWlzc2luZyEiCi0gICBFcnJvciBDb21waWxhdGlvbl9hYm9ydGVkX0NVUkxfU0laRU9GX0NVUkxfU09DS0xFTl9UX2lzX21pc3NpbmcKLSNlbmRpZgotCi0jaWZuZGVmIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QKLSMgIGVycm9yICJDVVJMX1RZUEVPRl9DVVJMX09GRl9UIGRlZmluaXRpb24gaXMgbWlzc2luZyEiCi0gICBFcnJvciBDb21waWxhdGlvbl9hYm9ydGVkX0NVUkxfVFlQRU9GX0NVUkxfT0ZGX1RfaXNfbWlzc2luZwotI2VuZGlmCi0KLSNpZm5kZWYgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVAotIyAgZXJyb3IgIkNVUkxfRk9STUFUX0NVUkxfT0ZGX1QgZGVmaW5pdGlvbiBpcyBtaXNzaW5nISIKLSAgIEVycm9yIENvbXBpbGF0aW9uX2Fib3J0ZWRfQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVF9pc19taXNzaW5nCi0jZW5kaWYKLQotI2lmbmRlZiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVQotIyAgZXJyb3IgIkNVUkxfRk9STUFUX0NVUkxfT0ZGX1RVIGRlZmluaXRpb24gaXMgbWlzc2luZyEiCi0gICBFcnJvciBDb21waWxhdGlvbl9hYm9ydGVkX0NVUkxfRk9STUFUX0NVUkxfT0ZGX1RVX2lzX21pc3NpbmcKLSNlbmRpZgotCi0jaWZuZGVmIENVUkxfU0laRU9GX0NVUkxfT0ZGX1QKLSMgIGVycm9yICJDVVJMX1NJWkVPRl9DVVJMX09GRl9UIGRlZmluaXRpb24gaXMgbWlzc2luZyEiCi0gICBFcnJvciBDb21waWxhdGlvbl9hYm9ydGVkX0NVUkxfU0laRU9GX0NVUkxfT0ZGX1RfaXNfbWlzc2luZwotI2VuZGlmCi0KLSNpZm5kZWYgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVAotIyAgZXJyb3IgIkNVUkxfU1VGRklYX0NVUkxfT0ZGX1QgZGVmaW5pdGlvbiBpcyBtaXNzaW5nISIKLSAgIEVycm9yIENvbXBpbGF0aW9uX2Fib3J0ZWRfQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVF9pc19taXNzaW5nCi0jZW5kaWYKLQotI2lmbmRlZiBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVQotIyAgZXJyb3IgIkNVUkxfU1VGRklYX0NVUkxfT0ZGX1RVIGRlZmluaXRpb24gaXMgbWlzc2luZyEiCi0gICBFcnJvciBDb21waWxhdGlvbl9hYm9ydGVkX0NVUkxfU1VGRklYX0NVUkxfT0ZGX1RVX2lzX21pc3NpbmcKLSNlbmRpZgotCi0vKgotICogTWFjcm9zIHByaXZhdGUgdG8gdGhpcyBoZWFkZXIgZmlsZS4KLSAqLwotCi0jZGVmaW5lIEN1cmxjaGtzekVRKHQsIHMpIHNpemVvZih0KSA9PSBzID8gMSA6IC0xCi0KLSNkZWZpbmUgQ3VybGNoa3N6R0UodDEsIHQyKSBzaXplb2YodDEpID49IHNpemVvZih0MikgPyAxIDogLTEKLQotLyoKLSAqIFZlcmlmeSB0aGF0IHRoZSBzaXplIHByZXZpb3VzbHkgZGVmaW5lZCBhbmQgZXhwZWN0ZWQgZm9yIGxvbmcKLSAqIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgcmVwb3J0ZWQgYnkgc2l6ZW9mKCkgYXQgY29tcGlsZSB0aW1lLgotICovCi0KLXR5cGVkZWYgY2hhcgotICBfX2N1cmxfcnVsZV8wMV9fCi0gICAgW0N1cmxjaGtzekVRKGxvbmcsIENVUkxfU0laRU9GX0xPTkcpXTsKLQotLyoKLSAqIFZlcmlmeSB0aGF0IHRoZSBzaXplIHByZXZpb3VzbHkgZGVmaW5lZCBhbmQgZXhwZWN0ZWQgZm9yCi0gKiBjdXJsX29mZl90IGlzIGFjdHVhbGx5IHRoZSB0aGUgc2FtZSBhcyB0aGUgb25lIHJlcG9ydGVkCi0gKiBieSBzaXplb2YoKSBhdCBjb21waWxlIHRpbWUuCi0gKi8KLQotdHlwZWRlZiBjaGFyCi0gIF9fY3VybF9ydWxlXzAyX18KLSAgICBbQ3VybGNoa3N6RVEoY3VybF9vZmZfdCwgQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCldOwotCi0vKgotICogVmVyaWZ5IGF0IGNvbXBpbGUgdGltZSB0aGF0IHRoZSBzaXplIG9mIGN1cmxfb2ZmX3QgYXMgcmVwb3J0ZWQKLSAqIGJ5IHNpemVvZigpIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiB0aGUgb25lIHJlcG9ydGVkIGZvciBsb25nCi0gKiBmb3IgdGhlIGN1cnJlbnQgY29tcGlsYXRpb24uCi0gKi8KLQotdHlwZWRlZiBjaGFyCi0gIF9fY3VybF9ydWxlXzAzX18KLSAgICBbQ3VybGNoa3N6R0UoY3VybF9vZmZfdCwgbG9uZyldOwotCi0vKgotICogVmVyaWZ5IHRoYXQgdGhlIHNpemUgcHJldmlvdXNseSBkZWZpbmVkIGFuZCBleHBlY3RlZCBmb3IKLSAqIGN1cmxfc29ja2xlbl90IGlzIGFjdHVhbGx5IHRoZSB0aGUgc2FtZSBhcyB0aGUgb25lIHJlcG9ydGVkCi0gKiBieSBzaXplb2YoKSBhdCBjb21waWxlIHRpbWUuCi0gKi8KLQotdHlwZWRlZiBjaGFyCi0gIF9fY3VybF9ydWxlXzA0X18KLSAgICBbQ3VybGNoa3N6RVEoY3VybF9zb2NrbGVuX3QsIENVUkxfU0laRU9GX0NVUkxfU09DS0xFTl9UKV07Ci0KLS8qCi0gKiBWZXJpZnkgYXQgY29tcGlsZSB0aW1lIHRoYXQgdGhlIHNpemUgb2YgY3VybF9zb2NrbGVuX3QgYXMgcmVwb3J0ZWQKLSAqIGJ5IHNpemVvZigpIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiB0aGUgb25lIHJlcG9ydGVkIGZvciBpbnQgZm9yCi0gKiB0aGUgY3VycmVudCBjb21waWxhdGlvbi4KLSAqLwotCi10eXBlZGVmIGNoYXIKLSAgX19jdXJsX3J1bGVfMDVfXwotICAgIFtDdXJsY2hrc3pHRShjdXJsX3NvY2tsZW5fdCwgaW50KV07Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICAgICAgICAgIEVYVEVSTkFMTFkgQU5EIElOVEVSTkFMTFkgVklTSUJMRSBERUZJTklUSU9OUyAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotLyoKLSAqIENVUkxfSVNPQ1BQIGFuZCBDVVJMX09GRl9UX0MgZGVmaW5pdGlvbnMgYXJlIGRvbmUgaGVyZSBpbiBvcmRlciB0byBhbGxvdwotICogdGhlc2UgdG8gYmUgdmlzaWJsZSBhbmQgZXhwb3J0ZWQgYnkgdGhlIGV4dGVybmFsIGxpYmN1cmwgaW50ZXJmYWNlIEFQSSwKLSAqIHdoaWxlIGFsc28gbWFraW5nIHRoZW0gdmlzaWJsZSB0byB0aGUgbGlicmFyeSBpbnRlcm5hbHMsIHNpbXBseSBpbmNsdWRpbmcKLSAqIGN1cmxfc2V0dXAuaCwgd2l0aG91dCBhY3R1YWxseSBuZWVkaW5nIHRvIGluY2x1ZGUgY3VybC5oIGludGVybmFsbHkuCi0gKiBJZiBzb21lIGRheSB0aGlzIHNlY3Rpb24gd291bGQgZ3JvdyBiaWcgZW5vdWdoLCBhbGwgdGhpcyBzaG91bGQgYmUgbW92ZWQKLSAqIHRvIGl0cyBvd24gaGVhZGVyIGZpbGUuCi0gKi8KLQotLyoKLSAqIEZpZ3VyZSBvdXQgaWYgd2UgY2FuIHVzZSB0aGUgIyMgcHJlcHJvY2Vzc29yIG9wZXJhdG9yLCB3aGljaCBpcyBzdXBwb3J0ZWQKLSAqIGJ5IElTTy9BTlNJIEMgYW5kIEMrKy4gU29tZSBjb21waWxlcnMgc3VwcG9ydCBpdCB3aXRob3V0IHNldHRpbmcgX19TVERDX18KLSAqIG9yICBfX2NwbHVzcGx1cyBzbyB3ZSBuZWVkIHRvIGNhcmVmdWxseSBjaGVjayBmb3IgdGhlbSB0b28uCi0gKi8KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IFwKLSAgZGVmaW5lZChfX0hQX2FDQykgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQoX19MQ0NfXykgfHwgXAotICBkZWZpbmVkKF9fUE9DQ19fKSB8fCBkZWZpbmVkKF9fU0FMRk9SRENfXykgfHwgZGVmaW5lZChfX0hJR0hDX18pIHx8IFwKLSAgZGVmaW5lZChfX0lMRUM0MDBfXykKLSAgLyogVGhpcyBjb21waWxlciBpcyBiZWxpZXZlZCB0byBoYXZlIGFuIElTTyBjb21wYXRpYmxlIHByZXByb2Nlc3NvciAqLwotI2RlZmluZSBDVVJMX0lTT0NQUAotI2Vsc2UKLSAgLyogVGhpcyBjb21waWxlciBpcyBiZWxpZXZlZCBOT1QgdG8gaGF2ZSBhbiBJU08gY29tcGF0aWJsZSBwcmVwcm9jZXNzb3IgKi8KLSN1bmRlZiBDVVJMX0lTT0NQUAotI2VuZGlmCi0KLS8qCi0gKiBNYWNyb3MgZm9yIG1pbmltdW0td2lkdGggc2lnbmVkIGFuZCB1bnNpZ25lZCBjdXJsX29mZl90IGludGVnZXIgY29uc3RhbnRzLgotICovCi0KLSNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgKF9fQk9STEFORENfXyA9PSAweDA1NTEpCi0jICBkZWZpbmUgX19DVVJMX09GRl9UX0NfSExQUjIoeCkgeAotIyAgZGVmaW5lIF9fQ1VSTF9PRkZfVF9DX0hMUFIxKHgpIF9fQ1VSTF9PRkZfVF9DX0hMUFIyKHgpCi0jICBkZWZpbmUgQ1VSTF9PRkZfVF9DKFZhbCkgIF9fQ1VSTF9PRkZfVF9DX0hMUFIxKFZhbCkgIyMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0NVUkxfT0ZGX1RfQ19ITFBSMShDVVJMX1NVRkZJWF9DVVJMX09GRl9UKQotIyAgZGVmaW5lIENVUkxfT0ZGX1RVX0MoVmFsKSBfX0NVUkxfT0ZGX1RfQ19ITFBSMShWYWwpICMjIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19DVVJMX09GRl9UX0NfSExQUjEoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUpCi0jZWxzZQotIyAgaWZkZWYgQ1VSTF9JU09DUFAKLSMgICAgZGVmaW5lIF9fQ1VSTF9PRkZfVF9DX0hMUFIyKFZhbCxTdWZmaXgpIFZhbCAjIyBTdWZmaXgKLSMgIGVsc2UKLSMgICAgZGVmaW5lIF9fQ1VSTF9PRkZfVF9DX0hMUFIyKFZhbCxTdWZmaXgpIFZhbC8qKi9TdWZmaXgKLSMgIGVuZGlmCi0jICBkZWZpbmUgX19DVVJMX09GRl9UX0NfSExQUjEoVmFsLFN1ZmZpeCkgX19DVVJMX09GRl9UX0NfSExQUjIoVmFsLFN1ZmZpeCkKLSMgIGRlZmluZSBDVVJMX09GRl9UX0MoVmFsKSAgX19DVVJMX09GRl9UX0NfSExQUjEoVmFsLENVUkxfU1VGRklYX0NVUkxfT0ZGX1QpCi0jICBkZWZpbmUgQ1VSTF9PRkZfVFVfQyhWYWwpIF9fQ1VSTF9PRkZfVF9DX0hMUFIxKFZhbCxDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSkKLSNlbmRpZgotCi0vKgotICogR2V0IHJpZCBvZiBtYWNyb3MgcHJpdmF0ZSB0byB0aGlzIGhlYWRlciBmaWxlLgotICovCi0KLSN1bmRlZiBDdXJsY2hrc3pFUQotI3VuZGVmIEN1cmxjaGtzekdFCi0KLSNlbmRpZiAvKiBfX0NVUkxfQ1VSTFJVTEVTX0ggKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvaW5jbHVkZS9jdXJsL2N1cmx2ZXIuaCBiL1V0aWxpdGllcy9jbWN1cmwvaW5jbHVkZS9jdXJsL2N1cmx2ZXIuaAppbmRleCA2NjdiN2ViLi4xOGRjMzU2IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2luY2x1ZGUvY3VybC9jdXJsdmVyLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9pbmNsdWRlL2N1cmwvY3VybHZlci5oCkBAIC0zMCwxMyArMzAsMTMgQEAKIAogLyogVGhpcyBpcyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGxpYmN1cmwgcGFja2FnZSBmcm9tIHdoaWNoIHRoaXMgaGVhZGVyCiAgICBmaWxlIG9yaWdpbnM6ICovCi0jZGVmaW5lIExJQkNVUkxfVkVSU0lPTiAiNy41NC4xIgorI2RlZmluZSBMSUJDVVJMX1ZFUlNJT04gIjcuNTYuMCIKIAogLyogVGhlIG51bWVyaWMgdmVyc2lvbiBudW1iZXIgaXMgYWxzbyBhdmFpbGFibGUgImluIHBhcnRzIiBieSB1c2luZyB0aGVzZQogICAgZGVmaW5lczogKi8KICNkZWZpbmUgTElCQ1VSTF9WRVJTSU9OX01BSk9SIDcKLSNkZWZpbmUgTElCQ1VSTF9WRVJTSU9OX01JTk9SIDU0Ci0jZGVmaW5lIExJQkNVUkxfVkVSU0lPTl9QQVRDSCAxCisjZGVmaW5lIExJQkNVUkxfVkVSU0lPTl9NSU5PUiA1NgorI2RlZmluZSBMSUJDVVJMX1ZFUlNJT05fUEFUQ0ggMAogCiAvKiBUaGlzIGlzIHRoZSBudW1lcmljIHZlcnNpb24gb2YgdGhlIGxpYmN1cmwgdmVyc2lvbiBudW1iZXIsIG1lYW50IGZvciBlYXNpZXIKICAgIHBhcnNpbmcgYW5kIGNvbXBhcmlvbnMgYnkgcHJvZ3JhbXMuIFRoZSBMSUJDVVJMX1ZFUlNJT05fTlVNIGRlZmluZSB3aWxsCkBAIC01Nyw3ICs1Nyw3IEBACiAgICBDVVJMX1ZFUlNJT05fQklUUygpIG1hY3JvIHNpbmNlIGN1cmwncyBvd24gY29uZmlndXJlIHNjcmlwdCBncmVwcyBmb3IgaXQKICAgIGFuZCBuZWVkcyBpdCB0byBjb250YWluIHRoZSBmdWxsIG51bWJlci4KICovCi0jZGVmaW5lIExJQkNVUkxfVkVSU0lPTl9OVU0gMHgwNzM2MDEKKyNkZWZpbmUgTElCQ1VSTF9WRVJTSU9OX05VTSAweDA3MzgwMAogCiAvKgogICogVGhpcyBpcyB0aGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBmdWxsIHNvdXJjZSBwYWNrYWdlIHdhcyBjcmVhdGVkLiBUaGUKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvaW5jbHVkZS9jdXJsL211bHRpLmggYi9VdGlsaXRpZXMvY21jdXJsL2luY2x1ZGUvY3VybC9tdWx0aS5oCmluZGV4IGY5M2U1MTEuLjkxMWM5MWQgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvaW5jbHVkZS9jdXJsL211bHRpLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9pbmNsdWRlL2N1cmwvbXVsdGkuaApAQCAtNyw3ICs3LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9pbmNsdWRlL2N1cmwvc3lzdGVtLmggYi9VdGlsaXRpZXMvY21jdXJsL2luY2x1ZGUvY3VybC9zeXN0ZW0uaAppbmRleCBlZDNhNTVjLi4zOWRhZTc1IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2luY2x1ZGUvY3VybC9zeXN0ZW0uaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2luY2x1ZGUvY3VybC9zeXN0ZW0uaApAQCAtMjMsMTQgKzIzLDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBUaGlzIGhlYWRlciBpcyBzdXBwb3NlZCB0byBldmVudHVhbGx5IHJlcGxhY2UgY3VybGJ1aWxkLmguIFRoaXMgbGl0dGxlIG9uZQotICogaXMgc3RpbGwgbGVhcm5pbmcuICBEdXJpbmcgdGhlIGV4cGVyaW1lbnRhbCBwaGFzZSwgdGhpcyBoZWFkZXIgZmlsZXMKLSAqIGRlZmluZXMgc3ltYm9scyB1c2luZyB0aGUgcHJlZml4ZXMgQ1VSTFNZU18gb3IgY3VybHN5c18uIFdoZW4gd2UgZmVlbAotICogY29uZmlkZW50IGVub3VnaCwgd2UgcmVwbGFjZSBjdXJsYnVpbGQuaCB3aXRoIHRoaXMgZmlsZSBhbmQgcmVuYW1lIGFsbAotICogcHJlZml4ZXMgdG8gQ1VSTF8gYW5kIGN1cmxfLgotICovCi0KLS8qCiAgKiBUcnkgdG8ga2VlcCBvbmUgc2VjdGlvbiBwZXIgcGxhdGZvcm0sIGNvbXBpbGVyIGFuZCBhcmNoaXRlY3R1cmUsIG90aGVyd2lzZSwKICAqIGlmIGFuIGV4aXN0aW5nIHNlY3Rpb24gaXMgcmV1c2VkIGZvciBhIGRpZmZlcmVudCBvbmUgYW5kIGxhdGVyIG9uIHRoZQogICogb3JpZ2luYWwgaXMgYWRqdXN0ZWQsIHByb2JhYmx5IHRoZSBwaWdneWJhY2tpbmcgb25lIGNhbiBiZSBhZHZlcnNlbHkKQEAgLTYwLDMyMyArNTIsMjcxIEBACiAKICNpZiBkZWZpbmVkKF9fREpHUFBfXykgfHwgZGVmaW5lZChfX0dPMzJfXykKICMgIGlmIGRlZmluZWQoX19ESkdQUF9fKSAmJiAoX19ESkdQUF9fID4gMSkKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcgbG9uZwotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxsZCIKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsbHUiCi0jICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UICAgICA4Ci0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBMTAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUxMCisjICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nIGxvbmcKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsbGQiCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibGx1IgorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTEwKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMTAogIyAgZWxzZQotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZwotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImx1IgotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9PRkZfVCAgICAgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUwKKyMgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsZCIKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCiAjICBlbmRpZgotIyAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfU09DS0xFTl9UIGludAotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfU09DS0xFTl9UIDQKKyMgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQKIAogI2VsaWYgZGVmaW5lZChfX1NBTEZPUkRDX18pCi0jICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgNAotIyAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKLSMgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCi0jICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImx1IgotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDQKLSMgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCi0jICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUwKLSMgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCA0CisjICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZworIyAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsZCIKKyMgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCisjICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTAorIyAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCisjICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgaW50CiAKICNlbGlmIGRlZmluZWQoX19CT1JMQU5EQ19fKQogIyAgaWYgKF9fQk9STEFORENfXyA8IDB4NTIwKQotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZwotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImx1IgotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9PRkZfVCAgICAgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUwKKyMgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsZCIKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCiAjICBlbHNlCi0jICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9MT05HICAgICAgICAgICA0Ci0jICAgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX09GRl9UICAgICBfX2ludDY0Ci0jICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UICAgICAiSTY0ZCIKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJJNjR1IgotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9PRkZfVCAgICAgOAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVCAgICAgaTY0Ci0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICB1aTY0CisjICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBfX2ludDY0CisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAiSTY0ZCIKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJJNjR1IgorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgICAgaTY0CisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICB1aTY0CiAjICBlbmRpZgotIyAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfU09DS0xFTl9UIGludAotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfU09DS0xFTl9UIDQKKyMgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQKIAogI2VsaWYgZGVmaW5lZChfX1RVUkJPQ19fKQotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDQKLSMgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCi0jICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgotIyAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UICAgICA0Ci0jICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTAotIyAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCi0jICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgaW50Ci0jICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QgNAorIyAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKKyMgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCisjICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImx1IgorIyAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKKyMgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAorIyAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UIGludAogCiAjZWxpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKQogIyAgaWYgZGVmaW5lZChfXzM4Nl9fKQotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgX19pbnQ2NAotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgIkk2NGQiCi0jICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAiSTY0dSIKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDgKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIGk2NAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgdWk2NAorIyAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgX19pbnQ2NAorIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgIkk2NGQiCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAiSTY0dSIKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIGk2NAorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgdWk2NAogIyAgZWxzZQotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZwotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImx1IgotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9PRkZfVCAgICAgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUwKKyMgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsZCIKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCiAjICBlbmRpZgotIyAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfU09DS0xFTl9UIGludAotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfU09DS0xFTl9UIDQKKyMgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQKIAogI2VsaWYgZGVmaW5lZChfX1BPQ0NfXykKICMgIGlmIChfX1BPQ0NfXyA8IDI4MCkKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsZCIKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCisjICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAogIyAgZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgX19pbnQ2NAotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgIkk2NGQiCi0jICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAiSTY0dSIKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDgKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIGk2NAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgdWk2NAorIyAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgX19pbnQ2NAorIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgIkk2NGQiCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAiSTY0dSIKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIGk2NAorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgdWk2NAogIyAgZWxzZQotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZyBsb25nCi0jICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGxkIgotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImxsdSIKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDgKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIExMCi0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTEwKKyMgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcgbG9uZworIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxsZCIKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsbHUiCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMTAorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUxMCiAjICBlbmRpZgotIyAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfU09DS0xFTl9UIGludAotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfU09DS0xFTl9UIDQKKyMgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQKIAogI2VsaWYgZGVmaW5lZChfX0xDQ19fKQotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDQKLSMgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCi0jICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgotIyAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UICAgICA0Ci0jICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTAotIyAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCi0jICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgaW50Ci0jICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QgNAorIyAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKKyMgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCisjICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImx1IgorIyAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKKyMgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAorIyAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UIGludAogCiAjZWxpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pCiAjICBpZiBkZWZpbmVkKF9fRUFCSV9fKSAgLyogVHJlYXQgYWxsIEFSTSBjb21waWxlcnMgZXF1YWxseSAqLwotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZyBsb25nCi0jICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGxkIgotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImxsdSIKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDgKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIExMCi0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTEwKKyMgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcgbG9uZworIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxsZCIKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsbHUiCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMTAorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUxMCiAjICBlbGlmIGRlZmluZWQoX19DVzMyX18pCiAjICAgIHByYWdtYSBsb25nbG9uZyBvbgotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZyBsb25nCi0jICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGxkIgotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImxsdSIKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDgKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIExMCi0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTEwKKyMgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcgbG9uZworIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxsZCIKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsbHUiCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMTAorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUxMCiAjICBlbGlmIGRlZmluZWQoX19WQzMyX18pCi0jICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9MT05HICAgICAgICAgICA0Ci0jICAgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX09GRl9UICAgICBfX2ludDY0Ci0jICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGxkIgotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImxsdSIKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDgKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIExMCi0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTEwKKyMgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIF9faW50NjQKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsbGQiCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibGx1IgorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTEwKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMTAogIyAgZW5kaWYKLSMgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCB1bnNpZ25lZCBpbnQKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCA0CisjICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgdW5zaWduZWQgaW50CiAKICNlbGlmIGRlZmluZWQoX19NV0VSS1NfXykKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9MT05HICAgICAgICAgICA0Ci0jICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZyBsb25nCi0jICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxsZCIKLSMgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibGx1IgotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDgKLSMgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBMTAotIyAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMTAotIyAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfU09DS0xFTl9UIGludAotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfU09DS0xFTl9UIDQKKyMgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nIGxvbmcKKyMgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGxkIgorIyAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsbHUiCisjICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTEwKKyMgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTEwKKyMgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQKIAogI2VsaWYgZGVmaW5lZChfV0lOMzJfV0NFKQotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDQKLSMgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX09GRl9UICAgICBfX2ludDY0Ci0jICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgIkk2NGQiCi0jICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgIkk2NHUiCi0jICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9PRkZfVCAgICAgOAotIyAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIGk2NAotIyAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIHVpNjQKLSMgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCA0CisjICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgX19pbnQ2NAorIyAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJJNjRkIgorIyAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJJNjR1IgorIyAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIGk2NAorIyAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIHVpNjQKKyMgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQKIAogI2VsaWYgZGVmaW5lZChfX01JTkdXMzJfXykKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9MT05HICAgICAgICAgICA0Ci0jICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZyBsb25nCi0jICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgIkk2NGQiCi0jICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgIkk2NHUiCi0jICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9PRkZfVCAgICAgOAotIyAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIExMCi0jICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUxMCi0jICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9TT0NLTEVOX1Qgc29ja2xlbl90Ci0jICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QgNAotIyAgZGVmaW5lIENVUkxTWVNfUFVMTF9TWVNfVFlQRVNfSCAgICAgIDEKLSMgIGRlZmluZSBDVVJMU1lTX1BVTExfV1MyVENQSVBfSCAgICAgICAxCisjICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZyBsb25nCisjICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgIkk2NGQiCisjICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgICAgIkk2NHUiCisjICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTEwKKyMgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTEwKKyMgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBzb2NrbGVuX3QKKyMgIGRlZmluZSBDVVJMX1BVTExfU1lTX1RZUEVTX0ggICAgICAxCisjICBkZWZpbmUgQ1VSTF9QVUxMX1dTMlRDUElQX0ggICAgICAgMQogCiAjZWxpZiBkZWZpbmVkKF9fVk1TKQogIyAgaWYgZGVmaW5lZChfX1ZBWCkKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsZCIKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDQKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCisjICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAogIyAgZWxzZQotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZyBsb25nCi0jICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGxkIgotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImxsdSIKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDgKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIExMCi0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTEwKKyMgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcgbG9uZworIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxsZCIKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsbHUiCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMTAorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUxMCiAjICBlbmRpZgotIyAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfU09DS0xFTl9UIHVuc2lnbmVkIGludAotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfU09DS0xFTl9UIDQKKyMgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCB1bnNpZ25lZCBpbnQKIAogI2VsaWYgZGVmaW5lZChfX09TNDAwX18pCiAjICBpZiBkZWZpbmVkKF9fSUxFQzQwMF9fKQotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZyBsb25nCi0jICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGxkIgotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImxsdSIKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDgKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIExMCi0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTEwKLSMgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfU09DS0xFTl9UIHNvY2tsZW5fdAotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19QVUxMX1NZU19UWVBFU19IICAgICAgMQotIyAgICBkZWZpbmUgQ1VSTFNZU19QVUxMX1NZU19TT0NLRVRfSCAgICAgMQorIyAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZyBsb25nCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGxkIgorIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImxsdSIKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIExMCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTEwKKyMgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UIHNvY2tsZW5fdAorIyAgICBkZWZpbmUgQ1VSTF9QVUxMX1NZU19UWVBFU19IICAgICAgMQorIyAgICBkZWZpbmUgQ1VSTF9QVUxMX1NZU19TT0NLRVRfSCAgICAgMQogIyAgZW5kaWYKIAogI2VsaWYgZGVmaW5lZChfX01WU19fKQogIyAgaWYgZGVmaW5lZChfX0lCTUNfXykgfHwgZGVmaW5lZChfX0lCTUNQUF9fKQogIyAgICBpZiBkZWZpbmVkKF9JTFAzMikKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgNAogIyAgICBlbGlmIGRlZmluZWQoX0xQNjQpCi0jICAgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDgKICMgICAgZW5kaWYKICMgICAgaWYgZGVmaW5lZChfTE9OR19MT05HKQotIyAgICAgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nIGxvbmcKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxsZCIKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImxsdSIKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9PRkZfVCAgICAgOAotIyAgICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBMTAotIyAgICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTEwKKyMgICAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZyBsb25nCisjICAgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsbGQiCisjICAgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsbHUiCisjICAgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIExMCisjICAgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMTAogIyAgICBlbGlmIGRlZmluZWQoX0xQNjQpCi0jICAgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgotIyAgICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCi0jICAgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDgKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTAotIyAgICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAorIyAgICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCisjICAgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsZCIKKyMgICAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImx1IgorIyAgICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCisjICAgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCiAjICAgIGVsc2UKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZwotIyAgICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCi0jICAgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9PRkZfVCAgICAgNAotIyAgICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCi0jICAgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCisjICAgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKKyMgICAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgorIyAgICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCisjICAgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKKyMgICAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUwKICMgICAgZW5kaWYKLSMgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfU09DS0xFTl9UIHNvY2tsZW5fdAotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19QVUxMX1NZU19UWVBFU19IICAgICAgMQotIyAgICBkZWZpbmUgQ1VSTFNZU19QVUxMX1NZU19TT0NLRVRfSCAgICAgMQorIyAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1Qgc29ja2xlbl90CisjICAgIGRlZmluZSBDVVJMX1BVTExfU1lTX1RZUEVTX0ggICAgICAxCisjICAgIGRlZmluZSBDVVJMX1BVTExfU1lTX1NPQ0tFVF9IICAgICAxCiAjICBlbmRpZgogCiAjZWxpZiBkZWZpbmVkKF9fMzcwX18pCiAjICBpZiBkZWZpbmVkKF9fSUJNQ19fKSB8fCBkZWZpbmVkKF9fSUJNQ1BQX18pCiAjICAgIGlmIGRlZmluZWQoX0lMUDMyKQotIyAgICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9MT05HICAgICAgICAgICA0CiAjICAgIGVsaWYgZGVmaW5lZChfTFA2NCkKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgOAogIyAgICBlbmRpZgogIyAgICBpZiBkZWZpbmVkKF9MT05HX0xPTkcpCi0jICAgICAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcgbG9uZwotIyAgICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGxkIgotIyAgICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibGx1IgotIyAgICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UICAgICA4Ci0jICAgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIExMCi0jICAgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMTAorIyAgICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nIGxvbmcKKyMgICAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxsZCIKKyMgICAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImxsdSIKKyMgICAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTEwKKyMgICAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUxMCiAjICAgIGVsaWYgZGVmaW5lZChfTFA2NCkKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZwotIyAgICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCi0jICAgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9PRkZfVCAgICAgOAotIyAgICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCi0jICAgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCisjICAgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKKyMgICAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgorIyAgICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCisjICAgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKKyMgICAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUwKICMgICAgZWxzZQotIyAgICAgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCi0jICAgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsZCIKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImx1IgotIyAgICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UICAgICA0Ci0jICAgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKLSMgICAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUwKKyMgICAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZworIyAgICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCisjICAgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKKyMgICAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTAorIyAgICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAogIyAgICBlbmRpZgotIyAgICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9TT0NLTEVOX1Qgc29ja2xlbl90Ci0jICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCA0Ci0jICAgIGRlZmluZSBDVVJMU1lTX1BVTExfU1lTX1RZUEVTX0ggICAgICAxCi0jICAgIGRlZmluZSBDVVJMU1lTX1BVTExfU1lTX1NPQ0tFVF9IICAgICAxCisjICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBzb2NrbGVuX3QKKyMgICAgZGVmaW5lIENVUkxfUFVMTF9TWVNfVFlQRVNfSCAgICAgIDEKKyMgICAgZGVmaW5lIENVUkxfUFVMTF9TWVNfU09DS0VUX0ggICAgIDEKICMgIGVuZGlmCiAKICNlbGlmIGRlZmluZWQoVFBGKQotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDgKLSMgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCi0jICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgotIyAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UICAgICA4Ci0jICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTAotIyAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCi0jICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgaW50Ci0jICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QgNAorIyAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKKyMgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCisjICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImx1IgorIyAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKKyMgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAorIyAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UIGludAogCiAjZWxpZiBkZWZpbmVkKF9fVElOWUNfXykgLyogYWxzbyBrbm93biBhcyB0Y2MgKi8KIAotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0xPTkcgICAgICAgICAgIDQKLSMgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nIGxvbmcKLSMgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGxkIgotIyAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsbHUiCi0jICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9PRkZfVCAgICAgOAotIyAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIExMCi0jICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUxMCi0jICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9TT0NLTEVOX1Qgc29ja2xlbl90Ci0jICBkZWZpbmUgQ1VSTFNZU19QVUxMX1NZU19UWVBFU19IICAgICAgMQotIyAgZGVmaW5lIENVUkxTWVNfUFVMTF9TWVNfU09DS0VUX0ggICAgIDEKKyMgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nIGxvbmcKKyMgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGxkIgorIyAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsbHUiCisjICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTEwKKyMgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTEwKKyMgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBzb2NrbGVuX3QKKyMgIGRlZmluZSBDVVJMX1BVTExfU1lTX1RZUEVTX0ggICAgICAxCisjICBkZWZpbmUgQ1VSTF9QVUxMX1NZU19TT0NLRVRfSCAgICAgMQorCisjZWxpZiBkZWZpbmVkKF9fU1VOUFJPX0MpIC8qIE9yYWNsZSBTb2xhcmlzIFN0dWRpbyAqLworIyAgaWYgIWRlZmluZWQoX19MUDY0KSAmJiAoZGVmaW5lZChfX0lMUDMyKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX19zcGFyY3Y4KSkKKyMgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcgbG9uZworIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxsZCIKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsbHUiCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMTAorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUxMCisjICBlbGlmIGRlZmluZWQoX19MUDY0KSB8fCBcCisgICAgICAgIGRlZmluZWQoX19hbWQ2NCkgfHwgZGVmaW5lZChfX3NwYXJjdjkpCisjICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAorIyAgZW5kaWYKKyMgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBzb2NrbGVuX3QKKyMgIGRlZmluZSBDVVJMX1BVTExfU1lTX1RZUEVTX0ggICAgICAxCisjICBkZWZpbmUgQ1VSTF9QVUxMX1NZU19TT0NLRVRfSCAgICAgMQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICBLRUVQIE1TVkMgVEhFIFBFTlVMVElNQVRFIEVOVFJZICAgICovCkBAIC0zODQsMTAxICszMjQsMTQ4IEBACiAKICNlbGlmIGRlZmluZWQoX01TQ19WRVIpCiAjICBpZiAoX01TQ19WRVIgPj0gOTAwKSAmJiAoX0lOVEVHUkFMX01BWF9CSVRTID49IDY0KQotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgX19pbnQ2NAotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgIkk2NGQiCi0jICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAiSTY0dSIKLSMgICAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfT0ZGX1QgICAgIDgKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIGk2NAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgdWk2NAorIyAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgX19pbnQ2NAorIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgICAgIkk2NGQiCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAiSTY0dSIKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIGk2NAorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgICAgdWk2NAogIyAgZWxzZQotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyAgICAgICAgICAgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVCAgICAgbG9uZwotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVCAgICAgImxkIgotIyAgICBkZWZpbmUgQ1VSTFNZU19GT1JNQVRfQ1VSTF9PRkZfVFUgICAgImx1IgotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9PRkZfVCAgICAgNAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVFUgICAgVUwKKyMgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsZCIKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCiAjICBlbmRpZgotIyAgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfU09DS0xFTl9UIGludAotIyAgZGVmaW5lIENVUkxTWVNfU0laRU9GX0NVUkxfU09DS0xFTl9UIDQKKyMgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgS0VFUCBHRU5FUklDIEdDQyBUSEUgTEFTVCBFTlRSWSAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCiAjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQotIyAgaWYgIWRlZmluZWQoX19MUDY0X18pICYmIChkZWZpbmVkKF9fSUxQMzJfXykgfHwgXAotICAgICAgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3BwY19fKSB8fCBkZWZpbmVkKF9fYXJtX18pIHx8IFwKLSAgICAgIGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9fbWlwc19fKSB8fCBkZWZpbmVkKF9fc2hfXykpCi0jICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9MT05HICAgICAgICAgICA0Ci0jICAgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nIGxvbmcKLSMgICAgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsbGQiCi0jICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibGx1IgotIyAgICBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfQ1VSTF9PRkZfVCAgICAgOAotIyAgICBkZWZpbmUgQ1VSTFNZU19TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTEwKLSMgICAgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMTAorIyAgaWYgIWRlZmluZWQoX19MUDY0X18pICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoZGVmaW5lZChfX0lMUDMyX18pIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19ocHBhX18pIHx8ICAgICAgXAorICAgZGVmaW5lZChfX3BwY19fKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9fYXJtX18pIHx8ICAgICAgXAorICAgZGVmaW5lZChfX3NwYXJjX18pIHx8IGRlZmluZWQoX19taXBzX18pIHx8IGRlZmluZWQoX19zaF9fKSB8fCAgICAgICAgXAorICAgZGVmaW5lZChfX1hURU5TQV9fKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKGRlZmluZWQoX19TSVpFT0ZfTE9OR19fKSAmJiBfX1NJWkVPRl9MT05HX18gPT0gNCkpCisjICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nIGxvbmcKKyMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsbGQiCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibGx1IgorIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgICAgTEwKKyMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMTAogIyAgZWxpZiBkZWZpbmVkKF9fTFA2NF9fKSB8fCBcCi0gICAgICAgIGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfX3BwYzY0X18pIHx8IGRlZmluZWQoX19zcGFyYzY0X18pCi0jICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9MT05HICAgICAgICAgICA4Ci0jICAgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCi0jICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCi0jICAgIGRlZmluZSBDVVJMU1lTX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCi0jICAgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UICAgICA4Ci0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCi0jICAgIGRlZmluZSBDVVJMU1lTX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAorICAgICAgICBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19wcGM2NF9fKSB8fCBkZWZpbmVkKF9fc3BhcmM2NF9fKSB8fCBcCisgICAgICAgIChkZWZpbmVkKF9fU0laRU9GX0xPTkdfXykgJiYgX19TSVpFT0ZfTE9OR19fID09IDgpCisjICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICAgICBsb25nCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAgICAibGQiCisjICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAgICAibHUiCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICAgICBMCisjICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSAgICBVTAogIyAgZW5kaWYKLSMgIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBzb2NrbGVuX3QKLSMgIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCA0Ci0jICBkZWZpbmUgQ1VSTFNZU19QVUxMX1NZU19UWVBFU19IICAgICAgMQotIyAgZGVmaW5lIENVUkxTWVNfUFVMTF9TWVNfU09DS0VUX0ggICAgIDEKKyMgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBzb2NrbGVuX3QKKyMgIGRlZmluZSBDVVJMX1BVTExfU1lTX1RZUEVTX0ggICAgICAxCisjICBkZWZpbmUgQ1VSTF9QVUxMX1NZU19TT0NLRVRfSCAgICAgMQogCiAjZWxzZQogLyogZ2VuZXJpYyAic2FmZSBndWVzcyIgb24gb2xkIDMyIGJpdCBzdHlsZSAqLwotIyBkZWZpbmUgQ1VSTFNZU19TSVpFT0ZfTE9ORyA0Ci0jIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCA0Ci0jIGRlZmluZSBDVVJMU1lTX1NJWkVPRl9DVVJMX09GRl9UIDQKLSMgZGVmaW5lIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKLSMgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsZCIKLSMgZGVmaW5lIENVUkxTWVNfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKLSMgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKLSMgZGVmaW5lIENVUkxTWVNfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCi0jIGRlZmluZSBDVVJMU1lTX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQKKyMgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgICAgIGxvbmcKKyMgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICAgICJsZCIKKyMgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICAgICJsdSIKKyMgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgICAgIEwKKyMgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVICAgIFVMCisjIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQKICNlbmRpZgogCi0vKiBDVVJMU1lTX1BVTExfV1MyVENQSVBfSCBpcyBkZWZpbmVkIGFib3ZlIHdoZW4gaW5jbHVzaW9uIG9mIGhlYWRlciBmaWxlICAqLworI2lmZGVmIF9BSVgKKy8qIEFJWCBuZWVkcyA8c3lzL3BvbGwuaD4gKi8KKyNkZWZpbmUgQ1VSTF9QVUxMX1NZU19QT0xMX0gKKyNlbmRpZgorCisKKy8qIENVUkxfUFVMTF9XUzJUQ1BJUF9IIGlzIGRlZmluZWQgYWJvdmUgd2hlbiBpbmNsdXNpb24gb2YgaGVhZGVyIGZpbGUgICovCiAvKiB3czJ0Y3BpcC5oIGlzIHJlcXVpcmVkIGhlcmUgdG8gcHJvcGVybHkgbWFrZSB0eXBlIGRlZmluaXRpb25zIGJlbG93LiAqLwotI2lmZGVmIENVUkxTWVNfUFVMTF9XUzJUQ1BJUF9ICi0jICBpZm5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgotIyAgICBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotIyAgZW5kaWYKLSMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNpZmRlZiBDVVJMX1BVTExfV1MyVENQSVBfSAogIyAgaW5jbHVkZSA8d2luc29jazIuaD4KKyMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KICMgIGluY2x1ZGUgPHdzMnRjcGlwLmg+CiAjZW5kaWYKIAotLyogQ1VSTFNZU19QVUxMX1NZU19UWVBFU19IIGlzIGRlZmluZWQgYWJvdmUgd2hlbiBpbmNsdXNpb24gb2YgaGVhZGVyIGZpbGUgICovCisvKiBDVVJMX1BVTExfU1lTX1RZUEVTX0ggaXMgZGVmaW5lZCBhYm92ZSB3aGVuIGluY2x1c2lvbiBvZiBoZWFkZXIgZmlsZSAgKi8KIC8qIHN5cy90eXBlcy5oIGlzIHJlcXVpcmVkIGhlcmUgdG8gcHJvcGVybHkgbWFrZSB0eXBlIGRlZmluaXRpb25zIGJlbG93LiAqLwotI2lmZGVmIENVUkxTWVNfUFVMTF9TWVNfVFlQRVNfSAorI2lmZGVmIENVUkxfUFVMTF9TWVNfVFlQRVNfSAogIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjZW5kaWYKIAotLyogQ1VSTFNZU19QVUxMX1NZU19TT0NLRVRfSCBpcyBkZWZpbmVkIGFib3ZlIHdoZW4gaW5jbHVzaW9uIG9mIGhlYWRlciBmaWxlICAqLworLyogQ1VSTF9QVUxMX1NZU19TT0NLRVRfSCBpcyBkZWZpbmVkIGFib3ZlIHdoZW4gaW5jbHVzaW9uIG9mIGhlYWRlciBmaWxlICAqLwogLyogc3lzL3NvY2tldC5oIGlzIHJlcXVpcmVkIGhlcmUgdG8gcHJvcGVybHkgbWFrZSB0eXBlIGRlZmluaXRpb25zIGJlbG93LiAqLwotI2lmZGVmIENVUkxTWVNfUFVMTF9TWVNfU09DS0VUX0gKKyNpZmRlZiBDVVJMX1BVTExfU1lTX1NPQ0tFVF9ICiAjICBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAjZW5kaWYKIAorLyogQ1VSTF9QVUxMX1NZU19QT0xMX0ggaXMgZGVmaW5lZCBhYm92ZSB3aGVuIGluY2x1c2lvbiBvZiBoZWFkZXIgZmlsZSAgICAqLworLyogc3lzL3BvbGwuaCBpcyByZXF1aXJlZCBoZXJlIHRvIHByb3Blcmx5IG1ha2UgdHlwZSBkZWZpbml0aW9ucyBiZWxvdy4gICAqLworI2lmZGVmIENVUkxfUFVMTF9TWVNfUE9MTF9ICisjICBpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2VuZGlmCisKIC8qIERhdGEgdHlwZSBkZWZpbml0aW9uIG9mIGN1cmxfc29ja2xlbl90LiAqLwotI2lmZGVmIENVUkxTWVNfVFlQRU9GX0NVUkxfU09DS0xFTl9UCi0gIHR5cGVkZWYgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgY3VybHN5c19zb2NrbGVuX3Q7CisjaWZkZWYgQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QKKyAgdHlwZWRlZiBDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBjdXJsX3NvY2tsZW5fdDsKICNlbmRpZgogCiAvKiBEYXRhIHR5cGUgZGVmaW5pdGlvbiBvZiBjdXJsX29mZl90LiAqLwogCi0jaWZkZWYgQ1VSTFNZU19UWVBFT0ZfQ1VSTF9PRkZfVAotICB0eXBlZGVmIENVUkxTWVNfVFlQRU9GX0NVUkxfT0ZGX1QgY3VybHN5c19vZmZfdDsKKyNpZmRlZiBDVVJMX1RZUEVPRl9DVVJMX09GRl9UCisgIHR5cGVkZWYgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCBjdXJsX29mZl90OworI2VuZGlmCisKKy8qCisgKiBDVVJMX0lTT0NQUCBhbmQgQ1VSTF9PRkZfVF9DIGRlZmluaXRpb25zIGFyZSBkb25lIGhlcmUgaW4gb3JkZXIgdG8gYWxsb3cKKyAqIHRoZXNlIHRvIGJlIHZpc2libGUgYW5kIGV4cG9ydGVkIGJ5IHRoZSBleHRlcm5hbCBsaWJjdXJsIGludGVyZmFjZSBBUEksCisgKiB3aGlsZSBhbHNvIG1ha2luZyB0aGVtIHZpc2libGUgdG8gdGhlIGxpYnJhcnkgaW50ZXJuYWxzLCBzaW1wbHkgaW5jbHVkaW5nCisgKiBjdXJsX3NldHVwLmgsIHdpdGhvdXQgYWN0dWFsbHkgbmVlZGluZyB0byBpbmNsdWRlIGN1cmwuaCBpbnRlcm5hbGx5LgorICogSWYgc29tZSBkYXkgdGhpcyBzZWN0aW9uIHdvdWxkIGdyb3cgYmlnIGVub3VnaCwgYWxsIHRoaXMgc2hvdWxkIGJlIG1vdmVkCisgKiB0byBpdHMgb3duIGhlYWRlciBmaWxlLgorICovCisKKy8qCisgKiBGaWd1cmUgb3V0IGlmIHdlIGNhbiB1c2UgdGhlICMjIHByZXByb2Nlc3NvciBvcGVyYXRvciwgd2hpY2ggaXMgc3VwcG9ydGVkCisgKiBieSBJU08vQU5TSSBDIGFuZCBDKysuIFNvbWUgY29tcGlsZXJzIHN1cHBvcnQgaXQgd2l0aG91dCBzZXR0aW5nIF9fU1REQ19fCisgKiBvciAgX19jcGx1c3BsdXMgc28gd2UgbmVlZCB0byBjYXJlZnVsbHkgY2hlY2sgZm9yIHRoZW0gdG9vLgorICovCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBcCisgIGRlZmluZWQoX19IUF9hQ0MpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkKF9fTENDX18pIHx8IFwKKyAgZGVmaW5lZChfX1BPQ0NfXykgfHwgZGVmaW5lZChfX1NBTEZPUkRDX18pIHx8IGRlZmluZWQoX19ISUdIQ19fKSB8fCBcCisgIGRlZmluZWQoX19JTEVDNDAwX18pCisgIC8qIFRoaXMgY29tcGlsZXIgaXMgYmVsaWV2ZWQgdG8gaGF2ZSBhbiBJU08gY29tcGF0aWJsZSBwcmVwcm9jZXNzb3IgKi8KKyNkZWZpbmUgQ1VSTF9JU09DUFAKKyNlbHNlCisgIC8qIFRoaXMgY29tcGlsZXIgaXMgYmVsaWV2ZWQgTk9UIHRvIGhhdmUgYW4gSVNPIGNvbXBhdGlibGUgcHJlcHJvY2Vzc29yICovCisjdW5kZWYgQ1VSTF9JU09DUFAKKyNlbmRpZgorCisvKgorICogTWFjcm9zIGZvciBtaW5pbXVtLXdpZHRoIHNpZ25lZCBhbmQgdW5zaWduZWQgY3VybF9vZmZfdCBpbnRlZ2VyIGNvbnN0YW50cy4KKyAqLworCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIChfX0JPUkxBTkRDX18gPT0gMHgwNTUxKQorIyAgZGVmaW5lIF9fQ1VSTF9PRkZfVF9DX0hMUFIyKHgpIHgKKyMgIGRlZmluZSBfX0NVUkxfT0ZGX1RfQ19ITFBSMSh4KSBfX0NVUkxfT0ZGX1RfQ19ITFBSMih4KQorIyAgZGVmaW5lIENVUkxfT0ZGX1RfQyhWYWwpICBfX0NVUkxfT0ZGX1RfQ19ITFBSMShWYWwpICMjIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19DVVJMX09GRl9UX0NfSExQUjEoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCkKKyMgIGRlZmluZSBDVVJMX09GRl9UVV9DKFZhbCkgX19DVVJMX09GRl9UX0NfSExQUjEoVmFsKSAjIyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQ1VSTF9PRkZfVF9DX0hMUFIxKENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVKQorI2Vsc2UKKyMgIGlmZGVmIENVUkxfSVNPQ1BQCisjICAgIGRlZmluZSBfX0NVUkxfT0ZGX1RfQ19ITFBSMihWYWwsU3VmZml4KSBWYWwgIyMgU3VmZml4CisjICBlbHNlCisjICAgIGRlZmluZSBfX0NVUkxfT0ZGX1RfQ19ITFBSMihWYWwsU3VmZml4KSBWYWwvKiovU3VmZml4CisjICBlbmRpZgorIyAgZGVmaW5lIF9fQ1VSTF9PRkZfVF9DX0hMUFIxKFZhbCxTdWZmaXgpIF9fQ1VSTF9PRkZfVF9DX0hMUFIyKFZhbCxTdWZmaXgpCisjICBkZWZpbmUgQ1VSTF9PRkZfVF9DKFZhbCkgIF9fQ1VSTF9PRkZfVF9DX0hMUFIxKFZhbCxDVVJMX1NVRkZJWF9DVVJMX09GRl9UKQorIyAgZGVmaW5lIENVUkxfT0ZGX1RVX0MoVmFsKSBfX0NVUkxfT0ZGX1RfQ19ITFBSMShWYWwsQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUpCiAjZW5kaWYKIAogI2VuZGlmIC8qIF9fQ1VSTF9TWVNURU1fSCAqLwotCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2luY2x1ZGUvY3VybC90eXBlY2hlY2stZ2NjLmggYi9VdGlsaXRpZXMvY21jdXJsL2luY2x1ZGUvY3VybC90eXBlY2hlY2stZ2NjLmgKaW5kZXggMTBiNWRlMi4uMTBjNzRjNyAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9pbmNsdWRlL2N1cmwvdHlwZWNoZWNrLWdjYy5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvaW5jbHVkZS9jdXJsL3R5cGVjaGVjay1nY2MuaApAQCAtOTYsNiArOTYsOSBAQAogICAgIGlmKChfY3VybF9vcHQpID09IENVUkxPUFRfSFRUUFBPU1QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgaWYoIV9jdXJsX2lzX2FycigodmFsdWUpLCBzdHJ1Y3QgY3VybF9odHRwcG9zdCkpICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBfY3VybF9lYXN5X3NldG9wdF9lcnJfY3VybF9odHRwb3N0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKChfY3VybF9vcHQpID09IENVUkxPUFRfTUlNRVBPU1QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYoIV9jdXJsX2lzX3B0cigodmFsdWUpLCBjdXJsX21pbWUpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfY3VybF9lYXN5X3NldG9wdF9lcnJfY3VybF9taW1lcG9zdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGlmKF9jdXJsX2lzX3NsaXN0X29wdGlvbihfY3VybF9vcHQpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgaWYoIV9jdXJsX2lzX2FycigodmFsdWUpLCBzdHJ1Y3QgY3VybF9zbGlzdCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBfY3VybF9lYXN5X3NldG9wdF9lcnJfY3VybF9zbGlzdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTEwLDcgKzExMyw3IEBACiAvKiBGSVhNRTogZG9uJ3QgYWxsb3cgY29uc3QgcG9pbnRlcnMgKi8KICNkZWZpbmUgY3VybF9lYXN5X2dldGluZm8oaGFuZGxlLCBpbmZvLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgX190eXBlb2ZfXyhpbmZvKSBfY3VybF9pbmZvID0gaW5mbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX3R5cGVvZl9fKGluZm8pIF9jdXJsX2luZm8gPSBpbmZvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBpZihfX2J1aWx0aW5fY29uc3RhbnRfcChfY3VybF9pbmZvKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGlmKF9jdXJsX2lzX3N0cmluZ19pbmZvKF9jdXJsX2luZm8pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgaWYoIV9jdXJsX2lzX2FycigoYXJnKSwgY2hhciAqKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTMwLDkgKzEzMywxMiBAQAogICAgIGlmKF9jdXJsX2lzX2NlcnRpbmZvX2luZm8oX2N1cmxfaW5mbykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgaWYoIV9jdXJsX2lzX2FycigoYXJnKSwgc3RydWN0IGN1cmxfY2VydGluZm8gKikpICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBfY3VybF9lYXN5X2dldGluZm9fZXJyX2N1cmxfY2VydGluZm8oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgaWYoX2N1cmxfaXNfc29ja2V0X2luZm8oX2N1cmxfaW5mbykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKF9jdXJsX2lzX3NvY2tldF9pbmZvKF9jdXJsX2luZm8pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgaWYoIV9jdXJsX2lzX2FycigoYXJnKSwgY3VybF9zb2NrZXRfdCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBfY3VybF9lYXN5X2dldGluZm9fZXJyX2N1cmxfc29ja2V0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKF9jdXJsX2lzX29mZl90X2luZm8oX2N1cmxfaW5mbykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYoIV9jdXJsX2lzX2FycigoYXJnKSwgY3VybF9vZmZfdCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfY3VybF9lYXN5X2dldGluZm9fZXJyX2N1cmxfb2ZmX3QoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBjdXJsX2Vhc3lfZ2V0aW5mbyhoYW5kbGUsIF9jdXJsX2luZm8sIGFyZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfSkKQEAgLTE5Nyw2ICsyMDMsOSBAQAogX0NVUkxfV0FSTklORyhfY3VybF9lYXN5X3NldG9wdF9lcnJfY3VybF9odHRwb3N0LAogICAgICAgICAgICAgICAiY3VybF9lYXN5X3NldG9wdCBleHBlY3RzIGEgJ3N0cnVjdCBjdXJsX2h0dHBwb3N0IConICIKICAgICAgICAgICAgICAgImFyZ3VtZW50IGZvciB0aGlzIG9wdGlvbiIpCitfQ1VSTF9XQVJOSU5HKF9jdXJsX2Vhc3lfc2V0b3B0X2Vycl9jdXJsX21pbWVwb3N0LAorICAgICAgICAgICAgICAiY3VybF9lYXN5X3NldG9wdCBleHBlY3RzIGEgJ2N1cmxfbWltZSAqJyAiCisgICAgICAgICAgICAgICJhcmd1bWVudCBmb3IgdGhpcyBvcHRpb24iKQogX0NVUkxfV0FSTklORyhfY3VybF9lYXN5X3NldG9wdF9lcnJfY3VybF9zbGlzdCwKICAgImN1cmxfZWFzeV9zZXRvcHQgZXhwZWN0cyBhICdzdHJ1Y3QgY3VybF9zbGlzdCAqJyBhcmd1bWVudCBmb3IgdGhpcyBvcHRpb24iKQogX0NVUkxfV0FSTklORyhfY3VybF9lYXN5X3NldG9wdF9lcnJfQ1VSTFNILApAQCAtMjE4LDYgKzIyNyw4IEBACiAgICAgICAgICAgICAgICInc3RydWN0IGN1cmxfY2VydGluZm8gKicgZm9yIHRoaXMgaW5mbyIpCiBfQ1VSTF9XQVJOSU5HKF9jdXJsX2Vhc3lfZ2V0aW5mb19lcnJfY3VybF9zb2NrZXQsCiAgICJjdXJsX2Vhc3lfZ2V0aW5mbyBleHBlY3RzIGEgcG9pbnRlciB0byBjdXJsX3NvY2tldF90IGZvciB0aGlzIGluZm8iKQorX0NVUkxfV0FSTklORyhfY3VybF9lYXN5X2dldGluZm9fZXJyX2N1cmxfb2ZmX3QsCisgICJjdXJsX2Vhc3lfZ2V0aW5mbyBleHBlY3RzIGEgcG9pbnRlciB0byBjdXJsX29mZl90IGZvciB0aGlzIGluZm8iKQogCiAvKiBncm91cHMgb2YgY3VybF9lYXN5X3NldG9wcyBvcHRpb25zIHRoYXQgdGFrZSB0aGUgc2FtZSB0eXBlIG9mIGFyZ3VtZW50ICovCiAKQEAgLTM5MSw3ICs0MDIsMTEgQEAKIAogLyogdHJ1ZSBpZiBpbmZvIGV4cGVjdHMgYSBwb2ludGVyIHRvIHN0cnVjdCBjdXJsX3NvY2tldF90IGFyZ3VtZW50ICovCiAjZGVmaW5lIF9jdXJsX2lzX3NvY2tldF9pbmZvKGluZm8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIChDVVJMSU5GT19TT0NLRVQgPCAoaW5mbykpCisgIChDVVJMSU5GT19TT0NLRVQgPCAoaW5mbykgJiYgKGluZm8pIDwgQ1VSTElORk9fT0ZGX1QpCisKKy8qIHRydWUgaWYgaW5mbyBleHBlY3RzIGEgcG9pbnRlciB0byBjdXJsX29mZl90IGFyZ3VtZW50ICovCisjZGVmaW5lIF9jdXJsX2lzX29mZl90X2luZm8oaW5mbykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChDVVJMSU5GT19PRkZfVCA8IChpbmZvKSkKIAogCiAvKiB0eXBlY2hlY2sgaGVscGVycyAtLSBjaGVjayB3aGV0aGVyIGdpdmVuIGV4cHJlc3Npb24gaGFzIHJlcXVlc3RlZCB0eXBlKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL0NNYWtlTGlzdHMudHh0IGIvVXRpbGl0aWVzL2NtY3VybC9saWIvQ01ha2VMaXN0cy50eHQKaW5kZXggNzZkZDZjNi4uZjNkOTA4NCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvQ01ha2VMaXN0cy50eHQKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvQ01ha2VMaXN0cy50eHQKQEAgLTEsNyArMSw1IEBACiBzZXQoTElCX05BTUUgY21jdXJsKQogCi1jb25maWd1cmVfZmlsZSgke0NVUkxfU09VUkNFX0RJUn0vaW5jbHVkZS9jdXJsL2N1cmxidWlsZC5oLmNtYWtlCi0gICR7Q1VSTF9CSU5BUllfRElSfS9pbmNsdWRlL2N1cmwvY3VybGJ1aWxkLmgpCiBjb25maWd1cmVfZmlsZShjdXJsX2NvbmZpZy5oLmNtYWtlCiAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9jdXJsX2NvbmZpZy5oKQogCkBAIC0xMCwxMSArOCwxMSBAQAogCiBsaXN0KEFQUEVORCBISEVBREVSUwogICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vY3VybF9jb25maWcuaAotICAke0NVUkxfQklOQVJZX0RJUn0vaW5jbHVkZS9jdXJsL2N1cmxidWlsZC5oCiAgICkKIAogaWYoTVNWQyBBTkQgTk9UIENVUkxfU1RBVElDTElCKQogICBsaXN0KEFQUEVORCBDU09VUkNFUyBsaWJjdXJsLnJjKQorICBzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAvd2Q0MTI3IikKIGVuZGlmKCkKIAogIyBTRVQoQ1NPVVJDRVMKQEAgLTEyNCw2ICsxMjIsMTMgQEAKICAgaWYoTk9UIENVUkxfU1RBVElDTElCKQogICAgICMgQWRkICJfaW1wIiBhcyBhIHN1ZmZpeCBiZWZvcmUgdGhlIGV4dGVuc2lvbiB0byBhdm9pZCBjb25mbGljdGluZyB3aXRoIHRoZSBzdGF0aWNhbGx5IGxpbmtlZCAibGliY3VybC5saWIiCiAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7TElCX05BTUV9IFBST1BFUlRJRVMgSU1QT1JUX1NVRkZJWCAiX2ltcC5saWIiKQorCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzICgke0xJQl9OQU1FfSBQUk9QRVJUSUVTCisgICAgICAgREVCVUdfUE9TVEZJWCAiLWQiCisgICAgICAgIyBOb3RlOiBubyBwb3N0Zml4IGZvciByZWxlYXNlIHZhcmlhbnRzLCBsZXQgdXNlciBjaG9vc2Ugd2hhdCBzdHlsZSBvZiByZWxlYXNlIGhlIHdhbnRzCisgICAgICAgIyBNSU5TSVpFUkVMX1BPU1RGSVggIi16IgorICAgICAgICMgUkVMV0lUSERFQklORk9fUE9TVEZJWCAiLWciCisgICAgICAgKQogICBlbmRpZigpCiBlbmRpZigpCiAKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL01ha2VmaWxlLmluYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL01ha2VmaWxlLmluYwppbmRleCAxOWY1ODAwLi41YzBiOTMwIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9NYWtlZmlsZS5pbmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvTWFrZWZpbGUuaW5jCkBAIC01Myw3ICs1Myw4IEBACiAgIGh0dHBfcHJveHkuYyBub24tYXNjaWkuYyBhc3luLWFyZXMuYyBhc3luLXRocmVhZC5jIGN1cmxfZ3NzYXBpLmMgICAgICBcCiAgIGh0dHBfbnRsbS5jIGN1cmxfbnRsbV93Yi5jIGN1cmxfbnRsbV9jb3JlLmMgY3VybF9zYXNsLmMgcmFuZC5jICAgICAgICBcCiAgIGN1cmxfbXVsdGlieXRlLmMgaG9zdGNoZWNrLmMgY29ubmNhY2hlLmMgcGlwZWxpbmUuYyBkb3Rkb3QuYyAgICAgICAgICBcCi0gIHg1MDlhc24xLmMgaHR0cDIuYyBzbWIuYyBjdXJsX2VuZGlhbi5jIGN1cmxfZGVzLmMgc3lzdGVtX3dpbjMyLmMKKyAgeDUwOWFzbjEuYyBodHRwMi5jIHNtYi5jIGN1cmxfZW5kaWFuLmMgY3VybF9kZXMuYyBzeXN0ZW1fd2luMzIuYyAgICAgIFwKKyAgbWltZS5jCiAKIExJQl9IRklMRVMgPSBhcnBhX3RlbG5ldC5oIG5ldHJjLmggZmlsZS5oIHRpbWV2YWwuaCBob3N0aXAuaCBwcm9ncmVzcy5oIFwKICAgZm9ybWRhdGEuaCBjb29raWUuaCBodHRwLmggc2VuZGYuaCBmdHAuaCB1cmwuaCBkaWN0LmggaWYyaXAuaCAgICAgICAgIFwKQEAgLTcyLDcgKzczLDcgQEAKICAgY3VybF9zYXNsLmggY3VybF9tdWx0aWJ5dGUuaCBob3N0Y2hlY2suaCBjb25uY2FjaGUuaCAgICAgICAgICAgICAgICAgIFwKICAgY3VybF9zZXR1cF9vbmNlLmggbXVsdGloYW5kbGUuaCBzZXR1cC12bXMuaCBwaXBlbGluZS5oIGRvdGRvdC5oICAgICAgIFwKICAgeDUwOWFzbjEuaCBodHRwMi5oIHNpZ3BpcGUuaCBzbWIuaCBjdXJsX2VuZGlhbi5oIGN1cmxfZGVzLmggICAgICAgICAgIFwKLSAgY3VybF9wcmludGYuaCBzeXN0ZW1fd2luMzIuaCByYW5kLmgKKyAgY3VybF9wcmludGYuaCBzeXN0ZW1fd2luMzIuaCByYW5kLmggbWltZS5oCiAKIExJQl9SQ0ZJTEVTID0gbGliY3VybC5yYwogCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9hc3luLWFyZXMuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2FzeW4tYXJlcy5jCmluZGV4IDExYTkxNGYuLjg3ZTcwYjQgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2FzeW4tYXJlcy5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2FzeW4tYXJlcy5jCkBAIC0yNjAsNyArMjYwLDcgQEAKICAgYml0bWFzayA9IGFyZXNfZ2V0c29jaygoYXJlc19jaGFubmVsKWRhdGEtPnN0YXRlLnJlc29sdmVyLCBzb2NrcywKICAgICAgICAgICAgICAgICAgICAgICAgICBBUkVTX0dFVFNPQ0tfTUFYTlVNKTsKIAotICBmb3IoaT0wOyBpIDwgQVJFU19HRVRTT0NLX01BWE5VTTsgaSsrKSB7CisgIGZvcihpID0gMDsgaSA8IEFSRVNfR0VUU09DS19NQVhOVU07IGkrKykgewogICAgIHBmZFtpXS5ldmVudHMgPSAwOwogICAgIHBmZFtpXS5yZXZlbnRzID0gMDsKICAgICBpZihBUkVTX0dFVFNPQ0tfUkVBREFCTEUoYml0bWFzaywgaSkpIHsKQEAgLTI4OSw3ICsyODksNyBAQAogICAgICAgICAgICAgICAgICAgICBBUkVTX1NPQ0tFVF9CQUQpOwogICBlbHNlIHsKICAgICAvKiBtb3ZlIHRocm91Z2ggdGhlIGRlc2NyaXB0b3JzIGFuZCBhc2sgZm9yIHByb2Nlc3Npbmcgb24gdGhlbSAqLwotICAgIGZvcihpPTA7IGkgPCBudW07IGkrKykKKyAgICBmb3IoaSA9IDA7IGkgPCBudW07IGkrKykKICAgICAgIGFyZXNfcHJvY2Vzc19mZCgoYXJlc19jaGFubmVsKWRhdGEtPnN0YXRlLnJlc29sdmVyLAogICAgICAgICAgICAgICAgICAgICAgIHBmZFtpXS5yZXZlbnRzICYgKFBPTExSRE5PUk18UE9MTElOKT8KICAgICAgICAgICAgICAgICAgICAgICBwZmRbaV0uZmQ6QVJFU19TT0NLRVRfQkFELApAQCAtMzU1LDcgKzM1NSw3IEBACiAgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOwogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKICAgbG9uZyB0aW1lb3V0OwotICBzdHJ1Y3QgdGltZXZhbCBub3cgPSBDdXJsX3R2bm93KCk7CisgIHN0cnVjdCBjdXJsdGltZSBub3cgPSBDdXJsX3R2bm93KCk7CiAgIHN0cnVjdCBDdXJsX2Ruc19lbnRyeSAqdGVtcF9lbnRyeTsKIAogICBpZihlbnRyeSkKQEAgLTQwMCw3ICs0MDAsNyBAQAogICAgIGlmKEN1cmxfcGdyc1VwZGF0ZShjb25uKSkKICAgICAgIHJlc3VsdCA9IENVUkxFX0FCT1JURURfQllfQ0FMTEJBQ0s7CiAgICAgZWxzZSB7Ci0gICAgICBzdHJ1Y3QgdGltZXZhbCBub3cyID0gQ3VybF90dm5vdygpOworICAgICAgc3RydWN0IGN1cmx0aW1lIG5vdzIgPSBDdXJsX3R2bm93KCk7CiAgICAgICB0aW1lX3QgdGltZWRpZmYgPSBDdXJsX3R2ZGlmZihub3cyLCBub3cpOyAvKiBzcGVudCB0aW1lICovCiAgICAgICBpZih0aW1lZGlmZiA8PSAwKQogICAgICAgICB0aW1lb3V0IC09IDE7IC8qIGFsd2F5cyBkZWR1Y3QgYXQgbGVhc3QgMSAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvYXN5bi10aHJlYWQuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2FzeW4tdGhyZWFkLmMKaW5kZXggNjVmYTZjNS4uYTg2NzcyOSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvYXN5bi10aHJlYWQuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9hc3luLXRocmVhZC5jCkBAIC0yMTAsNiArMjEwLDEwIEBACiAKICAgdHNkLT50ZCA9IHRkOwogICB0c2QtPnBvcnQgPSBwb3J0OworICAvKiBUcmVhdCB0aGUgcmVxdWVzdCBhcyBkb25lIHVudGlsIHRoZSB0aHJlYWQgYWN0dWFsbHkgc3RhcnRzIHNvIGFueSBlYXJseQorICAgKiBjbGVhbnVwIGdldHMgZG9uZSBwcm9wZXJseS4KKyAgICovCisgIHRzZC0+ZG9uZSA9IDE7CiAjaWZkZWYgSEFWRV9HRVRBRERSSU5GTwogICBERUJVR0FTU0VSVChoaW50cyk7CiAgIHRzZC0+aGludHMgPSAqaGludHM7CkBAIC0zODAsMTEgKzM4NCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKmhpbnRzKQogewogICBzdHJ1Y3QgdGhyZWFkX2RhdGEgKnRkID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgdGhyZWFkX2RhdGEpKTsKLSAgaW50IGVyciA9IFJFU09MVkVSX0VOT01FTTsKKyAgaW50IGVyciA9IEVOT01FTTsKIAogICBjb25uLT5hc3luYy5vc19zcGVjaWZpYyA9ICh2b2lkICopdGQ7CiAgIGlmKCF0ZCkKLSAgICBnb3RvIGVycl9leGl0OworICAgIGdvdG8gZXJybm9fZXhpdDsKIAogICBjb25uLT5hc3luYy5wb3J0ID0gcG9ydDsKICAgY29ubi0+YXN5bmMuZG9uZSA9IEZBTFNFOwpAQCAtMzkyLDE0ICszOTYsMjAgQEAKICAgY29ubi0+YXN5bmMuZG5zID0gTlVMTDsKICAgdGQtPnRocmVhZF9obmQgPSBjdXJsX3RocmVhZF90X251bGw7CiAKLSAgaWYoIWluaXRfdGhyZWFkX3N5bmNfZGF0YSh0ZCwgaG9zdG5hbWUsIHBvcnQsIGhpbnRzKSkKLSAgICBnb3RvIGVycl9leGl0OworICBpZighaW5pdF90aHJlYWRfc3luY19kYXRhKHRkLCBob3N0bmFtZSwgcG9ydCwgaGludHMpKSB7CisgICAgY29ubi0+YXN5bmMub3Nfc3BlY2lmaWMgPSBOVUxMOworICAgIGZyZWUodGQpOworICAgIGdvdG8gZXJybm9fZXhpdDsKKyAgfQogCiAgIGZyZWUoY29ubi0+YXN5bmMuaG9zdG5hbWUpOwogICBjb25uLT5hc3luYy5ob3N0bmFtZSA9IHN0cmR1cChob3N0bmFtZSk7CiAgIGlmKCFjb25uLT5hc3luYy5ob3N0bmFtZSkKICAgICBnb3RvIGVycl9leGl0OwogCisgIC8qIFRoZSB0aHJlYWQgd2lsbCBzZXQgdGhpcyB0byAxIHdoZW4gY29tcGxldGUuICovCisgIHRkLT50c2QuZG9uZSA9IDA7CisKICNpZmRlZiBIQVZFX0dFVEFERFJJTkZPCiAgIHRkLT50aHJlYWRfaG5kID0gQ3VybF90aHJlYWRfY3JlYXRlKGdldGFkZHJpbmZvX3RocmVhZCwgJnRkLT50c2QpOwogI2Vsc2UKQEAgLTQwNyw5ICs0MTcsOSBAQAogI2VuZGlmCiAKICAgaWYoIXRkLT50aHJlYWRfaG5kKSB7Ci0jaWZuZGVmIF9XSU4zMl9XQ0UKKyAgICAvKiBUaGUgdGhyZWFkIG5ldmVyIHN0YXJ0ZWQsIHNvIG1hcmsgaXQgYXMgZG9uZSBoZXJlIGZvciBwcm9wZXIgY2xlYW51cC4gKi8KKyAgICB0ZC0+dHNkLmRvbmUgPSAxOwogICAgIGVyciA9IGVycm5vOwotI2VuZGlmCiAgICAgZ290byBlcnJfZXhpdDsKICAgfQogCkBAIC00MTgsOCArNDI4LDggQEAKICBlcnJfZXhpdDoKICAgZGVzdHJveV9hc3luY19kYXRhKCZjb25uLT5hc3luYyk7CiAKLSAgU0VUX0VSUk5PKGVycik7Ci0KKyBlcnJub19leGl0OgorICBlcnJubyA9IGVycjsKICAgcmV0dXJuIEZBTFNFOwogfQogCkBAIC01OTQsMjggKzYwNCwyOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKndhaXRwKQogewogICBzdHJ1Y3QgYWRkcmluZm8gaGludHM7Ci0gIHN0cnVjdCBpbl9hZGRyIGluOwogICBDdXJsX2FkZHJpbmZvICpyZXM7CiAgIGludCBlcnJvcjsKICAgY2hhciBzYnVmWzEyXTsKICAgaW50IHBmID0gUEZfSU5FVDsKLSNpZmRlZiBDVVJMUkVTX0lQVjYKLSAgc3RydWN0IGluNl9hZGRyIGluNjsKLSNlbmRpZiAvKiBDVVJMUkVTX0lQVjYgKi8KIAogICAqd2FpdHAgPSAwOyAvKiBkZWZhdWx0IHRvIHN5bmNocm9ub3VzIHJlc3BvbnNlICovCiAKICNpZm5kZWYgVVNFX1JFU09MVkVfT05fSVBTCi0gIC8qIEZpcnN0IGNoZWNrIGlmIHRoaXMgaXMgYW4gSVB2NCBhZGRyZXNzIHN0cmluZyAqLwotICBpZihDdXJsX2luZXRfcHRvbihBRl9JTkVULCBob3N0bmFtZSwgJmluKSA+IDApCi0gICAgLyogVGhpcyBpcyBhIGRvdHRlZCBJUCBhZGRyZXNzIDEyMy4xMjMuMTIzLjEyMy1zdHlsZSAqLwotICAgIHJldHVybiBDdXJsX2lwMmFkZHIoQUZfSU5FVCwgJmluLCBob3N0bmFtZSwgcG9ydCk7Ci0KKyAgeworICAgIHN0cnVjdCBpbl9hZGRyIGluOworICAgIC8qIEZpcnN0IGNoZWNrIGlmIHRoaXMgaXMgYW4gSVB2NCBhZGRyZXNzIHN0cmluZyAqLworICAgIGlmKEN1cmxfaW5ldF9wdG9uKEFGX0lORVQsIGhvc3RuYW1lLCAmaW4pID4gMCkKKyAgICAgIC8qIFRoaXMgaXMgYSBkb3R0ZWQgSVAgYWRkcmVzcyAxMjMuMTIzLjEyMy4xMjMtc3R5bGUgKi8KKyAgICAgIHJldHVybiBDdXJsX2lwMmFkZHIoQUZfSU5FVCwgJmluLCBob3N0bmFtZSwgcG9ydCk7CisgIH0KICNpZmRlZiBDVVJMUkVTX0lQVjYKLSAgLyogY2hlY2sgaWYgdGhpcyBpcyBhbiBJUHY2IGFkZHJlc3Mgc3RyaW5nICovCi0gIGlmKEN1cmxfaW5ldF9wdG9uKEFGX0lORVQ2LCBob3N0bmFtZSwgJmluNikgPiAwKQotICAgIC8qIFRoaXMgaXMgYW4gSVB2NiBhZGRyZXNzIGxpdGVyYWwgKi8KLSAgICByZXR1cm4gQ3VybF9pcDJhZGRyKEFGX0lORVQ2LCAmaW42LCBob3N0bmFtZSwgcG9ydCk7CisgIHsKKyAgICBzdHJ1Y3QgaW42X2FkZHIgaW42OworICAgIC8qIGNoZWNrIGlmIHRoaXMgaXMgYW4gSVB2NiBhZGRyZXNzIHN0cmluZyAqLworICAgIGlmKEN1cmxfaW5ldF9wdG9uKEFGX0lORVQ2LCBob3N0bmFtZSwgJmluNikgPiAwKQorICAgICAgLyogVGhpcyBpcyBhbiBJUHY2IGFkZHJlc3MgbGl0ZXJhbCAqLworICAgICAgcmV0dXJuIEN1cmxfaXAyYWRkcihBRl9JTkVUNiwgJmluNiwgaG9zdG5hbWUsIHBvcnQpOworICB9CiAjZW5kaWYgLyogQ1VSTFJFU19JUFY2ICovCiAjZW5kaWYgLyogIVVTRV9SRVNPTFZFX09OX0lQUyAqLwogCkBAIC02NTQsNyArNjY1LDcgQEAKIAogICAvKiBmYWxsLWJhY2sgdG8gYmxvY2tpbmcgdmVyc2lvbiAqLwogICBpbmZvZihjb25uLT5kYXRhLCAiaW5pdF9yZXNvbHZlX3RocmVhZCgpIGZhaWxlZCBmb3IgJXM7ICVzXG4iLAotICAgICAgICBob3N0bmFtZSwgQ3VybF9zdHJlcnJvcihjb25uLCBFUlJOTykpOworICAgICAgICBob3N0bmFtZSwgQ3VybF9zdHJlcnJvcihjb25uLCBlcnJubykpOwogCiAgIGVycm9yID0gQ3VybF9nZXRhZGRyaW5mb19leChob3N0bmFtZSwgc2J1ZiwgJmhpbnRzLCAmcmVzKTsKICAgaWYoZXJyb3IpIHsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2Nvbm5jYWNoZS5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY29ubmNhY2hlLmgKaW5kZXggZjk3NmNmZC4uMTRiZTRlOCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvY29ubmNhY2hlLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY29ubmNhY2hlLmgKQEAgLTI3LDcgKzI3LDcgQEAKICAgc3RydWN0IGN1cmxfaGFzaCBoYXNoOwogICBzaXplX3QgbnVtX2Nvbm5lY3Rpb25zOwogICBsb25nIG5leHRfY29ubmVjdGlvbl9pZDsKLSAgc3RydWN0IHRpbWV2YWwgbGFzdF9jbGVhbnVwOworICBzdHJ1Y3QgY3VybHRpbWUgbGFzdF9jbGVhbnVwOwogfTsKIAogI2RlZmluZSBCVU5ETEVfTk9fTVVMVElVU0UgLTEKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2Nvbm5lY3QuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2Nvbm5lY3QuYwppbmRleCBkNGZkNTJiLi5iN2QxMGFmIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jb25uZWN0LmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY29ubmVjdC5jCkBAIC0xODAsMTIgKzE4MCwxMiBAQAogICogQHVuaXR0ZXN0OiAxMzAzCiAgKi8KIHRpbWVfdCBDdXJsX3RpbWVsZWZ0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCAqbm93cCwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjdXJsdGltZSAqbm93cCwKICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZHVyaW5nY29ubmVjdCkKIHsKICAgaW50IHRpbWVvdXRfc2V0ID0gMDsKICAgdGltZV90IHRpbWVvdXRfbXMgPSBkdXJpbmdjb25uZWN0P0RFRkFVTFRfQ09OTkVDVF9USU1FT1VUOjA7Ci0gIHN0cnVjdCB0aW1ldmFsIG5vdzsKKyAgc3RydWN0IGN1cmx0aW1lIG5vdzsKIAogICAvKiBpZiBhIHRpbWVvdXQgaXMgc2V0LCB1c2UgdGhlIG1vc3QgcmVzdHJpY3RpdmUgb25lICovCiAKQEAgLTI0OSw3ICsyNDksNyBAQAogICBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaTYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZzYTsKICNlbmRpZgogCi0gIHN0cnVjdCBDdXJsX2Ruc19lbnRyeSAqaD1OVUxMOworICBzdHJ1Y3QgQ3VybF9kbnNfZW50cnkgKmggPSBOVUxMOwogICB1bnNpZ25lZCBzaG9ydCBwb3J0ID0gZGF0YS0+c2V0LmxvY2FscG9ydDsgLyogdXNlIHRoaXMgcG9ydCBudW1iZXIsIDAgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmFuZG9tIiAqLwogICAvKiBob3cgbWFueSBwb3J0IG51bWJlcnMgdG8gdHJ5IHRvIGJpbmQgdG8sIGluY3JlYXNpbmcgb25lIGF0IGEgdGltZSAqLwpAQCAtMzE5LDcgKzMxOSw3IEBACiAgICAgICAgICAgICogYXMgYSBob3N0bmFtZSBvciBpcCBhZGRyZXNzLgogICAgICAgICAgICAqLwogICAgICAgICAgIGlmKHNldHNvY2tvcHQoc29ja2ZkLCBTT0xfU09DS0VULCBTT19CSU5EVE9ERVZJQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXYsIChjdXJsX3NvY2tsZW5fdClzdHJsZW4oZGV2KSsxKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXYsIChjdXJsX3NvY2tsZW5fdClzdHJsZW4oZGV2KSArIDEpICE9IDApIHsKICAgICAgICAgICAgIGVycm9yID0gU09DS0VSUk5POwogICAgICAgICAgICAgaW5mb2YoZGF0YSwgIlNPX0JJTkRUT0RFVklDRSAlcyBmYWlsZWQgd2l0aCBlcnJubyAlZDogJXM7IgogICAgICAgICAgICAgICAgICAgIiB3aWxsIGRvIHJlZ3VsYXIgYmluZFxuIiwKQEAgLTYwNyw3ICs2MDcsOCBAQAogICBjb25uLT5kYXRhLT5pbmZvLmNvbm5fbG9jYWxfcG9ydCA9IGNvbm4tPmxvY2FsX3BvcnQ7CiB9CiAKLS8qIHJldHJpZXZlcyBpcCBhZGRyZXNzIGFuZCBwb3J0IGZyb20gYSBzb2NrYWRkciBzdHJ1Y3R1cmUgKi8KKy8qIHJldHJpZXZlcyBpcCBhZGRyZXNzIGFuZCBwb3J0IGZyb20gYSBzb2NrYWRkciBzdHJ1Y3R1cmUuCisgICBub3RlIGl0IGNhbGxzIEN1cmxfaW5ldF9udG9wIHdoaWNoIHNldHMgZXJybm8gb24gZmFpbCwgbm90IFNPQ0tFUlJOTy4gKi8KIHN0YXRpYyBib29sIGdldGFkZHJlc3NpbmZvKHN0cnVjdCBzb2NrYWRkciAqc2EsIGNoYXIgKmFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICpwb3J0KQogewpAQCAtNjU0LDcgKzY1NSw3IEBACiAKICAgYWRkclswXSA9ICdcMCc7CiAgICpwb3J0ID0gMDsKLQorICBlcnJubyA9IEVBRk5PU1VQUE9SVDsKICAgcmV0dXJuIEZBTFNFOwogfQogCkBAIC02NzIsMTEgKzY3Myw5IEBACiAgICAgcmV0dXJuOwogCiAgIGlmKCFjb25uLT5iaXRzLnJldXNlICYmICFjb25uLT5iaXRzLnRjcF9mYXN0b3BlbikgewotICAgIGludCBlcnJvcjsKLQogICAgIGxlbiA9IHNpemVvZihzdHJ1Y3QgQ3VybF9zb2NrYWRkcl9zdG9yYWdlKTsKICAgICBpZihnZXRwZWVybmFtZShzb2NrZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSAmc3NyZW0sICZsZW4pKSB7Ci0gICAgICBlcnJvciA9IFNPQ0tFUlJOTzsKKyAgICAgIGludCBlcnJvciA9IFNPQ0tFUlJOTzsKICAgICAgIGZhaWxmKGRhdGEsICJnZXRwZWVybmFtZSgpIGZhaWxlZCB3aXRoIGVycm5vICVkOiAlcyIsCiAgICAgICAgICAgICBlcnJvciwgQ3VybF9zdHJlcnJvcihjb25uLCBlcnJvcikpOwogICAgICAgcmV0dXJuOwpAQCAtNjg1LDcgKzY4NCw3IEBACiAgICAgbGVuID0gc2l6ZW9mKHN0cnVjdCBDdXJsX3NvY2thZGRyX3N0b3JhZ2UpOwogICAgIG1lbXNldCgmc3Nsb2MsIDAsIHNpemVvZihzc2xvYykpOwogICAgIGlmKGdldHNvY2tuYW1lKHNvY2tmZCwgKHN0cnVjdCBzb2NrYWRkciopICZzc2xvYywgJmxlbikpIHsKLSAgICAgIGVycm9yID0gU09DS0VSUk5POworICAgICAgaW50IGVycm9yID0gU09DS0VSUk5POwogICAgICAgZmFpbGYoZGF0YSwgImdldHNvY2tuYW1lKCkgZmFpbGVkIHdpdGggZXJybm8gJWQ6ICVzIiwKICAgICAgICAgICAgIGVycm9yLCBDdXJsX3N0cmVycm9yKGNvbm4sIGVycm9yKSk7CiAgICAgICByZXR1cm47CkBAIC02OTMsMTggKzY5MiwxNiBAQAogCiAgICAgaWYoIWdldGFkZHJlc3NpbmZvKChzdHJ1Y3Qgc29ja2FkZHIqKSZzc3JlbSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4tPnByaW1hcnlfaXAsICZjb25uLT5wcmltYXJ5X3BvcnQpKSB7Ci0gICAgICBlcnJvciA9IEVSUk5POwogICAgICAgZmFpbGYoZGF0YSwgInNzcmVtIGluZXRfbnRvcCgpIGZhaWxlZCB3aXRoIGVycm5vICVkOiAlcyIsCi0gICAgICAgICAgICBlcnJvciwgQ3VybF9zdHJlcnJvcihjb25uLCBlcnJvcikpOworICAgICAgICAgICAgZXJybm8sIEN1cmxfc3RyZXJyb3IoY29ubiwgZXJybm8pKTsKICAgICAgIHJldHVybjsKICAgICB9CiAgICAgbWVtY3B5KGNvbm4tPmlwX2FkZHJfc3RyLCBjb25uLT5wcmltYXJ5X2lwLCBNQVhfSVBBRFJfTEVOKTsKIAogICAgIGlmKCFnZXRhZGRyZXNzaW5mbygoc3RydWN0IHNvY2thZGRyKikmc3Nsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4tPmxvY2FsX2lwLCAmY29ubi0+bG9jYWxfcG9ydCkpIHsKLSAgICAgIGVycm9yID0gRVJSTk87CiAgICAgICBmYWlsZihkYXRhLCAic3Nsb2MgaW5ldF9udG9wKCkgZmFpbGVkIHdpdGggZXJybm8gJWQ6ICVzIiwKLSAgICAgICAgICAgIGVycm9yLCBDdXJsX3N0cmVycm9yKGNvbm4sIGVycm9yKSk7CisgICAgICAgICAgICBlcnJubywgQ3VybF9zdHJlcnJvcihjb25uLCBlcnJubykpOwogICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNzI2LDcgKzcyMyw3IEBACiAgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOwogICB0aW1lX3QgYWxsb3c7CiAgIGludCBlcnJvciA9IDA7Ci0gIHN0cnVjdCB0aW1ldmFsIG5vdzsKKyAgc3RydWN0IGN1cmx0aW1lIG5vdzsKICAgaW50IHJjOwogICBpbnQgaTsKIApAQCAtNzUxLDcgKzc0OCw3IEBACiAgICAgcmV0dXJuIENVUkxFX09QRVJBVElPTl9USU1FRE9VVDsKICAgfQogCi0gIGZvcihpPTA7IGk8MjsgaSsrKSB7CisgIGZvcihpID0gMDsgaTwyOyBpKyspIHsKICAgICBjb25zdCBpbnQgb3RoZXIgPSBpIF4gMTsKICAgICBpZihjb25uLT50ZW1wc29ja1tpXSA9PSBDVVJMX1NPQ0tFVF9CQUQpCiAgICAgICBjb250aW51ZTsKQEAgLTg3OSwxOSArODc2LDYgQEAKICAgY3VybF9zb2NrbGVuX3Qgb25vZmYgPSAoY3VybF9zb2NrbGVuX3QpIDE7CiAgIGludCBsZXZlbCA9IElQUFJPVE9fVENQOwogCi0jaWYgMAotICAvKiBUaGUgdXNlIG9mIGdldHByb3RvYnluYW1lKCkgaXMgZGlzYWJsZWQgc2luY2UgaXQgaXNuJ3QgdGhyZWFkLXNhZmUgb24KLSAgICAgbnVtZXJvdXMgc3lzdGVtcy4gT24gdGhlc2UgZ2V0cHJvdG9ieW5hbWVfcigpIHNob3VsZCBiZSB1c2VkIGluc3RlYWQsIGJ1dAotICAgICB0aGF0IGV4aXN0cyBpbiBhdCBsZWFzdCBvbmUgNCBhcmcgdmVyc2lvbiBhbmQgb25lIDUgYXJnIHZlcnNpb24sIGFuZAotICAgICBzaW5jZSB0aGUgcHJvdG8gbnVtYmVyIHJhcmVseSBjaGFuZ2VzIGFueXdheSB3ZSBub3cganVzdCB1c2UgdGhlIGhhcmQKLSAgICAgY29kZWQgbnVtYmVyLiBUaGUgInByb3BlciIgZml4IHdvdWxkIG5lZWQgYSBjb25maWd1cmUgY2hlY2sgZm9yIHRoZQotICAgICBjb3JyZWN0IGZ1bmN0aW9uIG11Y2ggaW4gdGhlIHNhbWUgc3R5bGUgdGhlIGdldGhvc3RieW5hbWVfciB2ZXJzaW9ucyBhcmUKLSAgICAgZGV0ZWN0ZWQuICovCi0gIHN0cnVjdCBwcm90b2VudCAqcGUgPSBnZXRwcm90b2J5bmFtZSgidGNwIik7Ci0gIGlmKHBlKQotICAgIGxldmVsID0gcGUtPnBfcHJvdG87Ci0jZW5kaWYKLQogI2lmIGRlZmluZWQoQ1VSTF9ESVNBQkxFX1ZFUkJPU0VfU1RSSU5HUykKICAgKHZvaWQpIGNvbm47CiAjZW5kaWYKQEAgLTkxNiw3ICs5MDAsNyBAQAogc3RhdGljIHZvaWQgbm9zaWdwaXBlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKICAgICAgICAgICAgICAgICAgICAgICBjdXJsX3NvY2tldF90IHNvY2tmZCkKIHsKLSAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YT0gY29ubi0+ZGF0YTsKKyAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIGludCBvbm9mZiA9IDE7CiAgIGlmKHNldHNvY2tvcHQoc29ja2ZkLCBTT0xfU09DS0VULCBTT19OT1NJR1BJUEUsICh2b2lkICopJm9ub2ZmLAogICAgICAgICAgICAgICAgIHNpemVvZihvbm9mZikpIDwgMCkKQEAgLTEwMDgsOSArOTkyLDggQEAKICAgaWYoIWdldGFkZHJlc3NpbmZvKChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyLnNhX2FkZHIsCiAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJlc3MsICZwb3J0KSkgewogICAgIC8qIG1hbGZvcm1lZCBhZGRyZXNzIG9yIGJ1ZyBpbiBpbmV0X250b3AsIHRyeSBuZXh0IGFkZHJlc3MgKi8KLSAgICBlcnJvciA9IEVSUk5POwogICAgIGZhaWxmKGRhdGEsICJzYV9hZGRyIGluZXRfbnRvcCgpIGZhaWxlZCB3aXRoIGVycm5vICVkOiAlcyIsCi0gICAgICAgICAgZXJyb3IsIEN1cmxfc3RyZXJyb3IoY29ubiwgZXJyb3IpKTsKKyAgICAgICAgICBlcnJubywgQ3VybF9zdHJlcnJvcihjb25uLCBlcnJubykpOwogICAgIEN1cmxfY2xvc2Vzb2NrZXQoY29ubiwgc29ja2ZkKTsKICAgICByZXR1cm4gQ1VSTEVfT0s7CiAgIH0KQEAgLTEwNzYsMTYgKzEwNTksMjUgQEAKICAgaWYoIWlzY29ubmVjdGVkICYmIChjb25uLT5zb2NrdHlwZSA9PSBTT0NLX1NUUkVBTSkpIHsKICAgICBpZihjb25uLT5iaXRzLnRjcF9mYXN0b3BlbikgewogI2lmIGRlZmluZWQoQ09OTkVDVF9EQVRBX0lERU1QT1RFTlQpIC8qIE9TIFggKi8KLSAgICAgIHNhX2VuZHBvaW50c190IGVuZHBvaW50czsKLSAgICAgIGVuZHBvaW50cy5zYWVfc3JjaWYgPSAwOwotICAgICAgZW5kcG9pbnRzLnNhZV9zcmNhZGRyID0gTlVMTDsKLSAgICAgIGVuZHBvaW50cy5zYWVfc3JjYWRkcmxlbiA9IDA7Ci0gICAgICBlbmRwb2ludHMuc2FlX2RzdGFkZHIgPSAmYWRkci5zYV9hZGRyOwotICAgICAgZW5kcG9pbnRzLnNhZV9kc3RhZGRybGVuID0gYWRkci5hZGRybGVuOworI2lmZGVmIEhBVkVfQlVJTFRJTl9BVkFJTEFCTEUKKyAgICAgIGlmKF9fYnVpbHRpbl9hdmFpbGFibGUobWFjT1MgMTAuMTEsIGlPUyA5LjAsIHR2T1MgOS4wLCB3YXRjaE9TIDIuMCwgKikpIHsKKyNlbmRpZiAvKiBIQVZFX0JVSUxUSU5fQVZBSUxBQkxFICovCisgICAgICAgIHNhX2VuZHBvaW50c190IGVuZHBvaW50czsKKyAgICAgICAgZW5kcG9pbnRzLnNhZV9zcmNpZiA9IDA7CisgICAgICAgIGVuZHBvaW50cy5zYWVfc3JjYWRkciA9IE5VTEw7CisgICAgICAgIGVuZHBvaW50cy5zYWVfc3JjYWRkcmxlbiA9IDA7CisgICAgICAgIGVuZHBvaW50cy5zYWVfZHN0YWRkciA9ICZhZGRyLnNhX2FkZHI7CisgICAgICAgIGVuZHBvaW50cy5zYWVfZHN0YWRkcmxlbiA9IGFkZHIuYWRkcmxlbjsKIAotICAgICAgcmMgPSBjb25uZWN0eChzb2NrZmQsICZlbmRwb2ludHMsIFNBRV9BU1NPQ0lEX0FOWSwKLSAgICAgICAgICAgICAgICAgICAgQ09OTkVDVF9SRVNVTUVfT05fUkVBRF9XUklURSB8IENPTk5FQ1RfREFUQV9JREVNUE9URU5ULAotICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgcmMgPSBjb25uZWN0eChzb2NrZmQsICZlbmRwb2ludHMsIFNBRV9BU1NPQ0lEX0FOWSwKKyAgICAgICAgICAgICAgICAgICAgICBDT05ORUNUX1JFU1VNRV9PTl9SRUFEX1dSSVRFIHwgQ09OTkVDVF9EQVRBX0lERU1QT1RFTlQsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisjaWZkZWYgSEFWRV9CVUlMVElOX0FWQUlMQUJMRQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHJjID0gY29ubmVjdChzb2NrZmQsICZhZGRyLnNhX2FkZHIsIGFkZHIuYWRkcmxlbik7CisgICAgICB9CisjZW5kaWYgLyogSEFWRV9CVUlMVElOX0FWQUlMQUJMRSAqLwogI2VsaWYgZGVmaW5lZChNU0dfRkFTVE9QRU4pIC8qIExpbnV4ICovCiAgICAgICBpZihjb25uLT5naXZlbi0+ZmxhZ3MgJiBQUk9UT1BUX1NTTCkKICAgICAgICAgcmMgPSBjb25uZWN0KHNvY2tmZCwgJmFkZHIuc2FfYWRkciwgYWRkci5hZGRybGVuKTsKQEAgLTExNTMsNyArMTE0NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBDdXJsX2Ruc19lbnRyeSAqcmVtb3RlaG9zdCkKIHsKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7Ci0gIHN0cnVjdCB0aW1ldmFsIGJlZm9yZSA9IEN1cmxfdHZub3coKTsKKyAgc3RydWN0IGN1cmx0aW1lIGJlZm9yZSA9IEN1cmxfdHZub3coKTsKICAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfQ09VTEROVF9DT05ORUNUOwogCiAgIHRpbWVfdCB0aW1lb3V0X21zID0gQ3VybF90aW1lbGVmdChkYXRhLCAmYmVmb3JlLCBUUlVFKTsKQEAgLTExNjksNyArMTE2MSw2IEBACiAgIGNvbm4tPnRlbXBhZGRyWzFdID0gTlVMTDsKICAgY29ubi0+dGVtcHNvY2tbMF0gPSBDVVJMX1NPQ0tFVF9CQUQ7CiAgIGNvbm4tPnRlbXBzb2NrWzFdID0gQ1VSTF9TT0NLRVRfQkFEOwotICBDdXJsX2V4cGlyZShjb25uLT5kYXRhLCBIQVBQWV9FWUVCQUxMU19USU1FT1VULCBFWFBJUkVfSEFQUFlfRVlFQkFMTFMpOwogCiAgIC8qIE1heCB0aW1lIGZvciB0aGUgbmV4dCBjb25uZWN0aW9uIGF0dGVtcHQgKi8KICAgY29ubi0+dGltZW91dG1zX3Blcl9hZGRyID0KQEAgLTExOTAsNiArMTE4MSw3IEBACiAgIH0KIAogICBkYXRhLT5pbmZvLm51bWNvbm5lY3RzKys7IC8qIHRvIHRyYWNrIHRoZSBudW1iZXIgb2YgY29ubmVjdGlvbnMgbWFkZSAqLworICBDdXJsX2V4cGlyZShjb25uLT5kYXRhLCBIQVBQWV9FWUVCQUxMU19USU1FT1VULCBFWFBJUkVfSEFQUFlfRVlFQkFMTFMpOwogCiAgIHJldHVybiBDVVJMRV9PSzsKIH0KQEAgLTEzNDEsNyArMTMzMyw3IEBACiAKICAgYWRkci0+ZmFtaWx5ID0gYWktPmFpX2ZhbWlseTsKICAgYWRkci0+c29ja3R5cGUgPSBjb25uLT5zb2NrdHlwZTsKLSAgYWRkci0+cHJvdG9jb2wgPSBjb25uLT5zb2NrdHlwZT09U09DS19ER1JBTT9JUFBST1RPX1VEUDphaS0+YWlfcHJvdG9jb2w7CisgIGFkZHItPnByb3RvY29sID0gY29ubi0+c29ja3R5cGUgPT0gU09DS19ER1JBTT9JUFBST1RPX1VEUDphaS0+YWlfcHJvdG9jb2w7CiAgIGFkZHItPmFkZHJsZW4gPSBhaS0+YWlfYWRkcmxlbjsKIAogICBpZihhZGRyLT5hZGRybGVuID4gc2l6ZW9mKHN0cnVjdCBDdXJsX3NvY2thZGRyX3N0b3JhZ2UpKQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvY29ubmVjdC5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY29ubmVjdC5oCmluZGV4IDQ0YmRiMTAuLjNmMDVjMzkgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2Nvbm5lY3QuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9jb25uZWN0LmgKQEAgLTcsNyArNyw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTM2LDcgKzM2LDcgQEAKIC8qIGdlbmVyaWMgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGhvdyBtdWNoIHRpbWUgdGhlcmUncyBsZWZ0IHRvIHJ1biwgYWNjb3JkaW5nCiAgICB0byB0aGUgdGltZW91dHMgc2V0ICovCiB0aW1lX3QgQ3VybF90aW1lbGVmdChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgKm5vd3AsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY3VybHRpbWUgKm5vd3AsCiAgICAgICAgICAgICAgICAgICAgICBib29sIGR1cmluZ2Nvbm5lY3QpOwogCiAjZGVmaW5lIERFRkFVTFRfQ09OTkVDVF9USU1FT1VUIDMwMDAwMCAvKiBtaWxsaXNlY29uZHMgPT0gZml2ZSBtaW51dGVzICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jb250ZW50X2VuY29kaW5nLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9jb250ZW50X2VuY29kaW5nLmMKaW5kZXggNjUyZWQ5Ny4uMTEwMjI2MCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvY29udGVudF9lbmNvZGluZy5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2NvbnRlbnRfZW5jb2RpbmcuYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtMjI3LDcgKzIyNyw3IEBACiAKICAgICBleHRyYV9sZW4gPSAoZGF0YVsxXSA8PCA4KSB8IGRhdGFbMF07CiAKLSAgICBpZihsZW4gPCAoZXh0cmFfbGVuKzIpKQorICAgIGlmKGxlbiA8IChleHRyYV9sZW4gKyAyKSkKICAgICAgIHJldHVybiBHWklQX1VOREVSRkxPVzsKIAogICAgIGxlbiAtPSAoZXh0cmFfbGVuICsgMik7CkBAIC0yODgsNyArMjg4LDcgQEAKIAogICAgIGlmKHN0cmNtcCh6bGliVmVyc2lvbigpLCAiMS4yLjAuNCIpID49IDApIHsKICAgICAgIC8qIHpsaWIgdmVyLiA+PSAxLjIuMC40IHN1cHBvcnRzIHRyYW5zcGFyZW50IGd6aXAgZGVjb21wcmVzc2luZyAqLwotICAgICAgaWYoaW5mbGF0ZUluaXQyKHosIE1BWF9XQklUUyszMikgIT0gWl9PSykgeworICAgICAgaWYoaW5mbGF0ZUluaXQyKHosIE1BWF9XQklUUyArIDMyKSAhPSBaX09LKSB7CiAgICAgICAgIHJldHVybiBwcm9jZXNzX3psaWJfZXJyb3IoY29ubiwgeik7CiAgICAgICB9CiAgICAgICBrLT56bGliX2luaXQgPSBaTElCX0lOSVRfR1pJUDsgLyogVHJhbnNwYXJlbnQgZ3ppcCBkZWNvbXByZXNzIHN0YXRlICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jb29raWUuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2Nvb2tpZS5jCmluZGV4IDZiNjc4YWUuLjdmYjU5NmEgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2Nvb2tpZS5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2Nvb2tpZS5jCkBAIC0xMjUsNyArMTI1LDcgQEAKICAgaWYoaG9zdG5hbWVfbGVuIDwgY29va2llX2RvbWFpbl9sZW4pCiAgICAgcmV0dXJuIEZBTFNFOwogCi0gIGlmKCFzdHJjYXNlY29tcGFyZShjb29rZV9kb21haW4sIGhvc3RuYW1lK2hvc3RuYW1lX2xlbi1jb29raWVfZG9tYWluX2xlbikpCisgIGlmKCFzdHJjYXNlY29tcGFyZShjb29rZV9kb21haW4sIGhvc3RuYW1lICsgaG9zdG5hbWVfbGVuLWNvb2tpZV9kb21haW5fbGVuKSkKICAgICByZXR1cm4gRkFMU0U7CiAKICAgLyogQSBsZWFkIGNoYXIgb2YgY29va2llX2RvbWFpbiBpcyBub3QgJy4nLgpAQCAtMzc1LDkgKzM3NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxlc3Mgc2V0ICovCiB7CiAgIHN0cnVjdCBDb29raWUgKmNsaXN0OwotICBjaGFyIG5hbWVbTUFYX05BTUVdOwogICBzdHJ1Y3QgQ29va2llICpjbzsKLSAgc3RydWN0IENvb2tpZSAqbGFzdGM9TlVMTDsKKyAgc3RydWN0IENvb2tpZSAqbGFzdGMgPSBOVUxMOwogICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKICAgYm9vbCByZXBsYWNlX29sZCA9IEZBTFNFOwogICBib29sIGJhZGNvb2tpZSA9IEZBTFNFOyAvKiBjb29raWVzIGFyZSBnb29kIGJ5IGRlZmF1bHQuIG1tbW1tIHl1bW15ICovCkBAIC0zOTcsMTcgKzM5NiwxOSBAQAogCiAgIGlmKGh0dHBoZWFkZXIpIHsKICAgICAvKiBUaGlzIGxpbmUgd2FzIHJlYWQgb2ZmIGEgSFRUUC1oZWFkZXIgKi8KKyAgICBjaGFyIG5hbWVbTUFYX05BTUVdOworICAgIGNoYXIgd2hhdFtNQVhfTkFNRV07CiAgICAgY29uc3QgY2hhciAqcHRyOwogICAgIGNvbnN0IGNoYXIgKnNlbWlwdHI7Ci0gICAgY2hhciAqd2hhdDsKIAotICAgIHdoYXQgPSBtYWxsb2MoTUFYX0NPT0tJRV9MSU5FKTsKLSAgICBpZighd2hhdCkgeworICAgIHNpemVfdCBsaW5lbGVuZ3RoID0gc3RybGVuKGxpbmVwdHIpOworICAgIGlmKGxpbmVsZW5ndGggPiBNQVhfQ09PS0lFX0xJTkUpIHsKKyAgICAgIC8qIGRpc2NhcmQgb3Zlcmx5IGxvbmcgbGluZXMgYXQgb25jZSAqLwogICAgICAgZnJlZShjbyk7CiAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBzZW1pcHRyPXN0cmNocihsaW5lcHRyLCAnOycpOyAvKiBmaXJzdCwgZmluZCBhIHNlbWljb2xvbiAqLworICAgIHNlbWlwdHIgPSBzdHJjaHIobGluZXB0ciwgJzsnKTsgLyogZmlyc3QsIGZpbmQgYSBzZW1pY29sb24gKi8KIAogICAgIHdoaWxlKCpsaW5lcHRyICYmIElTQkxBTksoKmxpbmVwdHIpKQogICAgICAgbGluZXB0cisrOwpAQCAtNDE1LDkgKzQxNiw5IEBACiAgICAgcHRyID0gbGluZXB0cjsKICAgICBkbyB7CiAgICAgICAvKiB3ZSBoYXZlIGEgPHdoYXQ+PTx0aGlzPiBwYWlyIG9yIGEgc3RhbmQtYWxvbmUgd29yZCBoZXJlICovCi0gICAgICBuYW1lWzBdPXdoYXRbMF09MDsgLyogaW5pdCB0aGUgYnVmZmVycyAqLworICAgICAgbmFtZVswXSA9IHdoYXRbMF0gPSAwOyAvKiBpbml0IHRoZSBidWZmZXJzICovCiAgICAgICBpZigxIDw9IHNzY2FuZihwdHIsICIlIiBNQVhfTkFNRV9UWFQgIlteO1xyXG49XSA9JSIKLSAgICAgICAgICAgICAgICAgICAgIE1BWF9DT09LSUVfTElORV9UWFQgIlteO1xyXG5dIiwKKyAgICAgICAgICAgICAgICAgICAgIE1BWF9OQU1FX1RYVCAiW147XHJcbl0iLAogICAgICAgICAgICAgICAgICAgICAgbmFtZSwgd2hhdCkpIHsKICAgICAgICAgLyogVXNlIHN0cnN0b3JlKCkgYmVsb3cgdG8gcHJvcGVybHkgZGVhbCB3aXRoIHJlY2VpdmVkIGNvb2tpZQogICAgICAgICAgICBoZWFkZXJzIHRoYXQgaGF2ZSB0aGUgc2FtZSBzdHJpbmcgcHJvcGVydHkgc2V0IG1vcmUgdGhhbiBvbmNlLApAQCAtNDI1LDEwICs0MjYsMjQgQEAKICAgICAgICAgY29uc3QgY2hhciAqd2hhdHB0cjsKICAgICAgICAgYm9vbCBkb25lID0gRkFMU0U7CiAgICAgICAgIGJvb2wgc2VwOwotICAgICAgICBzaXplX3QgbGVuPXN0cmxlbih3aGF0KTsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbih3aGF0KTsKICAgICAgICAgc2l6ZV90IG5sZW4gPSBzdHJsZW4obmFtZSk7CiAgICAgICAgIGNvbnN0IGNoYXIgKmVuZG9mbiA9ICZwdHJbIG5sZW4gXTsKIAorICAgICAgICBpbmZvZihkYXRhLCAiY29va2llIHNpemU6IG5hbWUvdmFsICVkICsgJWQgYnl0ZXNcbiIsCisgICAgICAgICAgICAgIG5sZW4sIGxlbik7CisKKyAgICAgICAgaWYobmxlbiA+PSAoTUFYX05BTUUtMSkgfHwgbGVuID49IChNQVhfTkFNRS0xKSB8fAorICAgICAgICAgICAoKG5sZW4gKyBsZW4pID4gTUFYX05BTUUpKSB7CisgICAgICAgICAgLyogdG9vIGxvbmcgaW5kaXZpZHVhbCBuYW1lIG9yIGNvbnRlbnRzLCBvciB0b28gbG9uZyBjb21iaW5hdGlvbiBvZgorICAgICAgICAgICAgIG5hbWUgKyBjb250ZW50cy4gQ2hyb21lIGFuZCBGaXJlZm94IHN1cHBvcnQgNDA5NSBvciA0MDk2IGJ5dGVzCisgICAgICAgICAgICAgY29tYm8uICovCisgICAgICAgICAgZnJlZWNvb2tpZShjbyk7CisgICAgICAgICAgaW5mb2YoZGF0YSwgIm92ZXJzaXplZCBjb29raWUgZHJvcHBlZCwgbmFtZS92YWwgJWQgKyAlZCBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICBubGVuLCBsZW4pOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKICAgICAgICAgLyogbmFtZSBlbmRzIHdpdGggYSAnPScgPyAqLwogICAgICAgICBzZXAgPSAoKmVuZG9mbiA9PSAnPScpP1RSVUU6RkFMU0U7CiAKQEAgLTQ0MCwxOCArNDU1LDE4IEBACiAgICAgICAgICAgICAgIGVuZG9mbi0tOwogICAgICAgICAgICAgICBubGVuLS07CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBuYW1lW25sZW5dPTA7IC8qIG5ldyBlbmQgb2YgbmFtZSAqLworICAgICAgICAgICAgbmFtZVtubGVuXSA9IDA7IC8qIG5ldyBlbmQgb2YgbmFtZSAqLwogICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8qIFN0cmlwIG9mZiB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlICd3aGF0JyAqLwogICAgICAgICB3aGlsZShsZW4gJiYgSVNCTEFOSyh3aGF0W2xlbi0xXSkpIHsKLSAgICAgICAgICB3aGF0W2xlbi0xXT0wOworICAgICAgICAgIHdoYXRbbGVuLTFdID0gMDsKICAgICAgICAgICBsZW4tLTsKICAgICAgICAgfQogCiAgICAgICAgIC8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlICd3aGF0JyAqLwotICAgICAgICB3aGF0cHRyPXdoYXQ7CisgICAgICAgIHdoYXRwdHIgPSB3aGF0OwogICAgICAgICB3aGlsZSgqd2hhdHB0ciAmJiBJU0JMQU5LKCp3aGF0cHRyKSkKICAgICAgICAgICB3aGF0cHRyKys7CiAKQEAgLTQ4NCw2ICs0OTksNyBAQAogICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsgLyogb3V0IG9mIG1lbW9yeSBiYWQgKi8KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KKyAgICAgICAgICBmcmVlKGNvLT5zcGF0aCk7IC8qIGlmIHRoaXMgaXMgc2V0IGFnYWluICovCiAgICAgICAgICAgY28tPnNwYXRoID0gc2FuaXRpemVfY29va2llX3BhdGgoY28tPnBhdGgpOwogICAgICAgICAgIGlmKCFjby0+c3BhdGgpIHsKICAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7IC8qIG91dCBvZiBtZW1vcnkgYmFkICovCkBAIC01MTAsNyArNTI2LDcgQEAKICAgICAgICAgICAgIC8qIGNoZWNrIGZvciBtb3JlIGRvdHMgKi8KICAgICAgICAgICAgIGRvdHAgPSBzdHJjaHIod2hhdHB0ciwgJy4nKTsKICAgICAgICAgICAgIGlmKCFkb3RwICYmICFzdHJjYXNlY29tcGFyZSgibG9jYWxob3N0Iiwgd2hhdHB0cikpCi0gICAgICAgICAgICAgIGRvbWFpbj0iOiI7CisgICAgICAgICAgICAgIGRvbWFpbiA9ICI6IjsKICAgICAgICAgICB9CiAjZW5kaWYKIApAQCAtNTI1LDE0ICs1NDEsMTQgQEAKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZighaXNfaXApCi0gICAgICAgICAgICAgIGNvLT50YWlsbWF0Y2g9VFJVRTsgLyogd2UgYWx3YXlzIGRvIHRoYXQgaWYgdGhlIGRvbWFpbiBuYW1lIHdhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuICovCisgICAgICAgICAgICAgIGNvLT50YWlsbWF0Y2ggPSBUUlVFOyAvKiB3ZSBhbHdheXMgZG8gdGhhdCBpZiB0aGUgZG9tYWluIG5hbWUgd2FzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiAqLwogICAgICAgICAgIH0KICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIC8qIHdlIGRpZCBub3QgZ2V0IGEgdGFpbG1hdGNoIGFuZCB0aGVuIHRoZSBhdHRlbXB0ZWQgc2V0IGRvbWFpbgogICAgICAgICAgICAgICAgaXMgbm90IGEgZG9tYWluIHRvIHdoaWNoIHRoZSBjdXJyZW50IGhvc3QgYmVsb25ncy4gTWFyayBhcwogICAgICAgICAgICAgICAgYmFkLiAqLwotICAgICAgICAgICAgYmFkY29va2llPVRSVUU7CisgICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgICAgICAgaW5mb2YoZGF0YSwgInNraXBwZWQgY29va2llIHdpdGggYmFkIHRhaWxtYXRjaCBkb21haW46ICVzXG4iLAogICAgICAgICAgICAgICAgICAgd2hhdHB0cik7CiAgICAgICAgICAgfQpAQCAtNTgxLDI2ICs1OTcsMzIgQEAKICAgICAgICAgY29udGludWU7CiAgICAgICB9CiAKLSAgICAgIHB0cj1zZW1pcHRyKzE7CisgICAgICBwdHIgPSBzZW1pcHRyICsgMTsKICAgICAgIHdoaWxlKCpwdHIgJiYgSVNCTEFOSygqcHRyKSkKICAgICAgICAgcHRyKys7Ci0gICAgICBzZW1pcHRyPXN0cmNocihwdHIsICc7Jyk7IC8qIG5vdywgZmluZCB0aGUgbmV4dCBzZW1pY29sb24gKi8KKyAgICAgIHNlbWlwdHIgPSBzdHJjaHIocHRyLCAnOycpOyAvKiBub3csIGZpbmQgdGhlIG5leHQgc2VtaWNvbG9uICovCiAKICAgICAgIGlmKCFzZW1pcHRyICYmICpwdHIpCiAgICAgICAgIC8qIFRoZXJlIGFyZSBubyBtb3JlIHNlbWljb2xvbnMsIGJ1dCB0aGVyZSdzIGEgZmluYWwgbmFtZT12YWx1ZSBwYWlyCiAgICAgICAgICAgIGNvbWluZyB1cCAqLwotICAgICAgICBzZW1pcHRyPXN0cmNocihwdHIsICdcMCcpOworICAgICAgICBzZW1pcHRyID0gc3RyY2hyKHB0ciwgJ1wwJyk7CiAgICAgfSB3aGlsZShzZW1pcHRyKTsKIAogICAgIGlmKGNvLT5tYXhhZ2UpIHsKLSAgICAgIGNvLT5leHBpcmVzID0KLSAgICAgICAgY3VybHhfc3RydG9vZmZ0KCgqY28tPm1heGFnZT09J1wiJyk/Ci0gICAgICAgICAgICAgICAgICAgICAgICAmY28tPm1heGFnZVsxXTomY28tPm1heGFnZVswXSwgTlVMTCwgMTApOwotICAgICAgaWYoQ1VSTF9PRkZfVF9NQVggLSBub3cgPCBjby0+ZXhwaXJlcykKLSAgICAgICAgLyogYXZvaWQgb3ZlcmZsb3cgKi8KKyAgICAgIENVUkxvZmZ0IG9mZnQ7CisgICAgICBvZmZ0ID0gY3VybHhfc3RydG9vZmZ0KCgqY28tPm1heGFnZSA9PSAnXCInKT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvLT5tYXhhZ2VbMV06JmNvLT5tYXhhZ2VbMF0sIE5VTEwsIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY28tPmV4cGlyZXMpOworICAgICAgaWYob2ZmdCA9PSBDVVJMX09GRlRfRkxPVykKKyAgICAgICAgLyogb3ZlcmZsb3csIHVzZWQgbWF4IHZhbHVlICovCiAgICAgICAgIGNvLT5leHBpcmVzID0gQ1VSTF9PRkZfVF9NQVg7Ci0gICAgICBlbHNlCi0gICAgICAgIGNvLT5leHBpcmVzICs9IG5vdzsKKyAgICAgIGVsc2UgaWYoIW9mZnQpIHsKKyAgICAgICAgaWYoQ1VSTF9PRkZfVF9NQVggLSBub3cgPCBjby0+ZXhwaXJlcykKKyAgICAgICAgICAvKiB3b3VsZCBvdmVyZmxvdyAqLworICAgICAgICAgIGNvLT5leHBpcmVzID0gQ1VSTF9PRkZfVF9NQVg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBjby0+ZXhwaXJlcyArPSBub3c7CisgICAgICB9CiAgICAgfQogICAgIGVsc2UgaWYoY28tPmV4cGlyZXN0cikgewogICAgICAgLyogTm90ZSB0aGF0IGlmIHRoZSBkYXRlIGNvdWxkbid0IGdldCBwYXJzZWQgZm9yIHdoYXRldmVyIHJlYXNvbiwKQEAgLTYxOSw3ICs2NDEsNyBAQAogICAgIGlmKCFiYWRjb29raWUgJiYgIWNvLT5kb21haW4pIHsKICAgICAgIGlmKGRvbWFpbikgewogICAgICAgICAvKiBubyBkb21haW4gd2FzIGdpdmVuIGluIHRoZSBoZWFkZXIgbGluZSwgc2V0IHRoZSBkZWZhdWx0ICovCi0gICAgICAgIGNvLT5kb21haW49c3RyZHVwKGRvbWFpbik7CisgICAgICAgIGNvLT5kb21haW4gPSBzdHJkdXAoZG9tYWluKTsKICAgICAgICAgaWYoIWNvLT5kb21haW4pCiAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgIH0KQEAgLTYzOSwxMSArNjYxLDExIEBACiAgICAgICBlbHNlCiAgICAgICAgIGVuZHNsYXNoID0gbWVtcmNocihwYXRoLCAnLycsIChzaXplX3QpKHF1ZXJ5cCAtIHBhdGgpKTsKICAgICAgIGlmKGVuZHNsYXNoKSB7Ci0gICAgICAgIHNpemVfdCBwYXRobGVuID0gKHNpemVfdCkoZW5kc2xhc2gtcGF0aCsxKTsgLyogaW5jbHVkZSBlbmRpbmcgc2xhc2ggKi8KLSAgICAgICAgY28tPnBhdGg9bWFsbG9jKHBhdGhsZW4rMSk7IC8qIG9uZSBleHRyYSBmb3IgdGhlIHplcm8gYnl0ZSAqLworICAgICAgICBzaXplX3QgcGF0aGxlbiA9IChzaXplX3QpKGVuZHNsYXNoLXBhdGggKyAxKTsgLyogaW5jbHVkZSBlbmQgc2xhc2ggKi8KKyAgICAgICAgY28tPnBhdGggPSBtYWxsb2MocGF0aGxlbiArIDEpOyAvKiBvbmUgZXh0cmEgZm9yIHRoZSB6ZXJvIGJ5dGUgKi8KICAgICAgICAgaWYoY28tPnBhdGgpIHsKICAgICAgICAgICBtZW1jcHkoY28tPnBhdGgsIHBhdGgsIHBhdGhsZW4pOwotICAgICAgICAgIGNvLT5wYXRoW3BhdGhsZW5dPTA7IC8qIHplcm8gdGVybWluYXRlICovCisgICAgICAgICAgY28tPnBhdGhbcGF0aGxlbl0gPSAwOyAvKiB6ZXJvIHRlcm1pbmF0ZSAqLwogICAgICAgICAgIGNvLT5zcGF0aCA9IHNhbml0aXplX2Nvb2tpZV9wYXRoKGNvLT5wYXRoKTsKICAgICAgICAgICBpZighY28tPnNwYXRoKQogICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsgLyogb3V0IG9mIG1lbW9yeSBiYWQgKi8KQEAgLTY1Myw4ICs2NzUsNiBAQAogICAgICAgfQogICAgIH0KIAotICAgIGZyZWUod2hhdCk7Ci0KICAgICBpZihiYWRjb29raWUgfHwgIWNvLT5uYW1lKSB7CiAgICAgICAvKiB3ZSBkaWRuJ3QgZ2V0IGEgY29va2llIG5hbWUgb3IgYSBiYWQgb25lLAogICAgICAgICAgdGhpcyBpcyBhbiBpbGxlZ2FsIGxpbmUsIGJhaWwgb3V0ICovCkBAIC02NjgsNyArNjg4LDcgQEAKICAgICAgICByZWFkaW5nIHRoZSBvZGQgbmV0c2NhcGUgY29va2llcy1maWxlIGZvcm1hdCBoZXJlICovCiAgICAgY2hhciAqcHRyOwogICAgIGNoYXIgKmZpcnN0cHRyOwotICAgIGNoYXIgKnRva19idWY9TlVMTDsKKyAgICBjaGFyICp0b2tfYnVmID0gTlVMTDsKICAgICBpbnQgZmllbGRzOwogCiAgICAgLyogSUUgaW50cm9kdWNlZCBIVFRQLW9ubHkgY29va2llcyB0byBwcmV2ZW50IFhTUyBhdHRhY2tzLiBDb29raWVzCkBAIC02ODksMTkgKzcwOSwxOSBAQAogICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIC8qIHN0cmlwIG9mZiB0aGUgcG9zc2libGUgZW5kLW9mLWxpbmUgY2hhcmFjdGVycyAqLwotICAgIHB0cj1zdHJjaHIobGluZXB0ciwgJ1xyJyk7CisgICAgcHRyID0gc3RyY2hyKGxpbmVwdHIsICdccicpOwogICAgIGlmKHB0cikKLSAgICAgICpwdHI9MDsgLyogY2xlYXIgaXQgKi8KLSAgICBwdHI9c3RyY2hyKGxpbmVwdHIsICdcbicpOworICAgICAgKnB0ciA9IDA7IC8qIGNsZWFyIGl0ICovCisgICAgcHRyID0gc3RyY2hyKGxpbmVwdHIsICdcbicpOwogICAgIGlmKHB0cikKLSAgICAgICpwdHI9MDsgLyogY2xlYXIgaXQgKi8KKyAgICAgICpwdHIgPSAwOyAvKiBjbGVhciBpdCAqLwogCi0gICAgZmlyc3RwdHI9c3RydG9rX3IobGluZXB0ciwgIlx0IiwgJnRva19idWYpOyAvKiB0b2tlbml6ZSBpdCBvbiB0aGUgVEFCICovCisgICAgZmlyc3RwdHIgPSBzdHJ0b2tfcihsaW5lcHRyLCAiXHQiLCAmdG9rX2J1Zik7IC8qIHRva2VuaXplIGl0IG9uIHRoZSBUQUIgKi8KIAogICAgIC8qIE5vdyBsb29wIHRocm91Z2ggdGhlIGZpZWxkcyBhbmQgaW5pdCB0aGUgc3RydWN0IHdlIGFscmVhZHkgaGF2ZQogICAgICAgIGFsbG9jYXRlZCAqLwotICAgIGZvcihwdHI9Zmlyc3RwdHIsIGZpZWxkcz0wOyBwdHIgJiYgIWJhZGNvb2tpZTsKLSAgICAgICAgcHRyPXN0cnRva19yKE5VTEwsICJcdCIsICZ0b2tfYnVmKSwgZmllbGRzKyspIHsKKyAgICBmb3IocHRyID0gZmlyc3RwdHIsIGZpZWxkcyA9IDA7IHB0ciAmJiAhYmFkY29va2llOworICAgICAgICBwdHIgPSBzdHJ0b2tfcihOVUxMLCAiXHQiLCAmdG9rX2J1ZiksIGZpZWxkcysrKSB7CiAgICAgICBzd2l0Y2goZmllbGRzKSB7CiAgICAgICBjYXNlIDA6CiAgICAgICAgIGlmKHB0clswXT09Jy4nKSAvKiBza2lwIHByZWNlZGluZyBkb3RzICovCkBAIC03MTIsNyArNzMyLDcgQEAKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIDE6CiAgICAgICAgIC8qIFRoaXMgZmllbGQgZ290IGl0cyBleHBsYW5hdGlvbiBvbiB0aGUgMjNyZCBvZiBNYXkgMjAwMSBieQotICAgICAgICAgICBBbmRy6XMgR2FyY+1hOgorICAgICAgICAgICBBbmRyw6lzIEdhcmPDrWE6CiAKICAgICAgICAgICAgZmxhZzogQSBUUlVFL0ZBTFNFIHZhbHVlIGluZGljYXRpbmcgaWYgYWxsIG1hY2hpbmVzIHdpdGhpbiBhIGdpdmVuCiAgICAgICAgICAgIGRvbWFpbiBjYW4gYWNjZXNzIHRoZSB2YXJpYWJsZS4gVGhpcyB2YWx1ZSBpcyBzZXQgYXV0b21hdGljYWxseSBieQpAQCAtNzI2LDcgKzc0Niw3IEBACiAgICAgICBjYXNlIDI6CiAgICAgICAgIC8qIEl0IHR1cm5zIG91dCwgdGhhdCBzb21ldGltZXMgdGhlIGZpbGUgZm9ybWF0IGFsbG93cyB0aGUgcGF0aAogICAgICAgICAgICBmaWVsZCB0byByZW1haW4gbm90IGZpbGxlZCBpbiwgd2UgdHJ5IHRvIGRldGVjdCB0aGlzIGFuZCB3b3JrCi0gICAgICAgICAgIGFyb3VuZCBpdCEgQW5kculzIEdhcmPtYSBtYWRlIHVzIGF3YXJlIG9mIHRoaXMuLi4gKi8KKyAgICAgICAgICAgYXJvdW5kIGl0ISBBbmRyw6lzIEdhcmPDrWEgbWFkZSB1cyBhd2FyZSBvZiB0aGlzLi4uICovCiAgICAgICAgIGlmKHN0cmNtcCgiVFJVRSIsIHB0cikgJiYgc3RyY21wKCJGQUxTRSIsIHB0cikpIHsKICAgICAgICAgICAvKiBvbmx5IGlmIHRoZSBwYXRoIGRvZXNuJ3QgbG9vayBsaWtlIGEgYm9vbGVhbiBvcHRpb24hICovCiAgICAgICAgICAgY28tPnBhdGggPSBzdHJkdXAocHRyKTsKQEAgLTc1Myw3ICs3NzMsOCBAQAogICAgICAgICBjby0+c2VjdXJlID0gc3RyY2FzZWNvbXBhcmUocHRyLCAiVFJVRSIpP1RSVUU6RkFMU0U7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSA0OgotICAgICAgICBjby0+ZXhwaXJlcyA9IGN1cmx4X3N0cnRvb2ZmdChwdHIsIE5VTEwsIDEwKTsKKyAgICAgICAgaWYoY3VybHhfc3RydG9vZmZ0KHB0ciwgTlVMTCwgMTAsICZjby0+ZXhwaXJlcykpCisgICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIDU6CiAgICAgICAgIGNvLT5uYW1lID0gc3RyZHVwKHB0cik7CkBAIC04MjgsNyArODQ5LDcgQEAKICAgICAgICAgaWYoc3RyY2FzZWNvbXBhcmUoY2xpc3QtPmRvbWFpbiwgY28tPmRvbWFpbikgJiYKICAgICAgICAgICAoY2xpc3QtPnRhaWxtYXRjaCA9PSBjby0+dGFpbG1hdGNoKSkKICAgICAgICAgICAvKiBUaGUgZG9tYWlucyBhcmUgaWRlbnRpY2FsICovCi0gICAgICAgICAgcmVwbGFjZV9vbGQ9VFJVRTsKKyAgICAgICAgICByZXBsYWNlX29sZCA9IFRSVUU7CiAgICAgICB9CiAgICAgICBlbHNlIGlmKCFjbGlzdC0+ZG9tYWluICYmICFjby0+ZG9tYWluKQogICAgICAgICByZXBsYWNlX29sZCA9IFRSVUU7CkBAIC05NTcsNyArOTc4LDcgQEAKIHsKICAgc3RydWN0IENvb2tpZUluZm8gKmM7CiAgIEZJTEUgKmZwID0gTlVMTDsKLSAgYm9vbCBmcm9tZmlsZT1UUlVFOworICBib29sIGZyb21maWxlID0gVFJVRTsKICAgY2hhciAqbGluZSA9IE5VTEw7CiAKICAgaWYoTlVMTCA9PSBpbmMpIHsKQEAgLTk3Nyw3ICs5OTgsNyBAQAogCiAgIGlmKGZpbGUgJiYgIXN0cmNtcChmaWxlLCAiLSIpKSB7CiAgICAgZnAgPSBzdGRpbjsKLSAgICBmcm9tZmlsZT1GQUxTRTsKKyAgICBmcm9tZmlsZSA9IEZBTFNFOwogICB9CiAgIGVsc2UgaWYoZmlsZSAmJiAhKmZpbGUpIHsKICAgICAvKiBwb2ludHMgdG8gYSAiIiBzdHJpbmcgKi8KQEAgLTk5OCwxMiArMTAxOSwxMiBAQAogICAgIHdoaWxlKGdldF9saW5lKGxpbmUsIE1BWF9DT09LSUVfTElORSwgZnApKSB7CiAgICAgICBpZihjaGVja3ByZWZpeCgiU2V0LUNvb2tpZToiLCBsaW5lKSkgewogICAgICAgICAvKiBUaGlzIGlzIGEgY29va2llIGxpbmUsIGdldCBpdCEgKi8KLSAgICAgICAgbGluZXB0cj0mbGluZVsxMV07Ci0gICAgICAgIGhlYWRlcmxpbmU9VFJVRTsKKyAgICAgICAgbGluZXB0ciA9ICZsaW5lWzExXTsKKyAgICAgICAgaGVhZGVybGluZSA9IFRSVUU7CiAgICAgICB9CiAgICAgICBlbHNlIHsKLSAgICAgICAgbGluZXB0cj1saW5lOwotICAgICAgICBoZWFkZXJsaW5lPUZBTFNFOworICAgICAgICBsaW5lcHRyID0gbGluZTsKKyAgICAgICAgaGVhZGVybGluZSA9IEZBTFNFOwogICAgICAgfQogICAgICAgd2hpbGUoKmxpbmVwdHIgJiYgSVNCTEFOSygqbGluZXB0cikpCiAgICAgICAgIGxpbmVwdHIrKzsKQEAgLTExMTMsNyArMTEzNCw3IEBACiAgIHN0cnVjdCBDb29raWUgKm5ld2NvOwogICBzdHJ1Y3QgQ29va2llICpjbzsKICAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7Ci0gIHN0cnVjdCBDb29raWUgKm1haW5jbz1OVUxMOworICBzdHJ1Y3QgQ29va2llICptYWluY28gPSBOVUxMOwogICBzaXplX3QgbWF0Y2hlcyA9IDA7CiAgIGJvb2wgaXNfaXA7CiAKQEAgLTExODUsNyArMTIwNiw3IEBACiAKICAgICBjbyA9IG1haW5jbzsKIAotICAgIGZvcihpPTA7IGNvOyBjbyA9IGNvLT5uZXh0KQorICAgIGZvcihpID0gMDsgY287IGNvID0gY28tPm5leHQpCiAgICAgICBhcnJheVtpKytdID0gY287CiAKICAgICAvKiBub3cgc29ydCB0aGUgY29va2llIHBvaW50ZXJzIGluIHBhdGggbGVuZ3RoIG9yZGVyICovCkBAIC0xMTk0LDggKzEyMTUsOCBAQAogICAgIC8qIHJlbWFrZSB0aGUgbGlua2VkIGxpc3Qgb3JkZXIgYWNjb3JkaW5nIHRvIHRoZSBuZXcgb3JkZXIgKi8KIAogICAgIG1haW5jbyA9IGFycmF5WzBdOyAvKiBzdGFydCBoZXJlICovCi0gICAgZm9yKGk9MDsgaTxtYXRjaGVzLTE7IGkrKykKLSAgICAgIGFycmF5W2ldLT5uZXh0ID0gYXJyYXlbaSsxXTsKKyAgICBmb3IoaSA9IDA7IGk8bWF0Y2hlcy0xOyBpKyspCisgICAgICBhcnJheVtpXS0+bmV4dCA9IGFycmF5W2kgKyAxXTsKICAgICBhcnJheVttYXRjaGVzLTFdLT5uZXh0ID0gTlVMTDsgLyogdGVybWluYXRlIHRoZSBsaXN0ICovCiAKICAgICBmcmVlKGFycmF5KTsgLyogcmVtb3ZlIHRoZSB0ZW1wb3JhcnkgZGF0YSBhZ2FpbiAqLwpAQCAtMTMzNSw3ICsxMzU2LDcgQEAKIHsKICAgc3RydWN0IENvb2tpZSAqY287CiAgIEZJTEUgKm91dDsKLSAgYm9vbCB1c2Vfc3Rkb3V0PUZBTFNFOworICBib29sIHVzZV9zdGRvdXQgPSBGQUxTRTsKICAgY2hhciAqZm9ybWF0X3B0cjsKIAogICBpZigoTlVMTCA9PSBjKSB8fCAoMCA9PSBjLT5udW1jb29raWVzKSkKQEAgLTEzNDksNyArMTM3MCw3IEBACiAgIGlmKCFzdHJjbXAoIi0iLCBkdW1waGVyZSkpIHsKICAgICAvKiB1c2Ugc3Rkb3V0ICovCiAgICAgb3V0ID0gc3Rkb3V0OwotICAgIHVzZV9zdGRvdXQ9VFJVRTsKKyAgICB1c2Vfc3Rkb3V0ID0gVFJVRTsKICAgfQogICBlbHNlIHsKICAgICBvdXQgPSBmb3BlbihkdW1waGVyZSwgRk9QRU5fV1JJVEVURVhUKTsKQEAgLTEzODIsNyArMTQwMyw3IEBACiAgIHJldHVybiAwOwogfQogCi1zdHJ1Y3QgY3VybF9zbGlzdCAqQ3VybF9jb29raWVfbGlzdChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKQorc3RhdGljIHN0cnVjdCBjdXJsX3NsaXN0ICpjb29raWVfbGlzdChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKQogewogICBzdHJ1Y3QgY3VybF9zbGlzdCAqbGlzdCA9IE5VTEw7CiAgIHN0cnVjdCBjdXJsX3NsaXN0ICpiZWc7CkBAIC0xNDEzLDYgKzE0MzQsMTUgQEAKICAgcmV0dXJuIGxpc3Q7CiB9CiAKK3N0cnVjdCBjdXJsX3NsaXN0ICpDdXJsX2Nvb2tpZV9saXN0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCit7CisgIHN0cnVjdCBjdXJsX3NsaXN0ICpsaXN0OworICBDdXJsX3NoYXJlX2xvY2soZGF0YSwgQ1VSTF9MT0NLX0RBVEFfQ09PS0lFLCBDVVJMX0xPQ0tfQUNDRVNTX1NJTkdMRSk7CisgIGxpc3QgPSBjb29raWVfbGlzdChkYXRhKTsKKyAgQ3VybF9zaGFyZV91bmxvY2soZGF0YSwgQ1VSTF9MT0NLX0RBVEFfQ09PS0lFKTsKKyAgcmV0dXJuIGxpc3Q7Cit9CisKIHZvaWQgQ3VybF9mbHVzaF9jb29raWVzKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsIGludCBjbGVhbnVwKQogewogICBpZihkYXRhLT5zZXQuc3RyW1NUUklOR19DT09LSUVKQVJdKSB7CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jb29raWUuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2Nvb2tpZS5oCmluZGV4IGE5YTQ1NzguLmNiNTBiNzEgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2Nvb2tpZS5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2Nvb2tpZS5oCkBAIC03LDcgKzcsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC02MiwxMyArNjIsMTYgQEAKICAgIHRoYXQgY29tcHJpc2UgdGhlIGNvb2tpZSBub24tdGVybWluYWwgaW4gdGhlIHN5bnRheCBkZXNjcmlwdGlvbiBvZiB0aGUKICAgIFNldC1Db29raWUgaGVhZGVyKSIKIAorICAgV2UgYWxsb3cgbWF4IDUwMDAgYnl0ZXMgY29va2llIGhlYWRlci4gTWF4IDQwOTUgYnl0ZXMgbGVuZ3RoIHBlciBjb29raWUKKyAgIG5hbWUgYW5kIHZhbHVlLiBOYW1lICsgdmFsdWUgbWF5IG5vdCBleGNlZWQgNDA5NiBieXRlcy4KKwogKi8KICNkZWZpbmUgTUFYX0NPT0tJRV9MSU5FIDUwMDAKICNkZWZpbmUgTUFYX0NPT0tJRV9MSU5FX1RYVCAiNDk5OSIKIAotLyogVGhpcyBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb29raWUgbmFtZSB3ZSBkZWFsIHdpdGg6ICovCi0jZGVmaW5lIE1BWF9OQU1FIDEwMjQKLSNkZWZpbmUgTUFYX05BTUVfVFhUICIxMDIzIgorLyogVGhpcyBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb29raWUgbmFtZSBvciBjb250ZW50IHdlIGRlYWwgd2l0aDogKi8KKyNkZWZpbmUgTUFYX05BTUUgNDA5NgorI2RlZmluZSBNQVhfTkFNRV9UWFQgIjQwOTUiCiAKIHN0cnVjdCBDdXJsX2Vhc3k7CiAvKgpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9hZGRyaW5mby5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9hZGRyaW5mby5jCmluZGV4IDFhZGYzMTkuLjZlYjI4YmIgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfYWRkcmluZm8uYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX2FkZHJpbmZvLmMKQEAgLTI4Niw3ICsyODYsNyBAQAogCiAgIERFQlVHQVNTRVJUKChoZS0+aF9uYW1lICE9IE5VTEwpICYmIChoZS0+aF9hZGRyX2xpc3QgIT0gTlVMTCkpOwogCi0gIGZvcihpPTA7IChjdXJyID0gaGUtPmhfYWRkcl9saXN0W2ldKSAhPSBOVUxMOyBpKyspIHsKKyAgZm9yKGkgPSAwOyAoY3VyciA9IGhlLT5oX2FkZHJfbGlzdFtpXSkgIT0gTlVMTDsgaSsrKSB7CiAKICAgICBzaXplX3Qgc3Nfc2l6ZTsKICNpZmRlZiBFTkFCTEVfSVBWNgpAQCAtNTcwLDkgKzU3MCw5IEBACiAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUsIGNvbnN0IGNoYXIgKnNvdXJjZSkKIHsKICNpZmRlZiBVU0VfTFdJUFNPQ0sKLSAgaW50IHJlcz1sd2lwX2dldGFkZHJpbmZvKGhvc3RuYW1lLCBzZXJ2aWNlLCBoaW50cywgcmVzdWx0KTsKKyAgaW50IHJlcyA9IGx3aXBfZ2V0YWRkcmluZm8oaG9zdG5hbWUsIHNlcnZpY2UsIGhpbnRzLCByZXN1bHQpOwogI2Vsc2UKLSAgaW50IHJlcz0oZ2V0YWRkcmluZm8pKGhvc3RuYW1lLCBzZXJ2aWNlLCBoaW50cywgcmVzdWx0KTsKKyAgaW50IHJlcyA9IChnZXRhZGRyaW5mbykoaG9zdG5hbWUsIHNlcnZpY2UsIGhpbnRzLCByZXN1bHQpOwogI2VuZGlmCiAgIGlmKDAgPT0gcmVzKQogICAgIC8qIHN1Y2Nlc3MgKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfY29uZmlnLmguY21ha2UgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX2NvbmZpZy5oLmNtYWtlCmluZGV4IGY5ZDU0YjQuLmFiZTlmZmUgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfY29uZmlnLmguY21ha2UKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9jb25maWcuaC5jbWFrZQpAQCAtNDIsOSArNDIsNiBAQAogLyogdG8gZGlzYWJsZSBSVFNQICovCiAjY21ha2VkZWZpbmUgQ1VSTF9ESVNBQkxFX1JUU1AgMQogCi0vKiB0byBkaXNhYmxlIFJUTVAgKi8KLSNjbWFrZWRlZmluZSBDVVJMX0RJU0FCTEVfUlRNUCAxCi0KIC8qIHRvIGRpc2FibGUgU01CICovCiAjY21ha2VkZWZpbmUgQ1VSTF9ESVNBQkxFX1NNQiAxCiAKQEAgLTczLDkgKzcwLDYgQEAKIC8qIHdoZW4gbm90IGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgKi8KICNjbWFrZWRlZmluZSBDVVJMX1NUQVRJQ0xJQiAxCiAKLS8qIFNldCB0byBleHBsaWNpdGx5IHNwZWNpZnkgd2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhyZWFkLXNhZmUgZnVuY3Rpb25zICovCi0jY21ha2VkZWZpbmUgRElTQUJMRURfVEhSRUFEU0FGRSAxCi0KIC8qIHlvdXIgRW50cm9weSBHYXRoZXJpbmcgRGFlbW9uIHNvY2tldCBwYXRobmFtZSAqLwogI2NtYWtlZGVmaW5lIEVHRF9TT0NLRVQgJHtFR0RfU09DS0VUfQogCkBAIC04ODUsNiArODc5LDkgQEAKIC8qIFRoZSBzaXplIG9mIGBvZmZfdCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KIEBTSVpFT0ZfT0ZGX1RfQ09ERUAKIAorLyogVGhlIHNpemUgb2YgYGN1cmxfb2ZmX3QnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCitAU0laRU9GX0NVUkxfT0ZGX1RfQ09ERUAKKwogLyogVGhlIHNpemUgb2YgYHNpemVfdCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KIEBTSVpFT0ZfU0laRV9UX0NPREVACiAKQEAgLTk2MCw5ICs5NTcsNiBAQAogLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwogI2NtYWtlZGVmaW5lIFZFUlNJT04gJHtWRVJTSU9OfQogCi0vKiBEZWZpbmUgdG8gYXZvaWQgYXV0b21hdGljIGluY2x1c2lvbiBvZiB3aW5zb2NrLmggKi8KLSNjbWFrZWRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIDEKLQogLyogRGVmaW5lIHRvIDEgaWYgT1MgaXMgQUlYLiAqLwogI2lmbmRlZiBfQUxMX1NPVVJDRQogIyAgdW5kZWYgX0FMTF9TT1VSQ0UKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfZm5tYXRjaC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9mbm1hdGNoLmMKaW5kZXggNDZkM2FkYS4uNjMxMjY4YiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9mbm1hdGNoLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9mbm1hdGNoLmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTE1MSw3ICsxNTEsNyBAQAogICAgICAgICAoKnApKys7CiAgICAgICB9CiAgICAgICBlbHNlIGlmKGMgPT0gJ1snKSB7Ci0gICAgICAgIGNoYXIgYzIgPSAqKCgqcCkrMSk7CisgICAgICAgIGNoYXIgYzIgPSAqKCgqcCkgKyAxKTsKICAgICAgICAgaWYoYzIgPT0gJzonKSB7IC8qIHRoZXJlIGhhcyB0byBiZSBhIGtleXdvcmQgKi8KICAgICAgICAgICAoKnApICs9IDI7CiAgICAgICAgICAgaWYocGFyc2VrZXl3b3JkKHAsIGNoYXJzZXQpKSB7CkBAIC0zMTksOSArMzE5LDkgQEAKICAgICBzd2l0Y2goc3RhdGUpIHsKICAgICBjYXNlIENVUkxGTk1fTE9PUF9ERUZBVUxUOgogICAgICAgaWYoKnAgPT0gJyonKSB7Ci0gICAgICAgIHdoaWxlKCoocCsxKSA9PSAnKicpIC8qIGVsaW1pbmF0ZSBtdWx0aXBsZSBzdGFycyAqLworICAgICAgICB3aGlsZSgqKHAgKyAxKSA9PSAnKicpIC8qIGVsaW1pbmF0ZSBtdWx0aXBsZSBzdGFycyAqLwogICAgICAgICAgIHArKzsKLSAgICAgICAgaWYoKnMgPT0gJ1wwJyAmJiAqKHArMSkgPT0gJ1wwJykKKyAgICAgICAgaWYoKnMgPT0gJ1wwJyAmJiAqKHAgKyAxKSA9PSAnXDAnKQogICAgICAgICAgIHJldHVybiBDVVJMX0ZOTUFUQ0hfTUFUQ0g7CiAgICAgICAgIHJjID0gbG9vcChwICsgMSwgcyk7IC8qICoudHh0IG1hdGNoZXMgLnR4dCA8PT4gLnR4dCBtYXRjaGVzIC50eHQgKi8KICAgICAgICAgaWYocmMgPT0gQ1VSTF9GTk1BVENIX01BVENIKQpAQCAtMzUxLDcgKzM1MSw3IEBACiAgICAgICAgIHArKzsKICAgICAgIH0KICAgICAgIGVsc2UgaWYoKnAgPT0gJ1snKSB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKnBwID0gcCsxOyAvKiBjYW5ub3QgaGFuZGxlIHdpdGggcG9pbnRlciB0byByZWdpc3RlciAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICpwcCA9IHAgKyAxOyAvKiBjYW5ub3QgaGFuZGxlIHdpdGggcG9pbnRlciB0byByZWdpc3RlciAqLwogICAgICAgICBpZihzZXRjaGFyc2V0KCZwcCwgY2hhcnNldCkpIHsKICAgICAgICAgICBpbnQgZm91bmQgPSBGQUxTRTsKICAgICAgICAgICBpZihjaGFyc2V0Wyh1bnNpZ25lZCBpbnQpKnNdKQpAQCAtMzgxLDcgKzM4MSw3IEBACiAgICAgICAgICAgICBmb3VuZCA9ICFmb3VuZDsKIAogICAgICAgICAgIGlmKGZvdW5kKSB7Ci0gICAgICAgICAgICBwID0gcHArMTsKKyAgICAgICAgICAgIHAgPSBwcCArIDE7CiAgICAgICAgICAgICBzKys7CiAgICAgICAgICAgICBtZW1zZXQoY2hhcnNldCwgMCwgQ1VSTEZOTV9DSFNFVF9TSVpFKTsKICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX250bG1fY29yZS5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9udGxtX2NvcmUuYwppbmRleCBhZWE1NDUyLi41MTU0OTQ5IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX250bG1fY29yZS5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfbnRsbV9jb3JlLmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTMxLDYgKzMxLDI1IEBACiAgKiBodHRwczovL3d3dy5pbm5vdmF0aW9uLmNoL2phdmEvbnRsbS5odG1sCiAgKi8KIAorLyogUGxlYXNlIGtlZXAgdGhlIFNTTCBiYWNrZW5kLXNwZWNpZmljICNpZiBicmFuY2hlcyBpbiB0aGlzIG9yZGVyOgorCisgICAxLiBVU0VfT1BFTlNTTAorICAgMi4gVVNFX0dOVVRMU19ORVRUTEUKKyAgIDMuIFVTRV9HTlVUTFMKKyAgIDQuIFVTRV9OU1MKKyAgIDUuIFVTRV9NQkVEVExTCisgICA2LiBVU0VfREFSV0lOU1NMCisgICA3LiBVU0VfT1M0MDBDUllQVE8KKyAgIDguIFVTRV9XSU4zMl9DUllQVE8KKworICAgVGhpcyBlbnN1cmVzIHRoYXQ6CisgICAtIHRoZSBzYW1lIFNTTCBicmFuY2ggZ2V0cyBhY3RpdmF0ZWQgdGhyb3VnaG91dCB0aGlzIHNvdXJjZQorICAgICBmaWxlIGV2ZW4gaWYgbXVsdGlwbGUgYmFja2VuZHMgYXJlIGVuYWJsZWQgYXQgdGhlIHNhbWUgdGltZS4KKyAgIC0gT3BlblNTTCBhbmQgTlNTIGhhdmUgaGlnaGVyIHByaW9yaXR5IHRoYW4gV2luZG93cyBDcnlwdCwgZHVlCisgICAgIHRvIGlzc3VlcyB3aXRoIHRoZSBsYXR0ZXIgc3VwcG9ydGluZyBOVExNMlNlc3Npb24gcmVzcG9uc2VzCisgICAgIGluIE5UTE0gdHlwZS0zIG1lc3NhZ2VzLgorICovCisKICNpZiAhZGVmaW5lZChVU0VfV0lORE9XU19TU1BJKSB8fCBkZWZpbmVkKFVTRV9XSU4zMl9DUllQVE8pCiAKICNpZmRlZiBVU0VfT1BFTlNTTApAQCAtNzYsMTQgKzk1LDYgQEAKICMgIGRlZmluZSBNRDVfRElHRVNUX0xFTkdUSCAxNgogIyAgZGVmaW5lIE1ENF9ESUdFU1RfTEVOR1RIIDE2CiAKLSNlbGlmIGRlZmluZWQoVVNFX01CRURUTFMpCi0KLSMgIGluY2x1ZGUgPG1iZWR0bHMvZGVzLmg+Ci0jICBpbmNsdWRlIDxtYmVkdGxzL21kNC5oPgotIyAgaWYgIWRlZmluZWQoTUJFRFRMU19NRDRfQykKLSMgICAgaW5jbHVkZSAiY3VybF9tZDQuaCIKLSMgIGVuZGlmCi0KICNlbGlmIGRlZmluZWQoVVNFX05TUykKIAogIyAgaW5jbHVkZSA8bnNzLmg+CkBAIC05Miw2ICsxMDMsMTQgQEAKICMgIGluY2x1ZGUgImN1cmxfbWQ0LmgiCiAjICBkZWZpbmUgTUQ1X0RJR0VTVF9MRU5HVEggTUQ1X0xFTkdUSAogCisjZWxpZiBkZWZpbmVkKFVTRV9NQkVEVExTKQorCisjICBpbmNsdWRlIDxtYmVkdGxzL2Rlcy5oPgorIyAgaW5jbHVkZSA8bWJlZHRscy9tZDQuaD4KKyMgIGlmICFkZWZpbmVkKE1CRURUTFNfTUQ0X0MpCisjICAgIGluY2x1ZGUgImN1cmxfbWQ0LmgiCisjICBlbmRpZgorCiAjZWxpZiBkZWZpbmVkKFVTRV9EQVJXSU5TU0wpCiAKICMgIGluY2x1ZGUgPENvbW1vbkNyeXB0by9Db21tb25DcnlwdG9yLmg+CkBAIC0xOTYsMjYgKzIxNSw2IEBACiAgIGdjcnlfY2lwaGVyX3NldGtleSgqZGVzLCBrZXksIHNpemVvZihrZXkpKTsKIH0KIAotI2VsaWYgZGVmaW5lZChVU0VfTUJFRFRMUykKLQotc3RhdGljIGJvb2wgZW5jcnlwdF9kZXMoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleV81NikKLXsKLSAgbWJlZHRsc19kZXNfY29udGV4dCBjdHg7Ci0gIGNoYXIga2V5WzhdOwotCi0gIC8qIEV4cGFuZCB0aGUgNTYtYml0IGtleSB0byA2NC1iaXRzICovCi0gIGV4dGVuZF9rZXlfNTZfdG9fNjQoa2V5XzU2LCBrZXkpOwotCi0gIC8qIFNldCB0aGUga2V5IHBhcml0eSB0byBvZGQgKi8KLSAgbWJlZHRsc19kZXNfa2V5X3NldF9wYXJpdHkoKHVuc2lnbmVkIGNoYXIgKikga2V5KTsKLQotICAvKiBQZXJmb3JtIHRoZSBlbmNyeXB0aW9uICovCi0gIG1iZWR0bHNfZGVzX2luaXQoJmN0eCk7Ci0gIG1iZWR0bHNfZGVzX3NldGtleV9lbmMoJmN0eCwgKHVuc2lnbmVkIGNoYXIgKikga2V5KTsKLSAgcmV0dXJuIG1iZWR0bHNfZGVzX2NyeXB0X2VjYigmY3R4LCBpbiwgb3V0KSA9PSAwOwotfQotCiAjZWxpZiBkZWZpbmVkKFVTRV9OU1MpCiAKIC8qCkBAIC0yODEsNiArMjgwLDI2IEBACiAgIHJldHVybiBydjsKIH0KIAorI2VsaWYgZGVmaW5lZChVU0VfTUJFRFRMUykKKworc3RhdGljIGJvb2wgZW5jcnlwdF9kZXMoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleV81NikKK3sKKyAgbWJlZHRsc19kZXNfY29udGV4dCBjdHg7CisgIGNoYXIga2V5WzhdOworCisgIC8qIEV4cGFuZCB0aGUgNTYtYml0IGtleSB0byA2NC1iaXRzICovCisgIGV4dGVuZF9rZXlfNTZfdG9fNjQoa2V5XzU2LCBrZXkpOworCisgIC8qIFNldCB0aGUga2V5IHBhcml0eSB0byBvZGQgKi8KKyAgbWJlZHRsc19kZXNfa2V5X3NldF9wYXJpdHkoKHVuc2lnbmVkIGNoYXIgKikga2V5KTsKKworICAvKiBQZXJmb3JtIHRoZSBlbmNyeXB0aW9uICovCisgIG1iZWR0bHNfZGVzX2luaXQoJmN0eCk7CisgIG1iZWR0bHNfZGVzX3NldGtleV9lbmMoJmN0eCwgKHVuc2lnbmVkIGNoYXIgKikga2V5KTsKKyAgcmV0dXJuIG1iZWR0bHNfZGVzX2NyeXB0X2VjYigmY3R4LCBpbiwgb3V0KSA9PSAwOworfQorCiAjZWxpZiBkZWZpbmVkKFVTRV9EQVJXSU5TU0wpCiAKIHN0YXRpYyBib29sIGVuY3J5cHRfZGVzKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCkBAIC00MjgsNyArNDQ3LDcgQEAKICAgc2V0dXBfZGVzX2tleShrZXlzICsgMTQsICZkZXMpOwogICBnY3J5X2NpcGhlcl9lbmNyeXB0KGRlcywgcmVzdWx0cyArIDE2LCA4LCBwbGFpbnRleHQsIDgpOwogICBnY3J5X2NpcGhlcl9jbG9zZShkZXMpOwotI2VsaWYgZGVmaW5lZChVU0VfTUJFRFRMUykgfHwgZGVmaW5lZChVU0VfTlNTKSB8fCBkZWZpbmVkKFVTRV9EQVJXSU5TU0wpIFwKKyNlbGlmIGRlZmluZWQoVVNFX05TUykgfHwgZGVmaW5lZChVU0VfTUJFRFRMUykgfHwgZGVmaW5lZChVU0VfREFSV0lOU1NMKSBcCiAgIHx8IGRlZmluZWQoVVNFX09TNDAwQ1JZUFRPKSB8fCBkZWZpbmVkKFVTRV9XSU4zMl9DUllQVE8pCiAgIGVuY3J5cHRfZGVzKHBsYWludGV4dCwgcmVzdWx0cywga2V5cyk7CiAgIGVuY3J5cHRfZGVzKHBsYWludGV4dCwgcmVzdWx0cyArIDgsIGtleXMgKyA3KTsKQEAgLTQ5Miw3ICs1MTEsNyBAQAogICAgIHNldHVwX2Rlc19rZXkocHcgKyA3LCAmZGVzKTsKICAgICBnY3J5X2NpcGhlcl9lbmNyeXB0KGRlcywgbG1idWZmZXIgKyA4LCA4LCBtYWdpYywgOCk7CiAgICAgZ2NyeV9jaXBoZXJfY2xvc2UoZGVzKTsKLSNlbGlmIGRlZmluZWQoVVNFX01CRURUTFMpIHx8IGRlZmluZWQoVVNFX05TUykgfHwgZGVmaW5lZChVU0VfREFSV0lOU1NMKSBcCisjZWxpZiBkZWZpbmVkKFVTRV9OU1MpIHx8IGRlZmluZWQoVVNFX01CRURUTFMpIHx8IGRlZmluZWQoVVNFX0RBUldJTlNTTCkgXAogICB8fCBkZWZpbmVkKFVTRV9PUzQwMENSWVBUTykgfHwgZGVmaW5lZChVU0VfV0lOMzJfQ1JZUFRPKQogICAgIGVuY3J5cHRfZGVzKG1hZ2ljLCBsbWJ1ZmZlciwgcHcpOwogICAgIGVuY3J5cHRfZGVzKG1hZ2ljLCBsbWJ1ZmZlciArIDgsIHB3ICsgNyk7CkBAIC01NzEsMTMgKzU5MCwxOCBAQAogICAgIGdjcnlfbWRfd3JpdGUoTUQ0cHcsIHB3LCAyICogbGVuKTsKICAgICBtZW1jcHkobnRidWZmZXIsIGdjcnlfbWRfcmVhZChNRDRwdywgMCksIE1ENF9ESUdFU1RfTEVOR1RIKTsKICAgICBnY3J5X21kX2Nsb3NlKE1ENHB3KTsKLSNlbGlmIGRlZmluZWQoVVNFX05TUykgfHwgZGVmaW5lZChVU0VfT1M0MDBDUllQVE8pIHx8IFwKLSAgICAoZGVmaW5lZChVU0VfTUJFRFRMUykgJiYgIWRlZmluZWQoTUJFRFRMU19NRDRfQykpCisjZWxpZiBkZWZpbmVkKFVTRV9OU1MpCiAgICAgQ3VybF9tZDRpdChudGJ1ZmZlciwgcHcsIDIgKiBsZW4pOwogI2VsaWYgZGVmaW5lZChVU0VfTUJFRFRMUykKKyNpZiBkZWZpbmVkKE1CRURUTFNfTUQ0X0MpCiAgICAgbWJlZHRsc19tZDQocHcsIDIgKiBsZW4sIG50YnVmZmVyKTsKKyNlbHNlCisgICAgQ3VybF9tZDRpdChudGJ1ZmZlciwgcHcsIDIgKiBsZW4pOworI2VuZGlmCiAjZWxpZiBkZWZpbmVkKFVTRV9EQVJXSU5TU0wpCiAgICAgKHZvaWQpQ0NfTUQ0KHB3LCAoQ0NfTE9ORykoMiAqIGxlbiksIG50YnVmZmVyKTsKKyNlbGlmIGRlZmluZWQoVVNFX09TNDAwQ1JZUFRPKQorICAgIEN1cmxfbWQ0aXQobnRidWZmZXIsIHB3LCAyICogbGVuKTsKICNlbGlmIGRlZmluZWQoVVNFX1dJTjMyX0NSWVBUTykKICAgICBIQ1JZUFRQUk9WIGhwcm92OwogICAgIGlmKENyeXB0QWNxdWlyZUNvbnRleHQoJmhwcm92LCBOVUxMLCBOVUxMLCBQUk9WX1JTQV9GVUxMLApAQCAtNzgwLDcgKzgwNCw3IEBACiAKICAgLyogQ29uY2F0ZW5hdGUgdGhlIEhNQUMgTUQ1IG91dHB1dCAgd2l0aCB0aGUgY2xpZW50IG5vbmNlICovCiAgIG1lbWNweShsbXJlc3AsIGhtYWNfb3V0cHV0LCAxNik7Ci0gIG1lbWNweShsbXJlc3ArMTYsIGNoYWxsZW5nZV9jbGllbnQsIDgpOworICBtZW1jcHkobG1yZXNwICsgMTYsIGNoYWxsZW5nZV9jbGllbnQsIDgpOwogCiAgIHJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX250bG1fY29yZS5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9udGxtX2NvcmUuaAppbmRleCA0YTgzZDQwLi4wN2VmNWRlIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX250bG1fY29yZS5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfbnRsbV9jb3JlLmgKQEAgLTI2LDEzICsyNiwxOSBAQAogCiAjaWYgZGVmaW5lZChVU0VfTlRMTSkKIAorLyogSWYgTlNTIGlzIHRoZSBmaXJzdCBhdmFpbGFibGUgU1NMIGJhY2tlbmQgKHNlZSBvcmRlciBpbiBjdXJsX250bG1fY29yZS5jKQorICAgdGhlbiBpdCBtdXN0IGJlIGluaXRpYWxpemVkIHRvIGJlIHVzZWQgYnkgTlRMTS4gKi8KKyNpZiAhZGVmaW5lZChVU0VfT1BFTlNTTCkgJiYgXAorICAgICFkZWZpbmVkKFVTRV9HTlVUTFNfTkVUVExFKSAmJiBcCisgICAgIWRlZmluZWQoVVNFX0dOVVRMUykgJiYgXAorICAgIGRlZmluZWQoVVNFX05TUykKKyNkZWZpbmUgTlRMTV9ORUVEU19OU1NfSU5JVAorI2VuZGlmCisKICNpZiAhZGVmaW5lZChVU0VfV0lORE9XU19TU1BJKSB8fCBkZWZpbmVkKFVTRV9XSU4zMl9DUllQVE8pCiAKICNpZmRlZiBVU0VfT1BFTlNTTAotIyAgaWYgIWRlZmluZWQoT1BFTlNTTF9WRVJTSU9OX05VTUJFUikgJiYgXAotICAgICAgIWRlZmluZWQoSEVBREVSX1NTTF9IKSAmJiAhZGVmaW5lZChIRUFERVJfTUQ1X0gpCi0jICAgIGVycm9yICJjdXJsX250bG1fY29yZS5oIHNoYWxsIG5vdCBiZSBpbmNsdWRlZCBiZWZvcmUgT3BlblNTTCBoZWFkZXJzLiIKLSMgIGVuZGlmCisjICBpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgogI2VuZGlmCiAKIC8qIERlZmluZSBVU0VfTlRSRVNQT05TRVMgaW4gb3JkZXIgdG8gbWFrZSB0aGUgdHlwZS0zIG1lc3NhZ2UgaW5jbHVkZQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9udGxtX3diLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX250bG1fd2IuYwppbmRleCA5ZjViODdiLi4wM2Y0N2EzIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX250bG1fd2IuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX250bG1fd2IuYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgInNlbmRmLmgiCiAjaW5jbHVkZSAic2VsZWN0LmgiCiAjaW5jbHVkZSAidmF1dGgvbnRsbS5oIgorI2luY2x1ZGUgImN1cmxfbnRsbV9jb3JlLmgiCiAjaW5jbHVkZSAiY3VybF9udGxtX3diLmgiCiAjaW5jbHVkZSAidXJsLmgiCiAjaW5jbHVkZSAic3RyZXJyb3IuaCIKQEAgLTEyMyw3ICsxMjQsNiBAQAogICBzdHJ1Y3QgcGFzc3dkIHB3LCAqcHdfcmVzOwogICBjaGFyIHB3YnVmWzEwMjRdOwogI2VuZGlmCi0gIGludCBlcnJvcjsKIAogICAvKiBSZXR1cm4gaWYgY29tbXVuaWNhdGlvbiB3aXRoIG50bG1fYXV0aCBhbHJlYWR5IHNldCB1cCAqLwogICBpZihjb25uLT5udGxtX2F1dGhfaGxwcl9zb2NrZXQgIT0gQ1VSTF9TT0NLRVRfQkFEIHx8CkBAIC0xNzgsMjYgKzE3OCwyMyBAQAogICAgIG50bG1fYXV0aCA9IE5UTE1fV0JfRklMRTsKIAogICBpZihhY2Nlc3MobnRsbV9hdXRoLCBYX09LKSAhPSAwKSB7Ci0gICAgZXJyb3IgPSBFUlJOTzsKICAgICBmYWlsZihjb25uLT5kYXRhLCAiQ291bGQgbm90IGFjY2VzcyBudGxtX2F1dGg6ICVzIGVycm5vICVkOiAlcyIsCi0gICAgICAgICAgbnRsbV9hdXRoLCBlcnJvciwgQ3VybF9zdHJlcnJvcihjb25uLCBlcnJvcikpOworICAgICAgICAgIG50bG1fYXV0aCwgZXJybm8sIEN1cmxfc3RyZXJyb3IoY29ubiwgZXJybm8pKTsKICAgICBnb3RvIGRvbmU7CiAgIH0KIAogICBpZihzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBzb2NrZmRzKSkgewotICAgIGVycm9yID0gRVJSTk87CiAgICAgZmFpbGYoY29ubi0+ZGF0YSwgIkNvdWxkIG5vdCBvcGVuIHNvY2tldCBwYWlyLiBlcnJubyAlZDogJXMiLAotICAgICAgICAgIGVycm9yLCBDdXJsX3N0cmVycm9yKGNvbm4sIGVycm9yKSk7CisgICAgICAgICAgZXJybm8sIEN1cmxfc3RyZXJyb3IoY29ubiwgZXJybm8pKTsKICAgICBnb3RvIGRvbmU7CiAgIH0KIAogICBjaGlsZF9waWQgPSBmb3JrKCk7CiAgIGlmKGNoaWxkX3BpZCA9PSAtMSkgewotICAgIGVycm9yID0gRVJSTk87CiAgICAgc2Nsb3NlKHNvY2tmZHNbMF0pOwogICAgIHNjbG9zZShzb2NrZmRzWzFdKTsKICAgICBmYWlsZihjb25uLT5kYXRhLCAiQ291bGQgbm90IGZvcmsuIGVycm5vICVkOiAlcyIsCi0gICAgICAgICAgZXJyb3IsIEN1cmxfc3RyZXJyb3IoY29ubiwgZXJyb3IpKTsKKyAgICAgICAgICBlcnJubywgQ3VybF9zdHJlcnJvcihjb25uLCBlcnJubykpOwogICAgIGdvdG8gZG9uZTsKICAgfQogICBlbHNlIGlmKCFjaGlsZF9waWQpIHsKQEAgLTIwOCwxNiArMjA1LDE0IEBACiAgICAgLyogRG9uJ3QgdXNlIHNjbG9zZSBpbiB0aGUgY2hpbGQgc2luY2UgaXQgZm9vbHMgdGhlIHNvY2tldCBsZWFrIGRldGVjdG9yICovCiAgICAgc2Nsb3NlX25vbG9nKHNvY2tmZHNbMF0pOwogICAgIGlmKGR1cDIoc29ja2Zkc1sxXSwgU1RESU5fRklMRU5PKSA9PSAtMSkgewotICAgICAgZXJyb3IgPSBFUlJOTzsKICAgICAgIGZhaWxmKGNvbm4tPmRhdGEsICJDb3VsZCBub3QgcmVkaXJlY3QgY2hpbGQgc3RkaW4uIGVycm5vICVkOiAlcyIsCi0gICAgICAgICAgICBlcnJvciwgQ3VybF9zdHJlcnJvcihjb25uLCBlcnJvcikpOworICAgICAgICAgICAgZXJybm8sIEN1cmxfc3RyZXJyb3IoY29ubiwgZXJybm8pKTsKICAgICAgIGV4aXQoMSk7CiAgICAgfQogCiAgICAgaWYoZHVwMihzb2NrZmRzWzFdLCBTVERPVVRfRklMRU5PKSA9PSAtMSkgewotICAgICAgZXJyb3IgPSBFUlJOTzsKICAgICAgIGZhaWxmKGNvbm4tPmRhdGEsICJDb3VsZCBub3QgcmVkaXJlY3QgY2hpbGQgc3Rkb3V0LiBlcnJubyAlZDogJXMiLAotICAgICAgICAgICAgZXJyb3IsIEN1cmxfc3RyZXJyb3IoY29ubiwgZXJyb3IpKTsKKyAgICAgICAgICAgIGVycm5vLCBDdXJsX3N0cmVycm9yKGNvbm4sIGVycm5vKSk7CiAgICAgICBleGl0KDEpOwogICAgIH0KIApAQCAtMjM1LDEwICsyMzAsOSBAQAogICAgICAgICAgICAgIi0tdXNlcm5hbWUiLCB1c2VybmFtZSwKICAgICAgICAgICAgIE5VTEwpOwogCi0gICAgZXJyb3IgPSBFUlJOTzsKICAgICBzY2xvc2Vfbm9sb2coc29ja2Zkc1sxXSk7CiAgICAgZmFpbGYoY29ubi0+ZGF0YSwgIkNvdWxkIG5vdCBleGVjbCgpLiBlcnJubyAlZDogJXMiLAotICAgICAgICAgIGVycm9yLCBDdXJsX3N0cmVycm9yKGNvbm4sIGVycm9yKSk7CisgICAgICAgICAgZXJybm8sIEN1cmxfc3RyZXJyb3IoY29ubiwgZXJybm8pKTsKICAgICBleGl0KDEpOwogICB9CiAKQEAgLTM2NCw3ICszNTgsNyBAQAogCiAgIC8qIG5vdCBzZXQgbWVhbnMgZW1wdHkgKi8KICAgaWYoIXVzZXJwKQotICAgIHVzZXJwPSIiOworICAgIHVzZXJwID0gIiI7CiAKICAgc3dpdGNoKG50bG0tPnN0YXRlKSB7CiAgIGNhc2UgTlRMTVNUQVRFX1RZUEUxOgpAQCAtNDIwLDcgKzQxNCw3IEBACiAgICAgLyogY29ubmVjdGlvbiBpcyBhbHJlYWR5IGF1dGhlbnRpY2F0ZWQsCiAgICAgICogZG9uJ3Qgc2VuZCBhIGhlYWRlciBpbiBmdXR1cmUgcmVxdWVzdHMgKi8KICAgICBmcmVlKCphbGxvY3VzZXJwd2QpOwotICAgICphbGxvY3VzZXJwd2Q9TlVMTDsKKyAgICAqYWxsb2N1c2VycHdkID0gTlVMTDsKICAgICBhdXRocC0+ZG9uZSA9IFRSVUU7CiAgICAgYnJlYWs7CiAgIH0KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfcnRtcC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9ydG1wLmMKaW5kZXggODdhNmNhZi4uOTc0MzA2NCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9ydG1wLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9ydG1wLmMKQEAgLTc0LDYgKzc0LDcgQEAKICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KICAgcnRtcF9kaXNjb25uZWN0LCAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCisgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbl9jaGVjayAqLwogICBQT1JUX1JUTVAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX1JUTVAsICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwogICBQUk9UT1BUX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzKi8KQEAgLTk0LDYgKzk1LDcgQEAKICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KICAgcnRtcF9kaXNjb25uZWN0LCAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCisgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbl9jaGVjayAqLwogICBQT1JUX1JUTVBULCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX1JUTVBULCAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwogICBQUk9UT1BUX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzKi8KQEAgLTExNCw2ICsxMTYsNyBAQAogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICBydG1wX2Rpc2Nvbm5lY3QsICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIFBPUlRfUlRNUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fUlRNUEUsICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MqLwpAQCAtMTM0LDYgKzEzNyw3IEBACiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIHJ0bXBfZGlzY29ubmVjdCwgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9SVE1QVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCiAgIENVUkxQUk9UT19SVE1QVEUsICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFncyovCkBAIC0xNTQsNiArMTU4LDcgQEAKICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KICAgcnRtcF9kaXNjb25uZWN0LCAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCisgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbl9jaGVjayAqLwogICBQT1JUX1JUTVBTLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX1JUTVBTLCAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwogICBQUk9UT1BUX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzKi8KQEAgLTE3NCw2ICsxNzksNyBAQAogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICBydG1wX2Rpc2Nvbm5lY3QsICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIFBPUlRfUlRNUFMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fUlRNUFRTLCAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MqLwpAQCAtMjAwLDcgKzIwNiw3IEBACiAgIFJUTVAgKnIgPSBjb25uLT5wcm90by5nZW5lcmljOwogICBTRVRfUkNWVElNRU8odHYsIDEwKTsKIAotICByLT5tX3NiLnNiX3NvY2tldCA9IGNvbm4tPnNvY2tbRklSU1RTT0NLRVRdOworICByLT5tX3NiLnNiX3NvY2tldCA9IChpbnQpY29ubi0+c29ja1tGSVJTVFNPQ0tFVF07CiAKICAgLyogV2UgaGF2ZSB0byBrbm93IGlmIGl0J3MgYSB3cml0ZSBiZWZvcmUgd2Ugc2VuZCB0aGUKICAgICogY29ubmVjdCByZXF1ZXN0IHBhY2tldApkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9zYXNsLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX3Nhc2wuYwppbmRleCBiZDU3NGI1Li41NTA0MzNkIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX3Nhc2wuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX3Nhc2wuYwpAQCAtMzMxLDcgKzMzMSw4IEBACiAgICAgICBzYXNsLT5hdXRodXNlZCA9IFNBU0xfTUVDSF9OVExNOwogCiAgICAgICBpZihmb3JjZV9pciB8fCBkYXRhLT5zZXQuc2FzbF9pcikKLSAgICAgICAgcmVzdWx0ID0gQ3VybF9hdXRoX2NyZWF0ZV9udGxtX3R5cGUxX21lc3NhZ2UoY29ubi0+dXNlciwgY29ubi0+cGFzc3dkLAorICAgICAgICByZXN1bHQgPSBDdXJsX2F1dGhfY3JlYXRlX250bG1fdHlwZTFfbWVzc2FnZShkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uLT51c2VyLCBjb25uLT5wYXNzd2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25uLT5udGxtLCAmcmVzcCwgJmxlbik7CiAgICAgICB9CiAgICAgZWxzZQpAQCAtNDkzLDcgKzQ5NCw4IEBACiAjaWZkZWYgVVNFX05UTE0KICAgY2FzZSBTQVNMX05UTE06CiAgICAgLyogQ3JlYXRlIHRoZSB0eXBlLTEgbWVzc2FnZSAqLwotICAgIHJlc3VsdCA9IEN1cmxfYXV0aF9jcmVhdGVfbnRsbV90eXBlMV9tZXNzYWdlKGNvbm4tPnVzZXIsIGNvbm4tPnBhc3N3ZCwKKyAgICByZXN1bHQgPSBDdXJsX2F1dGhfY3JlYXRlX250bG1fdHlwZTFfbWVzc2FnZShkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4tPnVzZXIsIGNvbm4tPnBhc3N3ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ubi0+bnRsbSwgJnJlc3AsICZsZW4pOwogICAgIG5ld3N0YXRlID0gU0FTTF9OVExNX1RZUEUyTVNHOwogICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9zZXR1cC5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9zZXR1cC5oCmluZGV4IGE2MjY4YWQuLjU4ODBkYzAgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfc2V0dXAuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9jdXJsX3NldHVwLmgKQEAgLTcsNyArNyw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTIyLDYgKzIyLDEwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmIGRlZmluZWQoQlVJTERJTkdfTElCQ1VSTCkgJiYgIWRlZmluZWQoQ1VSTF9OT19PTERJRVMpCisjZGVmaW5lIENVUkxfTk9fT0xESUVTCisjZW5kaWYKKwogLyoKICAqIERlZmluZSBXSU4zMiB3aGVuIGJ1aWxkIHRhcmdldCBpcyBXaW4zMiBBUEkKICAqLwpAQCAtMzEsNiArMzUsMTcgQEAKICNkZWZpbmUgV0lOMzIKICNlbmRpZgogCisjaWZkZWYgV0lOMzIKKy8qCisgKiBEb24ndCBpbmNsdWRlIHVubmVlZGVkIHN0dWZmIGluIFdpbmRvd3MgaGVhZGVycyB0byBhdm9pZCBjb21waWxlcgorICogd2FybmluZ3MgYW5kIG1hY3JvIGNsYXNoZXMuCisgKiBNYWtlIHN1cmUgdG8gZGVmaW5lIHRoaXMgbWFjcm8gYmVmb3JlIGluY2x1ZGluZyBhbnkgV2luZG93cyBoZWFkZXJzLgorICovCisjICBpZm5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgorIyAgICBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorIyAgZW5kaWYKKyNlbmRpZgorCiAvKgogICogSW5jbHVkZSBjb25maWd1cmF0aW9uIHNjcmlwdCByZXN1bHRzIG9yIGhhbmQtY3JhZnRlZAogICogY29uZmlndXJhdGlvbiBmaWxlIGZvciBwbGF0Zm9ybXMgd2hpY2ggbGFjayBjb25maWcgdG9vbC4KQEAgLTEzMCwxNCArMTQ1LDcgQEAKIAogI2luY2x1ZGUgPGN1cmwvY3VybC5oPgogCi0vKgotICogRW5zdXJlIHRoYXQgbm8gb25lIGlzIHVzaW5nIHRoZSBvbGQgU0laRU9GX0NVUkxfT0ZGX1QgbWFjcm8KLSAqLwotCi0jaWZkZWYgU0laRU9GX0NVUkxfT0ZGX1QKLSMgIGVycm9yICJTSVpFT0ZfQ1VSTF9PRkZfVCBzaGFsbCBub3QgYmUgZGVmaW5lZCEiCi0gICBFcnJvciBDb21waWxhdGlvbl9hYm9ydGVkX1NJWkVPRl9DVVJMX09GRl9UX3NoYWxsX25vdF9iZV9kZWZpbmVkCi0jZW5kaWYKKyNkZWZpbmUgQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCBTSVpFT0ZfQ1VSTF9PRkZfVAogCiAvKgogICogRGlzYWJsZSBvdGhlciBwcm90b2NvbHMgd2hlbiBodHRwIGlzIHRoZSBvbmx5IG9uZSBkZXNpcmVkLgpAQCAtMTc0LDkgKzE4Miw2IEBACiAjICBpZm5kZWYgQ1VSTF9ESVNBQkxFX1NNVFAKICMgICAgZGVmaW5lIENVUkxfRElTQUJMRV9TTVRQCiAjICBlbmRpZgotIyAgaWZuZGVmIENVUkxfRElTQUJMRV9SVE1QCi0jICAgIGRlZmluZSBDVVJMX0RJU0FCTEVfUlRNUAotIyAgZW5kaWYKICMgIGlmbmRlZiBDVVJMX0RJU0FCTEVfR09QSEVSCiAjICAgIGRlZmluZSBDVVJMX0RJU0FCTEVfR09QSEVSCiAjICBlbmRpZgpAQCAtMTk1LDcgKzIwMCw3IEBACiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qIE5vIHN5c3RlbSBoZWFkZXIgZmlsZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiB0aGlzIGZpbGUgYmVmb3JlIHRoaXMgKi8KLS8qIHBvaW50LiBUaGUgb25seSBhbGxvd2VkIG9uZXMgYXJlIHRob3NlIGluY2x1ZGVkIGZyb20gY3VybGJ1aWxkLmggKi8KKy8qIHBvaW50LiBUaGUgb25seSBhbGxvd2VkIG9uZXMgYXJlIHRob3NlIGluY2x1ZGVkIGZyb20gY3VybC9zeXN0ZW0uaCAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCiAvKgpAQCAtMjQxLDkgKzI0Niw2IEBACiAjICBpZiBkZWZpbmVkKF9VTklDT0RFKSAmJiAhZGVmaW5lZChVTklDT0RFKQogIyAgICBkZWZpbmUgVU5JQ09ERQogIyAgZW5kaWYKLSMgIGlmbmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCi0jICAgIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jICBlbmRpZgogIyAgaW5jbHVkZSA8d2luZG93cy5oPgogIyAgaWZkZWYgSEFWRV9XSU5TT0NLMl9ICiAjICAgIGluY2x1ZGUgPHdpbnNvY2syLmg+CkBAIC02NTUsOSArNjU3LDggQEAKICNlbmRpZgogI2VuZGlmCiAKLS8qIG5vbi1jb25maWd1cmUgYnVpbGRzIG1heSBkZWZpbmUgQ1VSTF9XQU5UU19DQV9CVU5ETEVfRU5WICovCi0jaWYgZGVmaW5lZChDVVJMX1dBTlRTX0NBX0JVTkRMRV9FTlYpICYmICFkZWZpbmVkKENVUkxfQ0FfQlVORExFKQotI2RlZmluZSBDVVJMX0NBX0JVTkRMRSBnZXRlbnYoIkNVUkxfQ0FfQlVORExFIikKKyNpZmRlZiBDVVJMX1dBTlRTX0NBX0JVTkRMRV9FTlYKKyNlcnJvciAiTm8gbG9uZ2VyIHN1cHBvcnRlZC4gU2V0IENVUkxPUFRfQ0FJTkZPIGF0IHJ1bnRpbWUgaW5zdGVhZC4iCiAjZW5kaWYKIAogLyoKQEAgLTczMSw2ICs3MzIsNyBAQAogI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoTVNET1MpCiAjZGVmaW5lIEZPUEVOX1JFQURURVhUICJydCIKICNkZWZpbmUgRk9QRU5fV1JJVEVURVhUICJ3dCIKKyNkZWZpbmUgRk9QRU5fQVBQRU5EVEVYVCAiYXQiCiAjZWxpZiBkZWZpbmVkKF9fQ1lHV0lOX18pCiAvKiBDeWd3aW4gaGFzIHNwZWNpZmljIGJlaGF2aW9yIHdlIG5lZWQgdG8gYWRkcmVzcyB3aGVuIFdJTjMyIGlzIG5vdCBkZWZpbmVkLgogaHR0cHM6Ly9jeWd3aW4uY29tL2N5Z3dpbi11Zy1uZXQvdXNpbmctdGV4dGJpbmFyeS5odG1sCkBAIC03NDAsOSArNzQyLDExIEBACiAqLwogI2RlZmluZSBGT1BFTl9SRUFEVEVYVCAicnQiCiAjZGVmaW5lIEZPUEVOX1dSSVRFVEVYVCAidyIKKyNkZWZpbmUgRk9QRU5fQVBQRU5EVEVYVCAiYSIKICNlbHNlCiAjZGVmaW5lIEZPUEVOX1JFQURURVhUICJyIgogI2RlZmluZSBGT1BFTl9XUklURVRFWFQgInciCisjZGVmaW5lIEZPUEVOX0FQUEVORFRFWFQgImEiCiAjZW5kaWYKIAogLyogV2luU29jayBkZXN0cm95cyByZWN2KCkgYnVmZmVyIHdoZW4gc2VuZCgpIGZhaWxlZC4KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfc2V0dXBfb25jZS5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9zZXR1cF9vbmNlLmgKaW5kZXggNjg0MTg3Yy4uYTViNTQyYyAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9zZXR1cF9vbmNlLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF9zZXR1cF9vbmNlLmgKQEAgLTQzNiwyMCArNDM2LDYgQEAKIAogCiAvKgotICogTWFjcm8gRVJSTk8gLyBTRVRfRVJSTk8oKSByZXR1cm5zIC8gc2V0cyB0aGUgTk9UICpzb2NrZXQtcmVsYXRlZCogZXJybm8KLSAqIChvciBlcXVpdmFsZW50KSBvbiB0aGlzIHBsYXRmb3JtIHRvIGhpZGUgcGxhdGZvcm0gZGV0YWlscyB0byBjb2RlIHVzaW5nIGl0LgotICovCi0KLSNpZiBkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChVU0VfTFdJUFNPQ0spCi0jZGVmaW5lIEVSUk5PICAgICAgICAgKChpbnQpR2V0TGFzdEVycm9yKCkpCi0jZGVmaW5lIFNFVF9FUlJOTyh4KSAgKFNldExhc3RFcnJvcigoRFdPUkQpKHgpKSkKLSNlbHNlCi0jZGVmaW5lIEVSUk5PICAgICAgICAgKGVycm5vKQotI2RlZmluZSBTRVRfRVJSTk8oeCkgIChlcnJubyA9ICh4KSkKLSNlbmRpZgotCi0KLS8qCiAgKiBQb3J0YWJsZSBlcnJvciBudW1iZXIgc3ltYm9saWMgbmFtZXMgZGVmaW5lZCB0byBXaW5zb2NrIGVycm9yIGNvZGVzLgogICovCiAKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2N1cmxfdGhyZWFkcy5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF90aHJlYWRzLmMKaW5kZXggYTc4ZWZmNS4uYzE2MjRhOSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF90aHJlYWRzLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvY3VybF90aHJlYWRzLmMKQEAgLTEwNCwxNSArMTA0LDIyIEBACiBjdXJsX3RocmVhZF90IEN1cmxfdGhyZWFkX2NyZWF0ZSh1bnNpZ25lZCBpbnQgKENVUkxfU1REQ0FMTCAqZnVuYykgKHZvaWQgKiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpCiB7Ci0jaWZkZWYgX1dJTjMyX1dDRQotICByZXR1cm4gQ3JlYXRlVGhyZWFkKE5VTEwsIDAsIGZ1bmMsIGFyZywgMCwgTlVMTCk7Ci0jZWxzZQogICBjdXJsX3RocmVhZF90IHQ7CisjaWZkZWYgX1dJTjMyX1dDRQorICB0ID0gQ3JlYXRlVGhyZWFkKE5VTEwsIDAsIGZ1bmMsIGFyZywgMCwgTlVMTCk7CisjZWxzZQogICB0ID0gKGN1cmxfdGhyZWFkX3QpX2JlZ2ludGhyZWFkZXgoTlVMTCwgMCwgZnVuYywgYXJnLCAwLCBOVUxMKTsKLSAgaWYoKHQgPT0gMCkgfHwgKHQgPT0gKGN1cmxfdGhyZWFkX3QpLTFMKSkKLSAgICByZXR1cm4gY3VybF90aHJlYWRfdF9udWxsOwotICByZXR1cm4gdDsKICNlbmRpZgorICBpZigodCA9PSAwKSB8fCAodCA9PSBMb25nVG9IYW5kbGUoLTFMKSkpIHsKKyNpZmRlZiBfV0lOMzJfV0NFCisgICAgRFdPUkQgZ2xlID0gR2V0TGFzdEVycm9yKCk7CisgICAgZXJybm8gPSAoKGdsZSA9PSBFUlJPUl9BQ0NFU1NfREVOSUVEIHx8CisgICAgICAgICAgICAgIGdsZSA9PSBFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSkgPworICAgICAgICAgICAgIEVBQ0NFUyA6IEVJTlZBTCk7CisjZW5kaWYKKyAgICByZXR1cm4gY3VybF90aHJlYWRfdF9udWxsOworICB9CisgIHJldHVybiB0OwogfQogCiB2b2lkIEN1cmxfdGhyZWFkX2Rlc3Ryb3koY3VybF90aHJlYWRfdCBobmQpCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9kaWN0LmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9kaWN0LmMKaW5kZXggNDUxZWMzOC4uNGZjODU1MiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvZGljdC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2RpY3QuYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtODUsNiArODUsNyBAQAogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIFBPUlRfRElDVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fRElDVCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfTk9ORSB8IFBST1RPUFRfTk9VUkxRVUVSWSAgICAgIC8qIGZsYWdzICovCkBAIC05Nyw3ICs5OCw3IEBACiAgIGNoYXIgKnB0cjsKICAgc2l6ZV90IGxlbjsKICAgY2hhciBjaDsKLSAgaW50IG9sZW49MDsKKyAgaW50IG9sZW4gPSAwOwogCiAgIENVUkxjb2RlIHJlc3VsdCA9IEN1cmxfdXJsZGVjb2RlKGRhdGEsIGlucHV0YnVmZiwgMCwgJm5ld3AsICZsZW4sIEZBTFNFKTsKICAgaWYoIW5ld3AgfHwgcmVzdWx0KQpAQCAtMTE2LDcgKzExNyw3IEBACiAgICAgICB9CiAgICAgICBkaWN0cFtvbGVuKytdID0gY2g7CiAgICAgfQotICAgIGRpY3RwW29sZW5dPTA7CisgICAgZGljdHBbb2xlbl0gPSAwOwogICB9CiAgIGZyZWUobmV3cCk7CiAgIHJldHVybiBkaWN0cDsKQEAgLTEzMSw4ICsxMzIsOCBAQAogICBjaGFyICpzdHJhdGVneSA9IE5VTEw7CiAgIGNoYXIgKm50aGRlZiA9IE5VTEw7IC8qIFRoaXMgaXMgbm90IHBhcnQgb2YgdGhlIHByb3RvY29sLCBidXQgcmVxdWlyZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgUkZDIDIyMjkgKi8KLSAgQ1VSTGNvZGUgcmVzdWx0PUNVUkxFX09LOwotICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhPWNvbm4tPmRhdGE7CisgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOworICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKICAgY3VybF9zb2NrZXRfdCBzb2NrZmQgPSBjb25uLT5zb2NrW0ZJUlNUU09DS0VUXTsKIAogICBjaGFyICpwYXRoID0gZGF0YS0+c3RhdGUucGF0aDsKQEAgLTE2Nyw3ICsxNjgsNyBAQAogCiAgICAgaWYoKHdvcmQgPT0gTlVMTCkgfHwgKCp3b3JkID09IChjaGFyKTApKSB7CiAgICAgICBpbmZvZihkYXRhLCAibG9va3VwIHdvcmQgaXMgbWlzc2luZ1xuIik7Ci0gICAgICB3b3JkPShjaGFyICopImRlZmF1bHQiOworICAgICAgd29yZCA9IChjaGFyICopImRlZmF1bHQiOwogICAgIH0KICAgICBpZigoZGF0YWJhc2UgPT0gTlVMTCkgfHwgKCpkYXRhYmFzZSA9PSAoY2hhcikwKSkgewogICAgICAgZGF0YWJhc2UgPSAoY2hhciAqKSIhIjsKQEAgLTIyMSw3ICsyMjIsNyBAQAogCiAgICAgaWYoKHdvcmQgPT0gTlVMTCkgfHwgKCp3b3JkID09IChjaGFyKTApKSB7CiAgICAgICBpbmZvZihkYXRhLCAibG9va3VwIHdvcmQgaXMgbWlzc2luZ1xuIik7Ci0gICAgICB3b3JkPShjaGFyICopImRlZmF1bHQiOworICAgICAgd29yZCA9IChjaGFyICopImRlZmF1bHQiOwogICAgIH0KICAgICBpZigoZGF0YWJhc2UgPT0gTlVMTCkgfHwgKCpkYXRhYmFzZSA9PSAoY2hhcikwKSkgewogICAgICAgZGF0YWJhc2UgPSAoY2hhciAqKSIhIjsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2RvdGRvdC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvZG90ZG90LmMKaW5kZXggMjA2MDNiYy4uY2JiMzA4ZCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvZG90ZG90LmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvZG90ZG90LmMKQEAgLTU1LDcgKzU1LDcgQEAKICAgc2l6ZV90IGlubGVuID0gc3RybGVuKGlucHV0KTsKICAgY2hhciAqY2xvbmU7CiAgIHNpemVfdCBjbGVuID0gaW5sZW47IC8qIHRoZSBsZW5ndGggb2YgdGhlIGNsb25lZCBpbnB1dCAqLwotICBjaGFyICpvdXQgPSBtYWxsb2MoaW5sZW4rMSk7CisgIGNoYXIgKm91dCA9IG1hbGxvYyhpbmxlbiArIDEpOwogICBjaGFyICpvdXRwdHI7CiAgIGNoYXIgKm9yZ2Nsb25lOwogICBjaGFyICpxdWVyeXA7CkBAIC05MiwyNSArOTIsMjUgQEAKICAgICAgICAgcmVtb3ZlIHRoYXQgcHJlZml4IGZyb20gdGhlIGlucHV0IGJ1ZmZlcjsgb3RoZXJ3aXNlLCAqLwogCiAgICAgaWYoIXN0cm5jbXAoIi4vIiwgY2xvbmUsIDIpKSB7Ci0gICAgICBjbG9uZSs9MjsKLSAgICAgIGNsZW4tPTI7CisgICAgICBjbG9uZSArPSAyOworICAgICAgY2xlbiAtPSAyOwogICAgIH0KICAgICBlbHNlIGlmKCFzdHJuY21wKCIuLi8iLCBjbG9uZSwgMykpIHsKLSAgICAgIGNsb25lKz0zOwotICAgICAgY2xlbi09MzsKKyAgICAgIGNsb25lICs9IDM7CisgICAgICBjbGVuIC09IDM7CiAgICAgfQogCiAgICAgLyogIEIuICBpZiB0aGUgaW5wdXQgYnVmZmVyIGJlZ2lucyB3aXRoIGEgcHJlZml4IG9mICIvLi8iIG9yICIvLiIsIHdoZXJlCiAgICAgICAgICIuIiAgaXMgYSBjb21wbGV0ZSBwYXRoIHNlZ21lbnQsIHRoZW4gcmVwbGFjZSB0aGF0IHByZWZpeCB3aXRoICIvIiBpbgogICAgICAgICB0aGUgaW5wdXQgYnVmZmVyOyBvdGhlcndpc2UsICovCiAgICAgZWxzZSBpZighc3RybmNtcCgiLy4vIiwgY2xvbmUsIDMpKSB7Ci0gICAgICBjbG9uZSs9MjsKLSAgICAgIGNsZW4tPTI7CisgICAgICBjbG9uZSArPSAyOworICAgICAgY2xlbiAtPSAyOwogICAgIH0KICAgICBlbHNlIGlmKCFzdHJjbXAoIi8uIiwgY2xvbmUpKSB7CiAgICAgICBjbG9uZVsxXT0nLyc7CiAgICAgICBjbG9uZSsrOwotICAgICAgY2xlbi09MTsKKyAgICAgIGNsZW4gLT0gMTsKICAgICB9CiAKICAgICAvKiAgQy4gIGlmIHRoZSBpbnB1dCBidWZmZXIgYmVnaW5zIHdpdGggYSBwcmVmaXggb2YgIi8uLi8iIG9yICIvLi4iLCB3aGVyZQpAQCAtMTE5LDggKzExOSw4IEBACiAgICAgICAgIGFueSkgZnJvbSB0aGUgb3V0cHV0IGJ1ZmZlcjsgb3RoZXJ3aXNlLCAqLwogCiAgICAgZWxzZSBpZighc3RybmNtcCgiLy4uLyIsIGNsb25lLCA0KSkgewotICAgICAgY2xvbmUrPTM7Ci0gICAgICBjbGVuLT0zOworICAgICAgY2xvbmUgKz0gMzsKKyAgICAgIGNsZW4gLT0gMzsKICAgICAgIC8qIHJlbW92ZSB0aGUgbGFzdCBzZWdtZW50IGZyb20gdGhlIG91dHB1dCBidWZmZXIgKi8KICAgICAgIHdoaWxlKG91dHB0ciA+IG91dCkgewogICAgICAgICBvdXRwdHItLTsKQEAgLTEzMSw4ICsxMzEsOCBAQAogICAgIH0KICAgICBlbHNlIGlmKCFzdHJjbXAoIi8uLiIsIGNsb25lKSkgewogICAgICAgY2xvbmVbMl09Jy8nOwotICAgICAgY2xvbmUrPTI7Ci0gICAgICBjbGVuLT0yOworICAgICAgY2xvbmUgKz0gMjsKKyAgICAgIGNsZW4gLT0gMjsKICAgICAgIC8qIHJlbW92ZSB0aGUgbGFzdCBzZWdtZW50IGZyb20gdGhlIG91dHB1dCBidWZmZXIgKi8KICAgICAgIHdoaWxlKG91dHB0ciA+IG91dCkgewogICAgICAgICBvdXRwdHItLTsKQEAgLTE0Niw4ICsxNDYsOCBAQAogICAgICAgICB0aGF0IGZyb20gdGhlIGlucHV0IGJ1ZmZlcjsgb3RoZXJ3aXNlLCAqLwogCiAgICAgZWxzZSBpZighc3RyY21wKCIuIiwgY2xvbmUpIHx8ICFzdHJjbXAoIi4uIiwgY2xvbmUpKSB7Ci0gICAgICAqY2xvbmU9MDsKLSAgICAgICpvdXQ9MDsKKyAgICAgICpjbG9uZSA9IDA7CisgICAgICAqb3V0ID0gMDsKICAgICB9CiAKICAgICBlbHNlIHsKQEAgLTE3Miw3ICsxNzIsNyBAQAogICAgICAgIGZyb20gdGhlIGNvcnJlY3QgaW5kZXguICovCiAgICAgc2l6ZV90IG9pbmRleCA9IHF1ZXJ5cCAtIG9yZ2Nsb25lOwogICAgIHFsZW4gPSBzdHJsZW4oJmlucHV0W29pbmRleF0pOwotICAgIG1lbWNweShvdXRwdHIsICZpbnB1dFtvaW5kZXhdLCBxbGVuKzEpOyAvKiBpbmNsdWRlIHRoZSBlbmRpbmcgemVybyBieXRlICovCisgICAgbWVtY3B5KG91dHB0ciwgJmlucHV0W29pbmRleF0sIHFsZW4gKyAxKTsgLyogaW5jbHVkZSB0aGUgZW5kIHplcm8gYnl0ZSAqLwogICB9CiAKICAgZnJlZShvcmdjbG9uZSk7CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9lYXN5LmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9lYXN5LmMKaW5kZXggMmIxY2U5ZS4uNTMyOGY5YyAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvZWFzeS5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2Vhc3kuYwpAQCAtNDMzLDcgKzQzMyw3IEBACiAgKi8KIHN0YXRpYyBpbnQgcG9sbDJjc2VsZWN0KGludCBwb2xsbWFzaykKIHsKLSAgaW50IG9tYXNrPTA7CisgIGludCBvbWFzayA9IDA7CiAgIGlmKHBvbGxtYXNrICYgUE9MTElOKQogICAgIG9tYXNrIHw9IENVUkxfQ1NFTEVDVF9JTjsKICAgaWYocG9sbG1hc2sgJiBQT0xMT1VUKQpAQCAtNDUwLDcgKzQ1MCw3IEBACiAgKi8KIHN0YXRpYyBzaG9ydCBzb2NrZXRjYjJwb2xsKGludCBwb2xsbWFzaykKIHsKLSAgc2hvcnQgb21hc2s9MDsKKyAgc2hvcnQgb21hc2sgPSAwOwogICBpZihwb2xsbWFzayAmIENVUkxfUE9MTF9JTikKICAgICBvbWFzayB8PSBQT0xMSU47CiAgIGlmKHBvbGxtYXNrICYgQ1VSTF9QT0xMX09VVCkKQEAgLTQ3Myw3ICs0NzMsNyBAQAogewogICBzdHJ1Y3QgZXZlbnRzICpldiA9IHVzZXJwOwogICBzdHJ1Y3Qgc29ja2V0bW9uaXRvciAqbTsKLSAgc3RydWN0IHNvY2tldG1vbml0b3IgKnByZXY9TlVMTDsKKyAgc3RydWN0IHNvY2tldG1vbml0b3IgKnByZXYgPSBOVUxMOwogCiAjaWYgZGVmaW5lZChDVVJMX0RJU0FCTEVfVkVSQk9TRV9TVFJJTkdTKQogICAodm9pZCkgZWFzeTsKQEAgLTU2OSwxNCArNTY5LDE0IEBACiAgICAgc3RydWN0IHNvY2tldG1vbml0b3IgKm07CiAgICAgc3RydWN0IHBvbGxmZCAqZjsKICAgICBzdHJ1Y3QgcG9sbGZkIGZkc1s0XTsKLSAgICBpbnQgbnVtZmRzPTA7CisgICAgaW50IG51bWZkcyA9IDA7CiAgICAgaW50IHBvbGxyYzsKICAgICBpbnQgaTsKLSAgICBzdHJ1Y3QgdGltZXZhbCBiZWZvcmU7Ci0gICAgc3RydWN0IHRpbWV2YWwgYWZ0ZXI7CisgICAgc3RydWN0IGN1cmx0aW1lIGJlZm9yZTsKKyAgICBzdHJ1Y3QgY3VybHRpbWUgYWZ0ZXI7CiAKICAgICAvKiBwb3B1bGF0ZSB0aGUgZmRzW10gYXJyYXkgKi8KLSAgICBmb3IobSA9IGV2LT5saXN0LCBmPSZmZHNbMF07IG07IG0gPSBtLT5uZXh0KSB7CisgICAgZm9yKG0gPSBldi0+bGlzdCwgZiA9ICZmZHNbMF07IG07IG0gPSBtLT5uZXh0KSB7CiAgICAgICBmLT5mZCA9IG0tPnNvY2tldC5mZDsKICAgICAgIGYtPmV2ZW50cyA9IG0tPnNvY2tldC5ldmVudHM7CiAgICAgICBmLT5yZXZlbnRzID0gMDsKQEAgLTY1Myw3ICs2NTMsOSBAQAogICovCiBzdGF0aWMgQ1VSTGNvZGUgZWFzeV9ldmVudHMoc3RydWN0IEN1cmxfbXVsdGkgKm11bHRpKQogewotICBzdHJ1Y3QgZXZlbnRzIGV2cz0gezIsIEZBTFNFLCAwLCBOVUxMLCAwfTsKKyAgLyogdGhpcyBzdHJ1Y3QgaXMgbWFkZSBzdGF0aWMgdG8gYWxsb3cgaXQgdG8gYmUgdXNlZCBhZnRlciB0aGlzIGZ1bmN0aW9uCisgICAgIHJldHVybnMgYW5kIGN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSgpIGlzIGNhbGxlZCAqLworICBzdGF0aWMgc3RydWN0IGV2ZW50cyBldnMgPSB7MiwgRkFMU0UsIDAsIE5VTEwsIDB9OwogCiAgIC8qIGlmIHJ1bm5pbmcgZXZlbnQtYmFzZWQsIGRvIHNvbWUgZnVydGhlciBtdWx0aSBpbml0cyAqLwogICBldmVudHNfc2V0dXAobXVsdGksICZldnMpOwpAQCAtNjcwLDcgKzY3Miw3IEBACiAgIGJvb2wgZG9uZSA9IEZBTFNFOwogICBDVVJMTWNvZGUgbWNvZGUgPSBDVVJMTV9PSzsKICAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7Ci0gIHN0cnVjdCB0aW1ldmFsIGJlZm9yZTsKKyAgc3RydWN0IGN1cmx0aW1lIGJlZm9yZTsKICAgaW50IHdpdGhvdXRfZmRzID0gMDsgIC8qIGNvdW50IG51bWJlciBvZiBjb25zZWN1dGl2ZSByZXR1cm5zIGZyb20KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfbXVsdGlfd2FpdCgpIHdpdGhvdXQgYW55IGZpbGVkZXNjcmlwdG9ycyAqLwogCkBAIC02ODMsNyArNjg1LDcgQEAKIAogICAgIGlmKCFtY29kZSkgewogICAgICAgaWYoIXJjKSB7Ci0gICAgICAgIHN0cnVjdCB0aW1ldmFsIGFmdGVyID0gY3VybHhfdHZub3coKTsKKyAgICAgICAgc3RydWN0IGN1cmx0aW1lIGFmdGVyID0gY3VybHhfdHZub3coKTsKIAogICAgICAgICAvKiBJZiBpdCByZXR1cm5zIHdpdGhvdXQgYW55IGZpbGVkZXNjcmlwdG9yIGluc3RhbnRseSwgd2UgbmVlZCB0bwogICAgICAgICAgICBhdm9pZCBidXN5LWxvb3BpbmcgZHVyaW5nIHBlcmlvZHMgd2hlcmUgaXQgaGFzIG5vdGhpbmcgcGFydGljdWxhcgpAQCAtMTAyNSwxMyArMTAyNywxMyBAQAogICAgIHN0cnVjdCB0ZW1wYnVmIHdyaXRlYnVmWzNdOyAvKiB0aGVyZSBjYW4gb25seSBiZSB0aHJlZSAqLwogCiAgICAgLyogY29weSB0aGUgc3RydWN0cyB0byBhbGxvdyBmb3IgaW1tZWRpYXRlIHJlLXBhdXNpbmcgKi8KLSAgICBmb3IoaT0wOyBpIDwgZGF0YS0+c3RhdGUudGVtcGNvdW50OyBpKyspIHsKKyAgICBmb3IoaSA9IDA7IGkgPCBkYXRhLT5zdGF0ZS50ZW1wY291bnQ7IGkrKykgewogICAgICAgd3JpdGVidWZbaV0gPSBkYXRhLT5zdGF0ZS50ZW1wd3JpdGVbaV07CiAgICAgICBkYXRhLT5zdGF0ZS50ZW1wd3JpdGVbaV0uYnVmID0gTlVMTDsKICAgICB9CiAgICAgZGF0YS0+c3RhdGUudGVtcGNvdW50ID0gMDsKIAotICAgIGZvcihpPTA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgZm9yKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgLyogZXZlbiBpZiBvbmUgZnVuY3Rpb24gcmV0dXJucyBlcnJvciwgdGhpcyBsb29wcyB0aHJvdWdoIGFuZCBmcmVlcyBhbGwKICAgICAgICAgIGJ1ZmZlcnMgKi8KICAgICAgIGlmKCFyZXN1bHQpCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9lc2NhcGUuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2VzY2FwZS5jCmluZGV4IDk3M2FlYjYuLmI3ZTJkMzIgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2VzY2FwZS5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2VzY2FwZS5jCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC04NCwxNCArODQsMTQgQEAKICAgY2hhciAqdGVzdGluZ19wdHIgPSBOVUxMOwogICB1bnNpZ25lZCBjaGFyIGluOyAvKiB3ZSBuZWVkIHRvIHRyZWF0IHRoZSBjaGFyYWN0ZXJzIHVuc2lnbmVkICovCiAgIHNpemVfdCBuZXdsZW47Ci0gIHNpemVfdCBzdHJpbmRleD0wOworICBzaXplX3Qgc3RyaW5kZXggPSAwOwogICBzaXplX3QgbGVuZ3RoOwogICBDVVJMY29kZSByZXN1bHQ7CiAKICAgaWYoaW5sZW5ndGggPCAwKQogICAgIHJldHVybiBOVUxMOwogCi0gIGFsbG9jID0gKGlubGVuZ3RoPyhzaXplX3QpaW5sZW5ndGg6c3RybGVuKHN0cmluZykpKzE7CisgIGFsbG9jID0gKGlubGVuZ3RoPyhzaXplX3QpaW5sZW5ndGg6c3RybGVuKHN0cmluZykpICsgMTsKICAgbmV3bGVuID0gYWxsb2M7CiAKICAgbnMgPSBtYWxsb2MoYWxsb2MpOwpAQCAtMTA0LDcgKzEwNCw3IEBACiAKICAgICBpZihDdXJsX2lzdW5yZXNlcnZlZChpbikpCiAgICAgICAvKiBqdXN0IGNvcHkgdGhpcyAqLwotICAgICAgbnNbc3RyaW5kZXgrK109aW47CisgICAgICBuc1tzdHJpbmRleCsrXSA9IGluOwogICAgIGVsc2UgewogICAgICAgLyogZW5jb2RlIGl0ICovCiAgICAgICBuZXdsZW4gKz0gMjsgLyogdGhlIHNpemUgZ3Jvd3Mgd2l0aCB0d28sIHNpbmNlIHRoaXMnbGwgYmVjb21lIGEgJVhYICovCkBAIC0xMTYsNyArMTE2LDcgQEAKICAgICAgICAgbnMgPSB0ZXN0aW5nX3B0cjsKICAgICAgIH0KIAotICAgICAgcmVzdWx0ID0gQ3VybF9jb252ZXJ0X3RvX25ldHdvcmsoZGF0YSwgJmluLCAxKTsKKyAgICAgIHJlc3VsdCA9IEN1cmxfY29udmVydF90b19uZXR3b3JrKGRhdGEsIChjaGFyICopJmluLCAxKTsKICAgICAgIGlmKHJlc3VsdCkgewogICAgICAgICAvKiBDdXJsX2NvbnZlcnRfdG9fbmV0d29yayBjYWxscyBmYWlsZiBpZiB1bnN1Y2Nlc3NmdWwgKi8KICAgICAgICAgZnJlZShucyk7CkBAIC0xMjUsMTEgKzEyNSwxMSBAQAogCiAgICAgICBzbnByaW50ZigmbnNbc3RyaW5kZXhdLCA0LCAiJSUlMDJYIiwgaW4pOwogCi0gICAgICBzdHJpbmRleCs9MzsKKyAgICAgIHN0cmluZGV4ICs9IDM7CiAgICAgfQogICAgIHN0cmluZysrOwogICB9Ci0gIG5zW3N0cmluZGV4XT0wOyAvKiB0ZXJtaW5hdGUgaXQgKi8KKyAgbnNbc3RyaW5kZXhdID0gMDsgLyogdGVybWluYXRlIGl0ICovCiAgIHJldHVybiBuczsKIH0KIApAQCAtMTQ4LDEwICsxNDgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipvc3RyaW5nLCBzaXplX3QgKm9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlamVjdF9jdHJsKQogewotICBzaXplX3QgYWxsb2MgPSAobGVuZ3RoP2xlbmd0aDpzdHJsZW4oc3RyaW5nKSkrMTsKKyAgc2l6ZV90IGFsbG9jID0gKGxlbmd0aD9sZW5ndGg6c3RybGVuKHN0cmluZykpICsgMTsKICAgY2hhciAqbnMgPSBtYWxsb2MoYWxsb2MpOwogICB1bnNpZ25lZCBjaGFyIGluOwotICBzaXplX3Qgc3RyaW5kZXg9MDsKKyAgc2l6ZV90IHN0cmluZGV4ID0gMDsKICAgdW5zaWduZWQgbG9uZyBoZXg7CiAgIENVUkxjb2RlIHJlc3VsdDsKIApAQCAtMTczLDE1ICsxNzMsMTUgQEAKIAogICAgICAgaW4gPSBjdXJseF91bHRvdWMoaGV4KTsgLyogdGhpcyBsb25nIGlzIG5ldmVyIGJpZ2dlciB0aGFuIDI1NSBhbnl3YXkgKi8KIAotICAgICAgcmVzdWx0ID0gQ3VybF9jb252ZXJ0X2Zyb21fbmV0d29yayhkYXRhLCAmaW4sIDEpOworICAgICAgcmVzdWx0ID0gQ3VybF9jb252ZXJ0X2Zyb21fbmV0d29yayhkYXRhLCAoY2hhciAqKSZpbiwgMSk7CiAgICAgICBpZihyZXN1bHQpIHsKICAgICAgICAgLyogQ3VybF9jb252ZXJ0X2Zyb21fbmV0d29yayBjYWxscyBmYWlsZiBpZiB1bnN1Y2Nlc3NmdWwgKi8KICAgICAgICAgZnJlZShucyk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICB9CiAKLSAgICAgIHN0cmluZys9MjsKLSAgICAgIGFsbG9jLT0yOworICAgICAgc3RyaW5nICs9IDI7CisgICAgICBhbGxvYyAtPSAyOwogICAgIH0KIAogICAgIGlmKHJlamVjdF9jdHJsICYmIChpbiA8IDB4MjApKSB7CkBAIC0xOTIsNyArMTkyLDcgQEAKICAgICBuc1tzdHJpbmRleCsrXSA9IGluOwogICAgIHN0cmluZysrOwogICB9Ci0gIG5zW3N0cmluZGV4XT0wOyAvKiB0ZXJtaW5hdGUgaXQgKi8KKyAgbnNbc3RyaW5kZXhdID0gMDsgLyogdGVybWluYXRlIGl0ICovCiAKICAgaWYob2xlbikKICAgICAvKiBzdG9yZSBvdXRwdXQgc2l6ZSAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvZmlsZS5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvZmlsZS5jCmluZGV4IGM4MDRkNzUuLjdjZmRhYjEgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2ZpbGUuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9maWxlLmMKQEAgLTEwOCw2ICsxMDgsNyBAQAogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICBmaWxlX2Rpc2Nvbm5lY3QsICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fRklMRSwgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfTk9ORVRXT1JLIHwgUFJPVE9QVF9OT1VSTFFVRVJZIC8qIGZsYWdzICovCkBAIC0xMzIsMzcgKzEzMyw0MiBAQAogc3RhdGljIENVUkxjb2RlIGZpbGVfcmFuZ2Uoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKQogewogICBjdXJsX29mZl90IGZyb20sIHRvOwotICBjdXJsX29mZl90IHRvdGFsc2l6ZT0tMTsKKyAgY3VybF9vZmZfdCB0b3RhbHNpemUgPSAtMTsKICAgY2hhciAqcHRyOwogICBjaGFyICpwdHIyOwogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKIAogICBpZihkYXRhLT5zdGF0ZS51c2VfcmFuZ2UgJiYgZGF0YS0+c3RhdGUucmFuZ2UpIHsKLSAgICBmcm9tPWN1cmx4X3N0cnRvb2ZmdChkYXRhLT5zdGF0ZS5yYW5nZSwgJnB0ciwgMCk7Ci0gICAgd2hpbGUoKnB0ciAmJiAoSVNTUEFDRSgqcHRyKSB8fCAoKnB0cj09Jy0nKSkpCisgICAgQ1VSTG9mZnQgZnJvbV90OworICAgIENVUkxvZmZ0IHRvX3Q7CisgICAgZnJvbV90ID0gY3VybHhfc3RydG9vZmZ0KGRhdGEtPnN0YXRlLnJhbmdlLCAmcHRyLCAwLCAmZnJvbSk7CisgICAgaWYoZnJvbV90ID09IENVUkxfT0ZGVF9GTE9XKQorICAgICAgcmV0dXJuIENVUkxFX1JBTkdFX0VSUk9SOworICAgIHdoaWxlKCpwdHIgJiYgKElTU1BBQ0UoKnB0cikgfHwgKCpwdHIgPT0gJy0nKSkpCiAgICAgICBwdHIrKzsKLSAgICB0bz1jdXJseF9zdHJ0b29mZnQocHRyLCAmcHRyMiwgMCk7Ci0gICAgaWYocHRyID09IHB0cjIpIHsKLSAgICAgIC8qIHdlIGRpZG4ndCBnZXQgYW55IGRpZ2l0ICovCi0gICAgICB0bz0tMTsKLSAgICB9Ci0gICAgaWYoKC0xID09IHRvKSAmJiAoZnJvbT49MCkpIHsKKyAgICB0b190ID0gY3VybHhfc3RydG9vZmZ0KHB0ciwgJnB0cjIsIDAsICZ0byk7CisgICAgaWYodG9fdCA9PSBDVVJMX09GRlRfRkxPVykKKyAgICAgIHJldHVybiBDVVJMRV9SQU5HRV9FUlJPUjsKKyAgICBpZigodG9fdCA9PSBDVVJMX09GRlRfSU5WQUwpICYmICFmcm9tX3QpIHsKICAgICAgIC8qIFggLSAqLwogICAgICAgZGF0YS0+c3RhdGUucmVzdW1lX2Zyb20gPSBmcm9tOwogICAgICAgREVCVUdGKGluZm9mKGRhdGEsICJSQU5HRSAlIiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICIgdG8gZW5kIG9mIGZpbGVcbiIsCiAgICAgICAgICAgICAgICAgICAgZnJvbSkpOwogICAgIH0KLSAgICBlbHNlIGlmKGZyb20gPCAwKSB7CisgICAgZWxzZSBpZigoZnJvbV90ID09IENVUkxfT0ZGVF9JTlZBTCkgJiYgIXRvX3QpIHsKICAgICAgIC8qIC1ZICovCi0gICAgICBkYXRhLT5yZXEubWF4ZG93bmxvYWQgPSAtZnJvbTsKLSAgICAgIGRhdGEtPnN0YXRlLnJlc3VtZV9mcm9tID0gZnJvbTsKKyAgICAgIGRhdGEtPnJlcS5tYXhkb3dubG9hZCA9IHRvOworICAgICAgZGF0YS0+c3RhdGUucmVzdW1lX2Zyb20gPSAtdG87CiAgICAgICBERUJVR0YoaW5mb2YoZGF0YSwgIlJBTkdFIHRoZSBsYXN0ICUiIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgIiBieXRlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAtZnJvbSkpOworICAgICAgICAgICAgICAgICAgIHRvKSk7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgLyogWC1ZICovCiAgICAgICB0b3RhbHNpemUgPSB0by1mcm9tOwotICAgICAgZGF0YS0+cmVxLm1heGRvd25sb2FkID0gdG90YWxzaXplKzE7IC8qIGluY2x1ZGUgbGFzdCBieXRlICovCisgICAgICBpZih0b3RhbHNpemUgPT0gQ1VSTF9PRkZfVF9NQVgpCisgICAgICAgIC8qIHRoaXMgaXMgdG9vIGJpZyB0byBpbmNyZWFzZSwgc28gYmFpbCBvdXQgKi8KKyAgICAgICAgcmV0dXJuIENVUkxFX1JBTkdFX0VSUk9SOworICAgICAgZGF0YS0+cmVxLm1heGRvd25sb2FkID0gdG90YWxzaXplICsgMTsgLyogaW5jbHVkZSBsYXN0IGJ5dGUgKi8KICAgICAgIGRhdGEtPnN0YXRlLnJlc3VtZV9mcm9tID0gZnJvbTsKICAgICAgIERFQlVHRihpbmZvZihkYXRhLCAiUkFOR0UgZnJvbSAlIiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UCiAgICAgICAgICAgICAgICAgICAgIiBnZXR0aW5nICUiIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgIiBieXRlc1xuIiwKQEAgLTIyNSw3ICsyMzEsNyBAQAogICB9CiAKICAgLyogY2hhbmdlIHBhdGggc2VwYXJhdG9ycyBmcm9tICcvJyB0byAnXFwnIGZvciBET1MsIFdpbmRvd3MgYW5kIE9TLzIgKi8KLSAgZm9yKGk9MDsgaSA8IHJlYWxfcGF0aF9sZW47ICsraSkKKyAgZm9yKGkgPSAwOyBpIDwgcmVhbF9wYXRoX2xlbjsgKytpKQogICAgIGlmKGFjdHVhbF9wYXRoW2ldID09ICcvJykKICAgICAgIGFjdHVhbF9wYXRoW2ldID0gJ1xcJzsKICAgICBlbHNlIGlmKCFhY3R1YWxfcGF0aFtpXSkgeyAvKiBiaW5hcnkgemVybyAqLwpAQCAtNDI3LDkgKzQzMyw5IEBACiAgIHN0cnVjdF9zdGF0IHN0YXRidWY7IC8qIHN0cnVjdF9zdGF0IGluc3RlYWQgb2Ygc3RydWN0IHN0YXQganVzdCB0byBhbGxvdyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgV2luZG93cyB2ZXJzaW9uIHRvIGhhdmUgYSBkaWZmZXJlbnQgc3RydWN0IHdpdGhvdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2aW5nIHRvIHJlZGVmaW5lIHRoZSBzaW1wbGUgd29yZCAnc3RhdCcgKi8KLSAgY3VybF9vZmZfdCBleHBlY3RlZF9zaXplPTA7CisgIGN1cmxfb2ZmX3QgZXhwZWN0ZWRfc2l6ZSA9IDA7CiAgIGJvb2wgc2l6ZV9rbm93bjsKLSAgYm9vbCBmc3RhdGVkPUZBTFNFOworICBib29sIGZzdGF0ZWQgPSBGQUxTRTsKICAgc3NpemVfdCBucmVhZDsKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIGNoYXIgKmJ1ZiA9IGRhdGEtPnN0YXRlLmJ1ZmZlcjsKQEAgLTUwMCw3ICs1MDYsNyBAQAogICAgICAgICAgICAgIHRtLT50bV9ob3VyLAogICAgICAgICAgICAgIHRtLT50bV9taW4sCiAgICAgICAgICAgICAgdG0tPnRtX3NlYyk7Ci0gICAgcmVzdWx0ID0gQ3VybF9jbGllbnRfd3JpdGUoY29ubiwgQ0xJRU5UV1JJVEVfQk9USCwgYnVmLCAwKTsKKyAgICByZXN1bHQgPSBDdXJsX2NsaWVudF93cml0ZShjb25uLCBDTElFTlRXUklURV9CT1RILCBoZWFkZXIsIDApOwogICAgIGlmKCFyZXN1bHQpCiAgICAgICAvKiBzZXQgdGhlIGZpbGUgc2l6ZSB0byBtYWtlIGl0IGF2YWlsYWJsZSBwb3N0IHRyYW5zZmVyICovCiAgICAgICBDdXJsX3BncnNTZXREb3dubG9hZFNpemUoZGF0YSwgZXhwZWN0ZWRfc2l6ZSk7CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9mb3JtZGF0YS5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvZm9ybWRhdGEuYwppbmRleCBlNDhhNjI3Li4zNTY4YWM1IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9mb3JtZGF0YS5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2Zvcm1kYXRhLmMKQEAgLTMyLDYgKzMyLDggQEAKIAogI2luY2x1ZGUgInVybGRhdGEuaCIgLyogZm9yIHN0cnVjdCBDdXJsX2Vhc3kgKi8KICNpbmNsdWRlICJmb3JtZGF0YS5oIgorI2luY2x1ZGUgIm1pbWUuaCIKKyNpbmNsdWRlICJub24tYXNjaWkuaCIKICNpbmNsdWRlICJ2dGxzL3Z0bHMuaCIKICNpbmNsdWRlICJzdHJjYXNlLmgiCiAjaW5jbHVkZSAic2VuZGYuaCIKQEAgLTQyLDEzICs0NCw2IEBACiAjaW5jbHVkZSAiY3VybF9tZW1vcnkuaCIKICNpbmNsdWRlICJtZW1kZWJ1Zy5oIgogCi0jaWZuZGVmIEhBVkVfQkFTRU5BTUUKLXN0YXRpYyBjaGFyICpDdXJsX2Jhc2VuYW1lKGNoYXIgKnBhdGgpOwotI2RlZmluZSBiYXNlbmFtZSh4KSAgQ3VybF9iYXNlbmFtZSgoeCkpCi0jZW5kaWYKLQotc3RhdGljIHNpemVfdCByZWFkZnJvbWZpbGUoc3RydWN0IEZvcm0gKmZvcm0sIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOwotc3RhdGljIENVUkxjb2RlIGZvcm1ib3VuZGFyeShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLCBjaGFyICpidWZmZXIsIHNpemVfdCBsZW4pOwogCiAvKiBXaGF0IGtpbmQgb2YgQ29udGVudC1UeXBlIHRvIHVzZSBvbiB1bi1zcGVjaWZpZWQgZmlsZXMgd2l0aCB1bnJlY29nbml6ZWQKICAgIGV4dGVuc2lvbnMuICovCkBAIC0xOTcsNyArMTkyLDcgQEAKICAgICBjb250ZW50dHlwZSA9IEhUVFBQT1NUX0NPTlRFTlRUWVBFX0RFRkFVTFQ7CiAKICAgaWYoZmlsZW5hbWUpIHsgLyogaW4gY2FzZSBhIE5VTEwgd2FzIHBhc3NlZCBpbiAqLwotICAgIGZvcihpPTA7IGk8c2l6ZW9mKGN0dHMpL3NpemVvZihjdHRzWzBdKTsgaSsrKSB7CisgICAgZm9yKGkgPSAwOyBpPHNpemVvZihjdHRzKS9zaXplb2YoY3R0c1swXSk7IGkrKykgewogICAgICAgaWYoc3RybGVuKGZpbGVuYW1lKSA+PSBzdHJsZW4oY3R0c1tpXS5leHRlbnNpb24pKSB7CiAgICAgICAgIGlmKHN0cmNhc2Vjb21wYXJlKGZpbGVuYW1lICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGZpbGVuYW1lKSAtIHN0cmxlbihjdHRzW2ldLmV4dGVuc2lvbiksCkBAIC0yNzIsNyArMjY3LDcgQEAKICAgc3RydWN0IGN1cmxfaHR0cHBvc3QgKnBvc3QgPSBOVUxMOwogICBDVVJMZm9ybW9wdGlvbiBvcHRpb247CiAgIHN0cnVjdCBjdXJsX2Zvcm1zICpmb3JtcyA9IE5VTEw7Ci0gIGNoYXIgKmFycmF5X3ZhbHVlPU5VTEw7IC8qIHZhbHVlIHJlYWQgZnJvbSBhbiBhcnJheSAqLworICBjaGFyICphcnJheV92YWx1ZSA9IE5VTEw7IC8qIHZhbHVlIHJlYWQgZnJvbSBhbiBhcnJheSAqLwogCiAgIC8qIFRoaXMgaXMgYSBzdGF0ZSB2YXJpYWJsZSwgdGhhdCBpZiBUUlVFIG1lYW5zIHRoYXQgd2UncmUgcGFyc2luZyBhbgogICAgICBhcnJheSB0aGF0IHdlIGdvdCBwYXNzZWQgdG8gdXMuIElmIEZBTFNFIHdlJ3JlIHBhcnNpbmcgdGhlIGlucHV0CkBAIC02NDEsMTUgKzYzNiwyNiBAQAogICAgICAgICB9CiAgICAgICAgIGZvcm0tPmNvbnRlbnR0eXBlX2FsbG9jID0gVFJVRTsKICAgICAgIH0KKyAgICAgIGlmKGZvcm0tPm5hbWUgJiYgZm9ybS0+bmFtZWxlbmd0aCkgeworICAgICAgICAvKiBOYW1lIHNob3VsZCBub3QgY29udGFpbiBudWwgYnl0ZXMuICovCisgICAgICAgIHNpemVfdCBpOworICAgICAgICBmb3IoaSA9IDA7IGkgPCBmb3JtLT5uYW1lbGVuZ3RoOyBpKyspCisgICAgICAgICAgaWYoIWZvcm0tPm5hbWVbaV0pIHsKKyAgICAgICAgICAgIHJldHVybl92YWx1ZSA9IENVUkxfRk9STUFERF9OVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBpZihyZXR1cm5fdmFsdWUgIT0gQ1VSTF9GT1JNQUREX09LKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQogICAgICAgaWYoIShmb3JtLT5mbGFncyAmIEhUVFBQT1NUX1BUUk5BTUUpICYmCiAgICAgICAgICAoZm9ybSA9PSBmaXJzdF9mb3JtKSApIHsKICAgICAgICAgLyogTm90ZSB0aGF0IHRoZXJlJ3Mgc21hbGwgcmlzayB0aGF0IGZvcm0tPm5hbWUgaXMgTlVMTCBoZXJlIGlmIHRoZQogICAgICAgICAgICBhcHAgcGFzc2VkIGluIGEgYmFkIGNvbWJvLCBzbyB3ZSBiZXR0ZXIgY2hlY2sgZm9yIHRoYXQgZmlyc3QuICovCiAgICAgICAgIGlmKGZvcm0tPm5hbWUpIHsKLSAgICAgICAgICAvKiBjb3B5IG5hbWUgKHdpdGhvdXQgc3RyZHVwOyBwb3NzaWJseSBjb250YWlucyBudWxsIGNoYXJhY3RlcnMpICovCisgICAgICAgICAgLyogY29weSBuYW1lICh3aXRob3V0IHN0cmR1cDsgcG9zc2libHkgbm90IG51bC10ZXJtaW5hdGVkKSAqLwogICAgICAgICAgIGZvcm0tPm5hbWUgPSBDdXJsX21lbWR1cChmb3JtLT5uYW1lLCBmb3JtLT5uYW1lbGVuZ3RoPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLT5uYW1lbGVuZ3RoOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oZm9ybS0+bmFtZSkrMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihmb3JtLT5uYW1lKSArIDEpOwogICAgICAgICB9CiAgICAgICAgIGlmKCFmb3JtLT5uYW1lKSB7CiAgICAgICAgICAgcmV0dXJuX3ZhbHVlID0gQ1VSTF9GT1JNQUREX01FTU9SWTsKQEAgLTY2Myw3ICs2NjksNyBAQAogICAgICAgICAvKiBjb3B5IHZhbHVlICh3aXRob3V0IHN0cmR1cDsgcG9zc2libHkgY29udGFpbnMgbnVsbCBjaGFyYWN0ZXJzKSAqLwogICAgICAgICBzaXplX3QgY2xlbiAgPSAoc2l6ZV90KSBmb3JtLT5jb250ZW50c2xlbmd0aDsKICAgICAgICAgaWYoIWNsZW4pCi0gICAgICAgICAgY2xlbiA9IHN0cmxlbihmb3JtLT52YWx1ZSkrMTsKKyAgICAgICAgICBjbGVuID0gc3RybGVuKGZvcm0tPnZhbHVlKSArIDE7CiAKICAgICAgICAgZm9ybS0+dmFsdWUgPSBDdXJsX21lbWR1cChmb3JtLT52YWx1ZSwgY2xlbik7CiAKQEAgLTc0NiwyMTEgKzc1Miw2IEBACiAgIHJldHVybiByZXN1bHQ7CiB9CiAKLSNpZmRlZiBfX1ZNUwotI2luY2x1ZGUgPGZhYmRlZi5oPgotLyoKLSAqIGdldF92bXNfZmlsZV9zaXplIGRvZXMgd2hhdCBpdCB0YWtlcyB0byBnZXQgdGhlIHJlYWwgc2l6ZSBvZiB0aGUgZmlsZQotICoKLSAqIEZvciBmaXhlZCBmaWxlcywgZmluZCBvdXQgdGhlIHNpemUgb2YgdGhlIEVPRiBibG9jayBhbmQgYWRqdXN0LgotICoKLSAqIEZvciBhbGwgb3RoZXJzLCBoYXZlIHRvIHJlYWQgdGhlIGVudGlyZSBmaWxlIGluLCBkaXNjYXJkaW5nIHRoZSBjb250ZW50cy4KLSAqIE1vc3QgcG9zdGVkIHRleHQgZmlsZXMgd2lsbCBiZSBzbWFsbCwgYW5kIGJpbmFyeSBmaWxlcyBsaWtlIHpsaWIgYXJjaGl2ZXMKLSAqIGFuZCBDRC9EVkQgaW1hZ2VzIHNob3VsZCBiZSBlaXRoZXIgYSBTVFJFQU1fTEYgZm9ybWF0IG9yIGEgZml4ZWQgZm9ybWF0LgotICoKLSAqLwotY3VybF9vZmZfdCBWbXNSZWFsRmlsZVNpemUoY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdF9zdGF0ICpzdGF0X2J1ZikKLXsKLSAgY2hhciBidWZmZXJbODE5Ml07Ci0gIGN1cmxfb2ZmX3QgY291bnQ7Ci0gIGludCByZXRfc3RhdDsKLSAgRklMRSAqIGZpbGU7Ci0KLSAgZmlsZSA9IGZvcGVuKG5hbWUsIEZPUEVOX1JFQURURVhUKTsgLyogVk1TICovCi0gIGlmKGZpbGUgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBjb3VudCA9IDA7Ci0gIHJldF9zdGF0ID0gMTsKLSAgd2hpbGUocmV0X3N0YXQgPiAwKSB7Ci0gICAgcmV0X3N0YXQgPSBmcmVhZChidWZmZXIsIDEsIHNpemVvZihidWZmZXIpLCBmaWxlKTsKLSAgICBpZihyZXRfc3RhdCAhPSAwKQotICAgICAgY291bnQgKz0gcmV0X3N0YXQ7Ci0gIH0KLSAgZmNsb3NlKGZpbGUpOwotCi0gIHJldHVybiBjb3VudDsKLX0KLQotLyoKLSAqCi0gKiAgVm1zU3BlY2lhbFNpemUgY2hlY2tzIHRvIHNlZSBpZiB0aGUgc3RhdCBzdF9zaXplIGNhbiBiZSB0cnVzdGVkIGFuZAotICogIGlmIG5vdCB0byBjYWxsIGEgcm91dGluZSB0byBnZXQgdGhlIGNvcnJlY3Qgc2l6ZS4KLSAqCi0gKi8KLXN0YXRpYyBjdXJsX29mZl90IFZtc1NwZWNpYWxTaXplKGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Rfc3RhdCAqc3RhdF9idWYpCi17Ci0gIHN3aXRjaChzdGF0X2J1Zi0+c3RfZmFiX3JmbSkgewotICBjYXNlIEZBQiRDX1ZBUjoKLSAgY2FzZSBGQUIkQ19WRkM6Ci0gICAgcmV0dXJuIFZtc1JlYWxGaWxlU2l6ZShuYW1lLCBzdGF0X2J1Zik7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIHN0YXRfYnVmLT5zdF9zaXplOwotICB9Ci19Ci0KLSNlbmRpZgotCi0jaWZuZGVmIF9fVk1TCi0jZGVmaW5lIGZpbGVzaXplKG5hbWUsIHN0YXRfZGF0YSkgKHN0YXRfZGF0YS5zdF9zaXplKQotI2Vsc2UKLSAgICAvKiBHZXR0aW5nIHRoZSBleHBlY3RlZCBmaWxlIHNpemUgbmVlZHMgaGVscCBvbiBWTVMgKi8KLSNkZWZpbmUgZmlsZXNpemUobmFtZSwgc3RhdF9kYXRhKSBWbXNTcGVjaWFsU2l6ZShuYW1lLCAmc3RhdF9kYXRhKQotI2VuZGlmCi0KLS8qCi0gKiBBZGRGb3JtRGF0YSgpIGFkZHMgYSBjaHVuayBvZiBkYXRhIHRvIHRoZSBGb3JtRGF0YSBsaW5rZWQgbGlzdC4KLSAqCi0gKiBzaXplIGlzIGluY3JlbWVudGVkIGJ5IHRoZSBjaHVuayBsZW5ndGgsIHVubGVzcyBpdCBpcyBOVUxMCi0gKi8KLXN0YXRpYyBDVVJMY29kZSBBZGRGb3JtRGF0YShzdHJ1Y3QgRm9ybURhdGEgKipmb3JtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGZvcm10eXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX29mZl90IGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX29mZl90ICpzaXplKQotewotICBzdHJ1Y3QgRm9ybURhdGEgKm5ld2Zvcm07Ci0gIGNoYXIgKmFsbG9jMiA9IE5VTEw7Ci0gIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOwotICBpZihsZW5ndGggPCAwIHx8IChzaXplICYmICpzaXplIDwgMCkpCi0gICAgcmV0dXJuIENVUkxFX0JBRF9GVU5DVElPTl9BUkdVTUVOVDsKLQotICBuZXdmb3JtID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgRm9ybURhdGEpKTsKLSAgaWYoIW5ld2Zvcm0pCi0gICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7Ci0gIG5ld2Zvcm0tPm5leHQgPSBOVUxMOwotCi0gIGlmKHR5cGUgPD0gRk9STV9DT05URU5UKSB7Ci0gICAgLyogd2UgbWFrZSBpdCBlYXNpZXIgZm9yIHBsYWluIHN0cmluZ3M6ICovCi0gICAgaWYoIWxlbmd0aCkKLSAgICAgIGxlbmd0aCA9IHN0cmxlbigoY2hhciAqKWxpbmUpOwotI2lmIChTSVpFT0ZfU0laRV9UIDwgQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCkKLSAgICBlbHNlIGlmKGxlbmd0aCA+PSAoY3VybF9vZmZfdCkoc2l6ZV90KS0xKSB7Ci0gICAgICByZXN1bHQgPSBDVVJMRV9CQURfRlVOQ1RJT05fQVJHVU1FTlQ7Ci0gICAgICBnb3RvIGVycm9yOwotICAgIH0KLSNlbmRpZgotICAgIGlmKHR5cGUgIT0gRk9STV9EQVRBTUVNKSB7Ci0gICAgICBuZXdmb3JtLT5saW5lID0gbWFsbG9jKChzaXplX3QpbGVuZ3RoKzEpOwotICAgICAgaWYoIW5ld2Zvcm0tPmxpbmUpIHsKLSAgICAgICAgcmVzdWx0ID0gQ1VSTEVfT1VUX09GX01FTU9SWTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICAgIH0KLSAgICAgIGFsbG9jMiA9IG5ld2Zvcm0tPmxpbmU7Ci0gICAgICBtZW1jcHkobmV3Zm9ybS0+bGluZSwgbGluZSwgKHNpemVfdClsZW5ndGgpOwotCi0gICAgICAvKiB6ZXJvIHRlcm1pbmF0ZSBmb3IgZWFzaWVyIGRlYnVnZ2luZyAqLwotICAgICAgbmV3Zm9ybS0+bGluZVsoc2l6ZV90KWxlbmd0aF09MDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBuZXdmb3JtLT5saW5lID0gKGNoYXIgKilsaW5lOwotICAgICAgdHlwZSA9IEZPUk1fREFUQTsgLyogaW4gYWxsIG90aGVyIGFzcGVjdHMgdGhpcyBpcyBqdXN0IEZPUk1fREFUQSAqLwotICAgIH0KLSAgICBuZXdmb3JtLT5sZW5ndGggPSAoc2l6ZV90KWxlbmd0aDsKLSAgfQotICBlbHNlCi0gICAgLyogRm9yIGNhbGxiYWNrcyBhbmQgZmlsZXMgd2UgZG9uJ3QgaGF2ZSBhbnkgYWN0dWFsIGRhdGEgc28gd2UganVzdCBrZWVwIGEKLSAgICAgICBwb2ludGVyIHRvIHdoYXRldmVyIHRoaXMgcG9pbnRzIHRvICovCi0gICAgbmV3Zm9ybS0+bGluZSA9IChjaGFyICopbGluZTsKLQotICBuZXdmb3JtLT50eXBlID0gdHlwZTsKLQotICBpZihzaXplKSB7Ci0gICAgaWYodHlwZSAhPSBGT1JNX0ZJTEUpCi0gICAgICAvKiBmb3Igc3RhdGljIGNvbnRlbnQgYXMgd2VsbCBhcyBjYWxsYmFjayBkYXRhIHdlIGFkZCB0aGUgc2l6ZSBnaXZlbgotICAgICAgICAgYXMgaW5wdXQgYXJndW1lbnQgKi8KLSAgICAgICpzaXplICs9IGxlbmd0aDsKLSAgICBlbHNlIHsKLSAgICAgIC8qIFNpbmNlIHRoaXMgaXMgYSBmaWxlIHRvIGJlIHVwbG9hZGVkIGhlcmUsIGFkZCB0aGUgc2l6ZSBvZiB0aGUgYWN0dWFsCi0gICAgICAgICBmaWxlICovCi0gICAgICBpZihzdHJjbXAoIi0iLCBuZXdmb3JtLT5saW5lKSkgewotICAgICAgICBzdHJ1Y3Rfc3RhdCBmaWxlOwotICAgICAgICBpZighc3RhdChuZXdmb3JtLT5saW5lLCAmZmlsZSkgJiYgIVNfSVNESVIoZmlsZS5zdF9tb2RlKSkKLSAgICAgICAgICAqc2l6ZSArPSBmaWxlc2l6ZShuZXdmb3JtLT5saW5lLCBmaWxlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgcmVzdWx0ID0gQ1VSTEVfQkFEX0ZVTkNUSU9OX0FSR1VNRU5UOwotICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZigqZm9ybXApIHsKLSAgICAoKmZvcm1wKS0+bmV4dCA9IG5ld2Zvcm07Ci0gICAgKmZvcm1wID0gbmV3Zm9ybTsKLSAgfQotICBlbHNlCi0gICAgKmZvcm1wID0gbmV3Zm9ybTsKLQotICByZXR1cm4gQ1VSTEVfT0s7Ci0gIGVycm9yOgotICBpZihuZXdmb3JtKQotICAgIGZyZWUobmV3Zm9ybSk7Ci0gIGlmKGFsbG9jMikKLSAgICBmcmVlKGFsbG9jMik7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qCi0gKiBBZGRGb3JtRGF0YWYoKSBhZGRzIHByaW50ZigpLXN0eWxlIGZvcm1hdHRlZCBkYXRhIHRvIHRoZSBmb3JtZGF0YSBjaGFpbi4KLSAqLwotCi1zdGF0aWMgQ1VSTGNvZGUgQWRkRm9ybURhdGFmKHN0cnVjdCBGb3JtRGF0YSAqKmZvcm1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX29mZl90ICpzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgY2hhciAqczsKLSAgQ1VSTGNvZGUgcmVzdWx0OwotICB2YV9saXN0IGFwOwotICB2YV9zdGFydChhcCwgZm10KTsKLSAgcyA9IGN1cmxfbXZhcHJpbnRmKGZtdCwgYXApOwotICB2YV9lbmQoYXApOwotCi0gIGlmKCFzKQotICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwotCi0gIHJlc3VsdCA9IEFkZEZvcm1EYXRhKGZvcm1wLCBGT1JNX0RBVEFNRU0sIHMsIDAsIHNpemUpOwotICBpZihyZXN1bHQpCi0gICAgZnJlZShzKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKgotICogQ3VybF9mb3JtY2xlYW4oKSBpcyB1c2VkIGZyb20gaHR0cC5jLCB0aGlzIGNsZWFucyBhIGJ1aWx0IEZvcm1EYXRhIGxpbmtlZAotICogbGlzdAotICovCi12b2lkIEN1cmxfZm9ybWNsZWFuKHN0cnVjdCBGb3JtRGF0YSAqKmZvcm1fcHRyKQotewotICBzdHJ1Y3QgRm9ybURhdGEgKm5leHQsICpmb3JtOwotCi0gIGZvcm0gPSAqZm9ybV9wdHI7Ci0gIGlmKCFmb3JtKQotICAgIHJldHVybjsKLQotICBkbyB7Ci0gICAgbmV4dD1mb3JtLT5uZXh0OyAgLyogdGhlIGZvbGxvd2luZyBmb3JtIGxpbmUgKi8KLSAgICBpZihmb3JtLT50eXBlIDw9IEZPUk1fQ09OVEVOVCkKLSAgICAgIGZyZWUoZm9ybS0+bGluZSk7IC8qIGZyZWUgdGhlIGxpbmUgKi8KLSAgICBmcmVlKGZvcm0pOyAgICAgICAvKiBmcmVlIHRoZSBzdHJ1Y3QgKi8KLSAgICBmb3JtID0gbmV4dDsKLSAgfSB3aGlsZShmb3JtKTsgLyogY29udGludWUgKi8KLQotICAqZm9ybV9wdHIgPSBOVUxMOwotfQotCiAvKgogICogY3VybF9mb3JtZ2V0KCkKICAqIFNlcmlhbGl6ZSBhIGN1cmxfaHR0cHBvc3Qgc3RydWN0LgpAQCAtOTYyLDQyICs3NjMsMzQgQEAKICAgICAgICAgICAgICAgICAgY3VybF9mb3JtZ2V0X2NhbGxiYWNrIGFwcGVuZCkKIHsKICAgQ1VSTGNvZGUgcmVzdWx0OwotICBjdXJsX29mZl90IHNpemU7Ci0gIHN0cnVjdCBGb3JtRGF0YSAqZGF0YSwgKnB0cjsKKyAgY3VybF9taW1lcGFydCB0b3BwYXJ0OwogCi0gIHJlc3VsdCA9IEN1cmxfZ2V0Zm9ybWRhdGEoTlVMTCwgJmRhdGEsIGZvcm0sIE5VTEwsICZzaXplKTsKLSAgaWYocmVzdWx0KQotICAgIHJldHVybiAoaW50KXJlc3VsdDsKKyAgQ3VybF9taW1lX2luaXRwYXJ0KCZ0b3BwYXJ0LCBOVUxMKTsgLyogZGVmYXVsdCBmb3JtIGlzIGVtcHR5ICovCisgIHJlc3VsdCA9IEN1cmxfZ2V0Zm9ybWRhdGEoTlVMTCwgJnRvcHBhcnQsIGZvcm0sIE5VTEwpOworICBpZighcmVzdWx0KQorICAgIHJlc3VsdCA9IEN1cmxfbWltZV9wcmVwYXJlX2hlYWRlcnMoJnRvcHBhcnQsICJtdWx0aXBhcnQvZm9ybS1kYXRhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE1JTUVTVFJBVEVHWV9GT1JNKTsKIAotICBmb3IocHRyID0gZGF0YTsgcHRyOyBwdHIgPSBwdHItPm5leHQpIHsKLSAgICBpZigocHRyLT50eXBlID09IEZPUk1fRklMRSkgfHwgKHB0ci0+dHlwZSA9PSBGT1JNX0NBTExCQUNLKSkgewotICAgICAgY2hhciBidWZmZXJbODE5Ml07Ci0gICAgICBzaXplX3QgbnJlYWQ7Ci0gICAgICBzdHJ1Y3QgRm9ybSB0ZW1wOworICB3aGlsZSghcmVzdWx0KSB7CisgICAgY2hhciBidWZmZXJbODE5Ml07CisgICAgc2l6ZV90IG5yZWFkID0gQ3VybF9taW1lX3JlYWQoYnVmZmVyLCAxLCBzaXplb2YgYnVmZmVyLCAmdG9wcGFydCk7CiAKLSAgICAgIEN1cmxfRm9ybUluaXQoJnRlbXAsIHB0cik7CisgICAgaWYoIW5yZWFkKQorICAgICAgYnJlYWs7CiAKLSAgICAgIGRvIHsKLSAgICAgICAgbnJlYWQgPSByZWFkZnJvbWZpbGUoJnRlbXAsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgICAgICBpZigobnJlYWQgPT0gKHNpemVfdCkgLTEpIHx8Ci0gICAgICAgICAgIChucmVhZCA+IHNpemVvZihidWZmZXIpKSB8fAotICAgICAgICAgICAobnJlYWQgIT0gYXBwZW5kKGFyZywgYnVmZmVyLCBucmVhZCkpKSB7Ci0gICAgICAgICAgaWYodGVtcC5mcCkKLSAgICAgICAgICAgIGZjbG9zZSh0ZW1wLmZwKTsKLSAgICAgICAgICBDdXJsX2Zvcm1jbGVhbigmZGF0YSk7Ci0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICB9IHdoaWxlKG5yZWFkKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBpZihwdHItPmxlbmd0aCAhPSBhcHBlbmQoYXJnLCBwdHItPmxpbmUsIHB0ci0+bGVuZ3RoKSkgewotICAgICAgICBDdXJsX2Zvcm1jbGVhbigmZGF0YSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KKyAgICBzd2l0Y2gobnJlYWQpIHsKKyAgICBkZWZhdWx0OgorICAgICAgaWYoYXBwZW5kKGFyZywgYnVmZmVyLCBucmVhZCkgIT0gbnJlYWQpCisgICAgICAgIHJlc3VsdCA9IENVUkxFX1JFQURfRVJST1I7CisgICAgICBicmVhazsKKyAgICBjYXNlIENVUkxfUkVBREZVTkNfQUJPUlQ6CisgICAgY2FzZSBDVVJMX1JFQURGVU5DX1BBVVNFOgorICAgICAgYnJlYWs7CiAgICAgfQogICB9Ci0gIEN1cmxfZm9ybWNsZWFuKCZkYXRhKTsKLSAgcmV0dXJuIDA7CisKKyAgQ3VybF9taW1lX2NsZWFucGFydCgmdG9wcGFydCk7CisgIHJldHVybiAoaW50KSByZXN1bHQ7CiB9CiAKIC8qCkBAIC0xMDEzLDcgKzgwNiw3IEBACiAgICAgcmV0dXJuOwogCiAgIGRvIHsKLSAgICBuZXh0PWZvcm0tPm5leHQ7ICAvKiB0aGUgZm9sbG93aW5nIGZvcm0gbGluZSAqLworICAgIG5leHQgPSBmb3JtLT5uZXh0OyAgLyogdGhlIGZvbGxvd2luZyBmb3JtIGxpbmUgKi8KIAogICAgIC8qIHJlY3Vyc2UgdG8gc3ViLWNvbnRlbnRzICovCiAgICAgY3VybF9mb3JtZnJlZShmb3JtLT5tb3JlKTsKQEAgLTEwMzEsMTE4ICs4MjQsMjkgQEAKICAgfSB3aGlsZShmb3JtKTsgLyogY29udGludWUgKi8KIH0KIAotI2lmbmRlZiBIQVZFX0JBU0VOQU1FCi0vKgotICAoUXVvdGUgZnJvbSBUaGUgT3BlbiBHcm91cCBCYXNlIFNwZWNpZmljYXRpb25zIElzc3VlIDYgSUVFRSBTdGQgMTAwMy4xLCAyMDA0Ci0gIEVkaXRpb24pCiAKLSAgVGhlIGJhc2VuYW1lKCkgZnVuY3Rpb24gc2hhbGwgdGFrZSB0aGUgcGF0aG5hbWUgcG9pbnRlZCB0byBieSBwYXRoIGFuZAotICByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaW5hbCBjb21wb25lbnQgb2YgdGhlIHBhdGhuYW1lLCBkZWxldGluZyBhbnkKLSAgdHJhaWxpbmcgJy8nIGNoYXJhY3RlcnMuCi0KLSAgSWYgdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IHBhdGggY29uc2lzdHMgZW50aXJlbHkgb2YgdGhlICcvJyBjaGFyYWN0ZXIsCi0gIGJhc2VuYW1lKCkgc2hhbGwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nICIvIi4gSWYgdGhlIHN0cmluZyBwb2ludGVkCi0gIHRvIGJ5IHBhdGggaXMgZXhhY3RseSAiLy8iLCBpdCBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHdoZXRoZXIgJy8nIG9yICIvLyIKLSAgaXMgcmV0dXJuZWQuCi0KLSAgSWYgcGF0aCBpcyBhIG51bGwgcG9pbnRlciBvciBwb2ludHMgdG8gYW4gZW1wdHkgc3RyaW5nLCBiYXNlbmFtZSgpIHNoYWxsCi0gIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyAiLiIuCi0KLSAgVGhlIGJhc2VuYW1lKCkgZnVuY3Rpb24gbWF5IG1vZGlmeSB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgcGF0aCwgYW5kIG1heQotICByZXR1cm4gYSBwb2ludGVyIHRvIHN0YXRpYyBzdG9yYWdlIHRoYXQgbWF5IHRoZW4gYmUgb3ZlcndyaXR0ZW4gYnkgYQotICBzdWJzZXF1ZW50IGNhbGwgdG8gYmFzZW5hbWUoKS4KLQotICBUaGUgYmFzZW5hbWUoKSBmdW5jdGlvbiBuZWVkIG5vdCBiZSByZWVudHJhbnQuIEEgZnVuY3Rpb24gdGhhdCBpcyBub3QKLSAgcmVxdWlyZWQgdG8gYmUgcmVlbnRyYW50IGlzIG5vdCByZXF1aXJlZCB0byBiZSB0aHJlYWQtc2FmZS4KLQotKi8KLXN0YXRpYyBjaGFyICpDdXJsX2Jhc2VuYW1lKGNoYXIgKnBhdGgpCisvKiBTZXQgbWltZSBwYXJ0IG5hbWUsIHRha2luZyBjYXJlIG9mIG5vbiBudWwtdGVybWluYXRlZCBuYW1lIHN0cmluZy4gKi8KK3N0YXRpYyBDVVJMY29kZSBzZXRuYW1lKGN1cmxfbWltZXBhcnQgKnBhcnQsIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pCiB7Ci0gIC8qIElnbm9yZSBhbGwgdGhlIGRldGFpbHMgYWJvdmUgZm9yIG5vdyBhbmQgbWFrZSBhIHF1aWNrIGFuZCBzaW1wbGUKLSAgICAgaW1wbGVtZW50YWlvbiBoZXJlICovCi0gIGNoYXIgKnMxOwotICBjaGFyICpzMjsKKyAgY2hhciAqem5hbWU7CisgIENVUkxjb2RlIHJlczsKIAotICBzMT1zdHJyY2hyKHBhdGgsICcvJyk7Ci0gIHMyPXN0cnJjaHIocGF0aCwgJ1xcJyk7Ci0KLSAgaWYoczEgJiYgczIpIHsKLSAgICBwYXRoID0gKHMxID4gczI/IHMxIDogczIpKzE7Ci0gIH0KLSAgZWxzZSBpZihzMSkKLSAgICBwYXRoID0gczEgKyAxOwotICBlbHNlIGlmKHMyKQotICAgIHBhdGggPSBzMiArIDE7Ci0KLSAgcmV0dXJuIHBhdGg7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGNoYXIgKnN0cmlwcGF0aChjb25zdCBjaGFyICpmdWxsZmlsZSkKLXsKLSAgY2hhciAqZmlsZW5hbWU7Ci0gIGNoYXIgKmJhc2U7Ci0gIGZpbGVuYW1lID0gc3RyZHVwKGZ1bGxmaWxlKTsgLyogZHVwbGljYXRlIHNpbmNlIGJhc2VuYW1lKCkgbWF5IHJ1aW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGl0IHdvcmtzIG9uICovCi0gIGlmKCFmaWxlbmFtZSkKLSAgICByZXR1cm4gTlVMTDsKLSAgYmFzZSA9IHN0cmR1cChiYXNlbmFtZShmaWxlbmFtZSkpOwotCi0gIGZyZWUoZmlsZW5hbWUpOyAvKiBmcmVlIHRlbXBvcmFyeSBidWZmZXIgKi8KLQotICByZXR1cm4gYmFzZTsgLyogcmV0dXJucyBhbiBhbGxvY2F0ZWQgc3RyaW5nIG9yIE5VTEwgISAqLwotfQotCi1zdGF0aWMgQ1VSTGNvZGUgZm9ybWRhdGFfYWRkX2ZpbGVuYW1lKGNvbnN0IHN0cnVjdCBjdXJsX2h0dHBwb3N0ICpmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9ybURhdGEgKipmb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX29mZl90ICpzaXplKQotewotICBDVVJMY29kZSByZXN1bHQgPSBDVVJMRV9PSzsKLSAgY2hhciAqZmlsZW5hbWUgPSBmaWxlLT5zaG93ZmlsZW5hbWU7Ci0gIGNoYXIgKmZpbGViYXNlbmFtZSA9IE5VTEw7Ci0gIGNoYXIgKmZpbGVuYW1lX2VzY2FwZWQgPSBOVUxMOwotCi0gIGlmKCFmaWxlbmFtZSkgewotICAgIGZpbGViYXNlbmFtZSA9IHN0cmlwcGF0aChmaWxlLT5jb250ZW50cyk7Ci0gICAgaWYoIWZpbGViYXNlbmFtZSkKLSAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwotICAgIGZpbGVuYW1lID0gZmlsZWJhc2VuYW1lOwotICB9Ci0KLSAgaWYoc3RyY2hyKGZpbGVuYW1lLCAnXFwnKSB8fCBzdHJjaHIoZmlsZW5hbWUsICciJykpIHsKLSAgICBjaGFyICpwMCwgKnAxOwotCi0gICAgLyogZmlsZW5hbWUgbmVlZCBiZSBlc2NhcGVkICovCi0gICAgZmlsZW5hbWVfZXNjYXBlZCA9IG1hbGxvYyhzdHJsZW4oZmlsZW5hbWUpKjIrMSk7Ci0gICAgaWYoIWZpbGVuYW1lX2VzY2FwZWQpIHsKLSAgICAgIGZyZWUoZmlsZWJhc2VuYW1lKTsKLSAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwotICAgIH0KLSAgICBwMCA9IGZpbGVuYW1lX2VzY2FwZWQ7Ci0gICAgcDEgPSBmaWxlbmFtZTsKLSAgICB3aGlsZSgqcDEpIHsKLSAgICAgIGlmKCpwMSA9PSAnXFwnIHx8ICpwMSA9PSAnIicpCi0gICAgICAgICpwMCsrID0gJ1xcJzsKLSAgICAgICpwMCsrID0gKnAxKys7Ci0gICAgfQotICAgICpwMCA9ICdcMCc7Ci0gICAgZmlsZW5hbWUgPSBmaWxlbmFtZV9lc2NhcGVkOwotICB9Ci0gIHJlc3VsdCA9IEFkZEZvcm1EYXRhZihmb3JtLCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIjsgZmlsZW5hbWU9XCIlc1wiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lKTsKLSAgZnJlZShmaWxlbmFtZV9lc2NhcGVkKTsKLSAgZnJlZShmaWxlYmFzZW5hbWUpOwotICByZXR1cm4gcmVzdWx0OworICBpZighbmFtZSB8fCAhbGVuKQorICAgIHJldHVybiBjdXJsX21pbWVfbmFtZShwYXJ0LCBuYW1lKTsKKyAgem5hbWUgPSBtYWxsb2MobGVuICsgMSk7CisgIGlmKCF6bmFtZSkKKyAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKKyAgbWVtY3B5KHpuYW1lLCBuYW1lLCBsZW4pOworICB6bmFtZVtsZW5dID0gJ1wwJzsKKyAgcmVzID0gY3VybF9taW1lX25hbWUocGFydCwgem5hbWUpOworICBmcmVlKHpuYW1lKTsKKyAgcmV0dXJuIHJlczsKIH0KIAogLyoKLSAqIEN1cmxfZ2V0Zm9ybWRhdGEoKSBjb252ZXJ0cyBhIGxpbmtlZCBsaXN0IG9mICJtZXRhIGRhdGEiIGludG8gYSBjb21wbGV0ZQotICogKHBvc3NpYmx5IGh1Z2UpIG11bHRpcGFydCBmb3JtZGF0YS4gVGhlIGlucHV0IGxpc3QgaXMgaW4gJ3Bvc3QnLCB3aGlsZSB0aGUKLSAqIG91dHB1dCByZXN1bHRpbmcgbGlua2VkIGxpc3RzIGdldHMgc3RvcmVkIGluICcqZmluYWxmb3JtJy4gKnNpemVwIHdpbGwgZ2V0Ci0gKiB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgd2hvbGUgUE9TVC4KLSAqIEEgbXVsdGlwYXJ0L2Zvcm1fZGF0YSBjb250ZW50LXR5cGUgaXMgYnVpbHQsIHVubGVzcyBhIGN1c3RvbSBjb250ZW50LXR5cGUKLSAqIGlzIHBhc3NlZCBpbiAnY3VzdG9tX2NvbnRlbnRfdHlwZScuCisgKiBDdXJsX2dldGZvcm1kYXRhKCkgY29udmVydHMgYSBsaW5rZWQgbGlzdCBvZiAibWV0YSBkYXRhIiBpbnRvIGEgbWltZQorICogc3RydWN0dXJlLiBUaGUgaW5wdXQgbGlzdCBpcyBpbiAncG9zdCcsIHdoaWxlIHRoZSBvdXRwdXQgaXMgc3RvcmVkIGluCisgKiBtaW1lIHBhcnQgYXQgJypmaW5hbGZvcm0nLgogICoKICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgZG8gYSBmYWlsZigpIGZvciB0aGUgcG90ZW50aWFsIG1lbW9yeSBmYWlsdXJlcyBidXQKICAqIHNob3VsZCBmb3IgYWxsIG90aGVyIGVycm9ycyBpdCBzcG90cy4gSnVzdCBub3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBNQVkgZ2V0CkBAIC0xMTUwLDQyMiArODU0LDEyMyBAQAogICovCiAKIENVUkxjb2RlIEN1cmxfZ2V0Zm9ybWRhdGEoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEZvcm1EYXRhICoqZmluYWxmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX21pbWVwYXJ0ICpmaW5hbGZvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjdXJsX2h0dHBwb3N0ICpwb3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjdXN0b21fY29udGVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX29mZl90ICpzaXplcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9yZWFkX2NhbGxiYWNrIGZyZWFkX2Z1bmMpCiB7Ci0gIHN0cnVjdCBGb3JtRGF0YSAqZm9ybSA9IE5VTEw7Ci0gIHN0cnVjdCBGb3JtRGF0YSAqZmlyc3Rmb3JtOwotICBzdHJ1Y3QgY3VybF9odHRwcG9zdCAqZmlsZTsKICAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7Ci0gIGN1cmxfb2ZmX3Qgc2l6ZSA9IDA7IC8qIHN1cHBvcnQgcG90ZW50aWFsbHkgRU5PUk1PVVMgZm9ybXBvc3RzICovCi0gIGNoYXIgZmlsZWJvdW5kYXJ5WzQyXTsKLSAgc3RydWN0IGN1cmxfc2xpc3QgKmN1ckxpc3Q7Ci0gIGNoYXIgYm91bmRhcnlbNDJdOworICBjdXJsX21pbWUgKmZvcm0gPSBOVUxMOworICBjdXJsX21pbWUgKm11bHRpcGFydDsKKyAgY3VybF9taW1lcGFydCAqcGFydDsKKyAgc3RydWN0IGN1cmxfaHR0cHBvc3QgKmZpbGU7CiAKLSAgKmZpbmFsZm9ybSA9IE5VTEw7IC8qIGRlZmF1bHQgZm9ybSBpcyBlbXB0eSAqLworICBDdXJsX21pbWVfY2xlYW5wYXJ0KGZpbmFsZm9ybSk7IC8qIGRlZmF1bHQgZm9ybSBpcyBlbXB0eSAqLwogCiAgIGlmKCFwb3N0KQogICAgIHJldHVybiByZXN1bHQ7IC8qIG5vIGlucHV0ID0+IG5vIG91dHB1dCEgKi8KIAotICByZXN1bHQgPSBmb3JtYm91bmRhcnkoZGF0YSwgYm91bmRhcnksIHNpemVvZihib3VuZGFyeSkpOwotICBpZihyZXN1bHQpCi0gICAgcmV0dXJuIHJlc3VsdDsKKyAgZm9ybSA9IGN1cmxfbWltZV9pbml0KGRhdGEpOworICBpZighZm9ybSkKKyAgICByZXN1bHQgPSBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogCi0gIC8qIE1ha2UgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIG91dHB1dCAqLwotICByZXN1bHQgPSBBZGRGb3JtRGF0YWYoJmZvcm0sIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAiJXM7IGJvdW5kYXJ5PSVzXHJcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21fY29udGVudF90eXBlP2N1c3RvbV9jb250ZW50X3R5cGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAiQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvZm9ybS1kYXRhIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5KTsKLQotICBpZihyZXN1bHQpIHsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIC8qIHdlIERPIE5PVCBpbmNsdWRlIHRoYXQgbGluZSBpbiB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgUE9TVCwgc2luY2UgaXQnbGwgYmUKLSAgICAgcGFydCBvZiB0aGUgaGVhZGVyISAqLwotCi0gIGZpcnN0Zm9ybSA9IGZvcm07Ci0KLSAgZG8gewotCi0gICAgaWYoc2l6ZSkgewotICAgICAgcmVzdWx0ID0gQWRkRm9ybURhdGFmKCZmb3JtLCAmc2l6ZSwgIlxyXG4iKTsKLSAgICAgIGlmKHJlc3VsdCkKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogYm91bmRhcnkgKi8KLSAgICByZXN1bHQgPSBBZGRGb3JtRGF0YWYoJmZvcm0sICZzaXplLCAiLS0lc1xyXG4iLCBib3VuZGFyeSk7Ci0gICAgaWYocmVzdWx0KQotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBNYXliZSBsYXRlciB0aGlzIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIGEgY3VzdG9tX2NvbnRlbnRfdHlwZSBpcwotICAgICAgIHBhc3NlZCwgc2luY2UgQ29udGVudC1EaXNwb3NpdGlvbiBpcyBub3QgbWVhbmluZ2Z1bCBmb3IgYWxsIG11bHRpcGFydAotICAgICAgIHR5cGVzLgotICAgICovCi0gICAgcmVzdWx0ID0gQWRkRm9ybURhdGFmKCZmb3JtLCAmc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cIiIpOwotICAgIGlmKHJlc3VsdCkKLSAgICAgIGJyZWFrOwotCi0gICAgcmVzdWx0ID0gQWRkRm9ybURhdGEoJmZvcm0sIEZPUk1fREFUQSwgcG9zdC0+bmFtZSwgcG9zdC0+bmFtZWxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSk7Ci0gICAgaWYocmVzdWx0KQotICAgICAgYnJlYWs7Ci0KLSAgICByZXN1bHQgPSBBZGRGb3JtRGF0YWYoJmZvcm0sICZzaXplLCAiXCIiKTsKLSAgICBpZihyZXN1bHQpCi0gICAgICBicmVhazsKLQotICAgIGlmKHBvc3QtPm1vcmUpIHsKLSAgICAgIC8qIElmIHVzZWQsIHRoaXMgaXMgYSBsaW5rIHRvIG1vcmUgZmlsZSBuYW1lcywgd2UgbXVzdCB0aGVuIGRvCi0gICAgICAgICB0aGUgbWFnaWMgdG8gaW5jbHVkZSBzZXZlcmFsIGZpbGVzIHdpdGggdGhlIHNhbWUgZmllbGQgbmFtZSAqLwotCi0gICAgICByZXN1bHQgPSBmb3JtYm91bmRhcnkoZGF0YSwgZmlsZWJvdW5kYXJ5LCBzaXplb2YoZmlsZWJvdW5kYXJ5KSk7Ci0gICAgICBpZihyZXN1bHQpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHJlc3VsdCA9IEFkZEZvcm1EYXRhZigmZm9ybSwgJnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxyXG5Db250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBib3VuZGFyeT0lc1xyXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVib3VuZGFyeSk7Ci0gICAgICBpZihyZXN1bHQpCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGZpbGUgPSBwb3N0OwotCi0gICAgZG8gewotCi0gICAgICAvKiBJZiAnc2hvd2ZpbGVuYW1lJyBpcyBzZXQsIHRoYXQgaXMgYSBmYWtlZCBuYW1lIHBhc3NlZCBvbiB0byB1cwotICAgICAgICAgdG8gdXNlIHRvIGluIHRoZSBmb3JtcG9zdC4gSWYgdGhhdCBpcyBub3Qgc2V0LCB0aGUgYWN0dWFsbHkgdXNlZAotICAgICAgICAgbG9jYWwgZmlsZSBuYW1lIHNob3VsZCBiZSBhZGRlZC4gKi8KLQotICAgICAgaWYocG9zdC0+bW9yZSkgewotICAgICAgICAvKiBpZiBtdWx0aXBsZS1maWxlICovCi0gICAgICAgIHJlc3VsdCA9IEFkZEZvcm1EYXRhZigmZm9ybSwgJnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHJcbi0tJXNcclxuQ29udGVudC1EaXNwb3NpdGlvbjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dGFjaG1lbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZWJvdW5kYXJ5KTsKLSAgICAgICAgaWYocmVzdWx0KQotICAgICAgICAgIGJyZWFrOwotICAgICAgICByZXN1bHQgPSBmb3JtZGF0YV9hZGRfZmlsZW5hbWUoZmlsZSwgJmZvcm0sICZzaXplKTsKLSAgICAgICAgaWYocmVzdWx0KQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSBpZihwb3N0LT5mbGFncyAmIChIVFRQUE9TVF9GSUxFTkFNRXxIVFRQUE9TVF9CVUZGRVJ8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBQT1NUX0NBTExCQUNLKSkgewotICAgICAgICAvKiBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBmb3IgdGhlIEhUVFBQT1NUX0ZJTEVOQU1FIGFuZAotICAgICAgICAgICBIVFRQUE9TVF9DQUxMQkFDSyBjYXNlcyB0aGUgLT5zaG93ZmlsZW5hbWUgc3RydWN0IG1lbWJlciBpcyBhbHdheXMKLSAgICAgICAgICAgYXNzaWduZWQgYXQgdGhpcyBwb2ludCAqLwotICAgICAgICBpZihwb3N0LT5zaG93ZmlsZW5hbWUgfHwgKHBvc3QtPmZsYWdzICYgSFRUUFBPU1RfRklMRU5BTUUpKSB7Ci0gICAgICAgICAgcmVzdWx0ID0gZm9ybWRhdGFfYWRkX2ZpbGVuYW1lKHBvc3QsICZmb3JtLCAmc2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihyZXN1bHQpCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGlmKGZpbGUtPmNvbnRlbnR0eXBlKSB7Ci0gICAgICAgIC8qIHdlIGhhdmUgYSBzcGVjaWZpZWQgdHlwZSAqLwotICAgICAgICByZXN1bHQgPSBBZGRGb3JtRGF0YWYoJmZvcm0sICZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxyXG5Db250ZW50LVR5cGU6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUtPmNvbnRlbnR0eXBlKTsKLSAgICAgICAgaWYocmVzdWx0KQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjdXJMaXN0ID0gZmlsZS0+Y29udGVudGhlYWRlcjsKLSAgICAgIHdoaWxlKGN1ckxpc3QpIHsKLSAgICAgICAgLyogUHJvY2VzcyB0aGUgYWRkaXRpb25hbCBoZWFkZXJzIHNwZWNpZmllZCBmb3IgdGhpcyBmb3JtICovCi0gICAgICAgIHJlc3VsdCA9IEFkZEZvcm1EYXRhZigmZm9ybSwgJnNpemUsICJcclxuJXMiLCBjdXJMaXN0LT5kYXRhKTsKLSAgICAgICAgaWYocmVzdWx0KQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjdXJMaXN0ID0gY3VyTGlzdC0+bmV4dDsKLSAgICAgIH0KLSAgICAgIGlmKHJlc3VsdCkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIHJlc3VsdCA9IEFkZEZvcm1EYXRhZigmZm9ybSwgJnNpemUsICJcclxuXHJcbiIpOwotICAgICAgaWYocmVzdWx0KQotICAgICAgICBicmVhazsKLQotICAgICAgaWYoKHBvc3QtPmZsYWdzICYgSFRUUFBPU1RfRklMRU5BTUUpIHx8Ci0gICAgICAgICAocG9zdC0+ZmxhZ3MgJiBIVFRQUE9TVF9SRUFERklMRSkpIHsKLSAgICAgICAgLyogd2Ugc2hvdWxkIGluY2x1ZGUgdGhlIGNvbnRlbnRzIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlICovCi0gICAgICAgIEZJTEUgKmZpbGVyZWFkOwotCi0gICAgICAgIGZpbGVyZWFkID0gIXN0cmNtcCgiLSIsIGZpbGUtPmNvbnRlbnRzKT8KLSAgICAgICAgICBzdGRpbjpmb3BlbihmaWxlLT5jb250ZW50cywgInJiIik7IC8qIGJpbmFyeSByZWFkIGZvciB3aW4zMiAgKi8KLQotICAgICAgICAvKgotICAgICAgICAgKiBWTVM6IFRoaXMgb25seSBhbGxvd3MgZm9yIHN0cmVhbSBmaWxlcyBvbiBWTVMuICBTdHJlYW0gZmlsZXMgYXJlCi0gICAgICAgICAqIE9LLCBhcyBhcmUgRklYRUQgJiBWQVIgZmlsZXMgV0lUSE9VVCBpbXBsaWVkIENDIEZvciBpbXBsaWVkIENDLAotICAgICAgICAgKiBldmVyeSByZWNvcmQgbmVlZHMgdG8gaGF2ZSBhIFxuIGFwcGVuZGVkICYgMSBhZGRlZCB0byBTSVpFCi0gICAgICAgICAqLwotCi0gICAgICAgIGlmKGZpbGVyZWFkKSB7Ci0gICAgICAgICAgaWYoZmlsZXJlYWQgIT0gc3RkaW4pIHsKLSAgICAgICAgICAgIC8qIGNsb3NlIHRoZSBmaWxlICovCi0gICAgICAgICAgICBmY2xvc2UoZmlsZXJlYWQpOwotICAgICAgICAgICAgLyogYWRkIHRoZSBmaWxlIG5hbWUgb25seSAtIGZvciBsYXRlciByZWFkaW5nIGZyb20gdGhpcyAqLwotICAgICAgICAgICAgcmVzdWx0ID0gQWRkRm9ybURhdGEoJmZvcm0sIEZPUk1fRklMRSwgZmlsZS0+Y29udGVudHMsIDAsICZzaXplKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiBXaGVuIHVwbG9hZGluZyBmcm9tIHN0ZGluLCB3ZSBjYW4ndCBrbm93IHRoZSBzaXplIG9mIHRoZSBmaWxlLAotICAgICAgICAgICAgICogdGh1cyBtdXN0IHJlYWQgdGhlIGZ1bGwgZmlsZSBhcyBiZWZvcmUuIFdlICpjb3VsZCogdXNlIGNodW5rZWQKLSAgICAgICAgICAgICAqIHRyYW5zZmVyLWVuY29kaW5nLCBidXQgdGhhdCBvbmx5IHdvcmtzIGZvciBIVFRQIDEuMSBhbmQgd2UKLSAgICAgICAgICAgICAqIGNhbid0IGJlIHN1cmUgd2Ugd29yayB3aXRoIHN1Y2ggYSBzZXJ2ZXIuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHNpemVfdCBucmVhZDsKLSAgICAgICAgICAgIGNoYXIgYnVmZmVyWzUxMl07Ci0gICAgICAgICAgICB3aGlsZSgobnJlYWQgPSBmcmVhZChidWZmZXIsIDEsIHNpemVvZihidWZmZXIpLCBmaWxlcmVhZCkpICE9IDApIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gQWRkRm9ybURhdGEoJmZvcm0sIEZPUk1fQ09OVEVOVCwgYnVmZmVyLCBucmVhZCwgJnNpemUpOwotICAgICAgICAgICAgICBpZihyZXN1bHQgfHwgZmVvZihmaWxlcmVhZCkgfHwgZmVycm9yKGZpbGVyZWFkKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgaWYoZGF0YSkKLSAgICAgICAgICAgIGZhaWxmKGRhdGEsICJjb3VsZG4ndCBvcGVuIGZpbGUgXCIlc1wiIiwgZmlsZS0+Y29udGVudHMpOwotICAgICAgICAgICpmaW5hbGZvcm0gPSBOVUxMOwotICAgICAgICAgIHJlc3VsdCA9IENVUkxFX1JFQURfRVJST1I7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYocG9zdC0+ZmxhZ3MgJiBIVFRQUE9TVF9CVUZGRVIpCi0gICAgICAgIC8qIGluY2x1ZGUgY29udGVudHMgb2YgYnVmZmVyICovCi0gICAgICAgIHJlc3VsdCA9IEFkZEZvcm1EYXRhKCZmb3JtLCBGT1JNX0NPTlRFTlQsIHBvc3QtPmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdC0+YnVmZmVybGVuZ3RoLCAmc2l6ZSk7Ci0gICAgICBlbHNlIGlmKHBvc3QtPmZsYWdzICYgSFRUUFBPU1RfQ0FMTEJBQ0spCi0gICAgICAgIC8qIHRoZSBjb250ZW50cyBzaG91bGQgYmUgcmVhZCB3aXRoIHRoZSBjYWxsYmFjayBhbmQgdGhlIHNpemUgaXMgc2V0Ci0gICAgICAgICAgIHdpdGggdGhlIGNvbnRlbnRzbGVuZ3RoICovCi0gICAgICAgIHJlc3VsdCA9IEFkZEZvcm1EYXRhKCZmb3JtLCBGT1JNX0NBTExCQUNLLCBwb3N0LT51c2VycCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdC0+ZmxhZ3MmQ1VSTF9IVFRQUE9TVF9MQVJHRT8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdC0+Y29udGVudGxlbjpwb3N0LT5jb250ZW50c2xlbmd0aCwgJnNpemUpOwotICAgICAgZWxzZQotICAgICAgICAvKiBpbmNsdWRlIHRoZSBjb250ZW50cyB3ZSBnb3QgKi8KLSAgICAgICAgcmVzdWx0ID0gQWRkRm9ybURhdGEoJmZvcm0sIEZPUk1fQ09OVEVOVCwgcG9zdC0+Y29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3QtPmZsYWdzJkNVUkxfSFRUUFBPU1RfTEFSR0U/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3QtPmNvbnRlbnRsZW46cG9zdC0+Y29udGVudHNsZW5ndGgsICZzaXplKTsKLSAgICAgIGZpbGUgPSBmaWxlLT5tb3JlOwotICAgIH0gd2hpbGUoZmlsZSAmJiAhcmVzdWx0KTsgLyogZm9yIGVhY2ggc3BlY2lmaWVkIGZpbGUgZm9yIHRoaXMgZmllbGQgKi8KLQotICAgIGlmKHJlc3VsdCkKLSAgICAgIGJyZWFrOwotCi0gICAgaWYocG9zdC0+bW9yZSkgewotICAgICAgLyogdGhpcyB3YXMgYSBtdWx0aXBsZS1maWxlIGluY2x1c2lvbiwgbWFrZSBhIHRlcm1pbmF0aW9uIGZpbGUKLSAgICAgICAgIGJvdW5kYXJ5OiAqLwotICAgICAgcmVzdWx0ID0gQWRkRm9ybURhdGFmKCZmb3JtLCAmc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJcclxuLS0lcy0tIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVib3VuZGFyeSk7Ci0gICAgICBpZihyZXN1bHQpCi0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBwb3N0ID0gcG9zdC0+bmV4dDsKLSAgfSB3aGlsZShwb3N0KTsgLyogZm9yIGVhY2ggZmllbGQgKi8KLQotICAvKiBlbmQtYm91bmRhcnkgZm9yIGV2ZXJ5dGhpbmcgKi8KICAgaWYoIXJlc3VsdCkKLSAgICByZXN1bHQgPSBBZGRGb3JtRGF0YWYoJmZvcm0sICZzaXplLCAiXHJcbi0tJXMtLVxyXG4iLCBib3VuZGFyeSk7CisgICAgcmVzdWx0ID0gY3VybF9taW1lX3N1YnBhcnRzKGZpbmFsZm9ybSwgZm9ybSk7CiAKLSAgaWYocmVzdWx0KSB7Ci0gICAgQ3VybF9mb3JtY2xlYW4oJmZpcnN0Zm9ybSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgLyogUHJvY2VzcyBlYWNoIHRvcCBwYXJ0LiAqLworICBmb3IoOyAhcmVzdWx0ICYmIHBvc3Q7IHBvc3QgPSBwb3N0LT5uZXh0KSB7CisgICAgLyogSWYgd2UgaGF2ZSBtb3JlIHRoYW4gYSBmaWxlIGhlcmUsIGNyZWF0ZSBhIG1pbWUgc3VicGFydCBhbmQgZmlsbCBpdC4gKi8KKyAgICBtdWx0aXBhcnQgPSBmb3JtOworICAgIGlmKHBvc3QtPm1vcmUpIHsKKyAgICAgIHBhcnQgPSBjdXJsX21pbWVfYWRkcGFydChmb3JtKTsKKyAgICAgIGlmKCFwYXJ0KQorICAgICAgICByZXN1bHQgPSBDVVJMRV9PVVRfT0ZfTUVNT1JZOworICAgICAgaWYoIXJlc3VsdCkKKyAgICAgICAgcmVzdWx0ID0gc2V0bmFtZShwYXJ0LCBwb3N0LT5uYW1lLCBwb3N0LT5uYW1lbGVuZ3RoKTsKKyAgICAgIGlmKCFyZXN1bHQpIHsKKyAgICAgICAgbXVsdGlwYXJ0ID0gY3VybF9taW1lX2luaXQoZGF0YSk7CisgICAgICAgIGlmKCFtdWx0aXBhcnQpCisgICAgICAgICAgcmVzdWx0ID0gQ1VSTEVfT1VUX09GX01FTU9SWTsKKyAgICAgIH0KKyAgICAgIGlmKCFyZXN1bHQpCisgICAgICAgIHJlc3VsdCA9IGN1cmxfbWltZV9zdWJwYXJ0cyhwYXJ0LCBtdWx0aXBhcnQpOworICAgIH0KKworICAgIC8qIEdlbmVyYXRlIGFsbCB0aGUgcGFydCBjb250ZW50cy4gKi8KKyAgICBmb3IoZmlsZSA9IHBvc3Q7ICFyZXN1bHQgJiYgZmlsZTsgZmlsZSA9IGZpbGUtPm1vcmUpIHsKKyAgICAgIC8qIENyZWF0ZSB0aGUgcGFydC4gKi8KKyAgICAgIHBhcnQgPSBjdXJsX21pbWVfYWRkcGFydChtdWx0aXBhcnQpOworICAgICAgaWYoIXBhcnQpCisgICAgICAgIHJlc3VsdCA9IENVUkxFX09VVF9PRl9NRU1PUlk7CisKKyAgICAgIC8qIFNldCB0aGUgaGVhZGVycy4gKi8KKyAgICAgIGlmKCFyZXN1bHQpCisgICAgICAgIHJlc3VsdCA9IGN1cmxfbWltZV9oZWFkZXJzKHBhcnQsIGZpbGUtPmNvbnRlbnRoZWFkZXIsIDApOworCisgICAgICAvKiBTZXQgdGhlIGNvbnRlbnQgdHlwZS4gKi8KKyAgICAgIGlmKCFyZXN1bHQgJiZmaWxlLT5jb250ZW50dHlwZSkKKyAgICAgICAgcmVzdWx0ID0gY3VybF9taW1lX3R5cGUocGFydCwgZmlsZS0+Y29udGVudHR5cGUpOworCisgICAgICAvKiBTZXQgZmllbGQgbmFtZS4gKi8KKyAgICAgIGlmKCFyZXN1bHQgJiYgIXBvc3QtPm1vcmUpCisgICAgICAgIHJlc3VsdCA9IHNldG5hbWUocGFydCwgcG9zdC0+bmFtZSwgcG9zdC0+bmFtZWxlbmd0aCk7CisKKyAgICAgIC8qIFByb2Nlc3MgY29udGVudHMuICovCisgICAgICBpZighcmVzdWx0KSB7CisgICAgICAgIGN1cmxfb2ZmX3QgY2xlbiA9IHBvc3QtPmNvbnRlbnRzbGVuZ3RoOworCisgICAgICAgIGlmKHBvc3QtPmZsYWdzICYgQ1VSTF9IVFRQUE9TVF9MQVJHRSkKKyAgICAgICAgICBjbGVuID0gcG9zdC0+Y29udGVudGxlbjsKKyAgICAgICAgaWYoIWNsZW4pCisgICAgICAgICAgY2xlbiA9IC0xOworCisgICAgICAgIGlmKHBvc3QtPmZsYWdzICYgKEhUVFBQT1NUX0ZJTEVOQU1FIHwgSFRUUFBPU1RfUkVBREZJTEUpKSB7CisgICAgICAgICAgaWYoIXN0cmNtcChmaWxlLT5jb250ZW50cywgIi0iKSkgeworICAgICAgICAgICAgLyogVGhlcmUgYXJlIGEgZmV3IGNhc2VzIHdoZXJlIHRoZSBjb2RlIGJlbG93IHdvbid0IHdvcms7IGluCisgICAgICAgICAgICAgICBwYXJ0aWN1bGFyLCBmcmVvcGVuKHN0ZGluKSBieSB0aGUgY2FsbGVyIGlzIG5vdCBndWFyYW50ZWVkCisgICAgICAgICAgICAgICB0byByZXN1bHQgYXMgZXhwZWN0ZWQuIFRoaXMgZmVhdHVyZSBoYXMgYmVlbiBrZXB0IGZvciBiYWNrd2FyZAorICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eTogdXNlIG9mICItIiBwc2V1ZG8gZmlsZSBuYW1lIHNob3VsZCBiZSBhdm9pZGVkLiAqLworICAgICAgICAgICAgcmVzdWx0ID0gY3VybF9taW1lX2RhdGFfY2IocGFydCwgKGN1cmxfb2ZmX3QpIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cmxfcmVhZF9jYWxsYmFjaykgZnJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3VybF9zZWVrX2NhbGxiYWNrKSBmc2VlaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICh2b2lkICopIHN0ZGluKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0ID0gY3VybF9taW1lX2ZpbGVkYXRhKHBhcnQsIGZpbGUtPmNvbnRlbnRzKTsKKyAgICAgICAgICBpZighcmVzdWx0ICYmIChwb3N0LT5mbGFncyAmIEhUVFBQT1NUX1JFQURGSUxFKSkKKyAgICAgICAgICAgIHJlc3VsdCA9IGN1cmxfbWltZV9maWxlbmFtZShwYXJ0LCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKHBvc3QtPmZsYWdzICYgSFRUUFBPU1RfQlVGRkVSKQorICAgICAgICAgIHJlc3VsdCA9IGN1cmxfbWltZV9kYXRhKHBhcnQsIHBvc3QtPmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0LT5idWZmZXJsZW5ndGg/IHBvc3QtPmJ1ZmZlcmxlbmd0aDogLTEpOworICAgICAgICBlbHNlIGlmKHBvc3QtPmZsYWdzICYgSFRUUFBPU1RfQ0FMTEJBQ0spCisgICAgICAgICAgLyogdGhlIGNvbnRlbnRzIHNob3VsZCBiZSByZWFkIHdpdGggdGhlIGNhbGxiYWNrIGFuZCB0aGUgc2l6ZSBpcyBzZXQKKyAgICAgICAgICAgICB3aXRoIHRoZSBjb250ZW50c2xlbmd0aCAqLworICAgICAgICAgIHJlc3VsdCA9IGN1cmxfbWltZV9kYXRhX2NiKHBhcnQsIGNsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlYWRfZnVuYywgTlVMTCwgTlVMTCwgcG9zdC0+dXNlcnApOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICByZXN1bHQgPSBjdXJsX21pbWVfZGF0YShwYXJ0LCBwb3N0LT5jb250ZW50cywgKHNzaXplX3QpIGNsZW4pOworI2lmZGVmIENVUkxfRE9FU19DT05WRVJTSU9OUworICAgICAgICAgIC8qIENvbnZlcnQgdGV4dHVhbCBjb250ZW50cyBub3cuICovCisgICAgICAgICAgaWYoIXJlc3VsdCAmJiBkYXRhICYmIHBhcnQtPmRhdGFzaXplKQorICAgICAgICAgICAgcmVzdWx0ID0gQ3VybF9jb252ZXJ0X3RvX25ldHdvcmsoZGF0YSwgcGFydC0+ZGF0YSwgcGFydC0+ZGF0YXNpemUpOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogU2V0IGZha2UgZmlsZSBuYW1lLiAqLworICAgICAgaWYoIXJlc3VsdCAmJiBwb3N0LT5zaG93ZmlsZW5hbWUpCisgICAgICAgIGlmKHBvc3QtPm1vcmUgfHwgKHBvc3QtPmZsYWdzICYgKEhUVFBQT1NUX0ZJTEVOQU1FIHwgSFRUUFBPU1RfQlVGRkVSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQUE9TVF9DQUxMQkFDSykpKQorICAgICAgICAgIHJlc3VsdCA9IGN1cmxfbWltZV9maWxlbmFtZShwYXJ0LCBwb3N0LT5zaG93ZmlsZW5hbWUpOworICAgIH0KICAgfQogCi0gICpzaXplcCA9IHNpemU7Ci0gICpmaW5hbGZvcm0gPSBmaXJzdGZvcm07CisgIGlmKHJlc3VsdCkKKyAgICBDdXJsX21pbWVfY2xlYW5wYXJ0KGZpbmFsZm9ybSk7CiAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotLyoKLSAqIEN1cmxfRm9ybUluaXQoKSBpbml0cyB0aGUgc3RydWN0ICdmb3JtJyBwb2ludHMgdG8gd2l0aCB0aGUgJ2Zvcm1kYXRhJwotICogYW5kIHJlc2V0cyB0aGUgJ3NlbnQnIGNvdW50ZXIuCi0gKi8KLWludCBDdXJsX0Zvcm1Jbml0KHN0cnVjdCBGb3JtICpmb3JtLCBzdHJ1Y3QgRm9ybURhdGEgKmZvcm1kYXRhKQotewotICBpZighZm9ybWRhdGEpCi0gICAgcmV0dXJuIDE7IC8qIGVycm9yICovCi0KLSAgZm9ybS0+ZGF0YSA9IGZvcm1kYXRhOwotICBmb3JtLT5zZW50ID0gMDsKLSAgZm9ybS0+ZnAgPSBOVUxMOwotICBmb3JtLT5mcmVhZF9mdW5jID0gWkVST19OVUxMOwotCi0gIHJldHVybiAwOwotfQotCi0jaWZuZGVmIF9fVk1TCi0jIGRlZmluZSBmb3Blbl9yZWFkIGZvcGVuCi0jZWxzZQotICAvKgotICAgKiB2bXNmb3BlbnJlYWQKLSAgICoKLSAgICogRm9yIHVwbG9hZCB0byB3b3JrIGFzIGV4cGVjdGVkIG9uIFZNUywgZGlmZmVyZW50IG9wdGlvbmFsCi0gICAqIHBhcmFtZXRlcnMgbXVzdCBiZSBhZGRlZCB0byB0aGUgZm9wZW4gY29tbWFuZCBiYXNlZCBvbgotICAgKiByZWNvcmQgZm9ybWF0IG9mIHRoZSBmaWxlLgotICAgKgotICAgKi8KLSMgZGVmaW5lIGZvcGVuX3JlYWQgdm1zZm9wZW5yZWFkCi1zdGF0aWMgRklMRSAqIHZtc2ZvcGVucmVhZChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICptb2RlKQotewotICBzdHJ1Y3Rfc3RhdCBzdGF0YnVmOwotICBpbnQgcmVzdWx0OwotCi0gIHJlc3VsdCA9IHN0YXQoZmlsZSwgJnN0YXRidWYpOwotCi0gIHN3aXRjaChzdGF0YnVmLnN0X2ZhYl9yZm0pIHsKLSAgY2FzZSBGQUIkQ19WQVI6Ci0gIGNhc2UgRkFCJENfVkZDOgotICBjYXNlIEZBQiRDX1NUTUNSOgotICAgIHJldHVybiBmb3BlbihmaWxlLCBGT1BFTl9SRUFEVEVYVCk7IC8qIFZNUyAqLwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIHJldHVybiBmb3BlbihmaWxlLCBGT1BFTl9SRUFEVEVYVCwgInJmbT1zdG1sZiIsICJjdHg9c3RtIik7Ci0gIH0KLX0KLSNlbmRpZgotCi0vKgotICogcmVhZGZyb21maWxlKCkKLSAqCi0gKiBUaGUgcmVhZCBjYWxsYmFjayB0aGF0IHRoaXMgZnVuY3Rpb24gbWF5IHVzZSBjYW4gcmV0dXJuIGEgdmFsdWUgbGFyZ2VyIHRoYW4KLSAqICdzaXplJyAod2hpY2ggdGhlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMpIHRoYXQgaW5kaWNhdGVzIGEgcHJvYmxlbSBhbmQgaXQKLSAqIG11c3QgYmUgcHJvcGVybHkgZGVhbHQgd2l0aAotICovCi1zdGF0aWMgc2l6ZV90IHJlYWRmcm9tZmlsZShzdHJ1Y3QgRm9ybSAqZm9ybSwgY2hhciAqYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpCi17Ci0gIHNpemVfdCBucmVhZDsKLSAgYm9vbCBjYWxsYmFjayA9IChmb3JtLT5kYXRhLT50eXBlID09IEZPUk1fQ0FMTEJBQ0spP1RSVUU6RkFMU0U7Ci0KLSAgaWYoY2FsbGJhY2spIHsKLSAgICBpZihmb3JtLT5mcmVhZF9mdW5jID09IFpFUk9fTlVMTCkKLSAgICAgIHJldHVybiAwOwotICAgIG5yZWFkID0gZm9ybS0+ZnJlYWRfZnVuYyhidWZmZXIsIDEsIHNpemUsIGZvcm0tPmRhdGEtPmxpbmUpOwotICB9Ci0gIGVsc2UgewotICAgIGlmKCFmb3JtLT5mcCkgewotICAgICAgLyogdGhpcyBmaWxlIGhhc24ndCB5ZXQgYmVlbiBvcGVuZWQgKi8KLSAgICAgIGZvcm0tPmZwID0gZm9wZW5fcmVhZChmb3JtLT5kYXRhLT5saW5lLCAicmIiKTsgLyogYiBpcyBmb3IgYmluYXJ5ICovCi0gICAgICBpZighZm9ybS0+ZnApCi0gICAgICAgIHJldHVybiAoc2l6ZV90KS0xOyAvKiBmYWlsdXJlICovCi0gICAgfQotICAgIG5yZWFkID0gZnJlYWQoYnVmZmVyLCAxLCBzaXplLCBmb3JtLT5mcCk7Ci0gIH0KLSAgaWYoIW5yZWFkKSB7Ci0gICAgLyogdGhpcyBpcyB0aGUgbGFzdCBjaHVuayBmcm9tIHRoZSBmaWxlLCBtb3ZlIG9uICovCi0gICAgaWYoZm9ybS0+ZnApIHsKLSAgICAgIGZjbG9zZShmb3JtLT5mcCk7Ci0gICAgICBmb3JtLT5mcCA9IE5VTEw7Ci0gICAgfQotICAgIGZvcm0tPmRhdGEgPSBmb3JtLT5kYXRhLT5uZXh0OwotICB9Ci0KLSAgcmV0dXJuIG5yZWFkOwotfQotCi0vKgotICogQ3VybF9Gb3JtUmVhZGVyKCkgaXMgdGhlIGZyZWFkKCkgZW11bGF0aW9uIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvCi0gKiBkZWxpdmVyIHRoZSBmb3JtZGF0YSB0byB0aGUgdHJhbnNmZXIgbG9vcCBhbmQgdGhlbiBzZW50IGF3YXkgdG8gdGhlIHBlZXIuCi0gKi8KLXNpemVfdCBDdXJsX0Zvcm1SZWFkZXIoY2hhciAqYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5pdGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgRklMRSAqbXlkYXRhKQotewotICBzdHJ1Y3QgRm9ybSAqZm9ybTsKLSAgc2l6ZV90IHdhbnRlZHNpemU7Ci0gIHNpemVfdCBnb3RzaXplID0gMDsKLQotICBmb3JtPShzdHJ1Y3QgRm9ybSAqKW15ZGF0YTsKLQotICB3YW50ZWRzaXplID0gc2l6ZSAqIG5pdGVtczsKLQotICBpZighZm9ybS0+ZGF0YSkKLSAgICByZXR1cm4gMDsgLyogbm90aGluZywgZXJyb3IsIGVtcHR5ICovCi0KLSAgaWYoKGZvcm0tPmRhdGEtPnR5cGUgPT0gRk9STV9GSUxFKSB8fAotICAgICAoZm9ybS0+ZGF0YS0+dHlwZSA9PSBGT1JNX0NBTExCQUNLKSkgewotICAgIGdvdHNpemUgPSByZWFkZnJvbWZpbGUoZm9ybSwgYnVmZmVyLCB3YW50ZWRzaXplKTsKLQotICAgIGlmKGdvdHNpemUpCi0gICAgICAvKiBJZiBwb3NpdGl2ZSBvciAtMSwgcmV0dXJuLiBJZiB6ZXJvLCBjb250aW51ZSEgKi8KLSAgICAgIHJldHVybiBnb3RzaXplOwotICB9Ci0gIGRvIHsKLQotICAgIGlmKChmb3JtLT5kYXRhLT5sZW5ndGggLSBmb3JtLT5zZW50KSA+IHdhbnRlZHNpemUgLSBnb3RzaXplKSB7Ci0KLSAgICAgIG1lbWNweShidWZmZXIgKyBnb3RzaXplLCBmb3JtLT5kYXRhLT5saW5lICsgZm9ybS0+c2VudCwKLSAgICAgICAgICAgICB3YW50ZWRzaXplIC0gZ290c2l6ZSk7Ci0KLSAgICAgIGZvcm0tPnNlbnQgKz0gd2FudGVkc2l6ZS1nb3RzaXplOwotCi0gICAgICByZXR1cm4gd2FudGVkc2l6ZTsKLSAgICB9Ci0KLSAgICBtZW1jcHkoYnVmZmVyK2dvdHNpemUsCi0gICAgICAgICAgIGZvcm0tPmRhdGEtPmxpbmUgKyBmb3JtLT5zZW50LAotICAgICAgICAgICAoZm9ybS0+ZGF0YS0+bGVuZ3RoIC0gZm9ybS0+c2VudCkgKTsKLSAgICBnb3RzaXplICs9IGZvcm0tPmRhdGEtPmxlbmd0aCAtIGZvcm0tPnNlbnQ7Ci0KLSAgICBmb3JtLT5zZW50ID0gMDsKLQotICAgIGZvcm0tPmRhdGEgPSBmb3JtLT5kYXRhLT5uZXh0OyAvKiBhZHZhbmNlICovCi0KLSAgfSB3aGlsZShmb3JtLT5kYXRhICYmIChmb3JtLT5kYXRhLT50eXBlIDwgRk9STV9DQUxMQkFDSykpOwotICAvKiBJZiB3ZSBnb3QgYW4gZW1wdHkgbGluZSBhbmQgd2UgaGF2ZSBtb3JlIGRhdGEsIHdlIHByb2NlZWQgdG8gdGhlIG5leHQKLSAgICAgbGluZSBpbW1lZGlhdGVseSB0byBhdm9pZCByZXR1cm5pbmcgemVybyBiZWZvcmUgd2UndmUgcmVhY2hlZCB0aGUgZW5kLiAqLwotCi0gIHJldHVybiBnb3RzaXplOwotfQotCi0vKgotICogQ3VybF9mb3JtcG9zdGhlYWRlcigpIHJldHVybnMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGZvcm1wb3N0LCB0aGUKLSAqIHJlcXVlc3QtaGVhZGVyIHBhcnQgKHdoaWNoIGlzIG5vdCBwYXJ0IG9mIHRoZSByZXF1ZXN0LWJvZHkgbGlrZSB0aGUgcmVzdCBvZgotICogdGhlIHBvc3QpLgotICovCi1jaGFyICpDdXJsX2Zvcm1wb3N0aGVhZGVyKHZvaWQgKmZvcm1wLCBzaXplX3QgKmxlbikKLXsKLSAgY2hhciAqaGVhZGVyOwotICBzdHJ1Y3QgRm9ybSAqZm9ybT0oc3RydWN0IEZvcm0gKilmb3JtcDsKLQotICBpZighZm9ybS0+ZGF0YSkKLSAgICByZXR1cm4gTlVMTDsgLyogbm90aGluZywgRVJST1IhICovCi0KLSAgaGVhZGVyID0gZm9ybS0+ZGF0YS0+bGluZTsKLSAgKmxlbiA9IGZvcm0tPmRhdGEtPmxlbmd0aDsKLQotICBmb3JtLT5kYXRhID0gZm9ybS0+ZGF0YS0+bmV4dDsgLyogYWR2YW5jZSAqLwotCi0gIHJldHVybiBoZWFkZXI7Ci19Ci0KLS8qCi0gKiBmb3JtYm91bmRhcnkoKSBjcmVhdGVzIGEgc3VpdGFibGUgYm91bmRhcnkgc3RyaW5nIGFuZCByZXR1cm5zIGFuIGFsbG9jYXRlZAotICogb25lLgotICovCi1zdGF0aWMgQ1VSTGNvZGUgZm9ybWJvdW5kYXJ5KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmxlbikKLXsKLSAgLyogMjQgZGFzaGVzIGFuZCAxNiBoZXhhZGVjaW1hbCBkaWdpdHMgbWFrZXMgNjQgYml0ICgxODQ0Njc0NDA3MzcwOTU1MTYxNSkKLSAgICAgY29tYmluYXRpb25zICovCi0gIGlmKGJ1ZmxlbiA8IDQxKQotICAgIHJldHVybiBDVVJMRV9CQURfRlVOQ1RJT05fQVJHVU1FTlQ7Ci0KLSAgbWVtc2V0KGJ1ZmZlciwgJy0nLCAyNCk7Ci0gIEN1cmxfcmFuZF9oZXgoZGF0YSwgKHVuc2lnbmVkIGNoYXIgKikmYnVmZmVyWzI0XSwgMTcpOwotCi0gIHJldHVybiBDVVJMRV9PSzsKLX0KLQogI2Vsc2UgIC8qIENVUkxfRElTQUJMRV9IVFRQICovCiBDVVJMRk9STWNvZGUgY3VybF9mb3JtYWRkKHN0cnVjdCBjdXJsX2h0dHBwb3N0ICoqaHR0cHBvc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjdXJsX2h0dHBwb3N0ICoqbGFzdF9wb3N0LApkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvZm9ybWRhdGEuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2Zvcm1kYXRhLmgKaW5kZXggNjk2MjlmNi4uMTI0NmMyYiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvZm9ybWRhdGEuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9mb3JtZGF0YS5oCkBAIC03LDcgKzcsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC0yMiwzMiArMjIsNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWVudW0gZm9ybXR5cGUgewotICBGT1JNX0RBVEFNRU0sIC8qIGFscmVhZHkgYWxsb2NhdGVkIEZPUk1fREFUQSBtZW1vcnkgKi8KLSAgRk9STV9EQVRBLCAgICAvKiBmb3JtIG1ldGFkYXRhIChjb252ZXJ0IHRvIG5ldHdvcmsgZW5jb2RpbmcgaWYgbmVjZXNzYXJ5KSAqLwotICBGT1JNX0NPTlRFTlQsIC8qIGZvcm0gY29udGVudCAgKG5ldmVyIGNvbnZlcnQpICovCi0gIEZPUk1fQ0FMTEJBQ0ssIC8qICdsaW5lJyBwb2ludHMgdG8gdGhlIGN1c3RvbSBwb2ludGVyIHdlIHBhc3MgdG8gdGhlIGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgICAqLwotICBGT1JNX0ZJTEUgICAgIC8qICdsaW5lJyBwb2ludHMgdG8gYSBmaWxlIG5hbWUgd2Ugc2hvdWxkIHJlYWQgZnJvbQotICAgICAgICAgICAgICAgICAgIHRvIGNyZWF0ZSB0aGUgZm9ybSBkYXRhIChuZXZlciBjb252ZXJ0KSAqLwotfTsKLQotLyogcGxhaW4gYW5kIHNpbXBsZSBsaW5rZWQgbGlzdCB3aXRoIGxpbmVzIHRvIHNlbmQgKi8KLXN0cnVjdCBGb3JtRGF0YSB7Ci0gIHN0cnVjdCBGb3JtRGF0YSAqbmV4dDsKLSAgZW51bSBmb3JtdHlwZSB0eXBlOwotICBjaGFyICpsaW5lOwotICBzaXplX3QgbGVuZ3RoOwotfTsKLQotc3RydWN0IEZvcm0gewotICBzdHJ1Y3QgRm9ybURhdGEgKmRhdGE7IC8qIGN1cnJlbnQgZm9ybSBsaW5lIHRvIHNlbmQgKi8KLSAgc2l6ZV90IHNlbnQ7ICAgICAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgb2YgdGhlIGN1cnJlbnQgbGluZSB0aGF0IGhhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBzZW50IGluIGEgcHJldmlvdXMgaW52b2tlICovCi0gIEZJTEUgKmZwOyAgICAgICAgICAgICAgLyogZmlsZSB0byByZWFkIGZyb20gKi8KLSAgY3VybF9yZWFkX2NhbGxiYWNrIGZyZWFkX2Z1bmM7IC8qIGZyZWFkIGNhbGxiYWNrIHBvaW50ZXIgKi8KLX07Ci0KIC8qIHVzZWQgYnkgRm9ybUFkZCBmb3IgdGVtcG9yYXJ5IHN0b3JhZ2UgKi8KIHR5cGVkZWYgc3RydWN0IEZvcm1JbmZvIHsKICAgY2hhciAqbmFtZTsKQEAgLTY5LDMxICs0Myw5IEBACiAgIHN0cnVjdCBGb3JtSW5mbyAqbW9yZTsKIH0gRm9ybUluZm87CiAKLWludCBDdXJsX0Zvcm1Jbml0KHN0cnVjdCBGb3JtICpmb3JtLCBzdHJ1Y3QgRm9ybURhdGEgKmZvcm1kYXRhKTsKLQogQ1VSTGNvZGUgQ3VybF9nZXRmb3JtZGF0YShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9ybURhdGEgKiosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfbWltZXBhcnQgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGN1cmxfaHR0cHBvc3QgKnBvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmN1c3RvbV9jb250ZW50dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9vZmZfdCAqc2l6ZSk7Ci0KLS8qIGZyZWFkKCkgZW11bGF0aW9uICovCi1zaXplX3QgQ3VybF9Gb3JtUmVhZGVyKGNoYXIgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuaXRlbXMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZJTEUgKm15ZGF0YSk7Ci0KLS8qCi0gKiBDdXJsX2Zvcm1wb3N0aGVhZGVyKCkgcmV0dXJucyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZm9ybXBvc3QsIHRoZQotICogcmVxdWVzdC1oZWFkZXIgcGFydCAod2hpY2ggaXMgbm90IHBhcnQgb2YgdGhlIHJlcXVlc3QtYm9keSBsaWtlIHRoZSByZXN0IG9mCi0gKiB0aGUgcG9zdCkuCi0gKi8KLWNoYXIgKkN1cmxfZm9ybXBvc3RoZWFkZXIodm9pZCAqZm9ybXAsIHNpemVfdCAqbGVuKTsKLQotY2hhciAqQ3VybF9Gb3JtQm91bmRhcnkodm9pZCk7Ci0KLXZvaWQgQ3VybF9mb3JtY2xlYW4oc3RydWN0IEZvcm1EYXRhICoqKTsKLQotQ1VSTGNvZGUgQ3VybF9mb3JtY29udmVydChzdHJ1Y3QgQ3VybF9lYXN5ICosIHN0cnVjdCBGb3JtRGF0YSAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9yZWFkX2NhbGxiYWNrIGZyZWFkX2Z1bmMpOwogCiAjZW5kaWYgLyogSEVBREVSX0NVUkxfRk9STURBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvZnRwLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9mdHAuYwppbmRleCA3ODNkYmUxLi44NGFlMzdiIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9mdHAuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9mdHAuYwpAQCAtMTc4LDEwICsxNzgsMTEgQEAKICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIGZ0cF9kaXNjb25uZWN0LCAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCisgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9GVFAsICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fRlRQLCAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwotICBQUk9UT1BUX0RVQUwgfCBQUk9UT1BUX0NMT1NFQUNUSU9OIHwgUFJPVE9QVF9ORUVEU1BXRAotICB8IFBST1RPUFRfTk9VUkxRVUVSWSAvKiBmbGFncyAqLworICBQUk9UT1BUX0RVQUwgfCBQUk9UT1BUX0NMT1NFQUNUSU9OIHwgUFJPVE9QVF9ORUVEU1BXRCB8CisgIFBST1RPUFRfTk9VUkxRVUVSWSB8IFBST1RPUFRfUFJPWFlfQVNfSFRUUCAvKiBmbGFncyAqLwogfTsKIAogCkBAIC0yMDUsNiArMjA2LDcgQEAKICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIGZ0cF9kaXNjb25uZWN0LCAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCisgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9GVFBTLCAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fRlRQUywgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwogICBQUk9UT1BUX1NTTCB8IFBST1RPUFRfRFVBTCB8IFBST1RPUFRfQ0xPU0VBQ1RJT04gfApAQCAtMjEyLDU5ICsyMTQsNiBAQAogfTsKICNlbmRpZgogCi0jaWZuZGVmIENVUkxfRElTQUJMRV9IVFRQCi0vKgotICogSFRUUC1wcm94eWVkIEZUUCBwcm90b2NvbCBoYW5kbGVyLgotICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgQ3VybF9oYW5kbGVyIEN1cmxfaGFuZGxlcl9mdHBfcHJveHkgPSB7Ci0gICJGVFAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NoZW1lICovCi0gIEN1cmxfaHR0cF9zZXR1cF9jb25uLCAgICAgICAgICAgICAgICAgLyogc2V0dXBfY29ubmVjdGlvbiAqLwotICBDdXJsX2h0dHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvX2l0ICovCi0gIEN1cmxfaHR0cF9kb25lLCAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvX21vcmUgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0X2l0ICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGluZyAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvaW5nICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9fZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvaW5nX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb21vcmVfZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KLSAgUE9SVF9GVFAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCi0gIENVUkxQUk9UT19IVFRQLCAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KLSAgUFJPVE9QVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFncyAqLwotfTsKLQotCi0jaWZkZWYgVVNFX1NTTAotLyoKLSAqIEhUVFAtcHJveHllZCBGVFBTIHByb3RvY29sIGhhbmRsZXIuCi0gKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBDdXJsX2hhbmRsZXIgQ3VybF9oYW5kbGVyX2Z0cHNfcHJveHkgPSB7Ci0gICJGVFBTIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NoZW1lICovCi0gIEN1cmxfaHR0cF9zZXR1cF9jb25uLCAgICAgICAgICAgICAgICAgLyogc2V0dXBfY29ubmVjdGlvbiAqLwotICBDdXJsX2h0dHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvX2l0ICovCi0gIEN1cmxfaHR0cF9kb25lLCAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvX21vcmUgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0X2l0ICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGluZyAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvaW5nICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9fZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvaW5nX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb21vcmVfZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KLSAgUE9SVF9GVFBTLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCi0gIENVUkxQUk9UT19IVFRQLCAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KLSAgUFJPVE9QVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFncyAqLwotfTsKLSNlbmRpZgotI2VuZGlmCi0KIHN0YXRpYyB2b2lkIGNsb3NlX3NlY29uZGFyeXNvY2tldChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pCiB7CiAgIGlmKENVUkxfU09DS0VUX0JBRCAhPSBjb25uLT5zb2NrW1NFQ09OREFSWVNPQ0tFVF0pIHsKQEAgLTI3Miw3ICsyMjEsNiBAQAogICAgIGNvbm4tPnNvY2tbU0VDT05EQVJZU09DS0VUXSA9IENVUkxfU09DS0VUX0JBRDsKICAgfQogICBjb25uLT5iaXRzLnRjcGNvbm5lY3RbU0VDT05EQVJZU09DS0VUXSA9IEZBTFNFOwotICBjb25uLT50dW5uZWxfc3RhdGVbU0VDT05EQVJZU09DS0VUXSA9IFRVTk5FTF9JTklUOwogfQogCiAvKgpAQCAtMjkxLDkgKzIzOSw5IEBACiB7CiAgIGludCBpOwogICBpZihmdHBjLT5kaXJzKSB7Ci0gICAgZm9yKGk9MDsgaSA8IGZ0cGMtPmRpcmRlcHRoOyBpKyspIHsKKyAgICBmb3IoaSA9IDA7IGkgPCBmdHBjLT5kaXJkZXB0aDsgaSsrKSB7CiAgICAgICBmcmVlKGZ0cGMtPmRpcnNbaV0pOwotICAgICAgZnRwYy0+ZGlyc1tpXT1OVUxMOworICAgICAgZnRwYy0+ZGlyc1tpXSA9IE5VTEw7CiAgICAgfQogICAgIGZyZWUoZnRwYy0+ZGlycyk7CiAgICAgZnRwYy0+ZGlycyA9IE5VTEw7CkBAIC0zNDAsNyArMjg4LDcgQEAKICAgaWYoMCA9PSBnZXRzb2NrbmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZhZGQsICZzaXplKSkgewogICAgIHNpemUgPSBzaXplb2YoYWRkKTsKIAotICAgIHM9YWNjZXB0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZCwgJnNpemUpOworICAgIHMgPSBhY2NlcHQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkLCAmc2l6ZSk7CiAgIH0KICAgQ3VybF9jbG9zZXNvY2tldChjb25uLCBzb2NrKTsgLyogY2xvc2UgdGhlIGZpcnN0IHNvY2tldCAqLwogCkBAIC0zODgsNyArMzM2LDcgQEAKIHsKICAgdGltZV90IHRpbWVvdXRfbXMgPSBERUZBVUxUX0FDQ0VQVF9USU1FT1VUOwogICB0aW1lX3Qgb3RoZXI7Ci0gIHN0cnVjdCB0aW1ldmFsIG5vdzsKKyAgc3RydWN0IGN1cmx0aW1lIG5vdzsKIAogICBpZihkYXRhLT5zZXQuYWNjZXB0dGltZW91dCA+IDApCiAgICAgdGltZW91dF9tcyA9IGRhdGEtPnNldC5hY2NlcHR0aW1lb3V0OwpAQCAtNTA5LDcgKzQ1Nyw3IEBACiAgIH0KIAogICBpZihjb25uLT5wcm90by5mdHBjLnN0YXRlX3NhdmVkID09IEZUUF9TVE9SKSB7Ci0gICAgKihmdHAtPmJ5dGVjb3VudHApPTA7CisgICAgKihmdHAtPmJ5dGVjb3VudHApID0gMDsKIAogICAgIC8qIFdoZW4gd2Uga25vdyB3ZSdyZSB1cGxvYWRpbmcgYSBzcGVjaWZpZWQgZmlsZSwgd2UgY2FuIGdldCB0aGUgZmlsZQogICAgICAgIHNpemUgcHJpb3IgdG8gdGhlIGFjdHVhbCB1cGxvYWQuICovCkBAIC02NDQsNyArNTkyLDcgQEAKICNlbmRpZgogCiAgIC8qIHN0b3JlIHRoZSBsYXRlc3QgY29kZSBmb3IgbGF0ZXIgcmV0cmlldmFsICovCi0gIGRhdGEtPmluZm8uaHR0cGNvZGU9Y29kZTsKKyAgZGF0YS0+aW5mby5odHRwY29kZSA9IGNvZGU7CiAKICAgaWYoZnRwY29kZSkKICAgICAqZnRwY29kZSA9IGNvZGU7CkBAIC02OTIsOCArNjQwLDggQEAKICAgc3RydWN0IGZ0cF9jb25uICpmdHBjID0gJmNvbm4tPnByb3RvLmZ0cGM7CiAgIHN0cnVjdCBwaW5ncG9uZyAqcHAgPSAmZnRwYy0+cHA7CiAgIHNpemVfdCBucmVhZDsKLSAgaW50IGNhY2hlX3NraXA9MDsKLSAgaW50IHZhbHVlX3RvX2JlX2lnbm9yZWQ9MDsKKyAgaW50IGNhY2hlX3NraXAgPSAwOworICBpbnQgdmFsdWVfdG9fYmVfaWdub3JlZCA9IDA7CiAKICAgaWYoZnRwY29kZSkKICAgICAqZnRwY29kZSA9IDA7IC8qIDAgZm9yIGVycm9ycyAqLwpAQCAtNzAxLDEzICs2NDksMTMgQEAKICAgICAvKiBtYWtlIHRoZSBwb2ludGVyIHBvaW50IHRvIHNvbWV0aGluZyBmb3IgdGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiAqLwogICAgIGZ0cGNvZGUgPSAmdmFsdWVfdG9fYmVfaWdub3JlZDsKIAotICAqbnJlYWRwPTA7CisgICpucmVhZHAgPSAwOwogCiAgIHdoaWxlKCEqZnRwY29kZSAmJiAhcmVzdWx0KSB7CiAgICAgLyogY2hlY2sgYW5kIHJlc2V0IHRpbWVvdXQgdmFsdWUgZXZlcnkgbGFwICovCiAgICAgdGltZW91dCA9IEN1cmxfcHBfc3RhdGVfdGltZW91dChwcCk7CiAKLSAgICBpZih0aW1lb3V0IDw9MCkgeworICAgIGlmKHRpbWVvdXQgPD0gMCkgewogICAgICAgZmFpbGYoZGF0YSwgIkZUUCByZXNwb25zZSB0aW1lb3V0Iik7CiAgICAgICByZXR1cm4gQ1VSTEVfT1BFUkFUSU9OX1RJTUVET1VUOyAvKiBhbHJlYWR5IHRvbyBsaXR0bGUgdGltZSAqLwogICAgIH0KQEAgLTc2NSw3ICs3MTMsNyBAQAogICAgIGVsc2UKICAgICAgIC8qIHdoZW4gd2UgZ290IGRhdGEgb3IgdGhlcmUgaXMgbm8gY2FjaGUgbGVmdCwgd2UgcmVzZXQgdGhlIGNhY2hlIHNraXAKICAgICAgICAgIGNvdW50ZXIgKi8KLSAgICAgIGNhY2hlX3NraXA9MDsKKyAgICAgIGNhY2hlX3NraXAgPSAwOwogCiAgICAgKm5yZWFkcCArPSBucmVhZDsKIApAQCAtOTAwLDcgKzg0OCw3IEBACiAgICAgICBpbnQgaTsKICAgICAgIC8qIFBPUlQgaXMgdXNlZCB0byB0ZWxsIHRoZSBzZXJ2ZXIgdG8gY29ubmVjdCB0byB1cywgYW5kIGR1cmluZyB0aGF0IHdlCiAgICAgICAgICBkb24ndCBkbyBoYXBweSBleWViYWxscywgYnV0IHdlIGRvIGlmIHdlIGNvbm5lY3QgdG8gdGhlIHNlcnZlciAqLwotICAgICAgZm9yKHM9MSwgaT0wOyBpPDI7IGkrKykgeworICAgICAgZm9yKHMgPSAxLCBpID0gMDsgaTwyOyBpKyspIHsKICAgICAgICAgaWYoY29ubi0+dGVtcHNvY2tbaV0gIT0gQ1VSTF9TT0NLRVRfQkFEKSB7CiAgICAgICAgICAgc29ja3Nbc10gPSBjb25uLT50ZW1wc29ja1tpXTsKICAgICAgICAgICBiaXRzIHw9IEdFVFNPQ0tfV1JJVEVTT0NLKHMrKyk7CkBAIC05MzcsMjMgKzg4NSwyNiBAQAogICAgIC8qIGNvdW50MyBpcyBzZXQgdG8gYWxsb3cgYSBNS0QgdG8gZmFpbCBvbmNlLiBJbiB0aGUgY2FzZSB3aGVuIGZpcnN0IENXRAogICAgICAgIGZhaWxzIGFuZCB0aGVuIE1LRCBmYWlscyAoZHVlIHRvIGFub3RoZXIgc2Vzc2lvbiByYWNlZCBpdCB0byBjcmVhdGUgdGhlCiAgICAgICAgZGlyKSB0aGlzIHRoZW4gYWxsb3dzIGZvciBhIHNlY29uZCB0cnkgdG8gQ1dEIHRvIGl0ICovCi0gICAgZnRwYy0+Y291bnQzID0gKGNvbm4tPmRhdGEtPnNldC5mdHBfY3JlYXRlX21pc3NpbmdfZGlycz09Mik/MTowOworICAgIGZ0cGMtPmNvdW50MyA9IChjb25uLT5kYXRhLT5zZXQuZnRwX2NyZWF0ZV9taXNzaW5nX2RpcnMgPT0gMik/MTowOwogCi0gICAgaWYoY29ubi0+Yml0cy5yZXVzZSAmJiBmdHBjLT5lbnRyeXBhdGgpIHsKKyAgICBpZigoY29ubi0+ZGF0YS0+c2V0LmZ0cF9maWxlbWV0aG9kID09IEZUUEZJTEVfTk9DV0QpICYmICFmdHBjLT5jd2Rjb3VudCkKKyAgICAgIC8qIE5vIENXRCBuZWNlc3NhcnkgKi8KKyAgICAgIHJlc3VsdCA9IGZ0cF9zdGF0ZV9tZHRtKGNvbm4pOworICAgIGVsc2UgaWYoY29ubi0+Yml0cy5yZXVzZSAmJiBmdHBjLT5lbnRyeXBhdGgpIHsKICAgICAgIC8qIFRoaXMgaXMgYSByZS11c2VkIGNvbm5lY3Rpb24uIFNpbmNlIHdlIGNoYW5nZSBkaXJlY3RvcnkgdG8gd2hlcmUgdGhlCiAgICAgICAgICB0cmFuc2ZlciBpcyB0YWtpbmcgcGxhY2UsIHdlIG11c3QgZmlyc3QgZ2V0IGJhY2sgdG8gdGhlIG9yaWdpbmFsIGRpcgogICAgICAgICAgd2hlcmUgd2UgZW5kZWQgdXAgYWZ0ZXIgbG9naW46ICovCi0gICAgICBmdHBjLT5jb3VudDEgPSAwOyAvKiB3ZSBjb3VudCB0aGlzIGFzIHRoZSBmaXJzdCBwYXRoLCB0aGVuIHdlIGFkZCBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFsbCB1cGNvbWluZyBvbmVzIGluIHRoZSBmdHAtPmRpcnNbXSBhcnJheSAqLworICAgICAgZnRwYy0+Y3dkY291bnQgPSAwOyAvKiB3ZSBjb3VudCB0aGlzIGFzIHRoZSBmaXJzdCBwYXRoLCB0aGVuIHdlIGFkZCBvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFsbCB1cGNvbWluZyBvbmVzIGluIHRoZSBmdHAtPmRpcnNbXSBhcnJheSAqLwogICAgICAgUFBTRU5ERigmY29ubi0+cHJvdG8uZnRwYy5wcCwgIkNXRCAlcyIsIGZ0cGMtPmVudHJ5cGF0aCk7CiAgICAgICBzdGF0ZShjb25uLCBGVFBfQ1dEKTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICBpZihmdHBjLT5kaXJkZXB0aCkgewotICAgICAgICBmdHBjLT5jb3VudDEgPSAxOworICAgICAgICBmdHBjLT5jd2Rjb3VudCA9IDE7CiAgICAgICAgIC8qIGlzc3VlIHRoZSBmaXJzdCBDV0QsIHRoZSByZXN0IGlzIHNlbnQgd2hlbiB0aGUgQ1dEIHJlc3BvbnNlcyBhcmUKICAgICAgICAgICAgcmVjZWl2ZWQuLi4gKi8KLSAgICAgICAgUFBTRU5ERigmY29ubi0+cHJvdG8uZnRwYy5wcCwgIkNXRCAlcyIsIGZ0cGMtPmRpcnNbZnRwYy0+Y291bnQxIC0xXSk7CisgICAgICAgIFBQU0VOREYoJmNvbm4tPnByb3RvLmZ0cGMucHAsICJDV0QgJXMiLCBmdHBjLT5kaXJzW2Z0cGMtPmN3ZGNvdW50IC0xXSk7CiAgICAgICAgIHN0YXRlKGNvbm4sIEZUUF9DV0QpOwogICAgICAgfQogICAgICAgZWxzZSB7CkBAIC05NzcsMTUgKzkyOCwxNSBAQAogewogICBDVVJMY29kZSByZXN1bHQgPSBDVVJMRV9PSzsKICAgc3RydWN0IGZ0cF9jb25uICpmdHBjID0gJmNvbm4tPnByb3RvLmZ0cGM7Ci0gIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGE9Y29ubi0+ZGF0YTsKLSAgY3VybF9zb2NrZXRfdCBwb3J0c29jaz0gQ1VSTF9TT0NLRVRfQkFEOworICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKKyAgY3VybF9zb2NrZXRfdCBwb3J0c29jayA9IENVUkxfU09DS0VUX0JBRDsKICAgY2hhciBteWhvc3RbMjU2XSA9ICIiOwogCiAgIHN0cnVjdCBDdXJsX3NvY2thZGRyX3N0b3JhZ2Ugc3M7CiAgIEN1cmxfYWRkcmluZm8gKnJlcywgKmFpOwogICBjdXJsX3NvY2tsZW5fdCBzc2xlbjsKICAgY2hhciBoYnVmW05JX01BWEhPU1RdOwotICBzdHJ1Y3Qgc29ja2FkZHIgKnNhPShzdHJ1Y3Qgc29ja2FkZHIgKikmc3M7CisgIHN0cnVjdCBzb2NrYWRkciAqc2EgPSAoc3RydWN0IHNvY2thZGRyICopJnNzOwogICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKiBjb25zdCBzYTQgPSAodm9pZCAqKXNhOwogI2lmZGVmIEVOQUJMRV9JUFY2CiAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgKiBjb25zdCBzYTYgPSAodm9pZCAqKXNhOwpAQCAtOTk2LDcgKzk0Nyw3IEBACiAgIGludCBlcnJvcjsKICAgY2hhciAqaG9zdCA9IE5VTEw7CiAgIGNoYXIgKnN0cmluZ19mdHBwb3J0ID0gZGF0YS0+c2V0LnN0cltTVFJJTkdfRlRQUE9SVF07Ci0gIHN0cnVjdCBDdXJsX2Ruc19lbnRyeSAqaD1OVUxMOworICBzdHJ1Y3QgQ3VybF9kbnNfZW50cnkgKmggPSBOVUxMOwogICB1bnNpZ25lZCBzaG9ydCBwb3J0X21pbiA9IDA7CiAgIHVuc2lnbmVkIHNob3J0IHBvcnRfbWF4ID0gMDsKICAgdW5zaWduZWQgc2hvcnQgcG9ydDsKQEAgLTEwMjQsNyArOTc1LDcgQEAKICAgICBjaGFyICpwb3J0X3N0YXJ0ID0gTlVMTDsKICAgICBjaGFyICpwb3J0X3NlcCA9IE5VTEw7CiAKLSAgICBhZGRyID0gY2FsbG9jKGFkZHJsZW4rMSwgMSk7CisgICAgYWRkciA9IGNhbGxvYyhhZGRybGVuICsgMSwgMSk7CiAgICAgaWYoIWFkZHIpCiAgICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKIApAQCAtMTA2Nyw3ICsxMDE4LDcgQEAKICAgICBpZihpcF9lbmQgIT0gTlVMTCkgewogICAgICAgcG9ydF9zdGFydCA9IHN0cmNocihpcF9lbmQsICc6Jyk7CiAgICAgICBpZihwb3J0X3N0YXJ0KSB7Ci0gICAgICAgIHBvcnRfbWluID0gY3VybHhfdWx0b3VzKHN0cnRvdWwocG9ydF9zdGFydCsxLCBOVUxMLCAxMCkpOworICAgICAgICBwb3J0X21pbiA9IGN1cmx4X3VsdG91cyhzdHJ0b3VsKHBvcnRfc3RhcnQgKyAxLCBOVUxMLCAxMCkpOwogICAgICAgICBwb3J0X3NlcCA9IHN0cmNocihwb3J0X3N0YXJ0LCAnLScpOwogICAgICAgICBpZihwb3J0X3NlcCkgewogICAgICAgICAgIHBvcnRfbWF4ID0gY3VybHhfdWx0b3VzKHN0cnRvdWwocG9ydF9zZXAgKyAxLCBOVUxMLCAxMCkpOwpAQCAtMTMxMSw3ICsxMjYyLDcgQEAKICAgICAgIC8qIHRyYW5zbGF0ZSB4LngueC54IHRvIHgseCx4LHggKi8KICAgICAgIHdoaWxlKHNvdXJjZSAmJiAqc291cmNlKSB7CiAgICAgICAgIGlmKCpzb3VyY2UgPT0gJy4nKQotICAgICAgICAgICpkZXN0PScsJzsKKyAgICAgICAgICAqZGVzdCA9ICcsJzsKICAgICAgICAgZWxzZQogICAgICAgICAgICpkZXN0ID0gKnNvdXJjZTsKICAgICAgICAgZGVzdCsrOwpAQCAtMTUxOCwxMiArMTQ2OSwxMiBAQAogICAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CiAKICAgICAvKiBDaGVjayBpZiBwYXRoIGRvZXMgbm90IGVuZCB3aXRoIC8sIGFzIHRoZW4gd2UgY3V0IG9mZiB0aGUgZmlsZSBwYXJ0ICovCi0gICAgaWYobHN0QXJnW3N0cmxlbihsc3RBcmcpIC0gMV0gIT0gJy8nKSAgeworICAgIGlmKGxzdEFyZ1tzdHJsZW4obHN0QXJnKSAtIDFdICE9ICcvJykgewogCiAgICAgICAvKiBjaG9wIG9mZiB0aGUgZmlsZSBwYXJ0IGlmIGZvcm1hdCBpcyBkaXIvZGlyL2ZpbGUgKi8KICAgICAgIHNsYXNoUG9zID0gc3RycmNocihsc3RBcmcsICcvJyk7CiAgICAgICBpZihzbGFzaFBvcykKLSAgICAgICAgKihzbGFzaFBvcysxKSA9ICdcMCc7CisgICAgICAgICooc2xhc2hQb3MgKyAxKSA9ICdcMCc7CiAgICAgfQogICB9CiAKQEAgLTE2NzEsNyArMTYyMiw3IEBACiAgICAgfQogCiAgICAgaWYoc2Vla2VyciAhPSBDVVJMX1NFRUtGVU5DX09LKSB7Ci0gICAgICBjdXJsX29mZl90IHBhc3NlZD0wOworICAgICAgY3VybF9vZmZfdCBwYXNzZWQgPSAwOwogICAgICAgaWYoc2Vla2VyciAhPSBDVVJMX1NFRUtGVU5DX0NBTlRTRUVLKSB7CiAgICAgICAgIGZhaWxmKGRhdGEsICJDb3VsZCBub3Qgc2VlayBzdHJlYW0iKTsKICAgICAgICAgcmV0dXJuIENVUkxFX0ZUUF9DT1VMRE5UX1VTRV9SRVNUOwpAQCAtMTczMyw3ICsxNjg0LDcgQEAKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIHN0cnVjdCBGVFAgKmZ0cCA9IGRhdGEtPnJlcS5wcm90b3A7CiAgIHN0cnVjdCBmdHBfY29ubiAqZnRwYyA9ICZjb25uLT5wcm90by5mdHBjOwotICBib29sIHF1b3RlPUZBTFNFOworICBib29sIHF1b3RlID0gRkFMU0U7CiAgIHN0cnVjdCBjdXJsX3NsaXN0ICppdGVtOwogCiAgIHN3aXRjaChpbnN0YXRlKSB7CkBAIC0xODcwLDExICsxODIxLDExIEBACiB7CiAgIHN0cnVjdCBmdHBfY29ubiAqZnRwYyA9ICZjb25uLT5wcm90by5mdHBjOwogICBDVVJMY29kZSByZXN1bHQ7Ci0gIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGE9Y29ubi0+ZGF0YTsKLSAgc3RydWN0IEN1cmxfZG5zX2VudHJ5ICphZGRyPU5VTEw7CisgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOworICBzdHJ1Y3QgQ3VybF9kbnNfZW50cnkgKmFkZHIgPSBOVUxMOwogICBpbnQgcmM7CiAgIHVuc2lnbmVkIHNob3J0IGNvbm5lY3Rwb3J0OyAvKiB0aGUgbG9jYWwgcG9ydCBjb25uZWN0KCkgc2hvdWxkIHVzZSEgKi8KLSAgY2hhciAqc3RyPSZkYXRhLT5zdGF0ZS5idWZmZXJbNF07ICAvKiBzdGFydCBvbiB0aGUgZmlyc3QgbGV0dGVyICovCisgIGNoYXIgKnN0ciA9ICZkYXRhLT5zdGF0ZS5idWZmZXJbNF07ICAvKiBzdGFydCBvbiB0aGUgZmlyc3QgbGV0dGVyICovCiAKICAgLyogaWYgd2UgY29tZSBoZXJlIGFnYWluLCBtYWtlIHN1cmUgdGhlIGZvcm1lciBuYW1lIGlzIGNsZWFyZWQgKi8KICAgQ3VybF9zYWZlZnJlZShmdHBjLT5uZXdob3N0KTsKQEAgLTE4OTgsOSArMTg0OSw5IEBACiAKICAgICAgICAgLyogVGhlIGZvdXIgc2VwYXJhdG9ycyBzaG91bGQgYmUgaWRlbnRpY2FsLCBvciBlbHNlIHRoaXMgaXMgYW4gb2RkbHkKICAgICAgICAgICAgZm9ybWF0dGVkIHJlcGx5IGFuZCB3ZSBiYWlsIG91dCBpbW1lZGlhdGVseS4gKi8KLSAgICAgICAgZm9yKGk9MTsgaTw0OyBpKyspIHsKKyAgICAgICAgZm9yKGkgPSAxOyBpPDQ7IGkrKykgewogICAgICAgICAgIGlmKHNlcGFyYXRvcltpXSAhPSBzZXAxKSB7Ci0gICAgICAgICAgICBwdHI9TlVMTDsgLyogc2V0IHRvIE5VTEwgdG8gc2lnbmFsIGVycm9yICovCisgICAgICAgICAgICBwdHIgPSBOVUxMOyAvKiBzZXQgdG8gTlVMTCB0byBzaWduYWwgZXJyb3IgKi8KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTkxNiw3ICsxODY3LDcgQEAKICAgICAgICAgfQogICAgICAgfQogICAgICAgZWxzZQotICAgICAgICBwdHI9TlVMTDsKKyAgICAgICAgcHRyID0gTlVMTDsKICAgICB9CiAgICAgaWYoIXB0cikgewogICAgICAgZmFpbGYoZGF0YSwgIldlaXJkbHkgZm9ybWF0dGVkIEVQU1YgcmVwbHkiKTsKQEAgLTIwOTAsNyArMjA0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnRwY29kZSkKIHsKICAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7Ci0gIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGE9Y29ubi0+ZGF0YTsKKyAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIHN0cnVjdCBGVFAgKmZ0cCA9IGRhdGEtPnJlcS5wcm90b3A7CiAgIHN0cnVjdCBmdHBfY29ubiAqZnRwYyA9ICZjb25uLT5wcm90by5mdHBjOwogCkBAIC0yMTA0LDcgKzIwNTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgJnllYXIsICZtb250aCwgJmRheSwgJmhvdXIsICZtaW51dGUsICZzZWNvbmQpKSB7CiAgICAgICAgIC8qIHdlIGhhdmUgYSB0aW1lLCByZWZvcm1hdCBpdCAqLwogICAgICAgICBjaGFyIHRpbWVidWZbMjRdOwotICAgICAgICB0aW1lX3Qgc2Vjcz10aW1lKE5VTEwpOworICAgICAgICB0aW1lX3Qgc2VjcyA9IHRpbWUoTlVMTCk7CiAKICAgICAgICAgc25wcmludGYodGltZWJ1Ziwgc2l6ZW9mKHRpbWVidWYpLAogICAgICAgICAgICAgICAgICAiJTA0ZCUwMmQlMDJkICUwMmQ6JTAyZDolMDJkIEdNVCIsCkBAIC0yMTIwLDcgKzIwNzEsNyBAQAogICAgICAgaWYoZGF0YS0+c2V0Lm9wdF9ub19ib2R5ICYmCiAgICAgICAgICBmdHBjLT5maWxlICYmCiAgICAgICAgICBkYXRhLT5zZXQuZ2V0X2ZpbGV0aW1lICYmCi0gICAgICAgICAoZGF0YS0+aW5mby5maWxldGltZT49MCkgKSB7CisgICAgICAgICAoZGF0YS0+aW5mby5maWxldGltZSA+PSAwKSApIHsKICAgICAgICAgY2hhciBoZWFkZXJidWZbMTI4XTsKICAgICAgICAgdGltZV90IGZpbGV0aW1lID0gKHRpbWVfdClkYXRhLT5pbmZvLmZpbGV0aW1lOwogICAgICAgICBzdHJ1Y3QgdG0gYnVmZmVyOwpAQCAtMjE5Niw3ICsyMTQ3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0cHN0YXRlIGluc3RhdGUpCiB7CiAgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOwotICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhPWNvbm4tPmRhdGE7CisgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogCiAgIGlmKGZ0cGNvZGUvMTAwICE9IDIpIHsKICAgICAvKiAic2Fzc2VyZnRwZCIgYW5kICIodSlyKHgpYm90IGZ0cGQiIGJvdGggcmVzcG9uZHMgd2l0aCAyMjYgYWZ0ZXIgYQpAQCAtMjIyNSw3ICsyMTc2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9vZmZfdCBmaWxlc2l6ZSkKIHsKICAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7Ci0gIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGE9Y29ubi0+ZGF0YTsKKyAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIHN0cnVjdCBGVFAgKmZ0cCA9IGRhdGEtPnJlcS5wcm90b3A7CiAgIHN0cnVjdCBmdHBfY29ubiAqZnRwYyA9ICZjb25uLT5wcm90by5mdHBjOwogCkBAIC0yMzA4LDEyICsyMjU5LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHBzdGF0ZSBpbnN0YXRlKQogewogICBDVVJMY29kZSByZXN1bHQgPSBDVVJMRV9PSzsKLSAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YT1jb25uLT5kYXRhOwotICBjdXJsX29mZl90IGZpbGVzaXplOworICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKKyAgY3VybF9vZmZfdCBmaWxlc2l6ZSA9IC0xOwogICBjaGFyICpidWYgPSBkYXRhLT5zdGF0ZS5idWZmZXI7CiAKICAgLyogZ2V0IHRoZSBzaXplIGZyb20gdGhlIGFzY2lpIHN0cmluZzogKi8KLSAgZmlsZXNpemUgPSAoZnRwY29kZSA9PSAyMTMpP2N1cmx4X3N0cnRvb2ZmdChidWYrNCwgTlVMTCwgMCk6LTE7CisgIGlmKGZ0cGNvZGUgPT0gMjEzKQorICAgIC8qIGlnbm9yZXMgcGFyc2luZyBlcnJvcnMsIHdoaWNoIHdpbGwgbWFrZSB0aGUgc2l6ZSByZW1haW4gdW5rbm93biAqLworICAgICh2b2lkKWN1cmx4X3N0cnRvb2ZmdChidWYgKyA0LCBOVUxMLCAwLCAmZmlsZXNpemUpOwogCiAgIGlmKGluc3RhdGUgPT0gRlRQX1NJWkUpIHsKICNpZmRlZiBDVVJMX0ZUUF9IVFRQU1RZTEVfSEVBRApAQCAtMjM4Myw3ICsyMzM2LDcgQEAKICAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7CiAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogCi0gIGlmKGZ0cGNvZGU+PTQwMCkgeworICBpZihmdHBjb2RlID49IDQwMCkgewogICAgIGZhaWxmKGRhdGEsICJGYWlsZWQgRlRQIHVwbG9hZDogJTBkIiwgZnRwY29kZSk7CiAgICAgc3RhdGUoY29ubiwgRlRQX1NUT1ApOwogICAgIC8qIG9vcHMsIHdlIG5ldmVyIGNsb3NlIHRoZSBzb2NrZXRzISAqLwpAQCAtMjQ0MSw3ICsyMzk0LDcgQEAKICAgICAgIEU6CiAgICAgICAxMjUgRGF0YSBjb25uZWN0aW9uIGFscmVhZHkgb3BlbjsgVHJhbnNmZXIgc3RhcnRpbmcuICovCiAKLSAgICBjdXJsX29mZl90IHNpemU9LTE7IC8qIGRlZmF1bHQgdW5rbm93biBzaXplICovCisgICAgY3VybF9vZmZfdCBzaXplID0gLTE7IC8qIGRlZmF1bHQgdW5rbm93biBzaXplICovCiAKIAogICAgIC8qCkBAIC0yNDY1LDkgKzI0MTgsOSBAQAogICAgICAgICogRXhhbXBsZSBEIGFib3ZlIG1ha2VzIHRoaXMgcGFyc2luZyBhIGxpdHRsZSB0cmlja3kgKi8KICAgICAgIGNoYXIgKmJ5dGVzOwogICAgICAgY2hhciAqYnVmID0gZGF0YS0+c3RhdGUuYnVmZmVyOwotICAgICAgYnl0ZXM9c3Ryc3RyKGJ1ZiwgIiBieXRlcyIpOworICAgICAgYnl0ZXMgPSBzdHJzdHIoYnVmLCAiIGJ5dGVzIik7CiAgICAgICBpZihieXRlcy0tKSB7Ci0gICAgICAgIGxvbmcgaW49KGxvbmcpKGJ5dGVzLWJ1Zik7CisgICAgICAgIGxvbmcgaW4gPSAobG9uZykoYnl0ZXMtYnVmKTsKICAgICAgICAgLyogdGhpcyBpcyBhIGhpbnQgdGhlcmUgaXMgc2l6ZSBpbmZvcm1hdGlvbiBpbiB0aGVyZSEgOy0pICovCiAgICAgICAgIHdoaWxlKC0taW4pIHsKICAgICAgICAgICAvKiBzY2FuIGZvciB0aGUgbGVmdCBwYXJlbnRoZXNpcyBhbmQgYnJlYWsgdGhlcmUgKi8KQEAgLTI0NzUsNyArMjQyOCw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAvKiBza2lwIG9ubHkgZGlnaXRzICovCiAgICAgICAgICAgaWYoIUlTRElHSVQoKmJ5dGVzKSkgewotICAgICAgICAgICAgYnl0ZXM9TlVMTDsKKyAgICAgICAgICAgIGJ5dGVzID0gTlVMTDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KICAgICAgICAgICAvKiBvbmUgbW9yZSBlc3RlcCBiYWNrd2FyZHMgKi8KQEAgLTI0ODQsNyArMjQzNyw3IEBACiAgICAgICAgIC8qIGlmIHdlIGhhdmUgbm90aGluZyBidXQgZGlnaXRzOiAqLwogICAgICAgICBpZihieXRlcysrKSB7CiAgICAgICAgICAgLyogZ2V0IHRoZSBudW1iZXIhICovCi0gICAgICAgICAgc2l6ZSA9IGN1cmx4X3N0cnRvb2ZmdChieXRlcywgTlVMTCwgMCk7CisgICAgICAgICAgKHZvaWQpY3VybHhfc3RydG9vZmZ0KGJ5dGVzLCBOVUxMLCAwLCAmc2l6ZSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC0yNjQ3LDcgKzI2MDAsNyBAQAogewogICBDVVJMY29kZSByZXN1bHQ7CiAgIGN1cmxfc29ja2V0X3Qgc29jayA9IGNvbm4tPnNvY2tbRklSU1RTT0NLRVRdOwotICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhPWNvbm4tPmRhdGE7CisgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogICBpbnQgZnRwY29kZTsKICAgc3RydWN0IGZ0cF9jb25uICpmdHBjID0gJmNvbm4tPnByb3RvLmZ0cGM7CiAgIHN0cnVjdCBwaW5ncG9uZyAqcHAgPSAmZnRwYy0+cHA7CkBAIC0yNjk5LDcgKzI2NTIsNyBAQAogICAgICAgICAvKiBXZSBkb24ndCBoYXZlIGEgU1NML1RMUyBjb25uZWN0aW9uIHlldCwgYnV0IEZUUFMgaXMKICAgICAgICAgICAgcmVxdWVzdGVkLiBUcnkgYSBGVFBTIGNvbm5lY3Rpb24gbm93ICovCiAKLSAgICAgICAgZnRwYy0+Y291bnQzPTA7CisgICAgICAgIGZ0cGMtPmNvdW50MyA9IDA7CiAgICAgICAgIHN3aXRjaChkYXRhLT5zZXQuZnRwc3NsYXV0aCkgewogICAgICAgICBjYXNlIENVUkxGVFBBVVRIX0RFRkFVTFQ6CiAgICAgICAgIGNhc2UgQ1VSTEZUUEFVVEhfU1NMOgpAQCAtMjgyMiwxMCArMjc3NSwxMSBAQAogCiAgICAgY2FzZSBGVFBfUFdEOgogICAgICAgaWYoZnRwY29kZSA9PSAyNTcpIHsKLSAgICAgICAgY2hhciAqcHRyPSZkYXRhLT5zdGF0ZS5idWZmZXJbNF07ICAvKiBzdGFydCBvbiB0aGUgZmlyc3QgbGV0dGVyICovCisgICAgICAgIGNoYXIgKnB0ciA9ICZkYXRhLT5zdGF0ZS5idWZmZXJbNF07ICAvKiBzdGFydCBvbiB0aGUgZmlyc3QgbGV0dGVyICovCiAgICAgICAgIGNvbnN0IHNpemVfdCBidWZfc2l6ZSA9IGRhdGEtPnNldC5idWZmZXJfc2l6ZTsKICAgICAgICAgY2hhciAqZGlyOwogICAgICAgICBjaGFyICpzdG9yZTsKKyAgICAgICAgYm9vbCBlbnRyeV9leHRyYWN0ZWQgPSBGQUxTRTsKIAogICAgICAgICBkaXIgPSBtYWxsb2MobnJlYWQgKyAxKTsKICAgICAgICAgaWYoIWRpcikKQEAgLTI4NTcsNyArMjgxMSw3IEBACiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgLyogZW5kIG9mIHBhdGggKi8KLSAgICAgICAgICAgICAgICAqc3RvcmUgPSAnXDAnOyAvKiB6ZXJvIHRlcm1pbmF0ZSAqLworICAgICAgICAgICAgICAgIGVudHJ5X2V4dHJhY3RlZCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgYnJlYWs7IC8qIGdldCBvdXQgb2YgdGhpcyBsb29wICovCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTI4NjYsNyArMjgyMCw5IEBACiAgICAgICAgICAgICBzdG9yZSsrOwogICAgICAgICAgICAgcHRyKys7CiAgICAgICAgICAgfQotCisgICAgICAgICAgKnN0b3JlID0gJ1wwJzsgLyogemVybyB0ZXJtaW5hdGUgKi8KKyAgICAgICAgfQorICAgICAgICBpZihlbnRyeV9leHRyYWN0ZWQpIHsKICAgICAgICAgICAvKiBJZiB0aGUgcGF0aCBuYW1lIGRvZXMgbm90IGxvb2sgbGlrZSBhbiBhYnNvbHV0ZSBwYXRoIChpLmUuOiBpdAogICAgICAgICAgICAgIGRvZXMgbm90IHN0YXJ0IHdpdGggYSAnLycpLCB3ZSBwcm9iYWJseSBuZWVkIHNvbWUgc2VydmVyLWRlcGVuZGVudAogICAgICAgICAgICAgIGFkanVzdG1lbnRzLiBGb3IgZXhhbXBsZSwgdGhpcyBpcyB0aGUgY2FzZSB3aGVuIGNvbm5lY3RpbmcgdG8KQEAgLTI5MTMsNyArMjg2OSw3IEBACiAKICAgICBjYXNlIEZUUF9TWVNUOgogICAgICAgaWYoZnRwY29kZSA9PSAyMTUpIHsKLSAgICAgICAgY2hhciAqcHRyPSZkYXRhLT5zdGF0ZS5idWZmZXJbNF07ICAvKiBzdGFydCBvbiB0aGUgZmlyc3QgbGV0dGVyICovCisgICAgICAgIGNoYXIgKnB0ciA9ICZkYXRhLT5zdGF0ZS5idWZmZXJbNF07ICAvKiBzdGFydCBvbiB0aGUgZmlyc3QgbGV0dGVyICovCiAgICAgICAgIGNoYXIgKm9zOwogICAgICAgICBjaGFyICpzdG9yZTsKIApAQCAtMjk4OCwxMCArMjk0NCwxMCBAQAogICAgICAgaWYoZnRwY29kZS8xMDAgIT0gMikgewogICAgICAgICAvKiBmYWlsdXJlIHRvIENXRCB0aGVyZSAqLwogICAgICAgICBpZihjb25uLT5kYXRhLT5zZXQuZnRwX2NyZWF0ZV9taXNzaW5nX2RpcnMgJiYKLSAgICAgICAgICAgZnRwYy0+Y291bnQxICYmICFmdHBjLT5jb3VudDIpIHsKKyAgICAgICAgICAgZnRwYy0+Y3dkY291bnQgJiYgIWZ0cGMtPmNvdW50MikgewogICAgICAgICAgIC8qIHRyeSBtYWtpbmcgaXQgKi8KICAgICAgICAgICBmdHBjLT5jb3VudDIrKzsgLyogY291bnRlciB0byBwcmV2ZW50IENXRC1NS0QgbG9vcHMgKi8KLSAgICAgICAgICBQUFNFTkRGKCZmdHBjLT5wcCwgIk1LRCAlcyIsIGZ0cGMtPmRpcnNbZnRwYy0+Y291bnQxIC0gMV0pOworICAgICAgICAgIFBQU0VOREYoJmZ0cGMtPnBwLCAiTUtEICVzIiwgZnRwYy0+ZGlyc1tmdHBjLT5jd2Rjb3VudCAtIDFdKTsKICAgICAgICAgICBzdGF0ZShjb25uLCBGVFBfTUtEKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKQEAgLTMwMDQsMTAgKzI5NjAsMTAgQEAKICAgICAgIH0KICAgICAgIGVsc2UgewogICAgICAgICAvKiBzdWNjZXNzICovCi0gICAgICAgIGZ0cGMtPmNvdW50Mj0wOwotICAgICAgICBpZigrK2Z0cGMtPmNvdW50MSA8PSBmdHBjLT5kaXJkZXB0aCkgeworICAgICAgICBmdHBjLT5jb3VudDIgPSAwOworICAgICAgICBpZigrK2Z0cGMtPmN3ZGNvdW50IDw9IGZ0cGMtPmRpcmRlcHRoKSB7CiAgICAgICAgICAgLyogc2VuZCBuZXh0IENXRCAqLwotICAgICAgICAgIFBQU0VOREYoJmZ0cGMtPnBwLCAiQ1dEICVzIiwgZnRwYy0+ZGlyc1tmdHBjLT5jb3VudDEgLSAxXSk7CisgICAgICAgICAgUFBTRU5ERigmZnRwYy0+cHAsICJDV0QgJXMiLCBmdHBjLT5kaXJzW2Z0cGMtPmN3ZGNvdW50IC0gMV0pOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgIHJlc3VsdCA9IGZ0cF9zdGF0ZV9tZHRtKGNvbm4pOwpAQCAtMzAyNSw3ICsyOTgxLDcgQEAKICAgICAgIH0KICAgICAgIHN0YXRlKGNvbm4sIEZUUF9DV0QpOwogICAgICAgLyogc2VuZCBDV0QgKi8KLSAgICAgIFBQU0VOREYoJmZ0cGMtPnBwLCAiQ1dEICVzIiwgZnRwYy0+ZGlyc1tmdHBjLT5jb3VudDEgLSAxXSk7CisgICAgICBQUFNFTkRGKCZmdHBjLT5wcCwgIkNXRCAlcyIsIGZ0cGMtPmRpcnNbZnRwYy0+Y3dkY291bnQgLSAxXSk7CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgRlRQX01EVE06CkBAIC0zMjQ0LDE1ICszMjAwLDE2IEBACiAgICAgc2l6ZV90IGZsZW4gPSBmdHBjLT5maWxlP3N0cmxlbihmdHBjLT5maWxlKTowOyAvKiBmaWxlIGlzICJyYXciIGFscmVhZHkgKi8KICAgICBzaXplX3QgZGxlbiA9IHN0cmxlbihwYXRoKS1mbGVuOwogICAgIGlmKCFmdHBjLT5jd2RmYWlsKSB7CisgICAgICBmdHBjLT5wcmV2bWV0aG9kID0gZGF0YS0+c2V0LmZ0cF9maWxlbWV0aG9kOwogICAgICAgaWYoZGxlbiAmJiAoZGF0YS0+c2V0LmZ0cF9maWxlbWV0aG9kICE9IEZUUEZJTEVfTk9DV0QpKSB7CiAgICAgICAgIGZ0cGMtPnByZXZwYXRoID0gcGF0aDsKICAgICAgICAgaWYoZmxlbikKICAgICAgICAgICAvKiBpZiAncGF0aCcgaXMgbm90IHRoZSB3aG9sZSBzdHJpbmcgKi8KLSAgICAgICAgICBmdHBjLT5wcmV2cGF0aFtkbGVuXT0wOyAvKiB0ZXJtaW5hdGUgKi8KKyAgICAgICAgICBmdHBjLT5wcmV2cGF0aFtkbGVuXSA9IDA7IC8qIHRlcm1pbmF0ZSAqLwogICAgICAgfQogICAgICAgZWxzZSB7CiAgICAgICAgIC8qIHdlIG5ldmVyIGNoYW5nZWQgZGlyICovCi0gICAgICAgIGZ0cGMtPnByZXZwYXRoPXN0cmR1cCgiIik7CisgICAgICAgIGZ0cGMtPnByZXZwYXRoID0gc3RyZHVwKCIiKTsKICAgICAgICAgZnJlZShwYXRoKTsKICAgICAgIH0KICAgICAgIGlmKGZ0cGMtPnByZXZwYXRoKQpAQCAtMzUxNSwzNSArMzQ3MiwzNiBAQAogewogICBjdXJsX29mZl90IGZyb20sIHRvOwogICBjaGFyICpwdHI7Ci0gIGNoYXIgKnB0cjI7CiAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogICBzdHJ1Y3QgZnRwX2Nvbm4gKmZ0cGMgPSAmY29ubi0+cHJvdG8uZnRwYzsKIAogICBpZihkYXRhLT5zdGF0ZS51c2VfcmFuZ2UgJiYgZGF0YS0+c3RhdGUucmFuZ2UpIHsKLSAgICBmcm9tPWN1cmx4X3N0cnRvb2ZmdChkYXRhLT5zdGF0ZS5yYW5nZSwgJnB0ciwgMCk7Ci0gICAgd2hpbGUoKnB0ciAmJiAoSVNTUEFDRSgqcHRyKSB8fCAoKnB0cj09Jy0nKSkpCisgICAgQ1VSTG9mZnQgZnJvbV90OworICAgIENVUkxvZmZ0IHRvX3Q7CisgICAgZnJvbV90ID0gY3VybHhfc3RydG9vZmZ0KGRhdGEtPnN0YXRlLnJhbmdlLCAmcHRyLCAwLCAmZnJvbSk7CisgICAgaWYoZnJvbV90ID09IENVUkxfT0ZGVF9GTE9XKQorICAgICAgcmV0dXJuIENVUkxFX1JBTkdFX0VSUk9SOworICAgIHdoaWxlKCpwdHIgJiYgKElTU1BBQ0UoKnB0cikgfHwgKCpwdHIgPT0gJy0nKSkpCiAgICAgICBwdHIrKzsKLSAgICB0bz1jdXJseF9zdHJ0b29mZnQocHRyLCAmcHRyMiwgMCk7Ci0gICAgaWYocHRyID09IHB0cjIpIHsKLSAgICAgIC8qIHdlIGRpZG4ndCBnZXQgYW55IGRpZ2l0ICovCi0gICAgICB0bz0tMTsKLSAgICB9Ci0gICAgaWYoKC0xID09IHRvKSAmJiAoZnJvbT49MCkpIHsKKyAgICB0b190ID0gY3VybHhfc3RydG9vZmZ0KHB0ciwgTlVMTCwgMCwgJnRvKTsKKyAgICBpZih0b190ID09IENVUkxfT0ZGVF9GTE9XKQorICAgICAgcmV0dXJuIENVUkxFX1JBTkdFX0VSUk9SOworICAgIGlmKCh0b190ID09IENVUkxfT0ZGVF9JTlZBTCkgJiYgIWZyb21fdCkgewogICAgICAgLyogWCAtICovCiAgICAgICBkYXRhLT5zdGF0ZS5yZXN1bWVfZnJvbSA9IGZyb207CiAgICAgICBERUJVR0YoaW5mb2YoY29ubi0+ZGF0YSwgIkZUUCBSQU5HRSAlIiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UCiAgICAgICAgICAgICAgICAgICAgIiB0byBlbmQgb2YgZmlsZVxuIiwgZnJvbSkpOwogICAgIH0KLSAgICBlbHNlIGlmKGZyb20gPCAwKSB7CisgICAgZWxzZSBpZighdG9fdCAmJiAoZnJvbV90ID09IENVUkxfT0ZGVF9JTlZBTCkpIHsKICAgICAgIC8qIC1ZICovCi0gICAgICBkYXRhLT5yZXEubWF4ZG93bmxvYWQgPSAtZnJvbTsKLSAgICAgIGRhdGEtPnN0YXRlLnJlc3VtZV9mcm9tID0gZnJvbTsKKyAgICAgIGRhdGEtPnJlcS5tYXhkb3dubG9hZCA9IHRvOworICAgICAgZGF0YS0+c3RhdGUucmVzdW1lX2Zyb20gPSAtdG87CiAgICAgICBERUJVR0YoaW5mb2YoY29ubi0+ZGF0YSwgIkZUUCBSQU5HRSB0aGUgbGFzdCAlIiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UCi0gICAgICAgICAgICAgICAgICAgIiBieXRlc1xuIiwgLWZyb20pKTsKKyAgICAgICAgICAgICAgICAgICAiIGJ5dGVzXG4iLCB0bykpOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgIC8qIFgtWSAqLwotICAgICAgZGF0YS0+cmVxLm1heGRvd25sb2FkID0gKHRvLWZyb20pKzE7IC8qIGluY2x1ZGUgbGFzdCBieXRlICovCisgICAgICBkYXRhLT5yZXEubWF4ZG93bmxvYWQgPSAodG8gLSBmcm9tKSArIDE7IC8qIGluY2x1ZGUgbGFzdCBieXRlICovCiAgICAgICBkYXRhLT5zdGF0ZS5yZXN1bWVfZnJvbSA9IGZyb207CiAgICAgICBERUJVR0YoaW5mb2YoY29ubi0+ZGF0YSwgIkZUUCBSQU5HRSBmcm9tICUiIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QKICAgICAgICAgICAgICAgICAgICAiIGdldHRpbmcgJSIgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAiIGJ5dGVzXG4iLApAQCAtMzU3NCw3ICszNTMyLDcgQEAKIAogc3RhdGljIENVUkxjb2RlIGZ0cF9kb19tb3JlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50ICpjb21wbGV0ZXApCiB7Ci0gIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGE9Y29ubi0+ZGF0YTsKKyAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIHN0cnVjdCBmdHBfY29ubiAqZnRwYyA9ICZjb25uLT5wcm90by5mdHBjOwogICBDVVJMY29kZSByZXN1bHQgPSBDVVJMRV9PSzsKICAgYm9vbCBjb25uZWN0ZWQgPSBGQUxTRTsKQEAgLTM1ODUsNyArMzU0Myw3IEBACiAKICAgLyogaWYgdGhlIHNlY29uZCBjb25uZWN0aW9uIGlzbid0IGRvbmUgeWV0LCB3YWl0IGZvciBpdCAqLwogICBpZighY29ubi0+Yml0cy50Y3Bjb25uZWN0W1NFQ09OREFSWVNPQ0tFVF0pIHsKLSAgICBpZihjb25uLT50dW5uZWxfc3RhdGVbU0VDT05EQVJZU09DS0VUXSA9PSBUVU5ORUxfQ09OTkVDVCkgeworICAgIGlmKEN1cmxfY29ubmVjdF9vbmdvaW5nKGNvbm4pKSB7CiAgICAgICAvKiBBcyB3ZSdyZSBpbiBUVU5ORUxfQ09OTkVDVCBzdGF0ZSBub3csIHdlIGtub3cgdGhlIHByb3h5IG5hbWUgYW5kIHBvcnQKICAgICAgICAgIGFyZW4ndCB1c2VkIHNvIHdlIGJsYW5rIHRoZWlyIGFyZ3VtZW50cy4gVE9ETzogbWFrZSB0aGlzIG5pY2VyICovCiAgICAgICByZXN1bHQgPSBDdXJsX3Byb3h5Q09OTkVDVChjb25uLCBTRUNPTkRBUllTT0NLRVQsIE5VTEwsIDApOwpAQCAtMzYxNyw3ICszNTc1LDcgQEAKICAgICByZXR1cm4gcmVzdWx0OwogCiAgIGlmKGNvbm4tPmJpdHMudHVubmVsX3Byb3h5ICYmIGNvbm4tPmJpdHMuaHR0cHByb3h5ICYmCi0gICAgIGNvbm4tPnR1bm5lbF9zdGF0ZVtTRUNPTkRBUllTT0NLRVRdICE9IFRVTk5FTF9DT01QTEVURSkKKyAgICAgQ3VybF9jb25uZWN0X29uZ29pbmcoY29ubikpCiAgICAgcmV0dXJuIHJlc3VsdDsKIAogCkBAIC0zNzQxLDcgKzM2OTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgYm9vbCAqZG9waGFzZV9kb25lKQogewogICAvKiB0aGlzIGlzIEZUUCBhbmQgbm8gcHJveHkgKi8KLSAgQ1VSTGNvZGUgcmVzdWx0PUNVUkxFX09LOworICBDVVJMY29kZSByZXN1bHQgPSBDVVJMRV9PSzsKIAogICBERUJVR0YoaW5mb2YoY29ubi0+ZGF0YSwgIkRPIHBoYXNlIHN0YXJ0c1xuIikpOwogCkBAIC00MDM1LDcgKzM5OTMsNyBAQAogI2RlZmluZSBTQlVGX1NJWkUgMTAyNAogICBjaGFyIHNbU0JVRl9TSVpFXTsKICAgc2l6ZV90IHdyaXRlX2xlbjsKLSAgY2hhciAqc3B0cj1zOworICBjaGFyICpzcHRyID0gczsKICAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7CiAjaWZkZWYgSEFWRV9HU1NBUEkKICAgZW51bSBwcm90ZWN0aW9uX2xldmVsIGRhdGFfc2VjID0gY29ubi0+ZGF0YV9wcm90OwpAQCAtNDA0Niw5ICs0MDA0LDggQEAKICAgICByZXR1cm4gQ1VSTEVfQkFEX0ZVTkNUSU9OX0FSR1VNRU5UOwogCiAgIHN0cmNweSgmc1t3cml0ZV9sZW5dLCAiXHJcbiIpOyAvKiBhcHBlbmQgYSB0cmFpbGluZyBDUkxGICovCi0gIHdyaXRlX2xlbiArPTI7Ci0KLSAgYnl0ZXNfd3JpdHRlbj0wOworICB3cml0ZV9sZW4gKz0gMjsKKyAgYnl0ZXNfd3JpdHRlbiA9IDA7CiAKICAgcmVzdWx0ID0gQ3VybF9jb252ZXJ0X3RvX25ldHdvcmsoY29ubi0+ZGF0YSwgcywgd3JpdGVfbGVuKTsKICAgLyogQ3VybF9jb252ZXJ0X3RvX25ldHdvcmsgY2FsbHMgZmFpbGYgaWYgdW5zdWNjZXNzZnVsICovCkBAIC00MTI2LDcgKzQwODMsNyBAQAogICovCiBzdGF0aWMgQ1VSTGNvZGUgZnRwX2Rpc2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBib29sIGRlYWRfY29ubmVjdGlvbikKIHsKLSAgc3RydWN0IGZ0cF9jb25uICpmdHBjPSAmY29ubi0+cHJvdG8uZnRwYzsKKyAgc3RydWN0IGZ0cF9jb25uICpmdHBjID0gJmNvbm4tPnByb3RvLmZ0cGM7CiAgIHN0cnVjdCBwaW5ncG9uZyAqcHAgPSAmZnRwYy0+cHA7CiAKICAgLyogV2UgY2Fubm90IHNlbmQgcXVpdCB1bmNvbmRpdGlvbmFsbHkuIElmIHRoaXMgY29ubmVjdGlvbiBpcyBzdGFsZSBvcgpAQCAtNDIyMiw3ICs0MTc5LDcgQEAKICAgICAgIGZ0cGMtPmRpcmRlcHRoID0gMDsKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBzbGFzaF9wb3M9c3RycmNocihjdXJfcG9zLCAnLycpOworICAgIHNsYXNoX3BvcyA9IHN0cnJjaHIoY3VyX3BvcywgJy8nKTsKICAgICBpZihzbGFzaF9wb3MgfHwgISpjdXJfcG9zKSB7CiAgICAgICBzaXplX3QgZGlybGVuID0gc2xhc2hfcG9zLWN1cl9wb3M7CiAgICAgICBDVVJMY29kZSByZXN1bHQ7CkBAIC00MjQzLDcgKzQyMDAsNyBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgfQogICAgICAgZnRwYy0+ZGlyZGVwdGggPSAxOyAvKiB3ZSBjb25zaWRlciBpdCB0byBiZSBhIHNpbmdsZSBkaXIgKi8KLSAgICAgIGZpbGVuYW1lID0gc2xhc2hfcG9zID8gc2xhc2hfcG9zKzEgOiBjdXJfcG9zOyAvKiByZXN0IGlzIGZpbGUgbmFtZSAqLworICAgICAgZmlsZW5hbWUgPSBzbGFzaF9wb3MgPyBzbGFzaF9wb3MgKyAxIDogY3VyX3BvczsgLyogcmVzdCBpcyBmaWxlIG5hbWUgKi8KICAgICB9CiAgICAgZWxzZQogICAgICAgZmlsZW5hbWUgPSBjdXJfcG9zOyAgLyogdGhpcyBpcyBhIGZpbGUgbmFtZSBvbmx5ICovCkBAIC00MzI3LDggKzQyODQsOCBAQAogICAgIH0KICAgfQogICBlbHNlCi0gICAgZnRwYy0+ZmlsZT1OVUxMOyAvKiBpbnN0ZWFkIG9mIHBvaW50IHRvIGEgemVybyBieXRlLCB3ZSBtYWtlIGl0IGEgTlVMTAotICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyICovCisgICAgZnRwYy0+ZmlsZSA9IE5VTEw7IC8qIGluc3RlYWQgb2YgcG9pbnQgdG8gYSB6ZXJvIGJ5dGUsIHdlIG1ha2UgaXQgYSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgKi8KIAogICBpZihkYXRhLT5zZXQudXBsb2FkICYmICFmdHBjLT5maWxlICYmIChmdHAtPnRyYW5zZmVyID09IEZUUFRSQU5TRkVSX0JPRFkpKSB7CiAgICAgLyogV2UgbmVlZCBhIGZpbGUgbmFtZSB3aGVuIHVwbG9hZGluZy4gUmV0dXJuIGVycm9yISAqLwpAQCAtNDM1Miw3ICs0MzA5LDggQEAKIAogICAgIGRsZW4gLT0gZnRwYy0+ZmlsZT9zdHJsZW4oZnRwYy0+ZmlsZSk6MDsKICAgICBpZigoZGxlbiA9PSBzdHJsZW4oZnRwYy0+cHJldnBhdGgpKSAmJgotICAgICAgICFzdHJuY21wKHBhdGgsIGZ0cGMtPnByZXZwYXRoLCBkbGVuKSkgeworICAgICAgICFzdHJuY21wKHBhdGgsIGZ0cGMtPnByZXZwYXRoLCBkbGVuKSAmJgorICAgICAgIChmdHBjLT5wcmV2bWV0aG9kID09IGRhdGEtPnNldC5mdHBfZmlsZW1ldGhvZCkpIHsKICAgICAgIGluZm9mKGRhdGEsICJSZXF1ZXN0IGhhcyBzYW1lIHBhdGggYXMgcHJldmlvdXMgdHJhbnNmZXJcbiIpOwogICAgICAgZnRwYy0+Y3dkZG9uZSA9IFRSVUU7CiAgICAgfQpAQCAtNDQyMyw4ICs0MzgxLDggQEAKIENVUkxjb2RlIGZ0cF9yZWd1bGFyX3RyYW5zZmVyKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmRvcGhhc2VfZG9uZSkKIHsKLSAgQ1VSTGNvZGUgcmVzdWx0PUNVUkxFX09LOwotICBib29sIGNvbm5lY3RlZD1GQUxTRTsKKyAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7CisgIGJvb2wgY29ubmVjdGVkID0gRkFMU0U7CiAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogICBzdHJ1Y3QgZnRwX2Nvbm4gKmZ0cGMgPSAmY29ubi0+cHJvdG8uZnRwYzsKICAgZGF0YS0+cmVxLnNpemUgPSAtMTsgLyogbWFrZSBzdXJlIHRoaXMgaXMgdW5rbm93biBhdCB0aGlzIHBvaW50ICovCkBAIC00NDY0LDI4ICs0NDIyLDYgQEAKICAgY2hhciBjb21tYW5kOwogICBzdHJ1Y3QgRlRQICpmdHA7CiAKLSAgaWYoY29ubi0+Yml0cy5odHRwcHJveHkgJiYgIWRhdGEtPnNldC50dW5uZWxfdGhydV9odHRwcHJveHkpIHsKLSAgICAvKiBVbmxlc3Mgd2UgaGF2ZSBhc2tlZCB0byB0dW5uZWwgZnRwIG9wZXJhdGlvbnMgdGhyb3VnaCB0aGUgcHJveHksIHdlCi0gICAgICAgc3dpdGNoIGFuZCB1c2UgSFRUUCBvcGVyYXRpb25zIG9ubHkgKi8KLSNpZm5kZWYgQ1VSTF9ESVNBQkxFX0hUVFAKLSAgICBpZihjb25uLT5oYW5kbGVyID09ICZDdXJsX2hhbmRsZXJfZnRwKQotICAgICAgY29ubi0+aGFuZGxlciA9ICZDdXJsX2hhbmRsZXJfZnRwX3Byb3h5OwotICAgIGVsc2UgewotI2lmZGVmIFVTRV9TU0wKLSAgICAgIGNvbm4tPmhhbmRsZXIgPSAmQ3VybF9oYW5kbGVyX2Z0cHNfcHJveHk7Ci0jZWxzZQotICAgICAgZmFpbGYoZGF0YSwgIkZUUFMgbm90IHN1cHBvcnRlZCEiKTsKLSAgICAgIHJldHVybiBDVVJMRV9VTlNVUFBPUlRFRF9QUk9UT0NPTDsKLSNlbmRpZgotICAgIH0KLSAgICAvKiBzZXQgaXQgdXAgYXMgYSBIVFRQIGNvbm5lY3Rpb24gaW5zdGVhZCAqLwotICAgIHJldHVybiBjb25uLT5oYW5kbGVyLT5zZXR1cF9jb25uZWN0aW9uKGNvbm4pOwotI2Vsc2UKLSAgICBmYWlsZihkYXRhLCAiRlRQIG92ZXIgaHR0cCBwcm94eSByZXF1aXJlcyBIVFRQIHN1cHBvcnQgYnVpbHQtaW4hIik7Ci0gICAgcmV0dXJuIENVUkxFX1VOU1VQUE9SVEVEX1BST1RPQ09MOwotI2VuZGlmCi0gIH0KLQogICBjb25uLT5kYXRhLT5yZXEucHJvdG9wID0gZnRwID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgRlRQKSk7CiAgIGlmKE5VTEwgPT0gZnRwKQogICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvZnRwLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9mdHAuaAppbmRleCAzYmJmMjYyLi5lNGFhNjNmIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9mdHAuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9mdHAuaApAQCAtNyw3ICs3LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtMTMwLDEwICsxMzAsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIEZBTFNFIHdoZW4gaXQgZ2V0cyB0byBDdXJsX2Z0cF9xdWl0KCkgKi8KICAgYm9vbCBjd2Rkb25lOyAgICAgLyogaWYgaXQgaGFzIGJlZW4gZGV0ZXJtaW5lZCB0aGF0IHRoZSBwcm9wZXIgQ1dEIGNvbWJvCiAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgaGFzIGJlZW4gZG9uZSAqLworICBpbnQgY3dkY291bnQ7ICAgICAvKiBudW1iZXIgb2YgQ1dEIGNvbW1hbmRzIGlzc3VlZCAqLwogICBib29sIGN3ZGZhaWw7ICAgICAvKiBzZXQgVFJVRSBpZiBhIENXRCBjb21tYW5kIGZhaWxzLCBhcyB0aGVuIHdlIG11c3QgcHJldmVudAogICAgICAgICAgICAgICAgICAgICAgICBjYWNoaW5nIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAqLwogICBib29sIHdhaXRfZGF0YV9jb25uOyAvKiB0aGlzIGlzIHNldCBUUlVFIGlmIGRhdGEgY29ubmVjdGlvbiBpcyB3YWl0ZWQgKi8KICAgY2hhciAqcHJldnBhdGg7ICAgLyogY29ubi0+cGF0aCBmcm9tIHRoZSBwcmV2aW91cyB0cmFuc2ZlciAqLworICBjdXJsX2Z0cGZpbGUgcHJldm1ldGhvZDsgLyogZnRwIG1ldGhvZCBpbiBwcmV2aW91cyB0cmFuc2ZlciAgKi8KICAgY2hhciB0cmFuc2ZlcnR5cGU7IC8qIHNldCBieSBmdHBfdHJhbnNmZXJ0eXBlIGZvciB1c2UgYnkgQ3VybF9jbGllbnRfd3JpdGUoKWEKICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBvdGhlcnMgKEEvSSBvciB6ZXJvKSAqLwogICBpbnQgY291bnQxOyAvKiBnZW5lcmFsIHB1cnBvc2UgY291bnRlciBmb3IgdGhlIHN0YXRlIG1hY2hpbmUgKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2Z0cGxpc3RwYXJzZXIuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2Z0cGxpc3RwYXJzZXIuYwppbmRleCAyYWNjZTMxLi5iMmE4YzBmIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9mdHBsaXN0cGFyc2VyLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvZnRwbGlzdHBhcnNlci5jCkBAIC00MjEsNyArNDIxLDcgQEAKICAgICAgICAgICBlbHNlIGlmKGMgPT0gJ1xuJykgewogICAgICAgICAgICAgZmluZm8tPmJfZGF0YVtwYXJzZXItPml0ZW1fbGVuZ3RoIC0gMV0gPSAwOwogICAgICAgICAgICAgaWYoc3RybmNtcCgidG90YWwgIiwgZmluZm8tPmJfZGF0YSwgNikgPT0gMCkgewotICAgICAgICAgICAgICBjaGFyICplbmRwdHIgPSBmaW5mby0+Yl9kYXRhKzY7CisgICAgICAgICAgICAgIGNoYXIgKmVuZHB0ciA9IGZpbmZvLT5iX2RhdGEgKyA2OwogICAgICAgICAgICAgICAvKiBoZXJlIHdlIGNhbiBkZWFsIHdpdGggZGlyZWN0b3J5IHNpemUsIHBhc3MgdGhlIGxlYWRpbmcgd2hpdGUKICAgICAgICAgICAgICAgICAgc3BhY2VzIGFuZCB0aGVuIHRoZSBkaWdpdHMgKi8KICAgICAgICAgICAgICAgd2hpbGUoSVNTUEFDRSgqZW5kcHRyKSkKQEAgLTYwOSwxNiArNjA5LDE4IEBACiAgICAgICAgICAgICBjaGFyICpwOwogICAgICAgICAgICAgY3VybF9vZmZfdCBmc2l6ZTsKICAgICAgICAgICAgIGZpbmZvLT5iX2RhdGFbcGFyc2VyLT5pdGVtX29mZnNldCArIHBhcnNlci0+aXRlbV9sZW5ndGggLSAxXSA9IDA7Ci0gICAgICAgICAgICBmc2l6ZSA9IGN1cmx4X3N0cnRvb2ZmdChmaW5mby0+Yl9kYXRhK3BhcnNlci0+aXRlbV9vZmZzZXQsICZwLCAxMCk7Ci0gICAgICAgICAgICBpZihwWzBdID09ICdcMCcgJiYgZnNpemUgIT0gQ1VSTF9PRkZfVF9NQVggJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc2l6ZSAhPSBDVVJMX09GRl9UX01JTikgewotICAgICAgICAgICAgICBwYXJzZXItPmZpbGVfZGF0YS0+aW5mby5mbGFncyB8PSBDVVJMRklORk9GTEFHX0tOT1dOX1NJWkU7Ci0gICAgICAgICAgICAgIHBhcnNlci0+ZmlsZV9kYXRhLT5pbmZvLnNpemUgPSBmc2l6ZTsKKyAgICAgICAgICAgIGlmKCFjdXJseF9zdHJ0b29mZnQoZmluZm8tPmJfZGF0YSArIHBhcnNlci0+aXRlbV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLCAxMCwgJmZzaXplKSkgeworICAgICAgICAgICAgICBpZihwWzBdID09ICdcMCcgJiYgZnNpemUgIT0gQ1VSTF9PRkZfVF9NQVggJiYKKyAgICAgICAgICAgICAgICAgZnNpemUgIT0gQ1VSTF9PRkZfVF9NSU4pIHsKKyAgICAgICAgICAgICAgICBwYXJzZXItPmZpbGVfZGF0YS0+aW5mby5mbGFncyB8PSBDVVJMRklORk9GTEFHX0tOT1dOX1NJWkU7CisgICAgICAgICAgICAgICAgcGFyc2VyLT5maWxlX2RhdGEtPmluZm8uc2l6ZSA9IGZzaXplOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHBhcnNlci0+aXRlbV9sZW5ndGggPSAwOworICAgICAgICAgICAgICBwYXJzZXItPml0ZW1fb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgcGFyc2VyLT5zdGF0ZS5VTklYLm1haW4gPSBQTF9VTklYX1RJTUU7CisgICAgICAgICAgICAgIHBhcnNlci0+c3RhdGUuVU5JWC5zdWIudGltZSA9IFBMX1VOSVhfVElNRV9QUkVQQVJUMTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcnNlci0+aXRlbV9sZW5ndGggPSAwOwotICAgICAgICAgICAgcGFyc2VyLT5pdGVtX29mZnNldCA9IDA7Ci0gICAgICAgICAgICBwYXJzZXItPnN0YXRlLlVOSVgubWFpbiA9IFBMX1VOSVhfVElNRTsKLSAgICAgICAgICAgIHBhcnNlci0+c3RhdGUuVU5JWC5zdWIudGltZSA9IFBMX1VOSVhfVElNRV9QUkVQQVJUMTsKICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZSBpZighSVNESUdJVChjKSkgewogICAgICAgICAgICAgUExfRVJST1IoY29ubiwgQ1VSTEVfRlRQX0JBRF9GSUxFX0xJU1QpOwpAQCAtOTM1LDE5ICs5MzcsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgIGNoYXIgKmVuZHB0cjsKLSAgICAgICAgICAgICAgZmluZm8tPnNpemUgPSBjdXJseF9zdHJ0b29mZnQoZmluZm8tPmJfZGF0YSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+aXRlbV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmRwdHIsIDEwKTsKLSAgICAgICAgICAgICAgaWYoISplbmRwdHIpIHsKLSAgICAgICAgICAgICAgICBpZihmaW5mby0+c2l6ZSA9PSBDVVJMX09GRl9UX01BWCB8fAotICAgICAgICAgICAgICAgICAgIGZpbmZvLT5zaXplID09IENVUkxfT0ZGX1RfTUlOKSB7Ci0gICAgICAgICAgICAgICAgICBpZihlcnJubyA9PSBFUkFOR0UpIHsKLSAgICAgICAgICAgICAgICAgICAgUExfRVJST1IoY29ubiwgQ1VSTEVfRlRQX0JBRF9GSUxFX0xJU1QpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmxlbjsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIGlmKGN1cmx4X3N0cnRvb2ZmdChmaW5mby0+Yl9kYXRhICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+aXRlbV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5kcHRyLCAxMCwgJmZpbmZvLT5zaXplKSkgewogICAgICAgICAgICAgICAgIFBMX0VSUk9SKGNvbm4sIENVUkxFX0ZUUF9CQURfRklMRV9MSVNUKTsKICAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmxlbjsKICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvZ2V0aW5mby5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvZ2V0aW5mby5jCmluZGV4IGExY2U1MDUuLjg2MmNlZDAgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2dldGluZm8uYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9nZXRpbmZvLmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTU0LDYgKzU0LDcgQEAKICAgcHJvLT50X3N0YXJ0dHJhbnNmZXIgPSAwOwogICBwcm8tPnRpbWVzcGVudCA9IDA7CiAgIHByby0+dF9yZWRpcmVjdCA9IDA7CisgIHByby0+aXNfdF9zdGFydHJhbnNmZXJfc2V0ID0gZmFsc2U7CiAKICAgaW5mby0+aHR0cGNvZGUgPSAwOwogICBpbmZvLT5odHRwcHJveHljb2RlID0gMDsKQEAgLTI0NiwyNyArMjQ3LDYwIEBACiAgIHJldHVybiBDVVJMRV9PSzsKIH0KIAorI2RlZmluZSBET1VCTEVfU0VDUyh4KSAoZG91YmxlKSh4KS8xMDAwMDAwCisKK3N0YXRpYyBDVVJMY29kZSBnZXRpbmZvX29mZnQoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwgQ1VSTElORk8gaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9vZmZfdCAqcGFyYW1fb2ZmdCkKK3sKKyAgc3dpdGNoKGluZm8pIHsKKyAgY2FzZSBDVVJMSU5GT19TSVpFX1VQTE9BRF9UOgorICAgICpwYXJhbV9vZmZ0ID0gZGF0YS0+cHJvZ3Jlc3MudXBsb2FkZWQ7CisgICAgYnJlYWs7CisgIGNhc2UgQ1VSTElORk9fU0laRV9ET1dOTE9BRF9UOgorICAgICpwYXJhbV9vZmZ0ID0gZGF0YS0+cHJvZ3Jlc3MuZG93bmxvYWRlZDsKKyAgICBicmVhazsKKyAgY2FzZSBDVVJMSU5GT19TUEVFRF9ET1dOTE9BRF9UOgorICAgICpwYXJhbV9vZmZ0ID0gIGRhdGEtPnByb2dyZXNzLmRsc3BlZWQ7CisgICAgYnJlYWs7CisgIGNhc2UgQ1VSTElORk9fU1BFRURfVVBMT0FEX1Q6CisgICAgKnBhcmFtX29mZnQgPSBkYXRhLT5wcm9ncmVzcy51bHNwZWVkOworICAgIGJyZWFrOworICBjYXNlIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEX1Q6CisgICAgKnBhcmFtX29mZnQgPSAoZGF0YS0+cHJvZ3Jlc3MuZmxhZ3MgJiBQR1JTX0RMX1NJWkVfS05PV04pPworICAgICAgZGF0YS0+cHJvZ3Jlc3Muc2l6ZV9kbDotMTsKKyAgICBicmVhazsKKyAgY2FzZSBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9VUExPQURfVDoKKyAgICAqcGFyYW1fb2ZmdCA9IChkYXRhLT5wcm9ncmVzcy5mbGFncyAmIFBHUlNfVUxfU0laRV9LTk9XTik/CisgICAgICBkYXRhLT5wcm9ncmVzcy5zaXplX3VsOi0xOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHJldHVybiBDVVJMRV9VTktOT1dOX09QVElPTjsKKyAgfQorCisgIHJldHVybiBDVVJMRV9PSzsKK30KKwogc3RhdGljIENVUkxjb2RlIGdldGluZm9fZG91YmxlKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsIENVUkxJTkZPIGluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICpwYXJhbV9kb3VibGVwKQogewogICBzd2l0Y2goaW5mbykgewogICBjYXNlIENVUkxJTkZPX1RPVEFMX1RJTUU6Ci0gICAgKnBhcmFtX2RvdWJsZXAgPSBkYXRhLT5wcm9ncmVzcy50aW1lc3BlbnQ7CisgICAgKnBhcmFtX2RvdWJsZXAgPSBET1VCTEVfU0VDUyhkYXRhLT5wcm9ncmVzcy50aW1lc3BlbnQpOwogICAgIGJyZWFrOwogICBjYXNlIENVUkxJTkZPX05BTUVMT09LVVBfVElNRToKLSAgICAqcGFyYW1fZG91YmxlcCA9IGRhdGEtPnByb2dyZXNzLnRfbnNsb29rdXA7CisgICAgKnBhcmFtX2RvdWJsZXAgPSBET1VCTEVfU0VDUyhkYXRhLT5wcm9ncmVzcy50X25zbG9va3VwKTsKICAgICBicmVhazsKICAgY2FzZSBDVVJMSU5GT19DT05ORUNUX1RJTUU6Ci0gICAgKnBhcmFtX2RvdWJsZXAgPSBkYXRhLT5wcm9ncmVzcy50X2Nvbm5lY3Q7CisgICAgKnBhcmFtX2RvdWJsZXAgPSBET1VCTEVfU0VDUyhkYXRhLT5wcm9ncmVzcy50X2Nvbm5lY3QpOwogICAgIGJyZWFrOwogICBjYXNlIENVUkxJTkZPX0FQUENPTk5FQ1RfVElNRToKLSAgICAqcGFyYW1fZG91YmxlcCA9IGRhdGEtPnByb2dyZXNzLnRfYXBwY29ubmVjdDsKKyAgICAqcGFyYW1fZG91YmxlcCA9IERPVUJMRV9TRUNTKGRhdGEtPnByb2dyZXNzLnRfYXBwY29ubmVjdCk7CiAgICAgYnJlYWs7CiAgIGNhc2UgQ1VSTElORk9fUFJFVFJBTlNGRVJfVElNRToKLSAgICAqcGFyYW1fZG91YmxlcCA9ICBkYXRhLT5wcm9ncmVzcy50X3ByZXRyYW5zZmVyOworICAgICpwYXJhbV9kb3VibGVwID0gRE9VQkxFX1NFQ1MoZGF0YS0+cHJvZ3Jlc3MudF9wcmV0cmFuc2Zlcik7CiAgICAgYnJlYWs7CiAgIGNhc2UgQ1VSTElORk9fU1RBUlRUUkFOU0ZFUl9USU1FOgotICAgICpwYXJhbV9kb3VibGVwID0gZGF0YS0+cHJvZ3Jlc3MudF9zdGFydHRyYW5zZmVyOworICAgICpwYXJhbV9kb3VibGVwID0gRE9VQkxFX1NFQ1MoZGF0YS0+cHJvZ3Jlc3MudF9zdGFydHRyYW5zZmVyKTsKICAgICBicmVhazsKICAgY2FzZSBDVVJMSU5GT19TSVpFX1VQTE9BRDoKICAgICAqcGFyYW1fZG91YmxlcCA9ICAoZG91YmxlKWRhdGEtPnByb2dyZXNzLnVwbG9hZGVkOwpAQCAtMjg5LDcgKzMyMyw3IEBACiAgICAgICAoZG91YmxlKWRhdGEtPnByb2dyZXNzLnNpemVfdWw6LTE7CiAgICAgYnJlYWs7CiAgIGNhc2UgQ1VSTElORk9fUkVESVJFQ1RfVElNRToKLSAgICAqcGFyYW1fZG91YmxlcCA9ICBkYXRhLT5wcm9ncmVzcy50X3JlZGlyZWN0OworICAgICpwYXJhbV9kb3VibGVwID0gRE9VQkxFX1NFQ1MoZGF0YS0+cHJvZ3Jlc3MudF9yZWRpcmVjdCk7CiAgICAgYnJlYWs7CiAKICAgZGVmYXVsdDoKQEAgLTMyNiw0NiArMzYwLDI1IEBACiAgICAgICBzdHJ1Y3QgY3VybF90bHNzZXNzaW9uaW5mbyAqKnRzaXAgPSAoc3RydWN0IGN1cmxfdGxzc2Vzc2lvbmluZm8gKiopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zbGlzdHA7CiAgICAgICBzdHJ1Y3QgY3VybF90bHNzZXNzaW9uaW5mbyAqdHNpID0gJmRhdGEtPnRzaTsKKyNpZmRlZiBVU0VfU1NMCiAgICAgICBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4gPSBkYXRhLT5lYXN5X2Nvbm47CisjZW5kaWYKIAogICAgICAgKnRzaXAgPSB0c2k7CiAgICAgICB0c2ktPmJhY2tlbmQgPSBDdXJsX3NzbF9iYWNrZW5kKCk7CiAgICAgICB0c2ktPmludGVybmFscyA9IE5VTEw7CiAKKyNpZmRlZiBVU0VfU1NMCiAgICAgICBpZihjb25uICYmIHRzaS0+YmFja2VuZCAhPSBDVVJMU1NMQkFDS0VORF9OT05FKSB7CiAgICAgICAgIHVuc2lnbmVkIGludCBpOwogICAgICAgICBmb3IoaSA9IDA7IGkgPCAoc2l6ZW9mKGNvbm4tPnNzbCkgLyBzaXplb2YoY29ubi0+c3NsWzBdKSk7ICsraSkgewogICAgICAgICAgIGlmKGNvbm4tPnNzbFtpXS51c2UpIHsKLSNpZiBkZWZpbmVkKFVTRV9BWFRMUykKLSAgICAgICAgICAgIHRzaS0+aW50ZXJuYWxzID0gKHZvaWQgKiljb25uLT5zc2xbaV0uc3NsOwotI2VsaWYgZGVmaW5lZChVU0VfQ1lBU1NMKQotICAgICAgICAgICAgdHNpLT5pbnRlcm5hbHMgPSAodm9pZCAqKWNvbm4tPnNzbFtpXS5oYW5kbGU7Ci0jZWxpZiBkZWZpbmVkKFVTRV9EQVJXSU5TU0wpCi0gICAgICAgICAgICB0c2ktPmludGVybmFscyA9ICh2b2lkICopY29ubi0+c3NsW2ldLnNzbF9jdHg7Ci0jZWxpZiBkZWZpbmVkKFVTRV9HTlVUTFMpCi0gICAgICAgICAgICB0c2ktPmludGVybmFscyA9ICh2b2lkICopY29ubi0+c3NsW2ldLnNlc3Npb247Ci0jZWxpZiBkZWZpbmVkKFVTRV9HU0tJVCkKLSAgICAgICAgICAgIHRzaS0+aW50ZXJuYWxzID0gKHZvaWQgKiljb25uLT5zc2xbaV0uaGFuZGxlOwotI2VsaWYgZGVmaW5lZChVU0VfTUJFRFRMUykKLSAgICAgICAgICAgIHRzaS0+aW50ZXJuYWxzID0gKHZvaWQgKikmY29ubi0+c3NsW2ldLnNzbDsKLSNlbGlmIGRlZmluZWQoVVNFX05TUykKLSAgICAgICAgICAgIHRzaS0+aW50ZXJuYWxzID0gKHZvaWQgKiljb25uLT5zc2xbaV0uaGFuZGxlOwotI2VsaWYgZGVmaW5lZChVU0VfT1BFTlNTTCkKLSAgICAgICAgICAgIC8qIExlZ2FjeTogQ1VSTElORk9fVExTX1NFU1NJT04gbXVzdCByZXR1cm4gYW4gU1NMX0NUWCBwb2ludGVyLiAqLwotICAgICAgICAgICAgdHNpLT5pbnRlcm5hbHMgPSAoKGluZm8gPT0gQ1VSTElORk9fVExTX1NFU1NJT04pID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopY29ubi0+c3NsW2ldLmN0eCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNvbm4tPnNzbFtpXS5oYW5kbGUpOwotI2VsaWYgZGVmaW5lZChVU0VfUE9MQVJTU0wpCi0gICAgICAgICAgICB0c2ktPmludGVybmFscyA9ICh2b2lkICopJmNvbm4tPnNzbFtpXS5zc2w7Ci0jZWxpZiBkZWZpbmVkKFVTRV9TQ0hBTk5FTCkKLSAgICAgICAgICAgIHRzaS0+aW50ZXJuYWxzID0gKHZvaWQgKikmY29ubi0+c3NsW2ldLmN0eHQtPmN0eHRfaGFuZGxlOwotI2VsaWYgZGVmaW5lZChVU0VfU1NMKQotI2Vycm9yICJTU0wgYmFja2VuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbiBtaXNzaW5nIGZvciBDVVJMSU5GT19UTFNfU1NMX1BUUiIKLSNlbmRpZgorICAgICAgICAgICAgdHNpLT5pbnRlcm5hbHMgPSBDdXJsX3NzbC0+Z2V0X2ludGVybmFscygmY29ubi0+c3NsW2ldLCBpbmZvKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQorI2VuZGlmCiAgICAgfQogICAgIGJyZWFrOwogICBkZWZhdWx0OgpAQCAtMzk0LDYgKzQwNyw3IEBACiAgIHZhX2xpc3QgYXJnOwogICBsb25nICpwYXJhbV9sb25ncCA9IE5VTEw7CiAgIGRvdWJsZSAqcGFyYW1fZG91YmxlcCA9IE5VTEw7CisgIGN1cmxfb2ZmX3QgKnBhcmFtX29mZnQgPSBOVUxMOwogICBjb25zdCBjaGFyICoqcGFyYW1fY2hhcnAgPSBOVUxMOwogICBzdHJ1Y3QgY3VybF9zbGlzdCAqKnBhcmFtX3NsaXN0cCA9IE5VTEw7CiAgIGN1cmxfc29ja2V0X3QgKnBhcmFtX3NvY2tldHAgPSBOVUxMOwpAQCAtNDIyLDYgKzQzNiwxMSBAQAogICAgIGlmKHBhcmFtX2RvdWJsZXApCiAgICAgICByZXN1bHQgPSBnZXRpbmZvX2RvdWJsZShkYXRhLCBpbmZvLCBwYXJhbV9kb3VibGVwKTsKICAgICBicmVhazsKKyAgY2FzZSBDVVJMSU5GT19PRkZfVDoKKyAgICBwYXJhbV9vZmZ0ID0gdmFfYXJnKGFyZywgY3VybF9vZmZfdCAqKTsKKyAgICBpZihwYXJhbV9vZmZ0KQorICAgICAgcmVzdWx0ID0gZ2V0aW5mb19vZmZ0KGRhdGEsIGluZm8sIHBhcmFtX29mZnQpOworICAgIGJyZWFrOwogICBjYXNlIENVUkxJTkZPX1NMSVNUOgogICAgIHBhcmFtX3NsaXN0cCA9IHZhX2FyZyhhcmcsIHN0cnVjdCBjdXJsX3NsaXN0ICoqKTsKICAgICBpZihwYXJhbV9zbGlzdHApCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9nb3BoZXIuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2dvcGhlci5jCmluZGV4IGU2ZDI3NDYuLmI3YzMxYjYgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2dvcGhlci5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2dvcGhlci5jCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC02NSw2ICs2NSw3IEBACiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9HT1BIRVIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCiAgIENVUkxQUk9UT19HT1BIRVIsICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFncyAqLwpAQCAtNzIsOCArNzMsOCBAQAogCiBzdGF0aWMgQ1VSTGNvZGUgZ29waGVyX2RvKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgYm9vbCAqZG9uZSkKIHsKLSAgQ1VSTGNvZGUgcmVzdWx0PUNVUkxFX09LOwotICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhPWNvbm4tPmRhdGE7CisgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOworICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKICAgY3VybF9zb2NrZXRfdCBzb2NrZmQgPSBjb25uLT5zb2NrW0ZJUlNUU09DS0VUXTsKIAogICBjdXJsX29mZl90ICpieXRlY291bnQgPSAmZGF0YS0+cmVxLmJ5dGVjb3VudDsKQEAgLTk2LDExICs5NywxMSBAQAogCiAgICAgLyogT3RoZXJ3aXNlLCBkcm9wIC8gYW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgKGkuZS4sIGl0ZW0gdHlwZSkgLi4uICovCiAgICAgbmV3cCA9IHBhdGg7Ci0gICAgbmV3cCs9MjsKKyAgICBuZXdwICs9IDI7CiAKICAgICAvKiAuLi4gdGhlbiB0dXJuID8gaW50byBUQUIgZm9yIHNlYXJjaCBzZXJ2ZXJzLCBWZXJvbmljYSwgZXRjLiAuLi4gKi8KICAgICBqID0gc3RybGVuKG5ld3ApOwotICAgIGZvcihpPTA7IGk8ajsgaSsrKQorICAgIGZvcihpID0gMDsgaTxqOyBpKyspCiAgICAgICBpZihuZXdwW2ldID09ICc/JykKICAgICAgICAgbmV3cFtpXSA9ICdceDA5JzsKIApkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaGFzaC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaGFzaC5jCmluZGV4IDZhZmVhYTEuLmM5OWIxYjYgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2hhc2guYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9oYXNoLmMKQEAgLTMwMCwxMCArMzAwLDEwIEBACiAKICAgLyogSWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGxpc3QsIGZpbmQgdGhlIG5leHQgb25lICovCiAgIGlmKCFpdGVyLT5jdXJyZW50X2VsZW1lbnQpIHsKLSAgICBmb3IoaSA9IGl0ZXItPnNsb3RfaW5kZXg7aSA8IGgtPnNsb3RzO2krKykgeworICAgIGZvcihpID0gaXRlci0+c2xvdF9pbmRleDsgaSA8IGgtPnNsb3RzOyBpKyspIHsKICAgICAgIGlmKGgtPnRhYmxlW2ldLmhlYWQpIHsKICAgICAgICAgaXRlci0+Y3VycmVudF9lbGVtZW50ID0gaC0+dGFibGVbaV0uaGVhZDsKLSAgICAgICAgaXRlci0+c2xvdF9pbmRleCA9IGkrMTsKKyAgICAgICAgaXRlci0+c2xvdF9pbmRleCA9IGkgKyAxOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9ob3N0Y2hlY2suYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2hvc3RjaGVjay5jCmluZGV4IDE1NjA5MWMuLjIzZGMzZDIgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2hvc3RjaGVjay5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2hvc3RjaGVjay5jCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC03MywxMCArNzMsMTAgQEAKICAgLyogbm9ybWFsaXplIHBhdHRlcm4gYW5kIGhvc3RuYW1lIGJ5IHN0cmlwcGluZyBvZmYgdHJhaWxpbmcgZG90cyAqLwogICBzaXplX3QgbGVuID0gc3RybGVuKGhvc3RuYW1lKTsKICAgaWYoaG9zdG5hbWVbbGVuLTFdPT0nLicpCi0gICAgaG9zdG5hbWVbbGVuLTFdPTA7CisgICAgaG9zdG5hbWVbbGVuLTFdID0gMDsKICAgbGVuID0gc3RybGVuKHBhdHRlcm4pOwogICBpZihwYXR0ZXJuW2xlbi0xXT09Jy4nKQotICAgIHBhdHRlcm5bbGVuLTFdPTA7CisgICAgcGF0dGVybltsZW4tMV0gPSAwOwogCiAgIHBhdHRlcm5fd2lsZGNhcmQgPSBzdHJjaHIocGF0dGVybiwgJyonKTsKICAgaWYocGF0dGVybl93aWxkY2FyZCA9PSBOVUxMKQpAQCAtOTUsNyArOTUsNyBAQAogICAgICBtYXRjaC4gKi8KICAgd2lsZGNhcmRfZW5hYmxlZCA9IDE7CiAgIHBhdHRlcm5fbGFiZWxfZW5kID0gc3RyY2hyKHBhdHRlcm4sICcuJyk7Ci0gIGlmKHBhdHRlcm5fbGFiZWxfZW5kID09IE5VTEwgfHwgc3RyY2hyKHBhdHRlcm5fbGFiZWxfZW5kKzEsICcuJykgPT0gTlVMTCB8fAorICBpZihwYXR0ZXJuX2xhYmVsX2VuZCA9PSBOVUxMIHx8IHN0cmNocihwYXR0ZXJuX2xhYmVsX2VuZCArIDEsICcuJykgPT0gTlVMTCB8fAogICAgICBwYXR0ZXJuX3dpbGRjYXJkID4gcGF0dGVybl9sYWJlbF9lbmQgfHwKICAgICAgc3RybmNhc2Vjb21wYXJlKHBhdHRlcm4sICJ4bi0tIiwgNCkpIHsKICAgICB3aWxkY2FyZF9lbmFibGVkID0gMDsKQEAgLTExNiw5ICsxMTYsOSBAQAogICAgIHJldHVybiBDVVJMX0hPU1RfTk9NQVRDSDsKIAogICBwcmVmaXhsZW4gPSBwYXR0ZXJuX3dpbGRjYXJkIC0gcGF0dGVybjsKLSAgc3VmZml4bGVuID0gcGF0dGVybl9sYWJlbF9lbmQgLSAocGF0dGVybl93aWxkY2FyZCsxKTsKKyAgc3VmZml4bGVuID0gcGF0dGVybl9sYWJlbF9lbmQgLSAocGF0dGVybl93aWxkY2FyZCArIDEpOwogICByZXR1cm4gc3RybmNhc2Vjb21wYXJlKHBhdHRlcm4sIGhvc3RuYW1lLCBwcmVmaXhsZW4pICYmCi0gICAgc3RybmNhc2Vjb21wYXJlKHBhdHRlcm5fd2lsZGNhcmQrMSwgaG9zdG5hbWVfbGFiZWxfZW5kIC0gc3VmZml4bGVuLAorICAgIHN0cm5jYXNlY29tcGFyZShwYXR0ZXJuX3dpbGRjYXJkICsgMSwgaG9zdG5hbWVfbGFiZWxfZW5kIC0gc3VmZml4bGVuLAogICAgICAgICAgICAgICAgICAgICBzdWZmaXhsZW4pID8KICAgICBDVVJMX0hPU1RfTUFUQ0ggOiBDVVJMX0hPU1RfTk9NQVRDSDsKIH0KQEAgLTEzNyw3ICsxMzcsNyBAQAogICAgICAgaG9zdHAgPSBzdHJkdXAoaG9zdG5hbWUpOwogICAgICAgaWYoaG9zdHApIHsKICAgICAgICAgaWYoaG9zdG1hdGNoKGhvc3RwLCBtYXRjaHApID09IENVUkxfSE9TVF9NQVRDSCkKLSAgICAgICAgICByZXM9IDE7CisgICAgICAgICAgcmVzID0gMTsKICAgICAgICAgZnJlZShob3N0cCk7CiAgICAgICB9CiAgICAgICBmcmVlKG1hdGNocCk7CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9ob3N0aXAuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2hvc3RpcC5jCmluZGV4IDYxOWVjODQuLjFhMThhM2UgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2hvc3RpcC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2hvc3RpcC5jCkBAIC0zMDQsOSArMzA0LDkgQEAKICAgZW50cnlfbGVuID0gc3RybGVuKGVudHJ5X2lkKTsKIAogICAvKiBTZWUgaWYgaXRzIGFscmVhZHkgaW4gb3VyIGRucyBjYWNoZSAqLwotICBkbnMgPSBDdXJsX2hhc2hfcGljayhkYXRhLT5kbnMuaG9zdGNhY2hlLCBlbnRyeV9pZCwgZW50cnlfbGVuKzEpOworICBkbnMgPSBDdXJsX2hhc2hfcGljayhkYXRhLT5kbnMuaG9zdGNhY2hlLCBlbnRyeV9pZCwgZW50cnlfbGVuICsgMSk7CiAKLSAgaWYoZG5zICYmIChkYXRhLT5zZXQuZG5zX2NhY2hlX3RpbWVvdXQgIT0gLTEpKSAgeworICBpZihkbnMgJiYgKGRhdGEtPnNldC5kbnNfY2FjaGVfdGltZW91dCAhPSAtMSkpIHsKICAgICAvKiBTZWUgd2hldGhlciB0aGUgcmV0dXJuZWQgZW50cnkgaXMgc3RhbGUuIERvbmUgYmVmb3JlIHdlIHJlbGVhc2UgbG9jayAqLwogICAgIHN0cnVjdCBob3N0Y2FjaGVfcHJ1bmVfZGF0YSB1c2VyOwogCkBAIC0zMTYsNyArMzE2LDcgQEAKICAgICBpZihob3N0Y2FjaGVfdGltZXN0YW1wX3JlbW92ZSgmdXNlciwgZG5zKSkgewogICAgICAgaW5mb2YoZGF0YSwgIkhvc3RuYW1lIGluIEROUyBjYWNoZSB3YXMgc3RhbGUsIHphcHBlZFxuIik7CiAgICAgICBkbnMgPSBOVUxMOyAvKiB0aGUgbWVtb3J5IGRlYWxsb2NhdGlvbiBpcyBiZWluZyBoYW5kbGVkIGJ5IHRoZSBoYXNoICovCi0gICAgICBDdXJsX2hhc2hfZGVsZXRlKGRhdGEtPmRucy5ob3N0Y2FjaGUsIGVudHJ5X2lkLCBlbnRyeV9sZW4rMSk7CisgICAgICBDdXJsX2hhc2hfZGVsZXRlKGRhdGEtPmRucy5ob3N0Y2FjaGUsIGVudHJ5X2lkLCBlbnRyeV9sZW4gKyAxKTsKICAgICB9CiAgIH0KIApAQCAtNDAzLDcgKzQwMyw3IEBACiAgICAgZG5zLT50aW1lc3RhbXAgPSAxOyAgIC8qIHplcm8gaW5kaWNhdGVzIENVUkxPUFRfUkVTT0xWRSBlbnRyeSAqLwogCiAgIC8qIFN0b3JlIHRoZSByZXNvbHZlZCBkYXRhIGluIG91ciBETlMgY2FjaGUuICovCi0gIGRuczIgPSBDdXJsX2hhc2hfYWRkKGRhdGEtPmRucy5ob3N0Y2FjaGUsIGVudHJ5X2lkLCBlbnRyeV9sZW4rMSwKKyAgZG5zMiA9IEN1cmxfaGFzaF9hZGQoZGF0YS0+ZG5zLmhvc3RjYWNoZSwgZW50cnlfaWQsIGVudHJ5X2xlbiArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopZG5zKTsKICAgaWYoIWRuczIpIHsKICAgICBmcmVlKGRucyk7CkBAIC04MDcsNyArODA3LDcgQEAKICAgICAgICAgQ3VybF9zaGFyZV9sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0ROUywgQ1VSTF9MT0NLX0FDQ0VTU19TSU5HTEUpOwogCiAgICAgICAvKiBkZWxldGUgZW50cnksIGlnbm9yZSBpZiBpdCBkaWRuJ3QgZXhpc3QgKi8KLSAgICAgIEN1cmxfaGFzaF9kZWxldGUoZGF0YS0+ZG5zLmhvc3RjYWNoZSwgZW50cnlfaWQsIGVudHJ5X2xlbisxKTsKKyAgICAgIEN1cmxfaGFzaF9kZWxldGUoZGF0YS0+ZG5zLmhvc3RjYWNoZSwgZW50cnlfaWQsIGVudHJ5X2xlbiArIDEpOwogCiAgICAgICBpZihkYXRhLT5zaGFyZSkKICAgICAgICAgQ3VybF9zaGFyZV91bmxvY2soZGF0YSwgQ1VSTF9MT0NLX0RBVEFfRE5TKTsKQEAgLTg0OCw3ICs4NDgsNyBAQAogICAgICAgICBDdXJsX3NoYXJlX2xvY2soZGF0YSwgQ1VSTF9MT0NLX0RBVEFfRE5TLCBDVVJMX0xPQ0tfQUNDRVNTX1NJTkdMRSk7CiAKICAgICAgIC8qIFNlZSBpZiBpdHMgYWxyZWFkeSBpbiBvdXIgZG5zIGNhY2hlICovCi0gICAgICBkbnMgPSBDdXJsX2hhc2hfcGljayhkYXRhLT5kbnMuaG9zdGNhY2hlLCBlbnRyeV9pZCwgZW50cnlfbGVuKzEpOworICAgICAgZG5zID0gQ3VybF9oYXNoX3BpY2soZGF0YS0+ZG5zLmhvc3RjYWNoZSwgZW50cnlfaWQsIGVudHJ5X2xlbiArIDEpOwogCiAgICAgICAvKiBmcmVlIHRoZSBhbGxvY2F0ZWQgZW50cnlfaWQgYWdhaW4gKi8KICAgICAgIGZyZWUoZW50cnlfaWQpOwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaG9zdGlwNC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaG9zdGlwNC5jCmluZGV4IGU0NTkzMjguLjZhN2M2ZTUgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2hvc3RpcDQuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9ob3N0aXA0LmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTI0OSw3ICsyNDksNyBAQAogICAgICAqLwogCiAgICAgaWYoQ1VSTF9IT1NURU5UX1NJWkUgPj0KLSAgICAgICAoc2l6ZW9mKHN0cnVjdCBob3N0ZW50KStzaXplb2Yoc3RydWN0IGhvc3RlbnRfZGF0YSkpKSB7CisgICAgICAgKHNpemVvZihzdHJ1Y3QgaG9zdGVudCkgKyBzaXplb2Yoc3RydWN0IGhvc3RlbnRfZGF0YSkpKSB7CiAKICAgICAgIC8qIEF1Z3VzdCAyMm5kLCAyMDAwOiBBbGJlcnQgQ2hpbi1BLVlvdW5nIGJyb3VnaHQgYW4gdXBkYXRlZCB2ZXJzaW9uCiAgICAgICAgKiB0aGF0IHNob3VsZCB3b3JrISBTZXB0ZW1iZXIgMjA6IFJpY2hhcmQgUHJlc2NvdHQgd29ya2VkIG9uIHRoZSBidWZmZXIKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2hvc3RpcDYuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2hvc3RpcDYuYwppbmRleCA0ZWJmYzJkLi5lZGVlYmVjIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9ob3N0aXA2LmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaG9zdGlwNi5jCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC0yMTIsNyArMjEyLDcgQEAKIAogICBpZihwb3J0KSB7CiAgICAgc25wcmludGYoc2J1Ziwgc2l6ZW9mKHNidWYpLCAiJWQiLCBwb3J0KTsKLSAgICBzYnVmcHRyPXNidWY7CisgICAgc2J1ZnB0ciA9IHNidWY7CiAgIH0KIAogICBlcnJvciA9IEN1cmxfZ2V0YWRkcmluZm9fZXgoaG9zdG5hbWUsIHNidWZwdHIsICZoaW50cywgJnJlcyk7CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwLmMKaW5kZXggMjE1NzRlMi4uMzgyMjdlYiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2h0dHAuYwpAQCAtNTAsNiArNTAsNyBAQAogI2luY2x1ZGUgInRyYW5zZmVyLmgiCiAjaW5jbHVkZSAic2VuZGYuaCIKICNpbmNsdWRlICJmb3JtZGF0YS5oIgorI2luY2x1ZGUgIm1pbWUuaCIKICNpbmNsdWRlICJwcm9ncmVzcy5oIgogI2luY2x1ZGUgImN1cmxfYmFzZTY0LmgiCiAjaW5jbHVkZSAiY29va2llLmgiCkBAIC0xMTksNiArMTIwLDcgQEAKICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCisgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbl9jaGVjayAqLwogICBQT1JUX0hUVFAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX0hUVFAsICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwogICBQUk9UT1BUX0NSRURTUEVSUkVRVUVTVCAgICAgICAgICAgICAgIC8qIGZsYWdzICovCkBAIC0xNDMsNiArMTQ1LDcgQEAKICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCisgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbl9jaGVjayAqLwogICBQT1JUX0hUVFBTLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX0hUVFBTLCAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwogICBQUk9UT1BUX1NTTCB8IFBST1RPUFRfQ1JFRFNQRVJSRVFVRVNUIHwgUFJPVE9QVF9BTFBOX05QTiAvKiBmbGFncyAqLwpAQCAtMTYwLDYgKzE2Myw3IEBACiAgIGlmKCFodHRwKQogICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogCisgIEN1cmxfbWltZV9pbml0cGFydCgmaHR0cC0+Zm9ybSwgY29ubi0+ZGF0YSk7CiAgIGNvbm4tPmRhdGEtPnJlcS5wcm90b3AgPSBodHRwOwogCiAgIEN1cmxfaHR0cDJfc2V0dXBfY29ubihjb25uKTsKQEAgLTE2OCwyNiArMTcyLDYgQEAKICAgcmV0dXJuIENVUkxFX09LOwogfQogCi0vKgotICogY2hlY2toZWFkZXJzKCkgY2hlY2tzIHRoZSBsaW5rZWQgbGlzdCBvZiBjdXN0b20gSFRUUCBoZWFkZXJzIGZvciBhCi0gKiBwYXJ0aWN1bGFyIGhlYWRlciAocHJlZml4KS4KLSAqCi0gKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgbWF0Y2hpbmcgaGVhZGVyIG9yIE5VTEwgaWYgbm9uZSBtYXRjaGVkLgotICovCi1jaGFyICpDdXJsX2NoZWNraGVhZGVycyhjb25zdCBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0aGlzaGVhZGVyKQotewotICBzdHJ1Y3QgY3VybF9zbGlzdCAqaGVhZDsKLSAgc2l6ZV90IHRoaXNsZW4gPSBzdHJsZW4odGhpc2hlYWRlcik7Ci0gIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwotCi0gIGZvcihoZWFkID0gZGF0YS0+c2V0LmhlYWRlcnM7aGVhZDsgaGVhZD1oZWFkLT5uZXh0KSB7Ci0gICAgaWYoc3RybmNhc2Vjb21wYXJlKGhlYWQtPmRhdGEsIHRoaXNoZWFkZXIsIHRoaXNsZW4pKQotICAgICAgcmV0dXJuIGhlYWQtPmRhdGE7Ci0gIH0KLQotICByZXR1cm4gTlVMTDsKLX0KIAogLyoKICAqIGNoZWNrUHJveHlIZWFkZXJzKCkgY2hlY2tzIHRoZSBsaW5rZWQgbGlzdCBvZiBjdXN0b20gcHJveHkgaGVhZGVycwpAQCAtMjA3LDcgKzE5MSw3IEBACiAKICAgZm9yKGhlYWQgPSAoY29ubi0+Yml0cy5wcm94eSAmJiBkYXRhLT5zZXQuc2VwX2hlYWRlcnMpID8KICAgICAgICAgZGF0YS0+c2V0LnByb3h5aGVhZGVycyA6IGRhdGEtPnNldC5oZWFkZXJzOwotICAgICAgaGVhZDsgaGVhZD1oZWFkLT5uZXh0KSB7CisgICAgICBoZWFkOyBoZWFkID0gaGVhZC0+bmV4dCkgewogICAgIGlmKHN0cm5jYXNlY29tcGFyZShoZWFkLT5kYXRhLCB0aGlzaGVhZGVyLCB0aGlzbGVuKSkKICAgICAgIHJldHVybiBoZWFkLT5kYXRhOwogICB9CkBAIC00MjUsNiArNDA5LDcgQEAKICAgICAgICAgZXhwZWN0c2VuZCA9IGRhdGEtPnN0YXRlLmluZmlsZXNpemU7CiAgICAgICBicmVhazsKICAgICBjYXNlIEhUVFBSRVFfUE9TVF9GT1JNOgorICAgIGNhc2UgSFRUUFJFUV9QT1NUX01JTUU6CiAgICAgICBleHBlY3RzZW5kID0gaHR0cC0+cG9zdHNpemU7CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgpAQCAtNjA4LDcgKzU5Myw3IEBACiAjZW5kaWYKICNpZiBkZWZpbmVkKFVTRV9OVExNKSAmJiBkZWZpbmVkKE5UTE1fV0JfRU5BQkxFRCkKICAgaWYoYXV0aHN0YXR1cy0+cGlja2VkID09IENVUkxBVVRIX05UTE1fV0IpIHsKLSAgICBhdXRoPSJOVExNX1dCIjsKKyAgICBhdXRoID0gIk5UTE1fV0IiOwogICAgIHJlc3VsdCA9IEN1cmxfb3V0cHV0X250bG1fd2IoY29ubiwgcHJveHkpOwogICAgIGlmKHJlc3VsdCkKICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC0xMDIwLDcgKzEwMDUsNyBAQAogCiAgICAgICBodHRwLT5zZW5kaW5nKys7IC8qIG1vdmUgb25lIHN0ZXAgdXAgKi8KIAotICAgICAgaHR0cC0+YmFja3VwLnBvc3RzaXplPTA7CisgICAgICBodHRwLT5iYWNrdXAucG9zdHNpemUgPSAwOwogICAgIH0KICAgICBlbHNlCiAgICAgICBodHRwLT5wb3N0c2l6ZSA9IDA7CkBAIC0xMTQ4LDcgKzExMzMsNyBAQAogICAgICAgICAvKiB0aGVyZSB3YXMgYm9keSBkYXRhIHNlbnQgYmV5b25kIHRoZSBpbml0aWFsIGhlYWRlciBwYXJ0LCBwYXNzIHRoYXQKICAgICAgICAgICAgb24gdG8gdGhlIGRlYnVnIGNhbGxiYWNrIHRvbyAqLwogICAgICAgICBDdXJsX2RlYnVnKGNvbm4tPmRhdGEsIENVUkxJTkZPX0RBVEFfT1VULAotICAgICAgICAgICAgICAgICAgIHB0citoZWFkbGVuLCBib2R5bGVuLCBjb25uKTsKKyAgICAgICAgICAgICAgICAgICBwdHIgKyBoZWFkbGVuLCBib2R5bGVuLCBjb25uKTsKICAgICAgIH0KICAgICB9CiAKQEAgLTEyNjAsNyArMTI0NSw3IEBACiAgICAgICAgKH4oc2l6ZSAqIDIpIDwgKGluLT5zaXplX3VzZWQgKiAyKSkpCiAgICAgICBuZXdfc2l6ZSA9IChzaXplX3QpLTE7CiAgICAgZWxzZQotICAgICAgbmV3X3NpemUgPSAoaW4tPnNpemVfdXNlZCtzaXplKSAqIDI7CisgICAgICBuZXdfc2l6ZSA9IChpbi0+c2l6ZV91c2VkICsgc2l6ZSkgKiAyOwogCiAgICAgaWYoaW4tPmJ1ZmZlcikKICAgICAgIC8qIHdlIGhhdmUgYSBidWZmZXIsIGVubGFyZ2UgdGhlIGV4aXN0aW5nIG9uZSAqLwpAQCAtMTMzNyw3ICsxMzIyLDcgQEAKICAgY2xlbiA9IHN0cmxlbihjb250ZW50KTsgLyogbGVuZ3RoIG9mIHRoZSB3b3JkIHRvIGZpbmQgKi8KIAogICAvKiBmaW5kIHRoZSBjb250ZW50IHN0cmluZyBpbiB0aGUgcmVzdCBvZiB0aGUgbGluZSAqLwotICBmb3IoO2xlbj49Y2xlbjtsZW4tLSwgc3RhcnQrKykgeworICBmb3IoOyBsZW4gPj0gY2xlbjsgbGVuLS0sIHN0YXJ0KyspIHsKICAgICBpZihzdHJuY2FzZWNvbXBhcmUoc3RhcnQsIGNvbnRlbnQsIGNsZW4pKQogICAgICAgcmV0dXJuIFRSVUU7IC8qIG1hdGNoISAqLwogICB9CkBAIC0xMzY5LDcgKzEzNTQsNyBAQAogICBpZihDT05ORUNUX0ZJUlNUU09DS0VUX1BST1hZX1NTTCgpKQogICAgIHJldHVybiBDVVJMRV9PSzsgLyogd2FpdCBmb3IgSFRUUFMgcHJveHkgU1NMIGluaXRpYWxpemF0aW9uIHRvIGNvbXBsZXRlICovCiAKLSAgaWYoY29ubi0+dHVubmVsX3N0YXRlW0ZJUlNUU09DS0VUXSA9PSBUVU5ORUxfQ09OTkVDVCkKKyAgaWYoQ3VybF9jb25uZWN0X29uZ29pbmcoY29ubikpCiAgICAgLyogbm90aGluZyBlbHNlIHRvIGRvIGV4Y2VwdCB3YWl0IHJpZ2h0IG5vdyAtIHdlJ3JlIG5vdCBkb25lIGhlcmUuICovCiAgICAgcmV0dXJuIENVUkxFX09LOwogCkBAIC0xNDY4LDE4ICsxNDUzLDE3IEBACiAKICAgQ3VybF9odHRwMl9kb25lKGNvbm4sIHByZW1hdHVyZSk7CiAKLSAgaWYoSFRUUFJFUV9QT1NUX0ZPUk0gPT0gZGF0YS0+c2V0Lmh0dHByZXEpIHsKLSAgICBkYXRhLT5yZXEuYnl0ZWNvdW50ID0gaHR0cC0+cmVhZGJ5dGVjb3VudCArIGh0dHAtPndyaXRlYnl0ZWNvdW50OworICBDdXJsX21pbWVfY2xlYW5wYXJ0KCZodHRwLT5mb3JtKTsKIAotICAgIEN1cmxfZm9ybWNsZWFuKCZodHRwLT5zZW5kaXQpOyAvKiBOb3cgZnJlZSB0aGF0IHdob2xlIGxvdCAqLwotICAgIGlmKGh0dHAtPmZvcm0uZnApIHsKLSAgICAgIC8qIGEgZmlsZSBiZWluZyB1cGxvYWRlZCB3YXMgbGVmdCBvcGVuZWQsIGNsb3NlIGl0ISAqLwotICAgICAgZmNsb3NlKGh0dHAtPmZvcm0uZnApOwotICAgICAgaHR0cC0+Zm9ybS5mcCA9IE5VTEw7Ci0gICAgfQotICB9Ci0gIGVsc2UgaWYoSFRUUFJFUV9QVVQgPT0gZGF0YS0+c2V0Lmh0dHByZXEpCisgIHN3aXRjaChkYXRhLT5zZXQuaHR0cHJlcSkgeworICBjYXNlIEhUVFBSRVFfUFVUOgorICBjYXNlIEhUVFBSRVFfUE9TVF9GT1JNOgorICBjYXNlIEhUVFBSRVFfUE9TVF9NSU1FOgogICAgIGRhdGEtPnJlcS5ieXRlY291bnQgPSBodHRwLT5yZWFkYnl0ZWNvdW50ICsgaHR0cC0+d3JpdGVieXRlY291bnQ7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KIAogICBpZihzdGF0dXMpCiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTE1NzksNyArMTU2Myw3IEBACiAgIGNoYXIgKnB0cjsKICAgc3RydWN0IGN1cmxfc2xpc3QgKmhbMl07CiAgIHN0cnVjdCBjdXJsX3NsaXN0ICpoZWFkZXJzOwotICBpbnQgbnVtbGlzdHM9MTsgLyogYnkgZGVmYXVsdCAqLworICBpbnQgbnVtbGlzdHMgPSAxOyAvKiBieSBkZWZhdWx0ICovCiAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogICBpbnQgaTsKIApAQCAtMTYxMSw3ICsxNTk1LDcgQEAKICAgfQogCiAgIC8qIGxvb3AgdGhyb3VnaCBvbmUgb3IgdHdvIGxpc3RzICovCi0gIGZvcihpPTA7IGkgPCBudW1saXN0czsgaSsrKSB7CisgIGZvcihpID0gMDsgaSA8IG51bWxpc3RzOyBpKyspIHsKICAgICBoZWFkZXJzID0gaFtpXTsKIAogICAgIHdoaWxlKGhlYWRlcnMpIHsKQEAgLTE2MzUsMTUgKzE2MTksMTkgQEAKICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgaGVhZGVyIChleHRlbmRlZCBieSBmb3JtZGF0YS5jKSBpcyBzZW50IGxhdGVyICovCiAgICAgICAgICAgICAgICAgICBjaGVja3ByZWZpeCgiQ29udGVudC1UeXBlOiIsIGhlYWRlcnMtPmRhdGEpKQogICAgICAgICAgICAgOworICAgICAgICAgIGVsc2UgaWYoZGF0YS0+c2V0Lmh0dHByZXEgPT0gSFRUUFJFUV9QT1NUX01JTUUgJiYKKyAgICAgICAgICAgICAgICAgIC8qIHRoaXMgaGVhZGVyIGlzIHNlbnQgbGF0ZXIgKi8KKyAgICAgICAgICAgICAgICAgIGNoZWNrcHJlZml4KCJDb250ZW50LVR5cGU6IiwgaGVhZGVycy0+ZGF0YSkpCisgICAgICAgICAgICA7CiAgICAgICAgICAgZWxzZSBpZihjb25uLT5iaXRzLmF1dGhuZWcgJiYKICAgICAgICAgICAgICAgICAgIC8qIHdoaWxlIGRvaW5nIGF1dGggbmVnLCBkb24ndCBhbGxvdyB0aGUgY3VzdG9tIGxlbmd0aCBzaW5jZQogICAgICAgICAgICAgICAgICAgICAgd2Ugd2lsbCBmb3JjZSBsZW5ndGggemVybyB0aGVuICovCi0gICAgICAgICAgICAgICAgICBjaGVja3ByZWZpeCgiQ29udGVudC1MZW5ndGgiLCBoZWFkZXJzLT5kYXRhKSkKKyAgICAgICAgICAgICAgICAgIGNoZWNrcHJlZml4KCJDb250ZW50LUxlbmd0aDoiLCBoZWFkZXJzLT5kYXRhKSkKICAgICAgICAgICAgIDsKICAgICAgICAgICBlbHNlIGlmKGNvbm4tPmFsbG9jcHRyLnRlICYmCiAgICAgICAgICAgICAgICAgICAvKiB3aGVuIGFza2luZyBmb3IgVHJhbnNmZXItRW5jb2RpbmcsIGRvbid0IHBhc3Mgb24gYSBjdXN0b20KICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb246ICovCi0gICAgICAgICAgICAgICAgICBjaGVja3ByZWZpeCgiQ29ubmVjdGlvbiIsIGhlYWRlcnMtPmRhdGEpKQorICAgICAgICAgICAgICAgICAgY2hlY2twcmVmaXgoIkNvbm5lY3Rpb246IiwgaGVhZGVycy0+ZGF0YSkpCiAgICAgICAgICAgICA7CiAgICAgICAgICAgZWxzZSBpZigoY29ubi0+aHR0cHZlcnNpb24gPT0gMjApICYmCiAgICAgICAgICAgICAgICAgICBjaGVja3ByZWZpeCgiVHJhbnNmZXItRW5jb2Rpbmc6IiwgaGVhZGVycy0+ZGF0YSkpCkBAIC0xNjc2LDYgKzE2NjQsMTAgQEAKICAgICAgICAgICAgICAgKnB0ciA9ICc6JzsKICAgICAgICAgICAgICAgcmVzdWx0ID0gQ3VybF9hZGRfYnVmZmVyZihyZXFfYnVmZmVyLCAiJXNcclxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLT5kYXRhKTsKKworICAgICAgICAgICAgICAvKiByZXN0b3JlIHRoZSBwcmV2aW91cyB2YWx1ZSAqLworICAgICAgICAgICAgICAqcHRyID0gJzsnOworCiAgICAgICAgICAgICAgIGlmKHJlc3VsdCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgfQpAQCAtMTc3Myw3ICsxNzY1LDcgQEAKICAgY29uc3QgY2hhciAqaHR0cHN0cmluZzsKICAgQ3VybF9zZW5kX2J1ZmZlciAqcmVxX2J1ZmZlcjsKICAgY3VybF9vZmZfdCBwb3N0c2l6ZSA9IDA7IC8qIGN1cmxfb2ZmX3QgdG8gaGFuZGxlIGxhcmdlIGZpbGUgc2l6ZXMgKi8KLSAgaW50IHNlZWtlcnIgPSBDVVJMX1NFRUtGVU5DX09LOworICBpbnQgc2Vla2VyciA9IENVUkxfU0VFS0ZVTkNfQ0FOVFNFRUs7CiAKICAgLyogQWx3YXlzIGNvbnNpZGVyIHRoZSBETyBwaGFzZSBkb25lIGFmdGVyIHRoaXMgZnVuY3Rpb24gY2FsbCwgZXZlbiBpZiB0aGVyZQogICAgICBtYXkgYmUgcGFydHMgb2YgdGhlIHJlcXVlc3QgdGhhdCBpcyBub3QgeWV0IHNlbnQsIHNpbmNlIHdlIGNhbiBkZWFsIHdpdGgKQEAgLTE4NDYsMTEgKzE4MzgsMTUgQEAKICAgICAgIHN3aXRjaChodHRwcmVxKSB7CiAgICAgICBjYXNlIEhUVFBSRVFfUE9TVDoKICAgICAgIGNhc2UgSFRUUFJFUV9QT1NUX0ZPUk06CisgICAgICBjYXNlIEhUVFBSRVFfUE9TVF9NSU1FOgogICAgICAgICByZXF1ZXN0ID0gIlBPU1QiOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgSFRUUFJFUV9QVVQ6CiAgICAgICAgIHJlcXVlc3QgPSAiUFVUIjsKICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhUVFBSRVFfT1BUSU9OUzoKKyAgICAgICAgcmVxdWVzdCA9ICJPUFRJT05TIjsKKyAgICAgICAgYnJlYWs7CiAgICAgICBkZWZhdWx0OiAvKiB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KICAgICAgIGNhc2UgSFRUUFJFUV9HRVQ6CiAgICAgICAgIHJlcXVlc3QgPSAiR0VUIjsKQEAgLTE4NjgsNyArMTg2NCw3IEBACiAgICAgIGhlcmUuICovCiAgIGlmKEN1cmxfY2hlY2toZWFkZXJzKGNvbm4sICJVc2VyLUFnZW50OiIpKSB7CiAgICAgZnJlZShjb25uLT5hbGxvY3B0ci51YWdlbnQpOwotICAgIGNvbm4tPmFsbG9jcHRyLnVhZ2VudD1OVUxMOworICAgIGNvbm4tPmFsbG9jcHRyLnVhZ2VudCA9IE5VTEw7CiAgIH0KIAogICAvKiBzZXR1cCB0aGUgYXV0aGVudGljYXRpb24gaGVhZGVycyAqLwpAQCAtMTkzNyw2ICsxOTMzLDQ4IEBACiAgIH0KICNlbmRpZgogCisgIHN3aXRjaChodHRwcmVxKSB7CisgIGNhc2UgSFRUUFJFUV9QT1NUX01JTUU6CisgICAgaHR0cC0+c2VuZGl0ID0gJmRhdGEtPnNldC5taW1lcG9zdDsKKyAgICBicmVhazsKKyAgY2FzZSBIVFRQUkVRX1BPU1RfRk9STToKKyAgICAvKiBDb252ZXJ0IHRoZSBmb3JtIHN0cnVjdHVyZSBpbnRvIGEgbWltZSBzdHJ1Y3R1cmUuICovCisgICAgQ3VybF9taW1lX2NsZWFucGFydCgmaHR0cC0+Zm9ybSk7CisgICAgcmVzdWx0ID0gQ3VybF9nZXRmb3JtZGF0YShkYXRhLCAmaHR0cC0+Zm9ybSwgZGF0YS0+c2V0Lmh0dHBwb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+c3RhdGUuZnJlYWRfZnVuYyk7CisgICAgaWYocmVzdWx0KQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICBodHRwLT5zZW5kaXQgPSAmaHR0cC0+Zm9ybTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBodHRwLT5zZW5kaXQgPSBOVUxMOworICB9CisKKyAgaWYoaHR0cC0+c2VuZGl0KSB7CisgICAgY29uc3QgY2hhciAqY3RoZHIgPSBDdXJsX2NoZWNraGVhZGVycyhjb25uLCAiQ29udGVudC1UeXBlOiIpOworCisgICAgLyogUmVhZCBhbmQgc2VlayBib2R5IG9ubHkuICovCisgICAgaHR0cC0+c2VuZGl0LT5mbGFncyB8PSBNSU1FX0JPRFlfT05MWTsKKworICAgIC8qIFByZXBhcmUgdGhlIG1pbWUgc3RydWN0dXJlIGhlYWRlcnMgJiBzZXQgY29udGVudCB0eXBlLiAqLworCisgICAgaWYoY3RoZHIpCisgICAgICBmb3IoY3RoZHIgKz0gMTM7ICpjdGhkciA9PSAnICc7IGN0aGRyKyspCisgICAgICAgIDsKKyAgICBlbHNlIGlmKGh0dHAtPnNlbmRpdC0+a2luZCA9PSBNSU1FS0lORF9NVUxUSVBBUlQpCisgICAgICBjdGhkciA9ICJtdWx0aXBhcnQvZm9ybS1kYXRhIjsKKworICAgIGN1cmxfbWltZV9oZWFkZXJzKGh0dHAtPnNlbmRpdCwgZGF0YS0+c2V0LmhlYWRlcnMsIDApOworICAgIHJlc3VsdCA9IEN1cmxfbWltZV9wcmVwYXJlX2hlYWRlcnMoaHR0cC0+c2VuZGl0LCBjdGhkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE1JTUVTVFJBVEVHWV9GT1JNKTsKKyAgICBjdXJsX21pbWVfaGVhZGVycyhodHRwLT5zZW5kaXQsIE5VTEwsIDApOworICAgIGlmKCFyZXN1bHQpCisgICAgICByZXN1bHQgPSBDdXJsX21pbWVfcmV3aW5kKGh0dHAtPnNlbmRpdCk7CisgICAgaWYocmVzdWx0KQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICBodHRwLT5wb3N0c2l6ZSA9IEN1cmxfbWltZV9zaXplKGh0dHAtPnNlbmRpdCk7CisgIH0KKwogICBwdHIgPSBDdXJsX2NoZWNraGVhZGVycyhjb25uLCAiVHJhbnNmZXItRW5jb2Rpbmc6Iik7CiAgIGlmKHB0cikgewogICAgIC8qIFNvbWUga2luZCBvZiBURSBpcyByZXF1ZXN0ZWQsIGNoZWNrIGlmICdjaHVua2VkJyBpcyBjaG9zZW4gKi8KQEAgLTE5NDQsOSArMTk4MiwxMCBAQAogICAgICAgQ3VybF9jb21wYXJlaGVhZGVyKHB0ciwgIlRyYW5zZmVyLUVuY29kaW5nOiIsICJjaHVua2VkIik7CiAgIH0KICAgZWxzZSB7Ci0gICAgaWYoKGNvbm4tPmhhbmRsZXItPnByb3RvY29sJlBST1RPX0ZBTUlMWV9IVFRQKSAmJgotICAgICAgIGRhdGEtPnNldC51cGxvYWQgJiYKLSAgICAgICAoZGF0YS0+c3RhdGUuaW5maWxlc2l6ZSA9PSAtMSkpIHsKKyAgICBpZigoY29ubi0+aGFuZGxlci0+cHJvdG9jb2wgJiBQUk9UT19GQU1JTFlfSFRUUCkgJiYKKyAgICAgICAoKChodHRwcmVxID09IEhUVFBSRVFfUE9TVF9NSU1FIHx8IGh0dHByZXEgPT0gSFRUUFJFUV9QT1NUX0ZPUk0pICYmCisgICAgICAgaHR0cC0+cG9zdHNpemUgPCAwKSB8fAorICAgICAgIChkYXRhLT5zZXQudXBsb2FkICYmIGRhdGEtPnN0YXRlLmluZmlsZXNpemUgPT0gLTEpKSkgewogICAgICAgaWYoY29ubi0+Yml0cy5hdXRobmVnKQogICAgICAgICAvKiBkb24ndCBlbmFibGUgY2h1bmtlZCBkdXJpbmcgYXV0aCBuZWcgKi8KICAgICAgICAgOwpAQCAtMjA0NCw3ICsyMDgzLDcgQEAKICAgfQogCiAjaWZuZGVmIENVUkxfRElTQUJMRV9QUk9YWQotICBpZihjb25uLT5iaXRzLmh0dHBwcm94eSAmJiAhY29ubi0+Yml0cy50dW5uZWxfcHJveHkpICB7CisgIGlmKGNvbm4tPmJpdHMuaHR0cHByb3h5ICYmICFjb25uLT5iaXRzLnR1bm5lbF9wcm94eSkgewogICAgIC8qIFVzaW5nIGEgcHJveHkgYnV0IGRvZXMgbm90IHR1bm5lbCB0aHJvdWdoIGl0ICovCiAKICAgICAvKiBUaGUgcGF0aCBzZW50IHRvIHRoZSBwcm94eSBpcyBpbiBmYWN0IHRoZSBlbnRpcmUgVVJMLiBCdXQgaWYgdGhlIHJlbW90ZQpAQCAtMjExOCwyMSArMjE1Nyw5IEBACiAgIH0KICNlbmRpZiAvKiBDVVJMX0RJU0FCTEVfUFJPWFkgKi8KIAotICBpZihIVFRQUkVRX1BPU1RfRk9STSA9PSBodHRwcmVxKSB7Ci0gICAgLyogd2UgbXVzdCBidWlsZCB0aGUgd2hvbGUgcG9zdCBzZXF1ZW5jZSBmaXJzdCwgc28gdGhhdCB3ZSBoYXZlIGEgc2l6ZSBvZgotICAgICAgIHRoZSB3aG9sZSB0cmFuc2ZlciBiZWZvcmUgd2Ugc3RhcnQgdG8gc2VuZCBpdCAqLwotICAgIHJlc3VsdCA9IEN1cmxfZ2V0Zm9ybWRhdGEoZGF0YSwgJmh0dHAtPnNlbmRpdCwgZGF0YS0+c2V0Lmh0dHBwb3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VybF9jaGVja2hlYWRlcnMoY29ubiwgIkNvbnRlbnQtVHlwZToiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZodHRwLT5wb3N0c2l6ZSk7Ci0gICAgaWYocmVzdWx0KQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCiAgIGh0dHAtPnBfYWNjZXB0ID0gQ3VybF9jaGVja2hlYWRlcnMoY29ubiwgIkFjY2VwdDoiKT9OVUxMOiJBY2NlcHQ6ICovKlxyXG4iOwogCi0gIGlmKCggKEhUVFBSRVFfUE9TVCA9PSBodHRwcmVxKSB8fAotICAgICAgIChIVFRQUkVRX1BPU1RfRk9STSA9PSBodHRwcmVxKSB8fAotICAgICAgIChIVFRQUkVRX1BVVCA9PSBodHRwcmVxKSApICYmCisgIGlmKChIVFRQUkVRX1BPU1QgPT0gaHR0cHJlcSB8fCBIVFRQUkVRX1BVVCA9PSBodHRwcmVxKSAmJgogICAgICBkYXRhLT5zdGF0ZS5yZXN1bWVfZnJvbSkgewogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICogUmVzdW1pbmcgdXBsb2FkIGluIEhUVFAgbWVhbnMgdGhhdCB3ZSBQVVQgb3IgUE9TVCBhbmQgdGhhdCB3ZSBoYXZlCkBAIC0yMTQwLDYgKzIxNjcsNyBAQAogICAgICAqIGEgUmFuZ2U6IGhlYWRlciB0aGF0IHdpbGwgYmUgcGFzc2VkIGFsb25nLiBXZSBuZWVkIHRvICJmYXN0IGZvcndhcmQiCiAgICAgICogdGhlIGZpbGUgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyBhbmQgZGVjcmVhc2UgdGhlIGFzc3VtZSB1cGxvYWQKICAgICAgKiBmaWxlIHNpemUgYmVmb3JlIHdlIGNvbnRpbnVlIHRoaXMgdmVudHVyZSBpbiB0aGUgZGFyayBsYW5kcyBvZiBIVFRQLgorICAgICAqIFJlc3VtaW5nIG1pbWUvZm9ybSBwb3N0aW5nIGF0IGFuIG9mZnNldCA+IDAgaGFzIG5vIHNlbnNlIGFuZCBpcyBpZ25vcmVkLgogICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICAgICBpZihkYXRhLT5zdGF0ZS5yZXN1bWVfZnJvbSA8IDApIHsKQEAgLTIxNjEsNyArMjE4OSw3IEBACiAgICAgICB9CiAKICAgICAgIGlmKHNlZWtlcnIgIT0gQ1VSTF9TRUVLRlVOQ19PSykgewotICAgICAgICBjdXJsX29mZl90IHBhc3NlZD0wOworICAgICAgICBjdXJsX29mZl90IHBhc3NlZCA9IDA7CiAKICAgICAgICAgaWYoc2Vla2VyciAhPSBDVVJMX1NFRUtGVU5DX0NBTlRTRUVLKSB7CiAgICAgICAgICAgZmFpbGYoZGF0YSwgIkNvdWxkIG5vdCBzZWVrIHN0cmVhbSIpOwpAQCAtMjIxNCw3ICsyMjQyLDcgQEAKICAgICAgIGNvbm4tPmFsbG9jcHRyLnJhbmdlbGluZSA9IGFwcmludGYoIlJhbmdlOiBieXRlcz0lc1xyXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5zdGF0ZS5yYW5nZSk7CiAgICAgfQotICAgIGVsc2UgaWYoKGh0dHByZXEgIT0gSFRUUFJFUV9HRVQpICYmCisgICAgZWxzZSBpZigoaHR0cHJlcSA9PSBIVFRQUkVRX1BPU1QgfHwgaHR0cHJlcSA9PSBIVFRQUkVRX1BVVCkgJiYKICAgICAgICAgICAgICFDdXJsX2NoZWNraGVhZGVycyhjb25uLCAiQ29udGVudC1SYW5nZToiKSkgewogCiAgICAgICAvKiBpZiBhIGxpbmUgbGlrZSB0aGlzIHdhcyBhbHJlYWR5IGFsbG9jYXRlZCwgZnJlZSB0aGUgcHJldmlvdXMgb25lICovCkBAIC0yMjMyLDcgKzIyNjAsNyBAQAogICAgICAgfQogICAgICAgZWxzZSBpZihkYXRhLT5zdGF0ZS5yZXN1bWVfZnJvbSkgewogICAgICAgICAvKiBUaGlzIGlzIGJlY2F1c2UgInJlc3VtZSIgd2FzIHNlbGVjdGVkICovCi0gICAgICAgIGN1cmxfb2ZmX3QgdG90YWxfZXhwZWN0ZWRfc2l6ZT0KKyAgICAgICAgY3VybF9vZmZfdCB0b3RhbF9leHBlY3RlZF9zaXplID0KICAgICAgICAgICBkYXRhLT5zdGF0ZS5yZXN1bWVfZnJvbSArIGRhdGEtPnN0YXRlLmluZmlsZXNpemU7CiAgICAgICAgIGNvbm4tPmFsbG9jcHRyLnJhbmdlbGluZSA9CiAgICAgICAgICAgYXByaW50ZigiQ29udGVudC1SYW5nZTogYnl0ZXMgJXMlIiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UCkBAIC0yMjY2LDYgKzIyOTQsOSBAQAogICBpZihyZXN1bHQpCiAgICAgcmV0dXJuIHJlc3VsdDsKIAorICBpZihkYXRhLT5zZXQuc3RyW1NUUklOR19UQVJHRVRdKQorICAgIHBwYXRoID0gZGF0YS0+c2V0LnN0cltTVFJJTkdfVEFSR0VUXTsKKwogICAvKiB1cmwgKi8KICAgaWYocGFzdGVfZnRwX3VzZXJwd2QpCiAgICAgcmVzdWx0ID0gQ3VybF9hZGRfYnVmZmVyZihyZXFfYnVmZmVyLCAiZnRwOi8vJXM6JXNAJXMiLApAQCAtMjMzOSw4ICsyMzcwLDggQEAKIAogI2lmICFkZWZpbmVkKENVUkxfRElTQUJMRV9DT09LSUVTKQogICBpZihkYXRhLT5jb29raWVzIHx8IGFkZGNvb2tpZXMpIHsKLSAgICBzdHJ1Y3QgQ29va2llICpjbz1OVUxMOyAvKiBubyBjb29raWVzIGZyb20gc3RhcnQgKi8KLSAgICBpbnQgY291bnQ9MDsKKyAgICBzdHJ1Y3QgQ29va2llICpjbyA9IE5VTEw7IC8qIG5vIGNvb2tpZXMgZnJvbSBzdGFydCAqLworICAgIGludCBjb3VudCA9IDA7CiAKICAgICBpZihkYXRhLT5jb29raWVzKSB7CiAgICAgICBDdXJsX3NoYXJlX2xvY2soZGF0YSwgQ1VSTF9MT0NLX0RBVEFfQ09PS0lFLCBDVVJMX0xPQ0tfQUNDRVNTX1NJTkdMRSk7CkBAIC0yMzUzLDcgKzIzODQsNyBAQAogICAgICAgQ3VybF9zaGFyZV91bmxvY2soZGF0YSwgQ1VSTF9MT0NLX0RBVEFfQ09PS0lFKTsKICAgICB9CiAgICAgaWYoY28pIHsKLSAgICAgIHN0cnVjdCBDb29raWUgKnN0b3JlPWNvOworICAgICAgc3RydWN0IENvb2tpZSAqc3RvcmUgPSBjbzsKICAgICAgIC8qIG5vdyBsb29wIHRocm91Z2ggYWxsIGNvb2tpZXMgdGhhdCBtYXRjaGVkICovCiAgICAgICB3aGlsZShjbykgewogICAgICAgICBpZihjby0+dmFsdWUpIHsKQEAgLTI0MDcsMTA3ICsyNDM4LDYgQEAKIAogICBzd2l0Y2goaHR0cHJlcSkgewogCi0gIGNhc2UgSFRUUFJFUV9QT1NUX0ZPUk06Ci0gICAgaWYoIWh0dHAtPnNlbmRpdCB8fCBjb25uLT5iaXRzLmF1dGhuZWcpIHsKLSAgICAgIC8qIG5vdGhpbmcgdG8gcG9zdCEgKi8KLSAgICAgIHJlc3VsdCA9IEN1cmxfYWRkX2J1ZmZlcmYocmVxX2J1ZmZlciwgIkNvbnRlbnQtTGVuZ3RoOiAwXHJcblxyXG4iKTsKLSAgICAgIGlmKHJlc3VsdCkKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLQotICAgICAgcmVzdWx0ID0gQ3VybF9hZGRfYnVmZmVyX3NlbmQocmVxX2J1ZmZlciwgY29ubiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLT5pbmZvLnJlcXVlc3Rfc2l6ZSwgMCwgRklSU1RTT0NLRVQpOwotICAgICAgaWYocmVzdWx0KQotICAgICAgICBmYWlsZihkYXRhLCAiRmFpbGVkIHNlbmRpbmcgUE9TVCByZXF1ZXN0Iik7Ci0gICAgICBlbHNlCi0gICAgICAgIC8qIHNldHVwIHZhcmlhYmxlcyBmb3IgdGhlIHVwY29taW5nIHRyYW5zZmVyICovCi0gICAgICAgIEN1cmxfc2V0dXBfdHJhbnNmZXIoY29ubiwgRklSU1RTT0NLRVQsIC0xLCBUUlVFLCAmaHR0cC0+cmVhZGJ5dGVjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgTlVMTCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZihDdXJsX0Zvcm1Jbml0KCZodHRwLT5mb3JtLCBodHRwLT5zZW5kaXQpKSB7Ci0gICAgICBmYWlsZihkYXRhLCAiSW50ZXJuYWwgSFRUUCBQT1NUIGVycm9yISIpOwotICAgICAgcmV0dXJuIENVUkxFX0hUVFBfUE9TVF9FUlJPUjsKLSAgICB9Ci0KLSAgICAvKiBHZXQgdGhlIGN1cnJlbnRseSBzZXQgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlciBhbmQgc3RvcmUgdGhhdCBpbiB0aGUKLSAgICAgICBmb3JtIHN0cnVjdCBzaW5jZSB3ZSBtaWdodCB3YW50IHRoZSBhY3R1YWwgdXNlci1wcm92aWRlZCBjYWxsYmFjayBsYXRlcgotICAgICAgIG9uLiBUaGUgZGF0YS0+c2V0LmZyZWFkX2Z1bmMgcG9pbnRlciBpdHNlbGYgd2lsbCBiZSBjaGFuZ2VkIGZvciB0aGUKLSAgICAgICBtdWx0aXBhcnQgY2FzZSB0byB0aGUgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbXVsdGlwYXJ0IGZvcm1hdHRlZAotICAgICAgIHN0cmVhbS4gKi8KLSAgICBodHRwLT5mb3JtLmZyZWFkX2Z1bmMgPSBkYXRhLT5zdGF0ZS5mcmVhZF9mdW5jOwotCi0gICAgLyogU2V0IHRoZSByZWFkIGZ1bmN0aW9uIHRvIHJlYWQgZnJvbSB0aGUgZ2VuZXJhdGVkIGZvcm0gZGF0YSAqLwotICAgIGRhdGEtPnN0YXRlLmZyZWFkX2Z1bmMgPSAoY3VybF9yZWFkX2NhbGxiYWNrKUN1cmxfRm9ybVJlYWRlcjsKLSAgICBkYXRhLT5zdGF0ZS5pbiA9ICZodHRwLT5mb3JtOwotCi0gICAgaHR0cC0+c2VuZGluZyA9IEhUVFBTRU5EX0JPRFk7Ci0KLSAgICBpZighZGF0YS0+cmVxLnVwbG9hZF9jaHVua3kgJiYKLSAgICAgICAhQ3VybF9jaGVja2hlYWRlcnMoY29ubiwgIkNvbnRlbnQtTGVuZ3RoOiIpKSB7Ci0gICAgICAvKiBvbmx5IGFkZCBDb250ZW50LUxlbmd0aCBpZiBub3QgdXBsb2FkaW5nIGNodW5rZWQgKi8KLSAgICAgIHJlc3VsdCA9IEN1cmxfYWRkX2J1ZmZlcmYocmVxX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAlIiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcclxuIiwgaHR0cC0+cG9zdHNpemUpOwotICAgICAgaWYocmVzdWx0KQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHJlc3VsdCA9IGV4cGVjdDEwMChkYXRhLCBjb25uLCByZXFfYnVmZmVyKTsKLSAgICBpZihyZXN1bHQpCi0gICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgewotCi0gICAgICAvKiBHZXQgQ29udGVudC1UeXBlOiBsaW5lIGZyb20gQ3VybF9mb3JtcG9zdGhlYWRlci4KLSAgICAgICAqLwotICAgICAgY2hhciAqY29udGVudFR5cGU7Ci0gICAgICBzaXplX3QgbGluZWxlbmd0aD0wOwotICAgICAgY29udGVudFR5cGUgPSBDdXJsX2Zvcm1wb3N0aGVhZGVyKCh2b2lkICopJmh0dHAtPmZvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbmVsZW5ndGgpOwotICAgICAgaWYoIWNvbnRlbnRUeXBlKSB7Ci0gICAgICAgIGZhaWxmKGRhdGEsICJDb3VsZCBub3QgZ2V0IENvbnRlbnQtVHlwZSBoZWFkZXIgbGluZSEiKTsKLSAgICAgICAgcmV0dXJuIENVUkxFX0hUVFBfUE9TVF9FUlJPUjsKLSAgICAgIH0KLQotICAgICAgcmVzdWx0ID0gQ3VybF9hZGRfYnVmZmVyKHJlcV9idWZmZXIsIGNvbnRlbnRUeXBlLCBsaW5lbGVuZ3RoKTsKLSAgICAgIGlmKHJlc3VsdCkKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKiBtYWtlIHRoZSByZXF1ZXN0IGVuZCBpbiBhIHRydWUgQ1JMRiAqLwotICAgIHJlc3VsdCA9IEN1cmxfYWRkX2J1ZmZlcihyZXFfYnVmZmVyLCAiXHJcbiIsIDIpOwotICAgIGlmKHJlc3VsdCkKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICAvKiBzZXQgdXBsb2FkIHNpemUgdG8gdGhlIHByb2dyZXNzIG1ldGVyICovCi0gICAgQ3VybF9wZ3JzU2V0VXBsb2FkU2l6ZShkYXRhLCBodHRwLT5wb3N0c2l6ZSk7Ci0KLSAgICAvKiBmaXJlIGF3YXkgdGhlIHdob2xlIHJlcXVlc3QgdG8gdGhlIHNlcnZlciAqLwotICAgIHJlc3VsdCA9IEN1cmxfYWRkX2J1ZmZlcl9zZW5kKHJlcV9idWZmZXIsIGNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEtPmluZm8ucmVxdWVzdF9zaXplLCAwLCBGSVJTVFNPQ0tFVCk7Ci0gICAgaWYocmVzdWx0KQotICAgICAgZmFpbGYoZGF0YSwgIkZhaWxlZCBzZW5kaW5nIFBPU1QgcmVxdWVzdCIpOwotICAgIGVsc2UKLSAgICAgIC8qIHNldHVwIHZhcmlhYmxlcyBmb3IgdGhlIHVwY29taW5nIHRyYW5zZmVyICovCi0gICAgICBDdXJsX3NldHVwX3RyYW5zZmVyKGNvbm4sIEZJUlNUU09DS0VULCAtMSwgVFJVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmh0dHAtPnJlYWRieXRlY291bnQsIEZJUlNUU09DS0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAmaHR0cC0+d3JpdGVieXRlY291bnQpOwotCi0gICAgaWYocmVzdWx0KSB7Ci0gICAgICBDdXJsX2Zvcm1jbGVhbigmaHR0cC0+c2VuZGl0KTsgLyogZnJlZSB0aGF0IHdob2xlIGxvdCAqLwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKiBjb252ZXJ0IHRoZSBmb3JtIGRhdGEgKi8KLSAgICByZXN1bHQgPSBDdXJsX2NvbnZlcnRfZm9ybShkYXRhLCBodHRwLT5zZW5kaXQpOwotICAgIGlmKHJlc3VsdCkgewotICAgICAgQ3VybF9mb3JtY2xlYW4oJmh0dHAtPnNlbmRpdCk7IC8qIGZyZWUgdGhhdCB3aG9sZSBsb3QgKi8KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgYnJlYWs7Ci0KICAgY2FzZSBIVFRQUkVRX1BVVDogLyogTGV0J3MgUFVUIHRoZSBkYXRhIHRvIHRoZSBzZXJ2ZXIhICovCiAKICAgICBpZihjb25uLT5iaXRzLmF1dGhuZWcpCkBAIC0yNTUyLDYgKzI0ODIsOTggQEAKICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgYnJlYWs7CiAKKyAgY2FzZSBIVFRQUkVRX1BPU1RfRk9STToKKyAgY2FzZSBIVFRQUkVRX1BPU1RfTUlNRToKKyAgICAvKiBUaGlzIGlzIGZvcm0gcG9zdGluZyB1c2luZyBtaW1lIGRhdGEuICovCisgICAgaWYoY29ubi0+Yml0cy5hdXRobmVnKSB7CisgICAgICAvKiBub3RoaW5nIHRvIHBvc3QhICovCisgICAgICByZXN1bHQgPSBDdXJsX2FkZF9idWZmZXJmKHJlcV9idWZmZXIsICJDb250ZW50LUxlbmd0aDogMFxyXG5cclxuIik7CisgICAgICBpZihyZXN1bHQpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAgIHJlc3VsdCA9IEN1cmxfYWRkX2J1ZmZlcl9zZW5kKHJlcV9idWZmZXIsIGNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+aW5mby5yZXF1ZXN0X3NpemUsIDAsIEZJUlNUU09DS0VUKTsKKyAgICAgIGlmKHJlc3VsdCkKKyAgICAgICAgZmFpbGYoZGF0YSwgIkZhaWxlZCBzZW5kaW5nIFBPU1QgcmVxdWVzdCIpOworICAgICAgZWxzZQorICAgICAgICAvKiBzZXR1cCB2YXJpYWJsZXMgZm9yIHRoZSB1cGNvbWluZyB0cmFuc2ZlciAqLworICAgICAgICBDdXJsX3NldHVwX3RyYW5zZmVyKGNvbm4sIEZJUlNUU09DS0VULCAtMSwgVFJVRSwgJmh0dHAtPnJlYWRieXRlY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcG9zdHNpemUgPSBodHRwLT5wb3N0c2l6ZTsKKworICAgIC8qIFdlIG9ubHkgc2V0IENvbnRlbnQtTGVuZ3RoIGFuZCBhbGxvdyBhIGN1c3RvbSBDb250ZW50LUxlbmd0aCBpZgorICAgICAgIHdlIGRvbid0IHVwbG9hZCBkYXRhIGNodW5rZWQsIGFzIFJGQzI2MTYgZm9yYmlkcyB1cyB0byBzZXQgYm90aAorICAgICAgIGtpbmRzIG9mIGhlYWRlcnMgKFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIGFuZCBDb250ZW50LUxlbmd0aCkgKi8KKyAgICBpZihwb3N0c2l6ZSAhPSAtMSAmJiAhZGF0YS0+cmVxLnVwbG9hZF9jaHVua3kgJiYKKyAgICAgICAoY29ubi0+Yml0cy5hdXRobmVnIHx8ICFDdXJsX2NoZWNraGVhZGVycyhjb25uLCAiQ29udGVudC1MZW5ndGg6IikpKSB7CisgICAgICAvKiB3ZSBhbGxvdyByZXBsYWNpbmcgdGhpcyBoZWFkZXIgaWYgbm90IGR1cmluZyBhdXRoIG5lZ290aWF0aW9uLAorICAgICAgICAgYWx0aG91Z2ggaXQgaXNuJ3QgdmVyeSB3aXNlIHRvIGFjdHVhbGx5IHNldCB5b3VyIG93biAqLworICAgICAgcmVzdWx0ID0gQ3VybF9hZGRfYnVmZmVyZihyZXFfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29udGVudC1MZW5ndGg6ICUiIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxyXG4iLCBwb3N0c2l6ZSk7CisgICAgICBpZihyZXN1bHQpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyogT3V0cHV0IG1pbWUtZ2VuZXJhdGVkIGhlYWRlcnMuICovCisgICAgeworICAgICAgc3RydWN0IGN1cmxfc2xpc3QgKmhkcjsKKworICAgICAgZm9yKGhkciA9IGh0dHAtPnNlbmRpdC0+Y3VybGhlYWRlcnM7IGhkcjsgaGRyID0gaGRyLT5uZXh0KSB7CisgICAgICAgIHJlc3VsdCA9IEN1cmxfYWRkX2J1ZmZlcmYocmVxX2J1ZmZlciwgIiVzXHJcbiIsIGhkci0+ZGF0YSk7CisgICAgICAgIGlmKHJlc3VsdCkKKyAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgIH0KKworICAgIC8qIEZvciByZWFsbHkgc21hbGwgcG9zdHMgd2UgZG9uJ3QgdXNlIEV4cGVjdDogaGVhZGVycyBhdCBhbGwsIGFuZCBmb3IKKyAgICAgICB0aGUgc29tZXdoYXQgYmlnZ2VyIG9uZXMgd2UgYWxsb3cgdGhlIGFwcCB0byBkaXNhYmxlIGl0LiBKdXN0IG1ha2UKKyAgICAgICBzdXJlIHRoYXQgdGhlIGV4cGVjdDEwMGhlYWRlciBpcyBhbHdheXMgc2V0IHRvIHRoZSBwcmVmZXJyZWQgdmFsdWUKKyAgICAgICBoZXJlLiAqLworICAgIHB0ciA9IEN1cmxfY2hlY2toZWFkZXJzKGNvbm4sICJFeHBlY3Q6Iik7CisgICAgaWYocHRyKSB7CisgICAgICBkYXRhLT5zdGF0ZS5leHBlY3QxMDBoZWFkZXIgPQorICAgICAgICBDdXJsX2NvbXBhcmVoZWFkZXIocHRyLCAiRXhwZWN0OiIsICIxMDAtY29udGludWUiKTsKKyAgICB9CisgICAgZWxzZSBpZihwb3N0c2l6ZSA+IEVYUEVDVF8xMDBfVEhSRVNIT0xEIHx8IHBvc3RzaXplIDwgMCkgeworICAgICAgcmVzdWx0ID0gZXhwZWN0MTAwKGRhdGEsIGNvbm4sIHJlcV9idWZmZXIpOworICAgICAgaWYocmVzdWx0KQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBlbHNlCisgICAgICBkYXRhLT5zdGF0ZS5leHBlY3QxMDBoZWFkZXIgPSBGQUxTRTsKKworICAgIC8qIG1ha2UgdGhlIHJlcXVlc3QgZW5kIGluIGEgdHJ1ZSBDUkxGICovCisgICAgcmVzdWx0ID0gQ3VybF9hZGRfYnVmZmVyKHJlcV9idWZmZXIsICJcclxuIiwgMik7CisgICAgaWYocmVzdWx0KQorICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIC8qIHNldCB0aGUgdXBsb2FkIHNpemUgdG8gdGhlIHByb2dyZXNzIG1ldGVyICovCisgICAgQ3VybF9wZ3JzU2V0VXBsb2FkU2l6ZShkYXRhLCBwb3N0c2l6ZSk7CisKKyAgICAvKiBSZWFkIGZyb20gbWltZSBzdHJ1Y3R1cmUuICovCisgICAgZGF0YS0+c3RhdGUuZnJlYWRfZnVuYyA9IChjdXJsX3JlYWRfY2FsbGJhY2spIEN1cmxfbWltZV9yZWFkOworICAgIGRhdGEtPnN0YXRlLmluID0gKHZvaWQgKikgaHR0cC0+c2VuZGl0OworICAgIGh0dHAtPnNlbmRpbmcgPSBIVFRQU0VORF9CT0RZOworCisgICAgLyogdGhpcyBzZW5kcyB0aGUgYnVmZmVyIGFuZCBmcmVlcyBhbGwgdGhlIGJ1ZmZlciByZXNvdXJjZXMgKi8KKyAgICByZXN1bHQgPSBDdXJsX2FkZF9idWZmZXJfc2VuZChyZXFfYnVmZmVyLCBjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLT5pbmZvLnJlcXVlc3Rfc2l6ZSwgMCwgRklSU1RTT0NLRVQpOworICAgIGlmKHJlc3VsdCkKKyAgICAgIGZhaWxmKGRhdGEsICJGYWlsZWQgc2VuZGluZyBQT1NUIHJlcXVlc3QiKTsKKyAgICBlbHNlCisgICAgICAvKiBwcmVwYXJlIGZvciB0cmFuc2ZlciAqLworICAgICAgQ3VybF9zZXR1cF90cmFuc2Zlcihjb25uLCBGSVJTVFNPQ0tFVCwgLTEsIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZodHRwLT5yZWFkYnl0ZWNvdW50LCBwb3N0c2l6ZT9GSVJTVFNPQ0tFVDotMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdHNpemU/Jmh0dHAtPndyaXRlYnl0ZWNvdW50Ok5VTEwpOworICAgIGlmKHJlc3VsdCkKKyAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICBicmVhazsKKwogICBjYXNlIEhUVFBSRVFfUE9TVDoKICAgICAvKiB0aGlzIGlzIHRoZSBzaW1wbGUgUE9TVCwgdXNpbmcgeC13d3ctZm9ybS11cmxlbmNvZGVkIHN0eWxlICovCiAKQEAgLTI1OTIsNyArMjYxNCw3IEBACiAgICAgICBkYXRhLT5zdGF0ZS5leHBlY3QxMDBoZWFkZXIgPQogICAgICAgICBDdXJsX2NvbXBhcmVoZWFkZXIocHRyLCAiRXhwZWN0OiIsICIxMDAtY29udGludWUiKTsKICAgICB9Ci0gICAgZWxzZSBpZihwb3N0c2l6ZSA+IFRJTllfSU5JVElBTF9QT1NUX1NJWkUgfHwgcG9zdHNpemUgPCAwKSB7CisgICAgZWxzZSBpZihwb3N0c2l6ZSA+IEVYUEVDVF8xMDBfVEhSRVNIT0xEIHx8IHBvc3RzaXplIDwgMCkgewogICAgICAgcmVzdWx0ID0gZXhwZWN0MTAwKGRhdGEsIGNvbm4sIHJlcV9idWZmZXIpOwogICAgICAgaWYocmVzdWx0KQogICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMjYwNiw3ICsyNjI4LDcgQEAKICAgICAgICAgIGl0cyBzaXplLiAqLwogICAgICAgaWYoY29ubi0+aHR0cHZlcnNpb24gIT0gMjAgJiYKICAgICAgICAgICFkYXRhLT5zdGF0ZS5leHBlY3QxMDBoZWFkZXIgJiYKLSAgICAgICAgIChwb3N0c2l6ZSA8IE1BWF9JTklUSUFMX1BPU1RfU0laRSkpICB7CisgICAgICAgICAocG9zdHNpemUgPCBNQVhfSU5JVElBTF9QT1NUX1NJWkUpKSB7CiAgICAgICAgIC8qIGlmIHdlIGRvbid0IHVzZSBleHBlY3Q6IDEwMCAgQU5ECiAgICAgICAgICAgIHBvc3RzaXplIGlzIGxlc3MgdGhhbiBNQVhfSU5JVElBTF9QT1NUX1NJWkUKIApAQCAtMjc3MSw3ICsyNzkzLDcgQEAKICAgICBmYWlsZihkYXRhLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgY29udmVyc2lvbiEiKTsKICAgICByZXR1cm4gRkFMU0U7IC8qIGNhbid0IHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZIHNvIHJldHVybiBGQUxTRSAqLwogICB9Ci0gIGlmKENVUkxFX09LICE9IEN1cmxfY29udmVydF9mcm9tX25ldHdvcmsoZGF0YSwgc2NyYXRjaCwgc3RybGVuKHMpKzEpKSB7CisgIGlmKENVUkxFX09LICE9IEN1cmxfY29udmVydF9mcm9tX25ldHdvcmsoZGF0YSwgc2NyYXRjaCwgc3RybGVuKHMpICsgMSkpIHsKICAgICAvKiBDdXJsX2NvbnZlcnRfZnJvbV9uZXR3b3JrIGNhbGxzIGZhaWxmIGlmIHVuc3VjY2Vzc2Z1bCAqLwogICAgIGZyZWUoc2NyYXRjaCk7CiAgICAgcmV0dXJuIEZBTFNFOyAvKiBjYW4ndCByZXR1cm4gQ1VSTEVfZm9vYmFyIHNvIHJldHVybiBGQUxTRSAqLwpAQCAtMjgwMSw2ICsyODIzLDcgQEAKIGNoZWNrcnRzcHByZWZpeChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMpCiB7CisgIGJvb2wgcmVzdWx0ID0gRkFMU0U7CiAKICNpZmRlZiBDVVJMX0RPRVNfQ09OVkVSU0lPTlMKICAgLyogY29udmVydCBmcm9tIHRoZSBuZXR3b3JrIGVuY29kaW5nIHVzaW5nIGEgc2NyYXRjaCBhcmVhICovCkBAIC0yODA5LDE4ICsyODMyLDE5IEBACiAgICAgZmFpbGYoZGF0YSwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbnZlcnNpb24hIik7CiAgICAgcmV0dXJuIEZBTFNFOyAvKiBjYW4ndCByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWSBzbyByZXR1cm4gRkFMU0UgKi8KICAgfQotICBpZihDVVJMRV9PSyAhPSBDdXJsX2NvbnZlcnRfZnJvbV9uZXR3b3JrKGRhdGEsIHNjcmF0Y2gsIHN0cmxlbihzKSsxKSkgeworICBpZihDVVJMRV9PSyAhPSBDdXJsX2NvbnZlcnRfZnJvbV9uZXR3b3JrKGRhdGEsIHNjcmF0Y2gsIHN0cmxlbihzKSArIDEpKSB7CiAgICAgLyogQ3VybF9jb252ZXJ0X2Zyb21fbmV0d29yayBjYWxscyBmYWlsZiBpZiB1bnN1Y2Nlc3NmdWwgKi8KLSAgICBmcmVlKHNjcmF0Y2gpOwotICAgIHJldHVybiBGQUxTRTsgLyogY2FuJ3QgcmV0dXJuIENVUkxFX2Zvb2JhciBzbyByZXR1cm4gRkFMU0UgKi8KKyAgICByZXN1bHQgPSBGQUxTRTsgLyogY2FuJ3QgcmV0dXJuIENVUkxFX2Zvb2JhciBzbyByZXR1cm4gRkFMU0UgKi8KICAgfQotICBzID0gc2NyYXRjaDsKKyAgZWxzZQorICAgIHJlc3VsdCA9IGNoZWNrcHJlZml4KCJSVFNQLyIsIHNjcmF0Y2gpPyBUUlVFOiBGQUxTRTsKKyAgZnJlZShzY3JhdGNoKTsKICNlbHNlCiAgICh2b2lkKWRhdGE7IC8qIHVudXNlZCAqLworICByZXN1bHQgPSBjaGVja3ByZWZpeCgiUlRTUC8iLCBzKT8gVFJVRTogRkFMU0U7CiAjZW5kaWYgLyogQ1VSTF9ET0VTX0NPTlZFUlNJT05TICovCi0gIGlmKGNoZWNrcHJlZml4KCJSVFNQLyIsIHMpKQotICAgIHJldHVybiBUUlVFOwotICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIHJlc3VsdDsKIH0KICNlbmRpZiAvKiBDVVJMX0RJU0FCTEVfUlRTUCAqLwogCkBAIC0yODYyLDE0ICsyODg2LDE0IEBACiAgICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKICAgICB9CiAKLSAgICBuZXdzaXplPUNVUkxNQVgoKGstPmhidWZsZW4rIGxlbmd0aCkqMy8yLCBkYXRhLT5zdGF0ZS5oZWFkZXJzaXplKjIpOworICAgIG5ld3NpemUgPSBDVVJMTUFYKChrLT5oYnVmbGVuICsgbGVuZ3RoKSAqIDMgLyAyLCBkYXRhLT5zdGF0ZS5oZWFkZXJzaXplKjIpOwogICAgIGhidWZwX2luZGV4ID0gay0+aGJ1ZnAgLSBkYXRhLT5zdGF0ZS5oZWFkZXJidWZmOwogICAgIG5ld2J1ZmYgPSByZWFsbG9jKGRhdGEtPnN0YXRlLmhlYWRlcmJ1ZmYsIG5ld3NpemUpOwogICAgIGlmKCFuZXdidWZmKSB7CiAgICAgICBmYWlsZihkYXRhLCAiRmFpbGVkIHRvIGFsbG9jIG1lbW9yeSBmb3IgYmlnIGhlYWRlciEiKTsKICAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogICAgIH0KLSAgICBkYXRhLT5zdGF0ZS5oZWFkZXJzaXplPW5ld3NpemU7CisgICAgZGF0YS0+c3RhdGUuaGVhZGVyc2l6ZSA9IG5ld3NpemU7CiAgICAgZGF0YS0+c3RhdGUuaGVhZGVyYnVmZiA9IG5ld2J1ZmY7CiAgICAgay0+aGJ1ZnAgPSBkYXRhLT5zdGF0ZS5oZWFkZXJidWZmICsgaGJ1ZnBfaW5kZXg7CiAgIH0KQEAgLTI5NjIsNyArMjk4Niw3IEBACiAgICAgfQogCiAgICAgLyogZGVjcmVhc2UgdGhlIHNpemUgb2YgdGhlIHJlbWFpbmluZyAoc3VwcG9zZWQpIGhlYWRlciBsaW5lICovCi0gICAgcmVzdF9sZW5ndGggPSAoay0+ZW5kX3B0ciAtIGstPnN0cikrMTsKKyAgICByZXN0X2xlbmd0aCA9IChrLT5lbmRfcHRyIC0gay0+c3RyKSArIDE7CiAgICAgKm5yZWFkIC09IChzc2l6ZV90KXJlc3RfbGVuZ3RoOwogCiAgICAgay0+c3RyID0gay0+ZW5kX3B0ciArIDE7IC8qIG1vdmUgcGFzdCBuZXcgbGluZSAqLwpAQCAtMzE2MSw2ICszMTg1LDcgQEAKICAgICAgICAgICBjYXNlIEhUVFBSRVFfUFVUOgogICAgICAgICAgIGNhc2UgSFRUUFJFUV9QT1NUOgogICAgICAgICAgIGNhc2UgSFRUUFJFUV9QT1NUX0ZPUk06CisgICAgICAgICAgY2FzZSBIVFRQUkVRX1BPU1RfTUlNRToKICAgICAgICAgICAgIC8qIFdlIGdvdCBhbiBlcnJvciByZXNwb25zZS4gSWYgdGhpcyBoYXBwZW5lZCBiZWZvcmUgdGhlIHdob2xlCiAgICAgICAgICAgICAgKiByZXF1ZXN0IGJvZHkgaGFzIGJlZW4gc2VudCB3ZSBzdG9wIHNlbmRpbmcgYW5kIG1hcmsgdGhlCiAgICAgICAgICAgICAgKiBjb25uZWN0aW9uIGZvciBjbG9zdXJlIGFmdGVyIHdlJ3ZlIHJlYWQgdGhlIGVudGlyZSByZXNwb25zZS4KQEAgLTMyODgsNyArMzMxMyw3IEBACiAjZGVmaW5lIEhFQURFUjEgc2NyYXRjaAogI2RlZmluZSBTQ1JBVENIU0laRSAyMQogICAgICAgQ1VSTGNvZGUgcmVzOwotICAgICAgY2hhciBzY3JhdGNoW1NDUkFUQ0hTSVpFKzFdOyAvKiAiSFRUUC9tYWpvci5taW5vciAxMjMiICovCisgICAgICBjaGFyIHNjcmF0Y2hbU0NSQVRDSFNJWkUgKyAxXTsgLyogIkhUVFAvbWFqb3IubWlub3IgMTIzIiAqLwogICAgICAgLyogV2UgY2FuJ3QgcmVhbGx5IGNvbnZlcnQgdGhpcyB5ZXQgYmVjYXVzZSB3ZQogICAgICAgICAgZG9uJ3Qga25vdyBpZiBpdCdzIHRoZSAxc3QgaGVhZGVyIGxpbmUgb3IgdGhlIGJvZHkuCiAgICAgICAgICBTbyB3ZSBkbyBhIHBhcnRpYWwgY29udmVyc2lvbiBpbnRvIGEgc2NyYXRjaCBhcmVhLApAQCAtMzMxNCwxOSArMzMzOSwyMiBAQAogICAgICAgICAgKiBzYXlzLiBXZSB0cnkgdG8gYWxsb3cgYW55IG51bWJlciBoZXJlLCBidXQgd2UgY2Fubm90IG1ha2UKICAgICAgICAgICogZ3VhcmFudGVlcyBvbiBmdXR1cmUgYmVoYXZpb3JzIHNpbmNlIGl0IGlzbid0IHdpdGhpbiB0aGUgcHJvdG9jb2wuCiAgICAgICAgICAqLworICAgICAgICBjaGFyIHNlcGFyYXRvcjsKICAgICAgICAgbmMgPSBzc2NhbmYoSEVBREVSMSwKLSAgICAgICAgICAgICAgICAgICAgIiBIVFRQLyVkLiVkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIiBIVFRQLyUxZC4lMWQlYyUzZCIsCiAgICAgICAgICAgICAgICAgICAgICZodHRwdmVyc2lvbl9tYWpvciwKICAgICAgICAgICAgICAgICAgICAgJmNvbm4tPmh0dHB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAmc2VwYXJhdG9yLAogICAgICAgICAgICAgICAgICAgICAmay0+aHR0cGNvZGUpOwogCiAgICAgICAgIGlmKG5jID09IDEgJiYgaHR0cHZlcnNpb25fbWFqb3IgPT0gMiAmJgogICAgICAgICAgICAxID09IHNzY2FuZihIRUFERVIxLCAiIEhUVFAvMiAlZCIsICZrLT5odHRwY29kZSkpIHsKICAgICAgICAgICBjb25uLT5odHRwdmVyc2lvbiA9IDA7Ci0gICAgICAgICAgbmMgPSAzOworICAgICAgICAgIG5jID0gNDsKKyAgICAgICAgICBzZXBhcmF0b3IgPSAnICc7CiAgICAgICAgIH0KIAotICAgICAgICBpZihuYz09MykgeworICAgICAgICBpZigobmMgPT0gNCkgJiYgKCcgJyA9PSBzZXBhcmF0b3IpKSB7CiAgICAgICAgICAgY29ubi0+aHR0cHZlcnNpb24gKz0gMTAgKiBodHRwdmVyc2lvbl9tYWpvcjsKIAogICAgICAgICAgIGlmKGstPnVwZ3IxMDEgPT0gVVBHUjEwMV9SRUNFSVZFRCkgewpAQCAtMzMzNSwxMSArMzM2MywxMSBAQAogICAgICAgICAgICAgICBpbmZvZihkYXRhLCAiTHlpbmcgc2VydmVyLCBub3Qgc2VydmluZyBIVFRQLzJcbiIpOwogICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBlbHNlIHsKKyAgICAgICAgZWxzZSBpZighbmMpIHsKICAgICAgICAgICAvKiB0aGlzIGlzIHRoZSByZWFsIHdvcmxkLCBub3QgYSBOaXJ2YW5hCiAgICAgICAgICAgICAgTkNTQSAxLjUueCByZXR1cm5zIHRoaXMgY3JhcCB3aGVuIGFza2VkIGZvciBIVFRQLzEuMQogICAgICAgICAgICovCi0gICAgICAgICAgbmM9c3NjYW5mKEhFQURFUjEsICIgSFRUUCAlM2QiLCAmay0+aHR0cGNvZGUpOworICAgICAgICAgIG5jID0gc3NjYW5mKEhFQURFUjEsICIgSFRUUCAlM2QiLCAmay0+aHR0cGNvZGUpOwogICAgICAgICAgIGNvbm4tPmh0dHB2ZXJzaW9uID0gMTA7CiAKICAgICAgICAgICAvKiBJZiB1c2VyIGhhcyBzZXQgb3B0aW9uIEhUVFAyMDBBTElBU0VTLApAQCAtMzM1Myw2ICszMzgxLDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGZhaWxmKGRhdGEsICJVbnN1cHBvcnRlZCBIVFRQIHZlcnNpb24gaW4gcmVzcG9uc2VcbiIpOworICAgICAgICAgIHJldHVybiBDVVJMRV9VTlNVUFBPUlRFRF9QUk9UT0NPTDsKKyAgICAgICAgfQogICAgICAgfQogICAgICAgZWxzZSBpZihjb25uLT5oYW5kbGVyLT5wcm90b2NvbCAmIENVUkxQUk9UT19SVFNQKSB7CiAgICAgICAgIG5jID0gc3NjYW5mKEhFQURFUjEsCkBAIC0zMzYwLDcgKzMzOTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAmcnRzcHZlcnNpb25fbWFqb3IsCiAgICAgICAgICAgICAgICAgICAgICZjb25uLT5ydHNwdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgJmstPmh0dHBjb2RlKTsKLSAgICAgICAgaWYobmM9PTMpIHsKKyAgICAgICAgaWYobmMgPT0gMykgewogICAgICAgICAgIGNvbm4tPnJ0c3B2ZXJzaW9uICs9IDEwICogcnRzcHZlcnNpb25fbWFqb3I7CiAgICAgICAgICAgY29ubi0+aHR0cHZlcnNpb24gPSAxMTsgLyogRm9yIHVzLCBSVFNQIGFjdHMgbGlrZSBIVFRQIDEuMSAqLwogICAgICAgICB9CkBAIC0zMzkyLDcgKzM0MjQsNyBAQAogICAgICAgICAgICAoKGstPmh0dHBjb2RlICE9IDQwNykgfHwgIWNvbm4tPmJpdHMucHJveHlfdXNlcl9wYXNzd2QpICkgewogCiAgICAgICAgICAgaWYoZGF0YS0+c3RhdGUucmVzdW1lX2Zyb20gJiYKLSAgICAgICAgICAgICAoZGF0YS0+c2V0Lmh0dHByZXE9PUhUVFBSRVFfR0VUKSAmJgorICAgICAgICAgICAgIChkYXRhLT5zZXQuaHR0cHJlcSA9PSBIVFRQUkVRX0dFVCkgJiYKICAgICAgICAgICAgICAoay0+aHR0cGNvZGUgPT0gNDE2KSkgewogICAgICAgICAgICAgLyogIlJlcXVlc3RlZCBSYW5nZSBOb3QgU2F0aXNmaWFibGUiLCBqdXN0IHByb2NlZWQgYW5kCiAgICAgICAgICAgICAgICBwcmV0ZW5kIHRoaXMgaXMgbm8gZXJyb3IgKi8KQEAgLTM0NDgsOCArMzQ4MCw4IEBACiAgICAgICAgICAgICogZmllbGRzLiAgKi8KICAgICAgICAgICBpZihkYXRhLT5zZXQudGltZWNvbmRpdGlvbikKICAgICAgICAgICAgIGRhdGEtPmluZm8udGltZWNvbmQgPSBUUlVFOwotICAgICAgICAgIGstPnNpemU9MDsKLSAgICAgICAgICBrLT5tYXhkb3dubG9hZD0wOworICAgICAgICAgIGstPnNpemUgPSAwOworICAgICAgICAgIGstPm1heGRvd25sb2FkID0gMDsKICAgICAgICAgICBrLT5pZ25vcmVjbCA9IFRSVUU7IC8qIGlnbm9yZSBDb250ZW50LUxlbmd0aCBoZWFkZXJzICovCiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC0zNDcxLDI4ICszNTAzLDMyIEBACiAgICAgLyogQ2hlY2sgZm9yIENvbnRlbnQtTGVuZ3RoOiBoZWFkZXIgbGluZXMgdG8gZ2V0IHNpemUgKi8KICAgICBpZighay0+aWdub3JlY2wgJiYgIWRhdGEtPnNldC5pZ25vcmVjbCAmJgogICAgICAgIGNoZWNrcHJlZml4KCJDb250ZW50LUxlbmd0aDoiLCBrLT5wKSkgewotICAgICAgY3VybF9vZmZfdCBjb250ZW50bGVuZ3RoID0gY3VybHhfc3RydG9vZmZ0KGstPnArMTUsIE5VTEwsIDEwKTsKLSAgICAgIGlmKGRhdGEtPnNldC5tYXhfZmlsZXNpemUgJiYKLSAgICAgICAgIGNvbnRlbnRsZW5ndGggPiBkYXRhLT5zZXQubWF4X2ZpbGVzaXplKSB7Ci0gICAgICAgIGZhaWxmKGRhdGEsICJNYXhpbXVtIGZpbGUgc2l6ZSBleGNlZWRlZCIpOwotICAgICAgICByZXR1cm4gQ1VSTEVfRklMRVNJWkVfRVhDRUVERUQ7CisgICAgICBjdXJsX29mZl90IGNvbnRlbnRsZW5ndGg7CisgICAgICBpZighY3VybHhfc3RydG9vZmZ0KGstPnAgKyAxNSwgTlVMTCwgMTAsICZjb250ZW50bGVuZ3RoKSkgeworICAgICAgICBpZihkYXRhLT5zZXQubWF4X2ZpbGVzaXplICYmCisgICAgICAgICAgIGNvbnRlbnRsZW5ndGggPiBkYXRhLT5zZXQubWF4X2ZpbGVzaXplKSB7CisgICAgICAgICAgZmFpbGYoZGF0YSwgIk1heGltdW0gZmlsZSBzaXplIGV4Y2VlZGVkIik7CisgICAgICAgICAgcmV0dXJuIENVUkxFX0ZJTEVTSVpFX0VYQ0VFREVEOworICAgICAgICB9CisgICAgICAgIGlmKGNvbnRlbnRsZW5ndGggPj0gMCkgeworICAgICAgICAgIGstPnNpemUgPSBjb250ZW50bGVuZ3RoOworICAgICAgICAgIGstPm1heGRvd25sb2FkID0gay0+c2l6ZTsKKyAgICAgICAgICAvKiB3ZSBzZXQgdGhlIHByb2dyZXNzIGRvd25sb2FkIHNpemUgYWxyZWFkeSBhdCB0aGlzIHBvaW50CisgICAgICAgICAgICAganVzdCB0byBtYWtlIGl0IGVhc2llciBmb3IgYXBwcy9jYWxsYmFja3MgdG8gZXh0cmFjdCB0aGlzCisgICAgICAgICAgICAgaW5mbyBhcyBzb29uIGFzIHBvc3NpYmxlICovCisgICAgICAgICAgQ3VybF9wZ3JzU2V0RG93bmxvYWRTaXplKGRhdGEsIGstPnNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8qIE5lZ2F0aXZlIENvbnRlbnQtTGVuZ3RoIGlzIHJlYWxseSBvZGQsIGFuZCB3ZSBrbm93IGl0CisgICAgICAgICAgICAgaGFwcGVucyBmb3IgZXhhbXBsZSB3aGVuIG9sZGVyIEFwYWNoZSBzZXJ2ZXJzIHNlbmQgbGFyZ2UKKyAgICAgICAgICAgICBmaWxlcyAqLworICAgICAgICAgIHN0cmVhbWNsb3NlKGNvbm4sICJuZWdhdGl2ZSBjb250ZW50LWxlbmd0aCIpOworICAgICAgICAgIGluZm9mKGRhdGEsICJOZWdhdGl2ZSBjb250ZW50LWxlbmd0aDogJSIgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVAorICAgICAgICAgICAgICAgICIsIGNsb3NpbmcgYWZ0ZXIgdHJhbnNmZXJcbiIsIGNvbnRlbnRsZW5ndGgpOworICAgICAgICB9CiAgICAgICB9Ci0gICAgICBpZihjb250ZW50bGVuZ3RoID49IDApIHsKLSAgICAgICAgay0+c2l6ZSA9IGNvbnRlbnRsZW5ndGg7Ci0gICAgICAgIGstPm1heGRvd25sb2FkID0gay0+c2l6ZTsKLSAgICAgICAgLyogd2Ugc2V0IHRoZSBwcm9ncmVzcyBkb3dubG9hZCBzaXplIGFscmVhZHkgYXQgdGhpcyBwb2ludAotICAgICAgICAgICBqdXN0IHRvIG1ha2UgaXQgZWFzaWVyIGZvciBhcHBzL2NhbGxiYWNrcyB0byBleHRyYWN0IHRoaXMKLSAgICAgICAgICAgaW5mbyBhcyBzb29uIGFzIHBvc3NpYmxlICovCi0gICAgICAgIEN1cmxfcGdyc1NldERvd25sb2FkU2l6ZShkYXRhLCBrLT5zaXplKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAvKiBOZWdhdGl2ZSBDb250ZW50LUxlbmd0aCBpcyByZWFsbHkgb2RkLCBhbmQgd2Uga25vdyBpdAotICAgICAgICAgICBoYXBwZW5zIGZvciBleGFtcGxlIHdoZW4gb2xkZXIgQXBhY2hlIHNlcnZlcnMgc2VuZCBsYXJnZQotICAgICAgICAgICBmaWxlcyAqLwotICAgICAgICBzdHJlYW1jbG9zZShjb25uLCAibmVnYXRpdmUgY29udGVudC1sZW5ndGgiKTsKLSAgICAgICAgaW5mb2YoZGF0YSwgIk5lZ2F0aXZlIGNvbnRlbnQtbGVuZ3RoOiAlIiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UCi0gICAgICAgICAgICAgICIsIGNsb3NpbmcgYWZ0ZXIgdHJhbnNmZXJcbiIsIGNvbnRlbnRsZW5ndGgpOwotICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBpbmZvZihkYXRhLCAiSWxsZWdhbCBDb250ZW50LUxlbmd0aDogaGVhZGVyXG4iKTsKICAgICB9CiAgICAgLyogY2hlY2sgZm9yIENvbnRlbnQtVHlwZTogaGVhZGVyIGxpbmVzIHRvIGdldCB0aGUgTUlNRS10eXBlICovCiAgICAgZWxzZSBpZihjaGVja3ByZWZpeCgiQ29udGVudC1UeXBlOiIsIGstPnApKSB7CkBAIC0zNjY3LDExICszNzAzLDExIEBACiAKICAgICAgIC8qIGlmIGl0IHRydWx5IHN0b3BwZWQgb24gYSBkaWdpdCAqLwogICAgICAgaWYoSVNESUdJVCgqcHRyKSkgewotICAgICAgICBrLT5vZmZzZXQgPSBjdXJseF9zdHJ0b29mZnQocHRyLCBOVUxMLCAxMCk7Ci0KLSAgICAgICAgaWYoZGF0YS0+c3RhdGUucmVzdW1lX2Zyb20gPT0gay0+b2Zmc2V0KQotICAgICAgICAgIC8qIHdlIGFza2VkIGZvciBhIHJlc3VtZSBhbmQgd2UgZ290IGl0ICovCi0gICAgICAgICAgay0+Y29udGVudF9yYW5nZSA9IFRSVUU7CisgICAgICAgIGlmKCFjdXJseF9zdHJ0b29mZnQocHRyLCBOVUxMLCAxMCwgJmstPm9mZnNldCkpIHsKKyAgICAgICAgICBpZihkYXRhLT5zdGF0ZS5yZXN1bWVfZnJvbSA9PSBrLT5vZmZzZXQpCisgICAgICAgICAgICAvKiB3ZSBhc2tlZCBmb3IgYSByZXN1bWUgYW5kIHdlIGdvdCBpdCAqLworICAgICAgICAgICAgay0+Y29udGVudF9yYW5nZSA9IFRSVUU7CisgICAgICAgIH0KICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgICAgZGF0YS0+c3RhdGUucmVzdW1lX2Zyb20gPSAwOyAvKiBnZXQgZXZlcnl0aGluZyAqLwpAQCAtMzY4Miw3ICszNzE4LDcgQEAKICAgICAgIEN1cmxfc2hhcmVfbG9jayhkYXRhLCBDVVJMX0xPQ0tfREFUQV9DT09LSUUsCiAgICAgICAgICAgICAgICAgICAgICAgQ1VSTF9MT0NLX0FDQ0VTU19TSU5HTEUpOwogICAgICAgQ3VybF9jb29raWVfYWRkKGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgZGF0YS0+Y29va2llcywgVFJVRSwgay0+cCsxMSwKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5jb29raWVzLCBUUlVFLCBrLT5wICsgMTEsCiAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlcmUgaXMgYSBjdXN0b20tc2V0IEhvc3Q6IG5hbWUsIHVzZSBpdAogICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUsIG9yIGVsc2UgdXNlIHJlYWwgcGVlciBob3N0IG5hbWUuICovCiAgICAgICAgICAgICAgICAgICAgICAgY29ubi0+YWxsb2NwdHIuY29va2llaG9zdD8KQEAgLTM2OTMsOCArMzcyOSw4IEBACiAjZW5kaWYKICAgICBlbHNlIGlmKGNoZWNrcHJlZml4KCJMYXN0LU1vZGlmaWVkOiIsIGstPnApICYmCiAgICAgICAgICAgICAoZGF0YS0+c2V0LnRpbWVjb25kaXRpb24gfHwgZGF0YS0+c2V0LmdldF9maWxldGltZSkgKSB7Ci0gICAgICB0aW1lX3Qgc2Vjcz10aW1lKE5VTEwpOwotICAgICAgay0+dGltZW9mZG9jID0gY3VybF9nZXRkYXRlKGstPnArc3RybGVuKCJMYXN0LU1vZGlmaWVkOiIpLAorICAgICAgdGltZV90IHNlY3MgPSB0aW1lKE5VTEwpOworICAgICAgay0+dGltZW9mZG9jID0gY3VybF9nZXRkYXRlKGstPnAgKyBzdHJsZW4oIkxhc3QtTW9kaWZpZWQ6IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlY3MpOwogICAgICAgaWYoZGF0YS0+c2V0LmdldF9maWxldGltZSkKICAgICAgICAgZGF0YS0+aW5mby5maWxldGltZSA9IChsb25nKWstPnRpbWVvZmRvYzsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2h0dHAuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2h0dHAuaAppbmRleCA3Y2U0YmQ5Li5kMjc4MWJjIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cC5oCkBAIC03LDcgKzcsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTUsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC00MCw4ICs0MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoZWFkZXIsICAgLyogaGVhZGVyIGtleXdvcmQgX3dpdGhfIGNvbG9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb250ZW50KTsgLyogY29udGVudCBzdHJpbmcgdG8gZmluZCAqLwogCi1jaGFyICpDdXJsX2NoZWNraGVhZGVycyhjb25zdCBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0aGlzaGVhZGVyKTsKIGNoYXIgKkN1cmxfY29weV9oZWFkZXJfdmFsdWUoY29uc3QgY2hhciAqaGVhZGVyKTsKIAogY2hhciAqQ3VybF9jaGVja1Byb3h5aGVhZGVycyhjb25zdCBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCkBAIC0xMTUsOCArMTEzLDEzIEBACiAjZGVmaW5lIE1BWF9JTklUSUFMX1BPU1RfU0laRSAoNjQqMTAyNCkKICNlbmRpZgogCi0jaWZuZGVmIFRJTllfSU5JVElBTF9QT1NUX1NJWkUKLSNkZWZpbmUgVElOWV9JTklUSUFMX1BPU1RfU0laRSAxMDI0CisvKiBFWFBFQ1RfMTAwX1RIUkVTSE9MRCBpcyB0aGUgcmVxdWVzdCBib2R5IHNpemUgbGltaXQgZm9yIHdoZW4gbGliY3VybCB3aWxsCisgKiBhdXRvbWF0aWNhbGx5IGFkZCBhbiAiRXhwZWN0OiAxMDAtY29udGludWUiIGhlYWRlciBpbiBIVFRQIHJlcXVlc3RzLiBXaGVuCisgKiB0aGUgc2l6ZSBpcyB1bmtub3duLCBpdCB3aWxsIGFsd2F5cyBhZGQgaXQuCisgKgorICovCisjaWZuZGVmIEVYUEVDVF8xMDBfVEhSRVNIT0xECisjZGVmaW5lIEVYUEVDVF8xMDBfVEhSRVNIT0xEIDEwMjQKICNlbmRpZgogCiAjZW5kaWYgLyogQ1VSTF9ESVNBQkxFX0hUVFAgKi8KQEAgLTEyNSw3ICsxMjgsNyBAQAogICogSFRUUCB1bmlxdWUgc2V0dXAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdHJ1Y3QgSFRUUCB7Ci0gIHN0cnVjdCBGb3JtRGF0YSAqc2VuZGl0OworICBjdXJsX21pbWVwYXJ0ICpzZW5kaXQ7CiAgIGN1cmxfb2ZmX3QgcG9zdHNpemU7IC8qIG9mZl90IHRvIGhhbmRsZSBsYXJnZSBmaWxlIHNpemVzICovCiAgIGNvbnN0IGNoYXIgKnBvc3RkYXRhOwogCkBAIC0xMzUsNyArMTM4LDcgQEAKICAgY3VybF9vZmZfdCB3cml0ZWJ5dGVjb3VudDsKIAogICAvKiBGb3IgRk9STSBwb3N0aW5nICovCi0gIHN0cnVjdCBGb3JtIGZvcm07CisgIGN1cmxfbWltZXBhcnQgZm9ybTsKIAogICBzdHJ1Y3QgYmFjayB7CiAgICAgY3VybF9yZWFkX2NhbGxiYWNrIGZyZWFkX2Z1bmM7IC8qIGJhY2t1cCBzdG9yYWdlIGZvciBmcmVhZCBwb2ludGVyICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwMi5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cDIuYwppbmRleCBmOGUyM2M1Li45YTJhMWRkIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwMi5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2h0dHAyLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlICJodHRwMi5oIgogI2luY2x1ZGUgImh0dHAuaCIKICNpbmNsdWRlICJzZW5kZi5oIgorI2luY2x1ZGUgInNlbGVjdC5oIgogI2luY2x1ZGUgImN1cmxfYmFzZTY0LmgiCiAjaW5jbHVkZSAic3RyY2FzZS5oIgogI2luY2x1ZGUgIm11bHRpaWYuaCIKQEAgLTE1MSw2ICsxNTIsNDkgQEAKICAgcmV0dXJuIENVUkxFX09LOwogfQogCisvKgorICogVGhlIHNlcnZlciBtYXkgc2VuZCB1cyBkYXRhIGF0IGFueSBwb2ludCAoZS5nLiBQSU5HIGZyYW1lcykuIFRoZXJlZm9yZSwKKyAqIHdlIGNhbm5vdCBhc3N1bWUgdGhhdCBhbiBIVFRQLzIgc29ja2V0IGlzIGRlYWQganVzdCBiZWNhdXNlIGl0IGlzIHJlYWRhYmxlLgorICoKKyAqIEluc3RlYWQsIGlmIGl0IGlzIHJlYWRhYmxlLCBydW4gQ3VybF9jb25uYWxpdmUoKSB0byBwZWVrIGF0IHRoZSBzb2NrZXQKKyAqIGFuZCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGNsb3NlZCBhbmQgZGF0YS4KKyAqLworc3RhdGljIGJvb2wgaHR0cDJfY29ubmlzZGVhZChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNoZWNrKQoreworICBpbnQgc3ZhbDsKKyAgYm9vbCByZXRfdmFsID0gVFJVRTsKKworICBzdmFsID0gU09DS0VUX1JFQURBQkxFKGNoZWNrLT5zb2NrW0ZJUlNUU09DS0VUXSwgMCk7CisgIGlmKHN2YWwgPT0gMCkgeworICAgIC8qIHRpbWVvdXQgKi8KKyAgICByZXRfdmFsID0gRkFMU0U7CisgIH0KKyAgZWxzZSBpZihzdmFsICYgQ1VSTF9DU0VMRUNUX0VSUikgeworICAgIC8qIHNvY2tldCBpcyBpbiBhbiBlcnJvciBzdGF0ZSAqLworICAgIHJldF92YWwgPSBUUlVFOworICB9CisgIGVsc2UgaWYoc3ZhbCAmIENVUkxfQ1NFTEVDVF9JTikgeworICAgIC8qIHJlYWRhYmxlIHdpdGggbm8gZXJyb3IuIGNvdWxkIHN0aWxsIGJlIGNsb3NlZCAqLworICAgIHJldF92YWwgPSAhQ3VybF9jb25uYWxpdmUoY2hlY2spOworICB9CisKKyAgcmV0dXJuIHJldF92YWw7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCBodHRwMl9jb25uY2hlY2soc3RydWN0IGNvbm5lY3RkYXRhICpjaGVjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjaGVja3NfdG9fcGVyZm9ybSkKK3sKKyAgdW5zaWduZWQgaW50IHJldF92YWwgPSBDT05OUkVTVUxUX05PTkU7CisKKyAgaWYoY2hlY2tzX3RvX3BlcmZvcm0gJiBDT05OQ0hFQ0tfSVNERUFEKSB7CisgICAgaWYoaHR0cDJfY29ubmlzZGVhZChjaGVjaykpCisgICAgICByZXRfdmFsIHw9IENPTk5SRVNVTFRfREVBRDsKKyAgfQorCisgIHJldHVybiByZXRfdmFsOworfQorCiAvKiBjYWxsZWQgZnJvbSBDdXJsX2h0dHBfc2V0dXBfY29ubiAqLwogdm9pZCBDdXJsX2h0dHAyX3NldHVwX3JlcShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKQogewpAQCAtMTk2LDYgKzI0MCw3IEBACiAgIGh0dHAyX3BlcmZvcm1fZ2V0c29jaywgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIGh0dHAyX2Rpc2Nvbm5lY3QsICAgICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBodHRwMl9jb25uY2hlY2ssICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9IVFRQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCiAgIENVUkxQUk9UT19IVFRQLCAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9TVFJFQU0gICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFncyAqLwpAQCAtMjE2LDYgKzI2MSw3IEBACiAgIGh0dHAyX3BlcmZvcm1fZ2V0c29jaywgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIGh0dHAyX2Rpc2Nvbm5lY3QsICAgICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBodHRwMl9jb25uY2hlY2ssICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9IVFRQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCiAgIENVUkxQUk9UT19IVFRQUywgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9TU0wgfCBQUk9UT1BUX1NUUkVBTSAgICAgICAgICAvKiBmbGFncyAqLwpAQCAtMzM4LDEyICszODQsMTIgQEAKICAgICBzdHJ1Y3QgSFRUUCAqc3RyZWFtID0gaC0+ZGF0YS0+cmVxLnByb3RvcDsKICAgICBzaXplX3QgbGVuID0gc3RybGVuKGhlYWRlcik7CiAgICAgc2l6ZV90IGk7Ci0gICAgZm9yKGk9MDsgaTxzdHJlYW0tPnB1c2hfaGVhZGVyc191c2VkOyBpKyspIHsKKyAgICBmb3IoaSA9IDA7IGk8c3RyZWFtLT5wdXNoX2hlYWRlcnNfdXNlZDsgaSsrKSB7CiAgICAgICBpZighc3RybmNtcChoZWFkZXIsIHN0cmVhbS0+cHVzaF9oZWFkZXJzW2ldLCBsZW4pKSB7CiAgICAgICAgIC8qIHN1Yi1tYXRjaCwgbWFrZSBzdXJlIHRoYXQgaXQgaXMgZm9sbG93ZWQgYnkgYSBjb2xvbiAqLwogICAgICAgICBpZihzdHJlYW0tPnB1c2hfaGVhZGVyc1tpXVtsZW5dICE9ICc6JykKICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgcmV0dXJuICZzdHJlYW0tPnB1c2hfaGVhZGVyc1tpXVtsZW4rMV07CisgICAgICAgIHJldHVybiAmc3RyZWFtLT5wdXNoX2hlYWRlcnNbaV1bbGVuICsgMV07CiAgICAgICB9CiAgICAgfQogICB9CkBAIC00MTgsNyArNDY0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm11bHRpLT5wdXNoX3VzZXJwKTsKIAogICAgIC8qIGZyZWUgdGhlIGhlYWRlcnMgYWdhaW4gKi8KLSAgICBmb3IoaT0wOyBpPHN0cmVhbS0+cHVzaF9oZWFkZXJzX3VzZWQ7IGkrKykKKyAgICBmb3IoaSA9IDA7IGk8c3RyZWFtLT5wdXNoX2hlYWRlcnNfdXNlZDsgaSsrKQogICAgICAgZnJlZShzdHJlYW0tPnB1c2hfaGVhZGVyc1tpXSk7CiAgICAgZnJlZShzdHJlYW0tPnB1c2hfaGVhZGVycyk7CiAgICAgc3RyZWFtLT5wdXNoX2hlYWRlcnMgPSBOVUxMOwpAQCAtMTUzNiw3ICsxNTgyLDcgQEAKICAgICAgIGZhaWxmKGRhdGEsICJuZ2h0dHAyX3Nlc3Npb25fbWVtX3JlY3YoKSByZXR1cm5lZCAlZDolc1xuIiwKICAgICAgICAgICAgIHJ2LCBuZ2h0dHAyX3N0cmVycm9yKChpbnQpcnYpKTsKICAgICAgICplcnIgPSBDVVJMRV9SRUNWX0VSUk9SOwotICAgICAgcmV0dXJuIDA7CisgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIERFQlVHRihpbmZvZihkYXRhLCAibmdodHRwMl9zZXNzaW9uX21lbV9yZWN2KCkgcmV0dXJucyAlemRcbiIsIHJ2KSk7CiAgICAgaWYobnJlYWQgPT0gcnYpIHsKQEAgLTE1NTQsNyArMTYwMCw3IEBACiAgICAgcnYgPSBoMl9zZXNzaW9uX3NlbmQoZGF0YSwgaHR0cGMtPmgyKTsKICAgICBpZihydiAhPSAwKSB7CiAgICAgICAqZXJyID0gQ1VSTEVfU0VORF9FUlJPUjsKLSAgICAgIHJldHVybiAwOworICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAogICAgIGlmKHNob3VsZF9jbG9zZV9zZXNzaW9uKGh0dHBjKSkgewpAQCAtMTkwOSw2ICsxOTU1LDcgQEAKICAgc3dpdGNoKGNvbm4tPmRhdGEtPnNldC5odHRwcmVxKSB7CiAgIGNhc2UgSFRUUFJFUV9QT1NUOgogICBjYXNlIEhUVFBSRVFfUE9TVF9GT1JNOgorICBjYXNlIEhUVFBSRVFfUE9TVF9NSU1FOgogICBjYXNlIEhUVFBSRVFfUFVUOgogICAgIGlmKGNvbm4tPmRhdGEtPnN0YXRlLmluZmlsZXNpemUgIT0gLTEpCiAgICAgICBzdHJlYW0tPnVwbG9hZF9sZWZ0ID0gY29ubi0+ZGF0YS0+c3RhdGUuaW5maWxlc2l6ZTsKQEAgLTIxMzQsMTIgKzIxODEsMTUgQEAKICAgcmV0dXJuIENVUkxFX09LOwogfQogCi12b2lkIEN1cmxfaHR0cDJfYWRkX2NoaWxkKHN0cnVjdCBDdXJsX2Vhc3kgKnBhcmVudCwgc3RydWN0IEN1cmxfZWFzeSAqY2hpbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXhjbHVzaXZlKQorQ1VSTGNvZGUgQ3VybF9odHRwMl9hZGRfY2hpbGQoc3RydWN0IEN1cmxfZWFzeSAqcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEN1cmxfZWFzeSAqY2hpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4Y2x1c2l2ZSkKIHsKICAgaWYocGFyZW50KSB7CiAgICAgc3RydWN0IEN1cmxfaHR0cDJfZGVwICoqdGFpbDsKICAgICBzdHJ1Y3QgQ3VybF9odHRwMl9kZXAgKmRlcCA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IEN1cmxfaHR0cDJfZGVwKSk7CisgICAgaWYoIWRlcCkKKyAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogICAgIGRlcC0+ZGF0YSA9IGNoaWxkOwogCiAgICAgaWYocGFyZW50LT5zZXQuc3RyZWFtX2RlcGVuZGVudHMgJiYgZXhjbHVzaXZlKSB7CkBAIC0yMTcwLDYgKzIyMjAsNyBAQAogCiAgIGNoaWxkLT5zZXQuc3RyZWFtX2RlcGVuZHNfb24gPSBwYXJlbnQ7CiAgIGNoaWxkLT5zZXQuc3RyZWFtX2RlcGVuZHNfZSA9IGV4Y2x1c2l2ZTsKKyAgcmV0dXJuIENVUkxFX09LOwogfQogCiB2b2lkIEN1cmxfaHR0cDJfcmVtb3ZlX2NoaWxkKHN0cnVjdCBDdXJsX2Vhc3kgKnBhcmVudCwgc3RydWN0IEN1cmxfZWFzeSAqY2hpbGQpCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwMi5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cDIuaAppbmRleCBmNDA1YjNhLi5mNTk3YzgwIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwMi5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2h0dHAyLmgKQEAgLTcsNyArNyw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTUzLDggKzUzLDkgQEAKIHZvaWQgQ3VybF9odHRwMl9zZXR1cF9yZXEoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSk7CiB2b2lkIEN1cmxfaHR0cDJfZG9uZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGJvb2wgcHJlbWF0dXJlKTsKIENVUkxjb2RlIEN1cmxfaHR0cDJfZG9uZV9zZW5kaW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubik7Ci12b2lkIEN1cmxfaHR0cDJfYWRkX2NoaWxkKHN0cnVjdCBDdXJsX2Vhc3kgKnBhcmVudCwgc3RydWN0IEN1cmxfZWFzeSAqY2hpbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXhjbHVzaXZlKTsKK0NVUkxjb2RlIEN1cmxfaHR0cDJfYWRkX2NoaWxkKHN0cnVjdCBDdXJsX2Vhc3kgKnBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDdXJsX2Vhc3kgKmNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleGNsdXNpdmUpOwogdm9pZCBDdXJsX2h0dHAyX3JlbW92ZV9jaGlsZChzdHJ1Y3QgQ3VybF9lYXN5ICpwYXJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDdXJsX2Vhc3kgKmNoaWxkKTsKIHZvaWQgQ3VybF9odHRwMl9jbGVhbnVwX2RlcGVuZGVuY2llcyhzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKTsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2h0dHBfY2h1bmtzLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwX2NodW5rcy5jCmluZGV4IDFiZGY2OTcuLjkyZDc3MzEgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2h0dHBfY2h1bmtzLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cF9jaHVua3MuYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtODYsOCArODYsOCBAQAogdm9pZCBDdXJsX2h0dHBjaHVua19pbml0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubikKIHsKICAgc3RydWN0IEN1cmxfY2h1bmtlciAqY2h1bmsgPSAmY29ubi0+Y2h1bms7Ci0gIGNodW5rLT5oZXhpbmRleD0wOyAgICAgICAgLyogc3RhcnQgYXQgMCAqLwotICBjaHVuay0+ZGF0YWxlZnQ9MDsgICAgICAgIC8qIG5vIGRhdGEgbGVmdCB5ZXQhICovCisgIGNodW5rLT5oZXhpbmRleCA9IDA7ICAgICAgLyogc3RhcnQgYXQgMCAqLworICBjaHVuay0+ZGF0YWxlZnQgPSAwOyAgICAgIC8qIG5vIGRhdGEgbGVmdCB5ZXQhICovCiAgIGNodW5rLT5zdGF0ZSA9IENIVU5LX0hFWDsgLyogd2UgZ2V0IGhleCBmaXJzdCEgKi8KIH0KIApAQCAtMTA3LDcgKzEwNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGRhdGFsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90ICp3cm90ZXApCiB7Ci0gIENVUkxjb2RlIHJlc3VsdD1DVVJMRV9PSzsKKyAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7CiAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogICBzdHJ1Y3QgQ3VybF9jaHVua2VyICpjaCA9ICZjb25uLT5jaHVuazsKICAgc3RydWN0IFNpbmdsZVJlcXVlc3QgKmsgPSAmZGF0YS0+cmVxOwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAgICAgICAgICAgcmV0dXJuIENIVU5LRV9JTExFR0FMX0hFWDsKIAogICAgICAgICAvKiBsZW5ndGggYW5kIGRhdGFwIGFyZSB1bm1vZGlmaWVkICovCi0gICAgICAgIGNoLT5oZXhidWZmZXJbY2gtPmhleGluZGV4XT0wOworICAgICAgICBjaC0+aGV4YnVmZmVyW2NoLT5oZXhpbmRleF0gPSAwOwogCiAgICAgICAgIC8qIGNvbnZlcnQgdG8gaG9zdCBlbmNvZGluZyBiZWZvcmUgY2FsbGluZyBzdHJ0b3VsICovCiAgICAgICAgIHJlc3VsdCA9IEN1cmxfY29udmVydF9mcm9tX25ldHdvcmsoY29ubi0+ZGF0YSwgY2gtPmhleGJ1ZmZlciwKQEAgLTE1OCw5ICsxNTgsNyBAQAogICAgICAgICAgIHJldHVybiBDSFVOS0VfSUxMRUdBTF9IRVg7CiAgICAgICAgIH0KIAotICAgICAgICBjaC0+ZGF0YXNpemU9Y3VybHhfc3RydG9vZmZ0KGNoLT5oZXhidWZmZXIsICZlbmRwdHIsIDE2KTsKLSAgICAgICAgaWYoKGNoLT5kYXRhc2l6ZSA9PSBDVVJMX09GRl9UX01BWCkgJiYgKGVycm5vID09IEVSQU5HRSkpCi0gICAgICAgICAgLyogb3ZlcmZsb3cgaXMgYW4gZXJyb3IgKi8KKyAgICAgICAgaWYoY3VybHhfc3RydG9vZmZ0KGNoLT5oZXhidWZmZXIsICZlbmRwdHIsIDE2LCAmY2gtPmRhdGFzaXplKSkKICAgICAgICAgICByZXR1cm4gQ0hVTktFX0lMTEVHQUxfSEVYOwogICAgICAgICBjaC0+c3RhdGUgPSBDSFVOS19MRjsgLyogbm93IHdhaXQgZm9yIHRoZSBDUkxGICovCiAgICAgICB9CkBAIC0xNzIsNyArMTcwLDcgQEAKICAgICAgICAgLyogd2UncmUgbm93IGV4cGVjdGluZyBkYXRhIHRvIGNvbWUsIHVubGVzcyBzaXplIHdhcyB6ZXJvISAqLwogICAgICAgICBpZigwID09IGNoLT5kYXRhc2l6ZSkgewogICAgICAgICAgIGNoLT5zdGF0ZSA9IENIVU5LX1RSQUlMRVI7IC8qIG5vdyBjaGVjayBmb3IgdHJhaWxlcnMgKi8KLSAgICAgICAgICBjb25uLT50cmxQb3M9MDsKKyAgICAgICAgICBjb25uLT50cmxQb3MgPSAwOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgICBjaC0+c3RhdGUgPSBDSFVOS19EQVRBOwpAQCAtMjU5LDkgKzI1Nyw5IEBACiAKICAgICAgICAgaWYoY29ubi0+dHJsUG9zKSB7CiAgICAgICAgICAgLyogd2UgYWxsb2NhdGUgdHJhaWxlciB3aXRoIDMgYnl0ZXMgZXh0cmEgcm9vbSB0byBmaXQgdGhpcyAqLwotICAgICAgICAgIGNvbm4tPnRyYWlsZXJbY29ubi0+dHJsUG9zKytdPTB4MGQ7Ci0gICAgICAgICAgY29ubi0+dHJhaWxlcltjb25uLT50cmxQb3MrK109MHgwYTsKLSAgICAgICAgICBjb25uLT50cmFpbGVyW2Nvbm4tPnRybFBvc109MDsKKyAgICAgICAgICBjb25uLT50cmFpbGVyW2Nvbm4tPnRybFBvcysrXSA9IDB4MGQ7CisgICAgICAgICAgY29ubi0+dHJhaWxlcltjb25uLT50cmxQb3MrK10gPSAweDBhOworICAgICAgICAgIGNvbm4tPnRyYWlsZXJbY29ubi0+dHJsUG9zXSA9IDA7CiAKICAgICAgICAgICAvKiBDb252ZXJ0IHRvIGhvc3QgZW5jb2RpbmcgYmVmb3JlIGNhbGxpbmcgQ3VybF9jbGllbnRfd3JpdGUgKi8KICAgICAgICAgICByZXN1bHQgPSBDdXJsX2NvbnZlcnRfZnJvbV9uZXR3b3JrKGNvbm4tPmRhdGEsIGNvbm4tPnRyYWlsZXIsCkBAIC0yNzcsNyArMjc1LDcgQEAKICAgICAgICAgICAgIGlmKHJlc3VsdCkKICAgICAgICAgICAgICAgcmV0dXJuIENIVU5LRV9XUklURV9FUlJPUjsKICAgICAgICAgICB9Ci0gICAgICAgICAgY29ubi0+dHJsUG9zPTA7CisgICAgICAgICAgY29ubi0+dHJsUG9zID0gMDsKICAgICAgICAgICBjaC0+c3RhdGUgPSBDSFVOS19UUkFJTEVSX0NSOwogICAgICAgICAgIGlmKCpkYXRhcCA9PSAweDBhKQogICAgICAgICAgICAgLyogYWxyZWFkeSBvbiB0aGUgTEYgKi8KQEAgLTMwMSw3ICsyOTksNyBAQAogICAgICAgICAgICAgcHRyID0gcmVhbGxvYyhjb25uLT50cmFpbGVyLCBjb25uLT50cmxNYXggKyAzKTsKICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjb25uLT50cmxNYXg9MTI4OworICAgICAgICAgICAgY29ubi0+dHJsTWF4ID0gMTI4OwogICAgICAgICAgICAgcHRyID0gbWFsbG9jKGNvbm4tPnRybE1heCArIDMpOwogICAgICAgICAgIH0KICAgICAgICAgICBpZighcHRyKQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cF9udGxtLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwX250bG0uYwppbmRleCA4YTc4YmQyLi4wZjFlZGNmIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwX250bG0uYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwX250bG0uYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtMzcsMTEgKzM3LDE0IEBACiAjaW5jbHVkZSAic2VuZGYuaCIKICNpbmNsdWRlICJzdHJjYXNlLmgiCiAjaW5jbHVkZSAiaHR0cF9udGxtLmgiCisjaW5jbHVkZSAiY3VybF9udGxtX2NvcmUuaCIKICNpbmNsdWRlICJjdXJsX250bG1fd2IuaCIKICNpbmNsdWRlICJ2YXV0aC92YXV0aC5oIgogI2luY2x1ZGUgInVybC5oIgogCi0jaWYgZGVmaW5lZChVU0VfTlNTKQorLyogU1NMIGJhY2tlbmQtc3BlY2lmaWMgI2lmIGJyYW5jaGVzIGluIHRoaXMgZmlsZSBtdXN0IGJlIGtlcHQgaW4gdGhlIG9yZGVyCisgICBkb2N1bWVudGVkIGluIGN1cmxfbnRsbV9jb3JlLiAqLworI2lmIGRlZmluZWQoTlRMTV9ORUVEU19OU1NfSU5JVCkKICNpbmNsdWRlICJ2dGxzL25zc2cuaCIKICNlbGlmIGRlZmluZWQoVVNFX1dJTkRPV1NfU1NQSSkKICNpbmNsdWRlICJjdXJsX3NzcGkuaCIKQEAgLTEyOSw3ICsxMzIsNyBAQAogICBERUJVR0FTU0VSVChjb25uKTsKICAgREVCVUdBU1NFUlQoY29ubi0+ZGF0YSk7CiAKLSNpZmRlZiBVU0VfTlNTCisjaWYgZGVmaW5lZChOVExNX05FRURTX05TU19JTklUKQogICBpZihDVVJMRV9PSyAhPSBDdXJsX25zc19mb3JjZV9pbml0KGNvbm4tPmRhdGEpKQogICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogI2VuZGlmCkBAIC0xNzAsOCArMTczLDggQEAKICAgY2FzZSBOVExNU1RBVEVfVFlQRTE6CiAgIGRlZmF1bHQ6IC8qIGZvciB0aGUgd2VpcmQgY2FzZXMgd2UgKHJlKXN0YXJ0IGhlcmUgKi8KICAgICAvKiBDcmVhdGUgYSB0eXBlLTEgbWVzc2FnZSAqLwotICAgIHJlc3VsdCA9IEN1cmxfYXV0aF9jcmVhdGVfbnRsbV90eXBlMV9tZXNzYWdlKHVzZXJwLCBwYXNzd2RwLCBudGxtLCAmYmFzZTY0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4pOworICAgIHJlc3VsdCA9IEN1cmxfYXV0aF9jcmVhdGVfbnRsbV90eXBlMV9tZXNzYWdlKGNvbm4tPmRhdGEsIHVzZXJwLCBwYXNzd2RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50bG0sICZiYXNlNjQsICZsZW4pOwogICAgIGlmKHJlc3VsdCkKICAgICAgIHJldHVybiByZXN1bHQ7CiAKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2h0dHBfcHJveHkuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2h0dHBfcHJveHkuYwppbmRleCA5ODk0ZTJlLi5kZmY5ZDIzIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwX3Byb3h5LmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cF9wcm94eS5jCkBAIC0yMiwxMSArMjIsMTEgQEAKIAogI2luY2x1ZGUgImN1cmxfc2V0dXAuaCIKIAorI2luY2x1ZGUgImh0dHBfcHJveHkuaCIKKwogI2lmICFkZWZpbmVkKENVUkxfRElTQUJMRV9QUk9YWSkgJiYgIWRlZmluZWQoQ1VSTF9ESVNBQkxFX0hUVFApCiAKLSNpbmNsdWRlICJ1cmxkYXRhLmgiCiAjaW5jbHVkZSA8Y3VybC9jdXJsLmg+Ci0jaW5jbHVkZSAiaHR0cF9wcm94eS5oIgogI2luY2x1ZGUgInNlbmRmLmgiCiAjaW5jbHVkZSAiaHR0cC5oIgogI2luY2x1ZGUgInVybC5oIgpAQCAtMTM1LDM1ICsxMzUsNzMgQEAKICAgcmV0dXJuIENVUkxFX09LOwogfQogCi0jZGVmaW5lIENPTk5FQ1RfQlVGRkVSX1NJWkUgMTYzODQKK2Jvb2wgQ3VybF9jb25uZWN0X2NvbXBsZXRlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubikKK3sKKyAgcmV0dXJuICFjb25uLT5jb25uZWN0X3N0YXRlIHx8CisgICAgKGNvbm4tPmNvbm5lY3Rfc3RhdGUtPnR1bm5lbF9zdGF0ZSA9PSBUVU5ORUxfQ09NUExFVEUpOworfQorCitib29sIEN1cmxfY29ubmVjdF9vbmdvaW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubikKK3sKKyAgcmV0dXJuIGNvbm4tPmNvbm5lY3Rfc3RhdGUgJiYKKyAgICAoY29ubi0+Y29ubmVjdF9zdGF0ZS0+dHVubmVsX3N0YXRlICE9IFRVTk5FTF9DT01QTEVURSk7Cit9CisKK3N0YXRpYyBDVVJMY29kZSBjb25uZWN0X2luaXQoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBib29sIHJlaW5pdCkKK3sKKyAgc3RydWN0IGh0dHBfY29ubmVjdF9zdGF0ZSAqczsKKyAgaWYoIXJlaW5pdCkgeworICAgIERFQlVHQVNTRVJUKCFjb25uLT5jb25uZWN0X3N0YXRlKTsKKyAgICBzID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgaHR0cF9jb25uZWN0X3N0YXRlKSk7CisgICAgaWYoIXMpCisgICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKKyAgICBpbmZvZihjb25uLT5kYXRhLCAiYWxsb2NhdGUgY29ubmVjdCBidWZmZXIhXG4iKTsKKyAgICBjb25uLT5jb25uZWN0X3N0YXRlID0gczsKKyAgfQorICBlbHNlIHsKKyAgICBERUJVR0FTU0VSVChjb25uLT5jb25uZWN0X3N0YXRlKTsKKyAgICBzID0gY29ubi0+Y29ubmVjdF9zdGF0ZTsKKyAgfQorICBzLT50dW5uZWxfc3RhdGUgPSBUVU5ORUxfSU5JVDsKKyAgcy0+a2VlcG9uID0gVFJVRTsKKyAgcy0+bGluZV9zdGFydCA9IHMtPmNvbm5lY3RfYnVmZmVyOworICBzLT5wdHIgPSBzLT5saW5lX3N0YXJ0OworICBzLT5jbCA9IDA7CisgIHJldHVybiBDVVJMRV9PSzsKK30KKworc3RhdGljIHZvaWQgY29ubmVjdF9kb25lKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubikKK3sKKyAgc3RydWN0IGh0dHBfY29ubmVjdF9zdGF0ZSAqcyA9IGNvbm4tPmNvbm5lY3Rfc3RhdGU7CisgIHMtPnR1bm5lbF9zdGF0ZSA9IFRVTk5FTF9DT01QTEVURTsKKyAgaW5mb2YoY29ubi0+ZGF0YSwgIkNPTk5FQ1QgcGhhc2UgY29tcGxldGVkIVxuIik7Cit9CiAKIHN0YXRpYyBDVVJMY29kZSBDT05ORUNUKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpob3N0bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZW1vdGVfcG9ydCkKIHsKLSAgaW50IHN1YnZlcnNpb249MDsKLSAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YT1jb25uLT5kYXRhOworICBpbnQgc3VidmVyc2lvbiA9IDA7CisgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogICBzdHJ1Y3QgU2luZ2xlUmVxdWVzdCAqayA9ICZkYXRhLT5yZXE7CiAgIENVUkxjb2RlIHJlc3VsdDsKICAgY3VybF9zb2NrZXRfdCB0dW5uZWxzb2NrZXQgPSBjb25uLT5zb2NrW3NvY2tpbmRleF07Ci0gIGN1cmxfb2ZmX3QgY2w9MDsKICAgYm9vbCBjbG9zZUNvbm5lY3Rpb24gPSBGQUxTRTsKLSAgYm9vbCBjaHVua2VkX2VuY29kaW5nID0gRkFMU0U7CiAgIHRpbWVfdCBjaGVjazsKKyAgc3RydWN0IGh0dHBfY29ubmVjdF9zdGF0ZSAqcyA9IGNvbm4tPmNvbm5lY3Rfc3RhdGU7CiAKICNkZWZpbmUgU0VMRUNUX09LICAgICAgMAogI2RlZmluZSBTRUxFQ1RfRVJST1IgICAxCiAjZGVmaW5lIFNFTEVDVF9USU1FT1VUIDIKLSAgaW50IGVycm9yID0gU0VMRUNUX09LOwogCi0gIGlmKGNvbm4tPnR1bm5lbF9zdGF0ZVtzb2NraW5kZXhdID09IFRVTk5FTF9DT01QTEVURSkKKyAgaWYoQ3VybF9jb25uZWN0X2NvbXBsZXRlKGNvbm4pKQogICAgIHJldHVybiBDVVJMRV9PSzsgLyogQ09OTkVDVCBpcyBhbHJlYWR5IGNvbXBsZXRlZCAqLwogCiAgIGNvbm4tPmJpdHMucHJveHlfY29ubmVjdF9jbG9zZWQgPSBGQUxTRTsKIAogICBkbyB7Ci0gICAgaWYoVFVOTkVMX0lOSVQgPT0gY29ubi0+dHVubmVsX3N0YXRlW3NvY2tpbmRleF0pIHsKKyAgICBpZihUVU5ORUxfSU5JVCA9PSBzLT50dW5uZWxfc3RhdGUpIHsKICAgICAgIC8qIEJFR0lOIENPTk5FQ1QgUEhBU0UgKi8KICAgICAgIGNoYXIgKmhvc3RfcG9ydDsKICAgICAgIEN1cmxfc2VuZF9idWZmZXIgKnJlcV9idWZmZXI7CkBAIC0xOTYsOCArMjM0LDggQEAKIAogICAgICAgaWYoIXJlc3VsdCkgewogICAgICAgICBjaGFyICpob3N0ID0gTlVMTDsKLSAgICAgICAgY29uc3QgY2hhciAqcHJveHljb25uPSIiOwotICAgICAgICBjb25zdCBjaGFyICp1c2VyYWdlbnQ9IiI7CisgICAgICAgIGNvbnN0IGNoYXIgKnByb3h5Y29ubiA9ICIiOworICAgICAgICBjb25zdCBjaGFyICp1c2VyYWdlbnQgPSAiIjsKICAgICAgICAgY29uc3QgY2hhciAqaHR0cCA9IChjb25uLT5odHRwX3Byb3h5LnByb3h5dHlwZSA9PSBDVVJMUFJPWFlfSFRUUF8xXzApID8KICAgICAgICAgICAiMS4wIiA6ICIxLjEiOwogICAgICAgICBib29sIGlwdjZfaXAgPSBjb25uLT5iaXRzLmlwdjZfaXA7CkBAIC0yMDYsNyArMjQ0LDcgQEAKICAgICAgICAgLyogdGhlIGhvc3RuYW1lIG1heSBiZSBkaWZmZXJlbnQgKi8KICAgICAgICAgaWYoaG9zdG5hbWUgIT0gY29ubi0+aG9zdC5uYW1lKQogICAgICAgICAgIGlwdjZfaXAgPSAoc3RyY2hyKGhvc3RuYW1lLCAnOicpICE9IE5VTEwpOwotICAgICAgICBob3N0aGVhZGVyPSAvKiBob3N0OnBvcnQgd2l0aCBJUHY2IHN1cHBvcnQgKi8KKyAgICAgICAgaG9zdGhlYWRlciA9IC8qIGhvc3Q6cG9ydCB3aXRoIElQdjYgc3VwcG9ydCAqLwogICAgICAgICAgIGFwcmludGYoIiVzJXMlczolaHUiLCBpcHY2X2lwPyJbIjoiIiwgaG9zdG5hbWUsIGlwdjZfaXA/Il0iOiIiLAogICAgICAgICAgICAgICAgICAgcmVtb3RlX3BvcnQpOwogICAgICAgICBpZighaG9zdGhlYWRlcikgewpAQCAtMjcxLDY1ICszMDksNDYgQEAKICAgICAgIGlmKHJlc3VsdCkKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKIAotICAgICAgY29ubi0+dHVubmVsX3N0YXRlW3NvY2tpbmRleF0gPSBUVU5ORUxfQ09OTkVDVDsKKyAgICAgIHMtPnR1bm5lbF9zdGF0ZSA9IFRVTk5FTF9DT05ORUNUOworICAgICAgcy0+cGVybGluZSA9IDA7CiAgICAgfSAvKiBFTkQgQ09OTkVDVCBQSEFTRSAqLwogCiAgICAgY2hlY2sgPSBDdXJsX3RpbWVsZWZ0KGRhdGEsIE5VTEwsIFRSVUUpOwogICAgIGlmKGNoZWNrIDw9IDApIHsKICAgICAgIGZhaWxmKGRhdGEsICJQcm94eSBDT05ORUNUIGFib3J0ZWQgZHVlIHRvIHRpbWVvdXQiKTsKLSAgICAgIHJldHVybiBDVVJMRV9SRUNWX0VSUk9SOworICAgICAgcmV0dXJuIENVUkxFX09QRVJBVElPTl9USU1FRE9VVDsKICAgICB9CiAKICAgICBpZighQ3VybF9jb25uX2RhdGFfcGVuZGluZyhjb25uLCBzb2NraW5kZXgpKQogICAgICAgLyogcmV0dXJuIHNvIHdlJ2xsIGJlIGNhbGxlZCBhZ2FpbiBwb2xsaW5nLXN0eWxlICovCiAgICAgICByZXR1cm4gQ1VSTEVfT0s7Ci0gICAgREVCVUdGKGluZm9mKGRhdGEsICJSZWFkIHJlc3BvbnNlIGltbWVkaWF0ZWx5IGZyb20gcHJveHkgQ09OTkVDVFxuIikpOwogCiAgICAgLyogYXQgdGhpcyBwb2ludCwgdGhlIHR1bm5lbF9jb25uZWN0aW5nIHBoYXNlIGlzIG92ZXIuICovCiAKICAgICB7IC8qIFJFQURJTkcgUkVTUE9OU0UgUEhBU0UgKi8KLSAgICAgIHNpemVfdCBucmVhZDsgICAvKiB0b3RhbCBzaXplIHJlYWQgKi8KLSAgICAgIGludCBwZXJsaW5lOyAvKiBjb3VudCBieXRlcyBwZXIgbGluZSAqLwotICAgICAgaW50IGtlZXBvbj1UUlVFOwotICAgICAgc3NpemVfdCBnb3RieXRlczsKLSAgICAgIGNoYXIgKnB0cjsKLSAgICAgIGNoYXIgKmxpbmVfc3RhcnQ7CisgICAgICBpbnQgZXJyb3IgPSBTRUxFQ1RfT0s7CiAKLSAgICAgIHB0ciA9IGNvbm4tPmNvbm5lY3RfYnVmZmVyOwotICAgICAgbGluZV9zdGFydCA9IHB0cjsKKyAgICAgIHdoaWxlKHMtPmtlZXBvbiAmJiAhZXJyb3IpIHsKKyAgICAgICAgc3NpemVfdCBnb3RieXRlczsKIAotICAgICAgbnJlYWQgPSAwOwotICAgICAgcGVybGluZSA9IDA7Ci0KLSAgICAgIHdoaWxlKG5yZWFkIDwgKHNpemVfdClDT05ORUNUX0JVRkZFUl9TSVpFICYmIGtlZXBvbiAmJiAhZXJyb3IpIHsKLSAgICAgICAgaWYoQ3VybF9wZ3JzVXBkYXRlKGNvbm4pKQotICAgICAgICAgIHJldHVybiBDVVJMRV9BQk9SVEVEX0JZX0NBTExCQUNLOwotCi0gICAgICAgIGlmKHB0ciA+PSAmY29ubi0+Y29ubmVjdF9idWZmZXJbQ09OTkVDVF9CVUZGRVJfU0laRV0pIHsKKyAgICAgICAgLyogbWFrZSBzdXJlIHdlIGhhdmUgc3BhY2UgdG8gcmVhZCBtb3JlIGRhdGEgKi8KKyAgICAgICAgaWYocy0+cHRyID49ICZzLT5jb25uZWN0X2J1ZmZlcltDT05ORUNUX0JVRkZFUl9TSVpFXSkgewogICAgICAgICAgIGZhaWxmKGRhdGEsICJDT05ORUNUIHJlc3BvbnNlIHRvbyBsYXJnZSEiKTsKICAgICAgICAgICByZXR1cm4gQ1VSTEVfUkVDVl9FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgIGNoZWNrID0gQ3VybF90aW1lbGVmdChkYXRhLCBOVUxMLCBUUlVFKTsKLSAgICAgICAgaWYoY2hlY2sgPD0gMCkgewotICAgICAgICAgIGZhaWxmKGRhdGEsICJQcm94eSBDT05ORUNUIGFib3J0ZWQgZHVlIHRvIHRpbWVvdXQiKTsKLSAgICAgICAgICBlcnJvciA9IFNFTEVDVF9USU1FT1VUOyAvKiBhbHJlYWR5IHRvbyBsaXR0bGUgdGltZSAqLwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KICAgICAgICAgLyogUmVhZCBvbmUgYnl0ZSBhdCBhIHRpbWUgdG8gYXZvaWQgYSByYWNlIGNvbmRpdGlvbi4gV2FpdCBhdCBtb3N0IG9uZQogICAgICAgICAgICBzZWNvbmQgYmVmb3JlIGxvb3BpbmcgdG8gZW5zdXJlIGNvbnRpbnVvdXMgcGdyc1VwZGF0ZXMuICovCi0gICAgICAgIHJlc3VsdCA9IEN1cmxfcmVhZChjb25uLCB0dW5uZWxzb2NrZXQsIHB0ciwgMSwgJmdvdGJ5dGVzKTsKLSAgICAgICAgaWYocmVzdWx0ID09IENVUkxFX0FHQUlOKSB7Ci0gICAgICAgICAgaWYoU09DS0VUX1JFQURBQkxFKHR1bm5lbHNvY2tldCwgY2hlY2s8MTAwMEw/Y2hlY2s6MTAwMCkgPT0gLTEpIHsKLSAgICAgICAgICAgIGVycm9yID0gU0VMRUNUX0VSUk9SOwotICAgICAgICAgICAgZmFpbGYoZGF0YSwgIlByb3h5IENPTk5FQ1QgYWJvcnRlZCBkdWUgdG8gc2VsZWN0L3BvbGwgZXJyb3IiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBDdXJsX3JlYWQoY29ubiwgdHVubmVsc29ja2V0LCBzLT5wdHIsIDEsICZnb3RieXRlcyk7CisgICAgICAgIGlmKHJlc3VsdCA9PSBDVVJMRV9BR0FJTikKKyAgICAgICAgICAvKiBzb2NrZXQgYnVmZmVyIGRyYWluZWQsIHJldHVybiAqLworICAgICAgICAgIHJldHVybiBDVVJMRV9PSzsKKworICAgICAgICBpZihDdXJsX3BncnNVcGRhdGUoY29ubikpCisgICAgICAgICAgcmV0dXJuIENVUkxFX0FCT1JURURfQllfQ0FMTEJBQ0s7CisKICAgICAgICAgaWYocmVzdWx0KSB7Ci0gICAgICAgICAga2VlcG9uID0gRkFMU0U7CisgICAgICAgICAgcy0+a2VlcG9uID0gRkFMU0U7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZihnb3RieXRlcyA8PSAwKSB7CkBAIC0zNDMsMjQgKzM2MiwyMiBAQAogICAgICAgICAgICAgZXJyb3IgPSBTRUxFQ1RfRVJST1I7CiAgICAgICAgICAgICBmYWlsZihkYXRhLCAiUHJveHkgQ09OTkVDVCBhYm9ydGVkIik7CiAgICAgICAgICAgfQotICAgICAgICAgIGtlZXBvbiA9IEZBTFNFOworICAgICAgICAgIHMtPmtlZXBvbiA9IEZBTFNFOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgLyogV2UgZ290IGEgYnl0ZSBvZiBkYXRhICovCi0gICAgICAgIG5yZWFkKys7CiAKLSAgICAgICAgaWYoa2VlcG9uID4gVFJVRSkgeworICAgICAgICBpZihzLT5rZWVwb24gPiBUUlVFKSB7CiAgICAgICAgICAgLyogVGhpcyBtZWFucyB3ZSBhcmUgY3VycmVudGx5IGlnbm9yaW5nIGEgcmVzcG9uc2UtYm9keSAqLwogCi0gICAgICAgICAgbnJlYWQgPSAwOyAvKiBtYWtlIG5leHQgcmVhZCBzdGFydCBvdmVyIGluIHRoZSByZWFkIGJ1ZmZlciAqLwotICAgICAgICAgIHB0ciA9IGNvbm4tPmNvbm5lY3RfYnVmZmVyOwotICAgICAgICAgIGlmKGNsKSB7CisgICAgICAgICAgcy0+cHRyID0gcy0+Y29ubmVjdF9idWZmZXI7CisgICAgICAgICAgaWYocy0+Y2wpIHsKICAgICAgICAgICAgIC8qIEEgQ29udGVudC1MZW5ndGggYmFzZWQgYm9keTogc2ltcGx5IGNvdW50IGRvd24gdGhlIGNvdW50ZXIKICAgICAgICAgICAgICAgIGFuZCBtYWtlIHN1cmUgdG8gYnJlYWsgb3V0IG9mIHRoZSBsb29wIHdoZW4gd2UncmUgZG9uZSEgKi8KLSAgICAgICAgICAgIGNsLS07Ci0gICAgICAgICAgICBpZihjbCA8PSAwKSB7Ci0gICAgICAgICAgICAgIGtlZXBvbiA9IEZBTFNFOworICAgICAgICAgICAgcy0+Y2wtLTsKKyAgICAgICAgICAgIGlmKHMtPmNsIDw9IDApIHsKKyAgICAgICAgICAgICAgcy0+a2VlcG9uID0gRkFMU0U7CisgICAgICAgICAgICAgIHMtPnR1bm5lbF9zdGF0ZSA9IFRVTk5FTF9DT01QTEVURTsKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQpAQCAtMzcyLDI4ICszODksMjkgQEAKIAogICAgICAgICAgICAgLyogbm93IHBhcnNlIHRoZSBjaHVua2VkIHBpZWNlIG9mIGRhdGEgc28gdGhhdCB3ZSBjYW4KICAgICAgICAgICAgICAgIHByb3Blcmx5IHRlbGwgd2hlbiB0aGUgc3RyZWFtIGVuZHMgKi8KLSAgICAgICAgICAgIHIgPSBDdXJsX2h0dHBjaHVua19yZWFkKGNvbm4sIHB0ciwgMSwgJnRvb2tjYXJlb2YpOworICAgICAgICAgICAgciA9IEN1cmxfaHR0cGNodW5rX3JlYWQoY29ubiwgcy0+cHRyLCAxLCAmdG9va2NhcmVvZik7CiAgICAgICAgICAgICBpZihyID09IENIVU5LRV9TVE9QKSB7CiAgICAgICAgICAgICAgIC8qIHdlJ3JlIGRvbmUgcmVhZGluZyBjaHVua3MhICovCiAgICAgICAgICAgICAgIGluZm9mKGRhdGEsICJjaHVuayByZWFkaW5nIERPTkVcbiIpOwotICAgICAgICAgICAgICBrZWVwb24gPSBGQUxTRTsKKyAgICAgICAgICAgICAgcy0+a2VlcG9uID0gRkFMU0U7CiAgICAgICAgICAgICAgIC8qIHdlIGRpZCB0aGUgZnVsbCBDT05ORUNUIHRyZWF0bWVudCwgZ28gQ09NUExFVEUgKi8KLSAgICAgICAgICAgICAgY29ubi0+dHVubmVsX3N0YXRlW3NvY2tpbmRleF0gPSBUVU5ORUxfQ09NUExFVEU7CisgICAgICAgICAgICAgIHMtPnR1bm5lbF9zdGF0ZSA9IFRVTk5FTF9DT01QTEVURTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBwZXJsaW5lKys7IC8qIGFtb3VudCBvZiBieXRlcyBpbiB0aGlzIGxpbmUgc28gZmFyICovCisgICAgICAgIHMtPnBlcmxpbmUrKzsgLyogYW1vdW50IG9mIGJ5dGVzIGluIHRoaXMgbGluZSBzbyBmYXIgKi8KIAogICAgICAgICAvKiBpZiB0aGlzIGlzIG5vdCB0aGUgZW5kIG9mIGEgaGVhZGVyIGxpbmUgdGhlbiBjb250aW51ZSAqLwotICAgICAgICBpZigqcHRyICE9IDB4MGEpIHsKLSAgICAgICAgICBwdHIrKzsKKyAgICAgICAgaWYoKnMtPnB0ciAhPSAweDBhKSB7CisgICAgICAgICAgcy0+cHRyKys7CiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBjb252ZXJ0IGZyb20gdGhlIG5ldHdvcmsgZW5jb2RpbmcgKi8KLSAgICAgICAgcmVzdWx0ID0gQ3VybF9jb252ZXJ0X2Zyb21fbmV0d29yayhkYXRhLCBsaW5lX3N0YXJ0LCBwZXJsaW5lKTsKKyAgICAgICAgcmVzdWx0ID0gQ3VybF9jb252ZXJ0X2Zyb21fbmV0d29yayhkYXRhLCBzLT5saW5lX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3Qpcy0+cGVybGluZSk7CiAgICAgICAgIC8qIEN1cmxfY29udmVydF9mcm9tX25ldHdvcmsgY2FsbHMgZmFpbGYgaWYgdW5zdWNjZXNzZnVsICovCiAgICAgICAgIGlmKHJlc3VsdCkKICAgICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNDAxLDcgKzQxOSw3IEBACiAgICAgICAgIC8qIG91dHB1dCBkZWJ1ZyBpZiB0aGF0IGlzIHJlcXVlc3RlZCAqLwogICAgICAgICBpZihkYXRhLT5zZXQudmVyYm9zZSkKICAgICAgICAgICBDdXJsX2RlYnVnKGRhdGEsIENVUkxJTkZPX0hFQURFUl9JTiwKLSAgICAgICAgICAgICAgICAgICAgIGxpbmVfc3RhcnQsIChzaXplX3QpcGVybGluZSwgY29ubik7CisgICAgICAgICAgICAgICAgICAgICBzLT5saW5lX3N0YXJ0LCAoc2l6ZV90KXMtPnBlcmxpbmUsIGNvbm4pOwogCiAgICAgICAgIGlmKCFkYXRhLT5zZXQuc3VwcHJlc3NfY29ubmVjdF9oZWFkZXJzKSB7CiAgICAgICAgICAgLyogc2VuZCB0aGUgaGVhZGVyIHRvIHRoZSBjYWxsYmFjayAqLwpAQCAtNDA5LDM1ICs0MjcsMzQgQEAKICAgICAgICAgICBpZihkYXRhLT5zZXQuaW5jbHVkZV9oZWFkZXIpCiAgICAgICAgICAgICB3cml0ZXR5cGUgfD0gQ0xJRU5UV1JJVEVfQk9EWTsKIAotICAgICAgICAgIHJlc3VsdCA9IEN1cmxfY2xpZW50X3dyaXRlKGNvbm4sIHdyaXRldHlwZSwgbGluZV9zdGFydCwgcGVybGluZSk7CisgICAgICAgICAgcmVzdWx0ID0gQ3VybF9jbGllbnRfd3JpdGUoY29ubiwgd3JpdGV0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxpbmVfc3RhcnQsIHMtPnBlcmxpbmUpOwogICAgICAgICAgIGlmKHJlc3VsdCkKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KIAotICAgICAgICBkYXRhLT5pbmZvLmhlYWRlcl9zaXplICs9IChsb25nKXBlcmxpbmU7Ci0gICAgICAgIGRhdGEtPnJlcS5oZWFkZXJieXRlY291bnQgKz0gKGxvbmcpcGVybGluZTsKKyAgICAgICAgZGF0YS0+aW5mby5oZWFkZXJfc2l6ZSArPSAobG9uZylzLT5wZXJsaW5lOworICAgICAgICBkYXRhLT5yZXEuaGVhZGVyYnl0ZWNvdW50ICs9IChsb25nKXMtPnBlcmxpbmU7CiAKICAgICAgICAgLyogTmV3bGluZXMgYXJlIENSTEYsIHNvIHRoZSBDUiBpcyBpZ25vcmVkIGFzIHRoZSBsaW5lIGlzbid0CiAgICAgICAgICAgIHJlYWxseSB0ZXJtaW5hdGVkIHVudGlsIHRoZSBMRiBjb21lcy4gVHJlYXQgYSBmb2xsb3dpbmcgQ1IKICAgICAgICAgICAgYXMgZW5kLW9mLWhlYWRlcnMgYXMgd2VsbC4qLwogCi0gICAgICAgIGlmKCgnXHInID09IGxpbmVfc3RhcnRbMF0pIHx8Ci0gICAgICAgICAgICgnXG4nID09IGxpbmVfc3RhcnRbMF0pKSB7CisgICAgICAgIGlmKCgnXHInID09IHMtPmxpbmVfc3RhcnRbMF0pIHx8CisgICAgICAgICAgICgnXG4nID09IHMtPmxpbmVfc3RhcnRbMF0pKSB7CiAgICAgICAgICAgLyogZW5kIG9mIHJlc3BvbnNlLWhlYWRlcnMgZnJvbSB0aGUgcHJveHkgKi8KLSAgICAgICAgICBucmVhZCA9IDA7IC8qIG1ha2UgbmV4dCByZWFkIHN0YXJ0IG92ZXIgaW4gdGhlIHJlYWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciAqLwotICAgICAgICAgIHB0ciA9IGNvbm4tPmNvbm5lY3RfYnVmZmVyOworICAgICAgICAgIHMtPnB0ciA9IHMtPmNvbm5lY3RfYnVmZmVyOwogICAgICAgICAgIGlmKCg0MDcgPT0gay0+aHR0cGNvZGUpICYmICFkYXRhLT5zdGF0ZS5hdXRocHJvYmxlbSkgewogICAgICAgICAgICAgLyogSWYgd2UgZ2V0IGEgNDA3IHJlc3BvbnNlIGNvZGUgd2l0aCBjb250ZW50IGxlbmd0aAogICAgICAgICAgICAgICAgd2hlbiB3ZSBoYXZlIG5vIGF1dGggcHJvYmxlbSwgd2UgbXVzdCBpZ25vcmUgdGhlCiAgICAgICAgICAgICAgICB3aG9sZSByZXNwb25zZS1ib2R5ICovCi0gICAgICAgICAgICBrZWVwb24gPSAyOworICAgICAgICAgICAgcy0+a2VlcG9uID0gMjsKIAotICAgICAgICAgICAgaWYoY2wpIHsKKyAgICAgICAgICAgIGlmKHMtPmNsKSB7CiAgICAgICAgICAgICAgIGluZm9mKGRhdGEsICJJZ25vcmUgJSIgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVAotICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIG9mIHJlc3BvbnNlLWJvZHlcbiIsIGNsKTsKKyAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBvZiByZXNwb25zZS1ib2R5XG4iLCBzLT5jbCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKGNodW5rZWRfZW5jb2RpbmcpIHsKKyAgICAgICAgICAgIGVsc2UgaWYocy0+Y2h1bmtlZF9lbmNvZGluZykgewogICAgICAgICAgICAgICBDSFVOS2NvZGUgcjsKIAogICAgICAgICAgICAgICBpbmZvZihkYXRhLCAiSWdub3JlIGNodW5rZWQgcmVzcG9uc2UtYm9keVxuIik7CkBAIC00NDgsNDYgKzQ2NSw0NiBAQAogICAgICAgICAgICAgICAgICBmdW5jdGlvbiByZXR1cm5zISAqLwogICAgICAgICAgICAgICBrLT5pZ25vcmVib2R5ID0gVFJVRTsKIAotICAgICAgICAgICAgICBpZihsaW5lX3N0YXJ0WzFdID09ICdcbicpIHsKKyAgICAgICAgICAgICAgaWYocy0+bGluZV9zdGFydFsxXSA9PSAnXG4nKSB7CiAgICAgICAgICAgICAgICAgLyogdGhpcyBjYW4gb25seSBiZSBhIExGIGlmIHRoZSBsZXR0ZXIgYXQgaW5kZXggMAogICAgICAgICAgICAgICAgICAgIHdhcyBhIENSICovCi0gICAgICAgICAgICAgICAgbGluZV9zdGFydCsrOworICAgICAgICAgICAgICAgIHMtPmxpbmVfc3RhcnQrKzsKICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgIC8qIG5vdyBwYXJzZSB0aGUgY2h1bmtlZCBwaWVjZSBvZiBkYXRhIHNvIHRoYXQgd2UgY2FuCiAgICAgICAgICAgICAgICAgIHByb3Blcmx5IHRlbGwgd2hlbiB0aGUgc3RyZWFtIGVuZHMgKi8KLSAgICAgICAgICAgICAgciA9IEN1cmxfaHR0cGNodW5rX3JlYWQoY29ubiwgbGluZV9zdGFydCArIDEsIDEsICZnb3RieXRlcyk7CisgICAgICAgICAgICAgIHIgPSBDdXJsX2h0dHBjaHVua19yZWFkKGNvbm4sIHMtPmxpbmVfc3RhcnQgKyAxLCAxLCAmZ290Ynl0ZXMpOwogICAgICAgICAgICAgICBpZihyID09IENIVU5LRV9TVE9QKSB7CiAgICAgICAgICAgICAgICAgLyogd2UncmUgZG9uZSByZWFkaW5nIGNodW5rcyEgKi8KICAgICAgICAgICAgICAgICBpbmZvZihkYXRhLCAiY2h1bmsgcmVhZGluZyBET05FXG4iKTsKLSAgICAgICAgICAgICAgICBrZWVwb24gPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAvKiB3ZSBkaWQgdGhlIGZ1bGwgQ09OTkVDVCB0cmVhdG1lbnQsIGdvIHRvCi0gICAgICAgICAgICAgICAgICAgQ09NUExFVEUgKi8KLSAgICAgICAgICAgICAgICBjb25uLT50dW5uZWxfc3RhdGVbc29ja2luZGV4XSA9IFRVTk5FTF9DT01QTEVURTsKKyAgICAgICAgICAgICAgICBzLT5rZWVwb24gPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAvKiB3ZSBkaWQgdGhlIGZ1bGwgQ09OTkVDVCB0cmVhdG1lbnQsIGdvIHRvIENPTVBMRVRFICovCisgICAgICAgICAgICAgICAgcy0+dHVubmVsX3N0YXRlID0gVFVOTkVMX0NPTVBMRVRFOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgLyogd2l0aG91dCBjb250ZW50LWxlbmd0aCBvciBjaHVua2VkIGVuY29kaW5nLCB3ZQogICAgICAgICAgICAgICAgICBjYW4ndCBrZWVwIHRoZSBjb25uZWN0aW9uIGFsaXZlIHNpbmNlIHRoZSBjbG9zZSBpcwogICAgICAgICAgICAgICAgICB0aGUgZW5kIHNpZ25hbCBzbyB3ZSBiYWlsIG91dCBhdCBvbmNlIGluc3RlYWQgKi8KLSAgICAgICAgICAgICAga2VlcG9uID0gRkFMU0U7CisgICAgICAgICAgICAgIHMtPmtlZXBvbiA9IEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBrZWVwb24gPSBGQUxTRTsKLSAgICAgICAgICAvKiB3ZSBkaWQgdGhlIGZ1bGwgQ09OTkVDVCB0cmVhdG1lbnQsIGdvIHRvIENPTVBMRVRFICovCi0gICAgICAgICAgY29ubi0+dHVubmVsX3N0YXRlW3NvY2tpbmRleF0gPSBUVU5ORUxfQ09NUExFVEU7CisgICAgICAgICAgICBzLT5rZWVwb24gPSBGQUxTRTsKKyAgICAgICAgICBpZighcy0+Y2wpCisgICAgICAgICAgICAvKiB3ZSBkaWQgdGhlIGZ1bGwgQ09OTkVDVCB0cmVhdG1lbnQsIGdvIHRvIENPTVBMRVRFICovCisgICAgICAgICAgICBzLT50dW5uZWxfc3RhdGUgPSBUVU5ORUxfQ09NUExFVEU7CiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBsaW5lX3N0YXJ0W3BlcmxpbmVdID0gMDsgLyogemVybyB0ZXJtaW5hdGUgdGhlIGJ1ZmZlciAqLwotICAgICAgICBpZigoY2hlY2twcmVmaXgoIldXVy1BdXRoZW50aWNhdGU6IiwgbGluZV9zdGFydCkgJiYKKyAgICAgICAgcy0+bGluZV9zdGFydFtzLT5wZXJsaW5lXSA9IDA7IC8qIHplcm8gdGVybWluYXRlIHRoZSBidWZmZXIgKi8KKyAgICAgICAgaWYoKGNoZWNrcHJlZml4KCJXV1ctQXV0aGVudGljYXRlOiIsIHMtPmxpbmVfc3RhcnQpICYmCiAgICAgICAgICAgICAoNDAxID09IGstPmh0dHBjb2RlKSkgfHwKLSAgICAgICAgICAgKGNoZWNrcHJlZml4KCJQcm94eS1hdXRoZW50aWNhdGU6IiwgbGluZV9zdGFydCkgJiYKKyAgICAgICAgICAgKGNoZWNrcHJlZml4KCJQcm94eS1hdXRoZW50aWNhdGU6Iiwgcy0+bGluZV9zdGFydCkgJiYKICAgICAgICAgICAgICg0MDcgPT0gay0+aHR0cGNvZGUpKSkgewogCiAgICAgICAgICAgYm9vbCBwcm94eSA9IChrLT5odHRwY29kZSA9PSA0MDcpID8gVFJVRSA6IEZBTFNFOwotICAgICAgICAgIGNoYXIgKmF1dGggPSBDdXJsX2NvcHlfaGVhZGVyX3ZhbHVlKGxpbmVfc3RhcnQpOworICAgICAgICAgIGNoYXIgKmF1dGggPSBDdXJsX2NvcHlfaGVhZGVyX3ZhbHVlKHMtPmxpbmVfc3RhcnQpOwogICAgICAgICAgIGlmKCFhdXRoKQogICAgICAgICAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CiAKQEAgLTQ5OCw3ICs1MTUsNyBAQAogICAgICAgICAgIGlmKHJlc3VsdCkKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihjaGVja3ByZWZpeCgiQ29udGVudC1MZW5ndGg6IiwgbGluZV9zdGFydCkpIHsKKyAgICAgICAgZWxzZSBpZihjaGVja3ByZWZpeCgiQ29udGVudC1MZW5ndGg6Iiwgcy0+bGluZV9zdGFydCkpIHsKICAgICAgICAgICBpZihrLT5odHRwY29kZS8xMDAgPT0gMikgewogICAgICAgICAgICAgLyogQSBjbGllbnQgTVVTVCBpZ25vcmUgYW55IENvbnRlbnQtTGVuZ3RoIG9yIFRyYW5zZmVyLUVuY29kaW5nCiAgICAgICAgICAgICAgICBoZWFkZXIgZmllbGRzIHJlY2VpdmVkIGluIGEgc3VjY2Vzc2Z1bCByZXNwb25zZSB0byBDT05ORUNULgpAQCAtNTA3LDEzICs1MjQsMTMgQEAKICAgICAgICAgICAgICAgICAgIGstPmh0dHBjb2RlKTsKICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjbCA9IGN1cmx4X3N0cnRvb2ZmdChsaW5lX3N0YXJ0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbigiQ29udGVudC1MZW5ndGg6IiksIE5VTEwsIDEwKTsKKyAgICAgICAgICAgICh2b2lkKWN1cmx4X3N0cnRvb2ZmdChzLT5saW5lX3N0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oIkNvbnRlbnQtTGVuZ3RoOiIpLCBOVUxMLCAxMCwgJnMtPmNsKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihDdXJsX2NvbXBhcmVoZWFkZXIobGluZV9zdGFydCwgIkNvbm5lY3Rpb246IiwgImNsb3NlIikpCisgICAgICAgIGVsc2UgaWYoQ3VybF9jb21wYXJlaGVhZGVyKHMtPmxpbmVfc3RhcnQsICJDb25uZWN0aW9uOiIsICJjbG9zZSIpKQogICAgICAgICAgIGNsb3NlQ29ubmVjdGlvbiA9IFRSVUU7Ci0gICAgICAgIGVsc2UgaWYoY2hlY2twcmVmaXgoIlRyYW5zZmVyLUVuY29kaW5nOiIsIGxpbmVfc3RhcnQpKSB7CisgICAgICAgIGVsc2UgaWYoY2hlY2twcmVmaXgoIlRyYW5zZmVyLUVuY29kaW5nOiIsIHMtPmxpbmVfc3RhcnQpKSB7CiAgICAgICAgICAgaWYoay0+aHR0cGNvZGUvMTAwID09IDIpIHsKICAgICAgICAgICAgIC8qIEEgY2xpZW50IE1VU1QgaWdub3JlIGFueSBDb250ZW50LUxlbmd0aCBvciBUcmFuc2Zlci1FbmNvZGluZwogICAgICAgICAgICAgICAgaGVhZGVyIGZpZWxkcyByZWNlaXZlZCBpbiBhIHN1Y2Nlc3NmdWwgcmVzcG9uc2UgdG8gQ09OTkVDVC4KQEAgLTUyMSwyNiArNTM4LDI3IEBACiAgICAgICAgICAgICBpbmZvZihkYXRhLCAiSWdub3JpbmcgVHJhbnNmZXItRW5jb2RpbmcgaW4gIgogICAgICAgICAgICAgICAgICAgIkNPTk5FQ1QgJTAzZCByZXNwb25zZVxuIiwgay0+aHR0cGNvZGUpOwogICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmKEN1cmxfY29tcGFyZWhlYWRlcihsaW5lX3N0YXJ0LAorICAgICAgICAgIGVsc2UgaWYoQ3VybF9jb21wYXJlaGVhZGVyKHMtPmxpbmVfc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyYW5zZmVyLUVuY29kaW5nOiIsICJjaHVua2VkIikpIHsKICAgICAgICAgICAgIGluZm9mKGRhdGEsICJDT05ORUNUIHJlc3BvbmRlZCBjaHVua2VkXG4iKTsKLSAgICAgICAgICAgIGNodW5rZWRfZW5jb2RpbmcgPSBUUlVFOworICAgICAgICAgICAgcy0+Y2h1bmtlZF9lbmNvZGluZyA9IFRSVUU7CiAgICAgICAgICAgICAvKiBpbml0IG91ciBjaHVua3kgZW5naW5lICovCiAgICAgICAgICAgICBDdXJsX2h0dHBjaHVua19pbml0KGNvbm4pOwogICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBlbHNlIGlmKEN1cmxfY29tcGFyZWhlYWRlcihsaW5lX3N0YXJ0LCAiUHJveHktQ29ubmVjdGlvbjoiLCAiY2xvc2UiKSkKKyAgICAgICAgZWxzZSBpZihDdXJsX2NvbXBhcmVoZWFkZXIocy0+bGluZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3h5LUNvbm5lY3Rpb246IiwgImNsb3NlIikpCiAgICAgICAgICAgY2xvc2VDb25uZWN0aW9uID0gVFJVRTsKLSAgICAgICAgZWxzZSBpZigyID09IHNzY2FuZihsaW5lX3N0YXJ0LCAiSFRUUC8xLiVkICVkIiwKKyAgICAgICAgZWxzZSBpZigyID09IHNzY2FuZihzLT5saW5lX3N0YXJ0LCAiSFRUUC8xLiVkICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3VidmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmay0+aHR0cGNvZGUpKSB7CiAgICAgICAgICAgLyogc3RvcmUgdGhlIEhUVFAgY29kZSBmcm9tIHRoZSBwcm94eSAqLwogICAgICAgICAgIGRhdGEtPmluZm8uaHR0cHByb3h5Y29kZSA9IGstPmh0dHBjb2RlOwogICAgICAgICB9CiAKLSAgICAgICAgcGVybGluZSA9IDA7IC8qIGxpbmUgc3RhcnRzIG92ZXIgaGVyZSAqLwotICAgICAgICBwdHIgPSBjb25uLT5jb25uZWN0X2J1ZmZlcjsKLSAgICAgICAgbGluZV9zdGFydCA9IHB0cjsKKyAgICAgICAgcy0+cGVybGluZSA9IDA7IC8qIGxpbmUgc3RhcnRzIG92ZXIgaGVyZSAqLworICAgICAgICBzLT5wdHIgPSBzLT5jb25uZWN0X2J1ZmZlcjsKKyAgICAgICAgcy0+bGluZV9zdGFydCA9IHMtPnB0cjsKICAgICAgIH0gLyogd2hpbGUgdGhlcmUncyBidWZmZXIgbGVmdCBhbmQgbG9vcCBpcyByZXF1ZXN0ZWQgKi8KIAogICAgICAgaWYoQ3VybF9wZ3JzVXBkYXRlKGNvbm4pKQpAQCAtNTQ5LDcgKzU2Nyw3IEBACiAgICAgICBpZihlcnJvcikKICAgICAgICAgcmV0dXJuIENVUkxFX1JFQ1ZfRVJST1I7CiAKLSAgICAgIGlmKGRhdGEtPmluZm8uaHR0cHByb3h5Y29kZSAhPSAyMDApIHsKKyAgICAgIGlmKGRhdGEtPmluZm8uaHR0cHByb3h5Y29kZS8xMDAgIT0gMikgewogICAgICAgICAvKiBEZWFsIHdpdGggdGhlIHBvc3NpYmx5IGFscmVhZHkgcmVjZWl2ZWQgYXV0aGVudGljYXRlCiAgICAgICAgICAgIGhlYWRlcnMuICduZXd1cmwnIGlzIHNldCB0byBhIG5ldyBVUkwgaWYgd2UgbXVzdCBsb29wLiAqLwogICAgICAgICByZXN1bHQgPSBDdXJsX2h0dHBfYXV0aF9hY3QoY29ubik7CkBAIC01NzQsMTkgKzU5MiwxNyBAQAogICAgIC8qIElmIHdlIGFyZSBzdXBwb3NlZCB0byBjb250aW51ZSBhbmQgcmVxdWVzdCBhIG5ldyBVUkwsIHdoaWNoIGJhc2ljYWxseQogICAgICAqIG1lYW5zIHRoZSBIVFRQIGF1dGhlbnRpY2F0aW9uIGlzIHN0aWxsIGdvaW5nIG9uIHNvIGlmIHRoZSB0dW5uZWwKICAgICAgKiBpcyBjb21wbGV0ZSB3ZSBzdGFydCBvdmVyIGluIElOSVQgc3RhdGUgKi8KLSAgICBpZihkYXRhLT5yZXEubmV3dXJsICYmCi0gICAgICAgKFRVTk5FTF9DT01QTEVURSA9PSBjb25uLT50dW5uZWxfc3RhdGVbc29ja2luZGV4XSkpIHsKLSAgICAgIGNvbm4tPnR1bm5lbF9zdGF0ZVtzb2NraW5kZXhdID0gVFVOTkVMX0lOSVQ7Ci0gICAgICBpbmZvZihkYXRhLCAiVFVOTkVMX1NUQVRFIHN3aXRjaGVkIHRvOiAlZFxuIiwKLSAgICAgICAgICAgIGNvbm4tPnR1bm5lbF9zdGF0ZVtzb2NraW5kZXhdKTsKKyAgICBpZihkYXRhLT5yZXEubmV3dXJsICYmIChUVU5ORUxfQ09NUExFVEUgPT0gcy0+dHVubmVsX3N0YXRlKSkgeworICAgICAgY29ubmVjdF9pbml0KGNvbm4sIFRSVUUpOyAvKiByZWluaXQgKi8KICAgICB9CiAKICAgfSB3aGlsZShkYXRhLT5yZXEubmV3dXJsKTsKIAotICBpZigyMDAgIT0gZGF0YS0+cmVxLmh0dHBjb2RlKSB7CisgIGlmKGRhdGEtPmluZm8uaHR0cHByb3h5Y29kZS8xMDAgIT0gMikgewogICAgIGlmKGNsb3NlQ29ubmVjdGlvbiAmJiBkYXRhLT5yZXEubmV3dXJsKSB7CiAgICAgICBjb25uLT5iaXRzLnByb3h5X2Nvbm5lY3RfY2xvc2VkID0gVFJVRTsKICAgICAgIGluZm9mKGRhdGEsICJDb25uZWN0IG1lIGFnYWluIHBsZWFzZVxuIik7CisgICAgICBjb25uZWN0X2RvbmUoY29ubik7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgZnJlZShkYXRhLT5yZXEubmV3dXJsKTsKQEAgLTU5OCw3ICs2MTQsNyBAQAogICAgIH0KIAogICAgIC8qIHRvIGJhY2sgdG8gaW5pdCBzdGF0ZSAqLwotICAgIGNvbm4tPnR1bm5lbF9zdGF0ZVtzb2NraW5kZXhdID0gVFVOTkVMX0lOSVQ7CisgICAgcy0+dHVubmVsX3N0YXRlID0gVFVOTkVMX0lOSVQ7CiAKICAgICBpZihjb25uLT5iaXRzLnByb3h5X2Nvbm5lY3RfY2xvc2VkKQogICAgICAgLyogdGhpcyBpcyBub3QgYW4gZXJyb3IsIGp1c3QgcGFydCBvZiB0aGUgY29ubmVjdGlvbiBuZWdvdGlhdGlvbiAqLwpAQCAtNjA4LDcgKzYyNCw3IEBACiAgICAgcmV0dXJuIENVUkxFX1JFQ1ZfRVJST1I7CiAgIH0KIAotICBjb25uLT50dW5uZWxfc3RhdGVbc29ja2luZGV4XSA9IFRVTk5FTF9DT01QTEVURTsKKyAgcy0+dHVubmVsX3N0YXRlID0gVFVOTkVMX0NPTVBMRVRFOwogCiAgIC8qIElmIGEgcHJveHktYXV0aG9yaXphdGlvbiBoZWFkZXIgd2FzIHVzZWQgZm9yIHRoZSBwcm94eSwgdGhlbiB3ZSBzaG91bGQKICAgICAgbWFrZSBzdXJlIHRoYXQgaXQgaXNuJ3QgYWNjaWRlbnRhbGx5IHVzZWQgZm9yIHRoZSBkb2N1bWVudCByZXF1ZXN0CkBAIC02MTgsMTMgKzYzNCwyNCBAQAogCiAgIGRhdGEtPnN0YXRlLmF1dGhwcm94eS5kb25lID0gVFJVRTsKIAotICBpbmZvZihkYXRhLCAiUHJveHkgcmVwbGllZCBPSyB0byBDT05ORUNUIHJlcXVlc3RcbiIpOworICBpbmZvZihkYXRhLCAiUHJveHkgcmVwbGllZCAlZCB0byBDT05ORUNUIHJlcXVlc3RcbiIsCisgICAgICAgIGRhdGEtPmluZm8uaHR0cHByb3h5Y29kZSk7CiAgIGRhdGEtPnJlcS5pZ25vcmVib2R5ID0gRkFMU0U7IC8qIHB1dCBpdCAoYmFjaykgdG8gbm9uLWlnbm9yZSBzdGF0ZSAqLwogICBjb25uLT5iaXRzLnJld2luZGFmdGVyc2VuZCA9IEZBTFNFOyAvKiBtYWtlIHN1cmUgdGhpcyBpc24ndCBzZXQgZm9yIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudCByZXF1ZXN0ICAqLwogICByZXR1cm4gQ1VSTEVfT0s7CiB9CiAKK3ZvaWQgQ3VybF9jb25uZWN0X2ZyZWUoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSkKK3sKKyAgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uID0gZGF0YS0+ZWFzeV9jb25uOworICBzdHJ1Y3QgaHR0cF9jb25uZWN0X3N0YXRlICpzID0gY29ubi0+Y29ubmVjdF9zdGF0ZTsKKyAgaWYocykgeworICAgIGZyZWUocyk7CisgICAgY29ubi0+Y29ubmVjdF9zdGF0ZSA9IE5VTEw7CisgIH0KK30KKwogLyoKICAqIEN1cmxfcHJveHlDT05ORUNUKCkgcmVxdWlyZXMgdGhhdCB3ZSdyZSBjb25uZWN0ZWQgdG8gYSBIVFRQIHByb3h5LiBUaGlzCiAgKiBmdW5jdGlvbiB3aWxsIGlzc3VlIHRoZSBuZWNlc3NhcnkgY29tbWFuZHMgdG8gZ2V0IGEgc2VhbWxlc3MgdHVubmVsIHRocm91Z2gKQEAgLTYzNywyMCArNjY0LDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVtb3RlX3BvcnQpCiB7CiAgIENVUkxjb2RlIHJlc3VsdDsKLSAgaWYoVFVOTkVMX0lOSVQgPT0gY29ubi0+dHVubmVsX3N0YXRlW3NvY2tpbmRleF0pIHsKLSAgICBpZighY29ubi0+Y29ubmVjdF9idWZmZXIpIHsKLSAgICAgIGNvbm4tPmNvbm5lY3RfYnVmZmVyID0gbWFsbG9jKENPTk5FQ1RfQlVGRkVSX1NJWkUpOwotICAgICAgaWYoIWNvbm4tPmNvbm5lY3RfYnVmZmVyKQotICAgICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKLSAgICB9CisgIGlmKCFjb25uLT5jb25uZWN0X3N0YXRlKSB7CisgICAgcmVzdWx0ID0gY29ubmVjdF9pbml0KGNvbm4sIEZBTFNFKTsKKyAgICBpZihyZXN1bHQpCisgICAgICByZXR1cm4gcmVzdWx0OwogICB9CiAgIHJlc3VsdCA9IENPTk5FQ1QoY29ubiwgc29ja2luZGV4LCBob3N0bmFtZSwgcmVtb3RlX3BvcnQpOwogCi0gIGlmKHJlc3VsdCB8fCAoVFVOTkVMX0NPTVBMRVRFID09IGNvbm4tPnR1bm5lbF9zdGF0ZVtzb2NraW5kZXhdKSkKLSAgICBDdXJsX3NhZmVmcmVlKGNvbm4tPmNvbm5lY3RfYnVmZmVyKTsKKyAgaWYocmVzdWx0IHx8IEN1cmxfY29ubmVjdF9jb21wbGV0ZShjb25uKSkKKyAgICBjb25uZWN0X2RvbmUoY29ubik7CiAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorI2Vsc2UKK3ZvaWQgQ3VybF9jb25uZWN0X2ZyZWUoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSkKK3sKKyAgKHZvaWQpZGF0YTsKK30KIAogI2VuZGlmIC8qIENVUkxfRElTQUJMRV9QUk9YWSAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cF9wcm94eS5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaHR0cF9wcm94eS5oCmluZGV4IGNiYjFhYjQuLmUxOWZhODUgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2h0dHBfcHJveHkuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9odHRwX3Byb3h5LmgKQEAgLTIyLDYgKzIyLDkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSAiY3VybF9zZXR1cC5oIgorI2luY2x1ZGUgInVybGRhdGEuaCIKKwogI2lmICFkZWZpbmVkKENVUkxfRElTQUJMRV9QUk9YWSkgJiYgIWRlZmluZWQoQ1VSTF9ESVNBQkxFX0hUVFApCiAvKiBmdHAgY2FuIHVzZSB0aGlzIGFzIHdlbGwgKi8KIENVUkxjb2RlIEN1cmxfcHJveHlDT05ORUNUKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKQEAgLTMzLDkgKzM2LDE2IEBACiAKIENVUkxjb2RlIEN1cmxfcHJveHlfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOwogCitib29sIEN1cmxfY29ubmVjdF9jb21wbGV0ZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pOworYm9vbCBDdXJsX2Nvbm5lY3Rfb25nb2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pOworCiAjZWxzZQogI2RlZmluZSBDdXJsX3Byb3h5Q09OTkVDVCh4LHkseix3KSBDVVJMRV9OT1RfQlVJTFRfSU4KICNkZWZpbmUgQ3VybF9wcm94eV9jb25uZWN0KHgseSkgQ1VSTEVfT0sKKyNkZWZpbmUgQ3VybF9jb25uZWN0X2NvbXBsZXRlKHgpIENVUkxFX09LCisjZGVmaW5lIEN1cmxfY29ubmVjdF9vbmdvaW5nKHgpIEZBTFNFCiAjZW5kaWYKIAordm9pZCBDdXJsX2Nvbm5lY3RfZnJlZShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKTsKKwogI2VuZGlmIC8qIEhFQURFUl9DVVJMX0hUVFBfUFJPWFlfSCAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaWYyaXAuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2lmMmlwLmMKaW5kZXggNGRlODFiZS4uY2UzOGVhMSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaWYyaXAuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9pZjJpcC5jCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC03MSw2ICs3MSw4IEBACiAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYiA9IHNhNi0+c2luNl9hZGRyLnM2X2FkZHI7CiAgICAgdW5zaWduZWQgc2hvcnQgdyA9ICh1bnNpZ25lZCBzaG9ydCkgKChiWzBdIDw8IDgpIHwgYlsxXSk7CiAKKyAgICBpZigoYlswXSAmIDB4RkUpID09IDB4RkMpIC8qIEhhbmRsZSBVTEFzICovCisgICAgICByZXR1cm4gSVBWNl9TQ09QRV9VTklRVUVMT0NBTDsKICAgICBzd2l0Y2godyAmIDB4RkZDMCkgewogICAgIGNhc2UgMHhGRTgwOgogICAgICAgcmV0dXJuIElQVjZfU0NPUEVfTElOS0xPQ0FMOwpAQCAtMTAxLDcgKzEwMyw3IEBACiAgIHN0cnVjdCBpZmFkZHJzICppZmFjZSwgKmhlYWQ7CiAKICAgaWYoZ2V0aWZhZGRycygmaGVhZCkgPj0gMCkgewotICAgIGZvcihpZmFjZT1oZWFkOyBpZmFjZSAhPSBOVUxMOyBpZmFjZT1pZmFjZS0+aWZhX25leHQpIHsKKyAgICBmb3IoaWZhY2UgPSBoZWFkOyBpZmFjZSAhPSBOVUxMOyBpZmFjZSA9IGlmYWNlLT5pZmFfbmV4dCkgewogICAgICAgaWYoc3RyY2FzZWNvbXBhcmUoaWZhY2UtPmlmYV9uYW1lLCBpbnRlcmYpKSB7CiAgICAgICAgIHJlc3VsdCA9IFRSVUU7CiAgICAgICAgIGJyZWFrOwpAQCAtMTIxLDE1ICsxMjMsMTUgQEAKIAogI2lmbmRlZiBFTkFCTEVfSVBWNgogICAodm9pZCkgcmVtb3RlX3Njb3BlOworI2VuZGlmCiAKLSNpZm5kZWYgSEFWRV9TT0NLQUREUl9JTjZfU0lONl9TQ09QRV9JRAorI2lmICFkZWZpbmVkKEhBVkVfU09DS0FERFJfSU42X1NJTjZfU0NPUEVfSUQpIHx8IFwKKyAgICAhZGVmaW5lZChFTkFCTEVfSVBWNikKICAgKHZvaWQpIHJlbW90ZV9zY29wZV9pZDsKICNlbmRpZgogCi0jZW5kaWYKLQogICBpZihnZXRpZmFkZHJzKCZoZWFkKSA+PSAwKSB7Ci0gICAgZm9yKGlmYWNlID0gaGVhZDsgaWZhY2UgIT0gTlVMTDsgaWZhY2U9aWZhY2UtPmlmYV9uZXh0KSB7CisgICAgZm9yKGlmYWNlID0gaGVhZDsgaWZhY2UgIT0gTlVMTDsgaWZhY2UgPSBpZmFjZS0+aWZhX25leHQpIHsKICAgICAgIGlmKGlmYWNlLT5pZmFfYWRkciAhPSBOVUxMKSB7CiAgICAgICAgIGlmKGlmYWNlLT5pZmFfYWRkci0+c2FfZmFtaWx5ID09IGFmKSB7CiAgICAgICAgICAgaWYoc3RyY2FzZWNvbXBhcmUoaWZhY2UtPmlmYV9uYW1lLCBpbnRlcmYpKSB7CkBAIC0yMjgsNyArMjMwLDcgQEAKICAgICByZXR1cm4gSUYySVBfTk9UX0ZPVU5EOwogCiAgIG1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7Ci0gIG1lbWNweShyZXEuaWZyX25hbWUsIGludGVyZiwgbGVuKzEpOworICBtZW1jcHkocmVxLmlmcl9uYW1lLCBpbnRlcmYsIGxlbiArIDEpOwogICByZXEuaWZyX2FkZHIuc2FfZmFtaWx5ID0gQUZfSU5FVDsKIAogICBpZihpb2N0bChkdW1teSwgU0lPQ0dJRkFERFIsICZyZXEpIDwgMCkgewpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaWYyaXAuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2lmMmlwLmgKaW5kZXggZjNhN2ZmMC4uYTkwZTY2MiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaWYyaXAuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9pZjJpcC5oCkBAIC03LDcgKzcsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTQsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC0yNyw3ICsyNyw4IEBACiAjZGVmaW5lIElQVjZfU0NPUEVfR0xPQkFMICAgICAgIDAgICAgICAgLyogR2xvYmFsIHNjb3BlLiAqLwogI2RlZmluZSBJUFY2X1NDT1BFX0xJTktMT0NBTCAgICAxICAgICAgIC8qIExpbmstbG9jYWwgc2NvcGUuICovCiAjZGVmaW5lIElQVjZfU0NPUEVfU0lURUxPQ0FMICAgIDIgICAgICAgLyogU2l0ZS1sb2NhbCBzY29wZSAoZGVwcmVjYXRlZCkuICovCi0jZGVmaW5lIElQVjZfU0NPUEVfTk9ERUxPQ0FMICAgIDMgICAgICAgLyogTG9vcGJhY2suICovCisjZGVmaW5lIElQVjZfU0NPUEVfVU5JUVVFTE9DQUwgIDMgICAgICAgLyogVW5pcXVlIGxvY2FsICovCisjZGVmaW5lIElQVjZfU0NPUEVfTk9ERUxPQ0FMICAgIDQgICAgICAgLyogTG9vcGJhY2suICovCiAKIHVuc2lnbmVkIGludCBDdXJsX2lwdjZfc2NvcGUoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYSk7CiAKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2ltYXAuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2ltYXAuYwppbmRleCBiNTI4Zjc3Li45NTRkMThmIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9pbWFwLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaW1hcC5jCkBAIC02OCw2ICs2OCw3IEBACiAjaW5jbHVkZSAiaHR0cC5oIiAvKiBmb3IgSFRUUCBwcm94eSB0dW5uZWwgc3R1ZmYgKi8KICNpbmNsdWRlICJzb2Nrcy5oIgogI2luY2x1ZGUgImltYXAuaCIKKyNpbmNsdWRlICJtaW1lLmgiCiAjaW5jbHVkZSAic3RydG9vZmZ0LmgiCiAjaW5jbHVkZSAic3RyY2FzZS5oIgogI2luY2x1ZGUgInZ0bHMvdnRscy5oIgpAQCAtMTI4LDYgKzEyOSw3IEBACiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KICAgaW1hcF9kaXNjb25uZWN0LCAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbl9jaGVjayAqLwogICBQT1JUX0lNQVAsICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fSU1BUCwgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9DTE9TRUFDVElPTnwgICAgICAgICAgICAgIC8qIGZsYWdzICovCkBAIC0xNTQsNjkgKzE1NiwyMiBAQAogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIGltYXBfZGlzY29ubmVjdCwgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9JTUFQUywgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX0lNQVBTLCAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfQ0xPU0VBQ1RJT04gfCBQUk9UT1BUX1NTTCAvKiBmbGFncyAqLwogfTsKICNlbmRpZgogCi0jaWZuZGVmIENVUkxfRElTQUJMRV9IVFRQCi0vKgotICogSFRUUC1wcm94eWVkIElNQVAgcHJvdG9jb2wgaGFuZGxlci4KLSAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IEN1cmxfaGFuZGxlciBDdXJsX2hhbmRsZXJfaW1hcF9wcm94eSA9IHsKLSAgIklNQVAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2hlbWUgKi8KLSAgQ3VybF9odHRwX3NldHVwX2Nvbm4sICAgICAgICAgICAgICAgICAvKiBzZXR1cF9jb25uZWN0aW9uICovCi0gIEN1cmxfaHR0cCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9faXQgKi8KLSAgQ3VybF9odHRwX2RvbmUsICAgICAgICAgICAgICAgICAgICAgICAvKiBkb25lICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9fbW9yZSAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3RfaXQgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW5nICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9pbmcgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b19nZXRzb2NrICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9pbmdfZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbW9yZV9nZXRzb2NrICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLwotICBQT1JUX0lNQVAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KLSAgQ1VSTFBST1RPX0hUVFAsICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwotICBQUk9UT1BUX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzICovCi19OwotCi0jaWZkZWYgVVNFX1NTTAotLyoKLSAqIEhUVFAtcHJveHllZCBJTUFQUyBwcm90b2NvbCBoYW5kbGVyLgotICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgQ3VybF9oYW5kbGVyIEN1cmxfaGFuZGxlcl9pbWFwc19wcm94eSA9IHsKLSAgIklNQVBTIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2hlbWUgKi8KLSAgQ3VybF9odHRwX3NldHVwX2Nvbm4sICAgICAgICAgICAgICAgICAvKiBzZXR1cF9jb25uZWN0aW9uICovCi0gIEN1cmxfaHR0cCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9faXQgKi8KLSAgQ3VybF9odHRwX2RvbmUsICAgICAgICAgICAgICAgICAgICAgICAvKiBkb25lICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9fbW9yZSAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3RfaXQgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW5nICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9pbmcgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b19nZXRzb2NrICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9pbmdfZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbW9yZV9nZXRzb2NrICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLwotICBQT1JUX0lNQVBTLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KLSAgQ1VSTFBST1RPX0hUVFAsICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwotICBQUk9UT1BUX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzICovCi19OwotI2VuZGlmCi0jZW5kaWYKKyNkZWZpbmUgSU1BUF9SRVNQX09LICAgICAgIDEKKyNkZWZpbmUgSU1BUF9SRVNQX05PVF9PSyAgIDIKKyNkZWZpbmUgSU1BUF9SRVNQX1BSRUFVVEggIDMKIAogLyogU0FTTCBwYXJhbWV0ZXJzIGZvciB0aGUgaW1hcCBwcm90b2NvbCAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBTQVNMcHJvdG8gc2FzbGltYXAgPSB7CiAgICJpbWFwIiwgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgc2VydmljZSBuYW1lICovCiAgICcrJywgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlIHJlY2VpdmVkIHdoZW4gY29udGludWF0aW9uIGlzIGV4cGVjdGVkICovCi0gICdPJywgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlIHRvIHJlY2VpdmUgdXBvbiBhdXRoZW50aWNhdGlvbiBzdWNjZXNzICovCisgIElNQVBfUkVTUF9PSywgICAgICAgICAgICAgICAvKiBDb2RlIHRvIHJlY2VpdmUgdXBvbiBhdXRoZW50aWNhdGlvbiBzdWNjZXNzICovCiAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGluaXRpYWwgcmVzcG9uc2UgbGVuZ3RoIChubyBtYXgpICovCiAgIGltYXBfcGVyZm9ybV9hdXRoZW50aWNhdGUsICAvKiBTZW5kIGF1dGhlbnRpY2F0aW9uIGNvbW1hbmQgKi8KICAgaW1hcF9jb250aW51ZV9hdXRoZW50aWNhdGUsIC8qIFNlbmQgYXV0aGVudGljYXRpb24gY29udGludWF0aW9uICovCkBAIC0yOTksMTUgKzI1NCwxMSBAQAogICAgIGxlbiAtPSBpZF9sZW4gKyAxOwogCiAgICAgaWYobGVuID49IDIgJiYgIW1lbWNtcChsaW5lLCAiT0siLCAyKSkKLSAgICAgICpyZXNwID0gJ08nOwotICAgIGVsc2UgaWYobGVuID49IDIgJiYgIW1lbWNtcChsaW5lLCAiTk8iLCAyKSkKLSAgICAgICpyZXNwID0gJ04nOwotICAgIGVsc2UgaWYobGVuID49IDMgJiYgIW1lbWNtcChsaW5lLCAiQkFEIiwgMykpCi0gICAgICAqcmVzcCA9ICdCJzsKLSAgICBlbHNlIHsKLSAgICAgIGZhaWxmKGNvbm4tPmRhdGEsICJCYWQgdGFnZ2VkIHJlc3BvbnNlIik7Ci0gICAgICAqcmVzcCA9IC0xOwotICAgIH0KKyAgICAgICpyZXNwID0gSU1BUF9SRVNQX09LOworICAgIGVsc2UgaWYobGVuID49IDcgJiYgIW1lbWNtcChsaW5lLCAiUFJFQVVUSCIsIDcpKQorICAgICAgKnJlc3AgPSBJTUFQX1JFU1BfUFJFQVVUSDsKKyAgICBlbHNlCisgICAgICAqcmVzcCA9IElNQVBfUkVTUF9OT1RfT0s7CiAKICAgICByZXR1cm4gVFJVRTsKICAgfQpAQCAtNjEzLDkgKzU2NCwxMCBAQAogICBzdHJ1Y3QgaW1hcF9jb25uICppbWFwYyA9ICZjb25uLT5wcm90by5pbWFwYzsKICAgc2FzbHByb2dyZXNzIHByb2dyZXNzOwogCi0gIC8qIENoZWNrIHdlIGhhdmUgZW5vdWdoIGRhdGEgdG8gYXV0aGVudGljYXRlIHdpdGggYW5kIGVuZCB0aGUKLSAgICAgY29ubmVjdCBwaGFzZSBpZiB3ZSBkb24ndCAqLwotICBpZighQ3VybF9zYXNsX2Nhbl9hdXRoZW50aWNhdGUoJmltYXBjLT5zYXNsLCBjb25uKSkgeworICAvKiBDaGVjayBpZiBhbHJlYWR5IGF1dGhlbnRpY2F0ZWQgT1IgaWYgdGhlcmUgaXMgZW5vdWdoIGRhdGEgdG8gYXV0aGVudGljYXRlCisgICAgIHdpdGggYW5kIGVuZCB0aGUgY29ubmVjdCBwaGFzZSBpZiB3ZSBkb24ndCAqLworICBpZihpbWFwYy0+cHJlYXV0aCB8fAorICAgICAhQ3VybF9zYXNsX2Nhbl9hdXRoZW50aWNhdGUoJmltYXBjLT5zYXNsLCBjb25uKSkgewogICAgIHN0YXRlKGNvbm4sIElNQVBfU1RPUCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKICAgfQpAQCAtNzU3LDE4ICs3MDksNDggQEAKIHN0YXRpYyBDVVJMY29kZSBpbWFwX3BlcmZvcm1fYXBwZW5kKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubikKIHsKICAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7Ci0gIHN0cnVjdCBJTUFQICppbWFwID0gY29ubi0+ZGF0YS0+cmVxLnByb3RvcDsKKyAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CisgIHN0cnVjdCBJTUFQICppbWFwID0gZGF0YS0+cmVxLnByb3RvcDsKICAgY2hhciAqbWFpbGJveDsKIAogICAvKiBDaGVjayB3ZSBoYXZlIGEgbWFpbGJveCAqLwogICBpZighaW1hcC0+bWFpbGJveCkgewotICAgIGZhaWxmKGNvbm4tPmRhdGEsICJDYW5ub3QgQVBQRU5EIHdpdGhvdXQgYSBtYWlsYm94LiIpOworICAgIGZhaWxmKGRhdGEsICJDYW5ub3QgQVBQRU5EIHdpdGhvdXQgYSBtYWlsYm94LiIpOwogICAgIHJldHVybiBDVVJMRV9VUkxfTUFMRk9STUFUOwogICB9CiAKKyAgLyogUHJlcGFyZSB0aGUgbWltZSBkYXRhIGlmIHNvbWUuICovCisgIGlmKGRhdGEtPnNldC5taW1lcG9zdC5raW5kICE9IE1JTUVLSU5EX05PTkUpIHsKKyAgICAvKiBVc2UgdGhlIHdob2xlIHN0cnVjdHVyZSBhcyBkYXRhLiAqLworICAgIGRhdGEtPnNldC5taW1lcG9zdC5mbGFncyAmPSB+TUlNRV9CT0RZX09OTFk7CisKKyAgICAvKiBBZGQgZXh0ZXJuYWwgaGVhZGVycyBhbmQgbWltZSB2ZXJzaW9uLiAqLworICAgIGN1cmxfbWltZV9oZWFkZXJzKCZkYXRhLT5zZXQubWltZXBvc3QsIGRhdGEtPnNldC5oZWFkZXJzLCAwKTsKKyAgICByZXN1bHQgPSBDdXJsX21pbWVfcHJlcGFyZV9oZWFkZXJzKCZkYXRhLT5zZXQubWltZXBvc3QsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBNSU1FU1RSQVRFR1lfTUFJTCk7CisKKyAgICBpZighcmVzdWx0KQorICAgICAgaWYoIUN1cmxfY2hlY2toZWFkZXJzKGNvbm4sICJNaW1lLVZlcnNpb24iKSkKKyAgICAgICAgcmVzdWx0ID0gQ3VybF9taW1lX2FkZF9oZWFkZXIoJmRhdGEtPnNldC5taW1lcG9zdC5jdXJsaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pbWUtVmVyc2lvbjogMS4wIik7CisKKyAgICAvKiBNYWtlIHN1cmUgd2Ugd2lsbCByZWFkIHRoZSBlbnRpcmUgbWltZSBzdHJ1Y3R1cmUuICovCisgICAgaWYoIXJlc3VsdCkKKyAgICAgIHJlc3VsdCA9IEN1cmxfbWltZV9yZXdpbmQoJmRhdGEtPnNldC5taW1lcG9zdCk7CisKKyAgICBpZihyZXN1bHQpCisgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgZGF0YS0+c3RhdGUuaW5maWxlc2l6ZSA9IEN1cmxfbWltZV9zaXplKCZkYXRhLT5zZXQubWltZXBvc3QpOworCisgICAgLyogUmVhZCBmcm9tIG1pbWUgc3RydWN0dXJlLiAqLworICAgIGRhdGEtPnN0YXRlLmZyZWFkX2Z1bmMgPSAoY3VybF9yZWFkX2NhbGxiYWNrKSBDdXJsX21pbWVfcmVhZDsKKyAgICBkYXRhLT5zdGF0ZS5pbiA9ICh2b2lkICopICZkYXRhLT5zZXQubWltZXBvc3Q7CisgIH0KKwogICAvKiBDaGVjayB3ZSBrbm93IHRoZSBzaXplIG9mIHRoZSB1cGxvYWQgKi8KLSAgaWYoY29ubi0+ZGF0YS0+c3RhdGUuaW5maWxlc2l6ZSA8IDApIHsKLSAgICBmYWlsZihjb25uLT5kYXRhLCAiQ2Fubm90IEFQUEVORCB3aXRoIHVua25vd24gaW5wdXQgZmlsZSBzaXplXG4iKTsKKyAgaWYoZGF0YS0+c3RhdGUuaW5maWxlc2l6ZSA8IDApIHsKKyAgICBmYWlsZihkYXRhLCAiQ2Fubm90IEFQUEVORCB3aXRoIHVua25vd24gaW5wdXQgZmlsZSBzaXplXG4iKTsKICAgICByZXR1cm4gQ1VSTEVfVVBMT0FEX0ZBSUxFRDsKICAgfQogCkBAIC03NzksNyArNzYxLDcgQEAKIAogICAvKiBTZW5kIHRoZSBBUFBFTkQgY29tbWFuZCAqLwogICByZXN1bHQgPSBpbWFwX3NlbmRmKGNvbm4sICJBUFBFTkQgJXMgKFxcU2VlbikgeyUiIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgIn0iLAotICAgICAgICAgICAgICAgICAgICAgIG1haWxib3gsIGNvbm4tPmRhdGEtPnN0YXRlLmluZmlsZXNpemUpOworICAgICAgICAgICAgICAgICAgICAgIG1haWxib3gsIGRhdGEtPnN0YXRlLmluZmlsZXNpemUpOwogCiAgIGZyZWUobWFpbGJveCk7CiAKQEAgLTgzOSwxOSArODIxLDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFwY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hcHN0YXRlIGluc3RhdGUpCiB7Ci0gIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOwogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKLQogICAodm9pZClpbnN0YXRlOyAvKiBubyB1c2UgZm9yIHRoaXMgeWV0ICovCiAKLSAgaWYoaW1hcGNvZGUgIT0gJ08nKSB7Ci0gICAgZmFpbGYoZGF0YSwgIkdvdCB1bmV4cGVjdGVkIGltYXAtc2VydmVyIHJlc3BvbnNlIik7Ci0gICAgcmVzdWx0ID0gQ1VSTEVfV0VJUkRfU0VSVkVSX1JFUExZOworICBpZihpbWFwY29kZSA9PSBJTUFQX1JFU1BfUFJFQVVUSCkgeworICAgIC8qIFBSRUFVVEggKi8KKyAgICBzdHJ1Y3QgaW1hcF9jb25uICppbWFwYyA9ICZjb25uLT5wcm90by5pbWFwYzsKKyAgICBpbWFwYy0+cHJlYXV0aCA9IFRSVUU7CisgICAgaW5mb2YoZGF0YSwgIlBSRUFVVEggY29ubmVjdGlvbiwgYWxyZWFkeSBhdXRoZW50aWNhdGVkIVxuIik7CiAgIH0KLSAgZWxzZQotICAgIHJlc3VsdCA9IGltYXBfcGVyZm9ybV9jYXBhYmlsaXR5KGNvbm4pOworICBlbHNlIGlmKGltYXBjb2RlICE9IElNQVBfUkVTUF9PSykgeworICAgIGZhaWxmKGRhdGEsICJHb3QgdW5leHBlY3RlZCBpbWFwLXNlcnZlciByZXNwb25zZSIpOworICAgIHJldHVybiBDVVJMRV9XRUlSRF9TRVJWRVJfUkVQTFk7CisgIH0KIAotICByZXR1cm4gcmVzdWx0OworICByZXR1cm4gaW1hcF9wZXJmb3JtX2NhcGFiaWxpdHkoY29ubik7CiB9CiAKIC8qIEZvciBDQVBBQklMSVRZIHJlc3BvbnNlcyAqLwpAQCAtOTE4LDcgKzkwMiw3IEBACiAgICAgICBsaW5lICs9IHdvcmRsZW47CiAgICAgfQogICB9Ci0gIGVsc2UgaWYoaW1hcGNvZGUgPT0gJ08nKSB7CisgIGVsc2UgaWYoaW1hcGNvZGUgPT0gSU1BUF9SRVNQX09LKSB7CiAgICAgaWYoZGF0YS0+c2V0LnVzZV9zc2wgJiYgIWNvbm4tPnNzbFtGSVJTVFNPQ0tFVF0udXNlKSB7CiAgICAgICAvKiBXZSBkb24ndCBoYXZlIGEgU1NML1RMUyBjb25uZWN0aW9uIHlldCwgYnV0IFNTTCBpcyByZXF1ZXN0ZWQgKi8KICAgICAgIGlmKGltYXBjLT50bHNfc3VwcG9ydGVkKQpAQCAtOTUxLDcgKzkzNSw3IEBACiAKICAgKHZvaWQpaW5zdGF0ZTsgLyogbm8gdXNlIGZvciB0aGlzIHlldCAqLwogCi0gIGlmKGltYXBjb2RlICE9ICdPJykgeworICBpZihpbWFwY29kZSAhPSBJTUFQX1JFU1BfT0spIHsKICAgICBpZihkYXRhLT5zZXQudXNlX3NzbCAhPSBDVVJMVVNFU1NMX1RSWSkgewogICAgICAgZmFpbGYoZGF0YSwgIlNUQVJUVExTIGRlbmllZCIpOwogICAgICAgcmVzdWx0ID0gQ1VSTEVfVVNFX1NTTF9GQUlMRUQ7CkBAIC0xMDA5LDcgKzk5Myw3IEBACiAKICAgKHZvaWQpaW5zdGF0ZTsgLyogbm8gdXNlIGZvciB0aGlzIHlldCAqLwogCi0gIGlmKGltYXBjb2RlICE9ICdPJykgeworICBpZihpbWFwY29kZSAhPSBJTUFQX1JFU1BfT0spIHsKICAgICBmYWlsZihkYXRhLCAiQWNjZXNzIGRlbmllZC4gJWMiLCBpbWFwY29kZSk7CiAgICAgcmVzdWx0ID0gQ1VSTEVfTE9HSU5fREVOSUVEOwogICB9CkBAIC0xMDM3LDcgKzEwMjEsNyBAQAogICAgIHJlc3VsdCA9IEN1cmxfY2xpZW50X3dyaXRlKGNvbm4sIENMSUVOVFdSSVRFX0JPRFksIGxpbmUsIGxlbiArIDEpOwogICAgIGxpbmVbbGVuXSA9ICdcMCc7CiAgIH0KLSAgZWxzZSBpZihpbWFwY29kZSAhPSAnTycpCisgIGVsc2UgaWYoaW1hcGNvZGUgIT0gSU1BUF9SRVNQX09LKQogICAgIHJlc3VsdCA9IENVUkxFX1FVT1RFX0VSUk9SOyAvKiBUT0RPOiBGaXggZXJyb3IgY29kZSAqLwogICBlbHNlCiAgICAgLyogRW5kIG9mIERPIHBoYXNlICovCkBAIC0xMDY2LDcgKzEwNTAsNyBAQAogICAgICAgaW1hcGMtPm1haWxib3hfdWlkdmFsaWRpdHkgPSBzdHJkdXAodG1wKTsKICAgICB9CiAgIH0KLSAgZWxzZSBpZihpbWFwY29kZSA9PSAnTycpIHsKKyAgZWxzZSBpZihpbWFwY29kZSA9PSBJTUFQX1JFU1BfT0spIHsKICAgICAvKiBDaGVjayBpZiB0aGUgVUlEVkFMSURJVFkgaGFzIGJlZW4gc3BlY2lmaWVkIGFuZCBtYXRjaGVzICovCiAgICAgaWYoaW1hcC0+dWlkdmFsaWRpdHkgJiYgaW1hcGMtPm1haWxib3hfdWlkdmFsaWRpdHkgJiYKICAgICAgICBzdHJjbXAoaW1hcC0+dWlkdmFsaWRpdHksIGltYXBjLT5tYWlsYm94X3VpZHZhbGlkaXR5KSkgewpAQCAtMTEyMCwxMCArMTEwNCwxMSBAQAogCiAgIGlmKCpwdHIgPT0gJ3snKSB7CiAgICAgY2hhciAqZW5kcHRyOwotICAgIHNpemUgPSBjdXJseF9zdHJ0b29mZnQocHRyICsgMSwgJmVuZHB0ciwgMTApOwotICAgIGlmKGVuZHB0ciAtIHB0ciA+IDEgJiYgZW5kcHRyWzBdID09ICd9JyAmJgotICAgICAgIGVuZHB0clsxXSA9PSAnXHInICYmIGVuZHB0clsyXSA9PSAnXDAnKQotICAgICAgcGFyc2VkID0gVFJVRTsKKyAgICBpZighY3VybHhfc3RydG9vZmZ0KHB0ciArIDEsICZlbmRwdHIsIDEwLCAmc2l6ZSkpIHsKKyAgICAgIGlmKGVuZHB0ciAtIHB0ciA+IDEgJiYgZW5kcHRyWzBdID09ICd9JyAmJgorICAgICAgICAgZW5kcHRyWzFdID09ICdccicgJiYgZW5kcHRyWzJdID09ICdcMCcpCisgICAgICAgIHBhcnNlZCA9IFRSVUU7CisgICAgfQogICB9CiAKICAgaWYocGFyc2VkKSB7CkBAIC0xMTk3LDcgKzExODIsNyBAQAogCiAgICh2b2lkKWluc3RhdGU7IC8qIE5vIHVzZSBmb3IgdGhpcyB5ZXQgKi8KIAotICBpZihpbWFwY29kZSAhPSAnTycpCisgIGlmKGltYXBjb2RlICE9IElNQVBfUkVTUF9PSykKICAgICByZXN1bHQgPSBDVVJMRV9XRUlSRF9TRVJWRVJfUkVQTFk7CiAgIGVsc2UKICAgICAvKiBFbmQgb2YgRE9ORSBwaGFzZSAqLwpAQCAtMTI0MSw3ICsxMjI2LDcgQEAKIAogICAodm9pZClpbnN0YXRlOyAvKiBObyB1c2UgZm9yIHRoaXMgeWV0ICovCiAKLSAgaWYoaW1hcGNvZGUgIT0gJ08nKQorICBpZihpbWFwY29kZSAhPSBJTUFQX1JFU1BfT0spCiAgICAgcmVzdWx0ID0gQ1VSTEVfVVBMT0FEX0ZBSUxFRDsKICAgZWxzZQogICAgIC8qIEVuZCBvZiBET05FIHBoYXNlICovCkBAIC0xNDY5LDkgKzE0NTQsMTAgQEAKICAgICByZXN1bHQgPSBzdGF0dXM7ICAgICAgICAgLyogdXNlIHRoZSBhbHJlYWR5IHNldCBlcnJvciBjb2RlICovCiAgIH0KICAgZWxzZSBpZighZGF0YS0+c2V0LmNvbm5lY3Rfb25seSAmJiAhaW1hcC0+Y3VzdG9tICYmCi0gICAgICAgICAgKGltYXAtPnVpZCB8fCBkYXRhLT5zZXQudXBsb2FkKSkgeworICAgICAgICAgIChpbWFwLT51aWQgfHwgZGF0YS0+c2V0LnVwbG9hZCB8fAorICAgICAgICAgIGRhdGEtPnNldC5taW1lcG9zdC5raW5kICE9IE1JTUVLSU5EX05PTkUpKSB7CiAgICAgLyogSGFuZGxlIHJlc3BvbnNlcyBhZnRlciBGRVRDSCBvciBBUFBFTkQgdHJhbnNmZXIgaGFzIGZpbmlzaGVkICovCi0gICAgaWYoIWRhdGEtPnNldC51cGxvYWQpCisgICAgaWYoIWRhdGEtPnNldC51cGxvYWQgJiYgZGF0YS0+c2V0Lm1pbWVwb3N0LmtpbmQgPT0gTUlNRUtJTkRfTk9ORSkKICAgICAgIHN0YXRlKGNvbm4sIElNQVBfRkVUQ0hfRklOQUwpOwogICAgIGVsc2UgewogICAgICAgLyogRW5kIHRoZSBBUFBFTkQgY29tbWFuZCBmaXJzdCBieSBzZW5kaW5nIGFuIGVtcHR5IGxpbmUgKi8KQEAgLTE1NDEsNyArMTUyNyw3IEBACiAgICAgc2VsZWN0ZWQgPSBUUlVFOwogCiAgIC8qIFN0YXJ0IHRoZSBmaXJzdCBjb21tYW5kIGluIHRoZSBETyBwaGFzZSAqLwotICBpZihjb25uLT5kYXRhLT5zZXQudXBsb2FkKQorICBpZihjb25uLT5kYXRhLT5zZXQudXBsb2FkIHx8IGRhdGEtPnNldC5taW1lcG9zdC5raW5kICE9IE1JTUVLSU5EX05PTkUpCiAgICAgLyogQVBQRU5EIGNhbiBiZSBleGVjdXRlZCBkaXJlY3RseSAqLwogICAgIHJlc3VsdCA9IGltYXBfcGVyZm9ybV9hcHBlbmQoY29ubik7CiAgIGVsc2UgaWYoaW1hcC0+Y3VzdG9tICYmIChzZWxlY3RlZCB8fCAhaW1hcC0+bWFpbGJveCkpCkBAIC0xNzE1LDMxICsxNzAxLDYgQEAKIAogICAvKiBDbGVhciB0aGUgVExTIHVwZ3JhZGVkIGZsYWcgKi8KICAgY29ubi0+dGxzX3VwZ3JhZGVkID0gRkFMU0U7Ci0KLSAgLyogU2V0IHVwIHRoZSBwcm94eSBpZiBuZWNlc3NhcnkgKi8KLSAgaWYoY29ubi0+Yml0cy5odHRwcHJveHkgJiYgIWRhdGEtPnNldC50dW5uZWxfdGhydV9odHRwcHJveHkpIHsKLSAgICAvKiBVbmxlc3Mgd2UgaGF2ZSBhc2tlZCB0byB0dW5uZWwgSU1BUCBvcGVyYXRpb25zIHRocm91Z2ggdGhlIHByb3h5LCB3ZQotICAgICAgIHN3aXRjaCBhbmQgdXNlIEhUVFAgb3BlcmF0aW9ucyBvbmx5ICovCi0jaWZuZGVmIENVUkxfRElTQUJMRV9IVFRQCi0gICAgaWYoY29ubi0+aGFuZGxlciA9PSAmQ3VybF9oYW5kbGVyX2ltYXApCi0gICAgICBjb25uLT5oYW5kbGVyID0gJkN1cmxfaGFuZGxlcl9pbWFwX3Byb3h5OwotICAgIGVsc2UgewotI2lmZGVmIFVTRV9TU0wKLSAgICAgIGNvbm4tPmhhbmRsZXIgPSAmQ3VybF9oYW5kbGVyX2ltYXBzX3Byb3h5OwotI2Vsc2UKLSAgICAgIGZhaWxmKGRhdGEsICJJTUFQUyBub3Qgc3VwcG9ydGVkISIpOwotICAgICAgcmV0dXJuIENVUkxFX1VOU1VQUE9SVEVEX1BST1RPQ09MOwotI2VuZGlmCi0gICAgfQotCi0gICAgLyogc2V0IGl0IHVwIGFzIGFuIEhUVFAgY29ubmVjdGlvbiBpbnN0ZWFkICovCi0gICAgcmV0dXJuIGNvbm4tPmhhbmRsZXItPnNldHVwX2Nvbm5lY3Rpb24oY29ubik7Ci0jZWxzZQotICAgIGZhaWxmKGRhdGEsICJJTUFQIG92ZXIgaHR0cCBwcm94eSByZXF1aXJlcyBIVFRQIHN1cHBvcnQgYnVpbHQtaW4hIik7Ci0gICAgcmV0dXJuIENVUkxFX1VOU1VQUE9SVEVEX1BST1RPQ09MOwotI2VuZGlmCi0gIH0KLQogICBkYXRhLT5zdGF0ZS5wYXRoKys7ICAgLyogZG9uJ3QgaW5jbHVkZSB0aGUgaW5pdGlhbCBzbGFzaCAqLwogCiAgIHJldHVybiBDVVJMRV9PSzsKQEAgLTE4MzYsNyArMTc5Nyw3IEBACiAgICAgcmV0dXJuIHN0cmR1cChzdHIpOwogCiAgIC8qIENhbGN1bGF0ZSB0aGUgbmV3IHN0cmluZyBsZW5ndGggKi8KLSAgbmV3bGVuID0gc3RybGVuKHN0cikgKyBiYWNrc3BfY291bnQgKyBxdW90ZV9jb3VudCArIChvdGhlcnNfZXhpc3RzID8gMiA6IDApOworICBuZXdsZW4gPSBzdHJsZW4oc3RyKSArIGJhY2tzcF9jb3VudCArIHF1b3RlX2NvdW50ICsgKGVzY2FwZV9vbmx5ID8gMCA6IDIpOwogCiAgIC8qIEFsbG9jYXRlIHRoZSBuZXcgc3RyaW5nICovCiAgIG5ld3N0ciA9IChjaGFyICopIG1hbGxvYygobmV3bGVuICsgMSkgKiBzaXplb2YoY2hhcikpOwpAQCAtMTg0NSw3ICsxODA2LDcgQEAKIAogICAvKiBTdXJyb3VuZCB0aGUgc3RyaW5nIGluIHF1b3RlcyBpZiBuZWNlc3NhcnkgKi8KICAgcDIgPSBuZXdzdHI7Ci0gIGlmKG90aGVyc19leGlzdHMpIHsKKyAgaWYoIWVzY2FwZV9vbmx5KSB7CiAgICAgbmV3c3RyWzBdID0gJyInOwogICAgIG5ld3N0cltuZXdsZW4gLSAxXSA9ICciJzsKICAgICBwMisrOwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaW1hcC5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvaW1hcC5oCmluZGV4IDVlMGUyMjguLjlmYzRmZjUgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2ltYXAuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9pbWFwLmgKQEAgLTcsNyArNyw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA5IC0gMjAxNSwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTcxLDYgKzcxLDcgQEAKICAgc3RydWN0IHBpbmdwb25nIHBwOwogICBpbWFwc3RhdGUgc3RhdGU7ICAgICAgICAgICAgLyogQWx3YXlzIHVzZSBpbWFwLmM6c3RhdGUoKSB0byBjaGFuZ2Ugc3RhdGUhICovCiAgIGJvb2wgc3NsZG9uZTsgICAgICAgICAgICAgICAvKiBJcyBjb25uZWN0KCkgb3ZlciBTU0wgZG9uZT8gKi8KKyAgYm9vbCBwcmVhdXRoOyAgICAgICAgICAgICAgIC8qIElzIHRoaXMgY29ubmVjdGlvbiBQUkVBVVRIPyAqLwogICBzdHJ1Y3QgU0FTTCBzYXNsOyAgICAgICAgICAgLyogU0FTTC1yZWxhdGVkIHBhcmFtZXRlcnMgKi8KICAgdW5zaWduZWQgaW50IHByZWZ0eXBlOyAgICAgIC8qIFByZWZlcnJlZCBhdXRoZW50aWNhdGlvbiB0eXBlICovCiAgIGludCBjbWRpZDsgICAgICAgICAgICAgICAgICAvKiBMYXN0IHVzZWQgY29tbWFuZCBJRCAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaW5ldF9udG9wLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9pbmV0X250b3AuYwppbmRleCA5YWZiZGJiLi5mYjkxYTUwIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9pbmV0X250b3AuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9pbmV0X250b3AuYwpAQCAtNjMsNyArNjMsNyBAQAogCiAgIGxlbiA9IHN0cmxlbih0bXApOwogICBpZihsZW4gPT0gMCB8fCBsZW4gPj0gc2l6ZSkgewotICAgIFNFVF9FUlJOTyhFTk9TUEMpOworICAgIGVycm5vID0gRU5PU1BDOwogICAgIHJldHVybiAoTlVMTCk7CiAgIH0KICAgc3RyY3B5KGRzdCwgdG1wKTsKQEAgLTE0MSw4ICsxNDEsOCBAQAogICAgICAqLwogICAgIGlmKGkgPT0gNiAmJiBiZXN0LmJhc2UgPT0gMCAmJgogICAgICAgICAoYmVzdC5sZW4gPT0gNiB8fCAoYmVzdC5sZW4gPT0gNSAmJiB3b3Jkc1s1XSA9PSAweGZmZmYpKSkgewotICAgICAgaWYoIWluZXRfbnRvcDQoc3JjKzEyLCB0cCwgc2l6ZW9mKHRtcCkgLSAodHAgLSB0bXApKSkgewotICAgICAgICBTRVRfRVJSTk8oRU5PU1BDKTsKKyAgICAgIGlmKCFpbmV0X250b3A0KHNyYyArIDEyLCB0cCwgc2l6ZW9mKHRtcCkgLSAodHAgLSB0bXApKSkgeworICAgICAgICBlcnJubyA9IEVOT1NQQzsKICAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgICAgIH0KICAgICAgIHRwICs9IHN0cmxlbih0cCk7CkBAIC0xNjAsNyArMTYwLDcgQEAKICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93LCBjb3B5LCBhbmQgd2UncmUgZG9uZS4KICAgICovCiAgIGlmKChzaXplX3QpKHRwIC0gdG1wKSA+IHNpemUpIHsKLSAgICBTRVRfRVJSTk8oRU5PU1BDKTsKKyAgICBlcnJubyA9IEVOT1NQQzsKICAgICByZXR1cm4gKE5VTEwpOwogICB9CiAgIHN0cmNweShkc3QsIHRtcCk7CkBAIC0xNzcsOCArMTc3LDggQEAKICAqCiAgKiBPbiBXaW5kb3dzIHdlIHN0b3JlIHRoZSBlcnJvciBpbiB0aGUgdGhyZWFkIGVycm5vLCBub3QKICAqIGluIHRoZSB3aW5zb2NrIGVycm9yIGNvZGUuIFRoaXMgaXMgdG8gYXZvaWQgbG9zaW5nIHRoZQotICogYWN0dWFsIGxhc3Qgd2luc29jayBlcnJvci4gU28gdXNlIG1hY3JvIEVSUk5PIHRvIGZldGNoIHRoZQotICogZXJybm8gdGhpcyBmdW5jdGlvbiBzZXRzIHdoZW4gcmV0dXJuaW5nIE5VTEwsIG5vdCBTT0NLRVJSTk8uCisgKiBhY3R1YWwgbGFzdCB3aW5zb2NrIGVycm9yLiBTbyB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucworICogTlVMTCwgY2hlY2sgZXJybm8gbm90IFNPQ0tFUlJOTy4KICAqLwogY2hhciAqQ3VybF9pbmV0X250b3AoaW50IGFmLCBjb25zdCB2b2lkICpzcmMsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CkBAIC0xOTAsNyArMTkwLDcgQEAKICAgICByZXR1cm4gaW5ldF9udG9wNigoY29uc3QgdW5zaWduZWQgY2hhciAqKXNyYywgYnVmLCBzaXplKTsKICNlbmRpZgogICBkZWZhdWx0OgotICAgIFNFVF9FUlJOTyhFQUZOT1NVUFBPUlQpOworICAgIGVycm5vID0gRUFGTk9TVVBQT1JUOwogICAgIHJldHVybiBOVUxMOwogICB9CiB9CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9pbmV0X3B0b24uYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2luZXRfcHRvbi5jCmluZGV4IDQ3NWY0NGEuLmZlZjk2MTAgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2luZXRfcHRvbi5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2luZXRfcHRvbi5jCkBAIC01Nyw4ICs1Nyw4IEBACiAgKiBub3RpY2U6CiAgKiAgICAgIE9uIFdpbmRvd3Mgd2Ugc3RvcmUgdGhlIGVycm9yIGluIHRoZSB0aHJlYWQgZXJybm8sIG5vdAogICogICAgICBpbiB0aGUgd2luc29jayBlcnJvciBjb2RlLiBUaGlzIGlzIHRvIGF2b2lkIGxvc2luZyB0aGUKLSAqICAgICAgYWN0dWFsIGxhc3Qgd2luc29jayBlcnJvci4gU28gdXNlIG1hY3JvIEVSUk5PIHRvIGZldGNoIHRoZQotICogICAgICBlcnJubyB0aGlzIGZ1bmN0aW9uIHNldHMgd2hlbiByZXR1cm5pbmcgKC0xKSwgbm90IFNPQ0tFUlJOTy4KKyAqICAgICAgYWN0dWFsIGxhc3Qgd2luc29jayBlcnJvci4gU28gd2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKyAqICAgICAgLTEsIGNoZWNrIGVycm5vIG5vdCBTT0NLRVJSTk8uCiAgKiBhdXRob3I6CiAgKiAgICAgIFBhdWwgVml4aWUsIDE5OTYuCiAgKi8KQEAgLTczLDcgKzczLDcgQEAKICAgICByZXR1cm4gKGluZXRfcHRvbjYoc3JjLCAodW5zaWduZWQgY2hhciAqKWRzdCkpOwogI2VuZGlmCiAgIGRlZmF1bHQ6Ci0gICAgU0VUX0VSUk5PKEVBRk5PU1VQUE9SVCk7CisgICAgZXJybm8gPSBFQUZOT1NVUFBPUlQ7CiAgICAgcmV0dXJuICgtMSk7CiAgIH0KICAgLyogTk9UUkVBQ0hFRCAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvaW5ldF9wdG9uLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9pbmV0X3B0b24uaAppbmRleCA5MTg4ZDk1Li5lMjE2ZjRlIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9pbmV0X3B0b24uaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9pbmV0X3B0b24uaApAQCAtNyw3ICs3LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDA1LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtMjksNiArMjksOSBAQAogI2lmZGVmIEhBVkVfSU5FVF9QVE9OCiAjaWZkZWYgSEFWRV9BUlBBX0lORVRfSAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2VsaWYgZGVmaW5lZChIQVZFX1dTMlRDUElQX0gpCisvKiBpbmV0X3B0b24oKSBleGlzdHMgaW4gVmlzdGEgb3IgbGF0ZXIgKi8KKyNpbmNsdWRlIDx3czJ0Y3BpcC5oPgogI2VuZGlmCiAjZGVmaW5lIEN1cmxfaW5ldF9wdG9uKHgseSx6KSBpbmV0X3B0b24oeCx5LHopCiAjZW5kaWYKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL2tyYjUuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2tyYjUuYwppbmRleCA2OWEzNTk3Li5hZjI1ZTkyIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9rcmI1LmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIva3JiNS5jCkBAIC0xLDYgKzEsNiBAQAogLyogR1NTQVBJL2tyYjUgc3VwcG9ydCBmb3IgRlRQIC0gbG9vc2VseSBiYXNlZCBvbiBvbGQga3JiNC5jCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEt1bmdsaWdhIFRla25pc2thIEj2Z3Nrb2xhbgorICogQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEt1bmdsaWdhIFRla25pc2thIEjDtmdza29sYW4KICAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgogICogQ29weXJpZ2h0IChjKSAyMDA0IC0gMjAxNiBEYW5pZWwgU3RlbmJlcmcKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9sZGFwLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9sZGFwLmMKaW5kZXggNzllODRkOS4uMDQwNjQxYyAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvbGRhcC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL2xkYXAuYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtMTUwLDYgKzE1MCw3IEBACiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9MREFQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCiAgIENVUkxQUk9UT19MREFQLCAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFncyAqLwpAQCAtMTc1LDYgKzE3Niw3IEBACiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9MREFQUywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCiAgIENVUkxQUk9UT19MREFQUywgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9TU0wgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFncyAqLwpAQCAtMjMzLDcgKzIzNSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXNlciwgY29uc3QgY2hhciAqcGFzc3dkKQogewogICBpbnQgcmMgPSBMREFQX0lOVkFMSURfQ1JFREVOVElBTFM7Ci0gIFVMT05HIG1ldGhvZCA9IExEQVBfQVVUSF9TSU1QTEU7CiAKICAgUFRDSEFSIGludXNlciA9IE5VTEw7CiAgIFBUQ0hBUiBpbnBhc3MgPSBOVUxMOwpAQCAtMjQyLDcgKzI0Myw3IEBACiAgICAgaW51c2VyID0gQ3VybF9jb252ZXJ0X1VURjhfdG9fdGNoYXIoKGNoYXIgKikgdXNlcik7CiAgICAgaW5wYXNzID0gQ3VybF9jb252ZXJ0X1VURjhfdG9fdGNoYXIoKGNoYXIgKikgcGFzc3dkKTsKIAotICAgIHJjID0gbGRhcF9iaW5kX3Moc2VydmVyLCBpbnVzZXIsIGlucGFzcywgbWV0aG9kKTsKKyAgICByYyA9IGxkYXBfc2ltcGxlX2JpbmRfcyhzZXJ2ZXIsIGludXNlciwgaW5wYXNzKTsKIAogICAgIEN1cmxfdW5pY29kZWZyZWUoaW51c2VyKTsKICAgICBDdXJsX3VuaWNvZGVmcmVlKGlucGFzcyk7CkBAIC0yNjYsNyArMjY3LDcgQEAKICAgTERBUE1lc3NhZ2UgKmxkYXBtc2cgPSBOVUxMOwogICBMREFQTWVzc2FnZSAqZW50cnlJdGVyYXRvcjsKICAgaW50IG51bSA9IDA7Ci0gIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGE9Y29ubi0+ZGF0YTsKKyAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIGludCBsZGFwX3Byb3RvID0gTERBUF9WRVJTSU9OMzsKICAgaW50IGxkYXBfc3NsID0gMDsKICAgY2hhciAqdmFsX2I2NCA9IE5VTEw7CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9tZW1kZWJ1Zy5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvbWVtZGVidWcuYwppbmRleCAyYjg4MDhhLi4wZWIyNDljIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9tZW1kZWJ1Zy5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL21lbWRlYnVnLmMKQEAgLTExNSw3ICsxMTUsOCBAQAogICAgICAgbG9nZmlsZSA9IHN0ZGVycjsKICNpZmRlZiBNRU1ERUJVR19MT0dfU1lOQwogICAgIC8qIEZsdXNoIHRoZSBsb2cgZmlsZSBhZnRlciBldmVyeSBsaW5lIHNvIHRoZSBsb2cgaXNuJ3QgbG9zdCBpbiBhIGNyYXNoICovCi0gICAgc2V0YnVmKGxvZ2ZpbGUsIChjaGFyICopTlVMTCk7CisgICAgaWYobG9nZmlsZSkKKyAgICAgIHNldGJ1Zihsb2dmaWxlLCAoY2hhciAqKU5VTEwpOwogI2VuZGlmCiAgIH0KIH0KQEAgLTE0Niw3ICsxNDcsNyBAQAogICAgICAgICAgICAgICAgIHNvdXJjZSwgbGluZSwgZnVuYyk7CiAgICAgICAgIGZmbHVzaChsb2dmaWxlKTsgLyogYmVjYXVzZSBpdCBtaWdodCBjcmFzaCBub3cgKi8KICAgICAgIH0KLSAgICAgIFNFVF9FUlJOTyhFTk9NRU0pOworICAgICAgZXJybm8gPSBFTk9NRU07CiAgICAgICByZXR1cm4gVFJVRTsgLyogUkVUVVJOIEVSUk9SISAqLwogICAgIH0KICAgICBlbHNlCkBAIC0xNjksNyArMTcwLDcgQEAKICAgICByZXR1cm4gTlVMTDsKIAogICAvKiBhbGxvYyBhdCBsZWFzdCA2NCBieXRlcyAqLwotICBzaXplID0gc2l6ZW9mKHN0cnVjdCBtZW1kZWJ1Zykrd2FudGVkc2l6ZTsKKyAgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbWVtZGVidWcpICsgd2FudGVkc2l6ZTsKIAogICBtZW0gPSAoQ3VybF9jbWFsbG9jKShzaXplKTsKICAgaWYobWVtKSB7CkBAIC0yMjQsOSArMjI1LDkgQEAKICAgaWYoY291bnRjaGVjaygic3RyZHVwIiwgbGluZSwgc291cmNlKSkKICAgICByZXR1cm4gTlVMTDsKIAotICBsZW49c3RybGVuKHN0cikrMTsKKyAgbGVuID0gc3RybGVuKHN0cikgKyAxOwogCi0gIG1lbT1jdXJsX2RvbWFsbG9jKGxlbiwgMCwgTlVMTCk7IC8qIE5VTEwgcHJldmVudHMgbG9nZ2luZyAqLworICBtZW0gPSBjdXJsX2RvbWFsbG9jKGxlbiwgMCwgTlVMTCk7IC8qIE5VTEwgcHJldmVudHMgbG9nZ2luZyAqLwogICBpZihtZW0pCiAgICAgbWVtY3B5KG1lbSwgc3RyLCBsZW4pOwogCkBAIC0yNjgsOSArMjY5LDkgQEAKIHZvaWQgKmN1cmxfZG9yZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IHdhbnRlZHNpemUsCiAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSwgY29uc3QgY2hhciAqc291cmNlKQogewotICBzdHJ1Y3QgbWVtZGVidWcgKm1lbT1OVUxMOworICBzdHJ1Y3QgbWVtZGVidWcgKm1lbSA9IE5VTEw7CiAKLSAgc2l6ZV90IHNpemUgPSBzaXplb2Yoc3RydWN0IG1lbWRlYnVnKSt3YW50ZWRzaXplOworICBzaXplX3Qgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbWVtZGVidWcpICsgd2FudGVkc2l6ZTsKIAogICBERUJVR0FTU0VSVCh3YW50ZWRzaXplICE9IDApOwogCkBAIC00MDYsNyArNDA3LDcgQEAKIC8qIHRoaXMgaXMgb3VyIG93biBkZWZpbmVkIHdheSB0byBjbG9zZSBzb2NrZXRzIG9uICpBTEwqIHBsYXRmb3JtcyAqLwogaW50IGN1cmxfc2Nsb3NlKGN1cmxfc29ja2V0X3Qgc29ja2ZkLCBpbnQgbGluZSwgY29uc3QgY2hhciAqc291cmNlKQogewotICBpbnQgcmVzPXNjbG9zZShzb2NrZmQpOworICBpbnQgcmVzID0gc2Nsb3NlKHNvY2tmZCk7CiAgIGN1cmxfbWFya19zY2xvc2Uoc29ja2ZkLCBsaW5lLCBzb3VyY2UpOwogICByZXR1cm4gcmVzOwogfQpAQCAtNDE0LDcgKzQxNSw3IEBACiBGSUxFICpjdXJsX2ZvcGVuKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm1vZGUsCiAgICAgICAgICAgICAgICAgIGludCBsaW5lLCBjb25zdCBjaGFyICpzb3VyY2UpCiB7Ci0gIEZJTEUgKnJlcz1mb3BlbihmaWxlLCBtb2RlKTsKKyAgRklMRSAqcmVzID0gZm9wZW4oZmlsZSwgbW9kZSk7CiAKICAgaWYoc291cmNlKQogICAgIGN1cmxfbWVtbG9nKCJGSUxFICVzOiVkIGZvcGVuKFwiJXNcIixcIiVzXCIpID0gJXBcbiIsCkBAIC00MjcsNyArNDI4LDcgQEAKIEZJTEUgKmN1cmxfZmRvcGVuKGludCBmaWxlZGVzLCBjb25zdCBjaGFyICptb2RlLAogICAgICAgICAgICAgICAgICAgaW50IGxpbmUsIGNvbnN0IGNoYXIgKnNvdXJjZSkKIHsKLSAgRklMRSAqcmVzPWZkb3BlbihmaWxlZGVzLCBtb2RlKTsKKyAgRklMRSAqcmVzID0gZmRvcGVuKGZpbGVkZXMsIG1vZGUpOwogCiAgIGlmKHNvdXJjZSkKICAgICBjdXJsX21lbWxvZygiRklMRSAlczolZCBmZG9wZW4oXCIlZFwiLFwiJXNcIikgPSAlcFxuIiwKQEAgLTQ0Myw3ICs0NDQsNyBAQAogCiAgIERFQlVHQVNTRVJUKGZpbGUgIT0gTlVMTCk7CiAKLSAgcmVzPWZjbG9zZShmaWxlKTsKKyAgcmVzID0gZmNsb3NlKGZpbGUpOwogCiAgIGlmKHNvdXJjZSkKICAgICBjdXJsX21lbWxvZygiRklMRSAlczolZCBmY2xvc2UoJXApXG4iLApkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvbWltZS5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvbWltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NmY1ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9taW1lLmMKQEAgLTAsMCArMSwxODYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfICAgXyBfX19fICBfCisgKiAgUHJvamVjdCAgICAgICAgICAgICAgICAgICAgIF9fX3wgfCB8IHwgIF8gXHwgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gX198IHwgfCB8IHxfKSB8IHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCisgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCisgKiBhcmUgYWxzbyBhdmFpbGFibGUgYXQgaHR0cHM6Ly9jdXJsLmhheHguc2UvZG9jcy9jb3B5cmlnaHQuaHRtbC4KKyAqCisgKiBZb3UgbWF5IG9wdCB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENPUFlJTkcgZmlsZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJjdXJsX3NldHVwLmgiCisKKyNpbmNsdWRlIDxjdXJsL2N1cmwuaD4KKworI2luY2x1ZGUgIm1pbWUuaCIKKyNpbmNsdWRlICJub24tYXNjaWkuaCIKKworI2lmICFkZWZpbmVkKENVUkxfRElTQUJMRV9IVFRQKSB8fCAhZGVmaW5lZChDVVJMX0RJU0FCTEVfU01UUCkgfHwgXAorICAgICFkZWZpbmVkKENVUkxfRElTQUJMRV9JTUFQKQorCisjaWYgZGVmaW5lZChIQVZFX0xJQkdFTl9IKSAmJiBkZWZpbmVkKEhBVkVfQkFTRU5BTUUpCisjaW5jbHVkZSA8bGliZ2VuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInJhbmQuaCIKKyNpbmNsdWRlICJzbGlzdC5oIgorI2luY2x1ZGUgInN0cmNhc2UuaCIKKy8qIFRoZSBsYXN0IDMgI2luY2x1ZGUgZmlsZXMgc2hvdWxkIGJlIGluIHRoaXMgb3JkZXIgKi8KKyNpbmNsdWRlICJjdXJsX3ByaW50Zi5oIgorI2luY2x1ZGUgImN1cmxfbWVtb3J5LmgiCisjaW5jbHVkZSAibWVtZGVidWcuaCIKKworI2lmZGVmIFdJTjMyCisjIGlmbmRlZiBSX09LCisjICBkZWZpbmUgUl9PSyA0CisjIGVuZGlmCisjZW5kaWYKKworCisjZGVmaW5lIEZJTEVfQ09OVEVOVFRZUEVfREVGQVVMVCAgICAgICAgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIKKyNkZWZpbmUgTVVMVElQQVJUX0NPTlRFTlRUWVBFX0RFRkFVTFQgICAibXVsdGlwYXJ0L21peGVkIgorI2RlZmluZSBESVNQT1NJVElPTl9ERUZBVUxUICAgICAgICAgICAgICJhdHRhY2htZW50IgorCisjZGVmaW5lIFJFQURfRVJST1IgICAgICAgICAgICAgICAgICAgICAgKChzaXplX3QpIC0xKQorCisvKiBFbmNvZGVycy4gKi8KK3N0YXRpYyBzaXplX3QgZW5jb2Rlcl9ub3BfcmVhZChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGF0ZW9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX21pbWVwYXJ0ICpwYXJ0KTsKK3N0YXRpYyBjdXJsX29mZl90IGVuY29kZXJfbm9wX3NpemUoY3VybF9taW1lcGFydCAqcGFydCk7CitzdGF0aWMgc2l6ZV90IGVuY29kZXJfN2JpdF9yZWFkKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYXRlb2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfbWltZXBhcnQgKnBhcnQpOworc3RhdGljIHNpemVfdCBlbmNvZGVyX2Jhc2U2NF9yZWFkKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYXRlb2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfbWltZXBhcnQgKnBhcnQpOworc3RhdGljIGN1cmxfb2ZmX3QgZW5jb2Rlcl9iYXNlNjRfc2l6ZShjdXJsX21pbWVwYXJ0ICpwYXJ0KTsKK3N0YXRpYyBzaXplX3QgZW5jb2Rlcl9xcF9yZWFkKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYXRlb2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX21pbWVwYXJ0ICpwYXJ0KTsKK3N0YXRpYyBjdXJsX29mZl90IGVuY29kZXJfcXBfc2l6ZShjdXJsX21pbWVwYXJ0ICpwYXJ0KTsKKworc3RhdGljIGNvbnN0IG1pbWVfZW5jb2RlciBlbmNvZGVyc1tdID0geworICB7ImJpbmFyeSIsIGVuY29kZXJfbm9wX3JlYWQsIGVuY29kZXJfbm9wX3NpemV9LAorICB7IjhiaXQiLCBlbmNvZGVyX25vcF9yZWFkLCBlbmNvZGVyX25vcF9zaXplfSwKKyAgeyI3Yml0IiwgZW5jb2Rlcl83Yml0X3JlYWQsIGVuY29kZXJfbm9wX3NpemV9LAorICB7ImJhc2U2NCIsIGVuY29kZXJfYmFzZTY0X3JlYWQsIGVuY29kZXJfYmFzZTY0X3NpemV9LAorICB7InF1b3RlZC1wcmludGFibGUiLCBlbmNvZGVyX3FwX3JlYWQsIGVuY29kZXJfcXBfc2l6ZX0sCisgIHtaRVJPX05VTEwsIFpFUk9fTlVMTCwgWkVST19OVUxMfQorfTsKKworLyogQmFzZTY0IGVuY29kaW5nIHRhYmxlICovCitzdGF0aWMgY29uc3QgY2hhciBiYXNlNjRbXSA9CisgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKKworLyogUXVvdGVkLXByaW50YWJsZSBjaGFyYWN0ZXIgY2xhc3MgdGFibGUuCisgKgorICogV2UgY2Fubm90IHJlbHkgb24gY3R5cGUgZnVuY3Rpb25zIHNpbmNlIHF1b3RlZC1wcmludGFibGUgaW5wdXQgZGF0YQorICogaXMgYXNzdW1lZCB0byBiZSBhc2NpaS1jb21wYXRpYmxlLCBldmVuIG9uIG5vbi1hc2NpaSBwbGF0Zm9ybXMuICovCisjZGVmaW5lIFFQX09LICAgICAgICAgICAxICAgICAgIC8qIENhbiBiZSByZXByZXNlbnRlZCBieSBpdHNlbGYuICovCisjZGVmaW5lIFFQX1NQICAgICAgICAgICAyICAgICAgIC8qIFNwYWNlIG9yIHRhYi4gKi8KKyNkZWZpbmUgUVBfQ1IgICAgICAgICAgIDMgICAgICAgLyogQ2FycmlhZ2UgcmV0dXJuLiAqLworI2RlZmluZSBRUF9MRiAgICAgICAgICAgNCAgICAgICAvKiBMaW5lLWZlZWQuICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBxcF9jbGFzc1tdID0geworIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgICAgICAgIC8qIDAwIC0gMDcgKi8KKyAwLCAgICAgUVBfU1AsIFFQX0xGLCAwLCAgICAgMCwgICAgIFFQX0NSLCAwLCAgICAgMCwgICAgICAgICAgICAvKiAwOCAtIDBGICovCisgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAgICAgICAgLyogMTAgLSAxNyAqLworIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgICAgICAgIC8qIDE4IC0gMUYgKi8KKyBRUF9TUCwgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssICAgICAgICAvKiAyMCAtIDI3ICovCisgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCAgICAgICAgLyogMjggLSAyRiAqLworIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgICAgICAgIC8qIDMwIC0gMzcgKi8KKyBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIDAgICAgLCBRUF9PSywgUVBfT0ssICAgICAgICAvKiAzOCAtIDNGICovCisgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCAgICAgICAgLyogNDAgLSA0NyAqLworIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgICAgICAgIC8qIDQ4IC0gNEYgKi8KKyBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssICAgICAgICAvKiA1MCAtIDU3ICovCisgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCAgICAgICAgLyogNTggLSA1RiAqLworIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgICAgICAgIC8qIDYwIC0gNjcgKi8KKyBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssICAgICAgICAvKiA2OCAtIDZGICovCisgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCAgICAgICAgLyogNzAgLSA3NyAqLworIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCBRUF9PSywgUVBfT0ssIFFQX09LLCAwLCAgICAgICAgICAgIC8qIDc4IC0gN0YgKi8KKyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAvKiA4MCAtIDhGICovCisgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgLyogOTAgLSA5RiAqLworIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgIC8qIEEwIC0gQUYgKi8KKyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAvKiBCMCAtIEJGICovCisgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgLyogQzAgLSBDRiAqLworIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgIC8qIEQwIC0gREYgKi8KKyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAvKiBFMCAtIEVGICovCisgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCAgICAgICAgICAgICAgICAgLyogRjAgLSBGRiAqLworfTsKKworCisvKiBCaW5hcnkgLS0+IGhleGFkZWNpbWFsIEFTQ0lJIHRhYmxlLiAqLworc3RhdGljIGNvbnN0IGNoYXIgYXNjaGV4W10gPQorICAiXHgzMFx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzdceDM4XHgzOVx4NDFceDQyXHg0M1x4NDRceDQ1XHg0NiI7CisKKworCisjaWZuZGVmIF9fVk1TCisjZGVmaW5lIGZpbGVzaXplKG5hbWUsIHN0YXRfZGF0YSkgKHN0YXRfZGF0YS5zdF9zaXplKQorI2RlZmluZSBmb3Blbl9yZWFkIGZvcGVuCisKKyNlbHNlCisKKyNpbmNsdWRlIDxmYWJkZWYuaD4KKy8qCisgKiBnZXRfdm1zX2ZpbGVfc2l6ZSBkb2VzIHdoYXQgaXQgdGFrZXMgdG8gZ2V0IHRoZSByZWFsIHNpemUgb2YgdGhlIGZpbGUKKyAqCisgKiBGb3IgZml4ZWQgZmlsZXMsIGZpbmQgb3V0IHRoZSBzaXplIG9mIHRoZSBFT0YgYmxvY2sgYW5kIGFkanVzdC4KKyAqCisgKiBGb3IgYWxsIG90aGVycywgaGF2ZSB0byByZWFkIHRoZSBlbnRpcmUgZmlsZSBpbiwgZGlzY2FyZGluZyB0aGUgY29udGVudHMuCisgKiBNb3N0IHBvc3RlZCB0ZXh0IGZpbGVzIHdpbGwgYmUgc21hbGwsIGFuZCBiaW5hcnkgZmlsZXMgbGlrZSB6bGliIGFyY2hpdmVzCisgKiBhbmQgQ0QvRFZEIGltYWdlcyBzaG91bGQgYmUgZWl0aGVyIGEgU1RSRUFNX0xGIGZvcm1hdCBvciBhIGZpeGVkIGZvcm1hdC4KKyAqCisgKi8KK2N1cmxfb2ZmX3QgVm1zUmVhbEZpbGVTaXplKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Rfc3RhdCAqc3RhdF9idWYpCit7CisgIGNoYXIgYnVmZmVyWzgxOTJdOworICBjdXJsX29mZl90IGNvdW50OworICBpbnQgcmV0X3N0YXQ7CisgIEZJTEUgKiBmaWxlOworCisgIGZpbGUgPSBmb3BlbihuYW1lLCBGT1BFTl9SRUFEVEVYVCk7IC8qIFZNUyAqLworICBpZihmaWxlID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgY291bnQgPSAwOworICByZXRfc3RhdCA9IDE7CisgIHdoaWxlKHJldF9zdGF0ID4gMCkgeworICAgIHJldF9zdGF0ID0gZnJlYWQoYnVmZmVyLCAxLCBzaXplb2YoYnVmZmVyKSwgZmlsZSk7CisgICAgaWYocmV0X3N0YXQgIT0gMCkKKyAgICAgIGNvdW50ICs9IHJldF9zdGF0OworICB9CisgIGZjbG9zZShmaWxlKTsKKworICByZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKgorICogIFZtc1NwZWNpYWxTaXplIGNoZWNrcyB0byBzZWUgaWYgdGhlIHN0YXQgc3Rfc2l6ZSBjYW4gYmUgdHJ1c3RlZCBhbmQKKyAqICBpZiBub3QgdG8gY2FsbCBhIHJvdXRpbmUgdG8gZ2V0IHRoZSBjb3JyZWN0IHNpemUuCisgKgorICovCitzdGF0aWMgY3VybF9vZmZfdCBWbXNTcGVjaWFsU2l6ZShjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0X3N0YXQgKnN0YXRfYnVmKQoreworICBzd2l0Y2goc3RhdF9idWYtPnN0X2ZhYl9yZm0pIHsKKyAgY2FzZSBGQUIkQ19WQVI6CisgIGNhc2UgRkFCJENfVkZDOgorICAgIHJldHVybiBWbXNSZWFsRmlsZVNpemUobmFtZSwgc3RhdF9idWYpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHJldHVybiBzdGF0X2J1Zi0+c3Rfc2l6ZTsKKyAgfQorfQorCisjZGVmaW5lIGZpbGVzaXplKG5hbWUsIHN0YXRfZGF0YSkgVm1zU3BlY2lhbFNpemUobmFtZSwgJnN0YXRfZGF0YSkKKworLyoKKyAqIHZtc2ZvcGVucmVhZAorICoKKyAqIEZvciB1cGxvYWQgdG8gd29yayBhcyBleHBlY3RlZCBvbiBWTVMsIGRpZmZlcmVudCBvcHRpb25hbAorICogcGFyYW1ldGVycyBtdXN0IGJlIGFkZGVkIHRvIHRoZSBmb3BlbiBjb21tYW5kIGJhc2VkIG9uCisgKiByZWNvcmQgZm9ybWF0IG9mIHRoZSBmaWxlLgorICoKKyAqLworc3RhdGljIEZJTEUgKiB2bXNmb3BlbnJlYWQoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqbW9kZSkKK3sKKyAgc3RydWN0X3N0YXQgc3RhdGJ1ZjsKKyAgaW50IHJlc3VsdDsKKworICByZXN1bHQgPSBzdGF0KGZpbGUsICZzdGF0YnVmKTsKKworICBzd2l0Y2goc3RhdGJ1Zi5zdF9mYWJfcmZtKSB7CisgIGNhc2UgRkFCJENfVkFSOgorICBjYXNlIEZBQiRDX1ZGQzoKKyAgY2FzZSBGQUIkQ19TVE1DUjoKKyAgICByZXR1cm4gZm9wZW4oZmlsZSwgRk9QRU5fUkVBRFRFWFQpOyAvKiBWTVMgKi8KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gZm9wZW4oZmlsZSwgRk9QRU5fUkVBRFRFWFQsICJyZm09c3RtbGYiLCAiY3R4PXN0bSIpOworICB9Cit9CisKKyNkZWZpbmUgZm9wZW5fcmVhZCB2bXNmb3BlbnJlYWQKKyNlbmRpZgorCisKKyNpZm5kZWYgSEFWRV9CQVNFTkFNRQorLyoKKyAgKFF1b3RlIGZyb20gVGhlIE9wZW4gR3JvdXAgQmFzZSBTcGVjaWZpY2F0aW9ucyBJc3N1ZSA2IElFRUUgU3RkIDEwMDMuMSwgMjAwNAorICBFZGl0aW9uKQorCisgIFRoZSBiYXNlbmFtZSgpIGZ1bmN0aW9uIHNoYWxsIHRha2UgdGhlIHBhdGhuYW1lIHBvaW50ZWQgdG8gYnkgcGF0aCBhbmQKKyAgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZmluYWwgY29tcG9uZW50IG9mIHRoZSBwYXRobmFtZSwgZGVsZXRpbmcgYW55CisgIHRyYWlsaW5nICcvJyBjaGFyYWN0ZXJzLgorCisgIElmIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBwYXRoIGNvbnNpc3RzIGVudGlyZWx5IG9mIHRoZSAnLycgY2hhcmFjdGVyLAorICBiYXNlbmFtZSgpIHNoYWxsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyAiLyIuIElmIHRoZSBzdHJpbmcgcG9pbnRlZAorICB0byBieSBwYXRoIGlzIGV4YWN0bHkgIi8vIiwgaXQgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZCB3aGV0aGVyICcvJyBvciAiLy8iCisgIGlzIHJldHVybmVkLgorCisgIElmIHBhdGggaXMgYSBudWxsIHBvaW50ZXIgb3IgcG9pbnRzIHRvIGFuIGVtcHR5IHN0cmluZywgYmFzZW5hbWUoKSBzaGFsbAorICByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgIi4iLgorCisgIFRoZSBiYXNlbmFtZSgpIGZ1bmN0aW9uIG1heSBtb2RpZnkgdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IHBhdGgsIGFuZCBtYXkKKyAgcmV0dXJuIGEgcG9pbnRlciB0byBzdGF0aWMgc3RvcmFnZSB0aGF0IG1heSB0aGVuIGJlIG92ZXJ3cml0dGVuIGJ5IGEKKyAgc3Vic2VxdWVudCBjYWxsIHRvIGJhc2VuYW1lKCkuCisKKyAgVGhlIGJhc2VuYW1lKCkgZnVuY3Rpb24gbmVlZCBub3QgYmUgcmVlbnRyYW50LiBBIGZ1bmN0aW9uIHRoYXQgaXMgbm90CisgIHJlcXVpcmVkIHRvIGJlIHJlZW50cmFudCBpcyBub3QgcmVxdWlyZWQgdG8gYmUgdGhyZWFkLXNhZmUuCisKKyovCitzdGF0aWMgY2hhciAqQ3VybF9iYXNlbmFtZShjaGFyICpwYXRoKQoreworICAvKiBJZ25vcmUgYWxsIHRoZSBkZXRhaWxzIGFib3ZlIGZvciBub3cgYW5kIG1ha2UgYSBxdWljayBhbmQgc2ltcGxlCisgICAgIGltcGxlbWVudGFpb24gaGVyZSAqLworICBjaGFyICpzMTsKKyAgY2hhciAqczI7CisKKyAgczEgPSBzdHJyY2hyKHBhdGgsICcvJyk7CisgIHMyID0gc3RycmNocihwYXRoLCAnXFwnKTsKKworICBpZihzMSAmJiBzMikgeworICAgIHBhdGggPSAoczEgPiBzMj8gczEgOiBzMikgKyAxOworICB9CisgIGVsc2UgaWYoczEpCisgICAgcGF0aCA9IHMxICsgMTsKKyAgZWxzZSBpZihzMikKKyAgICBwYXRoID0gczIgKyAxOworCisgIHJldHVybiBwYXRoOworfQorCisjZGVmaW5lIGJhc2VuYW1lKHgpICBDdXJsX2Jhc2VuYW1lKCh4KSkKKyNlbmRpZgorCisKKy8qIFNldCByZWFkYmFjayBzdGF0ZS4gKi8KK3N0YXRpYyB2b2lkIG1pbWVzZXRzdGF0ZShtaW1lX3N0YXRlICpzdGF0ZSwgZW51bSBtaW1lc3RhdGUgdG9rLCB2b2lkICpwdHIpCit7CisgIHN0YXRlLT5zdGF0ZSA9IHRvazsKKyAgc3RhdGUtPnB0ciA9IHB0cjsKKyAgc3RhdGUtPm9mZnNldCA9IDA7Cit9CisKKworLyogRXNjYXBlIGhlYWRlciBzdHJpbmcgaW50byBhbGxvY2F0ZWQgbWVtb3J5LiAqLworc3RhdGljIGNoYXIgKmVzY2FwZV9zdHJpbmcoY29uc3QgY2hhciAqc3JjKQoreworICBzaXplX3QgYnl0ZWNvdW50ID0gMDsKKyAgc2l6ZV90IGk7CisgIGNoYXIgKmRzdDsKKworICBmb3IoaSA9IDA7IHNyY1tpXTsgaSsrKQorICAgIGlmKHNyY1tpXSA9PSAnIicgfHwgc3JjW2ldID09ICdcXCcpCisgICAgICBieXRlY291bnQrKzsKKworICBieXRlY291bnQgKz0gaTsKKyAgZHN0ID0gbWFsbG9jKGJ5dGVjb3VudCArIDEpOworICBpZighZHN0KQorICAgIHJldHVybiBOVUxMOworCisgIGZvcihpID0gMDsgKnNyYzsgc3JjKyspIHsKKyAgICBpZigqc3JjID09ICciJyB8fCAqc3JjID09ICdcXCcpCisgICAgICBkc3RbaSsrXSA9ICdcXCc7CisgICAgZHN0W2krK10gPSAqc3JjOworICB9CisKKyAgZHN0W2ldID0gJ1wwJzsKKyAgcmV0dXJuIGRzdDsKK30KKworLyogQ2hlY2sgaWYgaGVhZGVyIG1hdGNoZXMuICovCitzdGF0aWMgY2hhciAqbWF0Y2hfaGVhZGVyKHN0cnVjdCBjdXJsX3NsaXN0ICpoZHIsIGNvbnN0IGNoYXIgKmxibCwgc2l6ZV90IGxlbikKK3sKKyAgY2hhciAqdmFsdWUgPSBOVUxMOworCisgIGlmKHN0cm5jYXNlY29tcGFyZShoZHItPmRhdGEsIGxibCwgbGVuKSAmJiBoZHItPmRhdGFbbGVuXSA9PSAnOicpCisgICAgZm9yKHZhbHVlID0gaGRyLT5kYXRhICsgbGVuICsgMTsgKnZhbHVlID09ICcgJzsgdmFsdWUrKykKKyAgICAgIDsKKyAgcmV0dXJuIHZhbHVlOworfQorCisvKiBHZXQgYSBoZWFkZXIgZnJvbSBhbiBzbGlzdC4gKi8KK3N0YXRpYyBjaGFyICpzZWFyY2hfaGVhZGVyKHN0cnVjdCBjdXJsX3NsaXN0ICpoZHJsaXN0LCBjb25zdCBjaGFyICpoZHIpCit7CisgIHNpemVfdCBsZW4gPSBzdHJsZW4oaGRyKTsKKyAgY2hhciAqdmFsdWUgPSBOVUxMOworCisgIGZvcig7ICF2YWx1ZSAmJiBoZHJsaXN0OyBoZHJsaXN0ID0gaGRybGlzdC0+bmV4dCkKKyAgICB2YWx1ZSA9IG1hdGNoX2hlYWRlcihoZHJsaXN0LCBoZHIsIGxlbik7CisKKyAgcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgY2hhciAqc3RyaXBwYXRoKGNvbnN0IGNoYXIgKmZ1bGxmaWxlKQoreworICBjaGFyICpmaWxlbmFtZTsKKyAgY2hhciAqYmFzZTsKKyAgZmlsZW5hbWUgPSBzdHJkdXAoZnVsbGZpbGUpOyAvKiBkdXBsaWNhdGUgc2luY2UgYmFzZW5hbWUoKSBtYXkgcnVpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgaXQgd29ya3Mgb24gKi8KKyAgaWYoIWZpbGVuYW1lKQorICAgIHJldHVybiBOVUxMOworICBiYXNlID0gc3RyZHVwKGJhc2VuYW1lKGZpbGVuYW1lKSk7CisKKyAgZnJlZShmaWxlbmFtZSk7IC8qIGZyZWUgdGVtcG9yYXJ5IGJ1ZmZlciAqLworCisgIHJldHVybiBiYXNlOyAvKiByZXR1cm5zIGFuIGFsbG9jYXRlZCBzdHJpbmcgb3IgTlVMTCAhICovCit9CisKKy8qIEluaXRpYWxpemUgZGF0YSBlbmNvZGVyIHN0YXRlLiAqLworc3RhdGljIHZvaWQgY2xlYW51cF9lbmNvZGVyX3N0YXRlKG1pbWVfZW5jb2Rlcl9zdGF0ZSAqcCkKK3sKKyAgcC0+cG9zID0gMDsKKyAgcC0+YnVmYmVnID0gMDsKKyAgcC0+YnVmZW5kID0gMDsKK30KKworCisvKiBEdW1teSBlbmNvZGVyLiBUaGlzIGlzIHVzZWQgZm9yIDhiaXQgYW5kIGJpbmFyeSBjb250ZW50IGVuY29kaW5ncy4gKi8KK3N0YXRpYyBzaXplX3QgZW5jb2Rlcl9ub3BfcmVhZChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGF0ZW9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfbWltZXBhcnQgKnBhcnQpCit7CisgIG1pbWVfZW5jb2Rlcl9zdGF0ZSAqc3QgPSAmcGFydC0+ZW5jc3RhdGU7CisgIHNpemVfdCBpbnNpemUgPSBzdC0+YnVmZW5kIC0gc3QtPmJ1ZmJlZzsKKworICAodm9pZCkgYXRlb2Y7CisKKyAgaWYoc2l6ZSA+IGluc2l6ZSkKKyAgICBzaXplID0gaW5zaXplOworICBpZihzaXplKQorICAgIG1lbWNweShidWZmZXIsIHN0LT5idWYsIHNpemUpOworICBzdC0+YnVmYmVnICs9IHNpemU7CisgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgY3VybF9vZmZfdCBlbmNvZGVyX25vcF9zaXplKGN1cmxfbWltZXBhcnQgKnBhcnQpCit7CisgIHJldHVybiBwYXJ0LT5kYXRhc2l6ZTsKK30KKworCisvKiA3Yml0IGVuY29kZXI6IHRoZSBlbmNvZGVyIGlzIGp1c3QgYSBkYXRhIHZhbGlkaXR5IGNoZWNrLiAqLworc3RhdGljIHNpemVfdCBlbmNvZGVyXzdiaXRfcmVhZChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGF0ZW9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX21pbWVwYXJ0ICpwYXJ0KQoreworICBtaW1lX2VuY29kZXJfc3RhdGUgKnN0ID0gJnBhcnQtPmVuY3N0YXRlOworICBzaXplX3QgY3Vyc2l6ZSA9IHN0LT5idWZlbmQgLSBzdC0+YnVmYmVnOworCisgICh2b2lkKSBhdGVvZjsKKworICBpZihzaXplID4gY3Vyc2l6ZSkKKyAgICBzaXplID0gY3Vyc2l6ZTsKKworICBmb3IoY3Vyc2l6ZSA9IDA7IGN1cnNpemUgPCBzaXplOyBjdXJzaXplKyspIHsKKyAgICAqYnVmZmVyID0gc3QtPmJ1ZltzdC0+YnVmYmVnXTsKKyAgICBpZigqYnVmZmVyKysgJiAweDgwKQorICAgICAgcmV0dXJuIGN1cnNpemU/IGN1cnNpemU6IFJFQURfRVJST1I7CisgICAgc3QtPmJ1ZmJlZysrOworICB9CisKKyAgcmV0dXJuIGN1cnNpemU7Cit9CisKKworLyogQmFzZTY0IGNvbnRlbnQgZW5jb2Rlci4gKi8KK3N0YXRpYyBzaXplX3QgZW5jb2Rlcl9iYXNlNjRfcmVhZChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGF0ZW9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX21pbWVwYXJ0ICpwYXJ0KQoreworICBtaW1lX2VuY29kZXJfc3RhdGUgKnN0ID0gJnBhcnQtPmVuY3N0YXRlOworICBzaXplX3QgY3Vyc2l6ZSA9IDA7CisgIGludCBpOworICBjaGFyICpwdHIgPSBidWZmZXI7CisKKyAgd2hpbGUoc3QtPmJ1ZmJlZyA8IHN0LT5idWZlbmQpIHsKKyAgICAvKiBMaW5lIGZ1bGwgPyAqLworICAgIGlmKHN0LT5wb3MgPj0gTUFYX0VOQ09ERURfTElORV9MRU5HVEggLSA0KSB7CisgICAgICAvKiBZZXMsIHdlIG5lZWQgMiBjaGFyYWN0ZXJzIGZvciBDUkxGLiAqLworICAgICAgaWYoc2l6ZSA8IDIpCisgICAgICAgIGJyZWFrOworICAgICAgKnB0cisrID0gJ1xyJzsKKyAgICAgICpwdHIrKyA9ICdcbic7CisgICAgICBzdC0+cG9zID0gMDsKKyAgICAgIGN1cnNpemUgKz0gMjsKKyAgICAgIHNpemUgLT0gMjsKKyAgICB9CisKKyAgICAvKiBCZSBzdXJlIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBhbmQgaW5wdXQgZGF0YSBmb3IgYSBiYXNlNjQgZ3JvdXAuICovCisgICAgaWYoc2l6ZSA8IDQgfHwgc3QtPmJ1ZmVuZCAtIHN0LT5idWZiZWcgPCAzKQorICAgICAgYnJlYWs7CisKKyAgICAvKiBFbmNvZGUgdGhyZWUgYnl0ZXMgYSBmb3VyIGNoYXJhY3RlcnMuICovCisgICAgaSA9IHN0LT5idWZbc3QtPmJ1ZmJlZysrXSAmIDB4RkY7CisgICAgaSA9IChpIDw8IDgpIHwgKHN0LT5idWZbc3QtPmJ1ZmJlZysrXSAmIDB4RkYpOworICAgIGkgPSAoaSA8PCA4KSB8IChzdC0+YnVmW3N0LT5idWZiZWcrK10gJiAweEZGKTsKKyAgICAqcHRyKysgPSBiYXNlNjRbKGkgPj4gMTgpICYgMHgzRl07CisgICAgKnB0cisrID0gYmFzZTY0WyhpID4+IDEyKSAmIDB4M0ZdOworICAgICpwdHIrKyA9IGJhc2U2NFsoaSA+PiA2KSAmIDB4M0ZdOworICAgICpwdHIrKyA9IGJhc2U2NFtpICYgMHgzRl07CisgICAgY3Vyc2l6ZSArPSA0OworICAgIHN0LT5wb3MgKz0gNDsKKyAgICBzaXplIC09IDQ7CisgIH0KKworICAvKiBJZiBhdCBlb2YsIHdlIGhhdmUgdG8gZmx1c2ggdGhlIGJ1ZmZlcmVkIGRhdGEuICovCisgIGlmKGF0ZW9mICYmIHNpemUgPj0gNCkgeworICAgIC8qIEJ1ZmZlcmVkIGRhdGEgc2l6ZSBjYW4gb25seSBiZSAwLCAxIG9yIDIuICovCisgICAgcHRyWzJdID0gcHRyWzNdID0gJz0nOworICAgIGkgPSAwOworICAgIHN3aXRjaChzdC0+YnVmZW5kIC0gc3QtPmJ1ZmJlZykgeworICAgIGNhc2UgMjoKKyAgICAgIGkgPSAoc3QtPmJ1ZltzdC0+YnVmYmVnICsgMV0gJiAweEZGKSA8PCA4OworICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICBjYXNlIDE6CisgICAgICBpIHw9IChzdC0+YnVmW3N0LT5idWZiZWddICYgMHhGRikgPDwgMTY7CisgICAgICBwdHJbMF0gPSBiYXNlNjRbKGkgPj4gMTgpICYgMHgzRl07CisgICAgICBwdHJbMV0gPSBiYXNlNjRbKGkgPj4gMTIpICYgMHgzRl07CisgICAgICBpZigrK3N0LT5idWZiZWcgIT0gc3QtPmJ1ZmVuZCkgeworICAgICAgICBwdHJbMl0gPSBiYXNlNjRbKGkgPj4gNikgJiAweDNGXTsKKyAgICAgICAgc3QtPmJ1ZmJlZysrOworICAgICAgfQorICAgICAgY3Vyc2l6ZSArPSA0OworICAgICAgc3QtPnBvcyArPSA0OworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyNpZmRlZiBDVVJMX0RPRVNfQ09OVkVSU0lPTlMKKyAgLyogVGhpcyBpcyBub3cgdGV4dHVhbCBkYXRhLCBDb252ZXJ0IGNoYXJhY3RlciBjb2Rlcy4gKi8KKyAgaWYocGFydC0+ZWFzeSAmJiBjdXJzaXplKSB7CisgICAgQ1VSTGNvZGUgcmVzdWx0ID0gQ3VybF9jb252ZXJ0X3RvX25ldHdvcmsocGFydC0+ZWFzeSwgYnVmZmVyLCBjdXJzaXplKTsKKyAgICBpZihyZXN1bHQpCisgICAgICByZXR1cm4gUkVBRF9FUlJPUjsKKyAgfQorI2VuZGlmCisKKyAgcmV0dXJuIGN1cnNpemU7Cit9CisKK3N0YXRpYyBjdXJsX29mZl90IGVuY29kZXJfYmFzZTY0X3NpemUoY3VybF9taW1lcGFydCAqcGFydCkKK3sKKyAgY3VybF9vZmZfdCBzaXplID0gcGFydC0+ZGF0YXNpemU7CisKKyAgaWYoc2l6ZSA8PSAwKQorICAgIHJldHVybiBzaXplOyAgICAvKiBVbmtub3duIHNpemUgb3Igbm8gZGF0YS4gKi8KKworICAvKiBDb21wdXRlIGJhc2U2NCBjaGFyYWN0ZXIgY291bnQuICovCisgIHNpemUgPSA0ICogKDEgKyAoc2l6ZSAtIDEpIC8gMyk7CisKKyAgLyogRWZmZWN0aXZlIGNoYXJhY3RlciBjb3VudCBtdXN0IGluY2x1ZGUgQ1JMRnMuICovCisgIHJldHVybiBzaXplICsgMiAqICgoc2l6ZSAtIDEpIC8gTUFYX0VOQ09ERURfTElORV9MRU5HVEgpOworfQorCisKKy8qIFF1b3RlZC1wcmludGFibGUgbG9va2FoZWFkLgorICoKKyAqIENoZWNrIGlmIGEgQ1JMRiBvciBlbmQgb2YgZGF0YSBpcyBpbiBpbnB1dCBidWZmZXIgYXQgY3VycmVudCBwb3NpdGlvbiArIG4uCisgKiBSZXR1cm4gLTEgaWYgbW9yZSBkYXRhIG5lZWRlZCwgMSBpZiBDUkxGIG9yIGVuZCBvZiBkYXRhLCBlbHNlIDAuCisgKi8KK3N0YXRpYyBpbnQgcXBfbG9va2FoZWFkX2VvbChtaW1lX2VuY29kZXJfc3RhdGUgKnN0LCBpbnQgYXRlb2YsIHNpemVfdCBuKQoreworICBuICs9IHN0LT5idWZiZWc7CisgIGlmKG4gPj0gc3QtPmJ1ZmVuZCAmJiBhdGVvZikKKyAgICByZXR1cm4gMTsKKyAgaWYobiArIDIgPiBzdC0+YnVmZW5kKQorICAgIHJldHVybiBhdGVvZj8gMDogLTE7CisgIGlmKHFwX2NsYXNzW3N0LT5idWZbbl0gJiAweEZGXSA9PSBRUF9DUiAmJgorICAgICBxcF9jbGFzc1tzdC0+YnVmW24gKyAxXSAmIDB4RkZdID09IFFQX0xGKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworLyogUXVvdGVkLXByaW50YWJsZSBlbmNvZGVyLiAqLworc3RhdGljIHNpemVfdCBlbmNvZGVyX3FwX3JlYWQoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBhdGVvZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfbWltZXBhcnQgKnBhcnQpCit7CisgIG1pbWVfZW5jb2Rlcl9zdGF0ZSAqc3QgPSAmcGFydC0+ZW5jc3RhdGU7CisgIGNoYXIgKnB0ciA9IGJ1ZmZlcjsKKyAgc2l6ZV90IGN1cnNpemUgPSAwOworICBpbnQgaTsKKyAgc2l6ZV90IGxlbjsKKyAgc2l6ZV90IGNvbnN1bWVkOworICBpbnQgc29mdGxpbmVicmVhazsKKyAgY2hhciBidWZbNF07CisKKyAgLyogT24gYWxsIHBsYXRmb3JtcywgaW5wdXQgaXMgc3VwcG9zZWQgdG8gYmUgQVNDSUkgY29tcGF0aWJsZTogZm9yIHRoaXMKKyAgICAgcmVhc29uLCB3ZSB1c2UgaGV4YWRlY2ltYWwgQVNDSUkgY29kZXMgaW4gdGhpcyBmdW5jdGlvbiByYXRoZXIgdGhhbgorICAgICBjaGFyYWN0ZXIgY29uc3RhbnRzIHRoYXQgY2FuIGJlIGludGVycHJldGVkIGFzIG5vbi1hc2NpaSBvbiBzb21lCisgICAgIHBsYXRmb3Jtcy4gUHJlc2VydmUgQVNDSUkgZW5jb2Rpbmcgb24gb3V0cHV0IHRvby4gKi8KKyAgd2hpbGUoc3QtPmJ1ZmJlZyA8IHN0LT5idWZlbmQpIHsKKyAgICBsZW4gPSAxOworICAgIGNvbnN1bWVkID0gMTsKKyAgICBpID0gc3QtPmJ1ZltzdC0+YnVmYmVnXTsKKyAgICBidWZbMF0gPSAoY2hhcikgaTsKKyAgICBidWZbMV0gPSBhc2NoZXhbKGkgPj4gNCkgJiAweEZdOworICAgIGJ1ZlsyXSA9IGFzY2hleFtpICYgMHhGXTsKKworICAgIHN3aXRjaChxcF9jbGFzc1tzdC0+YnVmW3N0LT5idWZiZWddICYgMHhGRl0pIHsKKyAgICBjYXNlIFFQX09LOiAgICAgICAgICAvKiBOb3QgYSBzcGVjaWFsIGNoYXJhY3Rlci4gKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUVBfU1A6ICAgICAgICAgIC8qIFNwYWNlIG9yIHRhYi4gKi8KKyAgICAgIC8qIFNwYWNpbmcgbXVzdCBiZSBlc2NhcGVkIGlmIGZvbGxvd2VkIGJ5IENSTEYuICovCisgICAgICBzd2l0Y2gocXBfbG9va2FoZWFkX2VvbChzdCwgYXRlb2YsIDEpKSB7CisgICAgICBjYXNlIC0xOiAgICAgICAgICAvKiBNb3JlIGlucHV0IGRhdGEgbmVlZGVkLiAqLworICAgICAgICByZXR1cm4gY3Vyc2l6ZTsKKyAgICAgIGNhc2UgMDogICAgICAgICAgIC8qIE5vIGVuY29kaW5nIG5lZWRlZC4gKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiAgICAgICAgICAvKiBDUkxGIGFmdGVyIHNwYWNlIG9yIHRhYi4gKi8KKyAgICAgICAgYnVmWzBdID0gJ1x4M0QnOyAgICAvKiAnPScgKi8KKyAgICAgICAgbGVuID0gMzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFFQX0NSOiAgICAgICAgIC8qIENhcnJpYWdlIHJldHVybi4gKi8KKyAgICAgIC8qIElmIGZvbGxvd2VkIGJ5IGEgbGluZS1mZWVkLCBvdXRwdXQgdGhlIENSTEYgcGFpci4KKyAgICAgICAgIEVsc2UgZXNjYXBlIGl0LiAqLworICAgICAgc3dpdGNoKHFwX2xvb2thaGVhZF9lb2woc3QsIGF0ZW9mLCAwKSkgeworICAgICAgY2FzZSAtMTogICAgICAgICAgLyogTmVlZCBtb3JlIGRhdGEuICovCisgICAgICAgIHJldHVybiBjdXJzaXplOworICAgICAgY2FzZSAxOiAgICAgICAgICAgLyogQ1JMRiBmb3VuZC4gKi8KKyAgICAgICAgYnVmW2xlbisrXSA9ICdceDBBJzsgICAgLyogQXBwZW5kICdcbicuICovCisgICAgICAgIGNvbnN1bWVkID0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiAgICAgICAgICAvKiBOb3QgZm9sbG93ZWQgYnkgTEY6IGVzY2FwZS4gKi8KKyAgICAgICAgYnVmWzBdID0gJ1x4M0QnOyAgICAvKiAnPScgKi8KKyAgICAgICAgbGVuID0gMzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgIC8qIENoYXJhY3RlciBtdXN0IGJlIGVzY2FwZWQuICovCisgICAgICBidWZbMF0gPSAnXHgzRCc7ICAgIC8qICc9JyAqLworICAgICAgbGVuID0gMzsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIEJlIHN1cmUgdGhlIGVuY29kZWQgY2hhcmFjdGVyIGZpdHMgd2l0aGluIG1heGltdW0gbGluZSBsZW5ndGguICovCisgICAgaWYoYnVmW2xlbiAtIDFdICE9ICdceDBBJykgeyAgICAvKiAnXG4nICovCisgICAgICBzb2Z0bGluZWJyZWFrID0gc3QtPnBvcyArIGxlbiA+IE1BWF9FTkNPREVEX0xJTkVfTEVOR1RIOworICAgICAgaWYoIXNvZnRsaW5lYnJlYWsgJiYgc3QtPnBvcyArIGxlbiA9PSBNQVhfRU5DT0RFRF9MSU5FX0xFTkdUSCkgeworICAgICAgICAvKiBXZSBtYXkgdXNlIHRoZSBjdXJyZW50IGxpbmUgb25seSBpZiBlbmQgb2YgZGF0YSBvciBmb2xsb3dlZCBieQorICAgICAgICAgICBhIENSTEYuICovCisgICAgICAgIHN3aXRjaChxcF9sb29rYWhlYWRfZW9sKHN0LCBhdGVvZiwgY29uc3VtZWQpKSB7CisgICAgICAgIGNhc2UgLTE6ICAgICAgICAvKiBOZWVkIG1vcmUgZGF0YS4gKi8KKyAgICAgICAgICByZXR1cm4gY3Vyc2l6ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOiAgICAgICAgIC8qIE5vdCBmb2xsb3dlZCBieSBhIENSTEYuICovCisgICAgICAgICAgc29mdGxpbmVicmVhayA9IDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmKHNvZnRsaW5lYnJlYWspIHsKKyAgICAgICAgc3RyY3B5KGJ1ZiwgIlx4M0RceDBEXHgwQSIpOyAgICAvKiAiPVxyXG4iICovCisgICAgICAgIGxlbiA9IDM7CisgICAgICAgIGNvbnN1bWVkID0gMDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJZiB0aGUgb3V0cHV0IGJ1ZmZlciB3b3VsZCBvdmVyZmxvdywgZG8gbm90IHN0b3JlLiAqLworICAgIGlmKGxlbiA+IHNpemUpCisgICAgICBicmVhazsKKworICAgIC8qIEFwcGVuZCB0byBvdXRwdXQgYnVmZmVyLiAqLworICAgIG1lbWNweShwdHIsIGJ1ZiwgbGVuKTsKKyAgICBjdXJzaXplICs9IGxlbjsKKyAgICBwdHIgKz0gbGVuOworICAgIHNpemUgLT0gbGVuOworICAgIHN0LT5wb3MgKz0gbGVuOworICAgIGlmKGJ1ZltsZW4gLSAxXSA9PSAnXHgwQScpICAgIC8qICdcbicgKi8KKyAgICAgIHN0LT5wb3MgPSAwOworICAgIHN0LT5idWZiZWcgKz0gY29uc3VtZWQ7CisgIH0KKworICByZXR1cm4gY3Vyc2l6ZTsKK30KKworc3RhdGljIGN1cmxfb2ZmX3QgZW5jb2Rlcl9xcF9zaXplKGN1cmxfbWltZXBhcnQgKnBhcnQpCit7CisgIC8qIERldGVybWluaW5nIHRoZSBzaXplIGNhbiBvbmx5IGJlIGRvbmUgYnkgcmVhZGluZyB0aGUgZGF0YTogdW5sZXNzIHRoZQorICAgICBkYXRhIHNpemUgaXMgMCwgd2UgcmV0dXJuIGl0IGFzIHVua25vd24gKC0xKS4gKi8KKyAgcmV0dXJuIHBhcnQtPmRhdGFzaXplPyAtMTogMDsKK30KKworCisvKiBJbi1tZW1vcnkgZGF0YSBjYWxsYmFja3MuICovCisvKiBBcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gdGhlIG1pbWUgcGFydC4gKi8KK3N0YXRpYyBzaXplX3QgbWltZV9tZW1fcmVhZChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplLCBzaXplX3Qgbml0ZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmluc3RyZWFtKQoreworICBjdXJsX21pbWVwYXJ0ICpwYXJ0ID0gKGN1cmxfbWltZXBhcnQgKikgaW5zdHJlYW07CisgIHNpemVfdCBzeiA9IChzaXplX3QpIHBhcnQtPmRhdGFzaXplIC0gcGFydC0+c3RhdGUub2Zmc2V0OworCisgICh2b2lkKSBzaXplOyAgIC8qIEFsd2F5cyAxLiovCisKKyAgaWYoc3ogPiBuaXRlbXMpCisgICAgc3ogPSBuaXRlbXM7CisKKyAgaWYoc3opCisgICAgbWVtY3B5KGJ1ZmZlciwgKGNoYXIgKikgcGFydC0+ZGF0YSwgc3opOworCisgIHBhcnQtPnN0YXRlLm9mZnNldCArPSBzejsKKyAgcmV0dXJuIHN6OworfQorCitzdGF0aWMgaW50IG1pbWVfbWVtX3NlZWsodm9pZCAqaW5zdHJlYW0sIGN1cmxfb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKQoreworICBjdXJsX21pbWVwYXJ0ICpwYXJ0ID0gKGN1cmxfbWltZXBhcnQgKikgaW5zdHJlYW07CisKKyAgc3dpdGNoKHdoZW5jZSkgeworICBjYXNlIFNFRUtfQ1VSOgorICAgIG9mZnNldCArPSBwYXJ0LT5zdGF0ZS5vZmZzZXQ7CisgICAgYnJlYWs7CisgIGNhc2UgU0VFS19FTkQ6CisgICAgb2Zmc2V0ICs9IHBhcnQtPmRhdGFzaXplOworICAgIGJyZWFrOworICB9CisKKyAgaWYob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBwYXJ0LT5kYXRhc2l6ZSkKKyAgICByZXR1cm4gQ1VSTF9TRUVLRlVOQ19GQUlMOworCisgIHBhcnQtPnN0YXRlLm9mZnNldCA9IChzaXplX3QpIG9mZnNldDsKKyAgcmV0dXJuIENVUkxfU0VFS0ZVTkNfT0s7Cit9CisKK3N0YXRpYyB2b2lkIG1pbWVfbWVtX2ZyZWUodm9pZCAqcHRyKQoreworICBDdXJsX3NhZmVmcmVlKCgoY3VybF9taW1lcGFydCAqKSBwdHIpLT5kYXRhKTsKK30KKworCisvKiBOYW1lZCBmaWxlIGNhbGxiYWNrcy4gKi8KKy8qIEFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byB0aGUgbWltZSBwYXJ0LiAqLworc3RhdGljIGludCBtaW1lX29wZW5fZmlsZShjdXJsX21pbWVwYXJ0ICogcGFydCkKK3sKKyAgLyogT3BlbiBhIE1JTUVLSU5EX0ZJTEUgcGFydC4gKi8KKworICBpZihwYXJ0LT5mcCkKKyAgICByZXR1cm4gMDsKKyAgcGFydC0+ZnAgPSBmb3Blbl9yZWFkKHBhcnQtPmRhdGEsICJyYiIpOworICByZXR1cm4gcGFydC0+ZnA/IDA6IC0xOworfQorCitzdGF0aWMgc2l6ZV90IG1pbWVfZmlsZV9yZWFkKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIHNpemVfdCBuaXRlbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmluc3RyZWFtKQoreworICBjdXJsX21pbWVwYXJ0ICpwYXJ0ID0gKGN1cmxfbWltZXBhcnQgKikgaW5zdHJlYW07CisKKyAgaWYobWltZV9vcGVuX2ZpbGUocGFydCkpCisgICAgcmV0dXJuIFJFQURfRVJST1I7CisKKyAgcmV0dXJuIGZyZWFkKGJ1ZmZlciwgc2l6ZSwgbml0ZW1zLCBwYXJ0LT5mcCk7Cit9CisKK3N0YXRpYyBpbnQgbWltZV9maWxlX3NlZWsodm9pZCAqaW5zdHJlYW0sIGN1cmxfb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKQoreworICBjdXJsX21pbWVwYXJ0ICpwYXJ0ID0gKGN1cmxfbWltZXBhcnQgKikgaW5zdHJlYW07CisKKyAgaWYod2hlbmNlID09IFNFRUtfU0VUICYmICFvZmZzZXQgJiYgIXBhcnQtPmZwKQorICAgIHJldHVybiBDVVJMX1NFRUtGVU5DX09LOyAgIC8qIE5vdCBvcGVuOiBpbXBsaWNpdGx5IGFscmVhZHkgYXQgQk9GLiAqLworCisgIGlmKG1pbWVfb3Blbl9maWxlKHBhcnQpKQorICAgIHJldHVybiBDVVJMX1NFRUtGVU5DX0ZBSUw7CisKKyAgcmV0dXJuIGZzZWVrKHBhcnQtPmZwLCAobG9uZykgb2Zmc2V0LCB3aGVuY2UpPworICAgICAgICAgICAgICAgQ1VSTF9TRUVLRlVOQ19DQU5UU0VFSzogQ1VSTF9TRUVLRlVOQ19PSzsKK30KKworc3RhdGljIHZvaWQgbWltZV9maWxlX2ZyZWUodm9pZCAqcHRyKQoreworICBjdXJsX21pbWVwYXJ0ICpwYXJ0ID0gKGN1cmxfbWltZXBhcnQgKikgcHRyOworCisgIGlmKHBhcnQtPmZwKSB7CisgICAgZmNsb3NlKHBhcnQtPmZwKTsKKyAgICBwYXJ0LT5mcCA9IE5VTEw7CisgIH0KKyAgQ3VybF9zYWZlZnJlZShwYXJ0LT5kYXRhKTsKKyAgcGFydC0+ZGF0YSA9IE5VTEw7Cit9CisKKworLyogU3VicGFydHMgY2FsbGJhY2tzLiAqLworLyogQXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIHRoZSBtaW1lIHN0cnVjdHVyZS4gKi8KKworLyogUmVhZGJhY2sgYSBieXRlIHN0cmluZyBzZWdtZW50LiAqLworc3RhdGljIHNpemVfdCByZWFkYmFja19ieXRlcyhtaW1lX3N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnl0ZXMsIHNpemVfdCBudW1ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdHJhaWwpCit7CisgIHNpemVfdCBzejsKKworICBzeiA9IG51bWJ5dGVzIC0gc3RhdGUtPm9mZnNldDsKKworICBpZihudW1ieXRlcyA+IHN0YXRlLT5vZmZzZXQpIHsKKyAgICBzeiA9IG51bWJ5dGVzIC0gc3RhdGUtPm9mZnNldDsKKyAgICBieXRlcyArPSBzdGF0ZS0+b2Zmc2V0OworICB9CisgIGVsc2UgeworICAgIHNpemVfdCB0c3ogPSBzdHJsZW4odHJhaWwpOworCisgICAgc3ogPSBzdGF0ZS0+b2Zmc2V0IC0gbnVtYnl0ZXM7CisgICAgaWYoc3ogPj0gdHN6KQorICAgICAgcmV0dXJuIDA7CisgICAgYnl0ZXMgPSB0cmFpbCArIHN6OworICAgIHN6ID0gdHN6IC0gc3o7CisgIH0KKworICBpZihzeiA+IGJ1ZnNpemUpCisgICAgc3ogPSBidWZzaXplOworCisgIG1lbWNweShidWZmZXIsIGJ5dGVzLCBzeik7CisgIHN0YXRlLT5vZmZzZXQgKz0gc3o7CisgIHJldHVybiBzejsKK30KKworLyogUmVhZCBhIG5vbi1lbmNvZGVkIHBhcnQgY29udGVudC4gKi8KK3N0YXRpYyBzaXplX3QgcmVhZF9wYXJ0X2NvbnRlbnQoY3VybF9taW1lcGFydCAqcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSkKK3sKKyAgc2l6ZV90IHN6ID0gMDsKKworICBpZihwYXJ0LT5yZWFkZnVuYykKKyAgICBzeiA9IHBhcnQtPnJlYWRmdW5jKGJ1ZmZlciwgMSwgYnVmc2l6ZSwgcGFydC0+YXJnKTsKKyAgcmV0dXJuIHN6OworfQorCisvKiBSZWFkIGFuZCBlbmNvZGUgcGFydCBjb250ZW50LiAqLworc3RhdGljIHNpemVfdCByZWFkX2VuY29kZWRfcGFydF9jb250ZW50KGN1cmxfbWltZXBhcnQgKnBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSkKK3sKKyAgbWltZV9lbmNvZGVyX3N0YXRlICpzdCA9ICZwYXJ0LT5lbmNzdGF0ZTsKKyAgc2l6ZV90IGN1cnNpemUgPSAwOworICBzaXplX3Qgc3o7CisgIGJvb2wgYXRlb2YgPSBGQUxTRTsKKworICB3aGlsZShidWZzaXplKSB7CisgICAgaWYoc3QtPmJ1ZmJlZyA8IHN0LT5idWZlbmQgfHwgYXRlb2YpIHsKKyAgICAgIC8qIEVuY29kZSBidWZmZXJlZCBkYXRhLiAqLworICAgICAgc3ogPSBwYXJ0LT5lbmNvZGVyLT5lbmNvZGVmdW5jKGJ1ZmZlciwgYnVmc2l6ZSwgYXRlb2YsIHBhcnQpOworICAgICAgc3dpdGNoKHN6KSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIGlmKGF0ZW9mKQorICAgICAgICAgIHJldHVybiBjdXJzaXplOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ1VSTF9SRUFERlVOQ19BQk9SVDoKKyAgICAgIGNhc2UgQ1VSTF9SRUFERlVOQ19QQVVTRToKKyAgICAgIGNhc2UgUkVBRF9FUlJPUjoKKyAgICAgICAgcmV0dXJuIGN1cnNpemU/IGN1cnNpemU6IHN6OworICAgICAgZGVmYXVsdDoKKyAgICAgICAgY3Vyc2l6ZSArPSBzejsKKyAgICAgICAgYnVmZmVyICs9IHN6OworICAgICAgICBidWZzaXplIC09IHN6OworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBXZSBuZWVkIG1vcmUgZGF0YSBpbiBpbnB1dCBidWZmZXIuICovCisgICAgaWYoc3QtPmJ1ZmJlZykgeworICAgICAgc2l6ZV90IGxlbiA9IHN0LT5idWZlbmQgLSBzdC0+YnVmYmVnOworCisgICAgICBpZihsZW4pCisgICAgICAgIG1lbW1vdmUoc3QtPmJ1Ziwgc3QtPmJ1ZiArIHN0LT5idWZiZWcsIGxlbik7CisgICAgICBzdC0+YnVmYmVnID0gMDsKKyAgICAgIHN0LT5idWZlbmQgPSBsZW47CisgICAgfQorICAgIGlmKHN0LT5idWZlbmQgPj0gc2l6ZW9mIHN0LT5idWYpCisgICAgICByZXR1cm4gY3Vyc2l6ZT8gY3Vyc2l6ZTogUkVBRF9FUlJPUjsgICAgLyogQnVmZmVyIGZ1bGwuICovCisgICAgc3ogPSByZWFkX3BhcnRfY29udGVudChwYXJ0LCBzdC0+YnVmICsgc3QtPmJ1ZmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiBzdC0+YnVmIC0gc3QtPmJ1ZmVuZCk7CisgICAgc3dpdGNoKHN6KSB7CisgICAgY2FzZSAwOgorICAgICAgYXRlb2YgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDVVJMX1JFQURGVU5DX0FCT1JUOgorICAgIGNhc2UgQ1VSTF9SRUFERlVOQ19QQVVTRToKKyAgICBjYXNlIFJFQURfRVJST1I6CisgICAgICByZXR1cm4gY3Vyc2l6ZT8gY3Vyc2l6ZTogc3o7CisgICAgZGVmYXVsdDoKKyAgICAgIHN0LT5idWZlbmQgKz0gc3o7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gY3Vyc2l6ZTsKK30KKworLyogUmVhZGJhY2sgYSBtaW1lIHBhcnQuICovCitzdGF0aWMgc2l6ZV90IHJlYWRiYWNrX3BhcnQoY3VybF9taW1lcGFydCAqcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpidWZmZXIsIHNpemVfdCBidWZzaXplKQoreworICBzaXplX3QgY3Vyc2l6ZSA9IDA7CisgIHNpemVfdCBzejsKKyAgc3RydWN0IGN1cmxfc2xpc3QgKmhkcjsKKyNpZmRlZiBDVVJMX0RPRVNfQ09OVkVSU0lPTlMKKyAgY2hhciAqY29udmJ1ZiA9IGJ1ZmZlcjsKKyNlbmRpZgorCisgIC8qIFJlYWRiYWNrIGZyb20gcGFydC4gKi8KKworICB3aGlsZShidWZzaXplKSB7CisgICAgc3ogPSAwOworICAgIGhkciA9IChzdHJ1Y3QgY3VybF9zbGlzdCAqKSBwYXJ0LT5zdGF0ZS5wdHI7CisgICAgc3dpdGNoKHBhcnQtPnN0YXRlLnN0YXRlKSB7CisgICAgY2FzZSBNSU1FU1RBVEVfQkVHSU46CisgICAgICBtaW1lc2V0c3RhdGUoJnBhcnQtPnN0YXRlLCBwYXJ0LT5mbGFncyAmIE1JTUVfQk9EWV9PTkxZPyBNSU1FU1RBVEVfQk9EWToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTUVTVEFURV9DVVJMSEVBREVSUywgcGFydC0+Y3VybGhlYWRlcnMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNSU1FU1RBVEVfVVNFUkhFQURFUlM6CisgICAgICBpZighaGRyKSB7CisgICAgICAgIG1pbWVzZXRzdGF0ZSgmcGFydC0+c3RhdGUsIE1JTUVTVEFURV9FT0gsIE5VTEwpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmKG1hdGNoX2hlYWRlcihoZHIsICJDb250ZW50LVR5cGUiLCAxMikpIHsKKyAgICAgICAgbWltZXNldHN0YXRlKCZwYXJ0LT5zdGF0ZSwgTUlNRVNUQVRFX1VTRVJIRUFERVJTLCBoZHItPm5leHQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgY2FzZSBNSU1FU1RBVEVfQ1VSTEhFQURFUlM6CisgICAgICBpZighaGRyKQorICAgICAgICBtaW1lc2V0c3RhdGUoJnBhcnQtPnN0YXRlLCBNSU1FU1RBVEVfVVNFUkhFQURFUlMsIHBhcnQtPnVzZXJoZWFkZXJzKTsKKyAgICAgIGVsc2UgeworICAgICAgICBzeiA9IHJlYWRiYWNrX2J5dGVzKCZwYXJ0LT5zdGF0ZSwgYnVmZmVyLCBidWZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkci0+ZGF0YSwgc3RybGVuKGhkci0+ZGF0YSksICJcclxuIik7CisgICAgICAgIGlmKCFzeikKKyAgICAgICAgICBtaW1lc2V0c3RhdGUoJnBhcnQtPnN0YXRlLCBwYXJ0LT5zdGF0ZS5zdGF0ZSwgaGRyLT5uZXh0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgTUlNRVNUQVRFX0VPSDoKKyAgICAgIHN6ID0gcmVhZGJhY2tfYnl0ZXMoJnBhcnQtPnN0YXRlLCBidWZmZXIsIGJ1ZnNpemUsICJcclxuIiwgMiwgIiIpOworICAgICAgaWYoIXN6KQorICAgICAgICBtaW1lc2V0c3RhdGUoJnBhcnQtPnN0YXRlLCBNSU1FU1RBVEVfQk9EWSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1JTUVTVEFURV9CT0RZOgorI2lmZGVmIENVUkxfRE9FU19DT05WRVJTSU9OUworICAgICAgaWYocGFydC0+ZWFzeSAmJiBjb252YnVmIDwgYnVmZmVyKSB7CisgICAgICAgIENVUkxjb2RlIHJlc3VsdCA9IEN1cmxfY29udmVydF90b19uZXR3b3JrKHBhcnQtPmVhc3ksIGNvbnZidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciAtIGNvbnZidWYpOworICAgICAgICBpZihyZXN1bHQpCisgICAgICAgICAgcmV0dXJuIFJFQURfRVJST1I7CisgICAgICAgIGNvbnZidWYgPSBidWZmZXI7CisgICAgICB9CisjZW5kaWYKKyAgICAgIGNsZWFudXBfZW5jb2Rlcl9zdGF0ZSgmcGFydC0+ZW5jc3RhdGUpOworICAgICAgbWltZXNldHN0YXRlKCZwYXJ0LT5zdGF0ZSwgTUlNRVNUQVRFX0NPTlRFTlQsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNSU1FU1RBVEVfQ09OVEVOVDoKKyAgICAgIGlmKHBhcnQtPmVuY29kZXIpCisgICAgICAgIHN6ID0gcmVhZF9lbmNvZGVkX3BhcnRfY29udGVudChwYXJ0LCBidWZmZXIsIGJ1ZnNpemUpOworICAgICAgZWxzZQorICAgICAgICBzeiA9IHJlYWRfcGFydF9jb250ZW50KHBhcnQsIGJ1ZmZlciwgYnVmc2l6ZSk7CisgICAgICBzd2l0Y2goc3opIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgbWltZXNldHN0YXRlKCZwYXJ0LT5zdGF0ZSwgTUlNRVNUQVRFX0VORCwgTlVMTCk7CisgICAgICAgIC8qIFRyeSBzcGFyaW5nIG9wZW4gZmlsZSBkZXNjcmlwdG9ycy4gKi8KKyAgICAgICAgaWYocGFydC0+a2luZCA9PSBNSU1FS0lORF9GSUxFICYmIHBhcnQtPmZwKSB7CisgICAgICAgICAgZmNsb3NlKHBhcnQtPmZwKTsKKyAgICAgICAgICBwYXJ0LT5mcCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgIGNhc2UgQ1VSTF9SRUFERlVOQ19BQk9SVDoKKyAgICAgIGNhc2UgQ1VSTF9SRUFERlVOQ19QQVVTRToKKyAgICAgIGNhc2UgUkVBRF9FUlJPUjoKKyAgICAgICAgcmV0dXJuIGN1cnNpemU/IGN1cnNpemU6IHN6OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBNSU1FU1RBVEVfRU5EOgorICAgICAgcmV0dXJuIGN1cnNpemU7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOyAgICAvKiBPdGhlciB2YWx1ZXMgbm90IGluIHBhcnQgc3RhdGUuICovCisgICAgfQorCisgICAgLyogQnVtcCBidWZmZXIgYW5kIGNvdW50ZXJzIGFjY29yZGluZyB0byByZWFkIHNpemUuICovCisgICAgY3Vyc2l6ZSArPSBzejsKKyAgICBidWZmZXIgKz0gc3o7CisgICAgYnVmc2l6ZSAtPSBzejsKKyAgfQorCisjaWZkZWYgQ1VSTF9ET0VTX0NPTlZFUlNJT05TCisgICAgICBpZihwYXJ0LT5lYXN5ICYmIGNvbnZidWYgPCBidWZmZXIgJiYKKyAgICAgICAgIHBhcnQtPnN0YXRlLnN0YXRlIDwgTUlNRVNUQVRFX0JPRFkpIHsKKyAgICAgICAgQ1VSTGNvZGUgcmVzdWx0ID0gQ3VybF9jb252ZXJ0X3RvX25ldHdvcmsocGFydC0+ZWFzeSwgY29udmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIC0gY29udmJ1Zik7CisgICAgICAgIGlmKHJlc3VsdCkKKyAgICAgICAgICByZXR1cm4gUkVBRF9FUlJPUjsKKyAgICAgIH0KKyNlbmRpZgorCisgIHJldHVybiBjdXJzaXplOworfQorCisvKiBSZWFkYmFjayBmcm9tIG1pbWUuICovCitzdGF0aWMgc2l6ZV90IG1pbWVfc3VicGFydHNfcmVhZChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplLCBzaXplX3Qgbml0ZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqaW5zdHJlYW0pCit7CisgIGN1cmxfbWltZSAqbWltZSA9IChjdXJsX21pbWUgKikgaW5zdHJlYW07CisgIHNpemVfdCBjdXJzaXplID0gMDsKKyAgc2l6ZV90IHN6OworICBjdXJsX21pbWVwYXJ0ICpwYXJ0OworI2lmZGVmIENVUkxfRE9FU19DT05WRVJTSU9OUworICBjaGFyICpjb252YnVmID0gYnVmZmVyOworI2VuZGlmCisKKyAgKHZvaWQpIHNpemU7ICAgLyogQWx3YXlzIDEuICovCisKKyAgd2hpbGUobml0ZW1zKSB7CisgICAgc3ogPSAwOworICAgIHBhcnQgPSBtaW1lLT5zdGF0ZS5wdHI7CisgICAgc3dpdGNoKG1pbWUtPnN0YXRlLnN0YXRlKSB7CisgICAgY2FzZSBNSU1FU1RBVEVfQkVHSU46CisgICAgY2FzZSBNSU1FU1RBVEVfQk9EWToKKyNpZmRlZiBDVVJMX0RPRVNfQ09OVkVSU0lPTlMKKyAgICAgIGNvbnZidWYgPSBidWZmZXI7CisjZW5kaWYKKyAgICAgIG1pbWVzZXRzdGF0ZSgmbWltZS0+c3RhdGUsIE1JTUVTVEFURV9CT1VOREFSWTEsIG1pbWUtPmZpcnN0cGFydCk7CisgICAgICAvKiBUaGUgZmlyc3QgYm91bmRhcnkgYWx3YXlzIGZvbGxvd3MgdGhlIGhlYWRlciB0ZXJtaW5hdGlvbiBlbXB0eSBsaW5lLAorICAgICAgICAgc28gaXMgYWx3YXlzIHByZWNlZGVkIGJ5IGEgQ1JMSy4gV2UgY2FuIHRoZW4gc3BhcmUgMiBjaGFyYWN0ZXJzCisgICAgICAgICBieSBza2lwcGluZyB0aGUgbGVhZGluZyBDUkxGIGluIGJvdW5kYXJ5LiAqLworICAgICAgbWltZS0+c3RhdGUub2Zmc2V0ICs9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1JTUVTVEFURV9CT1VOREFSWTE6CisgICAgICBzeiA9IHJlYWRiYWNrX2J5dGVzKCZtaW1lLT5zdGF0ZSwgYnVmZmVyLCBuaXRlbXMsICJcclxuLS0iLCA0LCAiIik7CisgICAgICBpZighc3opCisgICAgICAgIG1pbWVzZXRzdGF0ZSgmbWltZS0+c3RhdGUsIE1JTUVTVEFURV9CT1VOREFSWTIsIHBhcnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNSU1FU1RBVEVfQk9VTkRBUlkyOgorICAgICAgc3ogPSByZWFkYmFja19ieXRlcygmbWltZS0+c3RhdGUsIGJ1ZmZlciwgbml0ZW1zLCBtaW1lLT5ib3VuZGFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKG1pbWUtPmJvdW5kYXJ5KSwgcGFydD8gIlxyXG4iOiAiLS1cclxuIik7CisgICAgICBpZighc3opIHsKKyNpZmRlZiBDVVJMX0RPRVNfQ09OVkVSU0lPTlMKKyAgICAgICAgaWYobWltZS0+ZWFzeSAmJiBjb252YnVmIDwgYnVmZmVyKSB7CisgICAgICAgICAgQ1VSTGNvZGUgcmVzdWx0ID0gQ3VybF9jb252ZXJ0X3RvX25ldHdvcmsobWltZS0+ZWFzeSwgY29udmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgLSBjb252YnVmKTsKKyAgICAgICAgICBpZihyZXN1bHQpCisgICAgICAgICAgICByZXR1cm4gUkVBRF9FUlJPUjsKKyAgICAgICAgICBjb252YnVmID0gYnVmZmVyOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgbWltZXNldHN0YXRlKCZtaW1lLT5zdGF0ZSwgTUlNRVNUQVRFX0NPTlRFTlQsIHBhcnQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBNSU1FU1RBVEVfQ09OVEVOVDoKKyAgICAgIGlmKCFwYXJ0KSB7CisgICAgICAgIG1pbWVzZXRzdGF0ZSgmbWltZS0+c3RhdGUsIE1JTUVTVEFURV9FTkQsIE5VTEwpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHN6ID0gcmVhZGJhY2tfcGFydChwYXJ0LCBidWZmZXIsIG5pdGVtcyk7CisgICAgICBzd2l0Y2goc3opIHsKKyAgICAgIGNhc2UgQ1VSTF9SRUFERlVOQ19BQk9SVDoKKyAgICAgIGNhc2UgQ1VSTF9SRUFERlVOQ19QQVVTRToKKyAgICAgIGNhc2UgUkVBRF9FUlJPUjoKKyAgICAgICAgcmV0dXJuIGN1cnNpemU/IGN1cnNpemU6IHN6OworICAgICAgY2FzZSAwOgorI2lmZGVmIENVUkxfRE9FU19DT05WRVJTSU9OUworICAgICAgICBjb252YnVmID0gYnVmZmVyOworI2VuZGlmCisgICAgICAgIG1pbWVzZXRzdGF0ZSgmbWltZS0+c3RhdGUsIE1JTUVTVEFURV9CT1VOREFSWTEsIHBhcnQtPm5leHRwYXJ0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIE1JTUVTVEFURV9FTkQ6CisgICAgICByZXR1cm4gY3Vyc2l6ZTsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7ICAgIC8qIG90aGVyIHZhbHVlcyBub3QgdXNlZCBpbiBtaW1lIHN0YXRlLiAqLworICAgIH0KKworICAgIC8qIEJ1bXAgYnVmZmVyIGFuZCBjb3VudGVycyBhY2NvcmRpbmcgdG8gcmVhZCBzaXplLiAqLworICAgIGN1cnNpemUgKz0gc3o7CisgICAgYnVmZmVyICs9IHN6OworICAgIG5pdGVtcyAtPSBzejsKKyAgfQorCisjaWZkZWYgQ1VSTF9ET0VTX0NPTlZFUlNJT05TCisgICAgICBpZihtaW1lLT5lYXN5ICYmIGNvbnZidWYgPCBidWZmZXIgJiYKKyAgICAgICAgIG1pbWUtPnN0YXRlLnN0YXRlIDw9IE1JTUVTVEFURV9DT05URU5UKSB7CisgICAgICAgIENVUkxjb2RlIHJlc3VsdCA9IEN1cmxfY29udmVydF90b19uZXR3b3JrKG1pbWUtPmVhc3ksIGNvbnZidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciAtIGNvbnZidWYpOworICAgICAgICBpZihyZXN1bHQpCisgICAgICAgICAgcmV0dXJuIFJFQURfRVJST1I7CisgICAgICB9CisjZW5kaWYKKworICByZXR1cm4gY3Vyc2l6ZTsKK30KKworc3RhdGljIGludCBtaW1lX3BhcnRfcmV3aW5kKGN1cmxfbWltZXBhcnQgKnBhcnQpCit7CisgIGludCByZXMgPSBDVVJMX1NFRUtGVU5DX09LOworICBlbnVtIG1pbWVzdGF0ZSB0YXJnZXRzdGF0ZSA9IE1JTUVTVEFURV9CRUdJTjsKKworICBpZihwYXJ0LT5mbGFncyAmIE1JTUVfQk9EWV9PTkxZKQorICAgIHRhcmdldHN0YXRlID0gTUlNRVNUQVRFX0JPRFk7CisgIGNsZWFudXBfZW5jb2Rlcl9zdGF0ZSgmcGFydC0+ZW5jc3RhdGUpOworICBpZihwYXJ0LT5zdGF0ZS5zdGF0ZSA+IHRhcmdldHN0YXRlKSB7CisgICAgcmVzID0gQ1VSTF9TRUVLRlVOQ19DQU5UU0VFSzsKKyAgICBpZihwYXJ0LT5zZWVrZnVuYykgeworICAgICAgcmVzID0gcGFydC0+c2Vla2Z1bmMocGFydC0+YXJnLCAoY3VybF9vZmZfdCkgMCwgU0VFS19TRVQpOworICAgICAgc3dpdGNoKHJlcykgeworICAgICAgY2FzZSBDVVJMX1NFRUtGVU5DX09LOgorICAgICAgY2FzZSBDVVJMX1NFRUtGVU5DX0ZBSUw6CisgICAgICBjYXNlIENVUkxfU0VFS0ZVTkNfQ0FOVFNFRUs6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAtMTogICAgLyogRm9yIGZzZWVrKCkgZXJyb3IuICovCisgICAgICAgIHJlcyA9IENVUkxfU0VFS0ZVTkNfQ0FOVFNFRUs7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmVzID0gQ1VSTF9TRUVLRlVOQ19GQUlMOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZihyZXMgPT0gQ1VSTF9TRUVLRlVOQ19PSykKKyAgICBtaW1lc2V0c3RhdGUoJnBhcnQtPnN0YXRlLCB0YXJnZXRzdGF0ZSwgTlVMTCk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBtaW1lX3N1YnBhcnRzX3NlZWsodm9pZCAqaW5zdHJlYW0sIGN1cmxfb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKQoreworICBjdXJsX21pbWUgKm1pbWUgPSAoY3VybF9taW1lICopIGluc3RyZWFtOworICBjdXJsX21pbWVwYXJ0ICpwYXJ0OworICBpbnQgcmVzdWx0ID0gQ1VSTF9TRUVLRlVOQ19PSzsKKyAgaW50IHJlczsKKworICBpZih3aGVuY2UgIT0gU0VFS19TRVQgfHwgb2Zmc2V0KQorICAgIHJldHVybiBDVVJMX1NFRUtGVU5DX0NBTlRTRUVLOyAgICAvKiBPbmx5IHN1cHBvcnQgZnVsbCByZXdpbmQuICovCisKKyAgaWYobWltZS0+c3RhdGUuc3RhdGUgPT0gTUlNRVNUQVRFX0JFR0lOKQorICAgcmV0dXJuIENVUkxfU0VFS0ZVTkNfT0s7ICAgICAgICAgICAvKiBBbHJlYWR5IHJld291bmQuICovCisKKyAgZm9yKHBhcnQgPSBtaW1lLT5maXJzdHBhcnQ7IHBhcnQ7IHBhcnQgPSBwYXJ0LT5uZXh0cGFydCkgeworICAgIHJlcyA9IG1pbWVfcGFydF9yZXdpbmQocGFydCk7CisgICAgaWYocmVzICE9IENVUkxfU0VFS0ZVTkNfT0spCisgICAgICByZXN1bHQgPSByZXM7CisgIH0KKworICBpZihyZXN1bHQgPT0gQ1VSTF9TRUVLRlVOQ19PSykKKyAgICBtaW1lc2V0c3RhdGUoJm1pbWUtPnN0YXRlLCBNSU1FU1RBVEVfQkVHSU4sIE5VTEwpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIG1pbWVfc3VicGFydHNfZnJlZSh2b2lkICpwdHIpCit7CisgIGN1cmxfbWltZSAqbWltZSA9IChjdXJsX21pbWUgKikgcHRyOworICBjdXJsX21pbWVfZnJlZShtaW1lKTsKK30KKworCisvKiBSZWxlYXNlIHBhcnQgY29udGVudC4gKi8KK3N0YXRpYyB2b2lkIGNsZWFudXBfcGFydF9jb250ZW50KGN1cmxfbWltZXBhcnQgKnBhcnQpCit7CisgIGlmKHBhcnQtPmZyZWVmdW5jKQorICAgIHBhcnQtPmZyZWVmdW5jKHBhcnQtPmFyZyk7CisKKyAgcGFydC0+cmVhZGZ1bmMgPSBOVUxMOworICBwYXJ0LT5zZWVrZnVuYyA9IE5VTEw7CisgIHBhcnQtPmZyZWVmdW5jID0gTlVMTDsKKyAgcGFydC0+YXJnID0gKHZvaWQgKikgcGFydDsgICAgICAgICAgLyogRGVmYXVsdHMgdG8gcGFydCBpdHNlbGYuICovCisgIHBhcnQtPmRhdGEgPSBOVUxMOworICBwYXJ0LT5mcCA9IE5VTEw7CisgIHBhcnQtPmRhdGFzaXplID0gKGN1cmxfb2ZmX3QpIDA7ICAgIC8qIE5vIHNpemUgeWV0LiAqLworICBwYXJ0LT5lbmNvZGVyID0gTlVMTDsKKyAgY2xlYW51cF9lbmNvZGVyX3N0YXRlKCZwYXJ0LT5lbmNzdGF0ZSk7CisgIHBhcnQtPmtpbmQgPSBNSU1FS0lORF9OT05FOworfQorCit2b2lkIEN1cmxfbWltZV9jbGVhbnBhcnQoY3VybF9taW1lcGFydCAqcGFydCkKK3sKKyAgY2xlYW51cF9wYXJ0X2NvbnRlbnQocGFydCk7CisgIGN1cmxfc2xpc3RfZnJlZV9hbGwocGFydC0+Y3VybGhlYWRlcnMpOworICBpZihwYXJ0LT5mbGFncyAmIE1JTUVfVVNFUkhFQURFUlNfT1dORVIpCisgICAgY3VybF9zbGlzdF9mcmVlX2FsbChwYXJ0LT51c2VyaGVhZGVycyk7CisgIEN1cmxfc2FmZWZyZWUocGFydC0+bWltZXR5cGUpOworICBDdXJsX3NhZmVmcmVlKHBhcnQtPm5hbWUpOworICBDdXJsX3NhZmVmcmVlKHBhcnQtPmZpbGVuYW1lKTsKKyAgQ3VybF9taW1lX2luaXRwYXJ0KHBhcnQsIHBhcnQtPmVhc3kpOworfQorCisvKiBSZWN1cnNpdmVseSBkZWxldGUgYSBtaW1lIGhhbmRsZSBhbmQgaXRzIHBhcnRzLiAqLwordm9pZCBjdXJsX21pbWVfZnJlZShjdXJsX21pbWUgKm1pbWUpCit7CisgIGN1cmxfbWltZXBhcnQgKnBhcnQ7CisKKyAgaWYobWltZSkgeworICAgIHdoaWxlKG1pbWUtPmZpcnN0cGFydCkgeworICAgICAgcGFydCA9IG1pbWUtPmZpcnN0cGFydDsKKyAgICAgIG1pbWUtPmZpcnN0cGFydCA9IHBhcnQtPm5leHRwYXJ0OworICAgICAgQ3VybF9taW1lX2NsZWFucGFydChwYXJ0KTsKKyAgICAgIGZyZWUocGFydCk7CisgICAgfQorCisgICAgZnJlZShtaW1lLT5ib3VuZGFyeSk7CisgICAgZnJlZShtaW1lKTsKKyAgfQorfQorCisvKgorICogTWltZSBidWlsZCBmdW5jdGlvbnMuCisgKi8KKworLyogQ3JlYXRlIGEgbWltZSBoYW5kbGUuICovCitjdXJsX21pbWUgKmN1cmxfbWltZV9pbml0KHN0cnVjdCBDdXJsX2Vhc3kgKmVhc3kpCit7CisgIGN1cmxfbWltZSAqbWltZTsKKworICBtaW1lID0gKGN1cmxfbWltZSAqKSBtYWxsb2Moc2l6ZW9mICptaW1lKTsKKworICBpZihtaW1lKSB7CisgICAgbWltZS0+ZWFzeSA9IGVhc3k7CisgICAgbWltZS0+cGFyZW50ID0gTlVMTDsKKyAgICBtaW1lLT5maXJzdHBhcnQgPSBOVUxMOworICAgIG1pbWUtPmxhc3RwYXJ0ID0gTlVMTDsKKworICAgIC8qIEdldCBhIHBhcnQgYm91bmRhcnkuICovCisgICAgbWltZS0+Ym91bmRhcnkgPSBtYWxsb2MoMjQgKyBNSU1FX1JBTkRfQk9VTkRBUllfQ0hBUlMgKyAxKTsKKyAgICBpZighbWltZS0+Ym91bmRhcnkpIHsKKyAgICAgIGZyZWUobWltZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBtZW1zZXQobWltZS0+Ym91bmRhcnksICctJywgMjQpOworICAgIEN1cmxfcmFuZF9oZXgoZWFzeSwgKHVuc2lnbmVkIGNoYXIgKikgbWltZS0+Ym91bmRhcnkgKyAyNCwKKyAgICAgICAgICAgICAgICAgIE1JTUVfUkFORF9CT1VOREFSWV9DSEFSUyArIDEpOworICAgIG1pbWVzZXRzdGF0ZSgmbWltZS0+c3RhdGUsIE1JTUVTVEFURV9CRUdJTiwgTlVMTCk7CisgIH0KKworICByZXR1cm4gbWltZTsKK30KKworLyogSW5pdGlhbGl6ZSBhIG1pbWUgcGFydC4gKi8KK3ZvaWQgQ3VybF9taW1lX2luaXRwYXJ0KGN1cmxfbWltZXBhcnQgKnBhcnQsIHN0cnVjdCBDdXJsX2Vhc3kgKmVhc3kpCit7CisgIG1lbXNldCgoY2hhciAqKSBwYXJ0LCAwLCBzaXplb2YgKnBhcnQpOworICBwYXJ0LT5lYXN5ID0gZWFzeTsKKyAgbWltZXNldHN0YXRlKCZwYXJ0LT5zdGF0ZSwgTUlNRVNUQVRFX0JFR0lOLCBOVUxMKTsKK30KKworLyogQ3JlYXRlIGEgbWltZSBwYXJ0IGFuZCBhcHBlbmQgaXQgdG8gYSBtaW1lIGhhbmRsZSdzIHBhcnQgbGlzdC4gKi8KK2N1cmxfbWltZXBhcnQgKmN1cmxfbWltZV9hZGRwYXJ0KGN1cmxfbWltZSAqbWltZSkKK3sKKyAgY3VybF9taW1lcGFydCAqcGFydDsKKworICBpZighbWltZSkKKyAgICByZXR1cm4gTlVMTDsKKworICBwYXJ0ID0gKGN1cmxfbWltZXBhcnQgKikgbWFsbG9jKHNpemVvZiAqcGFydCk7CisKKyAgaWYocGFydCkgeworICAgIEN1cmxfbWltZV9pbml0cGFydChwYXJ0LCBtaW1lLT5lYXN5KTsKKyAgICBwYXJ0LT5wYXJlbnQgPSBtaW1lOworCisgICAgaWYobWltZS0+bGFzdHBhcnQpCisgICAgICBtaW1lLT5sYXN0cGFydC0+bmV4dHBhcnQgPSBwYXJ0OworICAgIGVsc2UKKyAgICAgIG1pbWUtPmZpcnN0cGFydCA9IHBhcnQ7CisKKyAgICBtaW1lLT5sYXN0cGFydCA9IHBhcnQ7CisgIH0KKworICByZXR1cm4gcGFydDsKK30KKworLyogU2V0IG1pbWUgcGFydCBuYW1lLiAqLworQ1VSTGNvZGUgY3VybF9taW1lX25hbWUoY3VybF9taW1lcGFydCAqcGFydCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgaWYoIXBhcnQpCisgICAgcmV0dXJuIENVUkxFX0JBRF9GVU5DVElPTl9BUkdVTUVOVDsKKworICBDdXJsX3NhZmVmcmVlKHBhcnQtPm5hbWUpOworICBwYXJ0LT5uYW1lID0gTlVMTDsKKworICBpZihuYW1lKSB7CisgICAgcGFydC0+bmFtZSA9IHN0cmR1cChuYW1lKTsKKyAgICBpZighcGFydC0+bmFtZSkKKyAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOworICB9CisKKyAgcmV0dXJuIENVUkxFX09LOworfQorCisvKiBTZXQgbWltZSBwYXJ0IHJlbW90ZSBmaWxlIG5hbWUuICovCitDVVJMY29kZSBjdXJsX21pbWVfZmlsZW5hbWUoY3VybF9taW1lcGFydCAqcGFydCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgIGlmKCFwYXJ0KQorICAgIHJldHVybiBDVVJMRV9CQURfRlVOQ1RJT05fQVJHVU1FTlQ7CisKKyAgQ3VybF9zYWZlZnJlZShwYXJ0LT5maWxlbmFtZSk7CisgIHBhcnQtPmZpbGVuYW1lID0gTlVMTDsKKworICBpZihmaWxlbmFtZSkgeworICAgIHBhcnQtPmZpbGVuYW1lID0gc3RyZHVwKGZpbGVuYW1lKTsKKyAgICBpZighcGFydC0+ZmlsZW5hbWUpCisgICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKKyAgfQorCisgIHJldHVybiBDVVJMRV9PSzsKK30KKworLyogU2V0IG1pbWUgcGFydCBjb250ZW50IGZyb20gbWVtb3J5IGRhdGEuICovCitDVVJMY29kZSBjdXJsX21pbWVfZGF0YShjdXJsX21pbWVwYXJ0ICpwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGRhdGFzaXplKQoreworICBpZighcGFydCkKKyAgICByZXR1cm4gQ1VSTEVfQkFEX0ZVTkNUSU9OX0FSR1VNRU5UOworCisgIGNsZWFudXBfcGFydF9jb250ZW50KHBhcnQpOworCisgIGlmKGRhdGEpIHsKKyAgICBpZihkYXRhc2l6ZSA9PSBDVVJMX1pFUk9fVEVSTUlOQVRFRCkKKyAgICAgIGRhdGFzaXplID0gc3RybGVuKGRhdGEpOworCisgICAgcGFydC0+ZGF0YSA9IG1hbGxvYyhkYXRhc2l6ZSArIDEpOworICAgIGlmKCFwYXJ0LT5kYXRhKQorICAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CisKKyAgICBwYXJ0LT5kYXRhc2l6ZSA9IGRhdGFzaXplOworCisgICAgaWYoZGF0YXNpemUpCisgICAgICBtZW1jcHkocGFydC0+ZGF0YSwgZGF0YSwgZGF0YXNpemUpOworICAgIHBhcnQtPmRhdGFbZGF0YXNpemVdID0gJ1wwJzsgICAgLyogU2V0IGEgbnVsIHRlcm1pbmF0b3IgYXMgc2VudGluZWwuICovCisKKyAgICBwYXJ0LT5yZWFkZnVuYyA9IG1pbWVfbWVtX3JlYWQ7CisgICAgcGFydC0+c2Vla2Z1bmMgPSBtaW1lX21lbV9zZWVrOworICAgIHBhcnQtPmZyZWVmdW5jID0gbWltZV9tZW1fZnJlZTsKKyAgICBwYXJ0LT5raW5kID0gTUlNRUtJTkRfREFUQTsKKyAgfQorCisgIHJldHVybiBDVVJMRV9PSzsKK30KKworLyogU2V0IG1pbWUgcGFydCBjb250ZW50IGZyb20gbmFtZWQgbG9jYWwgZmlsZS4gKi8KK0NVUkxjb2RlIGN1cmxfbWltZV9maWxlZGF0YShjdXJsX21pbWVwYXJ0ICpwYXJ0LCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7CisgIGNoYXIgKmJhc2U7CisKKyAgaWYoIXBhcnQpCisgICAgcmV0dXJuIENVUkxFX0JBRF9GVU5DVElPTl9BUkdVTUVOVDsKKworICBjbGVhbnVwX3BhcnRfY29udGVudChwYXJ0KTsKKworICBpZihmaWxlbmFtZSkgeworICAgIHN0cnVjdF9zdGF0IHNidWY7CisKKyAgICBpZihzdGF0KGZpbGVuYW1lLCAmc2J1ZikgfHwgYWNjZXNzKGZpbGVuYW1lLCBSX09LKSkKKyAgICAgIHJlc3VsdCA9IENVUkxFX1JFQURfRVJST1I7CisKKyAgICBwYXJ0LT5kYXRhID0gc3RyZHVwKGZpbGVuYW1lKTsKKyAgICBpZighcGFydC0+ZGF0YSkKKyAgICAgIHJlc3VsdCA9IENVUkxFX09VVF9PRl9NRU1PUlk7CisKKyAgICBwYXJ0LT5kYXRhc2l6ZSA9IC0xOworICAgIGlmKCFyZXN1bHQgJiYgU19JU1JFRyhzYnVmLnN0X21vZGUpKSB7CisgICAgICBwYXJ0LT5kYXRhc2l6ZSA9IGZpbGVzaXplKGZpbGVuYW1lLCBzYnVmKTsKKyAgICAgIHBhcnQtPnNlZWtmdW5jID0gbWltZV9maWxlX3NlZWs7CisgICAgfQorCisgICAgcGFydC0+cmVhZGZ1bmMgPSBtaW1lX2ZpbGVfcmVhZDsKKyAgICBwYXJ0LT5mcmVlZnVuYyA9IG1pbWVfZmlsZV9mcmVlOworICAgIHBhcnQtPmtpbmQgPSBNSU1FS0lORF9GSUxFOworCisgICAgLyogQXMgYSBzaWRlIGVmZmVjdCwgc2V0IHRoZSBmaWxlbmFtZSB0byB0aGUgY3VycmVudCBmaWxlJ3MgYmFzZSBuYW1lLgorICAgICAgIEl0IGlzIHBvc3NpYmxlIHRvIHdpdGhkcmF3IHRoaXMgYnkgZXhwbGljaXRseSBjYWxsaW5nCisgICAgICAgY3VybF9taW1lX2ZpbGVuYW1lKCkgd2l0aCBhIE5VTEwgZmlsZW5hbWUgYXJndW1lbnQgYWZ0ZXIgdGhlIGN1cnJlbnQKKyAgICAgICBjYWxsLiAqLworICAgIGJhc2UgPSBzdHJpcHBhdGgoZmlsZW5hbWUpOworICAgIGlmKCFiYXNlKQorICAgICAgcmVzdWx0ID0gQ1VSTEVfT1VUX09GX01FTU9SWTsKKyAgICBlbHNlIHsKKyAgICAgIENVUkxjb2RlIHJlcyA9IGN1cmxfbWltZV9maWxlbmFtZShwYXJ0LCBiYXNlKTsKKworICAgICAgaWYocmVzKQorICAgICAgICByZXN1bHQgPSByZXM7CisgICAgICBmcmVlKGJhc2UpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKiBTZXQgbWltZSBwYXJ0IHR5cGUuICovCitDVVJMY29kZSBjdXJsX21pbWVfdHlwZShjdXJsX21pbWVwYXJ0ICpwYXJ0LCBjb25zdCBjaGFyICptaW1ldHlwZSkKK3sKKyAgaWYoIXBhcnQpCisgICAgcmV0dXJuIENVUkxFX0JBRF9GVU5DVElPTl9BUkdVTUVOVDsKKworICBDdXJsX3NhZmVmcmVlKHBhcnQtPm1pbWV0eXBlKTsKKyAgcGFydC0+bWltZXR5cGUgPSBOVUxMOworCisgIGlmKG1pbWV0eXBlKSB7CisgICAgcGFydC0+bWltZXR5cGUgPSBzdHJkdXAobWltZXR5cGUpOworICAgIGlmKCFwYXJ0LT5taW1ldHlwZSkKKyAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOworICB9CisKKyAgcmV0dXJuIENVUkxFX09LOworfQorCisvKiBTZXQgbWltZSBkYXRhIHRyYW5zZmVyIGVuY29kZXIuICovCitDVVJMY29kZSBjdXJsX21pbWVfZW5jb2RlcihjdXJsX21pbWVwYXJ0ICpwYXJ0LCBjb25zdCBjaGFyICplbmNvZGluZykKK3sKKyAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfQkFEX0ZVTkNUSU9OX0FSR1VNRU5UOworICBjb25zdCBtaW1lX2VuY29kZXIgKm1lcDsKKworICBpZighcGFydCkKKyAgICByZXR1cm4gcmVzdWx0OworCisgIHBhcnQtPmVuY29kZXIgPSBOVUxMOworCisgIGlmKCFlbmNvZGluZykKKyAgICByZXR1cm4gQ1VSTEVfT0s7ICAgIC8qIFJlbW92aW5nIGN1cnJlbnQgZW5jb2Rlci4gKi8KKworICBmb3IobWVwID0gZW5jb2RlcnM7IG1lcC0+bmFtZTsgbWVwKyspCisgICAgaWYoc3RyY2FzZWNvbXBhcmUoZW5jb2RpbmcsIG1lcC0+bmFtZSkpIHsKKyAgICAgIHBhcnQtPmVuY29kZXIgPSBtZXA7CisgICAgICByZXN1bHQgPSBDVVJMRV9PSzsKKyAgICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogU2V0IG1pbWUgcGFydCBoZWFkZXJzLiAqLworQ1VSTGNvZGUgY3VybF9taW1lX2hlYWRlcnMoY3VybF9taW1lcGFydCAqcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjdXJsX3NsaXN0ICpoZWFkZXJzLCBpbnQgdGFrZV9vd25lcnNoaXApCit7CisgIGlmKCFwYXJ0KQorICAgIHJldHVybiBDVVJMRV9CQURfRlVOQ1RJT05fQVJHVU1FTlQ7CisKKyAgaWYocGFydC0+ZmxhZ3MgJiBNSU1FX1VTRVJIRUFERVJTX09XTkVSKSB7CisgICAgY3VybF9zbGlzdF9mcmVlX2FsbChwYXJ0LT51c2VyaGVhZGVycyk7CisgICAgcGFydC0+ZmxhZ3MgJj0gfk1JTUVfVVNFUkhFQURFUlNfT1dORVI7CisgIH0KKyAgcGFydC0+dXNlcmhlYWRlcnMgPSBoZWFkZXJzOworICBpZihoZWFkZXJzICYmIHRha2Vfb3duZXJzaGlwKQorICAgIHBhcnQtPmZsYWdzIHw9IE1JTUVfVVNFUkhFQURFUlNfT1dORVI7CisgIHJldHVybiBDVVJMRV9PSzsKK30KKworLyogU2V0IG1pbWUgcGFydCBjb250ZW50IGZyb20gY2FsbGJhY2suICovCitDVVJMY29kZSBjdXJsX21pbWVfZGF0YV9jYihjdXJsX21pbWVwYXJ0ICpwYXJ0LCBjdXJsX29mZl90IGRhdGFzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9yZWFkX2NhbGxiYWNrIHJlYWRmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9zZWVrX2NhbGxiYWNrIHNlZWtmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9mcmVlX2NhbGxiYWNrIGZyZWVmdW5jLCB2b2lkICphcmcpCit7CisgIGlmKCFwYXJ0KQorICAgIHJldHVybiBDVVJMRV9CQURfRlVOQ1RJT05fQVJHVU1FTlQ7CisKKyAgY2xlYW51cF9wYXJ0X2NvbnRlbnQocGFydCk7CisKKyAgaWYocmVhZGZ1bmMpIHsKKyAgICBwYXJ0LT5yZWFkZnVuYyA9IHJlYWRmdW5jOworICAgIHBhcnQtPnNlZWtmdW5jID0gc2Vla2Z1bmM7CisgICAgcGFydC0+ZnJlZWZ1bmMgPSBmcmVlZnVuYzsKKyAgICBwYXJ0LT5hcmcgPSBhcmc7CisgICAgcGFydC0+ZGF0YXNpemUgPSBkYXRhc2l6ZTsKKyAgICBwYXJ0LT5raW5kID0gTUlNRUtJTkRfQ0FMTEJBQ0s7CisgIH0KKworICByZXR1cm4gQ1VSTEVfT0s7Cit9CisKKy8qIFNldCBtaW1lIHBhcnQgY29udGVudCBmcm9tIHN1YnBhcnRzLiAqLworQ1VSTGNvZGUgY3VybF9taW1lX3N1YnBhcnRzKGN1cmxfbWltZXBhcnQgKnBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9taW1lICpzdWJwYXJ0cykKK3sKKyAgaWYoIXBhcnQpCisgICAgcmV0dXJuIENVUkxFX0JBRF9GVU5DVElPTl9BUkdVTUVOVDsKKworICAvKiBBY2NlcHQgc2V0dGluZyB0d2ljZSB0aGUgc2FtZSBzdWJwYXJ0cy4gKi8KKyAgaWYocGFydC0+a2luZCA9PSBNSU1FS0lORF9NVUxUSVBBUlQgJiYgcGFydC0+YXJnID09IHN1YnBhcnRzKQorICAgIHJldHVybiBDVVJMRV9PSzsKKworICBjbGVhbnVwX3BhcnRfY29udGVudChwYXJ0KTsKKworICBpZihzdWJwYXJ0cykgeworICAgIC8qIE11c3QgYmVsb25nIHRvIHRoZSBzYW1lIGRhdGEgaGFuZGxlLiAqLworICAgIGlmKHBhcnQtPmVhc3kgJiYgc3VicGFydHMtPmVhc3kgJiYgcGFydC0+ZWFzeSAhPSBzdWJwYXJ0cy0+ZWFzeSkKKyAgICAgIHJldHVybiBDVVJMRV9CQURfRlVOQ1RJT05fQVJHVU1FTlQ7CisKKyAgICAvKiBTaG91bGQgbm90IGhhdmUgYmVlbiBhdHRhY2hlZCBhbHJlYWR5LiAqLworICAgIGlmKHN1YnBhcnRzLT5wYXJlbnQpCisgICAgICByZXR1cm4gQ1VSTEVfQkFEX0ZVTkNUSU9OX0FSR1VNRU5UOworCisgICAgc3VicGFydHMtPnBhcmVudCA9IHBhcnQ7CisgICAgcGFydC0+cmVhZGZ1bmMgPSBtaW1lX3N1YnBhcnRzX3JlYWQ7CisgICAgcGFydC0+c2Vla2Z1bmMgPSBtaW1lX3N1YnBhcnRzX3NlZWs7CisgICAgcGFydC0+ZnJlZWZ1bmMgPSBtaW1lX3N1YnBhcnRzX2ZyZWU7CisgICAgcGFydC0+YXJnID0gc3VicGFydHM7CisgICAgcGFydC0+ZGF0YXNpemUgPSAtMTsKKyAgICBwYXJ0LT5raW5kID0gTUlNRUtJTkRfTVVMVElQQVJUOworICB9CisKKyAgcmV0dXJuIENVUkxFX09LOworfQorCisKKy8qIFJlYWRiYWNrIGZyb20gdG9wIG1pbWUuICovCisvKiBBcmd1bWVudCBpcyB0aGUgZHVtbXkgdG9wIHBhcnQuICovCitzaXplX3QgQ3VybF9taW1lX3JlYWQoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG5pdGVtcywgdm9pZCAqaW5zdHJlYW0pCit7CisgIGN1cmxfbWltZXBhcnQgKnBhcnQgPSAoY3VybF9taW1lcGFydCAqKSBpbnN0cmVhbTsKKworICAodm9pZCkgc2l6ZTsgICAvKiBBbHdheXMgMS4gKi8KKyAgcmV0dXJuIHJlYWRiYWNrX3BhcnQocGFydCwgYnVmZmVyLCBuaXRlbXMpOworfQorCisvKiBSZXdpbmQgbWltZSBzdHJlYW0uICovCitDVVJMY29kZSBDdXJsX21pbWVfcmV3aW5kKGN1cmxfbWltZXBhcnQgKnBhcnQpCit7CisgIHJldHVybiBtaW1lX3BhcnRfcmV3aW5kKHBhcnQpID09IENVUkxfU0VFS0ZVTkNfT0s/CisgICAgICAgICBDVVJMRV9PSzogQ1VSTEVfU0VORF9GQUlMX1JFV0lORDsKK30KKworLyogQ29tcHV0ZSBoZWFkZXIgbGlzdCBzaXplLiAqLworc3RhdGljIHNpemVfdCBzbGlzdF9zaXplKHN0cnVjdCBjdXJsX3NsaXN0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvdmVyaGVhZCwgY29uc3QgY2hhciAqc2tpcCkKK3sKKyAgc2l6ZV90IHNpemUgPSAwOworICBzaXplX3Qgc2tpcGxlbiA9IHNraXA/IHN0cmxlbihza2lwKTogMDsKKworICBmb3IoOyBzOyBzID0gcy0+bmV4dCkKKyAgICBpZighc2tpcCB8fCAhbWF0Y2hfaGVhZGVyKHMsIHNraXAsIHNraXBsZW4pKQorICAgICAgc2l6ZSArPSBzdHJsZW4ocy0+ZGF0YSkgKyBvdmVyaGVhZDsKKyAgcmV0dXJuIHNpemU7Cit9CisKKy8qIEdldC9jb21wdXRlIG11bHRpcGFydCBzaXplLiAqLworc3RhdGljIGN1cmxfb2ZmX3QgbXVsdGlwYXJ0X3NpemUoY3VybF9taW1lICptaW1lKQoreworICBjdXJsX29mZl90IHNpemU7CisgIGN1cmxfb2ZmX3Qgc3o7CisgIHNpemVfdCBib3VuZGFyeXNpemU7CisgIGN1cmxfbWltZXBhcnQgKnBhcnQ7CisKKyAgaWYoIW1pbWUpCisgICAgcmV0dXJuIDA7ICAgICAgICAgICAvKiBOb3QgcHJlc2VudCAtPiBlbXB0eS4gKi8KKworICBib3VuZGFyeXNpemUgPSA0ICsgc3RybGVuKG1pbWUtPmJvdW5kYXJ5KSArIDI7CisgIHNpemUgPSBib3VuZGFyeXNpemU7ICAvKiBGaW5hbCBib3VuZGFyeSAtIENSTEYgYWZ0ZXIgaGVhZGVycy4gKi8KKworICBmb3IocGFydCA9IG1pbWUtPmZpcnN0cGFydDsgcGFydDsgcGFydCA9IHBhcnQtPm5leHRwYXJ0KSB7CisgICAgc3ogPSBDdXJsX21pbWVfc2l6ZShwYXJ0KTsKKworICAgIGlmKHN6IDwgMCkKKyAgICAgIHNpemUgPSBzejsKKworICAgIGlmKHNpemUgPj0gMCkKKyAgICAgIHNpemUgKz0gYm91bmRhcnlzaXplICsgc3o7CisgIH0KKworICByZXR1cm4gc2l6ZTsKK30KKworLyogR2V0L2NvbXB1dGUgbWltZSBzaXplLiAqLworY3VybF9vZmZfdCBDdXJsX21pbWVfc2l6ZShjdXJsX21pbWVwYXJ0ICpwYXJ0KQoreworICBjdXJsX29mZl90IHNpemU7CisKKyAgaWYocGFydC0+ZGF0YXNpemUgPCAwICYmIHBhcnQtPmtpbmQgPT0gTUlNRUtJTkRfTVVMVElQQVJUKQorICAgIHBhcnQtPmRhdGFzaXplID0gbXVsdGlwYXJ0X3NpemUocGFydC0+YXJnKTsKKworICBzaXplID0gcGFydC0+ZGF0YXNpemU7CisKKyAgaWYocGFydC0+ZW5jb2RlcikKKyAgICBzaXplID0gcGFydC0+ZW5jb2Rlci0+c2l6ZWZ1bmMocGFydCk7CisKKyAgaWYoc2l6ZSA+PSAwICYmICEocGFydC0+ZmxhZ3MgJiBNSU1FX0JPRFlfT05MWSkpIHsKKyAgICAvKiBDb21wdXRlIHRvdGFsIHBhcnQgc2l6ZS4gKi8KKyAgICBzaXplICs9IHNsaXN0X3NpemUocGFydC0+Y3VybGhlYWRlcnMsIDIsIE5VTEwpOworICAgIHNpemUgKz0gc2xpc3Rfc2l6ZShwYXJ0LT51c2VyaGVhZGVycywgMiwgIkNvbnRlbnQtVHlwZSIpOworICAgIHNpemUgKz0gMjsgICAgLyogQ1JMRiBhZnRlciBoZWFkZXJzLiAqLworICB9CisgIHJldHVybiBzaXplOworfQorCisvKiBBZGQgYSBoZWFkZXIuICovCisvKiBWQVJBUkdTMiAqLworQ1VSTGNvZGUgQ3VybF9taW1lX2FkZF9oZWFkZXIoc3RydWN0IGN1cmxfc2xpc3QgKipzbHAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICBzdHJ1Y3QgY3VybF9zbGlzdCAqaGRyID0gTlVMTDsKKyAgY2hhciAqcyA9IE5VTEw7CisgIHZhX2xpc3QgYXA7CisKKyAgdmFfc3RhcnQoYXAsIGZtdCk7CisgIHMgPSBjdXJsX212YXByaW50ZihmbXQsIGFwKTsKKyAgdmFfZW5kKGFwKTsKKworICBpZihzKSB7CisgICAgaGRyID0gQ3VybF9zbGlzdF9hcHBlbmRfbm9kdXAoKnNscCwgcyk7CisgICAgaWYoaGRyKQorICAgICAgKnNscCA9IGhkcjsKKyAgICBlbHNlCisgICAgICBmcmVlKHMpOworICB9CisKKyAgcmV0dXJuIGhkcj8gQ1VSTEVfT0s6IENVUkxFX09VVF9PRl9NRU1PUlk7Cit9CisKKy8qIEFkZCBhIGNvbnRlbnQgdHlwZSBoZWFkZXIuICovCitzdGF0aWMgQ1VSTGNvZGUgYWRkX2NvbnRlbnRfdHlwZShzdHJ1Y3QgY3VybF9zbGlzdCAqKnNscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmJvdW5kYXJ5KQoreworICByZXR1cm4gQ3VybF9taW1lX2FkZF9oZWFkZXIoc2xwLCAiQ29udGVudC1UeXBlOiAlcyVzJXMiLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRhcnk/ICI7IGJvdW5kYXJ5PSI6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRhcnk/IGJvdW5kYXJ5OiAiIik7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKkNvbnRlbnRUeXBlRm9yRmlsZW5hbWUoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgIHVuc2lnbmVkIGludCBpOworCisgIC8qCisgICAqIElmIG5vIGNvbnRlbnQgdHlwZSB3YXMgc3BlY2lmaWVkLCB3ZSBzY2FuIHRocm91Z2ggYSBmZXcgd2VsbC1rbm93bgorICAgKiBleHRlbnNpb25zIGFuZCBwaWNrIHRoZSBmaXJzdCB3ZSBtYXRjaCEKKyAgICovCisgIHN0cnVjdCBDb250ZW50VHlwZSB7CisgICAgY29uc3QgY2hhciAqZXh0ZW5zaW9uOworICAgIGNvbnN0IGNoYXIgKnR5cGU7CisgIH07CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgQ29udGVudFR5cGUgY3R0c1tdID0geworICAgIHsiLmdpZiIsICAiaW1hZ2UvZ2lmIn0sCisgICAgeyIuanBnIiwgICJpbWFnZS9qcGVnIn0sCisgICAgeyIuanBlZyIsICJpbWFnZS9qcGVnIn0sCisgICAgeyIucG5nIiwgICJpbWFnZS9wbmcifSwKKyAgICB7Ii5zdmciLCAgImltYWdlL3N2Zyt4bWwifSwKKyAgICB7Ii50eHQiLCAgInRleHQvcGxhaW4ifSwKKyAgICB7Ii5odG0iLCAgInRleHQvaHRtbCJ9LAorICAgIHsiLmh0bWwiLCAidGV4dC9odG1sIn0sCisgICAgeyIucGRmIiwgICJhcHBsaWNhdGlvbi9wZGYifSwKKyAgICB7Ii54bWwiLCAgImFwcGxpY2F0aW9uL3htbCJ9CisgIH07CisKKyAgaWYoZmlsZW5hbWUpIHsKKyAgICBzaXplX3QgbGVuMSA9IHN0cmxlbihmaWxlbmFtZSk7CisgICAgY29uc3QgY2hhciAqbmFtZWVuZCA9IGZpbGVuYW1lICsgbGVuMTsKKworICAgIGZvcihpID0gMDsgaSA8IHNpemVvZiBjdHRzIC8gc2l6ZW9mIGN0dHNbMF07IGkrKykgeworICAgICAgc2l6ZV90IGxlbjIgPSBzdHJsZW4oY3R0c1tpXS5leHRlbnNpb24pOworCisgICAgICBpZihsZW4xID49IGxlbjIgJiYgc3RyY2FzZWNvbXBhcmUobmFtZWVuZCAtIGxlbjIsIGN0dHNbaV0uZXh0ZW5zaW9uKSkKKyAgICAgICAgICByZXR1cm4gY3R0c1tpXS50eXBlOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworQ1VSTGNvZGUgQ3VybF9taW1lX3ByZXBhcmVfaGVhZGVycyhjdXJsX21pbWVwYXJ0ICpwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb250ZW50dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGlzcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gbWltZXN0cmF0ZWd5IHN0cmF0ZWd5KQoreworICBjdXJsX21pbWUgKm1pbWUgPSBOVUxMOworICBjb25zdCBjaGFyICpib3VuZGFyeSA9IE5VTEw7CisgIGNoYXIgKnM7CisgIGNvbnN0IGNoYXIgKmN0ZSA9IE5VTEw7CisgIENVUkxjb2RlIHJldCA9IENVUkxFX09LOworCisgIC8qIEdldCByaWQgb2YgcHJldmlvdXNseSBwcmVwYXJlZCBoZWFkZXJzLiAqLworICBjdXJsX3NsaXN0X2ZyZWVfYWxsKHBhcnQtPmN1cmxoZWFkZXJzKTsKKyAgcGFydC0+Y3VybGhlYWRlcnMgPSBOVUxMOworCisgIC8qIEJlIHN1cmUgd2Ugd29uJ3QgYWNjZXNzIG9sZCBoZWFkZXJzIGxhdGVyLiAqLworICBpZihwYXJ0LT5zdGF0ZS5zdGF0ZSA9PSBNSU1FU1RBVEVfQ1VSTEhFQURFUlMpCisgICAgbWltZXNldHN0YXRlKCZwYXJ0LT5zdGF0ZSwgTUlNRVNUQVRFX0NVUkxIRUFERVJTLCBOVUxMKTsKKworICAvKiBCdWlsZCB0aGUgY29udGVudC10eXBlIGhlYWRlci4gKi8KKyAgcyA9IHNlYXJjaF9oZWFkZXIocGFydC0+dXNlcmhlYWRlcnMsICJDb250ZW50LVR5cGUiKTsKKyAgaWYocykKKyAgICBjb250ZW50dHlwZSA9IHM7CisgIGlmKHBhcnQtPm1pbWV0eXBlKQorICAgIGNvbnRlbnR0eXBlID0gcGFydC0+bWltZXR5cGU7CisgIGlmKCFjb250ZW50dHlwZSkgeworICAgIHN3aXRjaChwYXJ0LT5raW5kKSB7CisgICAgY2FzZSBNSU1FS0lORF9NVUxUSVBBUlQ6CisgICAgICBjb250ZW50dHlwZSA9IE1VTFRJUEFSVF9DT05URU5UVFlQRV9ERUZBVUxUOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNSU1FS0lORF9GSUxFOgorICAgICAgY29udGVudHR5cGUgPSBDb250ZW50VHlwZUZvckZpbGVuYW1lKHBhcnQtPmZpbGVuYW1lKTsKKyAgICAgIGlmKCFjb250ZW50dHlwZSkKKyAgICAgICAgY29udGVudHR5cGUgPSBDb250ZW50VHlwZUZvckZpbGVuYW1lKHBhcnQtPmRhdGEpOworICAgICAgaWYoIWNvbnRlbnR0eXBlICYmIHBhcnQtPmZpbGVuYW1lKQorICAgICAgICBjb250ZW50dHlwZSA9IEZJTEVfQ09OVEVOVFRZUEVfREVGQVVMVDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBjb250ZW50dHlwZSA9IENvbnRlbnRUeXBlRm9yRmlsZW5hbWUocGFydC0+ZmlsZW5hbWUpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYocGFydC0+a2luZCA9PSBNSU1FS0lORF9NVUxUSVBBUlQpIHsKKyAgICBtaW1lID0gKGN1cmxfbWltZSAqKSBwYXJ0LT5hcmc7CisgICAgaWYobWltZSkKKyAgICAgIGJvdW5kYXJ5ID0gbWltZS0+Ym91bmRhcnk7CisgIH0KKyAgZWxzZSBpZihjb250ZW50dHlwZSAmJiBzdHJjYXNlY29tcGFyZShjb250ZW50dHlwZSwgInRleHQvcGxhaW4iKSkKKyAgICBpZihzdHJhdGVneSA9PSBNSU1FU1RSQVRFR1lfTUFJTCB8fCAhcGFydC0+ZmlsZW5hbWUpCisgICAgICBjb250ZW50dHlwZSA9IE5VTEw7CisKKyAgLyogSXNzdWUgY29udGVudC1kaXNwb3NpdGlvbiBoZWFkZXIgb25seSBpZiBub3QgYWxyZWFkeSBzZXQgYnkgY2FsbGVyLiAqLworICBpZighc2VhcmNoX2hlYWRlcihwYXJ0LT51c2VyaGVhZGVycywgIkNvbnRlbnQtRGlzcG9zaXRpb24iKSkgeworICAgIGlmKCFkaXNwb3NpdGlvbikKKyAgICAgIGlmKHBhcnQtPmZpbGVuYW1lIHx8IHBhcnQtPm5hbWUgfHwKKyAgICAgICAgKGNvbnRlbnR0eXBlICYmICFzdHJuY2FzZWNvbXBhcmUoY29udGVudHR5cGUsICJtdWx0aXBhcnQvIiwgMTApKSkKKyAgICAgICAgICBkaXNwb3NpdGlvbiA9IERJU1BPU0lUSU9OX0RFRkFVTFQ7CisgICAgaWYoZGlzcG9zaXRpb24gJiYgY3VybF9zdHJlcXVhbChkaXNwb3NpdGlvbiwgImF0dGFjaG1lbnQiKSAmJgorICAgICAhcGFydC0+bmFtZSAmJiAhcGFydC0+ZmlsZW5hbWUpCisgICAgICBkaXNwb3NpdGlvbiA9IE5VTEw7CisgICAgaWYoZGlzcG9zaXRpb24pIHsKKyAgICAgIGNoYXIgKm5hbWUgPSBOVUxMOworICAgICAgY2hhciAqZmlsZW5hbWUgPSBOVUxMOworCisgICAgICBpZihwYXJ0LT5uYW1lKSB7CisgICAgICAgIG5hbWUgPSBlc2NhcGVfc3RyaW5nKHBhcnQtPm5hbWUpOworICAgICAgICBpZighbmFtZSkKKyAgICAgICAgICByZXQgPSBDVVJMRV9PVVRfT0ZfTUVNT1JZOworICAgICAgfQorICAgICAgaWYoIXJldCAmJiBwYXJ0LT5maWxlbmFtZSkgeworICAgICAgICBmaWxlbmFtZSA9IGVzY2FwZV9zdHJpbmcocGFydC0+ZmlsZW5hbWUpOworICAgICAgICBpZighZmlsZW5hbWUpCisgICAgICAgICAgcmV0ID0gQ1VSTEVfT1VUX09GX01FTU9SWTsKKyAgICAgIH0KKyAgICAgIGlmKCFyZXQpCisgICAgICAgIHJldCA9IEN1cmxfbWltZV9hZGRfaGVhZGVyKCZwYXJ0LT5jdXJsaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQtRGlzcG9zaXRpb246ICVzJXMlcyVzJXMlcyVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU/ICI7IG5hbWU9XCIiOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT8gbmFtZTogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU/ICJcIiI6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZT8gIjsgZmlsZW5hbWU9XCIiOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU/IGZpbGVuYW1lOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU/ICJcIiI6ICIiKTsKKyAgICAgIEN1cmxfc2FmZWZyZWUobmFtZSk7CisgICAgICBDdXJsX3NhZmVmcmVlKGZpbGVuYW1lKTsKKyAgICAgIGlmKHJldCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIH0KKyAgICB9CisKKyAgLyogSXNzdWUgQ29udGVudC1UeXBlIGhlYWRlci4gKi8KKyAgaWYoY29udGVudHR5cGUpIHsKKyAgICByZXQgPSBhZGRfY29udGVudF90eXBlKCZwYXJ0LT5jdXJsaGVhZGVycywgY29udGVudHR5cGUsIGJvdW5kYXJ5KTsKKyAgICBpZihyZXQpCisgICAgICByZXR1cm4gcmV0OworICB9CisKKyAgLyogQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyBoZWFkZXIuICovCisgIGlmKCFzZWFyY2hfaGVhZGVyKHBhcnQtPnVzZXJoZWFkZXJzLCAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyIpKSB7CisgICAgaWYocGFydC0+ZW5jb2RlcikKKyAgICAgIGN0ZSA9IHBhcnQtPmVuY29kZXItPm5hbWU7CisgICAgZWxzZSBpZihjb250ZW50dHlwZSAmJiBzdHJhdGVneSA9PSBNSU1FU1RSQVRFR1lfTUFJTCAmJgorICAgICBwYXJ0LT5raW5kICE9IE1JTUVLSU5EX01VTFRJUEFSVCkKKyAgICAgIGN0ZSA9ICI4Yml0IjsKKyAgICBpZihjdGUpIHsKKyAgICAgIHJldCA9IEN1cmxfbWltZV9hZGRfaGVhZGVyKCZwYXJ0LT5jdXJsaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiAlcyIsIGN0ZSk7CisgICAgICBpZihyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICB9CisKKyAgLyogSWYgd2Ugd2VyZSByZWFkaW5nIGN1cmwtZ2VuZXJhdGVkIGhlYWRlcnMsIHJlc3RhcnQgd2l0aCBuZXcgb25lcyAodGhpcworICAgICBzaG91bGQgbm90IG9jY3VyKS4gKi8KKyAgaWYocGFydC0+c3RhdGUuc3RhdGUgPT0gTUlNRVNUQVRFX0NVUkxIRUFERVJTKQorICAgIG1pbWVzZXRzdGF0ZSgmcGFydC0+c3RhdGUsIE1JTUVTVEFURV9DVVJMSEVBREVSUywgcGFydC0+Y3VybGhlYWRlcnMpOworCisgIC8qIFByb2Nlc3Mgc3VicGFydHMuICovCisgIGlmKHBhcnQtPmtpbmQgPT0gTUlNRUtJTkRfTVVMVElQQVJUICYmIG1pbWUpIHsKKyAgICBjdXJsX21pbWVwYXJ0ICpzdWJwYXJ0OworCisgICAgZGlzcG9zaXRpb24gPSBOVUxMOworICAgIGlmKHN0cmNhc2Vjb21wYXJlKGNvbnRlbnR0eXBlLCAibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpKQorICAgICAgZGlzcG9zaXRpb24gPSAiZm9ybS1kYXRhIjsKKyAgICBmb3Ioc3VicGFydCA9IG1pbWUtPmZpcnN0cGFydDsgc3VicGFydDsgc3VicGFydCA9IHN1YnBhcnQtPm5leHRwYXJ0KSB7CisgICAgICByZXQgPSBDdXJsX21pbWVfcHJlcGFyZV9oZWFkZXJzKHN1YnBhcnQsIE5VTEwsIGRpc3Bvc2l0aW9uLCBzdHJhdGVneSk7CisgICAgICBpZihyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICB9CisgIHJldHVybiByZXQ7Cit9CisKKyNlbHNlIC8qICFDVVJMX0RJU0FCTEVfSFRUUCB8fCAhQ1VSTF9ESVNBQkxFX1NNVFAgfHwgIUNVUkxfRElTQUJMRV9JTUFQICovCisKKy8qIE1pbWUgbm90IGNvbXBpbGVkIGluOiBkZWZpbmUgc3R1YnMgZm9yIGV4dGVybmFsbHktcmVmZXJlbmNlZCBmdW5jdGlvbnMuICovCitjdXJsX21pbWUgKmN1cmxfbWltZV9pbml0KENVUkwgKmVhc3kpCit7CisgICh2b2lkKSBlYXN5OworICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBjdXJsX21pbWVfZnJlZShjdXJsX21pbWUgKm1pbWUpCit7CisgICh2b2lkKSBtaW1lOworfQorCitjdXJsX21pbWVwYXJ0ICpjdXJsX21pbWVfYWRkcGFydChjdXJsX21pbWUgKm1pbWUpCit7CisgICh2b2lkKSBtaW1lOworICByZXR1cm4gTlVMTDsKK30KKworQ1VSTGNvZGUgY3VybF9taW1lX25hbWUoY3VybF9taW1lcGFydCAqcGFydCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgKHZvaWQpIHBhcnQ7CisgICh2b2lkKSBuYW1lOworICByZXR1cm4gQ1VSTEVfTk9UX0JVSUxUX0lOOworfQorCitDVVJMY29kZSBjdXJsX21pbWVfZmlsZW5hbWUoY3VybF9taW1lcGFydCAqcGFydCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICh2b2lkKSBwYXJ0OworICAodm9pZCkgZmlsZW5hbWU7CisgIHJldHVybiBDVVJMRV9OT1RfQlVJTFRfSU47Cit9CisKK0NVUkxjb2RlIGN1cmxfbWltZV90eXBlKGN1cmxfbWltZXBhcnQgKnBhcnQsIGNvbnN0IGNoYXIgKm1pbWV0eXBlKQoreworICAodm9pZCkgcGFydDsKKyAgKHZvaWQpIG1pbWV0eXBlOworICByZXR1cm4gQ1VSTEVfTk9UX0JVSUxUX0lOOworfQorCitDVVJMY29kZSBjdXJsX21pbWVfZW5jb2RlcihjdXJsX21pbWVwYXJ0ICpwYXJ0LCBjb25zdCBjaGFyICplbmNvZGluZykKK3sKKyAgKHZvaWQpIHBhcnQ7CisgICh2b2lkKSBlbmNvZGluZzsKKyAgcmV0dXJuIENVUkxFX05PVF9CVUlMVF9JTjsKK30KKworQ1VSTGNvZGUgY3VybF9taW1lX2RhdGEoY3VybF9taW1lcGFydCAqcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBkYXRhc2l6ZSkKK3sKKyAgKHZvaWQpIHBhcnQ7CisgICh2b2lkKSBkYXRhOworICAodm9pZCkgZGF0YXNpemU7CisgIHJldHVybiBDVVJMRV9OT1RfQlVJTFRfSU47Cit9CisKK0NVUkxjb2RlIGN1cmxfbWltZV9maWxlZGF0YShjdXJsX21pbWVwYXJ0ICpwYXJ0LCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgKHZvaWQpIHBhcnQ7CisgICh2b2lkKSBmaWxlbmFtZTsKKyAgcmV0dXJuIENVUkxFX05PVF9CVUlMVF9JTjsKK30KKworQ1VSTGNvZGUgY3VybF9taW1lX2RhdGFfY2IoY3VybF9taW1lcGFydCAqcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfb2ZmX3QgZGF0YXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX3JlYWRfY2FsbGJhY2sgcmVhZGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX3NlZWtfY2FsbGJhY2sgc2Vla2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX2ZyZWVfY2FsbGJhY2sgZnJlZWZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpCit7CisgICh2b2lkKSBwYXJ0OworICAodm9pZCkgZGF0YXNpemU7CisgICh2b2lkKSByZWFkZnVuYzsKKyAgKHZvaWQpIHNlZWtmdW5jOworICAodm9pZCkgZnJlZWZ1bmM7CisgICh2b2lkKSBhcmc7CisgIHJldHVybiBDVVJMRV9OT1RfQlVJTFRfSU47Cit9CisKK0NVUkxjb2RlIGN1cmxfbWltZV9zdWJwYXJ0cyhjdXJsX21pbWVwYXJ0ICpwYXJ0LCBjdXJsX21pbWUgKnN1YnBhcnRzKQoreworICAodm9pZCkgcGFydDsKKyAgKHZvaWQpIHN1YnBhcnRzOworICByZXR1cm4gQ1VSTEVfTk9UX0JVSUxUX0lOOworfQorCitDVVJMY29kZSBjdXJsX21pbWVfaGVhZGVycyhjdXJsX21pbWVwYXJ0ICpwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGN1cmxfc2xpc3QgKmhlYWRlcnMsIGludCB0YWtlX293bmVyc2hpcCkKK3sKKyAgKHZvaWQpIHBhcnQ7CisgICh2b2lkKSBoZWFkZXJzOworICAodm9pZCkgdGFrZV9vd25lcnNoaXA7CisgIHJldHVybiBDVVJMRV9OT1RfQlVJTFRfSU47Cit9CisKK3ZvaWQgQ3VybF9taW1lX2luaXRwYXJ0KGN1cmxfbWltZXBhcnQgKnBhcnQsIHN0cnVjdCBDdXJsX2Vhc3kgKmVhc3kpCit7CisgICh2b2lkKSBwYXJ0OworICAodm9pZCkgZWFzeTsKK30KKwordm9pZCBDdXJsX21pbWVfY2xlYW5wYXJ0KGN1cmxfbWltZXBhcnQgKnBhcnQpCit7CisgICh2b2lkKSBwYXJ0OworfQorCitDVVJMY29kZSBDdXJsX21pbWVfcHJlcGFyZV9oZWFkZXJzKGN1cmxfbWltZXBhcnQgKnBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnRlbnR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkaXNwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBtaW1lc3RyYXRlZ3kgc3RyYXRlZ3kpCit7CisgICh2b2lkKSBwYXJ0OworICAodm9pZCkgY29udGVudHR5cGU7CisgICh2b2lkKSBkaXNwb3NpdGlvbjsKKyAgKHZvaWQpIHN0cmF0ZWd5OworICByZXR1cm4gQ1VSTEVfTk9UX0JVSUxUX0lOOworfQorCitjdXJsX29mZl90IEN1cmxfbWltZV9zaXplKGN1cmxfbWltZXBhcnQgKnBhcnQpCit7CisgICh2b2lkKSBwYXJ0OworICByZXR1cm4gKGN1cmxfb2ZmX3QpIC0xOworfQorCitzaXplX3QgQ3VybF9taW1lX3JlYWQoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG5pdGVtcywgdm9pZCAqaW5zdHJlYW0pCit7CisgICh2b2lkKSBidWZmZXI7CisgICh2b2lkKSBzaXplOworICAodm9pZCkgbml0ZW1zOworICAodm9pZCkgaW5zdHJlYW07CisgIHJldHVybiAwOworfQorCitDVVJMY29kZSBDdXJsX21pbWVfcmV3aW5kKGN1cmxfbWltZXBhcnQgKnBhcnQpCit7CisgICh2b2lkKSBwYXJ0OworICByZXR1cm4gQ1VSTEVfTk9UX0JVSUxUX0lOOworfQorCisvKiBWQVJBUkdTMiAqLworQ1VSTGNvZGUgQ3VybF9taW1lX2FkZF9oZWFkZXIoc3RydWN0IGN1cmxfc2xpc3QgKipzbHAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAodm9pZCkgc2xwOworICAodm9pZCkgZm10OworICByZXR1cm4gQ1VSTEVfTk9UX0JVSUxUX0lOOworfQorCisjZW5kaWYgLyogIUNVUkxfRElTQUJMRV9IVFRQIHx8ICFDVVJMX0RJU0FCTEVfU01UUCB8fCAhQ1VSTF9ESVNBQkxFX0lNQVAgKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL21pbWUuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL21pbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTQ0ODU3Ci0tLSAvZGV2L251bGwKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvbWltZS5oCkBAIC0wLDAgKzEsMTM1IEBACisjaWZuZGVmIEhFQURFUl9DVVJMX01JTUVfSAorI2RlZmluZSBIRUFERVJfQ1VSTF9NSU1FX0gKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KKyAqICBQcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKKyAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKKyAqIGFyZSBhbHNvIGF2YWlsYWJsZSBhdCBodHRwczovL2N1cmwuaGF4eC5zZS9kb2NzL2NvcHlyaWdodC5odG1sLgorICoKKyAqIFlvdSBtYXkgb3B0IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ09QWUlORyBmaWxlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNSU1FX1JBTkRfQk9VTkRBUllfQ0hBUlMgICAgICAgIDE2ICAvKiBOYi4gb2YgcmFuZG9tIGJvdW5kYXJ5IGNoYXJzLiAqLworI2RlZmluZSBNQVhfRU5DT0RFRF9MSU5FX0xFTkdUSCAgICAgICAgIDc2ICAvKiBNYXhpbXVtIGVuY29kZWQgbGluZSBsZW5ndGguICovCisjZGVmaW5lIEVOQ09ESU5HX0JVRkZFUl9TSVpFICAgICAgICAgICAgMjU2IC8qIEVuY29kaW5nIHRlbXAgYnVmZmVycyBzaXplLiAqLworCisvKiBQYXJ0IGZsYWdzLiAqLworI2RlZmluZSBNSU1FX1VTRVJIRUFERVJTX09XTkVSICAoMSA8PCAwKQorI2RlZmluZSBNSU1FX0JPRFlfT05MWSAgICAgICAgICAoMSA8PCAxKQorCisvKiBQYXJ0IHNvdXJjZSBraW5kcy4gKi8KK2VudW0gbWltZWtpbmQgeworICBNSU1FS0lORF9OT05FID0gMCwgICAgICAgICAgICAvKiBQYXJ0IG5vdCBzZXQuICovCisgIE1JTUVLSU5EX0RBVEEsICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlZCBtaW1lIGRhdGEuICovCisgIE1JTUVLSU5EX0ZJTEUsICAgICAgICAgICAgICAgIC8qIERhdGEgZnJvbSBmaWxlLiAqLworICBNSU1FS0lORF9DQUxMQkFDSywgICAgICAgICAgICAvKiBEYXRhIGZyb20gYHJlYWQnIGNhbGxiYWNrLiAqLworICBNSU1FS0lORF9NVUxUSVBBUlQsICAgICAgICAgICAvKiBEYXRhIGlzIGEgbWltZSBzdWJwYXJ0LiAqLworICBNSU1FS0lORF9MQVNUCit9OworCisvKiBSZWFkYmFjayBzdGF0ZSB0b2tlbnMuICovCitlbnVtIG1pbWVzdGF0ZSB7CisgIE1JTUVTVEFURV9CRUdJTiwgICAgICAgICAgICAgIC8qIFJlYWRiYWNrIGhhcyBub3QgeWV0IHN0YXJ0ZWQuICovCisgIE1JTUVTVEFURV9DVVJMSEVBREVSUywgICAgICAgIC8qIEluIGN1cmwtZ2VuZXJhdGVkIGhlYWRlcnMuICovCisgIE1JTUVTVEFURV9VU0VSSEVBREVSUywgICAgICAgIC8qIEluIGNhbGxlcidzIHN1cHBsaWVkIGhlYWRlcnMuICovCisgIE1JTUVTVEFURV9FT0gsICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBoZWFkZXJzLiAqLworICBNSU1FU1RBVEVfQk9EWSwgICAgICAgICAgICAgICAvKiBQbGFjZWhvbGRlci4gKi8KKyAgTUlNRVNUQVRFX0JPVU5EQVJZMSwgICAgICAgICAgLyogSW4gYm91bmRhcnkgcHJlZml4LiAqLworICBNSU1FU1RBVEVfQk9VTkRBUlkyLCAgICAgICAgICAvKiBJbiBib3VuZGFyeS4gKi8KKyAgTUlNRVNUQVRFX0NPTlRFTlQsICAgICAgICAgICAgLyogSW4gY29udGVudC4gKi8KKyAgTUlNRVNUQVRFX0VORCwgICAgICAgICAgICAgICAgLyogRW5kIG9mIHBhcnQgcmVhY2hlZC4gKi8KKyAgTUlNRVNUQVRFX0xBU1QKK307CisKKy8qIE1pbWUgaGVhZGVycyBzdHJhdGVnaWVzLiAqLworZW51bSBtaW1lc3RyYXRlZ3kgeworICBNSU1FU1RSQVRFR1lfTUFJTCwgICAgICAgICAgICAvKiBNaW1lIG1haWwuICovCisgIE1JTUVTVFJBVEVHWV9GT1JNLCAgICAgICAgICAgIC8qIEhUVFAgcG9zdCBmb3JtLiAqLworICBNSU1FU1RSQVRFR1lfTEFTVAorfTsKKworLyogQ29udGVudCB0cmFuc2ZlciBlbmNvZGVyLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBjaGFyICogICBuYW1lOyAgICAgICAgICAvKiBFbmNvZGluZyBuYW1lLiAqLworICBzaXplX3QgICAgICAgICAoKmVuY29kZWZ1bmMpKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYXRlb2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfbWltZXBhcnQgKnBhcnQpOyAgLyogRW5jb2RlZCByZWFkLiAqLworICBjdXJsX29mZl90ICAgICAoKnNpemVmdW5jKShjdXJsX21pbWVwYXJ0ICpwYXJ0KTsgIC8qIEVuY29kZWQgc2l6ZS4gKi8KK30gIG1pbWVfZW5jb2RlcjsKKworLyogQ29udGVudCB0cmFuc2ZlciBlbmNvZGVyIHN0YXRlLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBzaXplX3QgICAgICAgICBwb3M7ICAgICAgICAgICAvKiBQb3NpdGlvbiBvbiBvdXRwdXQgbGluZS4gKi8KKyAgc2l6ZV90ICAgICAgICAgYnVmYmVnOyAgICAgICAgLyogTmV4dCBkYXRhIGluZGV4IGluIGlucHV0IGJ1ZmZlci4gKi8KKyAgc2l6ZV90ICAgICAgICAgYnVmZW5kOyAgICAgICAgLyogRmlyc3QgdW51c2VkIGJ5dGUgaW5kZXggaW4gaW5wdXQgYnVmZmVyLiAqLworICBjaGFyICAgICAgICAgICBidWZbRU5DT0RJTkdfQlVGRkVSX1NJWkVdOyAvKiBJbnB1dCBidWZmZXIuICovCit9ICBtaW1lX2VuY29kZXJfc3RhdGU7CisKKy8qIE1pbWUgcmVhZGJhY2sgc3RhdGUuICovCit0eXBlZGVmIHN0cnVjdCB7CisgIGVudW0gbWltZXN0YXRlIHN0YXRlOyAgICAgICAvKiBDdXJyZW50IHN0YXRlIHRva2VuLiAqLworICB2b2lkICpwdHI7ICAgICAgICAgICAgICAgICAgLyogU3RhdGUtZGVwZW5kZW50IHBvaW50ZXIuICovCisgIHNpemVfdCBvZmZzZXQ7ICAgICAgICAgICAgICAvKiBTdGF0ZS1kZXBlbmRlbnQgb2Zmc2V0LiAqLworfSAgbWltZV9zdGF0ZTsKKworLyogQSBtaW1lIG11bHRpcGFydC4gKi8KK3N0cnVjdCBjdXJsX21pbWVfcyB7CisgIHN0cnVjdCBDdXJsX2Vhc3kgKmVhc3k7ICAgICAgICAgIC8qIFRoZSBhc3NvY2lhdGVkIGVhc3kgaGFuZGxlLiAqLworICBjdXJsX21pbWVwYXJ0ICpwYXJlbnQ7ICAgICAgICAgICAvKiBQYXJlbnQgcGFydC4gKi8KKyAgY3VybF9taW1lcGFydCAqZmlyc3RwYXJ0OyAgICAgICAgLyogRmlyc3QgcGFydC4gKi8KKyAgY3VybF9taW1lcGFydCAqbGFzdHBhcnQ7ICAgICAgICAgLyogTGFzdCBwYXJ0LiAqLworICBjaGFyICpib3VuZGFyeTsgICAgICAgICAgICAgICAgICAvKiBUaGUgcGFydCBib3VuZGFyeS4gKi8KKyAgbWltZV9zdGF0ZSBzdGF0ZTsgICAgICAgICAgICAgICAgLyogQ3VycmVudCByZWFkYmFjayBzdGF0ZS4gKi8KK307CisKKy8qIEEgbWltZSBwYXJ0LiAqLworc3RydWN0IGN1cmxfbWltZXBhcnRfcyB7CisgIHN0cnVjdCBDdXJsX2Vhc3kgKmVhc3k7ICAgICAgICAgIC8qIFRoZSBhc3NvY2lhdGVkIGVhc3kgaGFuZGxlLiAqLworICBjdXJsX21pbWUgKnBhcmVudDsgICAgICAgICAgICAgICAvKiBQYXJlbnQgbWltZSBzdHJ1Y3R1cmUuICovCisgIGN1cmxfbWltZXBhcnQgKm5leHRwYXJ0OyAgICAgICAgIC8qIEZvcndhcmQgbGlua2VkIGxpc3QuICovCisgIGVudW0gbWltZWtpbmQga2luZDsgICAgICAgICAgICAgIC8qIFRoZSBwYXJ0IGtpbmQuICovCisgIGNoYXIgKmRhdGE7ICAgICAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSBkYXRhIG9yIGZpbGUgbmFtZS4gKi8KKyAgY3VybF9yZWFkX2NhbGxiYWNrIHJlYWRmdW5jOyAgICAgLyogUmVhZCBmdW5jdGlvbi4gKi8KKyAgY3VybF9zZWVrX2NhbGxiYWNrIHNlZWtmdW5jOyAgICAgLyogU2VlayBmdW5jdGlvbi4gKi8KKyAgY3VybF9mcmVlX2NhbGxiYWNrIGZyZWVmdW5jOyAgICAgLyogQXJndW1lbnQgZnJlZSBmdW5jdGlvbi4gKi8KKyAgdm9pZCAqYXJnOyAgICAgICAgICAgICAgICAgICAgICAgLyogQXJndW1lbnQgdG8gY2FsbGJhY2sgZnVuY3Rpb25zLiAqLworICBGSUxFICpmcDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWxlIHBvaW50ZXIuICovCisgIHN0cnVjdCBjdXJsX3NsaXN0ICpjdXJsaGVhZGVyczsgIC8qIFBhcnQgaGVhZGVycy4gKi8KKyAgc3RydWN0IGN1cmxfc2xpc3QgKnVzZXJoZWFkZXJzOyAgLyogUGFydCBoZWFkZXJzLiAqLworICBjaGFyICptaW1ldHlwZTsgICAgICAgICAgICAgICAgICAvKiBQYXJ0IG1pbWUgdHlwZS4gKi8KKyAgY2hhciAqZmlsZW5hbWU7ICAgICAgICAgICAgICAgICAgLyogUmVtb3RlIGZpbGUgbmFtZS4gKi8KKyAgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAgICAgICAgLyogRGF0YSBuYW1lLiAqLworICBjdXJsX29mZl90IGRhdGFzaXplOyAgICAgICAgICAgICAvKiBFeHBlY3RlZCBkYXRhIHNpemUuICovCisgIHVuc2lnbmVkIGludCBmbGFnczsgICAgICAgICAgICAgIC8qIEZsYWdzLiAqLworICBtaW1lX3N0YXRlIHN0YXRlOyAgICAgICAgICAgICAgICAvKiBDdXJyZW50IHJlYWRiYWNrIHN0YXRlLiAqLworICBjb25zdCBtaW1lX2VuY29kZXIgKmVuY29kZXI7ICAgICAvKiBDb250ZW50IGRhdGEgZW5jb2Rlci4gKi8KKyAgbWltZV9lbmNvZGVyX3N0YXRlIGVuY3N0YXRlOyAgICAgLyogRGF0YSBlbmNvZGVyIHN0YXRlLiAqLworfTsKKworCisvKiBQcm90b3R5cGVzLiAqLwordm9pZCBDdXJsX21pbWVfaW5pdHBhcnQoY3VybF9taW1lcGFydCAqcGFydCwgc3RydWN0IEN1cmxfZWFzeSAqZWFzeSk7Cit2b2lkIEN1cmxfbWltZV9jbGVhbnBhcnQoY3VybF9taW1lcGFydCAqcGFydCk7CitDVVJMY29kZSBDdXJsX21pbWVfcHJlcGFyZV9oZWFkZXJzKGN1cmxfbWltZXBhcnQgKnBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnRlbnR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkaXNwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBtaW1lc3RyYXRlZ3kgc3RyYXRlZ3kpOworY3VybF9vZmZfdCBDdXJsX21pbWVfc2l6ZShjdXJsX21pbWVwYXJ0ICpwYXJ0KTsKK3NpemVfdCBDdXJsX21pbWVfcmVhZChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplLCBzaXplX3Qgbml0ZW1zLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmluc3RyZWFtKTsKK0NVUkxjb2RlIEN1cmxfbWltZV9yZXdpbmQoY3VybF9taW1lcGFydCAqcGFydCk7CitDVVJMY29kZSBDdXJsX21pbWVfYWRkX2hlYWRlcihzdHJ1Y3QgY3VybF9zbGlzdCAqKnNscCwgY29uc3QgY2hhciAqZm10LCAuLi4pOworCisjZW5kaWYgLyogSEVBREVSX0NVUkxfTUlNRV9IICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9tcHJpbnRmLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9tcHJpbnRmLmMKaW5kZXggZWI3ZWUwYy4uZDJkOTFkNyAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvbXByaW50Zi5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL21wcmludGYuYwpAQCAtNDYsMTAgKzQ2LDYgQEAKICAqIElmIFNJWkVPRl9TSVpFX1QgaGFzIG5vdCBiZWVuIGRlZmluZWQsIGRlZmF1bHQgdG8gdGhlIHNpemUgb2YgbG9uZy4KICAqLwogCi0jaWZuZGVmIFNJWkVPRl9TSVpFX1QKLSMgIGRlZmluZSBTSVpFT0ZfU0laRV9UIENVUkxfU0laRU9GX0xPTkcKLSNlbmRpZgotCiAjaWZkZWYgSEFWRV9MT05HTE9ORwogIyAgZGVmaW5lIExPTkdfTE9OR19UWVBFIGxvbmcgbG9uZwogIyAgZGVmaW5lIEhBVkVfTE9OR19MT05HX1RZUEUKQEAgLTExMSw3ICsxMDcsNyBAQAogICB9IFdISUxFX0ZBTFNFCiAKIC8qIERhdGEgdHlwZSB0byByZWFkIGZyb20gdGhlIGFyZ2xpc3QgKi8KLXR5cGVkZWYgZW51bSAgewordHlwZWRlZiBlbnVtIHsKICAgRk9STUFUX1VOS05PV04gPSAwLAogICBGT1JNQVRfU1RSSU5HLAogICBGT1JNQVRfUFRSLApAQCAtMTgxLDcgKzE3Nyw3IEBACiAKIHN0YXRpYyBsb25nIGRwcmludGZfRG9sbGFyU3RyaW5nKGNoYXIgKmlucHV0LCBjaGFyICoqZW5kKQogewotICBpbnQgbnVtYmVyPTA7CisgIGludCBudW1iZXIgPSAwOwogICB3aGlsZShJU0RJR0lUKCppbnB1dCkpIHsKICAgICBudW1iZXIgKj0gMTA7CiAgICAgbnVtYmVyICs9ICppbnB1dC0nMCc7CkBAIC0yMzcsNyArMjMzLDcgQEAKICAgbG9uZyB3aWR0aDsKICAgbG9uZyBwcmVjaXNpb247CiAgIGludCBmbGFnczsKLSAgbG9uZyBtYXhfcGFyYW09MDsKKyAgbG9uZyBtYXhfcGFyYW0gPSAwOwogICBsb25nIGk7CiAKICAgd2hpbGUoKmZtdCkgewpAQCAtMzI2LDcgKzMyMiw3IEBACiAgICAgICAgICAgYnJlYWs7CiAjaWYgZGVmaW5lZChNUF9IQVZFX0lOVF9FWFRFTlNJT05TKQogICAgICAgICBjYXNlICdJJzoKLSNpZiAoQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCA+IENVUkxfU0laRU9GX0xPTkcpCisjaWYgKFNJWkVPRl9DVVJMX09GRl9UID4gU0laRU9GX0xPTkcpCiAgICAgICAgICAgZmxhZ3MgfD0gRkxBR1NfTE9OR0xPTkc7CiAjZWxzZQogICAgICAgICAgIGZsYWdzIHw9IEZMQUdTX0xPTkc7CkBAIC0zNDgsMTQgKzM0NCwxNCBAQAogICAgICAgICBjYXNlICd6JzoKICAgICAgICAgICAvKiB0aGUgY29kZSBiZWxvdyBnZW5lcmF0ZXMgYSB3YXJuaW5nIGlmIC1XdW5yZWFjaGFibGUtY29kZSBpcwogICAgICAgICAgICAgIHVzZWQgKi8KLSNpZiAoU0laRU9GX1NJWkVfVCA+IENVUkxfU0laRU9GX0xPTkcpCisjaWYgKFNJWkVPRl9TSVpFX1QgPiBTSVpFT0ZfTE9ORykKICAgICAgICAgICBmbGFncyB8PSBGTEFHU19MT05HTE9ORzsKICNlbHNlCiAgICAgICAgICAgZmxhZ3MgfD0gRkxBR1NfTE9ORzsKICNlbmRpZgogICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlICdPJzoKLSNpZiAoQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCA+IENVUkxfU0laRU9GX0xPTkcpCisjaWYgKFNJWkVPRl9DVVJMX09GRl9UID4gU0laRU9GX0xPTkcpCiAgICAgICAgICAgZmxhZ3MgfD0gRkxBR1NfTE9OR0xPTkc7CiAjZWxzZQogICAgICAgICAgIGZsYWdzIHw9IEZMQUdTX0xPTkc7CkBAIC0zODAsNyArMzc2LDcgQEAKICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB3aWR0aCA9IHBhcmFtX251bTsKICAgICAgICAgICBpZih3aWR0aCA+IG1heF9wYXJhbSkKLSAgICAgICAgICAgIG1heF9wYXJhbT13aWR0aDsKKyAgICAgICAgICAgIG1heF9wYXJhbSA9IHdpZHRoOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgIGJyZWFrOwpAQCAtNDg2LDcgKzQ4Miw3IEBACiAgIH0KIAogICAvKiBSZWFkIHRoZSBhcmcgbGlzdCBwYXJhbWV0ZXJzIGludG8gb3VyIGRhdGEgbGlzdCAqLwotICBmb3IoaT0wOyBpPG1heF9wYXJhbTsgaSsrKSB7CisgIGZvcihpID0gMDsgaTxtYXhfcGFyYW07IGkrKykgewogICAgIC8qIFdpZHRoL3ByZWNpc2lvbiBhcmd1bWVudHMgbXVzdCBiZSByZWFkIGJlZm9yZSB0aGUgbWFpbiBhcmd1bWVudAogICAgICAgIHRoZXkgYXJlIGF0dGFjaGVkIHRvICovCiAgICAgaWYodnRvW2ldLmZsYWdzICYgRkxBR1NfV0lEVEhQQVJBTSkgewpAQCAtNTczLDcgKzU2OSw3IEBACiAgIGludCBkb25lID0gMDsKIAogICBsb25nIHBhcmFtOyAvKiBjdXJyZW50IHBhcmFtZXRlciB0byByZWFkICovCi0gIGxvbmcgcGFyYW1fbnVtPTA7IC8qIHBhcmFtZXRlciBjb3VudGVyICovCisgIGxvbmcgcGFyYW1fbnVtID0gMDsgLyogcGFyYW1ldGVyIGNvdW50ZXIgKi8KIAogICB2YV9zdGFja190IHZ0b1tNQVhfUEFSQU1FVEVSU107CiAgIGNoYXIgKmVuZHBvc1tNQVhfUEFSQU1FVEVSU107CkBAIC02NDMsNyArNjM5LDcgQEAKIAogICAgIC8qIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsIHBhcmFtZXRlciwgdGhlIHBvc2l0aW9uIG11c3QgZm9sbG93IGltbWVkaWF0ZWx5CiAgICAgICAgYWZ0ZXIgdGhlICUsIHRodXMgY3JlYXRlIGEgJTxudW0+JCBzZXF1ZW5jZSAqLwotICAgIHBhcmFtPWRwcmludGZfRG9sbGFyU3RyaW5nKGYsICZmKTsKKyAgICBwYXJhbSA9IGRwcmludGZfRG9sbGFyU3RyaW5nKGYsICZmKTsKIAogICAgIGlmKCFwYXJhbSkKICAgICAgIHBhcmFtID0gcGFyYW1fbnVtOwpAQCAtOTUyLDcgKzk0OCw3IEBACiAgICAgICAgICAgIG91dHB1dCBjaGFyYWN0ZXJzICovCiAgICAgICAgIChzcHJpbnRmKSh3b3JrLCBmb3JtYXRidWYsIHAtPmRhdGEuZG51bSk7CiAgICAgICAgIERFQlVHQVNTRVJUKHN0cmxlbih3b3JrKSA8PSBzaXplb2Yod29yaykpOwotICAgICAgICBmb3IoZnB0cj13b3JrOyAqZnB0cjsgZnB0cisrKQorICAgICAgICBmb3IoZnB0ciA9IHdvcms7ICpmcHRyOyBmcHRyKyspCiAgICAgICAgICAgT1VUQ0hBUigqZnB0cik7CiAgICAgICB9CiAgICAgICBicmVhazsKQEAgLTk4NCw3ICs5ODAsNyBAQAogLyogZnB1dGMoKSBsb29rLWFsaWtlICovCiBzdGF0aWMgaW50IGFkZGJ5dGVyKGludCBvdXRwdXQsIEZJTEUgKmRhdGEpCiB7Ci0gIHN0cnVjdCBuc3ByaW50ZiAqaW5mb3A9KHN0cnVjdCBuc3ByaW50ZiAqKWRhdGE7CisgIHN0cnVjdCBuc3ByaW50ZiAqaW5mb3AgPSAoc3RydWN0IG5zcHJpbnRmICopZGF0YTsKICAgdW5zaWduZWQgY2hhciBvdXRjID0gKHVuc2lnbmVkIGNoYXIpb3V0cHV0OwogCiAgIGlmKGluZm9wLT5sZW5ndGggPCBpbmZvcC0+bWF4KSB7CkBAIC0xMDMyLDcgKzEwMjgsNyBAQAogLyogZnB1dGMoKSBsb29rLWFsaWtlICovCiBzdGF0aWMgaW50IGFsbG9jX2FkZGJ5dGVyKGludCBvdXRwdXQsIEZJTEUgKmRhdGEpCiB7Ci0gIHN0cnVjdCBhc3ByaW50ZiAqaW5mb3A9KHN0cnVjdCBhc3ByaW50ZiAqKWRhdGE7CisgIHN0cnVjdCBhc3ByaW50ZiAqaW5mb3AgPSAoc3RydWN0IGFzcHJpbnRmICopZGF0YTsKICAgdW5zaWduZWQgY2hhciBvdXRjID0gKHVuc2lnbmVkIGNoYXIpb3V0cHV0OwogCiAgIGlmKCFpbmZvcC0+YnVmZmVyKSB7CkBAIC0xMDQyLDkgKzEwMzgsOSBAQAogICAgICAgcmV0dXJuIC0xOyAvKiBmYWlsICovCiAgICAgfQogICAgIGluZm9wLT5hbGxvYyA9IDMyOwotICAgIGluZm9wLT5sZW4gPTA7CisgICAgaW5mb3AtPmxlbiA9IDA7CiAgIH0KLSAgZWxzZSBpZihpbmZvcC0+bGVuKzEgPj0gaW5mb3AtPmFsbG9jKSB7CisgIGVsc2UgaWYoaW5mb3AtPmxlbiArIDEgPj0gaW5mb3AtPmFsbG9jKSB7CiAgICAgY2hhciAqbmV3cHRyID0gTlVMTDsKICAgICBzaXplX3QgbmV3c2l6ZSA9IGluZm9wLT5hbGxvYyoyOwogCkBAIC0xMTMzLDcgKzExMjksNyBAQAogICB2YV9zdGFydChhcF9zYXZlLCBmb3JtYXQpOwogICByZXRjb2RlID0gZHByaW50Zl9mb3JtYXRmKCZidWZmZXIsIHN0b3JlYnVmZmVyLCBmb3JtYXQsIGFwX3NhdmUpOwogICB2YV9lbmQoYXBfc2F2ZSk7Ci0gICpidWZmZXI9MDsgLyogd2UgdGVybWluYXRlIHRoaXMgd2l0aCBhIHplcm8gYnl0ZSAqLworICAqYnVmZmVyID0gMDsgLyogd2UgdGVybWluYXRlIHRoaXMgd2l0aCBhIHplcm8gYnl0ZSAqLwogICByZXR1cm4gcmV0Y29kZTsKIH0KIApAQCAtMTE2Miw3ICsxMTU4LDcgQEAKIHsKICAgaW50IHJldGNvZGU7CiAgIHJldGNvZGUgPSBkcHJpbnRmX2Zvcm1hdGYoJmJ1ZmZlciwgc3RvcmVidWZmZXIsIGZvcm1hdCwgYXBfc2F2ZSk7Ci0gICpidWZmZXI9MDsgLyogd2UgdGVybWluYXRlIHRoaXMgd2l0aCBhIHplcm8gYnl0ZSAqLworICAqYnVmZmVyID0gMDsgLyogd2UgdGVybWluYXRlIHRoaXMgd2l0aCBhIHplcm8gYnl0ZSAqLwogICByZXR1cm4gcmV0Y29kZTsKIH0KIApkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvbXVsdGkuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL211bHRpLmMKaW5kZXggYzNhMGQxMi4uNzBhYTZiYyAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvbXVsdGkuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9tdWx0aS5jCkBAIC00NCw2ICs0NCw3IEBACiAjaW5jbHVkZSAic2lncGlwZS5oIgogI2luY2x1ZGUgInZ0bHMvdnRscy5oIgogI2luY2x1ZGUgImNvbm5lY3QuaCIKKyNpbmNsdWRlICJodHRwX3Byb3h5LmgiCiAvKiBUaGUgbGFzdCAzICNpbmNsdWRlIGZpbGVzIHNob3VsZCBiZSBpbiB0aGlzIG9yZGVyICovCiAjaW5jbHVkZSAiY3VybF9wcmludGYuaCIKICNpbmNsdWRlICJjdXJsX21lbW9yeS5oIgpAQCAtNjksNyArNzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpOwogc3RhdGljIGludCB1cGRhdGVfdGltZXIoc3RydWN0IEN1cmxfbXVsdGkgKm11bHRpKTsKIAotc3RhdGljIENVUkxNY29kZSBhZGRfbmV4dF90aW1lb3V0KHN0cnVjdCB0aW1ldmFsIG5vdywKK3N0YXRpYyBDVVJMTWNvZGUgYWRkX25leHRfdGltZW91dChzdHJ1Y3QgY3VybHRpbWUgbm93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDdXJsX211bHRpICptdWx0aSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF9lYXN5ICpkKTsKIHN0YXRpYyBDVVJMTWNvZGUgbXVsdGlfdGltZW91dChzdHJ1Y3QgQ3VybF9tdWx0aSAqbXVsdGksCkBAIC0xMTQsNiArMTE1LDEzIEBACiAgICAgTlVMTCwKICAgICBOVUxMLAogICAgIEN1cmxfaW5pdF9DT05ORUNULCAvKiBDT05ORUNUICovCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgQ3VybF9jb25uZWN0X2ZyZWUgLyogRE8gKi8KICAgICAvKiB0aGUgcmVzdCBpcyBOVUxMIHRvbyAqLwogICB9OwogCkBAIC01ODQsNyArNTkyLDcgQEAKIAogICAvKiBpZiB0aGUgdHJhbnNmZXIgd2FzIGNvbXBsZXRlZCBpbiBhIHBhdXNlZCBzdGF0ZSB0aGVyZSBjYW4gYmUgYnVmZmVyZWQKICAgICAgZGF0YSBsZWZ0IHRvIGZyZWUgKi8KLSAgZm9yKGk9MDsgaSA8IGRhdGEtPnN0YXRlLnRlbXBjb3VudDsgaSsrKSB7CisgIGZvcihpID0gMDsgaSA8IGRhdGEtPnN0YXRlLnRlbXBjb3VudDsgaSsrKSB7CiAgICAgZnJlZShkYXRhLT5zdGF0ZS50ZW1wd3JpdGVbaV0uYnVmKTsKICAgfQogICBkYXRhLT5zdGF0ZS50ZW1wY291bnQgPSAwOwpAQCAtNzk0LDggKzgwMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bXNvY2tzKQogewogICBpbnQgaTsKLSAgaW50IHM9MDsKLSAgaW50IHJjPTA7CisgIGludCBzID0gMDsKKyAgaW50IHJjID0gMDsKIAogICBpZighbnVtc29ja3MpCiAgICAgcmV0dXJuIEdFVFNPQ0tfQkxBTks7CkBAIC04MDUsNyArODEzLDcgQEAKICAgICByZXR1cm4gQ3VybF9zc2xfZ2V0c29jayhjb25uLCBzb2NrLCBudW1zb2Nrcyk7CiAjZW5kaWYKIAotICBmb3IoaT0wOyBpPDI7IGkrKykgeworICBmb3IoaSA9IDA7IGk8MjsgaSsrKSB7CiAgICAgaWYoY29ubi0+dGVtcHNvY2tbaV0gIT0gQ1VSTF9TT0NLRVRfQkFEKSB7CiAgICAgICBzb2NrW3NdID0gY29ubi0+dGVtcHNvY2tbaV07CiAgICAgICByYyB8PSBHRVRTT0NLX1dSSVRFU09DSyhzKyspOwpAQCAtODI2LDcgKzgzNCw3IEBACiAKICAgLyogd2hlbiB3ZSd2ZSBzZW50IGEgQ09OTkVDVCB0byBhIHByb3h5LCB3ZSBzaG91bGQgcmF0aGVyIHdhaXQgZm9yIHRoZQogICAgICBzb2NrZXQgdG8gYmVjb21lIHJlYWRhYmxlIHRvIGJlIGFibGUgdG8gZ2V0IHRoZSByZXNwb25zZSBoZWFkZXJzICovCi0gIGlmKGNvbm4tPnR1bm5lbF9zdGF0ZVtGSVJTVFNPQ0tFVF0gPT0gVFVOTkVMX0NPTk5FQ1QpCisgIGlmKGNvbm4tPmNvbm5lY3Rfc3RhdGUpCiAgICAgcmV0dXJuIEdFVFNPQ0tfUkVBRFNPQ0soMCk7CiAKICAgcmV0dXJuIEdFVFNPQ0tfV1JJVEVTT0NLKDApOwpAQCAtOTE2LDcgKzkyNCw3IEBACiAgICAgIFNvbWUgZWFzeSBoYW5kbGVzIG1heSBub3QgaGF2ZSBjb25uZWN0ZWQgdG8gdGhlIHJlbW90ZSBob3N0IHlldCwKICAgICAgYW5kIHRoZW4gd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCBpcyBkb25lLiAqLwogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhOwotICBpbnQgdGhpc19tYXhfZmQ9LTE7CisgIGludCB0aGlzX21heF9mZCA9IC0xOwogICBjdXJsX3NvY2tldF90IHNvY2tidW5jaFtNQVhfU09DS1NQRVJFQVNZSEFORExFXTsKICAgaW50IGJpdG1hcDsKICAgaW50IGk7CkBAIC05MjUsMTEgKzkzMywxMSBAQAogICBpZighR09PRF9NVUxUSV9IQU5ETEUobXVsdGkpKQogICAgIHJldHVybiBDVVJMTV9CQURfSEFORExFOwogCi0gIGRhdGE9bXVsdGktPmVhc3lwOworICBkYXRhID0gbXVsdGktPmVhc3lwOwogICB3aGlsZShkYXRhKSB7CiAgICAgYml0bWFwID0gbXVsdGlfZ2V0c29jayhkYXRhLCBzb2NrYnVuY2gsIE1BWF9TT0NLU1BFUkVBU1lIQU5ETEUpOwogCi0gICAgZm9yKGk9MDsgaTwgTUFYX1NPQ0tTUEVSRUFTWUhBTkRMRTsgaSsrKSB7CisgICAgZm9yKGkgPSAwOyBpPCBNQVhfU09DS1NQRVJFQVNZSEFORExFOyBpKyspIHsKICAgICAgIGN1cmxfc29ja2V0X3QgcyA9IENVUkxfU09DS0VUX0JBRDsKIAogICAgICAgaWYoKGJpdG1hcCAmIEdFVFNPQ0tfUkVBRFNPQ0soaSkpICYmIFZBTElEX1NPQ0soKHNvY2tidW5jaFtpXSkpKSB7CkBAIC05ODYsMTEgKzk5NCwxMSBAQAogICAgIHRpbWVvdXRfbXMgPSAoaW50KXRpbWVvdXRfaW50ZXJuYWw7CiAKICAgLyogQ291bnQgdXAgaG93IG1hbnkgZmRzIHdlIGhhdmUgZnJvbSB0aGUgbXVsdGkgaGFuZGxlICovCi0gIGRhdGE9bXVsdGktPmVhc3lwOworICBkYXRhID0gbXVsdGktPmVhc3lwOwogICB3aGlsZShkYXRhKSB7CiAgICAgYml0bWFwID0gbXVsdGlfZ2V0c29jayhkYXRhLCBzb2NrYnVuY2gsIE1BWF9TT0NLU1BFUkVBU1lIQU5ETEUpOwogCi0gICAgZm9yKGk9MDsgaTwgTUFYX1NPQ0tTUEVSRUFTWUhBTkRMRTsgaSsrKSB7CisgICAgZm9yKGkgPSAwOyBpPCBNQVhfU09DS1NQRVJFQVNZSEFORExFOyBpKyspIHsKICAgICAgIGN1cmxfc29ja2V0X3QgcyA9IENVUkxfU09DS0VUX0JBRDsKIAogICAgICAgaWYoYml0bWFwICYgR0VUU09DS19SRUFEU09DSyhpKSkgewpAQCAtMTAxNCw2ICsxMDIyLDEwIEBACiAKICAgaWYobmZkcykgewogICAgIGlmKG5mZHMgPiBOVU1fUE9MTFNfT05fU1RBQ0spIHsKKyAgICAgIC8qICduZmRzJyBpcyBhIDMyIGJpdCB2YWx1ZSBhbmQgJ3N0cnVjdCBwb2xsZmQnIGlzIHR5cGljYWxseSA4IGJ5dGVzCisgICAgICAgICBiaWcsIHNvIGF0IDJeMjkgc29ja2V0cyB0aGlzIHZhbHVlIG1pZ2h0IHdyYXAuIFdoZW4gYSBwcm9jZXNzIGdldHMKKyAgICAgICAgIHRoZSBjYXBhYmlsaXR5IHRvIGFjdHVhbGx5IGhhbmRsZSBvdmVyIDUwMCBtaWxsaW9uIHNvY2tldHMgdGhpcworICAgICAgICAgY2FsY3VsYXRpb24gbmVlZHMgYSBpbnRlZ2VyIG92ZXJmbG93IGNoZWNrLiAqLwogICAgICAgdWZkcyA9IG1hbGxvYyhuZmRzICogc2l6ZW9mKHN0cnVjdCBwb2xsZmQpKTsKICAgICAgIGlmKCF1ZmRzKQogICAgICAgICByZXR1cm4gQ1VSTE1fT1VUX09GX01FTU9SWTsKQEAgLTEwMjksMTEgKzEwNDEsMTEgQEAKIAogICBpZihjdXJsZmRzKSB7CiAgICAgLyogQWRkIHRoZSBjdXJsIGhhbmRsZXMgdG8gb3VyIHBvbGxmZHMgZmlyc3QgKi8KLSAgICBkYXRhPW11bHRpLT5lYXN5cDsKKyAgICBkYXRhID0gbXVsdGktPmVhc3lwOwogICAgIHdoaWxlKGRhdGEpIHsKICAgICAgIGJpdG1hcCA9IG11bHRpX2dldHNvY2soZGF0YSwgc29ja2J1bmNoLCBNQVhfU09DS1NQRVJFQVNZSEFORExFKTsKIAotICAgICAgZm9yKGk9MDsgaTwgTUFYX1NPQ0tTUEVSRUFTWUhBTkRMRTsgaSsrKSB7CisgICAgICBmb3IoaSA9IDA7IGk8IE1BWF9TT0NLU1BFUkVBU1lIQU5ETEU7IGkrKykgewogICAgICAgICBjdXJsX3NvY2tldF90IHMgPSBDVVJMX1NPQ0tFVF9CQUQ7CiAKICAgICAgICAgaWYoYml0bWFwICYgR0VUU09DS19SRUFEU09DSyhpKSkgewpAQCAtMTIxNywxNSArMTIyOSwxNSBAQAogICovCiBzdGF0aWMgdm9pZCBkb19jb21wbGV0ZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pCiB7Ci0gIGNvbm4tPmRhdGEtPnJlcS5jaHVuaz1GQUxTRTsKKyAgY29ubi0+ZGF0YS0+cmVxLmNodW5rID0gRkFMU0U7CiAgIGNvbm4tPmRhdGEtPnJlcS5tYXhmZCA9IChjb25uLT5zb2NrZmQ+Y29ubi0+d3JpdGVzb2NrZmQ/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uLT5zb2NrZmQ6Y29ubi0+d3JpdGVzb2NrZmQpKzE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uLT5zb2NrZmQ6Y29ubi0+d3JpdGVzb2NrZmQpICsgMTsKICAgQ3VybF9wZ3JzVGltZShjb25uLT5kYXRhLCBUSU1FUl9QUkVUUkFOU0ZFUik7CiB9CiAKIHN0YXRpYyBDVVJMY29kZSBtdWx0aV9kbyhzdHJ1Y3QgY29ubmVjdGRhdGEgKipjb25ucCwgYm9vbCAqZG9uZSkKIHsKLSAgQ1VSTGNvZGUgcmVzdWx0PUNVUkxFX09LOworICBDVVJMY29kZSByZXN1bHQgPSBDVVJMRV9PSzsKICAgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uID0gKmNvbm5wOwogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKIApAQCAtMTI3NCw3ICsxMjg2LDcgQEAKIAogc3RhdGljIENVUkxjb2RlIG11bHRpX2RvX21vcmUoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgKmNvbXBsZXRlKQogewotICBDVVJMY29kZSByZXN1bHQ9Q1VSTEVfT0s7CisgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOwogCiAgICpjb21wbGV0ZSA9IDA7CiAKQEAgLTEyODksNyArMTMwMSw3IEBACiB9CiAKIHN0YXRpYyBDVVJMTWNvZGUgbXVsdGlfcnVuc2luZ2xlKHN0cnVjdCBDdXJsX211bHRpICptdWx0aSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsIG5vdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjdXJsdGltZSBub3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKQogewogICBzdHJ1Y3QgQ3VybF9tZXNzYWdlICptc2cgPSBOVUxMOwpAQCAtMTQwMyw3ICsxNDE1LDcgQEAKICAgICBzd2l0Y2goZGF0YS0+bXN0YXRlKSB7CiAgICAgY2FzZSBDVVJMTV9TVEFURV9JTklUOgogICAgICAgLyogaW5pdCB0aGlzIHRyYW5zZmVyLiAqLwotICAgICAgcmVzdWx0PUN1cmxfcHJldHJhbnNmZXIoZGF0YSk7CisgICAgICByZXN1bHQgPSBDdXJsX3ByZXRyYW5zZmVyKGRhdGEpOwogCiAgICAgICBpZighcmVzdWx0KSB7CiAgICAgICAgIC8qIGFmdGVyIGluaXQsIGdvIENPTk5FQ1QgKi8KQEAgLTE0NTUsNyArMTQ2Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE1fU1RBVEVfV0FJVERPOkNVUkxNX1NUQVRFX0RPKTsKICAgICAgICAgICAgIGVsc2UgewogI2lmbmRlZiBDVVJMX0RJU0FCTEVfSFRUUAotICAgICAgICAgICAgICBpZihkYXRhLT5lYXN5X2Nvbm4tPnR1bm5lbF9zdGF0ZVtGSVJTVFNPQ0tFVF0gPT0gVFVOTkVMX0NPTk5FQ1QpCisgICAgICAgICAgICAgIGlmKEN1cmxfY29ubmVjdF9vbmdvaW5nKGRhdGEtPmVhc3lfY29ubikpCiAgICAgICAgICAgICAgICAgbXVsdGlzdGF0ZShkYXRhLCBDVVJMTV9TVEFURV9XQUlUUFJPWFlDT05ORUNUKTsKICAgICAgICAgICAgICAgZWxzZQogI2VuZGlmCkBAIC0xNTIwLDcgKzE1MzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBDVVJMTV9TVEFURV9XQUlURE86Q1VSTE1fU1RBVEVfRE8pOwogICAgICAgICAgIGVsc2UgewogI2lmbmRlZiBDVVJMX0RJU0FCTEVfSFRUUAotICAgICAgICAgICAgaWYoZGF0YS0+ZWFzeV9jb25uLT50dW5uZWxfc3RhdGVbRklSU1RTT0NLRVRdID09IFRVTk5FTF9DT05ORUNUKQorICAgICAgICAgICAgaWYoQ3VybF9jb25uZWN0X29uZ29pbmcoZGF0YS0+ZWFzeV9jb25uKSkKICAgICAgICAgICAgICAgbXVsdGlzdGF0ZShkYXRhLCBDVVJMTV9TVEFURV9XQUlUUFJPWFlDT05ORUNUKTsKICAgICAgICAgICAgIGVsc2UKICNlbmRpZgpAQCAtMTU1Miw3ICsxNTY0LDcgQEAKICAgICAgIGVsc2UgaWYoIXJlc3VsdCkgewogICAgICAgICBpZigoZGF0YS0+ZWFzeV9jb25uLT5odHRwX3Byb3h5LnByb3h5dHlwZSAhPSBDVVJMUFJPWFlfSFRUUFMgfHwKICAgICAgICAgICAgZGF0YS0+ZWFzeV9jb25uLT5iaXRzLnByb3h5X3NzbF9jb25uZWN0ZWRbRklSU1RTT0NLRVRdKSAmJgotICAgICAgICAgICAoZGF0YS0+ZWFzeV9jb25uLT50dW5uZWxfc3RhdGVbRklSU1RTT0NLRVRdICE9IFRVTk5FTF9DT05ORUNUKSkgeworICAgICAgICAgICBDdXJsX2Nvbm5lY3RfY29tcGxldGUoZGF0YS0+ZWFzeV9jb25uKSkgewogICAgICAgICAgIHJjID0gQ1VSTE1fQ0FMTF9NVUxUSV9QRVJGT1JNOwogICAgICAgICAgIC8qIGluaXRpYXRlIHByb3RvY29sIGNvbm5lY3QgcGhhc2UgKi8KICAgICAgICAgICBtdWx0aXN0YXRlKGRhdGEsIENVUkxNX1NUQVRFX1NFTkRQUk9UT0NPTk5FQ1QpOwpAQCAtMTU2OCw3ICsxNTgwLDcgQEAKICNpZm5kZWYgQ1VSTF9ESVNBQkxFX0hUVFAKICAgICAgICAgaWYoKGRhdGEtPmVhc3lfY29ubi0+aHR0cF9wcm94eS5wcm94eXR5cGUgPT0gQ1VSTFBST1hZX0hUVFBTICYmCiAgICAgICAgICAgICAhZGF0YS0+ZWFzeV9jb25uLT5iaXRzLnByb3h5X3NzbF9jb25uZWN0ZWRbRklSU1RTT0NLRVRdKSB8fAotICAgICAgICAgICAgKGRhdGEtPmVhc3lfY29ubi0+dHVubmVsX3N0YXRlW0ZJUlNUU09DS0VUXSA9PSBUVU5ORUxfQ09OTkVDVCkpIHsKKyAgICAgICAgICAgQ3VybF9jb25uZWN0X29uZ29pbmcoZGF0YS0+ZWFzeV9jb25uKSkgewogICAgICAgICAgIG11bHRpc3RhdGUoZGF0YSwgQ1VSTE1fU1RBVEVfV0FJVFBST1hZQ09OTkVDVCk7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE2ODUsNyArMTY5Nyw3IEBACiAgICAgICAgICAgICogYmFjayB0byB0aGUgQ09OTkVDVCBwaGFzZSBzbyB3ZSBjYW4gdHJ5IGFnYWluLgogICAgICAgICAgICAqLwogICAgICAgICAgIGNoYXIgKm5ld3VybCA9IE5VTEw7Ci0gICAgICAgICAgZm9sbG93dHlwZSBmb2xsb3c9Rk9MTE9XX05PTkU7CisgICAgICAgICAgZm9sbG93dHlwZSBmb2xsb3cgPSBGT0xMT1dfTk9ORTsKICAgICAgICAgICBDVVJMY29kZSBkcmM7CiAgICAgICAgICAgYm9vbCByZXRyeSA9IEZBTFNFOwogCkBAIC0xNzcxLDcgKzE3ODMsNyBAQAogICAgICAgICBpZihjb250cm9sKSB7CiAgICAgICAgICAgLyogaWYgcG9zaXRpdmUsIGFkdmFuY2UgdG8gRE9fRE9ORQogICAgICAgICAgICAgIGlmIG5lZ2F0aXZlLCBnbyBiYWNrIHRvIERPSU5HICovCi0gICAgICAgICAgbXVsdGlzdGF0ZShkYXRhLCBjb250cm9sPT0xPworICAgICAgICAgIG11bHRpc3RhdGUoZGF0YSwgY29udHJvbCA9PSAxPwogICAgICAgICAgICAgICAgICAgICAgQ1VSTE1fU1RBVEVfRE9fRE9ORToKICAgICAgICAgICAgICAgICAgICAgIENVUkxNX1NUQVRFX0RPSU5HKTsKICAgICAgICAgICByYyA9IENVUkxNX0NBTExfTVVMVElfUEVSRk9STTsKQEAgLTE5MjYsNyArMTkzOCw3IEBACiAgICAgICAgIG11bHRpX2RvbmUoJmRhdGEtPmVhc3lfY29ubiwgcmVzdWx0LCBUUlVFKTsKICAgICAgIH0KICAgICAgIGVsc2UgaWYoZG9uZSkgewotICAgICAgICBmb2xsb3d0eXBlIGZvbGxvdz1GT0xMT1dfTk9ORTsKKyAgICAgICAgZm9sbG93dHlwZSBmb2xsb3cgPSBGT0xMT1dfTk9ORTsKIAogICAgICAgICAvKiBjYWxsIHRoaXMgZXZlbiBpZiB0aGUgcmVhZHdyaXRlIGZ1bmN0aW9uIHJldHVybmVkIGVycm9yICovCiAgICAgICAgIEN1cmxfcG9zdHRyYW5zZmVyKGRhdGEpOwpAQCAtMjEzMiwxNCArMjE0NCwxNCBAQAogQ1VSTE1jb2RlIGN1cmxfbXVsdGlfcGVyZm9ybShzdHJ1Y3QgQ3VybF9tdWx0aSAqbXVsdGksIGludCAqcnVubmluZ19oYW5kbGVzKQogewogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhOwotICBDVVJMTWNvZGUgcmV0dXJuY29kZT1DVVJMTV9PSzsKKyAgQ1VSTE1jb2RlIHJldHVybmNvZGUgPSBDVVJMTV9PSzsKICAgc3RydWN0IEN1cmxfdHJlZSAqdDsKLSAgc3RydWN0IHRpbWV2YWwgbm93ID0gQ3VybF90dm5vdygpOworICBzdHJ1Y3QgY3VybHRpbWUgbm93ID0gQ3VybF90dm5vdygpOwogCiAgIGlmKCFHT09EX01VTFRJX0hBTkRMRShtdWx0aSkpCiAgICAgcmV0dXJuIENVUkxNX0JBRF9IQU5ETEU7CiAKLSAgZGF0YT1tdWx0aS0+ZWFzeXA7CisgIGRhdGEgPSBtdWx0aS0+ZWFzeXA7CiAgIHdoaWxlKGRhdGEpIHsKICAgICBDVVJMTWNvZGUgcmVzdWx0OwogICAgIFNJR1BJUEVfVkFSSUFCTEUocGlwZV9zdCk7CkBAIC0yMjM0LDcgKzIyNDYsNyBAQAogICAgIC8qIHJlbW92ZSBhbGwgZWFzeSBoYW5kbGVzICovCiAgICAgZGF0YSA9IG11bHRpLT5lYXN5cDsKICAgICB3aGlsZShkYXRhKSB7Ci0gICAgICBuZXh0ZGF0YT1kYXRhLT5uZXh0OworICAgICAgbmV4dGRhdGEgPSBkYXRhLT5uZXh0OwogICAgICAgaWYoZGF0YS0+ZG5zLmhvc3RjYWNoZXR5cGUgPT0gSENBQ0hFX01VTFRJKSB7CiAgICAgICAgIC8qIGNsZWFyIG91dCB0aGUgdXNhZ2Ugb2YgdGhlIHNoYXJlZCBETlMgY2FjaGUgKi8KICAgICAgICAgQ3VybF9ob3N0Y2FjaGVfY2xlYW4oZGF0YSwgZGF0YS0+ZG5zLmhvc3RjYWNoZSk7CkBAIC0yMzE0LDcgKzIzMjYsNyBAQAogICBpbnQgbnVtOwogICB1bnNpZ25lZCBpbnQgY3VycmFjdGlvbjsKIAotICBmb3IoaT0wOyBpPCBNQVhfU09DS1NQRVJFQVNZSEFORExFOyBpKyspCisgIGZvcihpID0gMDsgaTwgTUFYX1NPQ0tTUEVSRUFTWUhBTkRMRTsgaSsrKQogICAgIHNvY2tzW2ldID0gQ1VSTF9TT0NLRVRfQkFEOwogCiAgIC8qIEZpbGwgaW4gdGhlICdjdXJyZW50JyBzdHJ1Y3Qgd2l0aCB0aGUgc3RhdGUgYXMgaXQgaXMgbm93OiB3aGF0IHNvY2tldHMgdG8KQEAgLTIzMjYsNyArMjMzOCw3IEBACiAgICAgIGxvbmdlciBzdXBlcnZpc2VkIG9uZXMgYW5kIGFkZCBuZXcgb25lcyAqLwogCiAgIC8qIHdhbGsgb3ZlciB0aGUgc29ja2V0cyB3ZSBnb3QgcmlnaHQgbm93ICovCi0gIGZvcihpPTA7IChpPCBNQVhfU09DS1NQRVJFQVNZSEFORExFKSAmJgorICBmb3IoaSA9IDA7IChpPCBNQVhfU09DS1NQRVJFQVNZSEFORExFKSAmJgogICAgICAgICAoY3VycmFjdGlvbiAmIChHRVRTT0NLX1JFQURTT0NLKGkpIHwgR0VUU09DS19XUklURVNPQ0soaSkpKTsKICAgICAgIGkrKykgewogICAgIGludCBhY3Rpb24gPSBDVVJMX1BPTExfTk9ORTsKQEAgLTIzNzAsMTAgKzIzODIsMTAgQEAKIAogICAvKiB3aGVuIHdlJ3ZlIHdhbGtlZCBvdmVyIGFsbCB0aGUgc29ja2V0cyB3ZSBzaG91bGQgaGF2ZSByaWdodCBub3csIHdlIG11c3QKICAgICAgbWFrZSBzdXJlIHRvIGRldGVjdCBzb2NrZXRzIHRoYXQgYXJlIHJlbW92ZWQgKi8KLSAgZm9yKGk9MDsgaTwgZGF0YS0+bnVtc29ja3M7IGkrKykgeworICBmb3IoaSA9IDA7IGk8IGRhdGEtPm51bXNvY2tzOyBpKyspIHsKICAgICBpbnQgajsKICAgICBzID0gZGF0YS0+c29ja2V0c1tpXTsKLSAgICBmb3Ioaj0wOyBqPG51bTsgaisrKSB7CisgICAgZm9yKGogPSAwOyBqPG51bTsgaisrKSB7CiAgICAgICBpZihzID09IHNvY2tzW2pdKSB7CiAgICAgICAgIC8qIHRoaXMgaXMgc3RpbGwgc3VwZXJ2aXNlZCAqLwogICAgICAgICBzID0gQ1VSTF9TT0NLRVRfQkFEOwpAQCAtMjQ4NCwxMSArMjQ5NiwxMSBAQAogICogVGhlIHNwbGF5IHRyZWUgb25seSBoYXMgZWFjaCBzZXNzaW9uaGFuZGxlIGFzIGEgc2luZ2xlIG5vZGUgYW5kIHRoZSBuZWFyZXN0CiAgKiB0aW1lb3V0IGlzIHVzZWQgdG8gc29ydCBpdCBvbi4KICAqLwotc3RhdGljIENVUkxNY29kZSBhZGRfbmV4dF90aW1lb3V0KHN0cnVjdCB0aW1ldmFsIG5vdywKK3N0YXRpYyBDVVJMTWNvZGUgYWRkX25leHRfdGltZW91dChzdHJ1Y3QgY3VybHRpbWUgbm93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDdXJsX211bHRpICptdWx0aSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF9lYXN5ICpkKQogewotICBzdHJ1Y3QgdGltZXZhbCAqdHYgPSAmZC0+c3RhdGUuZXhwaXJldGltZTsKKyAgc3RydWN0IGN1cmx0aW1lICp0diA9ICZkLT5zdGF0ZS5leHBpcmV0aW1lOwogICBzdHJ1Y3QgY3VybF9sbGlzdCAqbGlzdCA9ICZkLT5zdGF0ZS50aW1lb3V0bGlzdDsKICAgc3RydWN0IGN1cmxfbGxpc3RfZWxlbWVudCAqZTsKICAgc3RydWN0IHRpbWVfbm9kZSAqbm9kZSA9IE5VTEw7CkBAIC0yNTIwLDEwICsyNTMyLDggQEAKICAgICAvKiBjb3B5IHRoZSBmaXJzdCBlbnRyeSB0byAndHYnICovCiAgICAgbWVtY3B5KHR2LCAmbm9kZS0+dGltZSwgc2l6ZW9mKCp0dikpOwogCi0gICAgLyogcmVtb3ZlIGZpcnN0IGVudHJ5IGZyb20gbGlzdCAqLwotICAgIEN1cmxfbGxpc3RfcmVtb3ZlKGxpc3QsIGUsIE5VTEwpOwotCi0gICAgLyogaW5zZXJ0IHRoaXMgbm9kZSBhZ2FpbiBpbnRvIHRoZSBzcGxheSAqLworICAgIC8qIEluc2VydCB0aGlzIG5vZGUgYWdhaW4gaW50byB0aGUgc3BsYXkuICBLZWVwIHRoZSB0aW1lciBpbiB0aGUgbGlzdCBpbgorICAgICAgIGNhc2Ugd2UgbmVlZCB0byByZWNvbXB1dGUgZnV0dXJlIHRpbWVycy4gKi8KICAgICBtdWx0aS0+dGltZXRyZWUgPSBDdXJsX3NwbGF5aW5zZXJ0KCp0diwgbXVsdGktPnRpbWV0cmVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmQtPnN0YXRlLnRpbWVub2RlKTsKICAgfQpAQCAtMjUzOSw3ICsyNTQ5LDcgQEAKICAgQ1VSTE1jb2RlIHJlc3VsdCA9IENVUkxNX09LOwogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gTlVMTDsKICAgc3RydWN0IEN1cmxfdHJlZSAqdDsKLSAgc3RydWN0IHRpbWV2YWwgbm93ID0gQ3VybF90dm5vdygpOworICBzdHJ1Y3QgY3VybHRpbWUgbm93ID0gQ3VybF90dm5vdygpOwogCiAgIGlmKGNoZWNrYWxsKSB7CiAgICAgLyogKnBlcmZvcm0oKSBkZWFscyB3aXRoIHJ1bm5pbmdfaGFuZGxlcyBvbiBpdHMgb3duICovCkBAIC0yNTQ4LDcgKzI1NTgsNyBAQAogICAgIC8qIHdhbGsgdGhyb3VnaCBlYWNoIGVhc3kgaGFuZGxlIGFuZCBkbyB0aGUgc29ja2V0IHN0YXRlIGNoYW5nZSBtYWdpYwogICAgICAgIGFuZCBjYWxsYmFja3MgKi8KICAgICBpZihyZXN1bHQgIT0gQ1VSTE1fQkFEX0hBTkRMRSkgewotICAgICAgZGF0YT1tdWx0aS0+ZWFzeXA7CisgICAgICBkYXRhID0gbXVsdGktPmVhc3lwOwogICAgICAgd2hpbGUoZGF0YSkgewogICAgICAgICBzaW5nbGVzb2NrZXQobXVsdGksIGRhdGEpOwogICAgICAgICBkYXRhID0gZGF0YS0+bmV4dDsKQEAgLTI3NjUsMTEgKzI3NzUsMTEgQEAKIHN0YXRpYyBDVVJMTWNvZGUgbXVsdGlfdGltZW91dChzdHJ1Y3QgQ3VybF9tdWx0aSAqbXVsdGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAqdGltZW91dF9tcykKIHsKLSAgc3RhdGljIHN0cnVjdCB0aW1ldmFsIHR2X3plcm8gPSB7MCwgMH07CisgIHN0YXRpYyBzdHJ1Y3QgY3VybHRpbWUgdHZfemVybyA9IHswLCAwfTsKIAogICBpZihtdWx0aS0+dGltZXRyZWUpIHsKICAgICAvKiB3ZSBoYXZlIGEgdHJlZSBvZiBleHBpcmUgdGltZXMgKi8KLSAgICBzdHJ1Y3QgdGltZXZhbCBub3cgPSBDdXJsX3R2bm93KCk7CisgICAgc3RydWN0IGN1cmx0aW1lIG5vdyA9IEN1cmxfdHZub3coKTsKIAogICAgIC8qIHNwbGF5IHRoZSBsb3dlc3QgdG8gdGhlIGJvdHRvbSAqLwogICAgIG11bHRpLT50aW1ldHJlZSA9IEN1cmxfc3BsYXkodHZfemVybywgbXVsdGktPnRpbWV0cmVlKTsKQEAgLTI3ODUsNyArMjc5NSw3IEBACiAgICAgICAgICAqIHByb2Nlc3NvcnMgd2hpbGUgdGhlIGRpZmYgaXMgc3RpbGwgcHJlc2VudCBidXQgbGVzcyB0aGFuIG9uZQogICAgICAgICAgKiBtaWxsaXNlY29uZCEgaW5zdGVhZCB3ZSByZXR1cm4gMSB1bnRpbCB0aGUgdGltZSBpcyByaXBlLgogICAgICAgICAgKi8KLSAgICAgICAgKnRpbWVvdXRfbXM9MTsKKyAgICAgICAgKnRpbWVvdXRfbXMgPSAxOwogICAgIH0KICAgICBlbHNlCiAgICAgICAvKiAwIG1lYW5zIGltbWVkaWF0ZWx5ICovCkBAIC0yODIxLDcgKzI4MzEsNyBAQAogICAgIHJldHVybiAtMTsKICAgfQogICBpZih0aW1lb3V0X21zIDwgMCkgewotICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdGltZXZhbCBub25lPXswLCAwfTsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IGN1cmx0aW1lIG5vbmUgPSB7MCwgMH07CiAgICAgaWYoQ3VybF9zcGxheWNvbXBhcmVrZXlzKG5vbmUsIG11bHRpLT50aW1lcl9sYXN0Y2FsbCkpIHsKICAgICAgIG11bHRpLT50aW1lcl9sYXN0Y2FsbCA9IG5vbmU7CiAgICAgICAvKiB0aGVyZSdzIG5vIHRpbWVvdXQgbm93IGJ1dCB0aGVyZSB3YXMgb25lIHByZXZpb3VzbHksIHRlbGwgdGhlIGFwcCB0bwpAQCAtMjg3Miw3ICsyODgyLDcgQEAKICAqLwogc3RhdGljIENVUkxNY29kZQogbXVsdGlfYWRkdGltZW91dChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAotICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCAqc3RhbXAsCisgICAgICAgICAgICAgICAgIHN0cnVjdCBjdXJsdGltZSAqc3RhbXAsCiAgICAgICAgICAgICAgICAgIGV4cGlyZV9pZCBlaWQpCiB7CiAgIHN0cnVjdCBjdXJsX2xsaXN0X2VsZW1lbnQgKmU7CkBAIC0yOTIwLDkgKzI5MzAsOSBAQAogdm9pZCBDdXJsX2V4cGlyZShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLCB0aW1lX3QgbWlsbGksIGV4cGlyZV9pZCBpZCkKIHsKICAgc3RydWN0IEN1cmxfbXVsdGkgKm11bHRpID0gZGF0YS0+bXVsdGk7Ci0gIHN0cnVjdCB0aW1ldmFsICpub3dwID0gJmRhdGEtPnN0YXRlLmV4cGlyZXRpbWU7CisgIHN0cnVjdCBjdXJsdGltZSAqbm93cCA9ICZkYXRhLT5zdGF0ZS5leHBpcmV0aW1lOwogICBpbnQgcmM7Ci0gIHN0cnVjdCB0aW1ldmFsIHNldDsKKyAgc3RydWN0IGN1cmx0aW1lIHNldDsKIAogICAvKiB0aGlzIGlzIG9ubHkgaW50ZXJlc3Rpbmcgd2hpbGUgdGhlcmUgaXMgc3RpbGwgYW4gYXNzb2NpYXRlZCBtdWx0aSBzdHJ1Y3QKICAgICAgcmVtYWluaW5nISAqLwpAQCAtMjkzMiwzNCArMjk0MiwzMyBAQAogICBERUJVR0FTU0VSVChpZCA8IEVYUElSRV9MQVNUKTsKIAogICBzZXQgPSBDdXJsX3R2bm93KCk7Ci0gIHNldC50dl9zZWMgKz0gKGxvbmcpKG1pbGxpLzEwMDApOwotICBzZXQudHZfdXNlYyArPSAobG9uZykobWlsbGklMTAwMCkqMTAwMDsKKyAgc2V0LnR2X3NlYyArPSBtaWxsaS8xMDAwOworICBzZXQudHZfdXNlYyArPSAodW5zaWduZWQgaW50KShtaWxsaSUxMDAwKSoxMDAwOwogCiAgIGlmKHNldC50dl91c2VjID49IDEwMDAwMDApIHsKICAgICBzZXQudHZfc2VjKys7CiAgICAgc2V0LnR2X3VzZWMgLT0gMTAwMDAwMDsKICAgfQogCisgIC8qIFJlbW92ZSBhbnkgdGltZXIgd2l0aCB0aGUgc2FtZSBpZCBqdXN0IGluIGNhc2UuICovCisgIG11bHRpX2RlbHRpbWVvdXQoZGF0YSwgaWQpOworCisgIC8qIEFkZCBpdCB0byB0aGUgdGltZXIgbGlzdC4gIEl0IG11c3Qgc3RheSBpbiB0aGUgbGlzdCB1bnRpbCBpdCBoYXMgZXhwaXJlZAorICAgICBpbiBjYXNlIHdlIG5lZWQgdG8gcmVjb21wdXRlIHRoZSBtaW5pbXVtIHRpbWVyIGxhdGVyLiAqLworICBtdWx0aV9hZGR0aW1lb3V0KGRhdGEsICZzZXQsIGlkKTsKKwogICBpZihub3dwLT50dl9zZWMgfHwgbm93cC0+dHZfdXNlYykgewogICAgIC8qIFRoaXMgbWVhbnMgdGhhdCB0aGUgc3RydWN0IGlzIGFkZGVkIGFzIGEgbm9kZSBpbiB0aGUgc3BsYXkgdHJlZS4KICAgICAgICBDb21wYXJlIGlmIHRoZSBuZXcgdGltZSBpcyBlYXJsaWVyLCBhbmQgb25seSByZW1vdmUtb2xkL2FkZC1uZXcgaWYgaXQKICAgICAgICBpcy4gKi8KICAgICB0aW1lX3QgZGlmZiA9IGN1cmx4X3R2ZGlmZihzZXQsICpub3dwKTsKIAotICAgIC8qIHJlbW92ZSB0aGUgcHJldmlvdXMgdGltZXIgZmlyc3QsIGlmIHRoZXJlICovCi0gICAgbXVsdGlfZGVsdGltZW91dChkYXRhLCBpZCk7Ci0KICAgICBpZihkaWZmID4gMCkgewotICAgICAgLyogdGhlIG5ldyBleHBpcmUgdGltZSB3YXMgbGF0ZXIgc28ganVzdCBhZGQgaXQgdG8gdGhlIHF1ZXVlCi0gICAgICAgICBhbmQgZ2V0IG91dCAqLwotICAgICAgbXVsdGlfYWRkdGltZW91dChkYXRhLCAmc2V0LCBpZCk7CisgICAgICAvKiBUaGUgY3VycmVudCBzcGxheSB0cmVlIGVudHJ5IGlzIHNvb25lciB0aGFuIHRoaXMgbmV3IGV4cGlyeSB0aW1lLgorICAgICAgICAgV2UgZG9uJ3QgbmVlZCB0byB1cGRhdGUgb3VyIHNwbGF5IHRyZWUgZW50cnkuICovCiAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgLyogdGhlIG5ldyB0aW1lIGlzIG5ld2VyIHRoYW4gdGhlIHByZXNlbnRseSBzZXQgb25lLCBzbyBhZGQgdGhlIGN1cnJlbnQKLSAgICAgICB0byB0aGUgcXVldWUgYW5kIHVwZGF0ZSB0aGUgaGVhZCAqLwotICAgIG11bHRpX2FkZHRpbWVvdXQoZGF0YSwgbm93cCwgaWQpOwotCiAgICAgLyogU2luY2UgdGhpcyBpcyBhbiB1cGRhdGVkIHRpbWUsIHdlIG11c3QgcmVtb3ZlIHRoZSBwcmV2aW91cyBlbnRyeSBmcm9tCiAgICAgICAgdGhlIHNwbGF5IHRyZWUgZmlyc3QgYW5kIHRoZW4gcmUtYWRkIHRoZSBuZXcgdmFsdWUgKi8KICAgICByYyA9IEN1cmxfc3BsYXlyZW1vdmVieWFkZHIobXVsdGktPnRpbWV0cmVlLApAQCAtMjk2OSw2ICsyOTc4LDggQEAKICAgICAgIGluZm9mKGRhdGEsICJJbnRlcm5hbCBlcnJvciByZW1vdmluZyBzcGxheSBub2RlID0gJWRcbiIsIHJjKTsKICAgfQogCisgIC8qIEluZGljYXRlIHRoYXQgd2UgYXJlIGluIHRoZSBzcGxheSB0cmVlIGFuZCBpbnNlcnQgdGhlIG5ldyB0aW1lciBleHBpcnkKKyAgICAgdmFsdWUgc2luY2UgaXQgaXMgb3VyIGxvY2FsIG1pbmltdW0uICovCiAgICpub3dwID0gc2V0OwogICBkYXRhLT5zdGF0ZS50aW1lbm9kZS5wYXlsb2FkID0gZGF0YTsKICAgbXVsdGktPnRpbWV0cmVlID0gQ3VybF9zcGxheWluc2VydCgqbm93cCwgbXVsdGktPnRpbWV0cmVlLApAQCAtMjk5NSw3ICszMDA2LDcgQEAKIHZvaWQgQ3VybF9leHBpcmVfY2xlYXIoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSkKIHsKICAgc3RydWN0IEN1cmxfbXVsdGkgKm11bHRpID0gZGF0YS0+bXVsdGk7Ci0gIHN0cnVjdCB0aW1ldmFsICpub3dwID0gJmRhdGEtPnN0YXRlLmV4cGlyZXRpbWU7CisgIHN0cnVjdCBjdXJsdGltZSAqbm93cCA9ICZkYXRhLT5zdGF0ZS5leHBpcmV0aW1lOwogICBpbnQgcmM7CiAKICAgLyogdGhpcyBpcyBvbmx5IGludGVyZXN0aW5nIHdoaWxlIHRoZXJlIGlzIHN0aWxsIGFuIGFzc29jaWF0ZWQgbXVsdGkgc3RydWN0CkBAIC0zMTA0LDEzICszMTE1LDEzIEBACiAgIGludCBpOwogICBmcHJpbnRmKHN0ZGVyciwgIiogTXVsdGkgc3RhdHVzOiAlZCBoYW5kbGVzLCAlZCBhbGl2ZVxuIiwKICAgICAgICAgICBtdWx0aS0+bnVtX2Vhc3ksIG11bHRpLT5udW1fYWxpdmUpOwotICBmb3IoZGF0YT1tdWx0aS0+ZWFzeXA7IGRhdGE7IGRhdGEgPSBkYXRhLT5uZXh0KSB7CisgIGZvcihkYXRhID0gbXVsdGktPmVhc3lwOyBkYXRhOyBkYXRhID0gZGF0YS0+bmV4dCkgewogICAgIGlmKGRhdGEtPm1zdGF0ZSA8IENVUkxNX1NUQVRFX0NPTVBMRVRFRCkgewogICAgICAgLyogb25seSBkaXNwbGF5IGhhbmRsZXMgdGhhdCBhcmUgbm90IGNvbXBsZXRlZCAqLwogICAgICAgZnByaW50ZihzdGRlcnIsICJoYW5kbGUgJXAsIHN0YXRlICVzLCAlZCBzb2NrZXRzXG4iLAogICAgICAgICAgICAgICAodm9pZCAqKWRhdGEsCiAgICAgICAgICAgICAgIHN0YXRlbmFtZVtkYXRhLT5tc3RhdGVdLCBkYXRhLT5udW1zb2Nrcyk7Ci0gICAgICBmb3IoaT0wOyBpIDwgZGF0YS0+bnVtc29ja3M7IGkrKykgeworICAgICAgZm9yKGkgPSAwOyBpIDwgZGF0YS0+bnVtc29ja3M7IGkrKykgewogICAgICAgICBjdXJsX3NvY2tldF90IHMgPSBkYXRhLT5zb2NrZXRzW2ldOwogICAgICAgICBzdHJ1Y3QgQ3VybF9zaF9lbnRyeSAqZW50cnkgPSBzaF9nZXRlbnRyeSgmbXVsdGktPnNvY2toYXNoLCBzKTsKIApkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvbXVsdGloYW5kbGUuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL211bHRpaGFuZGxlLmgKaW5kZXggZTZmZmJmNS4uNDA1NzUzOSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvbXVsdGloYW5kbGUuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9tdWx0aWhhbmRsZS5oCkBAIC0xNDgsNyArMTQ4LDcgQEAKICAgLyogdGltZXIgY2FsbGJhY2sgYW5kIHVzZXIgZGF0YSBwb2ludGVyIGZvciB0aGUgKnNvY2tldCgpIEFQSSAqLwogICBjdXJsX211bHRpX3RpbWVyX2NhbGxiYWNrIHRpbWVyX2NiOwogICB2b2lkICp0aW1lcl91c2VycDsKLSAgc3RydWN0IHRpbWV2YWwgdGltZXJfbGFzdGNhbGw7IC8qIHRoZSBmaXhlZCB0aW1lIGZvciB0aGUgdGltZW91dCBmb3IgdGhlCisgIHN0cnVjdCBjdXJsdGltZSB0aW1lcl9sYXN0Y2FsbDsgLyogdGhlIGZpeGVkIHRpbWUgZm9yIHRoZSB0aW1lb3V0IGZvciB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzIGNhbGxiYWNrICovCiB9OwogCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9uZXRyYy5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvbmV0cmMuYwppbmRleCA5OTY3MTFkLi5kYmNjNTlhIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9uZXRyYy5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL25ldHJjLmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTU2LDE0ICs1NiwxNSBAQAogICAgICAgICAgICAgICAgICAgICBjaGFyICpuZXRyY2ZpbGUpCiB7CiAgIEZJTEUgKmZpbGU7Ci0gIGludCByZXRjb2RlPTE7CisgIGludCByZXRjb2RlID0gMTsKICAgaW50IHNwZWNpZmljX2xvZ2luID0gKCpsb2dpbnAgJiYgKipsb2dpbnAgIT0gMCk7CiAgIGJvb2wgbmV0cmNfYWxsb2MgPSBGQUxTRTsKLSAgZW51bSBob3N0X2xvb2t1cF9zdGF0ZSBzdGF0ZT1OT1RISU5HOworICBlbnVtIGhvc3RfbG9va3VwX3N0YXRlIHN0YXRlID0gTk9USElORzsKIAotICBjaGFyIHN0YXRlX2xvZ2luPTA7ICAgICAgLyogRm91bmQgYSBsb2dpbiBrZXl3b3JkICovCi0gIGNoYXIgc3RhdGVfcGFzc3dvcmQ9MDsgICAvKiBGb3VuZCBhIHBhc3N3b3JkIGtleXdvcmQgKi8KLSAgaW50IHN0YXRlX291cl9sb2dpbj1GQUxTRTsgIC8qIFdpdGggc3BlY2lmaWNfbG9naW4sIGZvdW5kICpvdXIqIGxvZ2luIG5hbWUgKi8KKyAgY2hhciBzdGF0ZV9sb2dpbiA9IDA7ICAgICAgLyogRm91bmQgYSBsb2dpbiBrZXl3b3JkICovCisgIGNoYXIgc3RhdGVfcGFzc3dvcmQgPSAwOyAgIC8qIEZvdW5kIGEgcGFzc3dvcmQga2V5d29yZCAqLworICBpbnQgc3RhdGVfb3VyX2xvZ2luID0gRkFMU0U7ICAvKiBXaXRoIHNwZWNpZmljX2xvZ2luLCBmb3VuZCAqb3VyKiBsb2dpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lICovCiAKICNkZWZpbmUgTkVUUkMgRE9UX0NIQVIgIm5ldHJjIgogCkBAIC04OCw3ICs4OSw3IEBACiAgICAgfQogICAgIGVsc2UgewogICAgICAgc3RydWN0IHBhc3N3ZCAqcHc7Ci0gICAgICBwdz0gZ2V0cHd1aWQoZ2V0ZXVpZCgpKTsKKyAgICAgIHB3ID0gZ2V0cHd1aWQoZ2V0ZXVpZCgpKTsKICAgICAgIGlmKHB3KSB7CiAgICAgICAgIGhvbWUgPSBwdy0+cHdfZGlyOwogICAgICAgfQpAQCAtMTEzLDE2ICsxMTQsMTkgQEAKICAgaWYoZmlsZSkgewogICAgIGNoYXIgKnRvazsKICAgICBjaGFyICp0b2tfYnVmOwotICAgIGJvb2wgZG9uZT1GQUxTRTsKKyAgICBib29sIGRvbmUgPSBGQUxTRTsKICAgICBjaGFyIG5ldHJjYnVmZmVyWzI1Nl07CiAgICAgaW50ICBuZXRyY2J1ZmZzaXplID0gKGludClzaXplb2YobmV0cmNidWZmZXIpOwogCiAgICAgd2hpbGUoIWRvbmUgJiYgZmdldHMobmV0cmNidWZmZXIsIG5ldHJjYnVmZnNpemUsIGZpbGUpKSB7Ci0gICAgICB0b2s9c3RydG9rX3IobmV0cmNidWZmZXIsICIgXHRcbiIsICZ0b2tfYnVmKTsKKyAgICAgIHRvayA9IHN0cnRva19yKG5ldHJjYnVmZmVyLCAiIFx0XG4iLCAmdG9rX2J1Zik7CisgICAgICBpZih0b2sgJiYgKnRvayA9PSAnIycpCisgICAgICAgIC8qIHRyZWF0IGFuIGluaXRpYWwgaGFzaCBhcyBhIGNvbW1lbnQgbGluZSAqLworICAgICAgICBjb250aW51ZTsKICAgICAgIHdoaWxlKCFkb25lICYmIHRvaykgewogCiAgICAgICAgIGlmKCgqbG9naW5wICYmICoqbG9naW5wKSAmJiAoKnBhc3N3b3JkcCAmJiAqKnBhc3N3b3JkcCkpIHsKLSAgICAgICAgICBkb25lPVRSVUU7CisgICAgICAgICAgZG9uZSA9IFRSVUU7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTMzLDIyICsxMzcsMjIgQEAKICAgICAgICAgICAgICAgIGRlbGltaXRlciB0aGF0IHN0YXJ0cyB0aGUgc3R1ZmYgZW50ZXJlZCBmb3IgdGhpcyBtYWNoaW5lLAogICAgICAgICAgICAgICAgYWZ0ZXIgdGhpcyB3ZSBuZWVkIHRvIHNlYXJjaCBmb3IgJ2xvZ2luJyBhbmQKICAgICAgICAgICAgICAgICdwYXNzd29yZCcuICovCi0gICAgICAgICAgICBzdGF0ZT1IT1NURk9VTkQ7CisgICAgICAgICAgICBzdGF0ZSA9IEhPU1RGT1VORDsKICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZSBpZihzdHJjYXNlY29tcGFyZSgiZGVmYXVsdCIsIHRvaykpIHsKLSAgICAgICAgICAgIHN0YXRlPUhPU1RWQUxJRDsKLSAgICAgICAgICAgIHJldGNvZGU9MDsgLyogd2UgZGlkIGZpbmQgb3VyIGhvc3QgKi8KKyAgICAgICAgICAgIHN0YXRlID0gSE9TVFZBTElEOworICAgICAgICAgICAgcmV0Y29kZSA9IDA7IC8qIHdlIGRpZCBmaW5kIG91ciBob3N0ICovCiAgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEhPU1RGT1VORDoKICAgICAgICAgICBpZihzdHJjYXNlY29tcGFyZShob3N0LCB0b2spKSB7CiAgICAgICAgICAgICAvKiBhbmQgeWVzLCB0aGlzIGlzIG91ciBob3N0ISAqLwotICAgICAgICAgICAgc3RhdGU9SE9TVFZBTElEOwotICAgICAgICAgICAgcmV0Y29kZT0wOyAvKiB3ZSBkaWQgZmluZCBvdXIgaG9zdCAqLworICAgICAgICAgICAgc3RhdGUgPSBIT1NUVkFMSUQ7CisgICAgICAgICAgICByZXRjb2RlID0gMDsgLyogd2UgZGlkIGZpbmQgb3VyIGhvc3QgKi8KICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgLyogbm90IG91ciBob3N0ICovCi0gICAgICAgICAgICBzdGF0ZT1OT1RISU5HOworICAgICAgICAgICAgc3RhdGUgPSBOT1RISU5HOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEhPU1RWQUxJRDoKICAgICAgICAgICAvKiB3ZSBhcmUgbm93IHBhcnNpbmcgc3ViLWtleXdvcmRzIGNvbmNlcm5pbmcgIm91ciIgaG9zdCAqLwpAQCAtMTY0LDcgKzE2OCw3IEBACiAgICAgICAgICAgICAgICAgZ290byBvdXQ7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXRlX2xvZ2luPTA7CisgICAgICAgICAgICBzdGF0ZV9sb2dpbiA9IDA7CiAgICAgICAgICAgfQogICAgICAgICAgIGVsc2UgaWYoc3RhdGVfcGFzc3dvcmQpIHsKICAgICAgICAgICAgIGlmKHN0YXRlX291cl9sb2dpbiB8fCAhc3BlY2lmaWNfbG9naW4pIHsKQEAgLTE3NSwxMiArMTc5LDEyIEBACiAgICAgICAgICAgICAgICAgZ290byBvdXQ7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXRlX3Bhc3N3b3JkPTA7CisgICAgICAgICAgICBzdGF0ZV9wYXNzd29yZCA9IDA7CiAgICAgICAgICAgfQogICAgICAgICAgIGVsc2UgaWYoc3RyY2FzZWNvbXBhcmUoImxvZ2luIiwgdG9rKSkKLSAgICAgICAgICAgIHN0YXRlX2xvZ2luPTE7CisgICAgICAgICAgICBzdGF0ZV9sb2dpbiA9IDE7CiAgICAgICAgICAgZWxzZSBpZihzdHJjYXNlY29tcGFyZSgicGFzc3dvcmQiLCB0b2spKQotICAgICAgICAgICAgc3RhdGVfcGFzc3dvcmQ9MTsKKyAgICAgICAgICAgIHN0YXRlX3Bhc3N3b3JkID0gMTsKICAgICAgICAgICBlbHNlIGlmKHN0cmNhc2Vjb21wYXJlKCJtYWNoaW5lIiwgdG9rKSkgewogICAgICAgICAgICAgLyogb2ssIHRoZXJlJ3MgbWFjaGluZSBoZXJlIGdvID0+ICovCiAgICAgICAgICAgICBzdGF0ZSA9IEhPU1RGT1VORDsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL25vbi1hc2NpaS5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvbm9uLWFzY2lpLmMKaW5kZXggMmY1ZGU0Yy4uOTJiMmY4ZCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvbm9uLWFzY2lpLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvbm9uLWFzY2lpLmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTgyLDcgKzgyLDcgQEAKIENVUkxjb2RlIEN1cmxfY29udmVydF90b19uZXR3b3JrKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpidWZmZXIsIHNpemVfdCBsZW5ndGgpCiB7Ci0gIGlmKGRhdGEtPnNldC5jb252dG9uZXR3b3JrKSB7CisgIGlmKGRhdGEgJiYgZGF0YS0+c2V0LmNvbnZ0b25ldHdvcmspIHsKICAgICAvKiB1c2UgdHJhbnNsYXRpb24gY2FsbGJhY2sgKi8KICAgICBDVVJMY29kZSByZXN1bHQgPSBkYXRhLT5zZXQuY29udnRvbmV0d29yayhidWZmZXIsIGxlbmd0aCk7CiAgICAgaWYocmVzdWx0KSB7CkBAIC05NiwzNCArOTYsMzcgQEAKICAgZWxzZSB7CiAjaWZkZWYgSEFWRV9JQ09OVgogICAgIC8qIGRvIHRoZSB0cmFuc2xhdGlvbiBvdXJzZWx2ZXMgKi8KKyAgICBpY29udl90IHRtcGNkID0gKGljb252X3QpIC0xOworICAgIGljb252X3QgKmNkID0gJnRtcGNkOwogICAgIGNoYXIgKmlucHV0X3B0ciwgKm91dHB1dF9wdHI7CiAgICAgc2l6ZV90IGluX2J5dGVzLCBvdXRfYnl0ZXMsIHJjOwotICAgIGludCBlcnJvcjsKIAogICAgIC8qIG9wZW4gYW4gaWNvbnYgY29udmVyc2lvbiBkZXNjcmlwdG9yIGlmIG5lY2Vzc2FyeSAqLwotICAgIGlmKGRhdGEtPm91dGJvdW5kX2NkID09IChpY29udl90KS0xKSB7Ci0gICAgICBkYXRhLT5vdXRib3VuZF9jZCA9IGljb252X29wZW4oQ1VSTF9JQ09OVl9DT0RFU0VUX09GX05FVFdPUkssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTF9JQ09OVl9DT0RFU0VUX09GX0hPU1QpOwotICAgICAgaWYoZGF0YS0+b3V0Ym91bmRfY2QgPT0gKGljb252X3QpLTEpIHsKLSAgICAgICAgZXJyb3IgPSBFUlJOTzsKKyAgICBpZihkYXRhKQorICAgICAgY2QgPSAmZGF0YS0+b3V0Ym91bmRfY2Q7CisgICAgaWYoKmNkID09IChpY29udl90KS0xKSB7CisgICAgICAqY2QgPSBpY29udl9vcGVuKENVUkxfSUNPTlZfQ09ERVNFVF9PRl9ORVRXT1JLLAorICAgICAgICAgICAgICAgICAgICAgICBDVVJMX0lDT05WX0NPREVTRVRfT0ZfSE9TVCk7CisgICAgICBpZigqY2QgPT0gKGljb252X3QpLTEpIHsKICAgICAgICAgZmFpbGYoZGF0YSwKICAgICAgICAgICAgICAgIlRoZSBpY29udl9vcGVuKFwiJXNcIiwgXCIlc1wiKSBjYWxsIGZhaWxlZCB3aXRoIGVycm5vICVpOiAlcyIsCiAgICAgICAgICAgICAgIENVUkxfSUNPTlZfQ09ERVNFVF9PRl9ORVRXT1JLLAogICAgICAgICAgICAgICBDVVJMX0lDT05WX0NPREVTRVRfT0ZfSE9TVCwKLSAgICAgICAgICAgICAgZXJyb3IsIHN0cmVycm9yKGVycm9yKSk7CisgICAgICAgICAgICAgIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICByZXR1cm4gQ1VSTEVfQ09OVl9GQUlMRUQ7CiAgICAgICB9CiAgICAgfQogICAgIC8qIGNhbGwgaWNvbnYgKi8KICAgICBpbnB1dF9wdHIgPSBvdXRwdXRfcHRyID0gYnVmZmVyOwogICAgIGluX2J5dGVzID0gb3V0X2J5dGVzID0gbGVuZ3RoOwotICAgIHJjID0gaWNvbnYoZGF0YS0+b3V0Ym91bmRfY2QsIChjb25zdCBjaGFyICoqKSZpbnB1dF9wdHIsICZpbl9ieXRlcywKKyAgICByYyA9IGljb252KCpjZCwgJmlucHV0X3B0ciwgJmluX2J5dGVzLAogICAgICAgICAgICAgICAgJm91dHB1dF9wdHIsICZvdXRfYnl0ZXMpOworICAgIGlmKCFkYXRhKQorICAgICAgaWNvbnZfY2xvc2UodG1wY2QpOwogICAgIGlmKChyYyA9PSBJQ09OVl9FUlJPUikgfHwgKGluX2J5dGVzICE9IDApKSB7Ci0gICAgICBlcnJvciA9IEVSUk5POwogICAgICAgZmFpbGYoZGF0YSwKICAgICAgICAgICAgICJUaGUgQ3VybF9jb252ZXJ0X3RvX25ldHdvcmsgaWNvbnYgY2FsbCBmYWlsZWQgd2l0aCBlcnJubyAlaTogJXMiLAotICAgICAgICAgICAgZXJyb3IsIHN0cmVycm9yKGVycm9yKSk7CisgICAgICAgICAgICBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgIHJldHVybiBDVVJMRV9DT05WX0ZBSUxFRDsKICAgICB9CiAjZWxzZQpAQCAtMTQyLDcgKzE0NSw3IEBACiBDVVJMY29kZSBDdXJsX2NvbnZlcnRfZnJvbV9uZXR3b3JrKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkKIHsKLSAgaWYoZGF0YS0+c2V0LmNvbnZmcm9tbmV0d29yaykgeworICBpZihkYXRhICYmIGRhdGEtPnNldC5jb252ZnJvbW5ldHdvcmspIHsKICAgICAvKiB1c2UgdHJhbnNsYXRpb24gY2FsbGJhY2sgKi8KICAgICBDVVJMY29kZSByZXN1bHQgPSBkYXRhLT5zZXQuY29udmZyb21uZXR3b3JrKGJ1ZmZlciwgbGVuZ3RoKTsKICAgICBpZihyZXN1bHQpIHsKQEAgLTE1NiwzNCArMTU5LDM3IEBACiAgIGVsc2UgewogI2lmZGVmIEhBVkVfSUNPTlYKICAgICAvKiBkbyB0aGUgdHJhbnNsYXRpb24gb3Vyc2VsdmVzICovCisgICAgaWNvbnZfdCB0bXBjZCA9IChpY29udl90KSAtMTsKKyAgICBpY29udl90ICpjZCA9ICZ0bXBjZDsKICAgICBjaGFyICppbnB1dF9wdHIsICpvdXRwdXRfcHRyOwogICAgIHNpemVfdCBpbl9ieXRlcywgb3V0X2J5dGVzLCByYzsKLSAgICBpbnQgZXJyb3I7CiAKICAgICAvKiBvcGVuIGFuIGljb252IGNvbnZlcnNpb24gZGVzY3JpcHRvciBpZiBuZWNlc3NhcnkgKi8KLSAgICBpZihkYXRhLT5pbmJvdW5kX2NkID09IChpY29udl90KS0xKSB7Ci0gICAgICBkYXRhLT5pbmJvdW5kX2NkID0gaWNvbnZfb3BlbihDVVJMX0lDT05WX0NPREVTRVRfT0ZfSE9TVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxfSUNPTlZfQ09ERVNFVF9PRl9ORVRXT1JLKTsKLSAgICAgIGlmKGRhdGEtPmluYm91bmRfY2QgPT0gKGljb252X3QpLTEpIHsKLSAgICAgICAgZXJyb3IgPSBFUlJOTzsKKyAgICBpZihkYXRhKQorICAgICAgY2QgPSAmZGF0YS0+aW5ib3VuZF9jZDsKKyAgICBpZigqY2QgPT0gKGljb252X3QpLTEpIHsKKyAgICAgICpjZCA9IGljb252X29wZW4oQ1VSTF9JQ09OVl9DT0RFU0VUX09GX0hPU1QsCisgICAgICAgICAgICAgICAgICAgICAgIENVUkxfSUNPTlZfQ09ERVNFVF9PRl9ORVRXT1JLKTsKKyAgICAgIGlmKCpjZCA9PSAoaWNvbnZfdCktMSkgewogICAgICAgICBmYWlsZihkYXRhLAogICAgICAgICAgICAgICAiVGhlIGljb252X29wZW4oXCIlc1wiLCBcIiVzXCIpIGNhbGwgZmFpbGVkIHdpdGggZXJybm8gJWk6ICVzIiwKICAgICAgICAgICAgICAgQ1VSTF9JQ09OVl9DT0RFU0VUX09GX0hPU1QsCiAgICAgICAgICAgICAgIENVUkxfSUNPTlZfQ09ERVNFVF9PRl9ORVRXT1JLLAotICAgICAgICAgICAgICBlcnJvciwgc3RyZXJyb3IoZXJyb3IpKTsKKyAgICAgICAgICAgICAgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIHJldHVybiBDVVJMRV9DT05WX0ZBSUxFRDsKICAgICAgIH0KICAgICB9CiAgICAgLyogY2FsbCBpY29udiAqLwogICAgIGlucHV0X3B0ciA9IG91dHB1dF9wdHIgPSBidWZmZXI7CiAgICAgaW5fYnl0ZXMgPSBvdXRfYnl0ZXMgPSBsZW5ndGg7Ci0gICAgcmMgPSBpY29udihkYXRhLT5pbmJvdW5kX2NkLCAoY29uc3QgY2hhciAqKikmaW5wdXRfcHRyLCAmaW5fYnl0ZXMsCisgICAgcmMgPSBpY29udigqY2QsICZpbnB1dF9wdHIsICZpbl9ieXRlcywKICAgICAgICAgICAgICAgICZvdXRwdXRfcHRyLCAmb3V0X2J5dGVzKTsKKyAgICBpZighZGF0YSkKKyAgICAgIGljb252X2Nsb3NlKHRtcGNkKTsKICAgICBpZigocmMgPT0gSUNPTlZfRVJST1IpIHx8IChpbl9ieXRlcyAhPSAwKSkgewotICAgICAgZXJyb3IgPSBFUlJOTzsKICAgICAgIGZhaWxmKGRhdGEsCiAgICAgICAgICAgICAiQ3VybF9jb252ZXJ0X2Zyb21fbmV0d29yayBpY29udiBjYWxsIGZhaWxlZCB3aXRoIGVycm5vICVpOiAlcyIsCi0gICAgICAgICAgICBlcnJvciwgc3RyZXJyb3IoZXJyb3IpKTsKKyAgICAgICAgICAgIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgcmV0dXJuIENVUkxFX0NPTlZfRkFJTEVEOwogICAgIH0KICNlbHNlCkBAIC0yMDIsNyArMjA4LDcgQEAKIENVUkxjb2RlIEN1cmxfY29udmVydF9mcm9tX3V0Zjgoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKQogewotICBpZihkYXRhLT5zZXQuY29udmZyb211dGY4KSB7CisgIGlmKGRhdGEgJiYgZGF0YS0+c2V0LmNvbnZmcm9tdXRmOCkgewogICAgIC8qIHVzZSB0cmFuc2xhdGlvbiBjYWxsYmFjayAqLwogICAgIENVUkxjb2RlIHJlc3VsdCA9IGRhdGEtPnNldC5jb252ZnJvbXV0ZjgoYnVmZmVyLCBsZW5ndGgpOwogICAgIGlmKHJlc3VsdCkgewpAQCAtMjE2LDM1ICsyMjIsMzggQEAKICAgZWxzZSB7CiAjaWZkZWYgSEFWRV9JQ09OVgogICAgIC8qIGRvIHRoZSB0cmFuc2xhdGlvbiBvdXJzZWx2ZXMgKi8KLSAgICBjb25zdCBjaGFyICppbnB1dF9wdHI7CisgICAgaWNvbnZfdCB0bXBjZCA9IChpY29udl90KSAtMTsKKyAgICBpY29udl90ICpjZCA9ICZ0bXBjZDsKKyAgICBjaGFyICppbnB1dF9wdHI7CiAgICAgY2hhciAqb3V0cHV0X3B0cjsKICAgICBzaXplX3QgaW5fYnl0ZXMsIG91dF9ieXRlcywgcmM7Ci0gICAgaW50IGVycm9yOwogCiAgICAgLyogb3BlbiBhbiBpY29udiBjb252ZXJzaW9uIGRlc2NyaXB0b3IgaWYgbmVjZXNzYXJ5ICovCi0gICAgaWYoZGF0YS0+dXRmOF9jZCA9PSAoaWNvbnZfdCktMSkgewotICAgICAgZGF0YS0+dXRmOF9jZCA9IGljb252X29wZW4oQ1VSTF9JQ09OVl9DT0RFU0VUX09GX0hPU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMX0lDT05WX0NPREVTRVRfRk9SX1VURjgpOwotICAgICAgaWYoZGF0YS0+dXRmOF9jZCA9PSAoaWNvbnZfdCktMSkgewotICAgICAgICBlcnJvciA9IEVSUk5POworICAgIGlmKGRhdGEpCisgICAgICBjZCA9ICZkYXRhLT51dGY4X2NkOworICAgIGlmKCpjZCA9PSAoaWNvbnZfdCktMSkgeworICAgICAgKmNkID0gaWNvbnZfb3BlbihDVVJMX0lDT05WX0NPREVTRVRfT0ZfSE9TVCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ1VSTF9JQ09OVl9DT0RFU0VUX0ZPUl9VVEY4KTsKKyAgICAgIGlmKCpjZCA9PSAoaWNvbnZfdCktMSkgewogICAgICAgICBmYWlsZihkYXRhLAogICAgICAgICAgICAgICAiVGhlIGljb252X29wZW4oXCIlc1wiLCBcIiVzXCIpIGNhbGwgZmFpbGVkIHdpdGggZXJybm8gJWk6ICVzIiwKICAgICAgICAgICAgICAgQ1VSTF9JQ09OVl9DT0RFU0VUX09GX0hPU1QsCiAgICAgICAgICAgICAgIENVUkxfSUNPTlZfQ09ERVNFVF9GT1JfVVRGOCwKLSAgICAgICAgICAgICAgZXJyb3IsIHN0cmVycm9yKGVycm9yKSk7CisgICAgICAgICAgICAgIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICByZXR1cm4gQ1VSTEVfQ09OVl9GQUlMRUQ7CiAgICAgICB9CiAgICAgfQogICAgIC8qIGNhbGwgaWNvbnYgKi8KICAgICBpbnB1dF9wdHIgPSBvdXRwdXRfcHRyID0gYnVmZmVyOwogICAgIGluX2J5dGVzID0gb3V0X2J5dGVzID0gbGVuZ3RoOwotICAgIHJjID0gaWNvbnYoZGF0YS0+dXRmOF9jZCwgJmlucHV0X3B0ciwgJmluX2J5dGVzLAorICAgIHJjID0gaWNvbnYoKmNkLCAmaW5wdXRfcHRyLCAmaW5fYnl0ZXMsCiAgICAgICAgICAgICAgICAmb3V0cHV0X3B0ciwgJm91dF9ieXRlcyk7CisgICAgaWYoIWRhdGEpCisgICAgICBpY29udl9jbG9zZSh0bXBjZCk7CiAgICAgaWYoKHJjID09IElDT05WX0VSUk9SKSB8fCAoaW5fYnl0ZXMgIT0gMCkpIHsKLSAgICAgIGVycm9yID0gRVJSTk87CiAgICAgICBmYWlsZihkYXRhLAogICAgICAgICAgICAgIlRoZSBDdXJsX2NvbnZlcnRfZnJvbV91dGY4IGljb252IGNhbGwgZmFpbGVkIHdpdGggZXJybm8gJWk6ICVzIiwKLSAgICAgICAgICAgIGVycm9yLCBzdHJlcnJvcihlcnJvcikpOworICAgICAgICAgICAgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICByZXR1cm4gQ1VSTEVfQ09OVl9GQUlMRUQ7CiAgICAgfQogICAgIGlmKG91dHB1dF9wdHIgPCBpbnB1dF9wdHIpIHsKQEAgLTMxMCwyOSArMzE5LDQgQEAKICNlbmRpZiAvKiBIQVZFX0lDT05WICovCiB9CiAKLS8qCi0gKiBDdXJsX2NvbnZlcnRfZm9ybSgpIGlzIHVzZWQgZnJvbSBodHRwLmMsIHRoaXMgY29udmVydHMgYW55IGZvcm0gaXRlbXMgdGhhdAotICAgbmVlZCB0byBiZSBzZW50IGluIHRoZSBuZXR3b3JrIGVuY29kaW5nLiAgUmV0dXJucyBDVVJMRV9PSyBvbiBzdWNjZXNzLgotICovCi1DVVJMY29kZSBDdXJsX2NvbnZlcnRfZm9ybShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLCBzdHJ1Y3QgRm9ybURhdGEgKmZvcm0pCi17Ci0gIENVUkxjb2RlIHJlc3VsdDsKLQotICBpZighZGF0YSkKLSAgICByZXR1cm4gQ1VSTEVfQkFEX0ZVTkNUSU9OX0FSR1VNRU5UOwotCi0gIHdoaWxlKGZvcm0pIHsKLSAgICBpZihmb3JtLT50eXBlID09IEZPUk1fREFUQSkgewotICAgICAgcmVzdWx0ID0gQ3VybF9jb252ZXJ0X3RvX25ldHdvcmsoZGF0YSwgZm9ybS0+bGluZSwgZm9ybS0+bGVuZ3RoKTsKLSAgICAgIC8qIEN1cmxfY29udmVydF90b19uZXR3b3JrIGNhbGxzIGZhaWxmIGlmIHVuc3VjY2Vzc2Z1bCAqLwotICAgICAgaWYocmVzdWx0KQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIGZvcm0gPSBmb3JtLT5uZXh0OwotICB9Ci0KLSAgcmV0dXJuIENVUkxFX09LOwotfQotCiAjZW5kaWYgLyogQ1VSTF9ET0VTX0NPTlZFUlNJT05TICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9ub24tYXNjaWkuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL25vbi1hc2NpaS5oCmluZGV4IGUyN2YxZjQuLjVmYjU3NzEgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL25vbi1hc2NpaS5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL25vbi1hc2NpaS5oCkBAIC03LDcgKzcsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTEsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC00OCw3ICs0OCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpidWZmZXIsIHNpemVfdCBsZW5ndGgpOwogQ1VSTGNvZGUgQ3VybF9jb252ZXJ0X2Zyb21fdXRmOChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKTsKLUNVUkxjb2RlIEN1cmxfY29udmVydF9mb3JtKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsIHN0cnVjdCBGb3JtRGF0YSAqZm9ybSk7CiAjZWxzZQogI2RlZmluZSBDdXJsX2NvbnZlcnRfY2xvbmUoYSxiLGMsZCkgKCh2b2lkKWEsIENVUkxFX09LKQogI2RlZmluZSBDdXJsX2NvbnZlcnRfaW5pdCh4KSBDdXJsX25vcF9zdG10CkBAIC01Nyw3ICs1Niw2IEBACiAjZGVmaW5lIEN1cmxfY29udmVydF90b19uZXR3b3JrKGEsYixjKSAoKHZvaWQpYSwgQ1VSTEVfT0spCiAjZGVmaW5lIEN1cmxfY29udmVydF9mcm9tX25ldHdvcmsoYSxiLGMpICgodm9pZClhLCBDVVJMRV9PSykKICNkZWZpbmUgQ3VybF9jb252ZXJ0X2Zyb21fdXRmOChhLGIsYykgKCh2b2lkKWEsIENVUkxFX09LKQotI2RlZmluZSBDdXJsX2NvbnZlcnRfZm9ybShhLGIpIENVUkxFX09LCiAjZW5kaWYKIAogI2VuZGlmIC8qIEhFQURFUl9DVVJMX05PTl9BU0NJSV9IICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9vcGVubGRhcC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvb3BlbmxkYXAuYwppbmRleCA0YjhjZmI5Li5mMjk0NDAzIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9vcGVubGRhcC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL29wZW5sZGFwLmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAyMDEwLCBIb3dhcmQgQ2h1LCA8aHljQG9wZW5sZGFwLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAxNywgSG93YXJkIENodSwgPGh5Y0BvcGVubGRhcC5vcmc+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMTEgLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCkBAIC04NSw2ICs4NSw3IEBACiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIGxkYXBfZGlzY29ubmVjdCwgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9MREFQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCiAgIENVUkxQUk9UT19MREFQLCAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFncyAqLwpAQCAtMTEwLDYgKzExMSw3IEBACiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIGxkYXBfZGlzY29ubmVjdCwgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9MREFQUywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCiAgIENVUkxQUk9UT19MREFQLCAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9TU0wgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFncyAqLwpAQCAtMTUwLDcgKzE1Miw3IEBACiB7CiAgIGxkYXBjb25uaW5mbyAqbGk7CiAgIExEQVBVUkxEZXNjICpsdWQ7Ci0gIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGE9Y29ubi0+ZGF0YTsKKyAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIGludCByYywgcHJvdG87CiAgIENVUkxjb2RlIHN0YXR1czsKIApAQCAtMTk2LDcgKzE5OCw3IEBACiAgICh2b2lkKWRvbmU7CiAKICAgc3RyY3B5KGhvc3R1cmwsICJsZGFwIik7Ci0gIHB0ciA9IGhvc3R1cmwrNDsKKyAgcHRyID0gaG9zdHVybCArIDQ7CiAgIGlmKGNvbm4tPmhhbmRsZXItPmZsYWdzICYgUFJPVE9QVF9TU0wpCiAgICAgKnB0cisrID0gJ3MnOwogICBzbnByaW50ZihwdHIsIHNpemVvZihob3N0dXJsKS0ocHRyLWhvc3R1cmwpLCAiOi8vJXM6JWQiLApAQCAtMzUyLDcgKzM1NCw3IEBACiAgIGludCByYyA9IDA7CiAgIExEQVBVUkxEZXNjICpsdWRwID0gTlVMTDsKICAgaW50IG1zZ2lkOwotICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhPWNvbm4tPmRhdGE7CisgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogCiAgIGNvbm5rZWVwKGNvbm4sICJPcGVuTERBUCBkbyIpOwogCkBAIC01MTcsNyArNTE5LDcgQEAKICAgICAgIGVsc2UKICAgICAgICAgYmluYXJ5ID0gMDsKIAotICAgICAgZm9yKGk9MDsgYnZhbHNbaV0uYnZfdmFsICE9IE5VTEw7IGkrKykgeworICAgICAgZm9yKGkgPSAwOyBidmFsc1tpXS5idl92YWwgIT0gTlVMTDsgaSsrKSB7CiAgICAgICAgIGludCBiaW52YWwgPSAwOwogICAgICAgICB3cml0ZWVyciA9IEN1cmxfY2xpZW50X3dyaXRlKGNvbm4sIENMSUVOVFdSSVRFX0JPRFksIChjaGFyICopIlx0IiwgMSk7CiAgICAgICAgIGlmKHdyaXRlZXJyKSB7CkBAIC01NDcsNyArNTQ5LDcgQEAKICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIC8qIGNoZWNrIGZvciB1bnByaW50YWJsZSBjaGFyYWN0ZXJzICovCiAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgajsKLSAgICAgICAgICAgIGZvcihqPTA7IGo8YnZhbHNbaV0uYnZfbGVuOyBqKyspCisgICAgICAgICAgICBmb3IoaiA9IDA7IGo8YnZhbHNbaV0uYnZfbGVuOyBqKyspCiAgICAgICAgICAgICAgIGlmKCFJU1BSSU5UKGJ2YWxzW2ldLmJ2X3ZhbFtqXSkpIHsKICAgICAgICAgICAgICAgICBiaW52YWwgPSAxOwogICAgICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvcGFyc2VkYXRlLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9wYXJzZWRhdGUuYwppbmRleCAzYzc4M2JlLi5iODI2MDViIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9wYXJzZWRhdGUuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9wYXJzZWRhdGUuYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtMTY3LDIwICsxNjcsMjAgQEAKICAgICAgUkZDIDExMjMpIGhhZCB0aGVpciBzaWducyB3cm9uZy4gSGVyZSB3ZSB1c2UgdGhlIGNvcnJlY3Qgc2lnbnMgdG8gbWF0Y2gKICAgICAgYWN0dWFsIG1pbGl0YXJ5IHVzYWdlLgogICAgKi8KLSAgeyJBIiwgICsxICogNjB9LCAgICAgICAgIC8qIEFscGhhICovCi0gIHsiQiIsICArMiAqIDYwfSwgICAgICAgICAvKiBCcmF2byAqLwotICB7IkMiLCAgKzMgKiA2MH0sICAgICAgICAgLyogQ2hhcmxpZSAqLwotICB7IkQiLCAgKzQgKiA2MH0sICAgICAgICAgLyogRGVsdGEgKi8KLSAgeyJFIiwgICs1ICogNjB9LCAgICAgICAgIC8qIEVjaG8gKi8KLSAgeyJGIiwgICs2ICogNjB9LCAgICAgICAgIC8qIEZveHRyb3QgKi8KLSAgeyJHIiwgICs3ICogNjB9LCAgICAgICAgIC8qIEdvbGYgKi8KLSAgeyJIIiwgICs4ICogNjB9LCAgICAgICAgIC8qIEhvdGVsICovCi0gIHsiSSIsICArOSAqIDYwfSwgICAgICAgICAvKiBJbmRpYSAqLworICB7IkEiLCAgMSAqIDYwfSwgICAgICAgICAvKiBBbHBoYSAqLworICB7IkIiLCAgMiAqIDYwfSwgICAgICAgICAvKiBCcmF2byAqLworICB7IkMiLCAgMyAqIDYwfSwgICAgICAgICAvKiBDaGFybGllICovCisgIHsiRCIsICA0ICogNjB9LCAgICAgICAgIC8qIERlbHRhICovCisgIHsiRSIsICA1ICogNjB9LCAgICAgICAgIC8qIEVjaG8gKi8KKyAgeyJGIiwgIDYgKiA2MH0sICAgICAgICAgLyogRm94dHJvdCAqLworICB7IkciLCAgNyAqIDYwfSwgICAgICAgICAvKiBHb2xmICovCisgIHsiSCIsICA4ICogNjB9LCAgICAgICAgIC8qIEhvdGVsICovCisgIHsiSSIsICA5ICogNjB9LCAgICAgICAgIC8qIEluZGlhICovCiAgIC8qICJKIiwgSnVsaWV0IGlzIG5vdCB1c2VkIGFzIGEgdGltZXpvbmUsIHRvIGluZGljYXRlIHRoZSBvYnNlcnZlcidzIGxvY2FsCiAgICAgIHRpbWUgKi8KLSAgeyJLIiwgKzEwICogNjB9LCAgICAgICAgIC8qIEtpbG8gKi8KLSAgeyJMIiwgKzExICogNjB9LCAgICAgICAgIC8qIExpbWEgKi8KLSAgeyJNIiwgKzEyICogNjB9LCAgICAgICAgIC8qIE1pa2UgKi8KKyAgeyJLIiwgMTAgKiA2MH0sICAgICAgICAgLyogS2lsbyAqLworICB7IkwiLCAxMSAqIDYwfSwgICAgICAgICAvKiBMaW1hICovCisgIHsiTSIsIDEyICogNjB9LCAgICAgICAgIC8qIE1pa2UgKi8KICAgeyJOIiwgIC0xICogNjB9LCAgICAgICAgIC8qIE5vdmVtYmVyICovCiAgIHsiTyIsICAtMiAqIDYwfSwgICAgICAgICAvKiBPc2NhciAqLwogICB7IlAiLCAgLTMgKiA2MH0sICAgICAgICAgLyogUGFwYSAqLwpAQCAtMjA1LDE0ICsyMDUsMTQgQEAKIHsKICAgaW50IGk7CiAgIGNvbnN0IGNoYXIgKiBjb25zdCAqd2hhdDsKLSAgYm9vbCBmb3VuZD0gRkFMU0U7CisgIGJvb2wgZm91bmQgPSBGQUxTRTsKICAgaWYobGVuID4gMykKICAgICB3aGF0ID0gJndlZWtkYXlbMF07CiAgIGVsc2UKICAgICB3aGF0ID0gJkN1cmxfd2tkYXlbMF07Ci0gIGZvcihpPTA7IGk8NzsgaSsrKSB7CisgIGZvcihpID0gMDsgaTw3OyBpKyspIHsKICAgICBpZihzdHJjYXNlY29tcGFyZShjaGVjaywgd2hhdFswXSkpIHsKLSAgICAgIGZvdW5kPVRSVUU7CisgICAgICBmb3VuZCA9IFRSVUU7CiAgICAgICBicmVhazsKICAgICB9CiAgICAgd2hhdCsrOwpAQCAtMjI0LDEyICsyMjQsMTIgQEAKIHsKICAgaW50IGk7CiAgIGNvbnN0IGNoYXIgKiBjb25zdCAqd2hhdDsKLSAgYm9vbCBmb3VuZD0gRkFMU0U7CisgIGJvb2wgZm91bmQgPSBGQUxTRTsKIAogICB3aGF0ID0gJkN1cmxfbW9udGhbMF07Ci0gIGZvcihpPTA7IGk8MTI7IGkrKykgeworICBmb3IoaSA9IDA7IGk8MTI7IGkrKykgewogICAgIGlmKHN0cmNhc2Vjb21wYXJlKGNoZWNrLCB3aGF0WzBdKSkgewotICAgICAgZm91bmQ9VFJVRTsKKyAgICAgIGZvdW5kID0gVFJVRTsKICAgICAgIGJyZWFrOwogICAgIH0KICAgICB3aGF0Kys7CkBAIC0yNDQsMTIgKzI0NCwxMiBAQAogewogICB1bnNpZ25lZCBpbnQgaTsKICAgY29uc3Qgc3RydWN0IHR6aW5mbyAqd2hhdDsKLSAgYm9vbCBmb3VuZD0gRkFMU0U7CisgIGJvb2wgZm91bmQgPSBGQUxTRTsKIAogICB3aGF0ID0gdHo7Ci0gIGZvcihpPTA7IGk8IHNpemVvZih0eikvc2l6ZW9mKHR6WzBdKTsgaSsrKSB7CisgIGZvcihpID0gMDsgaTwgc2l6ZW9mKHR6KS9zaXplb2YodHpbMF0pOyBpKyspIHsKICAgICBpZihzdHJjYXNlY29tcGFyZShjaGVjaywgd2hhdC0+bmFtZSkpIHsKLSAgICAgIGZvdW5kPVRSVUU7CisgICAgICBmb3VuZCA9IFRSVUU7CiAgICAgICBicmVhazsKICAgICB9CiAgICAgd2hhdCsrOwpAQCAtMzMxLDIxICszMzEsMjEgQEAKIHN0YXRpYyBpbnQgcGFyc2VkYXRlKGNvbnN0IGNoYXIgKmRhdGUsIHRpbWVfdCAqb3V0cHV0KQogewogICB0aW1lX3QgdCA9IDA7Ci0gIGludCB3ZGF5bnVtPS0xOyAgLyogZGF5IG9mIHRoZSB3ZWVrIG51bWJlciwgMC02IChtb24tc3VuKSAqLwotICBpbnQgbW9ubnVtPS0xOyAgIC8qIG1vbnRoIG9mIHRoZSB5ZWFyIG51bWJlciwgMC0xMSAqLwotICBpbnQgbWRheW51bT0tMTsgLyogZGF5IG9mIG1vbnRoLCAxIC0gMzEgKi8KLSAgaW50IGhvdXJudW09LTE7Ci0gIGludCBtaW5udW09LTE7Ci0gIGludCBzZWNudW09LTE7Ci0gIGludCB5ZWFybnVtPS0xOwotICBpbnQgdHpvZmY9LTE7CisgIGludCB3ZGF5bnVtID0gLTE7ICAvKiBkYXkgb2YgdGhlIHdlZWsgbnVtYmVyLCAwLTYgKG1vbi1zdW4pICovCisgIGludCBtb25udW0gPSAtMTsgICAvKiBtb250aCBvZiB0aGUgeWVhciBudW1iZXIsIDAtMTEgKi8KKyAgaW50IG1kYXludW0gPSAtMTsgLyogZGF5IG9mIG1vbnRoLCAxIC0gMzEgKi8KKyAgaW50IGhvdXJudW0gPSAtMTsKKyAgaW50IG1pbm51bSA9IC0xOworICBpbnQgc2VjbnVtID0gLTE7CisgIGludCB5ZWFybnVtID0gLTE7CisgIGludCB0em9mZiA9IC0xOwogICBzdHJ1Y3QgbXlfdG0gdG07CiAgIGVudW0gYXNzdW1lIGRpZ25leHQgPSBEQVRFX01EQVk7CiAgIGNvbnN0IGNoYXIgKmluZGF0ZSA9IGRhdGU7IC8qIHNhdmUgdGhlIG9yaWdpbmFsIHBvaW50ZXIgKi8KICAgaW50IHBhcnQgPSAwOyAvKiBtYXggNiBwYXJ0cyAqLwogCiAgIHdoaWxlKCpkYXRlICYmIChwYXJ0IDwgNikpIHsKLSAgICBib29sIGZvdW5kPUZBTFNFOworICAgIGJvb2wgZm91bmQgPSBGQUxTRTsKIAogICAgIHNraXAoJmRhdGUpOwogCkBAIC0zODYsNyArMzg2LDcgQEAKICAgICAgIC8qIGEgZGlnaXQgKi8KICAgICAgIGludCB2YWw7CiAgICAgICBjaGFyICplbmQ7Ci0gICAgICBpbnQgbGVuPTA7CisgICAgICBpbnQgbGVuID0gMDsKICAgICAgIGlmKChzZWNudW0gPT0gLTEpICYmCiAgICAgICAgICAoMyA9PSBzc2NhbmYoZGF0ZSwgIiUwMmQ6JTAyZDolMDJkJW4iLAogICAgICAgICAgICAgICAgICAgICAgICZob3VybnVtLCAmbWlubnVtLCAmc2VjbnVtLCAmbGVuKSkpIHsKQEAgLTQwNCwxMiArNDA0LDEyIEBACiAgICAgICAgIGludCBlcnJvcjsKICAgICAgICAgaW50IG9sZF9lcnJubzsKIAotICAgICAgICBvbGRfZXJybm8gPSBFUlJOTzsKLSAgICAgICAgU0VUX0VSUk5PKDApOworICAgICAgICBvbGRfZXJybm8gPSBlcnJubzsKKyAgICAgICAgZXJybm8gPSAwOwogICAgICAgICBsdmFsID0gc3RydG9sKGRhdGUsICZlbmQsIDEwKTsKLSAgICAgICAgZXJyb3IgPSBFUlJOTzsKLSAgICAgICAgaWYoZXJyb3IgIT0gb2xkX2Vycm5vKQotICAgICAgICAgIFNFVF9FUlJOTyhvbGRfZXJybm8pOworICAgICAgICBlcnJvciA9IGVycm5vOworICAgICAgICBpZihlcnJubyAhPSBvbGRfZXJybm8pCisgICAgICAgICAgZXJybm8gPSBvbGRfZXJybm87CiAKICAgICAgICAgaWYoZXJyb3IpCiAgICAgICAgICAgcmV0dXJuIFBBUlNFREFURV9GQUlMOwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvcGluZ3BvbmcuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Bpbmdwb25nLmMKaW5kZXggNWVkNzliNy4uYjhmMjE0MCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvcGluZ3BvbmcuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9waW5ncG9uZy5jCkBAIC00NywxMCArNDcsMTAgQEAKIHRpbWVfdCBDdXJsX3BwX3N0YXRlX3RpbWVvdXQoc3RydWN0IHBpbmdwb25nICpwcCkKIHsKICAgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uID0gcHAtPmNvbm47Ci0gIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGE9Y29ubi0+ZGF0YTsKKyAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIHRpbWVfdCB0aW1lb3V0X21zOyAvKiBpbiBtaWxsaXNlY29uZHMgKi8KICAgdGltZV90IHRpbWVvdXQyX21zOyAvKiBpbiBtaWxsaXNlY29uZHMgKi8KLSAgbG9uZyByZXNwb25zZV90aW1lPSAoZGF0YS0+c2V0LnNlcnZlcl9yZXNwb25zZV90aW1lb3V0KT8KKyAgbG9uZyByZXNwb25zZV90aW1lID0gKGRhdGEtPnNldC5zZXJ2ZXJfcmVzcG9uc2VfdGltZW91dCk/CiAgICAgZGF0YS0+c2V0LnNlcnZlcl9yZXNwb25zZV90aW1lb3V0OiBwcC0+cmVzcG9uc2VfdGltZTsKIAogICAvKiBpZiBDVVJMT1BUX1NFUlZFUl9SRVNQT05TRV9USU1FT1VUIGlzIHNldCwgdXNlIHRoYXQgdG8gZGV0ZXJtaW5lCkBAIC04NSwxMCArODUsMTAgQEAKICAgaW50IHJjOwogICB0aW1lX3QgaW50ZXJ2YWxfbXM7CiAgIHRpbWVfdCB0aW1lb3V0X21zID0gQ3VybF9wcF9zdGF0ZV90aW1lb3V0KHBwKTsKLSAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YT1jb25uLT5kYXRhOworICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKICAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7CiAKLSAgaWYodGltZW91dF9tcyA8PTApIHsKKyAgaWYodGltZW91dF9tcyA8PSAwKSB7CiAgICAgZmFpbGYoZGF0YSwgInNlcnZlciByZXNwb25zZSB0aW1lb3V0Iik7CiAgICAgcmV0dXJuIENVUkxFX09QRVJBVElPTl9USU1FRE9VVDsgLyogYWxyZWFkeSB0b28gbGl0dGxlIHRpbWUgKi8KICAgfQpAQCAtMjcwLDcgKzI3MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqc2l6ZSkgLyogc2l6ZSBvZiB0aGUgcmVzcG9uc2UgKi8KIHsKICAgc3NpemVfdCBwZXJsaW5lOyAvKiBjb3VudCBieXRlcyBwZXIgbGluZSAqLwotICBib29sIGtlZXBvbj1UUlVFOworICBib29sIGtlZXBvbiA9IFRSVUU7CiAgIHNzaXplX3QgZ290Ynl0ZXM7CiAgIGNoYXIgKnB0cjsKICAgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uID0gcHAtPmNvbm47CkBAIC0yODEsNyArMjgxLDcgQEAKICAgKmNvZGUgPSAwOyAvKiAwIGZvciBlcnJvcnMgb3Igbm90IGRvbmUgKi8KICAgKnNpemUgPSAwOwogCi0gIHB0cj1idWYgKyBwcC0+bnJlYWRfcmVzcDsKKyAgcHRyID0gYnVmICsgcHAtPm5yZWFkX3Jlc3A7CiAKICAgLyogbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBjdXJyZW50IGxpbmUsIHNvIGZhciAqLwogICBwZXJsaW5lID0gKHNzaXplX3QpKHB0ci1wcC0+bGluZXN0YXJ0X3Jlc3ApOwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAgICAgICAgKiBpdCB3b3VsZCBoYXZlIGJlZW4gcG9wdWxhdGVkIHdpdGggc29tZXRoaW5nIG9mIHNpemUgaW50IHRvIGJlZ2luCiAgICAgICAgKiB3aXRoLCBldmVuIHRob3VnaCBpdHMgZGF0YXR5cGUgbWF5IGJlIGxhcmdlciB0aGFuIGFuIGludC4KICAgICAgICAqLwotICAgICAgREVCVUdBU1NFUlQoKHB0citwcC0+Y2FjaGVfc2l6ZSkgPD0gKGJ1ZitkYXRhLT5zZXQuYnVmZmVyX3NpemUrMSkpOworICAgICAgREVCVUdBU1NFUlQoKHB0ciArIHBwLT5jYWNoZV9zaXplKSA8PSAoYnVmICsgZGF0YS0+c2V0LmJ1ZmZlcl9zaXplICsgMSkpOwogICAgICAgbWVtY3B5KHB0ciwgcHAtPmNhY2hlLCBwcC0+Y2FjaGVfc2l6ZSk7CiAgICAgICBnb3RieXRlcyA9IChzc2l6ZV90KXBwLT5jYWNoZV9zaXplOwogICAgICAgZnJlZShwcC0+Y2FjaGUpOyAgICAvKiBmcmVlIHRoZSBjYWNoZSAqLwpAQCAtMzUxLDcgKzM1MSw3IEBACiAgICAgICBwcC0+bnJlYWRfcmVzcCArPSBnb3RieXRlczsKICAgICAgIGZvcihpID0gMDsgaSA8IGdvdGJ5dGVzOyBwdHIrKywgaSsrKSB7CiAgICAgICAgIHBlcmxpbmUrKzsKLSAgICAgICAgaWYoKnB0cj09J1xuJykgeworICAgICAgICBpZigqcHRyID09ICdcbicpIHsKICAgICAgICAgICAvKiBhIG5ld2xpbmUgaXMgQ1JMRiBpbiBwcC10YWxrLCBzbyB0aGUgQ1IgaXMgaWdub3JlZCBhcwogICAgICAgICAgICAgIHRoZSBsaW5lIGlzbid0IHJlYWxseSB0ZXJtaW5hdGVkIHVudGlsIHRoZSBMRiBjb21lcyAqLwogCkBAIC0zNzgsMTcgKzM3OCwxNyBAQAogICAgICAgICAgICAgICAgc3RhcnQgb2YgdGhlIGJ1ZmZlciBhbmQgemVybyB0ZXJtaW5hdGUsIGZvciBvbGQgdGltZXMgc2FrZSAqLwogICAgICAgICAgICAgc2l6ZV90IG4gPSBwdHIgLSBwcC0+bGluZXN0YXJ0X3Jlc3A7CiAgICAgICAgICAgICBtZW1tb3ZlKGJ1ZiwgcHAtPmxpbmVzdGFydF9yZXNwLCBuKTsKLSAgICAgICAgICAgIGJ1ZltuXT0wOyAvKiB6ZXJvIHRlcm1pbmF0ZSAqLwotICAgICAgICAgICAga2VlcG9uPUZBTFNFOwotICAgICAgICAgICAgcHAtPmxpbmVzdGFydF9yZXNwID0gcHRyKzE7IC8qIGFkdmFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgYnVmW25dID0gMDsgLyogemVybyB0ZXJtaW5hdGUgKi8KKyAgICAgICAgICAgIGtlZXBvbiA9IEZBTFNFOworICAgICAgICAgICAgcHAtPmxpbmVzdGFydF9yZXNwID0gcHRyICsgMTsgLyogYWR2YW5jZSBwb2ludGVyICovCiAgICAgICAgICAgICBpKys7IC8qIHNraXAgdGhpcyBiZWZvcmUgZ2V0dGluZyBvdXQgKi8KIAogICAgICAgICAgICAgKnNpemUgPSBwcC0+bnJlYWRfcmVzcDsgLyogc2l6ZSBvZiB0aGUgcmVzcG9uc2UgKi8KICAgICAgICAgICAgIHBwLT5ucmVhZF9yZXNwID0gMDsgLyogcmVzdGFydCAqLwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQotICAgICAgICAgIHBlcmxpbmU9MDsgLyogbGluZSBzdGFydHMgb3ZlciBoZXJlICovCi0gICAgICAgICAgcHAtPmxpbmVzdGFydF9yZXNwID0gcHRyKzE7CisgICAgICAgICAgcGVybGluZSA9IDA7IC8qIGxpbmUgc3RhcnRzIG92ZXIgaGVyZSAqLworICAgICAgICAgIHBwLT5saW5lc3RhcnRfcmVzcCA9IHB0ciArIDE7CiAgICAgICAgIH0KICAgICAgIH0KIApAQCAtNDkwLDcgKzQ5MCw3IEBACiAgIH0KICAgZWxzZSB7CiAgICAgZnJlZShwcC0+c2VuZHRoaXMpOwotICAgIHBwLT5zZW5kdGhpcz1OVUxMOworICAgIHBwLT5zZW5kdGhpcyA9IE5VTEw7CiAgICAgcHAtPnNlbmRsZWZ0ID0gcHAtPnNlbmRzaXplID0gMDsKICAgICBwcC0+cmVzcG9uc2UgPSBDdXJsX3R2bm93KCk7CiAgIH0KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Bpbmdwb25nLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9waW5ncG9uZy5oCmluZGV4IGVlMWE1OWIuLmEyYzhmZjUgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Bpbmdwb25nLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvcGluZ3BvbmcuaApAQCAtNTgsNyArNTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgc2VydmVyICovCiAgIHNpemVfdCBzZW5kbGVmdDsgLyogbnVtYmVyIG9mIGJ5dGVzIGxlZnQgdG8gc2VuZCBmcm9tIHRoZSBzZW5kdGhpcyBidWZmZXIgKi8KICAgc2l6ZV90IHNlbmRzaXplOyAvKiB0b3RhbCBzaXplIG9mIHRoZSBzZW5kdGhpcyBidWZmZXIgKi8KLSAgc3RydWN0IHRpbWV2YWwgcmVzcG9uc2U7IC8qIHNldCB0byBDdXJsX3R2bm93KCkgd2hlbiBhIGNvbW1hbmQgaGFzIGJlZW4gc2VudAorICBzdHJ1Y3QgY3VybHRpbWUgcmVzcG9uc2U7IC8qIHNldCB0byBDdXJsX3R2bm93KCkgd2hlbiBhIGNvbW1hbmQgaGFzIGJlZW4gc2VudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmLCB1c2VkIHRvIHRpbWUtb3V0IHJlc3BvbnNlIHJlYWRpbmcgKi8KICAgbG9uZyByZXNwb25zZV90aW1lOyAvKiBXaGVuIG5vIHRpbWVvdXQgaXMgZ2l2ZW4sIHRoaXMgaXMgdGhlIGFtb3VudCBvZgogICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcyB3ZSBhd2FpdCBmb3IgYSBzZXJ2ZXIgcmVzcG9uc2UuICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9waXBlbGluZS5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvcGlwZWxpbmUuYwppbmRleCBiOGQyMDM3Li40ZDQxYjA0IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9waXBlbGluZS5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3BpcGVsaW5lLmMKQEAgLTIzMCwyOCArMjMwLDI3IEBACiAgIHJldHVybiBDVVJMTV9PSzsKIH0KIAorc3RydWN0IGJsYWNrbGlzdF9ub2RlIHsKKyAgc3RydWN0IGN1cmxfbGxpc3RfZWxlbWVudCBsaXN0OworICBjaGFyIHNlcnZlcl9uYW1lWzFdOworfTsKKwogYm9vbCBDdXJsX3BpcGVsaW5lX3NlcnZlcl9ibGFja2xpc3RlZChzdHJ1Y3QgQ3VybF9lYXN5ICpoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnNlcnZlcl9uYW1lKQogewogICBpZihoYW5kbGUtPm11bHRpICYmIHNlcnZlcl9uYW1lKSB7Ci0gICAgc3RydWN0IGN1cmxfbGxpc3QgKmJsYWNrbGlzdCA9CisgICAgc3RydWN0IGN1cmxfbGxpc3QgKmxpc3QgPQogICAgICAgQ3VybF9tdWx0aV9waXBlbGluaW5nX3NlcnZlcl9ibChoYW5kbGUtPm11bHRpKTsKIAotICAgIGlmKGJsYWNrbGlzdCkgewotICAgICAgc3RydWN0IGN1cmxfbGxpc3RfZWxlbWVudCAqY3VycjsKLQotICAgICAgY3VyciA9IGJsYWNrbGlzdC0+aGVhZDsKLSAgICAgIHdoaWxlKGN1cnIpIHsKLSAgICAgICAgY2hhciAqYmxfc2VydmVyX25hbWU7Ci0KLSAgICAgICAgYmxfc2VydmVyX25hbWUgPSBjdXJyLT5wdHI7Ci0gICAgICAgIGlmKHN0cm5jYXNlY29tcGFyZShibF9zZXJ2ZXJfbmFtZSwgc2VydmVyX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oYmxfc2VydmVyX25hbWUpKSkgewotICAgICAgICAgIGluZm9mKGhhbmRsZSwgIlNlcnZlciAlcyBpcyBibGFja2xpc3RlZFxuIiwgc2VydmVyX25hbWUpOwotICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGN1cnIgPSBjdXJyLT5uZXh0OworICAgIHN0cnVjdCBjdXJsX2xsaXN0X2VsZW1lbnQgKmUgPSBsaXN0LT5oZWFkOworICAgIHdoaWxlKGUpIHsKKyAgICAgIHN0cnVjdCBibGFja2xpc3Rfbm9kZSAqYmwgPSAoc3RydWN0IGJsYWNrbGlzdF9ub2RlICopZTsKKyAgICAgIGlmKHN0cm5jYXNlY29tcGFyZShibC0+c2VydmVyX25hbWUsIHNlcnZlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihibC0+c2VydmVyX25hbWUpKSkgeworICAgICAgICBpbmZvZihoYW5kbGUsICJTZXJ2ZXIgJXMgaXMgYmxhY2tsaXN0ZWRcbiIsIHNlcnZlcl9uYW1lKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICB9CisgICAgICBlID0gZS0+bmV4dDsKICAgICB9CiAKICAgICBERUJVR0YoaW5mb2YoaGFuZGxlLCAiU2VydmVyICVzIGlzIG5vdCBibGFja2xpc3RlZFxuIiwgc2VydmVyX25hbWUpKTsKQEAgLTI1OSwxMSArMjU4LDYgQEAKICAgcmV0dXJuIEZBTFNFOwogfQogCi1zdHJ1Y3QgYmxhY2tsaXN0X25vZGUgewotICBzdHJ1Y3QgY3VybF9sbGlzdF9lbGVtZW50IGxpc3Q7Ci0gIGNoYXIgc2VydmVyX25hbWVbMV07Ci19OwotCiBDVVJMTWNvZGUgQ3VybF9waXBlbGluZV9zZXRfc2VydmVyX2JsYWNrbGlzdChjaGFyICoqc2VydmVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjdXJsX2xsaXN0ICpsaXN0KQogewpAQCAtMjg2LDggKzI4MCw3IEBACiAgICAgICB9CiAgICAgICBzdHJjcHkobi0+c2VydmVyX25hbWUsICpzZXJ2ZXJzKTsKIAotICAgICAgQ3VybF9sbGlzdF9pbnNlcnRfbmV4dChsaXN0LCBsaXN0LT50YWlsLCBuLT5zZXJ2ZXJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm4tPmxpc3QpOworICAgICAgQ3VybF9sbGlzdF9pbnNlcnRfbmV4dChsaXN0LCBsaXN0LT50YWlsLCBuLCAmbi0+bGlzdCk7CiAgICAgICBzZXJ2ZXJzKys7CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9wb3AzLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9wb3AzLmMKaW5kZXggM2ZlYjNiZS4uNTc5MmE0YSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvcG9wMy5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3BvcDMuYwpAQCAtMTI1LDYgKzEyNSw3IEBACiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KICAgcG9wM19kaXNjb25uZWN0LCAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbl9jaGVjayAqLwogICBQT1JUX1BPUDMsICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fUE9QMywgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9DTE9TRUFDVElPTiB8IFBST1RPUFRfTk9VUkxRVUVSWSB8IC8qIGZsYWdzICovCkBAIC0xNTEsNiArMTUyLDcgQEAKICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICBwb3AzX2Rpc2Nvbm5lY3QsICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCisgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIFBPUlRfUE9QM1MsICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCiAgIENVUkxQUk9UT19QT1AzUywgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwogICBQUk9UT1BUX0NMT1NFQUNUSU9OIHwgUFJPVE9QVF9TU0wKQEAgLTE1OCw1OCArMTYwLDYgQEAKIH07CiAjZW5kaWYKIAotI2lmbmRlZiBDVVJMX0RJU0FCTEVfSFRUUAotLyoKLSAqIEhUVFAtcHJveHllZCBQT1AzIHByb3RvY29sIGhhbmRsZXIuCi0gKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBDdXJsX2hhbmRsZXIgQ3VybF9oYW5kbGVyX3BvcDNfcHJveHkgPSB7Ci0gICJQT1AzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NoZW1lICovCi0gIEN1cmxfaHR0cF9zZXR1cF9jb25uLCAgICAgICAgICAgICAgICAgLyogc2V0dXBfY29ubmVjdGlvbiAqLwotICBDdXJsX2h0dHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvX2l0ICovCi0gIEN1cmxfaHR0cF9kb25lLCAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvX21vcmUgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0X2l0ICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGluZyAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvaW5nICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9fZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvaW5nX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb21vcmVfZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KLSAgUE9SVF9QT1AzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCi0gIENVUkxQUk9UT19IVFRQLCAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KLSAgUFJPVE9QVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFncyAqLwotfTsKLQotI2lmZGVmIFVTRV9TU0wKLS8qCi0gKiBIVFRQLXByb3h5ZWQgUE9QM1MgcHJvdG9jb2wgaGFuZGxlci4KLSAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IEN1cmxfaGFuZGxlciBDdXJsX2hhbmRsZXJfcG9wM3NfcHJveHkgPSB7Ci0gICJQT1AzUyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NoZW1lICovCi0gIEN1cmxfaHR0cF9zZXR1cF9jb25uLCAgICAgICAgICAgICAgICAgLyogc2V0dXBfY29ubmVjdGlvbiAqLwotICBDdXJsX2h0dHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvX2l0ICovCi0gIEN1cmxfaHR0cF9kb25lLCAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uZSAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvX21vcmUgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0X2l0ICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGluZyAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvaW5nICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9fZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvaW5nX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb21vcmVfZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KLSAgUE9SVF9QT1AzUywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCi0gIENVUkxQUk9UT19IVFRQLCAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KLSAgUFJPVE9QVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFncyAqLwotfTsKLSNlbmRpZgotI2VuZGlmCi0KIC8qIFNBU0wgcGFyYW1ldGVycyBmb3IgdGhlIHBvcDMgcHJvdG9jb2wgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgU0FTTHByb3RvIHNhc2xwb3AzID0gewogICAicG9wIiwgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIHNlcnZpY2UgbmFtZSAqLwpAQCAtMTM1NSwzMSArMTMwNSw2IEBACiAKICAgLyogQ2xlYXIgdGhlIFRMUyB1cGdyYWRlZCBmbGFnICovCiAgIGNvbm4tPnRsc191cGdyYWRlZCA9IEZBTFNFOwotCi0gIC8qIFNldCB1cCB0aGUgcHJveHkgaWYgbmVjZXNzYXJ5ICovCi0gIGlmKGNvbm4tPmJpdHMuaHR0cHByb3h5ICYmICFkYXRhLT5zZXQudHVubmVsX3RocnVfaHR0cHByb3h5KSB7Ci0gICAgLyogVW5sZXNzIHdlIGhhdmUgYXNrZWQgdG8gdHVubmVsIFBPUDMgb3BlcmF0aW9ucyB0aHJvdWdoIHRoZSBwcm94eSwgd2UKLSAgICAgICBzd2l0Y2ggYW5kIHVzZSBIVFRQIG9wZXJhdGlvbnMgb25seSAqLwotI2lmbmRlZiBDVVJMX0RJU0FCTEVfSFRUUAotICAgIGlmKGNvbm4tPmhhbmRsZXIgPT0gJkN1cmxfaGFuZGxlcl9wb3AzKQotICAgICAgY29ubi0+aGFuZGxlciA9ICZDdXJsX2hhbmRsZXJfcG9wM19wcm94eTsKLSAgICBlbHNlIHsKLSNpZmRlZiBVU0VfU1NMCi0gICAgICBjb25uLT5oYW5kbGVyID0gJkN1cmxfaGFuZGxlcl9wb3Azc19wcm94eTsKLSNlbHNlCi0gICAgICBmYWlsZihkYXRhLCAiUE9QM1Mgbm90IHN1cHBvcnRlZCEiKTsKLSAgICAgIHJldHVybiBDVVJMRV9VTlNVUFBPUlRFRF9QUk9UT0NPTDsKLSNlbmRpZgotICAgIH0KLQotICAgIC8qIHNldCBpdCB1cCBhcyBhbiBIVFRQIGNvbm5lY3Rpb24gaW5zdGVhZCAqLwotICAgIHJldHVybiBjb25uLT5oYW5kbGVyLT5zZXR1cF9jb25uZWN0aW9uKGNvbm4pOwotI2Vsc2UKLSAgICBmYWlsZihkYXRhLCAiUE9QMyBvdmVyIGh0dHAgcHJveHkgcmVxdWlyZXMgSFRUUCBzdXBwb3J0IGJ1aWx0LWluISIpOwotICAgIHJldHVybiBDVVJMRV9VTlNVUFBPUlRFRF9QUk9UT0NPTDsKLSNlbmRpZgotICB9Ci0KICAgZGF0YS0+c3RhdGUucGF0aCsrOyAgIC8qIGRvbid0IGluY2x1ZGUgdGhlIGluaXRpYWwgc2xhc2ggKi8KIAogICByZXR1cm4gQ1VSTEVfT0s7CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9wcm9ncmVzcy5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvcHJvZ3Jlc3MuYwppbmRleCBjZmFmNDA0Li4wMDYwOWQ5IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9wcm9ncmVzcy5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Byb2dyZXNzLmMKQEAgLTEzNCw3ICsxMzQsNyBAQAogewogICBpbnQgcmM7CiAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwotICBkYXRhLT5wcm9ncmVzcy5sYXN0c2hvdz0wOworICBkYXRhLT5wcm9ncmVzcy5sYXN0c2hvdyA9IDA7CiAgIHJjID0gQ3VybF9wZ3JzVXBkYXRlKGNvbm4pOyAvKiB0aGUgZmluYWwgKGZvcmNlZCkgdXBkYXRlICovCiAgIGlmKHJjKQogICAgIHJldHVybiByYzsKQEAgLTE0OSwyMSArMTQ5LDIwIEBACiAgIHJldHVybiAwOwogfQogCi0vKiByZXNldCBhbGwgdGltZXMgZXhjZXB0IHJlZGlyZWN0LCBhbmQgcmVzZXQgdGhlIGtub3duIHRyYW5zZmVyIHNpemVzICovCi12b2lkIEN1cmxfcGdyc1Jlc2V0VGltZXNTaXplcyhzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKQorLyogcmVzZXQgdGhlIGtub3duIHRyYW5zZmVyIHNpemVzICovCit2b2lkIEN1cmxfcGdyc1Jlc2V0VHJhbnNmZXJTaXplcyhzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKQogewotICBkYXRhLT5wcm9ncmVzcy50X25zbG9va3VwID0gMC4wOwotICBkYXRhLT5wcm9ncmVzcy50X2Nvbm5lY3QgPSAwLjA7Ci0gIGRhdGEtPnByb2dyZXNzLnRfcHJldHJhbnNmZXIgPSAwLjA7Ci0gIGRhdGEtPnByb2dyZXNzLnRfc3RhcnR0cmFuc2ZlciA9IDAuMDsKLQogICBDdXJsX3BncnNTZXREb3dubG9hZFNpemUoZGF0YSwgLTEpOwogICBDdXJsX3BncnNTZXRVcGxvYWRTaXplKGRhdGEsIC0xKTsKIH0KIAorLyoKKyAqIEB1bml0dGVzdDogMTM5OQorICovCiB2b2lkIEN1cmxfcGdyc1RpbWUoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwgdGltZXJpZCB0aW1lcikKIHsKLSAgc3RydWN0IHRpbWV2YWwgbm93ID0gQ3VybF90dm5vdygpOworICBzdHJ1Y3QgY3VybHRpbWUgbm93ID0gQ3VybF90dm5vdygpOworICB0aW1lX3QgKmRlbHRhID0gTlVMTDsKIAogICBzd2l0Y2godGltZXIpIHsKICAgZGVmYXVsdDoKQEAgLTE3Nyw0NSArMTc2LDU4IEBACiAgIGNhc2UgVElNRVJfU1RBUlRTSU5HTEU6CiAgICAgLyogVGhpcyBpcyBzZXQgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggc2luZ2xlIGZldGNoICovCiAgICAgZGF0YS0+cHJvZ3Jlc3MudF9zdGFydHNpbmdsZSA9IG5vdzsKKyAgICBkYXRhLT5wcm9ncmVzcy5pc190X3N0YXJ0cmFuc2Zlcl9zZXQgPSBmYWxzZTsKICAgICBicmVhazsKLQogICBjYXNlIFRJTUVSX1NUQVJUQUNDRVBUOgotICAgIGRhdGEtPnByb2dyZXNzLnRfYWNjZXB0ZGF0YSA9IEN1cmxfdHZub3coKTsKKyAgICBkYXRhLT5wcm9ncmVzcy50X2FjY2VwdGRhdGEgPSBub3c7CiAgICAgYnJlYWs7Ci0KICAgY2FzZSBUSU1FUl9OQU1FTE9PS1VQOgotICAgIGRhdGEtPnByb2dyZXNzLnRfbnNsb29rdXAgPQotICAgICAgQ3VybF90dmRpZmZfc2Vjcyhub3csIGRhdGEtPnByb2dyZXNzLnRfc3RhcnRzaW5nbGUpOworICAgIGRlbHRhID0gJmRhdGEtPnByb2dyZXNzLnRfbnNsb29rdXA7CiAgICAgYnJlYWs7CiAgIGNhc2UgVElNRVJfQ09OTkVDVDoKLSAgICBkYXRhLT5wcm9ncmVzcy50X2Nvbm5lY3QgPQotICAgICAgQ3VybF90dmRpZmZfc2Vjcyhub3csIGRhdGEtPnByb2dyZXNzLnRfc3RhcnRzaW5nbGUpOworICAgIGRlbHRhID0gJmRhdGEtPnByb2dyZXNzLnRfY29ubmVjdDsKICAgICBicmVhazsKICAgY2FzZSBUSU1FUl9BUFBDT05ORUNUOgotICAgIGRhdGEtPnByb2dyZXNzLnRfYXBwY29ubmVjdCA9Ci0gICAgICBDdXJsX3R2ZGlmZl9zZWNzKG5vdywgZGF0YS0+cHJvZ3Jlc3MudF9zdGFydHNpbmdsZSk7CisgICAgZGVsdGEgPSAmZGF0YS0+cHJvZ3Jlc3MudF9hcHBjb25uZWN0OwogICAgIGJyZWFrOwogICBjYXNlIFRJTUVSX1BSRVRSQU5TRkVSOgotICAgIGRhdGEtPnByb2dyZXNzLnRfcHJldHJhbnNmZXIgPQotICAgICAgQ3VybF90dmRpZmZfc2Vjcyhub3csIGRhdGEtPnByb2dyZXNzLnRfc3RhcnRzaW5nbGUpOworICAgIGRlbHRhID0gJmRhdGEtPnByb2dyZXNzLnRfcHJldHJhbnNmZXI7CiAgICAgYnJlYWs7CiAgIGNhc2UgVElNRVJfU1RBUlRUUkFOU0ZFUjoKLSAgICBkYXRhLT5wcm9ncmVzcy50X3N0YXJ0dHJhbnNmZXIgPQotICAgICAgQ3VybF90dmRpZmZfc2Vjcyhub3csIGRhdGEtPnByb2dyZXNzLnRfc3RhcnRzaW5nbGUpOwotICAgIGJyZWFrOworICAgIGRlbHRhID0gJmRhdGEtPnByb2dyZXNzLnRfc3RhcnR0cmFuc2ZlcjsKKyAgICAvKiBwcmV2ZW50IHVwZGF0aW5nIHRfc3RhcnR0cmFuc2ZlciB1bmxlc3M6CisgICAgICogICAxKSB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3JlIHNldHRpbmcgdF9zdGFydHRyYW5zZmVyCisgICAgICogICAyKSBhIHJlZGlyZWN0IGhhcyBvY2N1cnJlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRfc3RhcnR0cmFuc2ZlciB3YXMgc2V0CisgICAgICogVGhpcyBwcmV2ZW50cyByZXBlYXRlZCBpbnZvY2F0aW9ucyBvZiB0aGUgZnVuY3Rpb24gZnJvbSBpbmNvcnJlY3RseQorICAgICAqIGNoYW5naW5nIHRoZSB0X3N0YXJ0dHJhbnNmZXIgdGltZS4KKyAgICAgKi8KKyAgICBpZihkYXRhLT5wcm9ncmVzcy5pc190X3N0YXJ0cmFuc2Zlcl9zZXQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBkYXRhLT5wcm9ncmVzcy5pc190X3N0YXJ0cmFuc2Zlcl9zZXQgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQogICBjYXNlIFRJTUVSX1BPU1RSQU5TRkVSOgogICAgIC8qIHRoaXMgaXMgdGhlIG5vcm1hbCBlbmQtb2YtdHJhbnNmZXIgdGhpbmcgKi8KICAgICBicmVhazsKICAgY2FzZSBUSU1FUl9SRURJUkVDVDoKLSAgICBkYXRhLT5wcm9ncmVzcy50X3JlZGlyZWN0ID0gQ3VybF90dmRpZmZfc2Vjcyhub3csIGRhdGEtPnByb2dyZXNzLnN0YXJ0KTsKKyAgICBkYXRhLT5wcm9ncmVzcy50X3JlZGlyZWN0ID0gQ3VybF90dmRpZmZfdXMobm93LCBkYXRhLT5wcm9ncmVzcy5zdGFydCk7CiAgICAgYnJlYWs7CiAgIH0KKyAgaWYoZGVsdGEpIHsKKyAgICB0aW1lX3QgdXMgPSBDdXJsX3R2ZGlmZl91cyhub3csIGRhdGEtPnByb2dyZXNzLnRfc3RhcnRzaW5nbGUpOworICAgIGlmKCF1cykKKyAgICAgIHVzKys7IC8qIG1ha2Ugc3VyZSBhdCBsZWFzdCBvbmUgbWljcm9zZWNvbmQgcGFzc2VkICovCisgICAgKmRlbHRhICs9IHVzOworICB9CiB9CiAKIHZvaWQgQ3VybF9wZ3JzU3RhcnROb3coc3RydWN0IEN1cmxfZWFzeSAqZGF0YSkKIHsKICAgZGF0YS0+cHJvZ3Jlc3Muc3BlZWRlcl9jID0gMDsgLyogcmVzZXQgdGhlIHByb2dyZXNzIG1ldGVyIGRpc3BsYXkgKi8KICAgZGF0YS0+cHJvZ3Jlc3Muc3RhcnQgPSBDdXJsX3R2bm93KCk7CisgIGRhdGEtPnByb2dyZXNzLmlzX3Rfc3RhcnRyYW5zZmVyX3NldCA9IGZhbHNlOwogICBkYXRhLT5wcm9ncmVzcy51bF9saW1pdF9zdGFydC50dl9zZWMgPSAwOwogICBkYXRhLT5wcm9ncmVzcy51bF9saW1pdF9zdGFydC50dl91c2VjID0gMDsKICAgZGF0YS0+cHJvZ3Jlc3MuZGxfbGltaXRfc3RhcnQudHZfc2VjID0gMDsKQEAgLTI0Niw4ICsyNTgsOCBAQAogbG9uZyBDdXJsX3BncnNMaW1pdFdhaXRUaW1lKGN1cmxfb2ZmX3QgY3Vyc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX29mZl90IHN0YXJ0c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX29mZl90IGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsIG5vdykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY3VybHRpbWUgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGN1cmx0aW1lIG5vdykKIHsKICAgY3VybF9vZmZfdCBzaXplID0gY3Vyc2l6ZSAtIHN0YXJ0c2l6ZTsKICAgdGltZV90IG1pbmltdW07CkBAIC0yNzMsNyArMjg1LDcgQEAKIAogdm9pZCBDdXJsX3BncnNTZXREb3dubG9hZENvdW50ZXIoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwgY3VybF9vZmZfdCBzaXplKQogewotICBzdHJ1Y3QgdGltZXZhbCBub3cgPSBDdXJsX3R2bm93KCk7CisgIHN0cnVjdCBjdXJsdGltZSBub3cgPSBDdXJsX3R2bm93KCk7CiAKICAgZGF0YS0+cHJvZ3Jlc3MuZG93bmxvYWRlZCA9IHNpemU7CiAKQEAgLTI5MSw3ICszMDMsNyBAQAogCiB2b2lkIEN1cmxfcGdyc1NldFVwbG9hZENvdW50ZXIoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwgY3VybF9vZmZfdCBzaXplKQogewotICBzdHJ1Y3QgdGltZXZhbCBub3cgPSBDdXJsX3R2bm93KCk7CisgIHN0cnVjdCBjdXJsdGltZSBub3cgPSBDdXJsX3R2bm93KCk7CiAKICAgZGF0YS0+cHJvZ3Jlc3MudXBsb2FkZWQgPSBzaXplOwogCkBAIC0zMzcsMTIgKzM0OSwxMiBAQAogICovCiBpbnQgQ3VybF9wZ3JzVXBkYXRlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubikKIHsKLSAgc3RydWN0IHRpbWV2YWwgbm93OworICBzdHJ1Y3QgY3VybHRpbWUgbm93OwogICBpbnQgcmVzdWx0OwogICBjaGFyIG1heDVbNl1bMTBdOwotICBjdXJsX29mZl90IGRscGVyY2VuPTA7Ci0gIGN1cmxfb2ZmX3QgdWxwZXJjZW49MDsKLSAgY3VybF9vZmZfdCB0b3RhbF9wZXJjZW49MDsKKyAgY3VybF9vZmZfdCBkbHBlcmNlbiA9IDA7CisgIGN1cmxfb2ZmX3QgdWxwZXJjZW4gPSAwOworICBjdXJsX29mZl90IHRvdGFsX3BlcmNlbiA9IDA7CiAgIGN1cmxfb2ZmX3QgdG90YWxfdHJhbnNmZXI7CiAgIGN1cmxfb2ZmX3QgdG90YWxfZXhwZWN0ZWRfdHJhbnNmZXI7CiAgIGN1cmxfb2ZmX3QgdGltZXNwZW50OwpAQCAtMzUzLDI2ICszNjUsMjYgQEAKICAgY2hhciB0aW1lX2xlZnRbMTBdOwogICBjaGFyIHRpbWVfdG90YWxbMTBdOwogICBjaGFyIHRpbWVfc3BlbnRbMTBdOwotICBjdXJsX29mZl90IHVsZXN0aW1hdGU9MDsKLSAgY3VybF9vZmZfdCBkbGVzdGltYXRlPTA7CisgIGN1cmxfb2ZmX3QgdWxlc3RpbWF0ZSA9IDA7CisgIGN1cmxfb2ZmX3QgZGxlc3RpbWF0ZSA9IDA7CiAgIGN1cmxfb2ZmX3QgdG90YWxfZXN0aW1hdGU7Ci0gIGJvb2wgc2hvd25vdz1GQUxTRTsKKyAgYm9vbCBzaG93bm93ID0gRkFMU0U7CiAKICAgbm93ID0gQ3VybF90dm5vdygpOyAvKiB3aGF0IHRpbWUgaXMgaXQgKi8KIAogICAvKiBUaGUgdGltZSBzcGVudCBzbyBmYXIgKGZyb20gdGhlIHN0YXJ0KSAqLwotICBkYXRhLT5wcm9ncmVzcy50aW1lc3BlbnQgPSBjdXJseF90dmRpZmZfc2Vjcyhub3csIGRhdGEtPnByb2dyZXNzLnN0YXJ0KTsKLSAgdGltZXNwZW50ID0gKGN1cmxfb2ZmX3QpZGF0YS0+cHJvZ3Jlc3MudGltZXNwZW50OworICBkYXRhLT5wcm9ncmVzcy50aW1lc3BlbnQgPSBDdXJsX3R2ZGlmZl91cyhub3csIGRhdGEtPnByb2dyZXNzLnN0YXJ0KTsKKyAgdGltZXNwZW50ID0gKGN1cmxfb2ZmX3QpZGF0YS0+cHJvZ3Jlc3MudGltZXNwZW50LzEwMDAwMDA7IC8qIHNlY29uZHMgKi8KIAogICAvKiBUaGUgYXZlcmFnZSBkb3dubG9hZCBzcGVlZCB0aGlzIGZhciAqLwogICBkYXRhLT5wcm9ncmVzcy5kbHNwZWVkID0gKGN1cmxfb2ZmX3QpCi0gICAgKChkb3VibGUpZGF0YS0+cHJvZ3Jlc3MuZG93bmxvYWRlZC8KLSAgICAgKGRhdGEtPnByb2dyZXNzLnRpbWVzcGVudD4wP2RhdGEtPnByb2dyZXNzLnRpbWVzcGVudDoxKSk7CisgICAgKGRhdGEtPnByb2dyZXNzLmRvd25sb2FkZWQvCisgICAgICh0aW1lc3BlbnQ+MD90aW1lc3BlbnQ6MSkpOwogCiAgIC8qIFRoZSBhdmVyYWdlIHVwbG9hZCBzcGVlZCB0aGlzIGZhciAqLwogICBkYXRhLT5wcm9ncmVzcy51bHNwZWVkID0gKGN1cmxfb2ZmX3QpCi0gICAgKChkb3VibGUpZGF0YS0+cHJvZ3Jlc3MudXBsb2FkZWQvCi0gICAgIChkYXRhLT5wcm9ncmVzcy50aW1lc3BlbnQ+MD9kYXRhLT5wcm9ncmVzcy50aW1lc3BlbnQ6MSkpOworICAgIChkYXRhLT5wcm9ncmVzcy51cGxvYWRlZC8KKyAgICAgKHRpbWVzcGVudD4wP3RpbWVzcGVudDoxKSk7CiAKICAgLyogQ2FsY3VsYXRpb25zIGRvbmUgYXQgbW9zdCBvbmNlIGEgc2Vjb25kLCB1bmxlc3MgZW5kIGlzIHJlYWNoZWQgKi8KICAgaWYoZGF0YS0+cHJvZ3Jlc3MubGFzdHNob3cgIT0gbm93LnR2X3NlYykgewpAQCAtMzgwLDExICszOTIsMTAgQEAKIAogICAgIGRhdGEtPnByb2dyZXNzLmxhc3RzaG93ID0gbm93LnR2X3NlYzsKIAotICAgIC8qIExldCdzIGRvIHRoZSAiY3VycmVudCBzcGVlZCIgdGhpbmcsIHdoaWNoIHNob3VsZCB1c2UgdGhlIGZhc3Rlc3QKLSAgICAgICBvZiB0aGUgZGwvdWwgc3BlZWRzLiBTdG9yZSB0aGUgZmFzdGVyIHNwZWVkIGF0IGVudHJ5ICdub3dpbmRleCcuICovCisgICAgLyogTGV0J3MgZG8gdGhlICJjdXJyZW50IHNwZWVkIiB0aGluZywgd2l0aCB0aGUgZGwgKyB1bCBzcGVlZHMKKyAgICAgICBjb21iaW5lZC4gU3RvcmUgdGhlIHNwZWVkIGF0IGVudHJ5ICdub3dpbmRleCcuICovCiAgICAgZGF0YS0+cHJvZ3Jlc3Muc3BlZWRlclsgbm93aW5kZXggXSA9Ci0gICAgICBkYXRhLT5wcm9ncmVzcy5kb3dubG9hZGVkPmRhdGEtPnByb2dyZXNzLnVwbG9hZGVkPwotICAgICAgZGF0YS0+cHJvZ3Jlc3MuZG93bmxvYWRlZDpkYXRhLT5wcm9ncmVzcy51cGxvYWRlZDsKKyAgICAgIGRhdGEtPnByb2dyZXNzLmRvd25sb2FkZWQgKyBkYXRhLT5wcm9ncmVzcy51cGxvYWRlZDsKIAogICAgIC8qIHJlbWVtYmVyIHRoZSBleGFjdCB0aW1lIGZvciB0aGlzIG1vbWVudCAqLwogICAgIGRhdGEtPnByb2dyZXNzLnNwZWVkZXJfdGltZSBbIG5vd2luZGV4IF0gPSBub3c7CkBAIC0zOTcsNyArNDA4LDcgQEAKICAgICAgICBhcnJheS4gV2l0aCBOX0VOVFJJRVMgZmlsbGVkIGluLCB3ZSBoYXZlIGFib3V0IE5fRU5UUklFUy0xIHNlY29uZHMgb2YKICAgICAgICB0cmFuc2Zlci4gSW1hZ2luZSwgYWZ0ZXIgb25lIHNlY29uZCB3ZSBoYXZlIGZpbGxlZCBpbiB0d28gZW50cmllcywKICAgICAgICBhZnRlciB0d28gc2Vjb25kcyB3ZSd2ZSBmaWxsZWQgaW4gdGhyZWUgZW50cmllcyBldGMuICovCi0gICAgY291bnRpbmRleCA9ICgoZGF0YS0+cHJvZ3Jlc3Muc3BlZWRlcl9jPj1DVVJSX1RJTUUpPworICAgIGNvdW50aW5kZXggPSAoKGRhdGEtPnByb2dyZXNzLnNwZWVkZXJfYyA+PSBDVVJSX1RJTUUpPwogICAgICAgICAgICAgICAgICAgQ1VSUl9USU1FOmRhdGEtPnByb2dyZXNzLnNwZWVkZXJfYykgLSAxOwogCiAgICAgLyogZmlyc3Qgb2YgYWxsLCB3ZSBkb24ndCBkbyB0aGlzIGlmIHRoZXJlJ3Mgbm8gY291bnRlZCBzZWNvbmRzIHlldCAqLwpAQCAtNDA3LDE0ICs0MTgsMTQgQEAKICAgICAgIC8qIEdldCB0aGUgaW5kZXggcG9zaXRpb24gdG8gY29tcGFyZSB3aXRoIHRoZSAnbm93aW5kZXgnIHBvc2l0aW9uLgogICAgICAgICAgR2V0IHRoZSBvbGRlc3QgZW50cnkgcG9zc2libGUuIFdoaWxlIHdlIGhhdmUgbGVzcyB0aGFuIENVUlJfVElNRQogICAgICAgICAgZW50cmllcywgdGhlIGZpcnN0IGVudHJ5IHdpbGwgcmVtYWluIHRoZSBvbGRlc3QuICovCi0gICAgICBjaGVja2luZGV4ID0gKGRhdGEtPnByb2dyZXNzLnNwZWVkZXJfYz49Q1VSUl9USU1FKT8KKyAgICAgIGNoZWNraW5kZXggPSAoZGF0YS0+cHJvZ3Jlc3Muc3BlZWRlcl9jID49IENVUlJfVElNRSk/CiAgICAgICAgIGRhdGEtPnByb2dyZXNzLnNwZWVkZXJfYyVDVVJSX1RJTUU6MDsKIAogICAgICAgLyogRmlndXJlIG91dCB0aGUgZXhhY3QgdGltZSBmb3IgdGhlIHRpbWUgc3BhbiAqLwogICAgICAgc3Bhbl9tcyA9IEN1cmxfdHZkaWZmKG5vdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5wcm9ncmVzcy5zcGVlZGVyX3RpbWVbY2hlY2tpbmRleF0pOwogICAgICAgaWYoMCA9PSBzcGFuX21zKQotICAgICAgICBzcGFuX21zPTE7IC8qIGF0IGxlYXN0IG9uZSBtaWxsaXNlY29uZCBNVVNUIGhhdmUgcGFzc2VkICovCisgICAgICAgIHNwYW5fbXMgPSAxOyAvKiBhdCBsZWFzdCBvbmUgbWlsbGlzZWNvbmQgTVVTVCBoYXZlIHBhc3NlZCAqLwogCiAgICAgICAvKiBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugc3BlZWQgdGhlIGxhc3QgJ3NwYW5fbXMnIG1pbGxpc2Vjb25kcyAqLwogICAgICAgewpAQCAtNDMzLDEwICs0NDQsOSBAQAogICAgICAgfQogICAgIH0KICAgICBlbHNlCi0gICAgICAvKiB0aGUgZmlyc3Qgc2Vjb25kIHdlIHVzZSB0aGUgbWFpbiBhdmVyYWdlICovCisgICAgICAvKiB0aGUgZmlyc3Qgc2Vjb25kIHdlIHVzZSB0aGUgYXZlcmFnZSAqLwogICAgICAgZGF0YS0+cHJvZ3Jlc3MuY3VycmVudF9zcGVlZCA9Ci0gICAgICAgIChkYXRhLT5wcm9ncmVzcy51bHNwZWVkPmRhdGEtPnByb2dyZXNzLmRsc3BlZWQpPwotICAgICAgICBkYXRhLT5wcm9ncmVzcy51bHNwZWVkOmRhdGEtPnByb2dyZXNzLmRsc3BlZWQ7CisgICAgICAgIGRhdGEtPnByb2dyZXNzLnVsc3BlZWQgKyBkYXRhLT5wcm9ncmVzcy5kbHNwZWVkOwogCiAgIH0gLyogQ2FsY3VsYXRpb25zIGVuZCAqLwogCkBAIC00NDUsMjIgKzQ1NSwyMiBAQAogCiAgICAgaWYoZGF0YS0+c2V0LmZ4ZmVyaW5mbykgewogICAgICAgLyogVGhlcmUncyBhIGNhbGxiYWNrIHNldCwgY2FsbCB0aGF0ICovCi0gICAgICByZXN1bHQ9IGRhdGEtPnNldC5meGZlcmluZm8oZGF0YS0+c2V0LnByb2dyZXNzX2NsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5wcm9ncmVzcy5zaXplX2RsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnByb2dyZXNzLmRvd25sb2FkZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+cHJvZ3Jlc3Muc2l6ZV91bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5wcm9ncmVzcy51cGxvYWRlZCk7CisgICAgICByZXN1bHQgPSBkYXRhLT5zZXQuZnhmZXJpbmZvKGRhdGEtPnNldC5wcm9ncmVzc19jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnByb2dyZXNzLnNpemVfZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnByb2dyZXNzLmRvd25sb2FkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnByb2dyZXNzLnNpemVfdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnByb2dyZXNzLnVwbG9hZGVkKTsKICAgICAgIGlmKHJlc3VsdCkKICAgICAgICAgZmFpbGYoZGF0YSwgIkNhbGxiYWNrIGFib3J0ZWQiKTsKICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogICAgIGlmKGRhdGEtPnNldC5mcHJvZ3Jlc3MpIHsKICAgICAgIC8qIFRoZSBvbGRlciBkZXByZWNhdGVkIGNhbGxiYWNrIGlzIHNldCwgY2FsbCB0aGF0ICovCi0gICAgICByZXN1bHQ9IGRhdGEtPnNldC5mcHJvZ3Jlc3MoZGF0YS0+c2V0LnByb2dyZXNzX2NsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKWRhdGEtPnByb2dyZXNzLnNpemVfZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlkYXRhLT5wcm9ncmVzcy5kb3dubG9hZGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpZGF0YS0+cHJvZ3Jlc3Muc2l6ZV91bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKWRhdGEtPnByb2dyZXNzLnVwbG9hZGVkKTsKKyAgICAgIHJlc3VsdCA9IGRhdGEtPnNldC5mcHJvZ3Jlc3MoZGF0YS0+c2V0LnByb2dyZXNzX2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlkYXRhLT5wcm9ncmVzcy5zaXplX2RsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKWRhdGEtPnByb2dyZXNzLmRvd25sb2FkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpZGF0YS0+cHJvZ3Jlc3Muc2l6ZV91bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlkYXRhLT5wcm9ncmVzcy51cGxvYWRlZCk7CiAgICAgICBpZihyZXN1bHQpCiAgICAgICAgIGZhaWxmKGRhdGEsICJDYWxsYmFjayBhYm9ydGVkIik7CiAgICAgICByZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvcHJvZ3Jlc3MuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Byb2dyZXNzLmgKaW5kZXggMTU1ZmYwNC4uOTMzM2FiMiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvcHJvZ3Jlc3MuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9wcm9ncmVzcy5oCkBAIC03LDcgKzcsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTQsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC00NywxMyArNDcsMTMgQEAKIHZvaWQgQ3VybF9wZ3JzU2V0RG93bmxvYWRDb3VudGVyKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsIGN1cmxfb2ZmX3Qgc2l6ZSk7CiB2b2lkIEN1cmxfcGdyc1NldFVwbG9hZENvdW50ZXIoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwgY3VybF9vZmZfdCBzaXplKTsKIGludCBDdXJsX3BncnNVcGRhdGUoc3RydWN0IGNvbm5lY3RkYXRhICopOwotdm9pZCBDdXJsX3BncnNSZXNldFRpbWVzU2l6ZXMoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSk7Cit2b2lkIEN1cmxfcGdyc1Jlc2V0VHJhbnNmZXJTaXplcyhzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKTsKIHZvaWQgQ3VybF9wZ3JzVGltZShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLCB0aW1lcmlkIHRpbWVyKTsKIGxvbmcgQ3VybF9wZ3JzTGltaXRXYWl0VGltZShjdXJsX29mZl90IGN1cnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9vZmZfdCBzdGFydHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9vZmZfdCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCBub3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjdXJsdGltZSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY3VybHRpbWUgbm93KTsKIAogLyogRG9uJ3Qgc2hvdyBwcm9ncmVzcyBmb3Igc2l6ZXMgc21hbGxlciB0aGFuOiAqLwogI2RlZmluZSBMRUFTVF9TSVpFX1BST0dSRVNTIEJVRlNJWkUKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3JhbmQuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3JhbmQuYwppbmRleCBiNmY0MGFjLi4yNzEzYTBhIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9yYW5kLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvcmFuZC5jCkBAIC04Niw3ICs4Niw3IEBACiAjZW5kaWYKIAogICBpZighc2VlZGVkKSB7Ci0gICAgc3RydWN0IHRpbWV2YWwgbm93ID0gY3VybHhfdHZub3coKTsKKyAgICBzdHJ1Y3QgY3VybHRpbWUgbm93ID0gY3VybHhfdHZub3coKTsKICAgICBpbmZvZihkYXRhLCAiV0FSTklORzogVXNpbmcgd2VhayByYW5kb20gc2VlZFxuIik7CiAgICAgcmFuZHNlZWQgKz0gKHVuc2lnbmVkIGludClub3cudHZfdXNlYyArICh1bnNpZ25lZCBpbnQpbm93LnR2X3NlYzsKICAgICByYW5kc2VlZCA9IHJhbmRzZWVkICogMTEwMzUxNTI0NSArIDEyMzQ1OwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvcnRzcC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvcnRzcC5jCmluZGV4IDE4MTBjZGEuLjkyNWRhMmMgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3J0c3AuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9ydHNwLmMKQEAgLTgxLDYgKzgxLDkgQEAKIAogc3RhdGljIENVUkxjb2RlIHJ0c3Bfc2V0dXBfY29ubmVjdGlvbihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pOwogCitib29sIHJ0c3BfY29ubmlzZGVhZChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNoZWNrKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnRzcF9jb25uY2hlY2soc3RydWN0IGNvbm5lY3RkYXRhICpjaGVjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNoZWNrc190b19wZXJmb3JtKTsKIAogLyogdGhpcyByZXR1cm5zIHRoZSBzb2NrZXQgdG8gd2FpdCBmb3IgaW4gdGhlIERPIGFuZCBET0lORyBzdGF0ZSBmb3IgdGhlIG11bHRpCiAgICBpbnRlcmZhY2UgYW5kIHRoZW4gd2UncmUgYWx3YXlzIF9zZW5kaW5nXyBhIHJlcXVlc3QgYW5kIHRodXMgd2Ugd2FpdCBmb3IKQEAgLTExNyw2ICsxMjAsNyBAQAogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICBydHNwX2Rpc2Nvbm5lY3QsICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgcnRzcF9ydHBfcmVhZHdyaXRlLCAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgcnRzcF9jb25uY2hlY2ssICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIFBPUlRfUlRTUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fUlRTUCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8KQEAgLTE0Myw3ICsxNDcsNyBAQAogICogSW5zdGVhZCwgaWYgaXQgaXMgcmVhZGFibGUsIHJ1biBDdXJsX2Nvbm5hbGl2ZSgpIHRvIHBlZWsgYXQgdGhlIHNvY2tldAogICogYW5kIGRpc3Rpbmd1aXNoIGJldHdlZW4gY2xvc2VkIGFuZCBkYXRhLgogICovCi1ib29sIEN1cmxfcnRzcF9jb25uaXNkZWFkKHN0cnVjdCBjb25uZWN0ZGF0YSAqY2hlY2spCitib29sIHJ0c3BfY29ubmlzZGVhZChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNoZWNrKQogewogICBpbnQgc3ZhbDsKICAgYm9vbCByZXRfdmFsID0gVFJVRTsKQEAgLTE2NSw2ICsxNjksMjMgQEAKICAgcmV0dXJuIHJldF92YWw7CiB9CiAKKy8qCisgKiBGdW5jdGlvbiB0byBjaGVjayBvbiB2YXJpb3VzIGFzcGVjdHMgb2YgYSBjb25uZWN0aW9uLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHJ0c3BfY29ubmNoZWNrKHN0cnVjdCBjb25uZWN0ZGF0YSAqY2hlY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjaGVja3NfdG9fcGVyZm9ybSkKK3sKKyAgdW5zaWduZWQgaW50IHJldF92YWwgPSBDT05OUkVTVUxUX05PTkU7CisKKyAgaWYoY2hlY2tzX3RvX3BlcmZvcm0gJiBDT05OQ0hFQ0tfSVNERUFEKSB7CisgICAgaWYocnRzcF9jb25uaXNkZWFkKGNoZWNrKSkKKyAgICAgIHJldF92YWwgfD0gQ09OTlJFU1VMVF9ERUFEOworICB9CisKKyAgcmV0dXJuIHJldF92YWw7Cit9CisKKwogc3RhdGljIENVUkxjb2RlIHJ0c3BfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGJvb2wgKmRvbmUpCiB7CiAgIENVUkxjb2RlIGh0dHBTdGF0dXM7CkBAIC0yMjksNyArMjUwLDcgQEAKIHN0YXRpYyBDVVJMY29kZSBydHNwX2RvKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgYm9vbCAqZG9uZSkKIHsKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7Ci0gIENVUkxjb2RlIHJlc3VsdD1DVVJMRV9PSzsKKyAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7CiAgIEN1cmxfUnRzcFJlcSBydHNwcmVxID0gZGF0YS0+c2V0LnJ0c3ByZXE7CiAgIHN0cnVjdCBSVFNQICpydHNwID0gZGF0YS0+cmVxLnByb3RvcDsKICAgc3RydWN0IEhUVFAgKmh0dHA7CkBAIC03MjgsMTQgKzc0OSwyOCBAQAogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKICAgc2l6ZV90IHdyb3RlOwogICBjdXJsX3dyaXRlX2NhbGxiYWNrIHdyaXRlaXQ7CisgIHZvaWQgKnVzZXJfcHRyOwogCiAgIGlmKGxlbiA9PSAwKSB7CiAgICAgZmFpbGYoZGF0YSwgIkNhbm5vdCB3cml0ZSBhIDAgc2l6ZSBSVFAgcGFja2V0LiIpOwogICAgIHJldHVybiBDVVJMRV9XUklURV9FUlJPUjsKICAgfQogCi0gIHdyaXRlaXQgPSBkYXRhLT5zZXQuZndyaXRlX3J0cD9kYXRhLT5zZXQuZndyaXRlX3J0cDpkYXRhLT5zZXQuZndyaXRlX2Z1bmM7Ci0gIHdyb3RlID0gd3JpdGVpdChwdHIsIDEsIGxlbiwgZGF0YS0+c2V0LnJ0cF9vdXQpOworICAvKiBJZiB0aGUgdXNlciBoYXMgY29uZmlndXJlZCBDVVJMT1BUX0lOVEVSTEVBVkVGVU5DVElPTiB0aGVuIHVzZSB0aGF0CisgICAgIGZ1bmN0aW9uIGFuZCBhbnkgY29uZmlndXJlZCBDVVJMT1BUX0lOVEVSTEVBVkVEQVRBIHRvIHdyaXRlIG91dCB0aGUgUlRQCisgICAgIGRhdGEuIE90aGVyd2lzZSwgdXNlIHRoZSBDVVJMT1BUX1dSSVRFRlVOQ1RJT04gd2l0aCB0aGUgQ1VSTE9QVF9XUklURURBVEEKKyAgICAgcG9pbnRlciB0byB3cml0ZSBvdXQgdGhlIFJUUCBkYXRhLiAqLworICBpZihkYXRhLT5zZXQuZndyaXRlX3J0cCkgeworICAgIHdyaXRlaXQgPSBkYXRhLT5zZXQuZndyaXRlX3J0cDsKKyAgICB1c2VyX3B0ciA9IGRhdGEtPnNldC5ydHBfb3V0OworICB9CisgIGVsc2UKKyAgeworICAgIHdyaXRlaXQgPSBkYXRhLT5zZXQuZndyaXRlX2Z1bmM7CisgICAgdXNlcl9wdHIgPSBkYXRhLT5zZXQub3V0OworICB9CisKKyAgd3JvdGUgPSB3cml0ZWl0KHB0ciwgMSwgbGVuLCB1c2VyX3B0cik7CiAKICAgaWYoQ1VSTF9XUklURUZVTkNfUEFVU0UgPT0gd3JvdGUpIHsKICAgICBmYWlsZihkYXRhLCAiQ2Fubm90IHBhdXNlIFJUUCIpOwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvcnRzcC5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvcnRzcC5oCmluZGV4IDVhOGQ1NTUuLjgzNzVhNTMgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3J0c3AuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9ydHNwLmgKQEAgLTI1LDEzICsyNSwxMSBAQAogCiBleHRlcm4gY29uc3Qgc3RydWN0IEN1cmxfaGFuZGxlciBDdXJsX2hhbmRsZXJfcnRzcDsKIAotYm9vbCBDdXJsX3J0c3BfY29ubmlzZGVhZChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNoZWNrKTsKIENVUkxjb2RlIEN1cmxfcnRzcF9wYXJzZWhlYWRlcihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGNoYXIgKmhlYWRlcik7CiAKICNlbHNlCiAvKiBkaXNhYmxlZCAqLwogI2RlZmluZSBDdXJsX3J0c3BfcGFyc2VoZWFkZXIoeCx5KSBDVVJMRV9OT1RfQlVJTFRfSU4KLSNkZWZpbmUgQ3VybF9ydHNwX2Nvbm5pc2RlYWQoeCkgVFJVRQogCiAjZW5kaWYgLyogQ1VSTF9ESVNBQkxFX1JUU1AgKi8KIApkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc2VjdXJpdHkuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3NlY3VyaXR5LmMKaW5kZXggZjRhODc2My4uYTJlNGEzNSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc2VjdXJpdHkuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zZWN1cml0eS5jCkBAIC03LDcgKzcsNyBAQAogICogcmV3cml0ZSB0byB3b3JrIGFyb3VuZCB0aGUgcGFyYWdyYXBoIDIgaW4gdGhlIEJTRCBsaWNlbnNlcyBhcyBleHBsYWluZWQKICAqIGJlbG93LgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KKyAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAxNyBLdW5nbGlnYSBUZWtuaXNrYSBIw7Znc2tvbGFuCiAgKiAoUm95YWwgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIFN0b2NraG9sbSwgU3dlZGVuKS4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDE1LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgpAQCAtMTE1LDcgKzExNSw3IEBACiBzdGF0aWMgaW50IGZ0cF9zZW5kX2NvbW1hbmQoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pCiB7CiAgIGludCBmdHBfY29kZTsKLSAgc3NpemVfdCBucmVhZD0wOworICBzc2l6ZV90IG5yZWFkID0gMDsKICAgdmFfbGlzdCBhcmdzOwogICBjaGFyIHByaW50X2J1ZmZlcls1MF07CiAKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NlbGVjdC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc2VsZWN0LmMKaW5kZXggNDQzMDA3Mi4uYjhlMTg2OCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc2VsZWN0LmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc2VsZWN0LmMKQEAgLTc4LDcgKzc4LDcgQEAKICNpZm5kZWYgSEFWRV9QT0xMX0ZJTkUKICAgc3RydWN0IHRpbWV2YWwgcGVuZGluZ190djsKICNlbmRpZgotICBzdHJ1Y3QgdGltZXZhbCBpbml0aWFsX3R2OworICBzdHJ1Y3QgY3VybHRpbWUgaW5pdGlhbF90djsKICAgaW50IHBlbmRpbmdfbXM7CiAgIGludCBlcnJvcjsKICNlbmRpZgpAQCAtMTU4LDcgKzE1OCw3IEBACiAgIGZkX3NldCBmZHNfZXJyOwogICBjdXJsX3NvY2tldF90IG1heGZkOwogI2VuZGlmCi0gIHN0cnVjdCB0aW1ldmFsIGluaXRpYWxfdHYgPSB7MCwgMH07CisgIHN0cnVjdCBjdXJsdGltZSBpbml0aWFsX3R2ID0gezAsIDB9OwogICBpbnQgcGVuZGluZ19tcyA9IDA7CiAgIGludCBlcnJvcjsKICAgaW50IHI7CkBAIC0zOTgsNyArMzk4LDcgQEAKICAgZmRfc2V0IGZkc19lcnI7CiAgIGN1cmxfc29ja2V0X3QgbWF4ZmQ7CiAjZW5kaWYKLSAgc3RydWN0IHRpbWV2YWwgaW5pdGlhbF90diA9IHswLCAwfTsKKyAgc3RydWN0IGN1cmx0aW1lIGluaXRpYWxfdHYgPSB7MCwgMH07CiAgIGJvb2wgZmRzX25vbmUgPSBUUlVFOwogICB1bnNpZ25lZCBpbnQgaTsKICAgaW50IHBlbmRpbmdfbXMgPSAwOwpAQCAtNTcxLDggKzU3MSw4IEBACiAgKgogICogUmV0dXJuIHZhbHVlcyBhcmUgdGhlIHNhbWUgYXMgc2VsZWN0J3MuCiAgKi8KLWludCB0cGZfc2VsZWN0X2xpYmN1cmwoaW50IG1heGZkcywgZmRfc2V0KiByZWFkcywgZmRfc2V0KiB3cml0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGZkX3NldCogZXhjZXB0cywgc3RydWN0IHRpbWV2YWwqIHR2KQoraW50IHRwZl9zZWxlY3RfbGliY3VybChpbnQgbWF4ZmRzLCBmZF9zZXQgKnJlYWRzLCBmZF9zZXQgKndyaXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgZmRfc2V0ICpleGNlcHRzLCBzdHJ1Y3QgdGltZXZhbCAqdHYpCiB7CiAgICBpbnQgcmM7CiAKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NlbGVjdC5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc2VsZWN0LmgKaW5kZXggNGVkNWRkMi4uNDM1MTc4NiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc2VsZWN0LmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc2VsZWN0LmgKQEAgLTcsNyArNyw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTM2LDcgKzM2LDggQEAKIAogI2lmICFkZWZpbmVkKEhBVkVfU1RSVUNUX1BPTExGRCkgJiYgXAogICAgICFkZWZpbmVkKEhBVkVfU1lTX1BPTExfSCkgJiYgXAotICAgICFkZWZpbmVkKEhBVkVfUE9MTF9IKQorICAgICFkZWZpbmVkKEhBVkVfUE9MTF9IKSAmJiBcCisgICAgIWRlZmluZWQoUE9MTElOKQogCiAjZGVmaW5lIFBPTExJTiAgICAgIDB4MDEKICNkZWZpbmUgUE9MTFBSSSAgICAgMHgwMgpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc2VuZGYuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3NlbmRmLmMKaW5kZXggNTk1YzM2MS4uNzU2NGNiMyAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc2VuZGYuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zZW5kZi5jCkBAIC02Myw3ICs2Myw3IEBACiAgICAgaWYoKnN0YXJ0UHRyID09ICdcbicpIHsKICAgICAgIC8qIFRoaXMgYmxvY2sgb2YgaW5jb21pbmcgZGF0YSBzdGFydHMgd2l0aCB0aGUKICAgICAgICAgIHByZXZpb3VzIGJsb2NrJ3MgTEYgc28gZ2V0IHJpZCBvZiBpdCAqLwotICAgICAgbWVtbW92ZShzdGFydFB0ciwgc3RhcnRQdHIrMSwgc2l6ZS0xKTsKKyAgICAgIG1lbW1vdmUoc3RhcnRQdHIsIHN0YXJ0UHRyICsgMSwgc2l6ZS0xKTsKICAgICAgIHNpemUtLTsKICAgICAgIC8qIGFuZCBpdCB3YXNuJ3QgYSBiYXJlIENSIGJ1dCBhIENSTEYgY29udmVyc2lvbiBpbnN0ZWFkICovCiAgICAgICBkYXRhLT5zdGF0ZS5jcmxmX2NvbnZlcnNpb25zKys7CkBAIC03NSw3ICs3NSw3IEBACiAgIGluUHRyID0gb3V0UHRyID0gbWVtY2hyKHN0YXJ0UHRyLCAnXHInLCBzaXplKTsKICAgaWYoaW5QdHIpIHsKICAgICAvKiBhdCBsZWFzdCBvbmUgQ1IsIG5vdyBsb29rIGZvciBDUkxGICovCi0gICAgd2hpbGUoaW5QdHIgPCAoc3RhcnRQdHIrc2l6ZS0xKSkgeworICAgIHdoaWxlKGluUHRyIDwgKHN0YXJ0UHRyICsgc2l6ZS0xKSkgewogICAgICAgLyogbm90ZSB0aGF0IGl0J3Mgc2l6ZS0xLCBzbyB3ZSdsbCBuZXZlciBsb29rIHBhc3QgdGhlIGxhc3QgYnl0ZSAqLwogICAgICAgaWYobWVtY21wKGluUHRyLCAiXHJcbiIsIDIpID09IDApIHsKICAgICAgICAgLyogQ1JMRiBmb3VuZCwgYnVtcCBwYXN0IHRoZSBDUiBhbmQgY29weSB0aGUgTkwgKi8KQEAgLTk4LDcgKzk4LDcgQEAKICAgICAgIGluUHRyKys7CiAgICAgfSAvKiBlbmQgb2Ygd2hpbGUgbG9vcCAqLwogCi0gICAgaWYoaW5QdHIgPCBzdGFydFB0citzaXplKSB7CisgICAgaWYoaW5QdHIgPCBzdGFydFB0ciArIHNpemUpIHsKICAgICAgIC8qIGhhbmRsZSBsYXN0IGJ5dGUgKi8KICAgICAgIGlmKCppblB0ciA9PSAnXHInKSB7CiAgICAgICAgIC8qIGRlYWwgd2l0aCBhIENSIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLwpAQCAtMTEyLDcgKzExMiw3IEBACiAgICAgICB9CiAgICAgICBvdXRQdHIrKzsKICAgICB9Ci0gICAgaWYob3V0UHRyIDwgc3RhcnRQdHIrc2l6ZSkKKyAgICBpZihvdXRQdHIgPCBzdGFydFB0ciArIHNpemUpCiAgICAgICAvKiB0aWR5IHVwIGJ5IG51bGwgdGVybWluYXRpbmcgdGhlIG5vdyBzaG9ydGVyIGRhdGEgKi8KICAgICAgICpvdXRQdHIgPSAnXDAnOwogCkBAIC0yNzksNyArMjc5LDcgQEAKICAgaWYoIXMpCiAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7IC8qIGZhaWx1cmUgKi8KIAotICBieXRlc193cml0dGVuPTA7CisgIGJ5dGVzX3dyaXR0ZW4gPSAwOwogICB3cml0ZV9sZW4gPSBzdHJsZW4ocyk7CiAgIHNwdHIgPSBzOwogCkBAIC0zODcsNyArMzg3LDcgQEAKICNlbmRpZgogICAgICAgKSB7CiAgICAgICAvKiB0aGlzIGlzIGp1c3QgYSBjYXNlIG9mIEVXT1VMREJMT0NLICovCi0gICAgICBieXRlc193cml0dGVuPTA7CisgICAgICBieXRlc193cml0dGVuID0gMDsKICAgICAgICpjb2RlID0gQ1VSTEVfQUdBSU47CiAgICAgfQogICAgIGVsc2UgewpAQCAtNDgwLDcgKzQ4MCw3IEBACiAgIGJvb2wgbmV3dHlwZSA9IFRSVUU7CiAKICAgaWYocy0+dGVtcGNvdW50KSB7Ci0gICAgZm9yKGk9MDsgaTwgcy0+dGVtcGNvdW50OyBpKyspIHsKKyAgICBmb3IoaSA9IDA7IGk8IHMtPnRlbXBjb3VudDsgaSsrKSB7CiAgICAgICBpZihzLT50ZW1wd3JpdGVbaV0udHlwZSA9PSB0eXBlKSB7CiAgICAgICAgIC8qIGRhdGEgZm9yIHRoaXMgdHlwZSBleGlzdHMgKi8KICAgICAgICAgbmV3dHlwZSA9IEZBTFNFOwpAQCAtNzA0LDcgKzcwNCw3IEBACiAgICAgIHVzIHVzZSB0aGUgY29ycmVjdCBzc2wgaGFuZGxlLiAqLwogICBpbnQgbnVtID0gKHNvY2tmZCA9PSBjb25uLT5zb2NrW1NFQ09OREFSWVNPQ0tFVF0pOwogCi0gICpuPTA7IC8qIHJlc2V0IGFtb3VudCB0byB6ZXJvICovCisgICpuID0gMDsgLyogcmVzZXQgYW1vdW50IHRvIHplcm8gKi8KIAogICAvKiBJZiBzZXNzaW9uIGNhbiBwaXBlbGluZSwgY2hlY2sgY29ubmVjdGlvbiBidWZmZXIgICovCiAgIGlmKHBpcGVsaW5pbmcpIHsKQEAgLTgyMyw4ICs4MjMsOCBAQAogICBpbnQgcmM7CiAgIGlmKGRhdGEtPnNldC5wcmludGhvc3QgJiYgY29ubiAmJiBjb25uLT5ob3N0LmRpc3BuYW1lKSB7CiAgICAgY2hhciBidWZmZXJbMTYwXTsKLSAgICBjb25zdCBjaGFyICp0PU5VTEw7Ci0gICAgY29uc3QgY2hhciAqdz0iRGF0YSI7CisgICAgY29uc3QgY2hhciAqdCA9IE5VTEw7CisgICAgY29uc3QgY2hhciAqdyA9ICJEYXRhIjsKICAgICBzd2l0Y2godHlwZSkgewogICAgIGNhc2UgQ1VSTElORk9fSEVBREVSX0lOOgogICAgICAgdyA9ICJIZWFkZXIiOwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc21iLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zbWIuYwppbmRleCA1YjFmZmE5Li4xM2RmZDUxIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zbWIuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zbWIuYwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPHByb2Nlc3MuaD4KICNpZmRlZiBDVVJMX1dJTkRPV1NfQVBQCiAjZGVmaW5lIGdldHBpZCBHZXRDdXJyZW50UHJvY2Vzc0lkCi0jZWxzZQorI2VsaWYgIWRlZmluZWQoTVNET1MpCiAjZGVmaW5lIGdldHBpZCBfZ2V0cGlkCiAjZW5kaWYKICNlbmRpZgpAQCAtODUsNiArODUsNyBAQAogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICBzbWJfZGlzY29ubmVjdCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIFBPUlRfU01CLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fU01CLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8KQEAgLTEwOSw2ICsxMTAsNyBAQAogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICBzbWJfZGlzY29ubmVjdCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIFBPUlRfU01CUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fU01CUywgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfU1NMICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8KQEAgLTcxMyw2ICs3MTUsMjMgQEAKICAgcmV0dXJuIENVUkxFX09LOwogfQogCisvKgorICogQ29udmVydCBhIHRpbWVzdGFtcCBmcm9tIHRoZSBXaW5kb3dzIHdvcmxkICgxMDAgbnNlYyB1bml0cyBmcm9tCisgKiAxIEphbiAxNjAxKSB0byBQb3NpeCB0aW1lLgorICovCitzdGF0aWMgdm9pZCBnZXRfcG9zaXhfdGltZShsb25nICpfb3V0LCBjb25zdCB2b2lkICpfaW4pCit7CisjaWZkZWYgSEFWRV9MT05HTE9ORworICBsb25nIGxvbmcgdGltZXN0YW1wID0gKihsb25nIGxvbmcgKikgX2luOworI2Vsc2UKKyAgdW5zaWduZWQgX19pbnQ2NCB0aW1lc3RhbXAgPSAqKHVuc2lnbmVkIF9faW50NjQgKikgX2luOworI2VuZGlmCisKKyAgdGltZXN0YW1wIC09IDExNjQ0NDczNjAwMDAwMDAwMFVMTDsKKyAgdGltZXN0YW1wIC89IDEwMDAwMDAwOworICAqX291dCA9IChsb25nKSB0aW1lc3RhbXA7Cit9CisKIHN0YXRpYyBDVVJMY29kZSBzbWJfcmVxdWVzdF9zdGF0ZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGJvb2wgKmRvbmUpCiB7CiAgIHN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxID0gY29ubi0+ZGF0YS0+cmVxLnByb3RvcDsKQEAgLTcyMyw2ICs3NDIsNyBAQAogICB1bnNpZ25lZCBzaG9ydCBvZmY7CiAgIENVUkxjb2RlIHJlc3VsdDsKICAgdm9pZCAqbXNnID0gTlVMTDsKKyAgY29uc3Qgc3RydWN0IHNtYl9udF9jcmVhdGVfcmVzcG9uc2UgKnNtYl9tOwogCiAgIC8qIFN0YXJ0IHRoZSByZXF1ZXN0ICovCiAgIGlmKHJlcS0+c3RhdGUgPT0gU01CX1JFUVVFU1RJTkcpIHsKQEAgLTc2NSw3ICs3ODUsOCBAQAogICAgICAgbmV4dF9zdGF0ZSA9IFNNQl9UUkVFX0RJU0NPTk5FQ1Q7CiAgICAgICBicmVhazsKICAgICB9Ci0gICAgcmVxLT5maWQgPSBzbWJfc3dhcDE2KCgoc3RydWN0IHNtYl9udF9jcmVhdGVfcmVzcG9uc2UgKiltc2cpLT5maWQpOworICAgIHNtYl9tID0gKGNvbnN0IHN0cnVjdCBzbWJfbnRfY3JlYXRlX3Jlc3BvbnNlKikgbXNnOworICAgIHJlcS0+ZmlkID0gc21iX3N3YXAxNihzbWJfbS0+ZmlkKTsKICAgICBjb25uLT5kYXRhLT5yZXEub2Zmc2V0ID0gMDsKICAgICBpZihjb25uLT5kYXRhLT5zZXQudXBsb2FkKSB7CiAgICAgICBjb25uLT5kYXRhLT5yZXEuc2l6ZSA9IGNvbm4tPmRhdGEtPnN0YXRlLmluZmlsZXNpemU7CkBAIC03NzMsOSArNzk0LDExIEBACiAgICAgICBuZXh0X3N0YXRlID0gU01CX1VQTE9BRDsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICBjb25uLT5kYXRhLT5yZXEuc2l6ZSA9Ci0gICAgICAgIHNtYl9zd2FwNjQoKChzdHJ1Y3Qgc21iX250X2NyZWF0ZV9yZXNwb25zZSAqKW1zZyktPmVuZF9vZl9maWxlKTsKKyAgICAgIHNtYl9tID0gKGNvbnN0IHN0cnVjdCBzbWJfbnRfY3JlYXRlX3Jlc3BvbnNlKikgbXNnOworICAgICAgY29ubi0+ZGF0YS0+cmVxLnNpemUgPSBzbWJfc3dhcDY0KHNtYl9tLT5lbmRfb2ZfZmlsZSk7CiAgICAgICBDdXJsX3BncnNTZXREb3dubG9hZFNpemUoY29ubi0+ZGF0YSwgY29ubi0+ZGF0YS0+cmVxLnNpemUpOworICAgICAgaWYoY29ubi0+ZGF0YS0+c2V0LmdldF9maWxldGltZSkKKyAgICAgICAgZ2V0X3Bvc2l4X3RpbWUoJmNvbm4tPmRhdGEtPmluZm8uZmlsZXRpbWUsICZzbWJfbS0+bGFzdF9jaGFuZ2VfdGltZSk7CiAgICAgICBuZXh0X3N0YXRlID0gU01CX0RPV05MT0FEOwogICAgIH0KICAgICBicmVhazsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NtdHAuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3NtdHAuYwppbmRleCBmZTA2NGNiLi5kZTJkZDMzIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zbXRwLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc210cC5jCkBAIC02Nyw2ICs2Nyw3IEBACiAjaW5jbHVkZSAidHJhbnNmZXIuaCIKICNpbmNsdWRlICJlc2NhcGUuaCIKICNpbmNsdWRlICJodHRwLmgiIC8qIGZvciBIVFRQIHByb3h5IHR1bm5lbCBzdHVmZiAqLworI2luY2x1ZGUgIm1pbWUuaCIKICNpbmNsdWRlICJzb2Nrcy5oIgogI2luY2x1ZGUgInNtdHAuaCIKICNpbmNsdWRlICJzdHJ0b29mZnQuaCIKQEAgLTEyNCw2ICsxMjUsNyBAQAogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIHNtdHBfZGlzY29ubmVjdCwgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9TTVRQLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX1NNVFAsICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfQ0xPU0VBQ1RJT04gfCBQUk9UT1BUX05PVVJMUVVFUlkgfCAvKiBmbGFncyAqLwpAQCAtMTUwLDYgKzE1Miw3IEBACiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KICAgc210cF9kaXNjb25uZWN0LCAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbl9jaGVjayAqLwogICBQT1JUX1NNVFBTLCAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fU01UUFMsICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9DTE9TRUFDVElPTiB8IFBST1RPUFRfU1NMCkBAIC0xNTcsNTggKzE2MCw2IEBACiB9OwogI2VuZGlmCiAKLSNpZm5kZWYgQ1VSTF9ESVNBQkxFX0hUVFAKLS8qCi0gKiBIVFRQLXByb3h5ZWQgU01UUCBwcm90b2NvbCBoYW5kbGVyLgotICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgQ3VybF9oYW5kbGVyIEN1cmxfaGFuZGxlcl9zbXRwX3Byb3h5ID0gewotICAiU01UUCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjaGVtZSAqLwotICBDdXJsX2h0dHBfc2V0dXBfY29ubiwgICAgICAgICAgICAgICAgIC8qIHNldHVwX2Nvbm5lY3Rpb24gKi8KLSAgQ3VybF9odHRwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb19pdCAqLwotICBDdXJsX2h0dHBfZG9uZSwgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb19tb3JlICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdF9pdCAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3RpbmcgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb2luZyAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb2luZ19nZXRzb2NrICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9tb3JlX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCi0gIFBPUlRfU01UUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwotICBDVVJMUFJPVE9fSFRUUCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCi0gIFBST1RPUFRfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8KLX07Ci0KLSNpZmRlZiBVU0VfU1NMCi0vKgotICogSFRUUC1wcm94eWVkIFNNVFBTIHByb3RvY29sIGhhbmRsZXIuCi0gKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBDdXJsX2hhbmRsZXIgQ3VybF9oYW5kbGVyX3NtdHBzX3Byb3h5ID0gewotICAiU01UUFMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjaGVtZSAqLwotICBDdXJsX2h0dHBfc2V0dXBfY29ubiwgICAgICAgICAgICAgICAgIC8qIHNldHVwX2Nvbm5lY3Rpb24gKi8KLSAgQ3VybF9odHRwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb19pdCAqLwotICBDdXJsX2h0dHBfZG9uZSwgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbmUgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb19tb3JlICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdF9pdCAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3RpbmcgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb2luZyAqLwotICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb2luZ19nZXRzb2NrICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9tb3JlX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KLSAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCi0gIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCi0gIFBPUlRfU01UUFMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwotICBDVVJMUFJPVE9fSFRUUCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCi0gIFBST1RPUFRfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8KLX07Ci0jZW5kaWYKLSNlbmRpZgotCiAvKiBTQVNMIHBhcmFtZXRlcnMgZm9yIHRoZSBzbXRwIHByb3RvY29sICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IFNBU0xwcm90byBzYXNsc210cCA9IHsKICAgInNtdHAiLCAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBzZXJ2aWNlIG5hbWUgKi8KQEAgLTU4MCw4ICs1MzEsNDAgQEAKICAgICB9CiAgIH0KIAorICAvKiBQcmVwYXJlIHRoZSBtaW1lIGRhdGEgaWYgc29tZS4gKi8KKyAgaWYoZGF0YS0+c2V0Lm1pbWVwb3N0LmtpbmQgIT0gTUlNRUtJTkRfTk9ORSkgeworICAgIC8qIFVzZSB0aGUgd2hvbGUgc3RydWN0dXJlIGFzIGRhdGEuICovCisgICAgZGF0YS0+c2V0Lm1pbWVwb3N0LmZsYWdzICY9IH5NSU1FX0JPRFlfT05MWTsKKworICAgIC8qIEFkZCBleHRlcm5hbCBoZWFkZXJzIGFuZCBtaW1lIHZlcnNpb24uICovCisgICAgY3VybF9taW1lX2hlYWRlcnMoJmRhdGEtPnNldC5taW1lcG9zdCwgZGF0YS0+c2V0LmhlYWRlcnMsIDApOworICAgIHJlc3VsdCA9IEN1cmxfbWltZV9wcmVwYXJlX2hlYWRlcnMoJmRhdGEtPnNldC5taW1lcG9zdCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE1JTUVTVFJBVEVHWV9NQUlMKTsKKworICAgIGlmKCFyZXN1bHQpCisgICAgICBpZighQ3VybF9jaGVja2hlYWRlcnMoY29ubiwgIk1pbWUtVmVyc2lvbiIpKQorICAgICAgICByZXN1bHQgPSBDdXJsX21pbWVfYWRkX2hlYWRlcigmZGF0YS0+c2V0Lm1pbWVwb3N0LmN1cmxoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWltZS1WZXJzaW9uOiAxLjAiKTsKKworICAgIC8qIE1ha2Ugc3VyZSB3ZSB3aWxsIHJlYWQgdGhlIGVudGlyZSBtaW1lIHN0cnVjdHVyZS4gKi8KKyAgICBpZighcmVzdWx0KQorICAgICAgcmVzdWx0ID0gQ3VybF9taW1lX3Jld2luZCgmZGF0YS0+c2V0Lm1pbWVwb3N0KTsKKworICAgIGlmKHJlc3VsdCkgeworICAgICAgZnJlZShmcm9tKTsKKyAgICAgIGZyZWUoYXV0aCk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGRhdGEtPnN0YXRlLmluZmlsZXNpemUgPSBDdXJsX21pbWVfc2l6ZSgmZGF0YS0+c2V0Lm1pbWVwb3N0KTsKKworICAgIC8qIFJlYWQgZnJvbSBtaW1lIHN0cnVjdHVyZS4gKi8KKyAgICBkYXRhLT5zdGF0ZS5mcmVhZF9mdW5jID0gKGN1cmxfcmVhZF9jYWxsYmFjaykgQ3VybF9taW1lX3JlYWQ7CisgICAgZGF0YS0+c3RhdGUuaW4gPSAodm9pZCAqKSAmZGF0YS0+c2V0Lm1pbWVwb3N0OworICB9CisKICAgLyogQ2FsY3VsYXRlIHRoZSBvcHRpb25hbCBTSVpFIHBhcmFtZXRlciAqLwotICBpZihjb25uLT5wcm90by5zbXRwYy5zaXplX3N1cHBvcnRlZCAmJiBjb25uLT5kYXRhLT5zdGF0ZS5pbmZpbGVzaXplID4gMCkgeworICBpZihjb25uLT5wcm90by5zbXRwYy5zaXplX3N1cHBvcnRlZCAmJiBkYXRhLT5zdGF0ZS5pbmZpbGVzaXplID4gMCkgewogICAgIHNpemUgPSBhcHJpbnRmKCIlIiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9ULCBkYXRhLT5zdGF0ZS5pbmZpbGVzaXplKTsKIAogICAgIGlmKCFzaXplKSB7CkBAIC0xMjA5LDcgKzExOTIsOCBAQAogICAgIGNvbm5jbG9zZShjb25uLCAiU01UUCBkb25lIHdpdGggYmFkIHN0YXR1cyIpOyAvKiBtYXJrZWQgZm9yIGNsb3N1cmUgKi8KICAgICByZXN1bHQgPSBzdGF0dXM7ICAgICAgICAgLyogdXNlIHRoZSBhbHJlYWR5IHNldCBlcnJvciBjb2RlICovCiAgIH0KLSAgZWxzZSBpZighZGF0YS0+c2V0LmNvbm5lY3Rfb25seSAmJiBkYXRhLT5zZXQudXBsb2FkICYmIGRhdGEtPnNldC5tYWlsX3JjcHQpIHsKKyAgZWxzZSBpZighZGF0YS0+c2V0LmNvbm5lY3Rfb25seSAmJiBkYXRhLT5zZXQubWFpbF9yY3B0ICYmCisgICAgICAgICAgKGRhdGEtPnNldC51cGxvYWQgfHwgZGF0YS0+c2V0Lm1pbWVwb3N0LmtpbmQpKSB7CiAgICAgLyogQ2FsY3VsYXRlIHRoZSBFT0IgdGFraW5nIGludG8gYWNjb3VudCBhbnkgdGVybWluYXRpbmcgQ1JMRiBmcm9tIHRoZQogICAgICAgIHByZXZpb3VzIGxpbmUgb2YgdGhlIGVtYWlsIG9yIHRoZSBDUkxGIG9mIHRoZSBEQVRBIGNvbW1hbmQgd2hlbiB0aGVyZQogICAgICAgIGlzICJubyBtYWlsIGRhdGEiLiBSRkMtNTMyMSwgc2VjdC4gNC4xLjEuNC4KQEAgLTEyOTksNyArMTI4Myw3IEBACiAgIHNtdHAtPnJjcHQgPSBkYXRhLT5zZXQubWFpbF9yY3B0OwogCiAgIC8qIFN0YXJ0IHRoZSBmaXJzdCBjb21tYW5kIGluIHRoZSBETyBwaGFzZSAqLwotICBpZihkYXRhLT5zZXQudXBsb2FkICYmIGRhdGEtPnNldC5tYWlsX3JjcHQpCisgIGlmKChkYXRhLT5zZXQudXBsb2FkIHx8IGRhdGEtPnNldC5taW1lcG9zdC5raW5kKSAmJiBkYXRhLT5zZXQubWFpbF9yY3B0KQogICAgIC8qIE1BSUwgdHJhbnNmZXIgKi8KICAgICByZXN1bHQgPSBzbXRwX3BlcmZvcm1fbWFpbChjb25uKTsKICAgZWxzZQpAQCAtMTQ1MSwzMCArMTQzNSw2IEBACiAgIC8qIENsZWFyIHRoZSBUTFMgdXBncmFkZWQgZmxhZyAqLwogICBjb25uLT50bHNfdXBncmFkZWQgPSBGQUxTRTsKIAotICAvKiBTZXQgdXAgdGhlIHByb3h5IGlmIG5lY2Vzc2FyeSAqLwotICBpZihjb25uLT5iaXRzLmh0dHBwcm94eSAmJiAhZGF0YS0+c2V0LnR1bm5lbF90aHJ1X2h0dHBwcm94eSkgewotICAgIC8qIFVubGVzcyB3ZSBoYXZlIGFza2VkIHRvIHR1bm5lbCBTTVRQIG9wZXJhdGlvbnMgdGhyb3VnaCB0aGUgcHJveHksIHdlCi0gICAgICAgc3dpdGNoIGFuZCB1c2UgSFRUUCBvcGVyYXRpb25zIG9ubHkgKi8KLSNpZm5kZWYgQ1VSTF9ESVNBQkxFX0hUVFAKLSAgICBpZihjb25uLT5oYW5kbGVyID09ICZDdXJsX2hhbmRsZXJfc210cCkKLSAgICAgIGNvbm4tPmhhbmRsZXIgPSAmQ3VybF9oYW5kbGVyX3NtdHBfcHJveHk7Ci0gICAgZWxzZSB7Ci0jaWZkZWYgVVNFX1NTTAotICAgICAgY29ubi0+aGFuZGxlciA9ICZDdXJsX2hhbmRsZXJfc210cHNfcHJveHk7Ci0jZWxzZQotICAgICAgZmFpbGYoZGF0YSwgIlNNVFBTIG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgICByZXR1cm4gQ1VSTEVfVU5TVVBQT1JURURfUFJPVE9DT0w7Ci0jZW5kaWYKLSAgICB9Ci0gICAgLyogc2V0IGl0IHVwIGFzIGEgSFRUUCBjb25uZWN0aW9uIGluc3RlYWQgKi8KLSAgICByZXR1cm4gY29ubi0+aGFuZGxlci0+c2V0dXBfY29ubmVjdGlvbihjb25uKTsKLQotI2Vsc2UKLSAgICBmYWlsZihkYXRhLCAiU01UUCBvdmVyIGh0dHAgcHJveHkgcmVxdWlyZXMgSFRUUCBzdXBwb3J0IGJ1aWx0LWluISIpOwotICAgIHJldHVybiBDVVJMRV9VTlNVUFBPUlRFRF9QUk9UT0NPTDsKLSNlbmRpZgotICB9Ci0KICAgLyogSW5pdGlhbGlzZSB0aGUgU01UUCBsYXllciAqLwogICByZXN1bHQgPSBzbXRwX2luaXQoY29ubik7CiAgIGlmKHJlc3VsdCkKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NvY2tzLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zb2Nrcy5jCmluZGV4IDk3YTQ0YjIuLmU2NGNiOTggMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NvY2tzLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc29ja3MuYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtMTA1LDcgKzEwNSw3IEBACiAqICAgU2V0IHByb3RvY29sNGE9dHJ1ZSBmb3IgICJTT0NLUyA0QSAoU2ltcGxlIEV4dGVuc2lvbiB0byBTT0NLUyA0IFByb3RvY29sKSIKICogICBOb25zdXBwb3J0ICJJZGVudGlmaWNhdGlvbiBQcm90b2NvbCAoUkZDMTQxMykiCiAqLwotQ1VSTGNvZGUgQ3VybF9TT0NLUzQoY29uc3QgY2hhciAqcHJveHlfbmFtZSwKK0NVUkxjb2RlIEN1cmxfU09DS1M0KGNvbnN0IGNoYXIgKnByb3h5X3VzZXIsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpob3N0bmFtZSwKICAgICAgICAgICAgICAgICAgICAgIGludCByZW1vdGVfcG9ydCwKICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsCkBAIC0xNTQsNyArMTU0LDcgQEAKICAgLyogRE5TIHJlc29sdmUgb25seSBmb3IgU09DS1M0LCBub3QgU09DS1M0YSAqLwogICBpZighcHJvdG9jb2w0YSkgewogICAgIHN0cnVjdCBDdXJsX2Ruc19lbnRyeSAqZG5zOwotICAgIEN1cmxfYWRkcmluZm8gKmhwPU5VTEw7CisgICAgQ3VybF9hZGRyaW5mbyAqaHAgPSBOVUxMOwogICAgIGludCByYzsKIAogICAgIHJjID0gQ3VybF9yZXNvbHYoY29ubiwgaG9zdG5hbWUsIHJlbW90ZV9wb3J0LCAmZG5zKTsKQEAgLTE3MSw3ICsxNzEsNyBAQAogICAgICAqIHJldHVybnMgYSBDdXJsX2FkZHJpbmZvIHBvaW50ZXIgdGhhdCBtYXkgbm90IGFsd2F5cyBsb29rIHRoZSBzYW1lLgogICAgICAqLwogICAgIGlmKGRucykKLSAgICAgIGhwPWRucy0+YWRkcjsKKyAgICAgIGhwID0gZG5zLT5hZGRyOwogICAgIGlmKGhwKSB7CiAgICAgICBjaGFyIGJ1Zls2NF07CiAgICAgICBDdXJsX3ByaW50YWJsZV9hZGRyZXNzKGhwLCBidWYsIHNpemVvZihidWYpKTsKQEAgLTIwNiwxNCArMjA2LDE0IEBACiAgICAqIFRoaXMgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0aW5nICJJZGVudGlmaWNhdGlvbiBQcm90b2NvbCAoUkZDMTQxMykiLgogICAgKi8KICAgc29ja3NyZXFbOF0gPSAwOyAvKiBlbnN1cmUgZW1wdHkgdXNlcmlkIGlzIE5VTC10ZXJtaW5hdGVkICovCi0gIGlmKHByb3h5X25hbWUpIHsKLSAgICBzaXplX3QgcGxlbiA9IHN0cmxlbihwcm94eV9uYW1lKTsKKyAgaWYocHJveHlfdXNlcikgeworICAgIHNpemVfdCBwbGVuID0gc3RybGVuKHByb3h5X3VzZXIpOwogICAgIGlmKHBsZW4gPj0gc2l6ZW9mKHNvY2tzcmVxKSAtIDgpIHsKICAgICAgIGZhaWxmKGRhdGEsICJUb28gbG9uZyBTT0NLUyBwcm94eSBuYW1lLCBjYW4ndCB1c2UhXG4iKTsKICAgICAgIHJldHVybiBDVVJMRV9DT1VMRE5UX0NPTk5FQ1Q7CiAgICAgfQogICAgIC8qIGNvcHkgdGhlIHByb3h5IG5hbWUgV0lUSCB0cmFpbGluZyB6ZXJvICovCi0gICAgbWVtY3B5KHNvY2tzcmVxICsgOCwgcHJveHlfbmFtZSwgcGxlbisxKTsKKyAgICBtZW1jcHkoc29ja3NyZXEgKyA4LCBwcm94eV91c2VyLCBwbGVuICsgMSk7CiAgIH0KIAogICAvKgpAQCAtMzA2LDcgKzMwNiw3IEBACiAgICAgICAgICAgICAiLCByZXF1ZXN0IHJlamVjdGVkIG9yIGZhaWxlZC4iLAogICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbNF0sICh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzVdLAogICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbNl0sICh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzddLAotICAgICAgICAgICAgKCgodW5zaWduZWQgY2hhcilzb2Nrc3JlcVs4XSA8PCA4KSB8ICh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzldKSwKKyAgICAgICAgICAgICgoKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbMl0gPDwgOCkgfCAodW5zaWduZWQgY2hhcilzb2Nrc3JlcVszXSksCiAgICAgICAgICAgICAodW5zaWduZWQgY2hhcilzb2Nrc3JlcVsxXSk7CiAgICAgICByZXR1cm4gQ1VSTEVfQ09VTEROVF9DT05ORUNUOwogICAgIGNhc2UgOTI6CkBAIC0zMTYsNyArMzE2LDcgQEAKICAgICAgICAgICAgICJpZGVudGQgb24gdGhlIGNsaWVudC4iLAogICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbNF0sICh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzVdLAogICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbNl0sICh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzddLAotICAgICAgICAgICAgKCgodW5zaWduZWQgY2hhcilzb2Nrc3JlcVs4XSA8PCA4KSB8ICh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzldKSwKKyAgICAgICAgICAgICgoKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbMl0gPDwgOCkgfCAodW5zaWduZWQgY2hhcilzb2Nrc3JlcVszXSksCiAgICAgICAgICAgICAodW5zaWduZWQgY2hhcilzb2Nrc3JlcVsxXSk7CiAgICAgICByZXR1cm4gQ1VSTEVfQ09VTEROVF9DT05ORUNUOwogICAgIGNhc2UgOTM6CkBAIC0zMjYsNyArMzI2LDcgQEAKICAgICAgICAgICAgICJyZXBvcnQgZGlmZmVyZW50IHVzZXItaWRzLiIsCiAgICAgICAgICAgICAodW5zaWduZWQgY2hhcilzb2Nrc3JlcVs0XSwgKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbNV0sCiAgICAgICAgICAgICAodW5zaWduZWQgY2hhcilzb2Nrc3JlcVs2XSwgKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbN10sCi0gICAgICAgICAgICAoKCh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzhdIDw8IDgpIHwgKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbOV0pLAorICAgICAgICAgICAgKCgodW5zaWduZWQgY2hhcilzb2Nrc3JlcVsyXSA8PCA4KSB8ICh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzNdKSwKICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzFdKTsKICAgICAgIHJldHVybiBDVVJMRV9DT1VMRE5UX0NPTk5FQ1Q7CiAgICAgZGVmYXVsdDoKQEAgLTMzNSw3ICszMzUsNyBAQAogICAgICAgICAgICAgIiwgVW5rbm93bi4iLAogICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbNF0sICh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzVdLAogICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbNl0sICh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzddLAotICAgICAgICAgICAgKCgodW5zaWduZWQgY2hhcilzb2Nrc3JlcVs4XSA8PCA4KSB8ICh1bnNpZ25lZCBjaGFyKXNvY2tzcmVxWzldKSwKKyAgICAgICAgICAgICgoKHVuc2lnbmVkIGNoYXIpc29ja3NyZXFbMl0gPDwgOCkgfCAodW5zaWduZWQgY2hhcilzb2Nrc3JlcVszXSksCiAgICAgICAgICAgICAodW5zaWduZWQgY2hhcilzb2Nrc3JlcVsxXSk7CiAgICAgICByZXR1cm4gQ1VSTEVfQ09VTEROVF9DT05ORUNUOwogICAgIH0KQEAgLTM1MCw3ICszNTAsNyBAQAogICogVGhpcyBmdW5jdGlvbiBsb2dzIGluIHRvIGEgU09DS1M1IHByb3h5IGFuZCBzZW5kcyB0aGUgc3BlY2lmaWNzIHRvIHRoZSBmaW5hbAogICogZGVzdGluYXRpb24gc2VydmVyLgogICovCi1DVVJMY29kZSBDdXJsX1NPQ0tTNShjb25zdCBjaGFyICpwcm94eV9uYW1lLAorQ1VSTGNvZGUgQ3VybF9TT0NLUzUoY29uc3QgY2hhciAqcHJveHlfdXNlciwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnByb3h5X3Bhc3N3b3JkLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVtb3RlX3BvcnQsCkBAIC0zNzUsNiArMzc1LDcgQEAKICAgKi8KIAogICB1bnNpZ25lZCBjaGFyIHNvY2tzcmVxWzYwMF07IC8qIHJvb20gZm9yIGxhcmdlIHVzZXIvcHcgKDI1NSBtYXggZWFjaCkgKi8KKyAgaW50IGlkeDsKICAgc3NpemVfdCBhY3R1YWxyZWFkOwogICBzc2l6ZV90IHdyaXR0ZW47CiAgIGludCByZXN1bHQ7CkBAIC0zODYsNiArMzg3LDggQEAKICAgICAoY29ubi0+c29ja3NfcHJveHkucHJveHl0eXBlID09IENVUkxQUk9YWV9TT0NLUzUpID8gVFJVRSA6IEZBTFNFOwogICBjb25zdCBzaXplX3QgaG9zdG5hbWVfbGVuID0gc3RybGVuKGhvc3RuYW1lKTsKICAgc3NpemVfdCBsZW4gPSAwOworICBjb25zdCB1bnNpZ25lZCBsb25nIGF1dGggPSBkYXRhLT5zZXQuc29ja3M1YXV0aDsKKyAgYm9vbCBhbGxvd19nc3NhcGkgPSBGQUxTRTsKIAogICBpZihjb25uLT5iaXRzLmh0dHBwcm94eSkKICAgICBpbmZvZihjb25uLT5kYXRhLCAiU09DS1M1OiBjb25uZWN0aW5nIHRvIEhUVFAgcHJveHkgJXMgcG9ydCAlZFxuIiwKQEAgLTQyNiwxOCArNDI5LDI5IEBACiAgICAgcmV0dXJuIENVUkxFX0NPVUxETlRfQ09OTkVDVDsKICAgfQogCi0gIHNvY2tzcmVxWzBdID0gNTsgLyogdmVyc2lvbiAqLworICBpZihhdXRoICYgfihDVVJMQVVUSF9CQVNJQyB8IENVUkxBVVRIX0dTU0FQSSkpCisgICAgaW5mb2YoY29ubi0+ZGF0YSwKKyAgICAgICAgIndhcm5pbmc6IHVuc3VwcG9ydGVkIHZhbHVlIHBhc3NlZCB0byBDVVJMT1BUX1NPQ0tTNV9BVVRIOiAlbHVcbiIsCisgICAgICAgIGF1dGgpOworICBpZighKGF1dGggJiBDVVJMQVVUSF9CQVNJQykpCisgICAgLyogZGlzYWJsZSB1c2VybmFtZS9wYXNzd29yZCBhdXRoICovCisgICAgcHJveHlfdXNlciA9IE5VTEw7CiAjaWYgZGVmaW5lZChIQVZFX0dTU0FQSSkgfHwgZGVmaW5lZChVU0VfV0lORE9XU19TU1BJKQotICBzb2Nrc3JlcVsxXSA9IChjaGFyKShwcm94eV9uYW1lID8gMyA6IDIpOyAvKiBudW1iZXIgb2YgbWV0aG9kcyAoYmVsb3cpICovCi0gIHNvY2tzcmVxWzJdID0gMDsgLyogbm8gYXV0aGVudGljYXRpb24gKi8KLSAgc29ja3NyZXFbM10gPSAxOyAvKiBHU1MtQVBJICovCi0gIHNvY2tzcmVxWzRdID0gMjsgLyogdXNlcm5hbWUvcGFzc3dvcmQgKi8KLSNlbHNlCi0gIHNvY2tzcmVxWzFdID0gKGNoYXIpKHByb3h5X25hbWUgPyAyIDogMSk7IC8qIG51bWJlciBvZiBtZXRob2RzIChiZWxvdykgKi8KLSAgc29ja3NyZXFbMl0gPSAwOyAvKiBubyBhdXRoZW50aWNhdGlvbiAqLwotICBzb2Nrc3JlcVszXSA9IDI7IC8qIHVzZXJuYW1lL3Bhc3N3b3JkICovCisgIGlmKGF1dGggJiBDVVJMQVVUSF9HU1NBUEkpCisgICAgYWxsb3dfZ3NzYXBpID0gVFJVRTsKICNlbmRpZgogCisgIGlkeCA9IDA7CisgIHNvY2tzcmVxW2lkeCsrXSA9IDU7ICAgLyogdmVyc2lvbiAqLworICBpZHgrKzsgICAgICAgICAgICAgICAgIC8qIHJlc2VydmUgZm9yIHRoZSBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kcyAqLworICBzb2Nrc3JlcVtpZHgrK10gPSAwOyAgIC8qIG5vIGF1dGhlbnRpY2F0aW9uICovCisgIGlmKGFsbG93X2dzc2FwaSkKKyAgICBzb2Nrc3JlcVtpZHgrK10gPSAxOyAvKiBHU1MtQVBJICovCisgIGlmKHByb3h5X3VzZXIpCisgICAgc29ja3NyZXFbaWR4KytdID0gMjsgLyogdXNlcm5hbWUvcGFzc3dvcmQgKi8KKyAgLyogd3JpdGUgdGhlIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2RzICovCisgIHNvY2tzcmVxWzFdID0gKHVuc2lnbmVkIGNoYXIpIChpZHggLSAyKTsKKwogICAodm9pZCljdXJseF9ub25ibG9jayhzb2NrLCBGQUxTRSk7CiAKICAgaW5mb2YoZGF0YSwgIlNPQ0tTNSBjb21tdW5pY2F0aW9uIHRvICVzOiVkXG4iLCBob3N0bmFtZSwgcmVtb3RlX3BvcnQpOwpAQCAtNDY5LDcgKzQ4Myw3IEBACiAKICAgKHZvaWQpY3VybHhfbm9uYmxvY2soc29jaywgRkFMU0UpOwogCi0gIHJlc3VsdD1DdXJsX2Jsb2NrcmVhZF9hbGwoY29ubiwgc29jaywgKGNoYXIgKilzb2Nrc3JlcSwgMiwgJmFjdHVhbHJlYWQpOworICByZXN1bHQgPSBDdXJsX2Jsb2NrcmVhZF9hbGwoY29ubiwgc29jaywgKGNoYXIgKilzb2Nrc3JlcSwgMiwgJmFjdHVhbHJlYWQpOwogICBpZihyZXN1bHQgfHwgKGFjdHVhbHJlYWQgIT0gMikpIHsKICAgICBmYWlsZihkYXRhLCAiVW5hYmxlIHRvIHJlY2VpdmUgaW5pdGlhbCBTT0NLUzUgcmVzcG9uc2UuIik7CiAgICAgcmV0dXJuIENVUkxFX0NPVUxETlRfQ09OTkVDVDsKQEAgLTQ4NCw3ICs0OTgsNyBAQAogICAgIDsKICAgfQogI2lmIGRlZmluZWQoSEFWRV9HU1NBUEkpIHx8IGRlZmluZWQoVVNFX1dJTkRPV1NfU1NQSSkKLSAgZWxzZSBpZihzb2Nrc3JlcVsxXSA9PSAxKSB7CisgIGVsc2UgaWYoYWxsb3dfZ3NzYXBpICYmIChzb2Nrc3JlcVsxXSA9PSAxKSkgewogICAgIGNvZGUgPSBDdXJsX1NPQ0tTNV9nc3NhcGlfbmVnb3RpYXRlKHNvY2tpbmRleCwgY29ubik7CiAgICAgaWYoY29kZSkgewogICAgICAgZmFpbGYoZGF0YSwgIlVuYWJsZSB0byBuZWdvdGlhdGUgU09DS1M1IEdTUy1BUEkgY29udGV4dC4iKTsKQEAgLTQ5NCwxMyArNTA4LDEzIEBACiAjZW5kaWYKICAgZWxzZSBpZihzb2Nrc3JlcVsxXSA9PSAyKSB7CiAgICAgLyogTmVlZHMgdXNlciBuYW1lIGFuZCBwYXNzd29yZCAqLwotICAgIHNpemVfdCBwcm94eV9uYW1lX2xlbiwgcHJveHlfcGFzc3dvcmRfbGVuOwotICAgIGlmKHByb3h5X25hbWUgJiYgcHJveHlfcGFzc3dvcmQpIHsKLSAgICAgIHByb3h5X25hbWVfbGVuID0gc3RybGVuKHByb3h5X25hbWUpOworICAgIHNpemVfdCBwcm94eV91c2VyX2xlbiwgcHJveHlfcGFzc3dvcmRfbGVuOworICAgIGlmKHByb3h5X3VzZXIgJiYgcHJveHlfcGFzc3dvcmQpIHsKKyAgICAgIHByb3h5X3VzZXJfbGVuID0gc3RybGVuKHByb3h5X3VzZXIpOwogICAgICAgcHJveHlfcGFzc3dvcmRfbGVuID0gc3RybGVuKHByb3h5X3Bhc3N3b3JkKTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICBwcm94eV9uYW1lX2xlbiA9IDA7CisgICAgICBwcm94eV91c2VyX2xlbiA9IDA7CiAgICAgICBwcm94eV9wYXNzd29yZF9sZW4gPSAwOwogICAgIH0KIApAQCAtNTEzLDEwICs1MjcsMTAgQEAKICAgICAgKi8KICAgICBsZW4gPSAwOwogICAgIHNvY2tzcmVxW2xlbisrXSA9IDE7ICAgIC8qIHVzZXJuYW1lL3B3IHN1Ym5lZ290aWF0aW9uIHZlcnNpb24gKi8KLSAgICBzb2Nrc3JlcVtsZW4rK10gPSAodW5zaWduZWQgY2hhcikgcHJveHlfbmFtZV9sZW47Ci0gICAgaWYocHJveHlfbmFtZSAmJiBwcm94eV9uYW1lX2xlbikKLSAgICAgIG1lbWNweShzb2Nrc3JlcSArIGxlbiwgcHJveHlfbmFtZSwgcHJveHlfbmFtZV9sZW4pOwotICAgIGxlbiArPSBwcm94eV9uYW1lX2xlbjsKKyAgICBzb2Nrc3JlcVtsZW4rK10gPSAodW5zaWduZWQgY2hhcikgcHJveHlfdXNlcl9sZW47CisgICAgaWYocHJveHlfdXNlciAmJiBwcm94eV91c2VyX2xlbikKKyAgICAgIG1lbWNweShzb2Nrc3JlcSArIGxlbiwgcHJveHlfdXNlciwgcHJveHlfdXNlcl9sZW4pOworICAgIGxlbiArPSBwcm94eV91c2VyX2xlbjsKICAgICBzb2Nrc3JlcVtsZW4rK10gPSAodW5zaWduZWQgY2hhcikgcHJveHlfcGFzc3dvcmRfbGVuOwogICAgIGlmKHByb3h5X3Bhc3N3b3JkICYmIHByb3h5X3Bhc3N3b3JkX2xlbikKICAgICAgIG1lbWNweShzb2Nrc3JlcSArIGxlbiwgcHJveHlfcGFzc3dvcmQsIHByb3h5X3Bhc3N3b3JkX2xlbik7CkBAIC01MjgsNyArNTQyLDcgQEAKICAgICAgIHJldHVybiBDVVJMRV9DT1VMRE5UX0NPTk5FQ1Q7CiAgICAgfQogCi0gICAgcmVzdWx0PUN1cmxfYmxvY2tyZWFkX2FsbChjb25uLCBzb2NrLCAoY2hhciAqKXNvY2tzcmVxLCAyLCAmYWN0dWFscmVhZCk7CisgICAgcmVzdWx0ID0gQ3VybF9ibG9ja3JlYWRfYWxsKGNvbm4sIHNvY2ssIChjaGFyICopc29ja3NyZXEsIDIsICZhY3R1YWxyZWFkKTsKICAgICBpZihyZXN1bHQgfHwgKGFjdHVhbHJlYWQgIT0gMikpIHsKICAgICAgIGZhaWxmKGRhdGEsICJVbmFibGUgdG8gcmVjZWl2ZSBTT0NLUzUgc3ViLW5lZ290aWF0aW9uIHJlc3BvbnNlLiIpOwogICAgICAgcmV0dXJuIENVUkxFX0NPVUxETlRfQ09OTkVDVDsKQEAgLTU0NSwxNyArNTU5LDEzIEBACiAgIH0KICAgZWxzZSB7CiAgICAgLyogZXJyb3IgKi8KLSNpZiBkZWZpbmVkKEhBVkVfR1NTQVBJKSB8fCBkZWZpbmVkKFVTRV9XSU5ET1dTX1NTUEkpCi0gICAgaWYoc29ja3NyZXFbMV0gPT0gMjU1KSB7Ci0jZWxzZQotICAgIGlmKHNvY2tzcmVxWzFdID09IDEpIHsKKyAgICBpZighYWxsb3dfZ3NzYXBpICYmIChzb2Nrc3JlcVsxXSA9PSAxKSkgewogICAgICAgZmFpbGYoZGF0YSwKICAgICAgICAgICAgICJTT0NLUzUgR1NTQVBJIHBlci1tZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuIik7CiAgICAgICByZXR1cm4gQ1VSTEVfQ09VTEROVF9DT05ORUNUOwogICAgIH0KICAgICBpZihzb2Nrc3JlcVsxXSA9PSAyNTUpIHsKLSNlbmRpZgotICAgICAgaWYoIXByb3h5X25hbWUgfHwgISpwcm94eV9uYW1lKSB7CisgICAgICBpZighcHJveHlfdXNlciB8fCAhKnByb3h5X3VzZXIpIHsKICAgICAgICAgZmFpbGYoZGF0YSwKICAgICAgICAgICAgICAgIk5vIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCB3YXMgYWNjZXB0YWJsZS4gKEl0IGlzIHF1aXRlIGxpa2VseSIKICAgICAgICAgICAgICAgIiB0aGF0IHRoZSBTT0NLUzUgc2VydmVyIHdhbnRlZCBhIHVzZXJuYW1lL3Bhc3N3b3JkLCBzaW5jZSBub25lIgpAQCAtNjA1LDcgKzYxNSw3IEBACiAgICAgICogcmV0dXJucyBhIEN1cmxfYWRkcmluZm8gcG9pbnRlciB0aGF0IG1heSBub3QgYWx3YXlzIGxvb2sgdGhlIHNhbWUuCiAgICAgICovCiAgICAgaWYoZG5zKQotICAgICAgaHA9ZG5zLT5hZGRyOworICAgICAgaHAgPSBkbnMtPmFkZHI7CiAgICAgaWYoaHApIHsKICAgICAgIGludCBpOwogICAgICAgY2hhciBidWZbNjRdOwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc29ja3NfZ3NzYXBpLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zb2Nrc19nc3NhcGkuYwppbmRleCA1NGQwNjM1Li45Njk0OGFjIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zb2Nrc19nc3NhcGkuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zb2Nrc19nc3NhcGkuYwpAQCAtNSw4ICs1LDggQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTEsIE1hcmt1cyBNb2VsbGVyLCA8bWFya3VzX21vZWxsZXJAY29tcHVzZXJ2ZS5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAyMDA5LCBNYXJrdXMgTW9lbGxlciwgPG1hcmt1c19tb2VsbGVyQGNvbXB1c2VydmUuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEyIC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtNjUsNyArNjUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1zZ19jdHgsICZzdGF0dXNfc3RyaW5nKTsKICAgICAgIGlmKG1hal9zdGF0ID09IEdTU19TX0NPTVBMRVRFKSB7CiAgICAgICAgIGlmKHNpemVvZihidWYpID4gbGVuICsgc3RhdHVzX3N0cmluZy5sZW5ndGggKyAxKSB7Ci0gICAgICAgICAgc3RyY3B5KGJ1ZitsZW4sIChjaGFyICopIHN0YXR1c19zdHJpbmcudmFsdWUpOworICAgICAgICAgIHN0cmNweShidWYgKyBsZW4sIChjaGFyICopIHN0YXR1c19zdHJpbmcudmFsdWUpOwogICAgICAgICAgIGxlbiArPSBzdGF0dXNfc3RyaW5nLmxlbmd0aDsKICAgICAgICAgfQogICAgICAgICBnc3NfcmVsZWFzZV9idWZmZXIoJm1pbl9zdGF0LCAmc3RhdHVzX3N0cmluZyk7CkBAIC03NCw3ICs3NCw3IEBACiAgICAgICBnc3NfcmVsZWFzZV9idWZmZXIoJm1pbl9zdGF0LCAmc3RhdHVzX3N0cmluZyk7CiAgICAgfQogICAgIGlmKHNpemVvZihidWYpID4gbGVuICsgMykgewotICAgICAgc3RyY3B5KGJ1ZitsZW4sICIuXG4iKTsKKyAgICAgIHN0cmNweShidWYgKyBsZW4sICIuXG4iKTsKICAgICAgIGxlbiArPSAyOwogICAgIH0KICAgICBtc2dfY3R4ID0gMDsKQEAgLTg2LDcgKzg2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtc2dfY3R4LCAmc3RhdHVzX3N0cmluZyk7CiAgICAgICBpZihtYWpfc3RhdCA9PSBHU1NfU19DT01QTEVURSkgewogICAgICAgICBpZihzaXplb2YoYnVmKSA+IGxlbiArIHN0YXR1c19zdHJpbmcubGVuZ3RoKQotICAgICAgICAgIHN0cmNweShidWYrbGVuLCAoY2hhciAqKSBzdGF0dXNfc3RyaW5nLnZhbHVlKTsKKyAgICAgICAgICBzdHJjcHkoYnVmICsgbGVuLCAoY2hhciAqKSBzdGF0dXNfc3RyaW5nLnZhbHVlKTsKICAgICAgICAgZ3NzX3JlbGVhc2VfYnVmZmVyKCZtaW5fc3RhdCwgJnN0YXR1c19zdHJpbmcpOwogICAgICAgICBicmVhazsKICAgICAgIH0KQEAgLTExOSw3ICsxMTksNyBAQAogICBnc3NfbmFtZV90ICAgICAgIHNlcnZlciA9IEdTU19DX05PX05BTUU7CiAgIGdzc19uYW1lX3QgICAgICAgZ3NzX2NsaWVudF9uYW1lID0gR1NTX0NfTk9fTkFNRTsKICAgdW5zaWduZWQgc2hvcnQgICB1c19sZW5ndGg7Ci0gIGNoYXIgICAgICAgICAgICAgKnVzZXI9TlVMTDsKKyAgY2hhciAgICAgICAgICAgICAqdXNlciA9IE5VTEw7CiAgIHVuc2lnbmVkIGNoYXIgc29ja3NyZXFbNF07IC8qIHJvb20gZm9yIEdTUy1BUEkgZXhjaGFuZ2UgaGVhZGVyIG9ubHkgKi8KICAgY29uc3QgY2hhciAqc2VydmljZXB0ciA9IGRhdGEtPnNldC5zdHJbU1RSSU5HX1BST1hZX1NFUlZJQ0VfTkFNRV0gPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+c2V0LnN0cltTVFJJTkdfUFJPWFlfU0VSVklDRV9OQU1FXSA6ICJyY21kIjsKQEAgLTE0NiwxMSArMTQ2LDEyIEBACiAgIH0KICAgZWxzZSB7CiAgICAgc2VydmljZS52YWx1ZSA9IG1hbGxvYyhzZXJ2aWNlcHRyX2xlbmd0aCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oY29ubi0+c29ja3NfcHJveHkuaG9zdC5uYW1lKSsyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihjb25uLT5zb2Nrc19wcm94eS5ob3N0Lm5hbWUpICsgMik7CiAgICAgaWYoIXNlcnZpY2UudmFsdWUpCiAgICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKLSAgICBzZXJ2aWNlLmxlbmd0aCA9IHNlcnZpY2VwdHJfbGVuZ3RoICsgc3RybGVuKGNvbm4tPnNvY2tzX3Byb3h5Lmhvc3QubmFtZSkrMTsKLSAgICBzbnByaW50ZihzZXJ2aWNlLnZhbHVlLCBzZXJ2aWNlLmxlbmd0aCsxLCAiJXNAJXMiLAorICAgIHNlcnZpY2UubGVuZ3RoID0gc2VydmljZXB0cl9sZW5ndGggKworICAgICAgc3RybGVuKGNvbm4tPnNvY2tzX3Byb3h5Lmhvc3QubmFtZSkgKyAxOworICAgIHNucHJpbnRmKHNlcnZpY2UudmFsdWUsIHNlcnZpY2UubGVuZ3RoICsgMSwgIiVzQCVzIiwKICAgICAgICAgICAgICBzZXJ2aWNlcHRyLCBjb25uLT5zb2Nrc19wcm94eS5ob3N0Lm5hbWUpOwogCiAgICAgZ3NzX21ham9yX3N0YXR1cyA9IGdzc19pbXBvcnRfbmFtZSgmZ3NzX21pbm9yX3N0YXR1cywgJnNlcnZpY2UsCkBAIC0xOTYsNyArMTk3LDcgQEAKICAgICAgIHNvY2tzcmVxWzBdID0gMTsgICAgLyogR1NTLUFQSSBzdWJuZWdvdGlhdGlvbiB2ZXJzaW9uICovCiAgICAgICBzb2Nrc3JlcVsxXSA9IDE7ICAgIC8qIGF1dGhlbnRpY2F0aW9uIG1lc3NhZ2UgdHlwZSAqLwogICAgICAgdXNfbGVuZ3RoID0gaHRvbnMoKHNob3J0KWdzc19zZW5kX3Rva2VuLmxlbmd0aCk7Ci0gICAgICBtZW1jcHkoc29ja3NyZXErMiwgJnVzX2xlbmd0aCwgc2l6ZW9mKHNob3J0KSk7CisgICAgICBtZW1jcHkoc29ja3NyZXEgKyAyLCAmdXNfbGVuZ3RoLCBzaXplb2Yoc2hvcnQpKTsKIAogICAgICAgY29kZSA9IEN1cmxfd3JpdGVfcGxhaW4oY29ubiwgc29jaywgKGNoYXIgKilzb2Nrc3JlcSwgNCwgJndyaXR0ZW4pOwogICAgICAgaWYoY29kZSB8fCAoNCAhPSB3cml0dGVuKSkgewpAQCAtMjM2LDcgKzIzNyw3IEBACiAgICAgICogKy0tLS0rLS0tLS0tKy0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCiAgICAgICovCiAKLSAgICByZXN1bHQ9Q3VybF9ibG9ja3JlYWRfYWxsKGNvbm4sIHNvY2ssIChjaGFyICopc29ja3NyZXEsIDQsICZhY3R1YWxyZWFkKTsKKyAgICByZXN1bHQgPSBDdXJsX2Jsb2NrcmVhZF9hbGwoY29ubiwgc29jaywgKGNoYXIgKilzb2Nrc3JlcSwgNCwgJmFjdHVhbHJlYWQpOwogICAgIGlmKHJlc3VsdCB8fCAoYWN0dWFscmVhZCAhPSA0KSkgewogICAgICAgZmFpbGYoZGF0YSwgIkZhaWxlZCB0byByZWNlaXZlIEdTUy1BUEkgYXV0aGVudGljYXRpb24gcmVzcG9uc2UuIik7CiAgICAgICBnc3NfcmVsZWFzZV9uYW1lKCZnc3Nfc3RhdHVzLCAmc2VydmVyKTsKQEAgLTI2MSwxMSArMjYyLDExIEBACiAgICAgICByZXR1cm4gQ1VSTEVfQ09VTEROVF9DT05ORUNUOwogICAgIH0KIAotICAgIG1lbWNweSgmdXNfbGVuZ3RoLCBzb2Nrc3JlcSsyLCBzaXplb2Yoc2hvcnQpKTsKKyAgICBtZW1jcHkoJnVzX2xlbmd0aCwgc29ja3NyZXEgKyAyLCBzaXplb2Yoc2hvcnQpKTsKICAgICB1c19sZW5ndGggPSBudG9ocyh1c19sZW5ndGgpOwogCi0gICAgZ3NzX3JlY3ZfdG9rZW4ubGVuZ3RoPXVzX2xlbmd0aDsKLSAgICBnc3NfcmVjdl90b2tlbi52YWx1ZT1tYWxsb2ModXNfbGVuZ3RoKTsKKyAgICBnc3NfcmVjdl90b2tlbi5sZW5ndGggPSB1c19sZW5ndGg7CisgICAgZ3NzX3JlY3ZfdG9rZW4udmFsdWUgPSBtYWxsb2ModXNfbGVuZ3RoKTsKICAgICBpZighZ3NzX3JlY3ZfdG9rZW4udmFsdWUpIHsKICAgICAgIGZhaWxmKGRhdGEsCiAgICAgICAgICAgICAiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgR1NTLUFQSSBhdXRoZW50aWNhdGlvbiAiCkBAIC0yNzUsOCArMjc2LDggQEAKICAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogICAgIH0KIAotICAgIHJlc3VsdD1DdXJsX2Jsb2NrcmVhZF9hbGwoY29ubiwgc29jaywgKGNoYXIgKilnc3NfcmVjdl90b2tlbi52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzc19yZWN2X3Rva2VuLmxlbmd0aCwgJmFjdHVhbHJlYWQpOworICAgIHJlc3VsdCA9IEN1cmxfYmxvY2tyZWFkX2FsbChjb25uLCBzb2NrLCAoY2hhciAqKWdzc19yZWN2X3Rva2VuLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3NfcmVjdl90b2tlbi5sZW5ndGgsICZhY3R1YWxyZWFkKTsKIAogICAgIGlmKHJlc3VsdCB8fCAoYWN0dWFscmVhZCAhPSB1c19sZW5ndGgpKSB7CiAgICAgICBmYWlsZihkYXRhLCAiRmFpbGVkIHRvIHJlY2VpdmUgR1NTLUFQSSBhdXRoZW50aWNhdGlvbiB0b2tlbi4iKTsKQEAgLTMxMiw3ICszMTMsNyBAQAogICAgIGZhaWxmKGRhdGEsICJGYWlsZWQgdG8gZGV0ZXJtaW5lIHVzZXIgbmFtZS4iKTsKICAgICByZXR1cm4gQ1VSTEVfQ09VTEROVF9DT05ORUNUOwogICB9Ci0gIHVzZXI9bWFsbG9jKGdzc19zZW5kX3Rva2VuLmxlbmd0aCsxKTsKKyAgdXNlciA9IG1hbGxvYyhnc3Nfc2VuZF90b2tlbi5sZW5ndGggKyAxKTsKICAgaWYoIXVzZXIpIHsKICAgICBnc3NfZGVsZXRlX3NlY19jb250ZXh0KCZnc3Nfc3RhdHVzLCAmZ3NzX2NvbnRleHQsIE5VTEwpOwogICAgIGdzc19yZWxlYXNlX25hbWUoJmdzc19zdGF0dXMsICZnc3NfY2xpZW50X25hbWUpOwpAQCAtMzI2LDcgKzMyNyw3IEBACiAgIGdzc19yZWxlYXNlX2J1ZmZlcigmZ3NzX3N0YXR1cywgJmdzc19zZW5kX3Rva2VuKTsKICAgaW5mb2YoZGF0YSwgIlNPQ0tTNSBzZXJ2ZXIgYXV0aGVuY3RpY2F0ZWQgdXNlciAlcyB3aXRoIEdTUy1BUEkuXG4iLHVzZXIpOwogICBmcmVlKHVzZXIpOwotICB1c2VyPU5VTEw7CisgIHVzZXIgPSBOVUxMOwogCiAgIC8qIERvIGVuY3J5cHRpb24gKi8KICAgc29ja3NyZXFbMF0gPSAxOyAgICAvKiBHU1MtQVBJIHN1Ym5lZ290aWF0aW9uIHZlcnNpb24gKi8KQEAgLTM0MSw3ICszNDIsNyBAQAogICAgIGdzc19lbmMgPSAxOwogCiAgIGluZm9mKGRhdGEsICJTT0NLUzUgc2VydmVyIHN1cHBvcnRzIEdTUy1BUEkgJXMgZGF0YSBwcm90ZWN0aW9uLlxuIiwKLSAgICAgICAgKGdzc19lbmM9PTApPyJubyI6KChnc3NfZW5jPT0xKT8iaW50ZWdyaXR5IjoiY29uZmlkZW50aWFsaXR5IikpOworICAgICAgICAoZ3NzX2VuYyA9PSAwKT8ibm8iOigoZ3NzX2VuYz09MSk/ImludGVncml0eSI6ImNvbmZpZGVudGlhbGl0eSIpKTsKICAgLyogZm9yY2UgZm9yIHRoZSBtb21lbnQgdG8gbm8gZGF0YSBwcm90ZWN0aW9uICovCiAgIGdzc19lbmMgPSAwOwogICAvKgpAQCAtMzc2LDcgKzM3Nyw3IEBACiAgICAqLwogICBpZihkYXRhLT5zZXQuc29ja3M1X2dzc2FwaV9uZWMpIHsKICAgICB1c19sZW5ndGggPSBodG9ucygoc2hvcnQpMSk7Ci0gICAgbWVtY3B5KHNvY2tzcmVxKzIsICZ1c19sZW5ndGgsIHNpemVvZihzaG9ydCkpOworICAgIG1lbWNweShzb2Nrc3JlcSArIDIsICZ1c19sZW5ndGgsIHNpemVvZihzaG9ydCkpOwogICB9CiAgIGVsc2UgewogICAgIGdzc19zZW5kX3Rva2VuLmxlbmd0aCA9IDE7CkBAIC00MDEsNyArNDAyLDcgQEAKICAgICBnc3NfcmVsZWFzZV9idWZmZXIoJmdzc19zdGF0dXMsICZnc3Nfc2VuZF90b2tlbik7CiAKICAgICB1c19sZW5ndGggPSBodG9ucygoc2hvcnQpZ3NzX3dfdG9rZW4ubGVuZ3RoKTsKLSAgICBtZW1jcHkoc29ja3NyZXErMiwgJnVzX2xlbmd0aCwgc2l6ZW9mKHNob3J0KSk7CisgICAgbWVtY3B5KHNvY2tzcmVxICsgMiwgJnVzX2xlbmd0aCwgc2l6ZW9mKHNob3J0KSk7CiAgIH0KIAogICBjb2RlID0gQ3VybF93cml0ZV9wbGFpbihjb25uLCBzb2NrLCAoY2hhciAqKXNvY2tzcmVxLCA0LCAmd3JpdHRlbik7CkBAIC00MzMsNyArNDM0LDcgQEAKICAgICBnc3NfcmVsZWFzZV9idWZmZXIoJmdzc19zdGF0dXMsICZnc3Nfd190b2tlbik7CiAgIH0KIAotICByZXN1bHQ9Q3VybF9ibG9ja3JlYWRfYWxsKGNvbm4sIHNvY2ssIChjaGFyICopc29ja3NyZXEsIDQsICZhY3R1YWxyZWFkKTsKKyAgcmVzdWx0ID0gQ3VybF9ibG9ja3JlYWRfYWxsKGNvbm4sIHNvY2ssIChjaGFyICopc29ja3NyZXEsIDQsICZhY3R1YWxyZWFkKTsKICAgaWYocmVzdWx0IHx8IChhY3R1YWxyZWFkICE9IDQpKSB7CiAgICAgZmFpbGYoZGF0YSwgIkZhaWxlZCB0byByZWNlaXZlIEdTUy1BUEkgZW5jcnlwdGlvbiByZXNwb25zZS4iKTsKICAgICBnc3NfZGVsZXRlX3NlY19jb250ZXh0KCZnc3Nfc3RhdHVzLCAmZ3NzX2NvbnRleHQsIE5VTEwpOwpAQCAtNDU1LDE3ICs0NTYsMTcgQEAKICAgICByZXR1cm4gQ1VSTEVfQ09VTEROVF9DT05ORUNUOwogICB9CiAKLSAgbWVtY3B5KCZ1c19sZW5ndGgsIHNvY2tzcmVxKzIsIHNpemVvZihzaG9ydCkpOworICBtZW1jcHkoJnVzX2xlbmd0aCwgc29ja3NyZXEgKyAyLCBzaXplb2Yoc2hvcnQpKTsKICAgdXNfbGVuZ3RoID0gbnRvaHModXNfbGVuZ3RoKTsKIAotICBnc3NfcmVjdl90b2tlbi5sZW5ndGg9IHVzX2xlbmd0aDsKLSAgZ3NzX3JlY3ZfdG9rZW4udmFsdWU9bWFsbG9jKGdzc19yZWN2X3Rva2VuLmxlbmd0aCk7CisgIGdzc19yZWN2X3Rva2VuLmxlbmd0aCA9IHVzX2xlbmd0aDsKKyAgZ3NzX3JlY3ZfdG9rZW4udmFsdWUgPSBtYWxsb2MoZ3NzX3JlY3ZfdG9rZW4ubGVuZ3RoKTsKICAgaWYoIWdzc19yZWN2X3Rva2VuLnZhbHVlKSB7CiAgICAgZ3NzX2RlbGV0ZV9zZWNfY29udGV4dCgmZ3NzX3N0YXR1cywgJmdzc19jb250ZXh0LCBOVUxMKTsKICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKICAgfQotICByZXN1bHQ9Q3VybF9ibG9ja3JlYWRfYWxsKGNvbm4sIHNvY2ssIChjaGFyICopZ3NzX3JlY3ZfdG9rZW4udmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NzX3JlY3ZfdG9rZW4ubGVuZ3RoLCAmYWN0dWFscmVhZCk7CisgIHJlc3VsdCA9IEN1cmxfYmxvY2tyZWFkX2FsbChjb25uLCBzb2NrLCAoY2hhciAqKWdzc19yZWN2X3Rva2VuLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NzX3JlY3ZfdG9rZW4ubGVuZ3RoLCAmYWN0dWFscmVhZCk7CiAKICAgaWYocmVzdWx0IHx8IChhY3R1YWxyZWFkICE9IHVzX2xlbmd0aCkpIHsKICAgICBmYWlsZihkYXRhLCAiRmFpbGVkIHRvIHJlY2VpdmUgR1NTLUFQSSBlbmNyeXB0cmlvbiB0eXBlLiIpOwpAQCAtNTEzLDggKzUxNCw4IEBACiAgIH0KIAogICBpbmZvZihkYXRhLCAiU09DS1M1IGFjY2VzcyB3aXRoJXMgcHJvdGVjdGlvbiBncmFudGVkLlxuIiwKLSAgICAgICAgKHNvY2tzcmVxWzBdPT0wKT8ib3V0IEdTUy1BUEkgZGF0YSI6Ci0gICAgICAgICgoc29ja3NyZXFbMF09PTEpPyIgR1NTLUFQSSBpbnRlZ3JpdHkiOiIgR1NTLUFQSSBjb25maWRlbnRpYWxpdHkiKSk7CisgICAgICAgIChzb2Nrc3JlcVswXSA9PSAwKT8ib3V0IEdTUy1BUEkgZGF0YSI6CisgICAgICAgICgoc29ja3NyZXFbMF0gPT0gMSk/IiBHU1MtQVBJIGludGVncml0eSI6IiBHU1MtQVBJIGNvbmZpZGVudGlhbGl0eSIpKTsKIAogICBjb25uLT5zb2NrczVfZ3NzYXBpX2VuY3R5cGUgPSBzb2Nrc3JlcVswXTsKICAgaWYoc29ja3NyZXFbMF0gPT0gMCkKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NvY2tzX3NzcGkuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3NvY2tzX3NzcGkuYwppbmRleCBlZGM3M2FkLi4zNDY5OWQzIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zb2Nrc19zc3BpLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc29ja3Nfc3NwaS5jCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMjAxMiAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDExLCBNYXJrdXMgTW9lbGxlciwgPG1hcmt1c19tb2VsbGVyQGNvbXB1c2VydmUuY29tPgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICBpZighc2VydmljZV9uYW1lKQogICAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CiAgICAgc25wcmludGYoc2VydmljZV9uYW1lLCBzZXJ2aWNlX2xlbmd0aCArCi0gICAgICAgICAgICAgc3RybGVuKGNvbm4tPnNvY2tzX3Byb3h5Lmhvc3QubmFtZSkrMiwgIiVzLyVzIiwKKyAgICAgICAgICAgICBzdHJsZW4oY29ubi0+c29ja3NfcHJveHkuaG9zdC5uYW1lKSArIDIsICIlcy8lcyIsCiAgICAgICAgICAgICAgc2VydmljZSwgY29ubi0+c29ja3NfcHJveHkuaG9zdC5uYW1lKTsKICAgfQogCkBAIC0xOTksNyArMTk5LDcgQEAKICAgICAgIHNvY2tzcmVxWzBdID0gMTsgICAgLyogR1NTLUFQSSBzdWJuZWdvdGlhdGlvbiB2ZXJzaW9uICovCiAgICAgICBzb2Nrc3JlcVsxXSA9IDE7ICAgIC8qIGF1dGhlbnRpY2F0aW9uIG1lc3NhZ2UgdHlwZSAqLwogICAgICAgdXNfbGVuZ3RoID0gaHRvbnMoKHNob3J0KXNzcGlfc2VuZF90b2tlbi5jYkJ1ZmZlcik7Ci0gICAgICBtZW1jcHkoc29ja3NyZXErMiwgJnVzX2xlbmd0aCwgc2l6ZW9mKHNob3J0KSk7CisgICAgICBtZW1jcHkoc29ja3NyZXEgKyAyLCAmdXNfbGVuZ3RoLCBzaXplb2Yoc2hvcnQpKTsKIAogICAgICAgY29kZSA9IEN1cmxfd3JpdGVfcGxhaW4oY29ubiwgc29jaywgKGNoYXIgKilzb2Nrc3JlcSwgNCwgJndyaXR0ZW4pOwogICAgICAgaWYoY29kZSB8fCAoNCAhPSB3cml0dGVuKSkgewpAQCAtMjgzLDcgKzI4Myw3IEBACiAgICAgICByZXR1cm4gQ1VSTEVfQ09VTEROVF9DT05ORUNUOwogICAgIH0KIAotICAgIG1lbWNweSgmdXNfbGVuZ3RoLCBzb2Nrc3JlcSsyLCBzaXplb2Yoc2hvcnQpKTsKKyAgICBtZW1jcHkoJnVzX2xlbmd0aCwgc29ja3NyZXEgKyAyLCBzaXplb2Yoc2hvcnQpKTsKICAgICB1c19sZW5ndGggPSBudG9ocyh1c19sZW5ndGgpOwogCiAgICAgc3NwaV9yZWN2X3Rva2VuLmNiQnVmZmVyID0gdXNfbGVuZ3RoOwpAQCAtMzQxLDcgKzM0MSw3IEBACiAgICAgZ3NzX2VuYyA9IDE7CiAKICAgaW5mb2YoZGF0YSwgIlNPQ0tTNSBzZXJ2ZXIgc3VwcG9ydHMgR1NTLUFQSSAlcyBkYXRhIHByb3RlY3Rpb24uXG4iLAotICAgICAgICAoZ3NzX2VuYz09MCk/Im5vIjooKGdzc19lbmM9PTEpPyJpbnRlZ3JpdHkiOiJjb25maWRlbnRpYWxpdHkiKSApOworICAgICAgICAoZ3NzX2VuYyA9PSAwKT8ibm8iOigoZ3NzX2VuYyA9PSAxKT8iaW50ZWdyaXR5IjoiY29uZmlkZW50aWFsaXR5IikgKTsKICAgLyogZm9yY2UgdG8gbm8gZGF0YSBwcm90ZWN0aW9uLCBhdm9pZCBlbmNyeXB0aW9uL2RlY3J5cHRpb24gZm9yIG5vdyAqLwogICBnc3NfZW5jID0gMDsKICAgLyoKQEAgLTM3Nyw3ICszNzcsNyBAQAogCiAgIGlmKGRhdGEtPnNldC5zb2NrczVfZ3NzYXBpX25lYykgewogICAgIHVzX2xlbmd0aCA9IGh0b25zKChzaG9ydCkxKTsKLSAgICBtZW1jcHkoc29ja3NyZXErMiwgJnVzX2xlbmd0aCwgc2l6ZW9mKHNob3J0KSk7CisgICAgbWVtY3B5KHNvY2tzcmVxICsgMiwgJnVzX2xlbmd0aCwgc2l6ZW9mKHNob3J0KSk7CiAgIH0KICAgZWxzZSB7CiAgICAgc3RhdHVzID0gc19wU2VjRm4tPlF1ZXJ5Q29udGV4dEF0dHJpYnV0ZXMoJnNzcGlfY29udGV4dCwKQEAgLTQ0NSw4ICs0NDUsOCBAQAogICAgIG1lbWNweSgoUFVDSEFSKSBzc3BpX3NlbmRfdG9rZW4ucHZCdWZmZXIgKyhpbnQpc3NwaV93X3Rva2VuWzBdLmNiQnVmZmVyLAogICAgICAgICAgICBzc3BpX3dfdG9rZW5bMV0ucHZCdWZmZXIsIHNzcGlfd190b2tlblsxXS5jYkJ1ZmZlcik7CiAgICAgbWVtY3B5KChQVUNIQVIpIHNzcGlfc2VuZF90b2tlbi5wdkJ1ZmZlcgotICAgICAgICAgICArc3NwaV93X3Rva2VuWzBdLmNiQnVmZmVyCi0gICAgICAgICAgICtzc3BpX3dfdG9rZW5bMV0uY2JCdWZmZXIsCisgICAgICAgICAgICsgc3NwaV93X3Rva2VuWzBdLmNiQnVmZmVyCisgICAgICAgICAgICsgc3NwaV93X3Rva2VuWzFdLmNiQnVmZmVyLAogICAgICAgICAgICBzc3BpX3dfdG9rZW5bMl0ucHZCdWZmZXIsIHNzcGlfd190b2tlblsyXS5jYkJ1ZmZlcik7CiAKICAgICBzX3BTZWNGbi0+RnJlZUNvbnRleHRCdWZmZXIoc3NwaV93X3Rva2VuWzBdLnB2QnVmZmVyKTsKQEAgLTQ2MCw3ICs0NjAsNyBAQAogICAgIHNzcGlfd190b2tlblsyXS5jYkJ1ZmZlciA9IDA7CiAKICAgICB1c19sZW5ndGggPSBodG9ucygoc2hvcnQpc3NwaV9zZW5kX3Rva2VuLmNiQnVmZmVyKTsKLSAgICBtZW1jcHkoc29ja3NyZXErMiwgJnVzX2xlbmd0aCwgc2l6ZW9mKHNob3J0KSk7CisgICAgbWVtY3B5KHNvY2tzcmVxICsgMiwgJnVzX2xlbmd0aCwgc2l6ZW9mKHNob3J0KSk7CiAgIH0KIAogICBjb2RlID0gQ3VybF93cml0ZV9wbGFpbihjb25uLCBzb2NrLCAoY2hhciAqKXNvY2tzcmVxLCA0LCAmd3JpdHRlbik7CkBAIC01MTcsNyArNTE3LDcgQEAKICAgICByZXR1cm4gQ1VSTEVfQ09VTEROVF9DT05ORUNUOwogICB9CiAKLSAgbWVtY3B5KCZ1c19sZW5ndGgsIHNvY2tzcmVxKzIsIHNpemVvZihzaG9ydCkpOworICBtZW1jcHkoJnVzX2xlbmd0aCwgc29ja3NyZXEgKyAyLCBzaXplb2Yoc2hvcnQpKTsKICAgdXNfbGVuZ3RoID0gbnRvaHModXNfbGVuZ3RoKTsKIAogICBzc3BpX3dfdG9rZW5bMF0uY2JCdWZmZXIgPSB1c19sZW5ndGg7CkBAIC01ODgsOCArNTg4LDggQEAKICAgfQogCiAgIGluZm9mKGRhdGEsICJTT0NLUzUgYWNjZXNzIHdpdGglcyBwcm90ZWN0aW9uIGdyYW50ZWQuXG4iLAotICAgICAgICAoc29ja3NyZXFbMF09PTApPyJvdXQgR1NTLUFQSSBkYXRhIjoKLSAgICAgICAgKChzb2Nrc3JlcVswXT09MSk/IiBHU1MtQVBJIGludGVncml0eSI6IiBHU1MtQVBJIGNvbmZpZGVudGlhbGl0eSIpKTsKKyAgICAgICAgKHNvY2tzcmVxWzBdID09IDApPyJvdXQgR1NTLUFQSSBkYXRhIjoKKyAgICAgICAgKChzb2Nrc3JlcVswXSA9PSAxKT8iIEdTUy1BUEkgaW50ZWdyaXR5IjoiIEdTUy1BUEkgY29uZmlkZW50aWFsaXR5IikpOwogCiAgIC8qIEZvciBsYXRlciB1c2UgaWYgZW5jcnlwdGlvbiBpcyByZXF1aXJlZAogICAgICBjb25uLT5zb2NrczVfZ3NzYXBpX2VuY3R5cGUgPSBzb2Nrc3JlcVswXTsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NwZWVkY2hlY2suYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3NwZWVkY2hlY2suYwppbmRleCA4YWRkZWRkLi5mZTY2OWYxIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zcGVlZGNoZWNrLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc3BlZWRjaGVjay5jCkBAIC0zMCwxNCArMzAsMTQgQEAKIAogdm9pZCBDdXJsX3NwZWVkaW5pdChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKQogewotICBtZW1zZXQoJmRhdGEtPnN0YXRlLmtlZXBzX3NwZWVkLCAwLCBzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKKyAgbWVtc2V0KCZkYXRhLT5zdGF0ZS5rZWVwc19zcGVlZCwgMCwgc2l6ZW9mKHN0cnVjdCBjdXJsdGltZSkpOwogfQogCiAvKgogICogQHVuaXR0ZXN0OiAxNjA2CiAgKi8KIENVUkxjb2RlIEN1cmxfc3BlZWRjaGVjayhzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsIG5vdykKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY3VybHRpbWUgbm93KQogewogICBpZigoZGF0YS0+cHJvZ3Jlc3MuY3VycmVudF9zcGVlZCA+PSAwKSAmJiBkYXRhLT5zZXQubG93X3NwZWVkX3RpbWUpIHsKICAgICBpZihkYXRhLT5wcm9ncmVzcy5jdXJyZW50X3NwZWVkIDwgZGF0YS0+c2V0Lmxvd19zcGVlZF9saW1pdCkgewpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc3BlZWRjaGVjay5oIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc3BlZWRjaGVjay5oCmluZGV4IDdkYmUzZDYuLjVjMmRjOWEgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NwZWVkY2hlY2suaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zcGVlZGNoZWNrLmgKQEAgLTcsNyArNyw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxMCwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTI4LDYgKzI4LDYgQEAKIAogdm9pZCBDdXJsX3NwZWVkaW5pdChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKTsKIENVUkxjb2RlIEN1cmxfc3BlZWRjaGVjayhzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsIG5vdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGN1cmx0aW1lIG5vdyk7CiAKICNlbmRpZiAvKiBIRUFERVJfQ1VSTF9TUEVFRENIRUNLX0ggKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NwbGF5LmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zcGxheS5jCmluZGV4IDFiMzAxZjkuLjY5YWY0NDYgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NwbGF5LmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc3BsYXkuYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTcgLSAyMDE1LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk3IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtMzcsNyArMzcsNyBAQAogICogU3BsYXkgdXNpbmcgdGhlIGtleSBpICh3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSBpbiB0aGUgdHJlZS4pIFRoZSBzdGFydGluZwogICogcm9vdCBpcyB0LgogICovCi1zdHJ1Y3QgQ3VybF90cmVlICpDdXJsX3NwbGF5KHN0cnVjdCB0aW1ldmFsIGksCitzdHJ1Y3QgQ3VybF90cmVlICpDdXJsX3NwbGF5KHN0cnVjdCBjdXJsdGltZSBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF90cmVlICp0KQogewogICBzdHJ1Y3QgQ3VybF90cmVlIE4sICpsLCAqciwgKnk7CkBAIC05NywyNCArOTcsMjYgQEAKICAqCiAgKiBAdW5pdHRlc3Q6IDEzMDkKICAqLwotc3RydWN0IEN1cmxfdHJlZSAqQ3VybF9zcGxheWluc2VydChzdHJ1Y3QgdGltZXZhbCBpLAorc3RydWN0IEN1cmxfdHJlZSAqQ3VybF9zcGxheWluc2VydChzdHJ1Y3QgY3VybHRpbWUgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEN1cmxfdHJlZSAqdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEN1cmxfdHJlZSAqbm9kZSkKIHsKLSAgc3RhdGljIGNvbnN0IHN0cnVjdCB0aW1ldmFsIEtFWV9OT1RVU0VEID0gey0xLCAtMX07IC8qIHdpbGwgKk5FVkVSKiBhcHBlYXIgKi8KKyAgc3RhdGljIGNvbnN0IHN0cnVjdCBjdXJsdGltZSBLRVlfTk9UVVNFRCA9IHsKKyAgICAodGltZV90KS0xLCAodW5zaWduZWQgaW50KS0xCisgIH07IC8qIHdpbGwgKk5FVkVSKiBhcHBlYXIgKi8KIAogICBpZihub2RlID09IE5VTEwpCiAgICAgcmV0dXJuIHQ7CiAKICAgaWYodCAhPSBOVUxMKSB7CiAgICAgdCA9IEN1cmxfc3BsYXkoaSwgdCk7Ci0gICAgaWYoY29tcGFyZShpLCB0LT5rZXkpPT0wKSB7CisgICAgaWYoY29tcGFyZShpLCB0LT5rZXkpID09IDApIHsKICAgICAgIC8qIFRoZXJlIGFscmVhZHkgZXhpc3RzIGEgbm9kZSBpbiB0aGUgdHJlZSB3aXRoIHRoZSB2ZXJ5IHNhbWUga2V5LiBCdWlsZAogICAgICAgICAgYSBkb3VibHktbGlua2VkIGNpcmN1bGFyIGxpc3Qgb2Ygbm9kZXMuIFdlIGFkZCB0aGUgbmV3ICdub2RlJyBzdHJ1Y3QKICAgICAgICAgIHRvIHRoZSBlbmQgb2YgdGhpcyBsaXN0LiAqLwogCiAgICAgICBub2RlLT5rZXkgPSBLRVlfTk9UVVNFRDsgLyogd2Ugc2V0IHRoZSBrZXkgaW4gdGhlIHN1YiBub2RlIHRvIE5PVFVTRUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBxdWlja2x5IGlkZW50aWZ5IHRoaXMgbm9kZSBhcyBhIHN1Ym5vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBxdWlja2x5IGlkZW50aWZ5IHRoaXMgbm9kZSBhcyBhIHN1Ym5vZGUgKi8KICAgICAgIG5vZGUtPnNhbWVuID0gdDsKICAgICAgIG5vZGUtPnNhbWVwID0gdC0+c2FtZXA7CiAgICAgICB0LT5zYW1lcC0+c2FtZW4gPSBub2RlOwpAQCAtMTQ5LDExICsxNTEsMTEgQEAKIC8qIEZpbmRzIGFuZCBkZWxldGVzIHRoZSBiZXN0LWZpdCBub2RlIGZyb20gdGhlIHRyZWUuIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlCiAgICByZXN1bHRpbmcgdHJlZS4gIGJlc3QtZml0IG1lYW5zIHRoZSBzbWFsbGVzdCBub2RlIGlmIGl0IGlzIG5vdCBsYXJnZXIgdGhhbgogICAgdGhlIGtleSAqLwotc3RydWN0IEN1cmxfdHJlZSAqQ3VybF9zcGxheWdldGJlc3Qoc3RydWN0IHRpbWV2YWwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDdXJsX3RyZWUgKnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF90cmVlICoqcmVtb3ZlZCkKK3N0cnVjdCBDdXJsX3RyZWUgKkN1cmxfc3BsYXlnZXRiZXN0KHN0cnVjdCBjdXJsdGltZSBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEN1cmxfdHJlZSAqdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDdXJsX3RyZWUgKipyZW1vdmVkKQogewotICBzdGF0aWMgc3RydWN0IHRpbWV2YWwgdHZfemVybyA9IHswLCAwfTsKKyAgc3RhdGljIHN0cnVjdCBjdXJsdGltZSB0dl96ZXJvID0gezAsIDB9OwogICBzdHJ1Y3QgQ3VybF90cmVlICp4OwogCiAgIGlmKCF0KSB7CkBAIC0yMDksNyArMjExLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDdXJsX3RyZWUgKnJlbW92ZW5vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF90cmVlICoqbmV3cm9vdCkKIHsKLSAgc3RhdGljIGNvbnN0IHN0cnVjdCB0aW1ldmFsIEtFWV9OT1RVU0VEID0gey0xLCAtMX07IC8qIHdpbGwgKk5FVkVSKiBhcHBlYXIgKi8KKyAgc3RhdGljIGNvbnN0IHN0cnVjdCBjdXJsdGltZSBLRVlfTk9UVVNFRCA9IHsKKyAgICAodGltZV90KS0xLCAodW5zaWduZWQgaW50KS0xCisgIH07IC8qIHdpbGwgKk5FVkVSKiBhcHBlYXIgKi8KICAgc3RydWN0IEN1cmxfdHJlZSAqeDsKIAogICBpZighdCB8fCAhcmVtb3Zlbm9kZSkKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NwbGF5LmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zcGxheS5oCmluZGV4IGRhODE4OTQuLjQ2MTJlYzIgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NwbGF5LmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc3BsYXkuaApAQCAtNyw3ICs3LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTcgLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk3IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtMjIsMzAgKzIyLDMxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpbmNsdWRlICJjdXJsX3NldHVwLmgiCisjaW5jbHVkZSAidGltZXZhbC5oIgogCiBzdHJ1Y3QgQ3VybF90cmVlIHsKICAgc3RydWN0IEN1cmxfdHJlZSAqc21hbGxlcjsgLyogc21hbGxlciBub2RlICovCiAgIHN0cnVjdCBDdXJsX3RyZWUgKmxhcmdlcjsgIC8qIGxhcmdlciBub2RlICovCiAgIHN0cnVjdCBDdXJsX3RyZWUgKnNhbWVuOyAgIC8qIHBvaW50cyB0byB0aGUgbmV4dCBub2RlIHdpdGggaWRlbnRpY2FsIGtleSAqLwogICBzdHJ1Y3QgQ3VybF90cmVlICpzYW1lcDsgICAvKiBwb2ludHMgdG8gdGhlIHByZXYgbm9kZSB3aXRoIGlkZW50aWNhbCBrZXkgKi8KLSAgc3RydWN0IHRpbWV2YWwga2V5OyAgICAgICAgLyogdGhpcyBub2RlJ3MgInNvcnQiIGtleSAqLworICBzdHJ1Y3QgY3VybHRpbWUga2V5OyAgICAgICAgLyogdGhpcyBub2RlJ3MgInNvcnQiIGtleSAqLwogICB2b2lkICpwYXlsb2FkOyAgICAgICAgICAgICAvKiBkYXRhIHRoZSBzcGxheSBjb2RlIGRvZXNuJ3QgY2FyZSBhYm91dCAqLwogfTsKIAotc3RydWN0IEN1cmxfdHJlZSAqQ3VybF9zcGxheShzdHJ1Y3QgdGltZXZhbCBpLAorc3RydWN0IEN1cmxfdHJlZSAqQ3VybF9zcGxheShzdHJ1Y3QgY3VybHRpbWUgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEN1cmxfdHJlZSAqdCk7CiAKLXN0cnVjdCBDdXJsX3RyZWUgKkN1cmxfc3BsYXlpbnNlcnQoc3RydWN0IHRpbWV2YWwga2V5LAorc3RydWN0IEN1cmxfdHJlZSAqQ3VybF9zcGxheWluc2VydChzdHJ1Y3QgY3VybHRpbWUga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF90cmVlICp0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF90cmVlICpuZXdub2RlKTsKIAogI2lmIDAKLXN0cnVjdCBDdXJsX3RyZWUgKkN1cmxfc3BsYXlyZW1vdmUoc3RydWN0IHRpbWV2YWwga2V5LAorc3RydWN0IEN1cmxfdHJlZSAqQ3VybF9zcGxheXJlbW92ZShzdHJ1Y3QgY3VybHRpbWUga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF90cmVlICp0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF90cmVlICoqcmVtb3ZlZCk7CiAjZW5kaWYKIAotc3RydWN0IEN1cmxfdHJlZSAqQ3VybF9zcGxheWdldGJlc3Qoc3RydWN0IHRpbWV2YWwga2V5LAorc3RydWN0IEN1cmxfdHJlZSAqQ3VybF9zcGxheWdldGJlc3Qoc3RydWN0IGN1cmx0aW1lIGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDdXJsX3RyZWUgKnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF90cmVlICoqcmVtb3ZlZCk7CiAKQEAgLTUzLDggKzU0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDdXJsX3RyZWUgKnJlbW92ZW5vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ3VybF90cmVlICoqbmV3cm9vdCk7CiAKLSNkZWZpbmUgQ3VybF9zcGxheWNvbXBhcmVrZXlzKGksaikgKCAoKGkudHZfc2VjKSAgPCAoai50dl9zZWMpKSAgPyAtMSA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoKGkudHZfc2VjKSAgPiAoai50dl9zZWMpKSAgPyAgMSA6IFwKKyNkZWZpbmUgQ3VybF9zcGxheWNvbXBhcmVrZXlzKGksaikgKCAoKGkudHZfc2VjKSAgPCAoai50dl9zZWMpKSA/IC0xIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICgoaS50dl9zZWMpICA+IChqLnR2X3NlYykpID8gIDEgOiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKChpLnR2X3VzZWMpIDwgKGoudHZfdXNlYykpID8gLTEgOiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKChpLnR2X3VzZWMpID4gKGoudHZfdXNlYykpID8gIDEgOiAwKSkpKQogCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zc2guYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3NzaC5jCmluZGV4IDAwYWVjYTkuLjU0MDZiZjAgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3NzaC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3NzaC5jCkBAIC0xNzcsNiArMTc3LDcgQEAKICAgc3NoX3BlcmZvcm1fZ2V0c29jaywgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KICAgc2NwX2Rpc2Nvbm5lY3QsICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCisgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbl9jaGVjayAqLwogICBQT1JUX1NTSCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX1NDUCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwogICBQUk9UT1BUX0RJUkxPQ0sgfCBQUk9UT1BUX0NMT1NFQUNUSU9OCkBAIC0yMDMsNiArMjA0LDcgQEAKICAgc3NoX3BlcmZvcm1fZ2V0c29jaywgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KICAgc2Z0cF9kaXNjb25uZWN0LCAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCisgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbl9jaGVjayAqLwogICBQT1JUX1NTSCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgQ1VSTFBST1RPX1NGVFAsICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwogICBQUk9UT1BUX0RJUkxPQ0sgfCBQUk9UT1BUX0NMT1NFQUNUSU9OCkBAIC00MjYsMTQgKzQyOCwxNCBAQAogCiAgIC8qIENoZWNrIGZvciAvfi8sIGluZGljYXRpbmcgcmVsYXRpdmUgdG8gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSAqLwogICBpZihjb25uLT5oYW5kbGVyLT5wcm90b2NvbCAmIENVUkxQUk9UT19TQ1ApIHsKLSAgICByZWFsX3BhdGggPSBtYWxsb2Mod29ya2luZ19wYXRoX2xlbisxKTsKKyAgICByZWFsX3BhdGggPSBtYWxsb2Mod29ya2luZ19wYXRoX2xlbiArIDEpOwogICAgIGlmKHJlYWxfcGF0aCA9PSBOVUxMKSB7CiAgICAgICBmcmVlKHdvcmtpbmdfcGF0aCk7CiAgICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKICAgICB9CiAgICAgaWYoKHdvcmtpbmdfcGF0aF9sZW4gPiAzKSAmJiAoIW1lbWNtcCh3b3JraW5nX3BhdGgsICIvfi8iLCAzKSkpCiAgICAgICAvKiBJdCBpcyByZWZlcmVuY2VkIHRvIHRoZSBob21lIGRpcmVjdG9yeSwgc28gc3RyaXAgdGhlIGxlYWRpbmcgJy9+LycgKi8KLSAgICAgIG1lbWNweShyZWFsX3BhdGgsIHdvcmtpbmdfcGF0aCszLCA0ICsgd29ya2luZ19wYXRoX2xlbi0zKTsKKyAgICAgIG1lbWNweShyZWFsX3BhdGgsIHdvcmtpbmdfcGF0aCArIDMsIDQgKyB3b3JraW5nX3BhdGhfbGVuLTMpOwogICAgIGVsc2UKICAgICAgIG1lbWNweShyZWFsX3BhdGgsIHdvcmtpbmdfcGF0aCwgMSArIHdvcmtpbmdfcGF0aF9sZW4pOwogICB9CkBAIC00NDksMTkgKzQ1MSwxOSBAQAogICAgICAgICAgbGVhZGluZyAnLycgKi8KICAgICAgIG1lbWNweShyZWFsX3BhdGgsIGhvbWVkaXIsIGhvbWVsZW4pOwogICAgICAgcmVhbF9wYXRoW2hvbWVsZW5dID0gJy8nOwotICAgICAgcmVhbF9wYXRoW2hvbWVsZW4rMV0gPSAnXDAnOworICAgICAgcmVhbF9wYXRoW2hvbWVsZW4gKyAxXSA9ICdcMCc7CiAgICAgICBpZih3b3JraW5nX3BhdGhfbGVuID4gMykgewotICAgICAgICBtZW1jcHkocmVhbF9wYXRoK2hvbWVsZW4rMSwgd29ya2luZ19wYXRoICsgMywKKyAgICAgICAgbWVtY3B5KHJlYWxfcGF0aCArIGhvbWVsZW4gKyAxLCB3b3JraW5nX3BhdGggKyAzLAogICAgICAgICAgICAgICAgMSArIHdvcmtpbmdfcGF0aF9sZW4gLTMpOwogICAgICAgfQogICAgIH0KICAgICBlbHNlIHsKLSAgICAgIHJlYWxfcGF0aCA9IG1hbGxvYyh3b3JraW5nX3BhdGhfbGVuKzEpOworICAgICAgcmVhbF9wYXRoID0gbWFsbG9jKHdvcmtpbmdfcGF0aF9sZW4gKyAxKTsKICAgICAgIGlmKHJlYWxfcGF0aCA9PSBOVUxMKSB7CiAgICAgICAgIGZyZWUod29ya2luZ19wYXRoKTsKICAgICAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CiAgICAgICB9Ci0gICAgICBtZW1jcHkocmVhbF9wYXRoLCB3b3JraW5nX3BhdGgsIDErd29ya2luZ19wYXRoX2xlbik7CisgICAgICBtZW1jcHkocmVhbF9wYXRoLCB3b3JraW5nX3BhdGgsIDEgKyB3b3JraW5nX3BhdGhfbGVuKTsKICAgICB9CiAgIH0KIApAQCAtMTgxMSw3ICsxODEzLDcgQEAKICAgICAgICAgICAgICB6ZXJvIGV2ZW4gdGhvdWdoIGxpYnNzaDJfc2Z0cF9vcGVuKCkgZmFpbGVkIHByZXZpb3VzbHkhIFdlIG5lZWQKICAgICAgICAgICAgICB0byB3b3JrIGFyb3VuZCB0aGF0ISAqLwogICAgICAgICAgIHNzaGMtPmFjdHVhbGNvZGUgPSBDVVJMRV9TU0g7Ci0gICAgICAgICAgZXJyPS0xOworICAgICAgICAgIGVyciA9IC0xOwogICAgICAgICB9CiAgICAgICAgIGZhaWxmKGRhdGEsICJVcGxvYWQgZmFpbGVkOiAlcyAoJWQvJWQpIiwKICAgICAgICAgICAgICAgZXJyPj0gTElCU1NIMl9GWF9PSz9zZnRwX2xpYnNzaDJfc3RyZXJyb3IoZXJyKToic3NoIGVycm9yIiwKQEAgLTE4MjksNyArMTgzMSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZihzZWVrZXJyICE9IENVUkxfU0VFS0ZVTkNfT0spIHsKLSAgICAgICAgICBjdXJsX29mZl90IHBhc3NlZD0wOworICAgICAgICAgIGN1cmxfb2ZmX3QgcGFzc2VkID0gMDsKIAogICAgICAgICAgIGlmKHNlZWtlcnIgIT0gQ1VSTF9TRUVLRlVOQ19DQU5UU0VFSykgewogICAgICAgICAgICAgZmFpbGYoZGF0YSwgIkNvdWxkIG5vdCBzZWVrIHN0cmVhbSIpOwpAQCAtMTk4MSwxMyArMTk4MywxMyBAQAogICAgICAgICBzc2hjLT5hY3R1YWxjb2RlID0gcmVzdWx0P3Jlc3VsdDpDVVJMRV9TU0g7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgc3NoYy0+cmVhZGRpcl9maWxlbmFtZSA9IG1hbGxvYyhQQVRIX01BWCsxKTsKKyAgICAgIHNzaGMtPnJlYWRkaXJfZmlsZW5hbWUgPSBtYWxsb2MoUEFUSF9NQVggKyAxKTsKICAgICAgIGlmKCFzc2hjLT5yZWFkZGlyX2ZpbGVuYW1lKSB7CiAgICAgICAgIHN0YXRlKGNvbm4sIFNTSF9TRlRQX0NMT1NFKTsKICAgICAgICAgc3NoYy0+YWN0dWFsY29kZSA9IENVUkxFX09VVF9PRl9NRU1PUlk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgc3NoYy0+cmVhZGRpcl9sb25nZW50cnkgPSBtYWxsb2MoUEFUSF9NQVgrMSk7CisgICAgICBzc2hjLT5yZWFkZGlyX2xvbmdlbnRyeSA9IG1hbGxvYyhQQVRIX01BWCArIDEpOwogICAgICAgaWYoIXNzaGMtPnJlYWRkaXJfbG9uZ2VudHJ5KSB7CiAgICAgICAgIEN1cmxfc2FmZWZyZWUoc3NoYy0+cmVhZGRpcl9maWxlbmFtZSk7CiAgICAgICAgIHN0YXRlKGNvbm4sIFNTSF9TRlRQX0NMT1NFKTsKQEAgLTIwMjEsNyArMjAyMyw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CiAgICAgICAgICAgcmVzdWx0ID0gQ3VybF9jbGllbnRfd3JpdGUoY29ubiwgQ0xJRU5UV1JJVEVfQk9EWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBMaW5lLCBzc2hjLT5yZWFkZGlyX2xlbisxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBMaW5lLCBzc2hjLT5yZWFkZGlyX2xlbiArIDEpOwogICAgICAgICAgIGZyZWUodG1wTGluZSk7CiAKICAgICAgICAgICBpZihyZXN1bHQpIHsKQEAgLTIwMzAsNyArMjAzMiw3IEBACiAgICAgICAgICAgfQogICAgICAgICAgIC8qIHNpbmNlIHRoaXMgY291bnRzIHdoYXQgd2Ugc2VuZCB0byB0aGUgY2xpZW50LCB3ZSBpbmNsdWRlIHRoZQogICAgICAgICAgICAgIG5ld2xpbmUgaW4gdGhpcyBjb3VudGVyICovCi0gICAgICAgICAgZGF0YS0+cmVxLmJ5dGVjb3VudCArPSBzc2hjLT5yZWFkZGlyX2xlbisxOworICAgICAgICAgIGRhdGEtPnJlcS5ieXRlY291bnQgKz0gc3NoYy0+cmVhZGRpcl9sZW4gKyAxOwogCiAgICAgICAgICAgLyogb3V0cHV0IGRlYnVnIG91dHB1dCBpZiB0aGF0IGlzIHJlcXVlc3RlZCAqLwogICAgICAgICAgIGlmKGRhdGEtPnNldC52ZXJib3NlKSB7CkBAIC0yMjMxLDE4ICsyMjMzLDI1IEBACiAgICAgICAgICAgY3VybF9vZmZfdCBmcm9tLCB0bzsKICAgICAgICAgICBjaGFyICpwdHI7CiAgICAgICAgICAgY2hhciAqcHRyMjsKKyAgICAgICAgICBDVVJMb2ZmdCB0b190OworICAgICAgICAgIENVUkxvZmZ0IGZyb21fdDsKIAotICAgICAgICAgIGZyb209Y3VybHhfc3RydG9vZmZ0KGNvbm4tPmRhdGEtPnN0YXRlLnJhbmdlLCAmcHRyLCAwKTsKLSAgICAgICAgICB3aGlsZSgqcHRyICYmIChJU1NQQUNFKCpwdHIpIHx8ICgqcHRyPT0nLScpKSkKKyAgICAgICAgICBmcm9tX3QgPSBjdXJseF9zdHJ0b29mZnQoY29ubi0+ZGF0YS0+c3RhdGUucmFuZ2UsICZwdHIsIDAsICZmcm9tKTsKKyAgICAgICAgICBpZihmcm9tX3QgPT0gQ1VSTF9PRkZUX0ZMT1cpCisgICAgICAgICAgICByZXR1cm4gQ1VSTEVfUkFOR0VfRVJST1I7CisgICAgICAgICAgd2hpbGUoKnB0ciAmJiAoSVNTUEFDRSgqcHRyKSB8fCAoKnB0ciA9PSAnLScpKSkKICAgICAgICAgICAgIHB0cisrOwotICAgICAgICAgIHRvPWN1cmx4X3N0cnRvb2ZmdChwdHIsICZwdHIyLCAwKTsKLSAgICAgICAgICBpZigocHRyID09IHB0cjIpIC8qIG5vICJ0byIgdmFsdWUgZ2l2ZW4gKi8KKyAgICAgICAgICB0b190ID0gY3VybHhfc3RydG9vZmZ0KHB0ciwgJnB0cjIsIDAsICZ0byk7CisgICAgICAgICAgaWYodG9fdCA9PSBDVVJMX09GRlRfRkxPVykKKyAgICAgICAgICAgIHJldHVybiBDVVJMRV9SQU5HRV9FUlJPUjsKKyAgICAgICAgICBpZigodG9fdCA9PSBDVVJMX09GRlRfSU5WQUwpIC8qIG5vICJ0byIgdmFsdWUgZ2l2ZW4gKi8KICAgICAgICAgICAgICB8fCAodG8gPj0gc2l6ZSkpIHsKICAgICAgICAgICAgIHRvID0gc2l6ZSAtIDE7CiAgICAgICAgICAgfQotICAgICAgICAgIGlmKGZyb20gPCAwKSB7CisgICAgICAgICAgaWYoZnJvbV90KSB7CiAgICAgICAgICAgICAvKiBmcm9tIGlzIHJlbGF0aXZlIHRvIGVuZCBvZiBmaWxlICovCi0gICAgICAgICAgICBmcm9tICs9IHNpemU7CisgICAgICAgICAgICBmcm9tID0gc2l6ZSAtIHRvOworICAgICAgICAgICAgdG8gPSBzaXplIC0gMTsKICAgICAgICAgICB9CiAgICAgICAgICAgaWYoZnJvbSA+IHNpemUpIHsKICAgICAgICAgICAgIGZhaWxmKGRhdGEsICJPZmZzZXQgKCUiCkBAIC0yODI1LDcgKzI4MzQsNyBAQAogICB3aGlsZSgoc3NoYy0+c3RhdGUgIT0gU1NIX1NUT1ApICYmICFyZXN1bHQpIHsKICAgICBib29sIGJsb2NrOwogICAgIHRpbWVfdCBsZWZ0ID0gMTAwMDsKLSAgICBzdHJ1Y3QgdGltZXZhbCBub3cgPSBDdXJsX3R2bm93KCk7CisgICAgc3RydWN0IGN1cmx0aW1lIG5vdyA9IEN1cmxfdHZub3coKTsKIAogICAgIHJlc3VsdCA9IHNzaF9zdGF0ZW1hY2hfYWN0KGNvbm4sICZibG9jayk7CiAgICAgaWYocmVzdWx0KQpAQCAtMjkzMyw2ICsyOTQyLDEzIEBACiAgICAgcmV0dXJuIENVUkxFX0ZBSUxFRF9JTklUOwogICB9CiAKKyAgaWYoZGF0YS0+c2V0LnNzaF9jb21wcmVzc2lvbikgeworI2lmIExJQlNTSDJfVkVSU0lPTl9OVU0gPj0gMHgwMTAyMDgKKyAgICBpZihsaWJzc2gyX3Nlc3Npb25fZmxhZyhzc2gtPnNzaF9zZXNzaW9uLCBMSUJTU0gyX0ZMQUdfQ09NUFJFU1MsIDEpIDwgMCkKKyNlbmRpZgorICAgICAgaW5mb2YoZGF0YSwgIkZhaWxlZCB0byBlbmFibGUgY29tcHJlc3Npb24gZm9yIHNzaCBzZXNzaW9uXG4iKTsKKyAgfQorCiAjaWZkZWYgSEFWRV9MSUJTU0gyX0tOT1dOSE9TVF9BUEkKICAgaWYoZGF0YS0+c2V0LnN0cltTVFJJTkdfU1NIX0tOT1dOSE9TVFNdKSB7CiAgICAgaW50IHJjOwpAQCAtMzAyOSw4ICszMDQ1LDggQEAKICAgZGF0YS0+cmVxLnNpemUgPSAtMTsgLyogbWFrZSBzdXJlIHRoaXMgaXMgdW5rbm93biBhdCB0aGlzIHBvaW50ICovCiAKICAgc3NoYy0+YWN0dWFsY29kZSA9IENVUkxFX09LOyAvKiByZXNldCBlcnJvciBjb2RlICovCi0gIHNzaGMtPnNlY29uZENyZWF0ZURpcnMgPTA7ICAgLyogcmVzZXQgdGhlIGNyZWF0ZSBkaXIgYXR0ZW1wdCBzdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlICovCisgIHNzaGMtPnNlY29uZENyZWF0ZURpcnMgPSAwOyAgIC8qIHJlc2V0IHRoZSBjcmVhdGUgZGlyIGF0dGVtcHQgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgKi8KIAogICBDdXJsX3BncnNTZXRVcGxvYWRDb3VudGVyKGRhdGEsIDApOwogICBDdXJsX3BncnNTZXREb3dubG9hZENvdW50ZXIoZGF0YSwgMCk7CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zdHJjYXNlLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zdHJjYXNlLmMKaW5kZXggYTc0YTRiZS4uMjRiY2NhOSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc3RyY2FzZS5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3N0cmNhc2UuYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtOTQsMTAgKzk0LDExIEBACiB9CiAKIC8qCi0gKiBDdXJsX3Jhd19lcXVhbCgpIGlzIGZvciBkb2luZyAicmF3IiBjYXNlIGluc2Vuc2l0aXZlIHN0cmluZ3MuIFRoaXMgaXMgbWVhbnQKLSAqIHRvIGJlIGxvY2FsZSBpbmRlcGVuZGVudCBhbmQgb25seSBjb21wYXJlIHN0cmluZ3Mgd2Uga25vdyBhcmUgc2FmZSBmb3IKLSAqIHRoaXMuICBTZWUgaHR0cHM6Ly9kYW5pZWwuaGF4eC5zZS9ibG9nLzIwMDgvMTAvMTUvc3RyY2FzZWNtcC1pbi10dXJraXNoLyBmb3IKLSAqIHNvbWUgZnVydGhlciBleHBsYW5hdGlvbiB0byB3aHkgdGhpcyBmdW5jdGlvbiBpcyBuZWNlc3NhcnkuCisgKiBDdXJsX3N0cmNhc2Vjb21wYXJlKCkgaXMgZm9yIGRvaW5nICJyYXciIGNhc2UgaW5zZW5zaXRpdmUgc3RyaW5ncy4gVGhpcyBpcworICogbWVhbnQgdG8gYmUgbG9jYWxlIGluZGVwZW5kZW50IGFuZCBvbmx5IGNvbXBhcmUgc3RyaW5ncyB3ZSBrbm93IGFyZSBzYWZlCisgKiBmb3IgdGhpcy4gIFNlZQorICogaHR0cHM6Ly9kYW5pZWwuaGF4eC5zZS9ibG9nLzIwMDgvMTAvMTUvc3RyY2FzZWNtcC1pbi10dXJraXNoLyBmb3Igc29tZQorICogZnVydGhlciBleHBsYW5hdGlvbiB0byB3aHkgdGhpcyBmdW5jdGlvbiBpcyBuZWNlc3NhcnkuCiAgKgogICogVGhlIGZ1bmN0aW9uIGlzIGNhcGFibGUgb2YgY29tcGFyaW5nIGEteiBjYXNlIGluc2Vuc2l0aXZlbHkgZXZlbiBmb3IKICAqIG5vbi1hc2NpaS4KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3N0cmR1cC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc3RyZHVwLmMKaW5kZXggMTM2YjY5My4uMTljYjA0NCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc3RyZHVwLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvc3RyZHVwLmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTQ0LDExICs0NCwxMSBAQAogICBpZihsZW4gPj0gKChzaXplX3QpLTEpIC8gc2l6ZW9mKGNoYXIpKQogICAgIHJldHVybiAoY2hhciAqKU5VTEw7CiAKLSAgbmV3c3RyID0gbWFsbG9jKChsZW4rMSkqc2l6ZW9mKGNoYXIpKTsKKyAgbmV3c3RyID0gbWFsbG9jKChsZW4gKyAxKSpzaXplb2YoY2hhcikpOwogICBpZighbmV3c3RyKQogICAgIHJldHVybiAoY2hhciAqKU5VTEw7CiAKLSAgbWVtY3B5KG5ld3N0ciwgc3RyLCAobGVuKzEpKnNpemVvZihjaGFyKSk7CisgIG1lbWNweShuZXdzdHIsIHN0ciwgKGxlbiArIDEpKnNpemVvZihjaGFyKSk7CiAKICAgcmV0dXJuIG5ld3N0cjsKIApkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc3RyZXJyb3IuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3N0cmVycm9yLmMKaW5kZXggN2U1Y2RlNC4uODNhOTZkZCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc3RyZXJyb3IuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zdHJlcnJvci5jCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC00OSw2ICs0OSwxMCBAQAogI2luY2x1ZGUgImN1cmxfbWVtb3J5LmgiCiAjaW5jbHVkZSAibWVtZGVidWcuaCIKIAorI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkKKyNkZWZpbmUgUFJFU0VSVkVfV0lORE9XU19FUlJPUl9DT0RFCisjZW5kaWYKKwogY29uc3QgY2hhciAqCiBjdXJsX2Vhc3lfc3RyZXJyb3IoQ1VSTGNvZGUgZXJyb3IpCiB7CkBAIC00MzIsNiArNDM2LDEwIEBACiBzdGF0aWMgY29uc3QgY2hhciAqCiBnZXRfd2luc29ja19lcnJvciAoaW50IGVyciwgY2hhciAqYnVmLCBzaXplX3QgbGVuKQogeworI2lmZGVmIFBSRVNFUlZFX1dJTkRPV1NfRVJST1JfQ09ERQorICBEV09SRCBvbGRfd2luX2VyciA9IEdldExhc3RFcnJvcigpOworI2VuZGlmCisgIGludCBvbGRfZXJybm8gPSBlcnJubzsKICAgY29uc3QgY2hhciAqcDsKIAogI2lmbmRlZiBDVVJMX0RJU0FCTEVfVkVSQk9TRV9TVFJJTkdTCkBAIC02MTEsNiArNjE5LDE1IEBACiAjZW5kaWYKICAgc3RybmNweShidWYsIHAsIGxlbik7CiAgIGJ1ZiBbbGVuLTFdID0gJ1wwJzsKKworICBpZihlcnJubyAhPSBvbGRfZXJybm8pCisgICAgZXJybm8gPSBvbGRfZXJybm87CisKKyNpZmRlZiBQUkVTRVJWRV9XSU5ET1dTX0VSUk9SX0NPREUKKyAgaWYob2xkX3dpbl9lcnIgIT0gR2V0TGFzdEVycm9yKCkpCisgICAgU2V0TGFzdEVycm9yKG9sZF93aW5fZXJyKTsKKyNlbmRpZgorCiAgIHJldHVybiBidWY7CiB9CiAjZW5kaWYgICAvKiBVU0VfV0lOU09DSyAqLwpAQCAtNjI4LDkgKzY0NSwxMiBAQAogICovCiBjb25zdCBjaGFyICpDdXJsX3N0cmVycm9yKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IGVycikKIHsKKyNpZmRlZiBQUkVTRVJWRV9XSU5ET1dTX0VSUk9SX0NPREUKKyAgRFdPUkQgb2xkX3dpbl9lcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyNlbmRpZgorICBpbnQgb2xkX2Vycm5vID0gZXJybm87CiAgIGNoYXIgKmJ1ZiwgKnA7CiAgIHNpemVfdCBtYXg7Ci0gIGludCBvbGRfZXJybm8gPSBFUlJOTzsKIAogICBERUJVR0FTU0VSVChjb25uKTsKICAgREVCVUdBU1NFUlQoZXJyID49IDApOwpAQCAtNzIyLDggKzc0MiwxMyBAQAogICBpZihwICYmIChwIC0gYnVmKSA+PSAxKQogICAgICpwID0gJ1wwJzsKIAotICBpZihvbGRfZXJybm8gIT0gRVJSTk8pCi0gICAgU0VUX0VSUk5PKG9sZF9lcnJubyk7CisgIGlmKGVycm5vICE9IG9sZF9lcnJubykKKyAgICBlcnJubyA9IG9sZF9lcnJubzsKKworI2lmZGVmIFBSRVNFUlZFX1dJTkRPV1NfRVJST1JfQ09ERQorICBpZihvbGRfd2luX2VyciAhPSBHZXRMYXN0RXJyb3IoKSkKKyAgICBTZXRMYXN0RXJyb3Iob2xkX3dpbl9lcnIpOworI2VuZGlmCiAKICAgcmV0dXJuIGJ1ZjsKIH0KQEAgLTczMSwxNiArNzU2LDE5IEBACiAjaWZkZWYgVVNFX1dJTkRPV1NfU1NQSQogY29uc3QgY2hhciAqQ3VybF9zc3BpX3N0cmVycm9yIChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBlcnIpCiB7CisjaWZkZWYgUFJFU0VSVkVfV0lORE9XU19FUlJPUl9DT0RFCisgIERXT1JEIG9sZF93aW5fZXJyID0gR2V0TGFzdEVycm9yKCk7CisjZW5kaWYKKyAgaW50IG9sZF9lcnJubyA9IGVycm5vOworICBjb25zdCBjaGFyICp0eHQ7CisgIGNoYXIgKm91dGJ1ZjsKKyAgc2l6ZV90IG91dG1heDsKICNpZm5kZWYgQ1VSTF9ESVNBQkxFX1ZFUkJPU0VfU1RSSU5HUwogICBjaGFyIHR4dGJ1Zls4MF07CiAgIGNoYXIgbXNnYnVmW3NpemVvZihjb25uLT5zeXNlcnJfYnVmKV07CiAgIGNoYXIgKnAsICpzdHIsICptc2cgPSBOVUxMOwogICBib29sIG1zZ19mb3JtYXR0ZWQgPSBGQUxTRTsKLSAgaW50IG9sZF9lcnJubzsKICNlbmRpZgotICBjb25zdCBjaGFyICp0eHQ7Ci0gIGNoYXIgKm91dGJ1ZjsKLSAgc2l6ZV90IG91dG1heDsKIAogICBERUJVR0FTU0VSVChjb25uKTsKIApAQCAtNzUwLDggKzc3OCw2IEBACiAKICNpZm5kZWYgQ1VSTF9ESVNBQkxFX1ZFUkJPU0VfU1RSSU5HUwogCi0gIG9sZF9lcnJubyA9IEVSUk5POwotCiAgIHN3aXRjaChlcnIpIHsKICAgICBjYXNlIFNFQ19FX09LOgogICAgICAgdHh0ID0gIk5vIGVycm9yIjsKQEAgLTEwNTEsOSArMTA3Nyw2IEBACiAgICAgICBzdHJuY3B5KG91dGJ1Ziwgc3RyLCBvdXRtYXgpOwogICB9CiAKLSAgaWYob2xkX2Vycm5vICE9IEVSUk5PKQotICAgIFNFVF9FUlJOTyhvbGRfZXJybm8pOwotCiAjZWxzZQogCiAgIGlmKGVyciA9PSBTRUNfRV9PSykKQEAgLTEwNjcsNiArMTA5MCwxNCBAQAogCiAgIG91dGJ1ZltvdXRtYXhdID0gJ1wwJzsKIAorICBpZihlcnJubyAhPSBvbGRfZXJybm8pCisgICAgZXJybm8gPSBvbGRfZXJybm87CisKKyNpZmRlZiBQUkVTRVJWRV9XSU5ET1dTX0VSUk9SX0NPREUKKyAgaWYob2xkX3dpbl9lcnIgIT0gR2V0TGFzdEVycm9yKCkpCisgICAgU2V0TGFzdEVycm9yKG9sZF93aW5fZXJyKTsKKyNlbmRpZgorCiAgIHJldHVybiBvdXRidWY7CiB9CiAjZW5kaWYgLyogVVNFX1dJTkRPV1NfU1NQSSAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc3RydG9vZmZ0LmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zdHJ0b29mZnQuYwppbmRleCBiODU0YmY0Li44MDdmYzU0IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zdHJ0b29mZnQuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zdHJ0b29mZnQuYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtMjAsNiArMjAsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgImN1cmxfc2V0dXAuaCIKIAogI2luY2x1ZGUgInN0cnRvb2ZmdC5oIgpAQCAtMjksMTAgKzMwLDMyIEBACiAgKgogICogSW4gdGhlIElTTyBDIHN0YW5kYXJkIChJRUVFIFN0ZCAxMDAzLjEpLCB0aGVyZSBpcyBhIHN0cnRvaW1heCgpIGZ1bmN0aW9uIHdlCiAgKiBjb3VsZCB1c2UgaW4gY2FzZSBzdHJ0b2xsKCkgZG9lc24ndCBleGlzdC4uLiAgU2VlCi0gKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDk2OTUzOTkvZnVuY3Rpb25zL3N0cnRvaW1heC5odG1sCisgKiBodHRwczovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L2Z1bmN0aW9ucy9zdHJ0b2ltYXguaHRtbAogICovCiAKLSNpZmRlZiBORUVEX0NVUkxfU1RSVE9MTAorI2lmIChTSVpFT0ZfQ1VSTF9PRkZfVCA+IFNJWkVPRl9MT05HKQorIyAgaWZkZWYgSEFWRV9TVFJUT0xMCisjICAgIGRlZmluZSBzdHJ0b29mZiBzdHJ0b2xsCisjICBlbHNlCisjICAgIGlmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMzAwKSAmJiAoX0lOVEVHUkFMX01BWF9CSVRTID49IDY0KQorIyAgICAgIGlmIGRlZmluZWQoX1NBTF9WRVJTSU9OKQorICAgICAgICAgX0NoZWNrX3JldHVybl8gX0NSVElNUCBfX2ludDY0IF9fY2RlY2wgX3N0cnRvaTY0KAorICAgICAgICAgICAgIF9Jbl96XyBjb25zdCBjaGFyICpfU3RyaW5nLAorICAgICAgICAgICAgIF9PdXRfb3B0XyBfRGVyZWZfcG9zdF96XyBjaGFyICoqX0VuZFB0ciwgX0luXyBpbnQgX1JhZGl4KTsKKyMgICAgICBlbHNlCisgICAgICAgICBfQ1JUSU1QIF9faW50NjQgX19jZGVjbCBfc3RydG9pNjQoY29uc3QgY2hhciAqX1N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqX0VuZFB0ciwgaW50IF9SYWRpeCk7CisjICAgICAgZW5kaWYKKyMgICAgICBkZWZpbmUgc3RydG9vZmYgX3N0cnRvaTY0CisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgUFJJVkFURV9TVFJUT09GRiAxCisjICAgIGVuZGlmCisjICBlbmRpZgorI2Vsc2UKKyMgIGRlZmluZSBzdHJ0b29mZiBzdHJ0b2wKKyNlbmRpZgorCisjaWZkZWYgUFJJVkFURV9TVFJUT09GRgogCiAvKiBSYW5nZSB0ZXN0cyBjYW4gYmUgdXNlZCBmb3IgYWxwaGFudW0gZGVjb2RpbmcgaWYgY2hhcmFjdGVycyBhcmUgY29uc2VjdXRpdmUsCiAgICBsaWtlIGluIEFTQ0lJLiBFbHNlIGFuIGFycmF5IGlzIHNjYW5uZWQuIERldGVybWluZSB0aGlzIGNvbmRpdGlvbiBub3cuICovCkBAIC00OCwxMSArNzEsMTAgQEAKIHN0YXRpYyBpbnQgZ2V0X2NoYXIoY2hhciBjLCBpbnQgYmFzZSk7CiAKIC8qKgotICogRW11bGF0ZWQgdmVyc2lvbiBvZiB0aGUgc3RydG9sbCBmdW5jdGlvbi4gIFRoaXMgZXh0cmFjdHMgYSBsb25nIGxvbmcKKyAqIEN1c3RvbSB2ZXJzaW9uIG9mIHRoZSBzdHJ0b29mZiBmdW5jdGlvbi4gIFRoaXMgZXh0cmFjdHMgYSBjdXJsX29mZl90CiAgKiB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBpbnB1dCBzdHJpbmcgYW5kIHJldHVybnMgaXQuCiAgKi8KLWN1cmxfb2ZmX3QKLWN1cmx4X3N0cnRvbGwoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwgaW50IGJhc2UpCitzdGF0aWMgY3VybF9vZmZfdCBzdHJ0b29mZihjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSkKIHsKICAgY2hhciAqZW5kOwogICBpbnQgaXNfbmVnYXRpdmUgPSAwOwpAQCAtMTMyLDcgKzE1NCw3IEBACiAgICAgZWxzZQogICAgICAgdmFsdWUgPSBDVVJMX09GRl9UX01BWDsKIAotICAgIFNFVF9FUlJOTyhFUkFOR0UpOworICAgIGVycm5vID0gRVJBTkdFOwogICB9CiAKICAgaWYoZW5kcHRyKQpAQCAtMTg2LDMgKzIwOCwzNCBAQAogICByZXR1cm4gdmFsdWU7CiB9CiAjZW5kaWYgIC8qIE9ubHkgcHJlc2VudCBpZiB3ZSBuZWVkIHN0cnRvbGwsIGJ1dCBkb24ndCBoYXZlIGl0LiAqLworCisvKgorICogUGFyc2UgYSAqcG9zaXRpdmUqIHVwIHRvIDY0IGJpdCBudW1iZXIgd3JpdHRlbiBpbiBhc2NpaS4KKyAqLworQ1VSTG9mZnQgY3VybHhfc3RydG9vZmZ0KGNvbnN0IGNoYXIgKnN0ciwgY2hhciAqKmVuZHAsIGludCBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfb2ZmX3QgKm51bSkKK3sKKyAgY2hhciAqZW5kOworICBjdXJsX29mZl90IG51bWJlcjsKKyAgZXJybm8gPSAwOworICAqbnVtID0gMDsgLyogY2xlYXIgYnkgZGVmYXVsdCAqLworICB3aGlsZShzdHIgJiYgKnN0ciAmJiBJU1NQQUNFKCpzdHIpKQorICAgIHN0cisrOworICBpZignLScgPT0gKnN0cikgeworICAgIGlmKGVuZHApCisgICAgICAqZW5kcCA9IChjaGFyICopc3RyOyAvKiBkaWRuJ3QgYWN0dWFsbHkgbW92ZSAqLworICAgIHJldHVybiBDVVJMX09GRlRfSU5WQUw7IC8qIG5vdGhpbmcgcGFyc2VkICovCisgIH0KKyAgbnVtYmVyID0gc3RydG9vZmYoc3RyLCAmZW5kLCBiYXNlKTsKKyAgaWYoZW5kcCkKKyAgICAqZW5kcCA9IGVuZDsKKyAgaWYoZXJybm8gPT0gRVJBTkdFKQorICAgIC8qIG92ZXJmbG93L3VuZGVyZmxvdyAqLworICAgIHJldHVybiBDVVJMX09GRlRfRkxPVzsKKyAgZWxzZSBpZihzdHIgPT0gZW5kKQorICAgIC8qIG5vdGhpbmcgcGFyc2VkICovCisgICAgcmV0dXJuIENVUkxfT0ZGVF9JTlZBTDsKKworICAqbnVtID0gbnVtYmVyOworICByZXR1cm4gQ1VSTF9PRkZUX09LOworfQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvc3RydG9vZmZ0LmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zdHJ0b29mZnQuaAppbmRleCBmNDAzOWYzLi4yNDQ0MTFhIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi9zdHJ0b29mZnQuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi9zdHJ0b29mZnQuaApAQCAtNyw3ICs3LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE0LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtNDAsMzEgKzQwLDcgQEAKICAqIG9mICdsb25nJyB0aGUgY29udmVyc2lvbiBmdW5jdGlvbiB0byB1c2UgaXMgc3RydG9sKCkuCiAgKi8KIAotI2lmIChDVVJMX1NJWkVPRl9DVVJMX09GRl9UID4gQ1VSTF9TSVpFT0ZfTE9ORykKLSMgIGlmZGVmIEhBVkVfU1RSVE9MTAotIyAgICBkZWZpbmUgY3VybHhfc3RydG9vZmZ0IHN0cnRvbGwKLSMgIGVsc2UKLSMgICAgaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEzMDApICYmIChfSU5URUdSQUxfTUFYX0JJVFMgPj0gNjQpCi0jICAgICAgaWYgZGVmaW5lZChfU0FMX1ZFUlNJT04pCi0gICAgICAgICBfQ2hlY2tfcmV0dXJuXyBfQ1JUSU1QIF9faW50NjQgX19jZGVjbCBfc3RydG9pNjQoCi0gICAgICAgICAgICAgX0luX3pfIGNvbnN0IGNoYXIgKl9TdHJpbmcsCi0gICAgICAgICAgICAgX091dF9vcHRfIF9EZXJlZl9wb3N0X3pfIGNoYXIgKipfRW5kUHRyLCBfSW5fIGludCBfUmFkaXgpOwotIyAgICAgIGVsc2UKLSAgICAgICAgIF9DUlRJTVAgX19pbnQ2NCBfX2NkZWNsIF9zdHJ0b2k2NChjb25zdCBjaGFyICpfU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipfRW5kUHRyLCBpbnQgX1JhZGl4KTsKLSMgICAgICBlbmRpZgotIyAgICAgIGRlZmluZSBjdXJseF9zdHJ0b29mZnQgX3N0cnRvaTY0Ci0jICAgIGVsc2UKLSAgICAgICBjdXJsX29mZl90IGN1cmx4X3N0cnRvbGwoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwgaW50IGJhc2UpOwotIyAgICAgIGRlZmluZSBjdXJseF9zdHJ0b29mZnQgY3VybHhfc3RydG9sbAotIyAgICAgIGRlZmluZSBORUVEX0NVUkxfU1RSVE9MTCAxCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2Vsc2UKLSMgIGRlZmluZSBjdXJseF9zdHJ0b29mZnQgc3RydG9sCi0jZW5kaWYKLQotI2lmIChDVVJMX1NJWkVPRl9DVVJMX09GRl9UID09IDQpCisjaWYgKFNJWkVPRl9DVVJMX09GRl9UID09IDQpCiAjICBkZWZpbmUgQ1VSTF9PRkZfVF9NQVggQ1VSTF9PRkZfVF9DKDB4N0ZGRkZGRkYpCiAjZWxzZQogICAgLyogYXNzdW1lIENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgPT0gOCAqLwpAQCAtNzIsNCArNDgsMTMgQEAKICNlbmRpZgogI2RlZmluZSBDVVJMX09GRl9UX01JTiAoLUNVUkxfT0ZGX1RfTUFYIC0gQ1VSTF9PRkZfVF9DKDEpKQogCit0eXBlZGVmIGVudW0geworICBDVVJMX09GRlRfT0ssICAgIC8qIHBhcnNlZCBmaW5lICovCisgIENVUkxfT0ZGVF9GTE9XLCAgLyogb3ZlciBvciB1bmRlcmZsb3cgKi8KKyAgQ1VSTF9PRkZUX0lOVkFMICAvKiBub3RoaW5nIHdhcyBwYXJzZWQgKi8KK30gQ1VSTG9mZnQ7CisKK0NVUkxvZmZ0IGN1cmx4X3N0cnRvb2ZmdChjb25zdCBjaGFyICpzdHIsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX29mZl90ICpudW0pOworCiAjZW5kaWYgLyogSEVBREVSX0NVUkxfU1RSVE9PRkZUX0ggKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3RlbG5ldC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdGVsbmV0LmMKaW5kZXggMTU1ZDRiMi4uYTdiZWQzZCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdGVsbmV0LmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdGVsbmV0LmMKQEAgLTc2LDcgKzc2LDcgQEAKICAgfSBXSElMRV9GQUxTRQogI2RlZmluZSBDVVJMX1NCX0FDQ1VNKHgsYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYoeC0+c3VicG9pbnRlciA8ICh4LT5zdWJidWZmZXIrc2l6ZW9mIHgtPnN1YmJ1ZmZlcikpICAgXAorICAgIGlmKHgtPnN1YnBvaW50ZXIgPCAoeC0+c3ViYnVmZmVyICsgc2l6ZW9mIHgtPnN1YmJ1ZmZlcikpIFwKICAgICAgICp4LT5zdWJwb2ludGVyKysgPSAoYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH0gV0hJTEVfRkFMU0UKIApAQCAtMTkyLDYgKzE5Miw3IEBACiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyZm9ybV9nZXRzb2NrICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY29ubmVjdCAqLwogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWR3cml0ZSAqLworICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb25fY2hlY2sgKi8KICAgUE9SVF9URUxORVQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZwb3J0ICovCiAgIENVUkxQUk9UT19URUxORVQsICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKi8KICAgUFJPVE9QVF9OT05FIHwgUFJPVE9QVF9OT1VSTFFVRVJZICAgICAvKiBmbGFncyAqLwpAQCAtMjk0LDggKzI5NSw4IEBACiAgIGludCBpOwogICBzdHJ1Y3QgVEVMTkVUICp0biA9IChzdHJ1Y3QgVEVMTkVUICopIGNvbm4tPmRhdGEtPnJlcS5wcm90b3A7CiAKLSAgZm9yKGkgPSAwO2kgPCBDVVJMX05URUxPUFRTO2krKykgewotICAgIGlmKGk9PUNVUkxfVEVMT1BUX0VDSE8pCisgIGZvcihpID0gMDsgaSA8IENVUkxfTlRFTE9QVFM7IGkrKykgeworICAgIGlmKGkgPT0gQ1VSTF9URUxPUFRfRUNITykKICAgICAgIGNvbnRpbnVlOwogCiAgICAgaWYodG4tPnVzX3ByZWZlcnJlZFtpXSA9PSBDVVJMX1lFUykKQEAgLTc5MSw3ICs3OTIsNyBAQAogICAgICAgY2FzZSBDVVJMX1RFTE9QVF9ORVdfRU5WSVJPTjoKICAgICAgICAgaWYocG9pbnRlclsxXSA9PSBDVVJMX1RFTFFVQUxfSVMpIHsKICAgICAgICAgICBpbmZvZihkYXRhLCAiICIpOwotICAgICAgICAgIGZvcihpID0gMztpIDwgbGVuZ3RoO2krKykgeworICAgICAgICAgIGZvcihpID0gMzsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBzd2l0Y2gocG9pbnRlcltpXSkgewogICAgICAgICAgICAgY2FzZSBDVVJMX05FV19FTlZfVkFSOgogICAgICAgICAgICAgICBpbmZvZihkYXRhLCAiLCAiKTsKQEAgLTg0Miw3ICs4NDMsNyBAQAogICAgIHRuLT51c19wcmVmZXJyZWRbQ1VSTF9URUxPUFRfTkVXX0VOVklST05dID0gQ1VSTF9ZRVM7CiAgIH0KIAotICBmb3IoaGVhZCA9IGRhdGEtPnNldC50ZWxuZXRfb3B0aW9uczsgaGVhZDsgaGVhZD1oZWFkLT5uZXh0KSB7CisgIGZvcihoZWFkID0gZGF0YS0+c2V0LnRlbG5ldF9vcHRpb25zOyBoZWFkOyBoZWFkID0gaGVhZC0+bmV4dCkgewogICAgIGlmKHNzY2FuZihoZWFkLT5kYXRhLCAiJTEyN1tePSBdJSpbID1dJTI1NXMiLAogICAgICAgICAgICAgICBvcHRpb25fa2V5d29yZCwgb3B0aW9uX2FyZykgPT0gMikgewogCkBAIC04ODksOCArODkwLDggQEAKIAogICAgICAgLyogVG8gdGFrZSBjYXJlIG9yIG5vdCBvZiB0aGUgOHRoIGJpdCBpbiBkYXRhIGV4Y2hhbmdlICovCiAgICAgICBpZihzdHJjYXNlY29tcGFyZShvcHRpb25fa2V5d29yZCwgIkJJTkFSWSIpKSB7Ci0gICAgICAgIGJpbmFyeV9vcHRpb249YXRvaShvcHRpb25fYXJnKTsKLSAgICAgICAgaWYoYmluYXJ5X29wdGlvbiE9MSkgeworICAgICAgICBiaW5hcnlfb3B0aW9uID0gYXRvaShvcHRpb25fYXJnKTsKKyAgICAgICAgaWYoYmluYXJ5X29wdGlvbiAhPSAxKSB7CiAgICAgICAgICAgdG4tPnVzX3ByZWZlcnJlZFtDVVJMX1RFTE9QVF9CSU5BUlldID0gQ1VSTF9OTzsKICAgICAgICAgICB0bi0+aGltX3ByZWZlcnJlZFtDVVJMX1RFTE9QVF9CSU5BUlldID0gQ1VSTF9OTzsKICAgICAgICAgfQpAQCAtODk4LDcgKzg5OSw3IEBACiAgICAgICB9CiAKICAgICAgIGZhaWxmKGRhdGEsICJVbmtub3duIHRlbG5ldCBvcHRpb24gJXMiLCBoZWFkLT5kYXRhKTsKLSAgICAgIHJlc3VsdCA9IENVUkxFX1VOS05PV05fVEVMTkVUX09QVElPTjsKKyAgICAgIHJlc3VsdCA9IENVUkxFX1VOS05PV05fT1BUSU9OOwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGZhaWxmKGRhdGEsICJTeW50YXggZXJyb3IgaW4gdGVsbmV0IG9wdGlvbjogJXMiLCBoZWFkLT5kYXRhKTsKQEAgLTkzNCw3ICs5MzUsNyBAQAogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKICAgc3RydWN0IFRFTE5FVCAqdG4gPSAoc3RydWN0IFRFTE5FVCAqKWRhdGEtPnJlcS5wcm90b3A7CiAKLSAgcHJpbnRzdWIoZGF0YSwgJzwnLCAodW5zaWduZWQgY2hhciAqKXRuLT5zdWJidWZmZXIsIENVUkxfU0JfTEVOKHRuKSsyKTsKKyAgcHJpbnRzdWIoZGF0YSwgJzwnLCAodW5zaWduZWQgY2hhciAqKXRuLT5zdWJidWZmZXIsIENVUkxfU0JfTEVOKHRuKSArIDIpOwogICBzd2l0Y2goQ1VSTF9TQl9HRVQodG4pKSB7CiAgICAgY2FzZSBDVVJMX1RFTE9QVF9UVFlQRToKICAgICAgIGxlbiA9IHN0cmxlbih0bi0+c3Vib3B0X3R0eXBlKSArIDQgKyAyOwpAQCAtOTY2LDcgKzk2Nyw3IEBACiAgICAgICAgICAgICAgICBDVVJMX1RFTFFVQUxfSVMpOwogICAgICAgbGVuID0gNDsKIAotICAgICAgZm9yKHYgPSB0bi0+dGVsbmV0X3ZhcnM7djt2ID0gdi0+bmV4dCkgeworICAgICAgZm9yKHYgPSB0bi0+dGVsbmV0X3ZhcnM7IHY7IHYgPSB2LT5uZXh0KSB7CiAgICAgICAgIHRtcGxlbiA9IChzdHJsZW4odi0+ZGF0YSkgKyAxKTsKICAgICAgICAgLyogQWRkIHRoZSB2YXJpYWJsZSBvbmx5IGlmIGl0IGZpdHMgKi8KICAgICAgICAgaWYobGVuICsgdG1wbGVuIDwgKGludClzaXplb2YodGVtcCktNikgewpAQCAtMTAxOCw4ICsxMDE5LDggQEAKICAgICBDVVJMX1NCX0FDQ1VNKHRuLCBDVVJMX1RFTE9QVF9OQVdTKTsKICAgICAvKiBXZSBtdXN0IGRlYWwgZWl0aGVyIHdpdGggbGl0dGUgb3IgYmlnIGVuZGlhbiBwcm9jZXNzb3JzICovCiAgICAgLyogV2luZG93IHNpemUgbXVzdCBiZSBzZW50IGFjY29yZGluZyB0byB0aGUgJ25ldHdvcmsgb3JkZXInICovCi0gICAgeD1odG9ucyh0bi0+c3Vib3B0X3dzeCk7Ci0gICAgeT1odG9ucyh0bi0+c3Vib3B0X3dzeSk7CisgICAgeCA9IGh0b25zKHRuLT5zdWJvcHRfd3N4KTsKKyAgICB5ID0gaHRvbnModG4tPnN1Ym9wdF93c3kpOwogICAgIHVjMSA9ICh1bnNpZ25lZCBjaGFyICopJng7CiAgICAgdWMyID0gKHVuc2lnbmVkIGNoYXIgKikmeTsKICAgICBDVVJMX1NCX0FDQ1VNKHRuLCB1YzFbMF0pOwpAQCAtMTAzMiw3ICsxMDMzLDcgQEAKICAgICBDVVJMX1NCX1RFUk0odG4pOwogICAgIC8qIGRhdGEgc3Vib3B0aW9uIGlzIG5vdyByZWFkeSAqLwogCi0gICAgcHJpbnRzdWIoZGF0YSwgJz4nLCAodW5zaWduZWQgY2hhciAqKXRuLT5zdWJidWZmZXIrMiwKKyAgICBwcmludHN1YihkYXRhLCAnPicsICh1bnNpZ25lZCBjaGFyICopdG4tPnN1YmJ1ZmZlciArIDIsCiAgICAgICAgICAgICAgQ1VSTF9TQl9MRU4odG4pLTIpOwogCiAgICAgLyogd2Ugc2VuZCB0aGUgaGVhZGVyIG9mIHRoZSBzdWJvcHRpb24uLi4gKi8KQEAgLTEwNDMsOSArMTA0NCw5IEBACiAgICAgfQogICAgIC8qIC4uLiB0aGVuIHRoZSB3aW5kb3cgc2l6ZSB3aXRoIHRoZSBzZW5kX3RlbG5ldF9kYXRhKCkgZnVuY3Rpb24KICAgICAgICB0byBkZWFsIHdpdGggMHhGRiBjYXNlcyAuLi4gKi8KLSAgICBzZW5kX3RlbG5ldF9kYXRhKGNvbm4sIChjaGFyICopdG4tPnN1YmJ1ZmZlciszLCA0KTsKKyAgICBzZW5kX3RlbG5ldF9kYXRhKGNvbm4sIChjaGFyICopdG4tPnN1YmJ1ZmZlciArIDMsIDQpOwogICAgIC8qIC4uLiBhbmQgdGhlIGZvb3RlciAqLwotICAgIGJ5dGVzX3dyaXR0ZW4gPSBzd3JpdGUoY29ubi0+c29ja1tGSVJTVFNPQ0tFVF0sIHRuLT5zdWJidWZmZXIrNywgMik7CisgICAgYnl0ZXNfd3JpdHRlbiA9IHN3cml0ZShjb25uLT5zb2NrW0ZJUlNUU09DS0VUXSwgdG4tPnN1YmJ1ZmZlciArIDcsIDIpOwogICAgIGlmKGJ5dGVzX3dyaXR0ZW4gPCAwKSB7CiAgICAgICBlcnIgPSBTT0NLRVJSTk87CiAgICAgICBmYWlsZihkYXRhLCAiU2VuZGluZyBkYXRhIGZhaWxlZCAoJWQpIiwgZXJyKTsKQEAgLTEwNjMsNyArMTA2NCw3IEBACiAgIHVuc2lnbmVkIGNoYXIgYzsKICAgQ1VSTGNvZGUgcmVzdWx0OwogICBpbnQgaW4gPSAwOwotICBpbnQgc3RhcnR3cml0ZT0tMTsKKyAgaW50IHN0YXJ0d3JpdGUgPSAtMTsKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIHN0cnVjdCBURUxORVQgKnRuID0gKHN0cnVjdCBURUxORVQgKilkYXRhLT5yZXEucHJvdG9wOwogCkBAIC0xMzI2LDcgKzEzMjcsNyBAQAogICBjdXJsX29mZl90IHRvdGFsX3VsID0gMDsKICNlbmRpZgogICBzc2l6ZV90IG5yZWFkOwotICBzdHJ1Y3QgdGltZXZhbCBub3c7CisgIHN0cnVjdCBjdXJsdGltZSBub3c7CiAgIGJvb2wga2VlcG9uID0gVFJVRTsKICAgY2hhciAqYnVmID0gZGF0YS0+c3RhdGUuYnVmZmVyOwogICBzdHJ1Y3QgVEVMTkVUICp0bjsKQEAgLTEzNTYsMTQgKzEzNTcsMTQgQEAKICAgLyogbG9hZCB3czJfMzIuZGxsIGFuZCBnZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIHdlIG5lZWQuICovCiAgIHdzb2NrMiA9IEN1cmxfbG9hZF9saWJyYXJ5KFRFWFQoIldTMl8zMi5ETEwiKSk7CiAgIGlmKHdzb2NrMiA9PSBOVUxMKSB7Ci0gICAgZmFpbGYoZGF0YSwgImZhaWxlZCB0byBsb2FkIFdTMl8zMi5ETEwgKCVkKSIsIEVSUk5PKTsKKyAgICBmYWlsZihkYXRhLCAiZmFpbGVkIHRvIGxvYWQgV1MyXzMyLkRMTCAoJXUpIiwgR2V0TGFzdEVycm9yKCkpOwogICAgIHJldHVybiBDVVJMRV9GQUlMRURfSU5JVDsKICAgfQogCiAgIC8qIEdyYWIgYSBwb2ludGVyIHRvIFdTQUNyZWF0ZUV2ZW50ICovCiAgIGNyZWF0ZV9ldmVudF9mdW5jID0gR2V0UHJvY0FkZHJlc3Mod3NvY2syLCAiV1NBQ3JlYXRlRXZlbnQiKTsKICAgaWYoY3JlYXRlX2V2ZW50X2Z1bmMgPT0gTlVMTCkgewotICAgIGZhaWxmKGRhdGEsICJmYWlsZWQgdG8gZmluZCBXU0FDcmVhdGVFdmVudCBmdW5jdGlvbiAoJWQpIiwgRVJSTk8pOworICAgIGZhaWxmKGRhdGEsICJmYWlsZWQgdG8gZmluZCBXU0FDcmVhdGVFdmVudCBmdW5jdGlvbiAoJXUpIiwgR2V0TGFzdEVycm9yKCkpOwogICAgIEZyZWVMaWJyYXJ5KHdzb2NrMik7CiAgICAgcmV0dXJuIENVUkxFX0ZBSUxFRF9JTklUOwogICB9CkBAIC0xMzcxLDcgKzEzNzIsNyBAQAogICAvKiBBbmQgV1NBQ2xvc2VFdmVudCAqLwogICBjbG9zZV9ldmVudF9mdW5jID0gR2V0UHJvY0FkZHJlc3Mod3NvY2syLCAiV1NBQ2xvc2VFdmVudCIpOwogICBpZihjbG9zZV9ldmVudF9mdW5jID09IE5VTEwpIHsKLSAgICBmYWlsZihkYXRhLCAiZmFpbGVkIHRvIGZpbmQgV1NBQ2xvc2VFdmVudCBmdW5jdGlvbiAoJWQpIiwgRVJSTk8pOworICAgIGZhaWxmKGRhdGEsICJmYWlsZWQgdG8gZmluZCBXU0FDbG9zZUV2ZW50IGZ1bmN0aW9uICgldSkiLCBHZXRMYXN0RXJyb3IoKSk7CiAgICAgRnJlZUxpYnJhcnkod3NvY2syKTsKICAgICByZXR1cm4gQ1VSTEVfRkFJTEVEX0lOSVQ7CiAgIH0KQEAgLTEzNzksNyArMTM4MCw3IEBACiAgIC8qIEFuZCBXU0FFdmVudFNlbGVjdCAqLwogICBldmVudF9zZWxlY3RfZnVuYyA9IEdldFByb2NBZGRyZXNzKHdzb2NrMiwgIldTQUV2ZW50U2VsZWN0Iik7CiAgIGlmKGV2ZW50X3NlbGVjdF9mdW5jID09IE5VTEwpIHsKLSAgICBmYWlsZihkYXRhLCAiZmFpbGVkIHRvIGZpbmQgV1NBRXZlbnRTZWxlY3QgZnVuY3Rpb24gKCVkKSIsIEVSUk5PKTsKKyAgICBmYWlsZihkYXRhLCAiZmFpbGVkIHRvIGZpbmQgV1NBRXZlbnRTZWxlY3QgZnVuY3Rpb24gKCV1KSIsIEdldExhc3RFcnJvcigpKTsKICAgICBGcmVlTGlicmFyeSh3c29jazIpOwogICAgIHJldHVybiBDVVJMRV9GQUlMRURfSU5JVDsKICAgfQpAQCAtMTM4Nyw3ICsxMzg4LDggQEAKICAgLyogQW5kIFdTQUVudW1OZXR3b3JrRXZlbnRzICovCiAgIGVudW1fbmV0ZXZlbnRzX2Z1bmMgPSBHZXRQcm9jQWRkcmVzcyh3c29jazIsICJXU0FFbnVtTmV0d29ya0V2ZW50cyIpOwogICBpZihlbnVtX25ldGV2ZW50c19mdW5jID09IE5VTEwpIHsKLSAgICBmYWlsZihkYXRhLCAiZmFpbGVkIHRvIGZpbmQgV1NBRW51bU5ldHdvcmtFdmVudHMgZnVuY3Rpb24gKCVkKSIsIEVSUk5PKTsKKyAgICBmYWlsZihkYXRhLCAiZmFpbGVkIHRvIGZpbmQgV1NBRW51bU5ldHdvcmtFdmVudHMgZnVuY3Rpb24gKCV1KSIsCisgICAgICAgICAgR2V0TGFzdEVycm9yKCkpOwogICAgIEZyZWVMaWJyYXJ5KHdzb2NrMik7CiAgICAgcmV0dXJuIENVUkxFX0ZBSUxFRF9JTklUOwogICB9CkBAIC0xNTgwLDcgKzE1ODIsNyBAQAogCiAgIC8qIFdlIGNhbGxlZCBMb2FkTGlicmFyeSwgc28gY2FsbCBGcmVlTGlicmFyeSAqLwogICBpZighRnJlZUxpYnJhcnkod3NvY2syKSkKLSAgICBpbmZvZihkYXRhLCAiRnJlZUxpYnJhcnkod3NvY2syKSBmYWlsZWQgKCVkKSIsIEVSUk5PKTsKKyAgICBpbmZvZihkYXRhLCAiRnJlZUxpYnJhcnkod3NvY2syKSBmYWlsZWQgKCV1KSIsIEdldExhc3RFcnJvcigpKTsKICNlbHNlCiAgIHBmZFswXS5mZCA9IHNvY2tmZDsKICAgcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3RmdHAuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3RmdHAuYwppbmRleCBiMmIzZWZlLi40ZTU5OWZkIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi90ZnRwLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdGZ0cC5jCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC03NiwxMiArNzYsMTIgQEAKICNkZWZpbmUgVEZUUF9PUFRJT05fSU5URVJWQUwgInRpbWVvdXQiCiAKIHR5cGVkZWYgZW51bSB7Ci0gIFRGVFBfTU9ERV9ORVRBU0NJST0wLAorICBURlRQX01PREVfTkVUQVNDSUkgPSAwLAogICBURlRQX01PREVfT0NURVQKIH0gdGZ0cF9tb2RlX3Q7CiAKIHR5cGVkZWYgZW51bSB7Ci0gIFRGVFBfU1RBVEVfU1RBUlQ9MCwKKyAgVEZUUF9TVEFURV9TVEFSVCA9IDAsCiAgIFRGVFBfU1RBVEVfUlgsCiAgIFRGVFBfU1RBVEVfVFgsCiAgIFRGVFBfU1RBVEVfRklOCkBAIC0xMDAsNyArMTAwLDcgQEAKIH0gdGZ0cF9ldmVudF90OwogCiB0eXBlZGVmIGVudW0gewotICBURlRQX0VSUl9VTkRFRj0wLAorICBURlRQX0VSUl9VTkRFRiA9IDAsCiAgIFRGVFBfRVJSX05PVEZPVU5ELAogICBURlRQX0VSUl9QRVJNLAogICBURlRQX0VSUl9ESVNLRlVMTCwKQEAgLTE4MSw2ICsxODEsNyBAQAogICBaRVJPX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmZvcm1fZ2V0c29jayAqLwogICB0ZnRwX2Rpc2Nvbm5lY3QsICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkd3JpdGUgKi8KKyAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uX2NoZWNrICovCiAgIFBPUlRfVEZUUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmcG9ydCAqLwogICBDVVJMUFJPVE9fVEZUUCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sICovCiAgIFBST1RPUFRfTk9ORSB8IFBST1RPUFRfTk9VUkxRVUVSWSAgICAgLyogZmxhZ3MgKi8KQEAgLTIxNiw3ICsyMTcsNyBAQAogICBpZihzdGFydCkgewogCiAgICAgbWF4dGltZSA9ICh0aW1lX3QpKHRpbWVvdXRfbXMgKyA1MDApIC8gMTAwMDsKLSAgICBzdGF0ZS0+bWF4X3RpbWUgPSBzdGF0ZS0+c3RhcnRfdGltZSttYXh0aW1lOworICAgIHN0YXRlLT5tYXhfdGltZSA9IHN0YXRlLT5zdGFydF90aW1lICsgbWF4dGltZTsKIAogICAgIC8qIFNldCBwZXItYmxvY2sgdGltZW91dCB0byB0b3RhbCAqLwogICAgIHRpbWVvdXQgPSBtYXh0aW1lOwpAQCAtMjMxLDcgKzIzMiw3IEBACiAgICAgLyogQ29tcHV0ZSB0aGUgcmUtc3RhcnQgaW50ZXJ2YWwgdG8gc3VpdCB0aGUgdGltZW91dCAqLwogICAgIHN0YXRlLT5yZXRyeV90aW1lID0gKGludCl0aW1lb3V0L3N0YXRlLT5yZXRyeV9tYXg7CiAgICAgaWYoc3RhdGUtPnJldHJ5X3RpbWU8MSkKLSAgICAgIHN0YXRlLT5yZXRyeV90aW1lPTE7CisgICAgICBzdGF0ZS0+cmV0cnlfdGltZSA9IDE7CiAKICAgfQogICBlbHNlIHsKQEAgLTI0MCw3ICsyNDEsNyBAQAogICAgIGVsc2UKICAgICAgIG1heHRpbWUgPSAzNjAwOwogCi0gICAgc3RhdGUtPm1heF90aW1lID0gc3RhdGUtPnN0YXJ0X3RpbWUrbWF4dGltZTsKKyAgICBzdGF0ZS0+bWF4X3RpbWUgPSBzdGF0ZS0+c3RhcnRfdGltZSArIG1heHRpbWU7CiAKICAgICAvKiBTZXQgcGVyLWJsb2NrIHRpbWVvdXQgdG8gdG90YWwgKi8KICAgICB0aW1lb3V0ID0gbWF4dGltZTsKQEAgLTI1MCwxNSArMjUxLDE1IEBACiAgIH0KICAgLyogQnV0IGJvdW5kIHRoZSB0b3RhbCBudW1iZXIgKi8KICAgaWYoc3RhdGUtPnJldHJ5X21heDwzKQotICAgIHN0YXRlLT5yZXRyeV9tYXg9MzsKKyAgICBzdGF0ZS0+cmV0cnlfbWF4ID0gMzsKIAogICBpZihzdGF0ZS0+cmV0cnlfbWF4PjUwKQotICAgIHN0YXRlLT5yZXRyeV9tYXg9NTA7CisgICAgc3RhdGUtPnJldHJ5X21heCA9IDUwOwogCiAgIC8qIENvbXB1dGUgdGhlIHJlLUFDSyBpbnRlcnZhbCB0byBzdWl0IHRoZSB0aW1lb3V0ICovCiAgIHN0YXRlLT5yZXRyeV90aW1lID0gKGludCkodGltZW91dC9zdGF0ZS0+cmV0cnlfbWF4KTsKICAgaWYoc3RhdGUtPnJldHJ5X3RpbWU8MSkKLSAgICBzdGF0ZS0+cmV0cnlfdGltZT0xOworICAgIHN0YXRlLT5yZXRyeV90aW1lID0gMTsKIAogICBpbmZvZihzdGF0ZS0+Y29ubi0+ZGF0YSwKICAgICAgICAgInNldCB0aW1lb3V0cyBmb3Igc3RhdGUgJWQ7IFRvdGFsICVsZCwgcmV0cnkgJWQgbWF4dHJ5ICVkXG4iLApAQCAtMzIwLDcgKzMyMSw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiAgICpvcHRpb24gPSBidWY7CiAKLSAgbG9jICs9IEN1cmxfc3RybmxlbihidWYrbG9jLCBsZW4tbG9jKTsKKyAgbG9jICs9IEN1cmxfc3RybmxlbihidWYgKyBsb2MsIGxlbi1sb2MpOwogICBsb2MrKzsgLyogTlVMTCB0ZXJtICovCiAKICAgaWYobG9jID4gbGVuKQpAQCAtNDc0LDcgKzQ3NSw3IEBACiAgICAgICAvKiBJZiB3ZSBhcmUgdXBsb2FkaW5nLCBzZW5kIGFuIFdSUSAqLwogICAgICAgc2V0cGFja2V0ZXZlbnQoJnN0YXRlLT5zcGFja2V0LCBURlRQX0VWRU5UX1dSUSk7CiAgICAgICBzdGF0ZS0+Y29ubi0+ZGF0YS0+cmVxLnVwbG9hZF9mcm9taGVyZSA9Ci0gICAgICAgIChjaGFyICopc3RhdGUtPnNwYWNrZXQuZGF0YSs0OworICAgICAgICAoY2hhciAqKXN0YXRlLT5zcGFja2V0LmRhdGEgKyA0OwogICAgICAgaWYoZGF0YS0+c3RhdGUuaW5maWxlc2l6ZSAhPSAtMSkKICAgICAgICAgQ3VybF9wZ3JzU2V0VXBsb2FkU2l6ZShkYXRhLCBkYXRhLT5zdGF0ZS5pbmZpbGVzaXplKTsKICAgICB9CkBAIC00OTAsNyArNDkxLDEzIEBACiAgICAgaWYocmVzdWx0KQogICAgICAgcmV0dXJuIHJlc3VsdDsKIAotICAgIHNucHJpbnRmKChjaGFyICopc3RhdGUtPnNwYWNrZXQuZGF0YSsyLAorICAgIGlmKHN0cmxlbihmaWxlbmFtZSkgPiAoc3RhdGUtPmJsa3NpemUgLSBzdHJsZW4obW9kZSkgLSA0KSkgeworICAgICAgZmFpbGYoZGF0YSwgIlRGVFAgZmlsZSBuYW1lIHRvbyBsb25nXG4iKTsKKyAgICAgIGZyZWUoZmlsZW5hbWUpOworICAgICAgcmV0dXJuIENVUkxFX1RGVFBfSUxMRUdBTDsgLyogdG9vIGxvbmcgZmlsZSBuYW1lIGZpZWxkICovCisgICAgfQorCisgICAgc25wcmludGYoKGNoYXIgKilzdGF0ZS0+c3BhY2tldC5kYXRhICsgMiwKICAgICAgICAgICAgICBzdGF0ZS0+Ymxrc2l6ZSwKICAgICAgICAgICAgICAiJXMlYyVzJWMiLCBmaWxlbmFtZSwgJ1wwJywgIG1vZGUsICdcMCcpOwogICAgIHNieXRlcyA9IDQgKyBzdHJsZW4oZmlsZW5hbWUpICsgc3RybGVuKG1vZGUpOwpAQCAtNTA1LDI1ICs1MTIsMjUgQEAKICAgICAgICAgc3RyY3B5KGJ1ZiwgIjAiKTsgLyogdGhlIGRlc3RpbmF0aW9uIGlzIGxhcmdlIGVub3VnaCAqLwogCiAgICAgICBzYnl0ZXMgKz0gdGZ0cF9vcHRpb25fYWRkKHN0YXRlLCBzYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopc3RhdGUtPnNwYWNrZXQuZGF0YStzYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopc3RhdGUtPnNwYWNrZXQuZGF0YSArIHNieXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEZUUF9PUFRJT05fVFNJWkUpOwogICAgICAgc2J5dGVzICs9IHRmdHBfb3B0aW9uX2FkZChzdGF0ZSwgc2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXN0YXRlLT5zcGFja2V0LmRhdGErc2J5dGVzLCBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXN0YXRlLT5zcGFja2V0LmRhdGEgKyBzYnl0ZXMsIGJ1Zik7CiAgICAgICAvKiBhZGQgYmxrc2l6ZSBvcHRpb24gKi8KICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZCIsIHN0YXRlLT5yZXF1ZXN0ZWRfYmxrc2l6ZSk7CiAgICAgICBzYnl0ZXMgKz0gdGZ0cF9vcHRpb25fYWRkKHN0YXRlLCBzYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopc3RhdGUtPnNwYWNrZXQuZGF0YStzYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopc3RhdGUtPnNwYWNrZXQuZGF0YSArIHNieXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEZUUF9PUFRJT05fQkxLU0laRSk7CiAgICAgICBzYnl0ZXMgKz0gdGZ0cF9vcHRpb25fYWRkKHN0YXRlLCBzYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopc3RhdGUtPnNwYWNrZXQuZGF0YStzYnl0ZXMsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopc3RhdGUtPnNwYWNrZXQuZGF0YSArIHNieXRlcywgYnVmKTsKIAogICAgICAgLyogYWRkIHRpbWVvdXQgb3B0aW9uICovCiAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQiLCBzdGF0ZS0+cmV0cnlfdGltZSk7CiAgICAgICBzYnl0ZXMgKz0gdGZ0cF9vcHRpb25fYWRkKHN0YXRlLCBzYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopc3RhdGUtPnNwYWNrZXQuZGF0YStzYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopc3RhdGUtPnNwYWNrZXQuZGF0YSArIHNieXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEZUUF9PUFRJT05fSU5URVJWQUwpOwogICAgICAgc2J5dGVzICs9IHRmdHBfb3B0aW9uX2FkZChzdGF0ZSwgc2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXN0YXRlLT5zcGFja2V0LmRhdGErc2J5dGVzLCBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXN0YXRlLT5zcGFja2V0LmRhdGEgKyBzYnl0ZXMsIGJ1Zik7CiAgICAgfQogCiAgICAgLyogdGhlIHR5cGVjYXNlIGZvciB0aGUgM3JkIGFyZ3VtZW50IGlzIG1vc3RseSBmb3Igc3lzdGVtcyB0aGF0IGRvCkBAIC01NjksNyArNTc2LDcgQEAKIAogLyogdGhlIG5leHQgYmxvY2tudW0gaXMgeCArIDEgYnV0IGl0IG5lZWRzIHRvIHdyYXAgYXQgYW4gdW5zaWduZWQgMTZiaXQKICAgIGJvdW5kYXJ5ICovCi0jZGVmaW5lIE5FWFRfQkxPQ0tOVU0oeCkgKCgoeCkrMSkmMHhmZmZmKQorI2RlZmluZSBORVhUX0JMT0NLTlVNKHgpICgoKHgpICsgMSkmMHhmZmZmKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTYyMCw3ICs2MjcsNyBAQAogICAgIH0KIAogICAgIC8qIENoZWNrIGlmIGNvbXBsZXRlZCAoVGhhdCBpcywgYSBsZXNzIHRoYW4gZnVsbCBwYWNrZXQgaXMgcmVjZWl2ZWQpICovCi0gICAgaWYoc3RhdGUtPnJieXRlcyA8IChzc2l6ZV90KXN0YXRlLT5ibGtzaXplKzQpIHsKKyAgICBpZihzdGF0ZS0+cmJ5dGVzIDwgKHNzaXplX3Qpc3RhdGUtPmJsa3NpemUgKyA0KSB7CiAgICAgICBzdGF0ZS0+c3RhdGUgPSBURlRQX1NUQVRFX0ZJTjsKICAgICB9CiAgICAgZWxzZSB7CkBAIC03MzYsNyArNzQzLDcgQEAKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgLyogUmUtc2VuZCB0aGUgZGF0YSBwYWNrZXQgKi8KICAgICAgICAgICBzYnl0ZXMgPSBzZW5kdG8oc3RhdGUtPnNvY2tmZCwgKHZvaWQgKilzdGF0ZS0+c3BhY2tldC5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICA0K3N0YXRlLT5zYnl0ZXMsIFNFTkRfNFRIX0FSRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgNCArIHN0YXRlLT5zYnl0ZXMsIFNFTkRfNFRIX0FSRywKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZzdGF0ZS0+cmVtb3RlX2FkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5yZW1vdGVfYWRkcmxlbik7CiAgICAgICAgICAgLyogQ2hlY2sgYWxsIHNieXRlcyB3ZXJlIHNlbnQgKi8KQEAgLTc2OSw3ICs3NzYsNyBAQAogICAgICAqIGRhdGEgYmxvY2suCiAgICAgICogKi8KICAgICBzdGF0ZS0+c2J5dGVzID0gMDsKLSAgICBzdGF0ZS0+Y29ubi0+ZGF0YS0+cmVxLnVwbG9hZF9mcm9taGVyZSA9IChjaGFyICopc3RhdGUtPnNwYWNrZXQuZGF0YSs0OworICAgIHN0YXRlLT5jb25uLT5kYXRhLT5yZXEudXBsb2FkX2Zyb21oZXJlID0gKGNoYXIgKilzdGF0ZS0+c3BhY2tldC5kYXRhICsgNDsKICAgICBkbyB7CiAgICAgICByZXN1bHQgPSBDdXJsX2ZpbGxyZWFkYnVmZmVyKHN0YXRlLT5jb25uLCBzdGF0ZS0+Ymxrc2l6ZSAtIHN0YXRlLT5zYnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYik7CkBAIC04MDYsNyArODEzLDcgQEAKICAgICBlbHNlIHsKICAgICAgIC8qIFJlLXNlbmQgdGhlIGRhdGEgcGFja2V0ICovCiAgICAgICBzYnl0ZXMgPSBzZW5kdG8oc3RhdGUtPnNvY2tmZCwgKHZvaWQgKilzdGF0ZS0+c3BhY2tldC5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgIDQrc3RhdGUtPnNieXRlcywgU0VORF80VEhfQVJHLAorICAgICAgICAgICAgICAgICAgICAgIDQgKyBzdGF0ZS0+c2J5dGVzLCBTRU5EXzRUSF9BUkcsCiAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZzdGF0ZS0+cmVtb3RlX2FkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPnJlbW90ZV9hZGRybGVuKTsKICAgICAgIC8qIENoZWNrIGFsbCBzYnl0ZXMgd2VyZSBzZW50ICovCkBAIC0xMTAyLDExICsxMTA5LDExIEBACiAgIGZyb21sZW4gPSBzaXplb2YoZnJvbWFkZHIpOwogICBzdGF0ZS0+cmJ5dGVzID0gKGludClyZWN2ZnJvbShzdGF0ZS0+c29ja2ZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0YXRlLT5ycGFja2V0LmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5ibGtzaXplKzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5ibGtzaXplICsgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZmcm9tYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyb21sZW4pOwotICBpZihzdGF0ZS0+cmVtb3RlX2FkZHJsZW49PTApIHsKKyAgaWYoc3RhdGUtPnJlbW90ZV9hZGRybGVuID09IDApIHsKICAgICBtZW1jcHkoJnN0YXRlLT5yZW1vdGVfYWRkciwgJmZyb21hZGRyLCBmcm9tbGVuKTsKICAgICBzdGF0ZS0+cmVtb3RlX2FkZHJsZW4gPSBmcm9tbGVuOwogICB9CkBAIC0xMTI4LDcgKzExMzUsNyBAQAogICAgICAgaWYoc3RhdGUtPnJieXRlcyA+IDQgJiYKICAgICAgICAgIChORVhUX0JMT0NLTlVNKHN0YXRlLT5ibG9jaykgPT0gZ2V0cnBhY2tldGJsb2NrKCZzdGF0ZS0+cnBhY2tldCkpKSB7CiAgICAgICAgIHJlc3VsdCA9IEN1cmxfY2xpZW50X3dyaXRlKGNvbm4sIENMSUVOVFdSSVRFX0JPRFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopc3RhdGUtPnJwYWNrZXQuZGF0YSs0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXN0YXRlLT5ycGFja2V0LmRhdGEgKyA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+cmJ5dGVzLTQpOwogICAgICAgICBpZihyZXN1bHQpIHsKICAgICAgICAgICB0ZnRwX3N0YXRlX21hY2hpbmUoc3RhdGUsIFRGVFBfRVZFTlRfRVJST1IpOwpAQCAtMTE0MiwxNCArMTE0OSwxNCBAQAogICAgIHsKICAgICAgIHVuc2lnbmVkIHNob3J0IGVycm9yID0gZ2V0cnBhY2tldGJsb2NrKCZzdGF0ZS0+cnBhY2tldCk7CiAgICAgICBzdGF0ZS0+ZXJyb3IgPSAodGZ0cF9lcnJvcl90KWVycm9yOwotICAgICAgaW5mb2YoZGF0YSwgIiVzXG4iLCAoY29uc3QgY2hhciAqKXN0YXRlLT5ycGFja2V0LmRhdGErNCk7CisgICAgICBpbmZvZihkYXRhLCAiJXNcbiIsIChjb25zdCBjaGFyICopc3RhdGUtPnJwYWNrZXQuZGF0YSArIDQpOwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNhc2UgVEZUUF9FVkVOVF9BQ0s6CiAgICAgICBicmVhazsKICAgICBjYXNlIFRGVFBfRVZFTlRfT0FDSzoKICAgICAgIHJlc3VsdCA9IHRmdHBfcGFyc2Vfb3B0aW9uX2FjayhzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKXN0YXRlLT5ycGFja2V0LmRhdGErMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKXN0YXRlLT5ycGFja2V0LmRhdGEgKyAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5yYnl0ZXMtMik7CiAgICAgICBpZihyZXN1bHQpCiAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC0xMTkzLDcgKzEyMDAsNyBAQAogICAgIHN0YXRlLT5zdGF0ZSA9IFRGVFBfU1RBVEVfRklOOwogICAgIHJldHVybiAwOwogICB9Ci0gIGlmKGN1cnJlbnQgPiBzdGF0ZS0+cnhfdGltZStzdGF0ZS0+cmV0cnlfdGltZSkgeworICBpZihjdXJyZW50ID4gc3RhdGUtPnJ4X3RpbWUgKyBzdGF0ZS0+cmV0cnlfdGltZSkgewogICAgIGlmKGV2ZW50KQogICAgICAgKmV2ZW50ID0gVEZUUF9FVkVOVF9USU1FT1VUOwogICAgIHRpbWUoJnN0YXRlLT5yeF90aW1lKTsgLyogdXBkYXRlIGV2ZW4gdGhvdWdoIHdlIHJlY2VpdmVkIG5vdGhpbmcgKi8KQEAgLTEzNDQsNyArMTM1MSw3IEBACiAKICAgc3RhdGUgPSAodGZ0cF9zdGF0ZV9kYXRhX3QgKiljb25uLT5wcm90by50ZnRwYzsKICAgaWYoIXN0YXRlKQotICAgIHJldHVybiBDVVJMRV9CQURfQ0FMTElOR19PUkRFUjsKKyAgICByZXR1cm4gQ1VSTEVfVEZUUF9JTExFR0FMOwogCiAgIHJlc3VsdCA9IHRmdHBfcGVyZm9ybShjb25uLCBkb25lKTsKIApkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdGltZXZhbC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdGltZXZhbC5jCmluZGV4IGJlZDQ0YzUuLmQ3MjA3YjMgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3RpbWV2YWwuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi90aW1ldmFsLmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTI0LDE0ICsyNCwxNCBAQAogCiAjaWYgZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoTVNET1MpCiAKLXN0cnVjdCB0aW1ldmFsIGN1cmx4X3R2bm93KHZvaWQpCitzdHJ1Y3QgY3VybHRpbWUgY3VybHhfdHZub3codm9pZCkKIHsKICAgLyoKICAgKiogR2V0VGlja0NvdW50KCkgaXMgYXZhaWxhYmxlIG9uIF9hbGxfIFdpbmRvd3MgdmVyc2lvbnMgZnJvbSBXOTUgdXAKICAgKiogdG8gbm93YWRheXMuIFJldHVybnMgbWlsbGlzZWNvbmRzIGVsYXBzZWQgc2luY2UgbGFzdCBzeXN0ZW0gYm9vdCwKICAgKiogaW5jcmVhc2VzIG1vbm90b25pY2FsbHkgYW5kIHdyYXBzIG9uY2UgNDkuNyBkYXlzIGhhdmUgZWxhcHNlZC4KICAgKi8KLSAgc3RydWN0IHRpbWV2YWwgbm93OworICBzdHJ1Y3QgY3VybHRpbWUgbm93OwogI2lmICFkZWZpbmVkKF9XSU4zMl9XSU5OVCkgfHwgIWRlZmluZWQoX1dJTjMyX1dJTk5UX1ZJU1RBKSB8fCBcCiAgICAgKF9XSU4zMl9XSU5OVCA8IF9XSU4zMl9XSU5OVF9WSVNUQSkKICAgRFdPUkQgbWlsbGlzZWNvbmRzID0gR2V0VGlja0NvdW50KCk7CkBAIC0zOSw4ICszOSw4IEBACiAgIG5vdy50dl91c2VjID0gKG1pbGxpc2Vjb25kcyAlIDEwMDApICogMTAwMDsKICNlbHNlCiAgIFVMT05HTE9ORyBtaWxsaXNlY29uZHMgPSBHZXRUaWNrQ291bnQ2NCgpOwotICBub3cudHZfc2VjID0gKGxvbmcpIChtaWxsaXNlY29uZHMgLyAxMDAwKTsKLSAgbm93LnR2X3VzZWMgPSAobG9uZykgKG1pbGxpc2Vjb25kcyAlIDEwMDApICogMTAwMDsKKyAgbm93LnR2X3NlYyA9ICh0aW1lX3QpIChtaWxsaXNlY29uZHMgLyAxMDAwKTsKKyAgbm93LnR2X3VzZWMgPSAodW5zaWduZWQgaW50KSAobWlsbGlzZWNvbmRzICUgMTAwMCkgKiAxMDAwOwogI2VuZGlmCiAKICAgcmV0dXJuIG5vdzsKQEAgLTQ4LDcgKzQ4LDcgQEAKIAogI2VsaWYgZGVmaW5lZChIQVZFX0NMT0NLX0dFVFRJTUVfTU9OT1RPTklDKQogCi1zdHJ1Y3QgdGltZXZhbCBjdXJseF90dm5vdyh2b2lkKQorc3RydWN0IGN1cmx0aW1lIGN1cmx4X3R2bm93KHZvaWQpCiB7CiAgIC8qCiAgICoqIGNsb2NrX2dldHRpbWUoKSBpcyBncmFudGVkIHRvIGJlIGluY3JlYXNlZCBtb25vdG9uaWNhbGx5IHdoZW4gdGhlCkBAIC01OCwxMCArNTgsMTEgQEAKICAgKiogc3lzdGVtIGhhcyBzdGFydGVkIHVwLgogICAqLwogICBzdHJ1Y3QgdGltZXZhbCBub3c7CisgIHN0cnVjdCBjdXJsdGltZSBjbm93OwogICBzdHJ1Y3QgdGltZXNwZWMgdHNub3c7CiAgIGlmKDAgPT0gY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0c25vdykpIHsKLSAgICBub3cudHZfc2VjID0gdHNub3cudHZfc2VjOwotICAgIG5vdy50dl91c2VjID0gdHNub3cudHZfbnNlYyAvIDEwMDA7CisgICAgY25vdy50dl9zZWMgPSB0c25vdy50dl9zZWM7CisgICAgY25vdy50dl91c2VjID0gKHVuc2lnbmVkIGludCkodHNub3cudHZfbnNlYyAvIDEwMDApOwogICB9CiAgIC8qCiAgICoqIEV2ZW4gd2hlbiB0aGUgY29uZmlndXJlIHByb2Nlc3MgaGFzIHRydWx5IGRldGVjdGVkIG1vbm90b25pYyBjbG9jawpAQCAtNjksMjAgKzcwLDIzIEBACiAgICoqIHJ1bi10aW1lLiBXaGVuIHRoaXMgb2NjdXJzIHNpbXBseSBmYWxsYmFjayB0byBvdGhlciB0aW1lIHNvdXJjZS4KICAgKi8KICNpZmRlZiBIQVZFX0dFVFRJTUVPRkRBWQotICBlbHNlCisgIGVsc2UgewogICAgICh2b2lkKWdldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKKyAgICBjbm93LnR2X3NlYyA9IG5vdy50dl9zZWM7CisgICAgY25vdy50dl91c2VjID0gKHVuc2lnbmVkIGludClub3cudHZfdXNlYzsKKyAgfQogI2Vsc2UKICAgZWxzZSB7Ci0gICAgbm93LnR2X3NlYyA9IChsb25nKXRpbWUoTlVMTCk7Ci0gICAgbm93LnR2X3VzZWMgPSAwOworICAgIGNub3cudHZfc2VjID0gdGltZShOVUxMKTsKKyAgICBjbm93LnR2X3VzZWMgPSAwOwogICB9CiAjZW5kaWYKLSAgcmV0dXJuIG5vdzsKKyAgcmV0dXJuIGNub3c7CiB9CiAKICNlbGlmIGRlZmluZWQoSEFWRV9HRVRUSU1FT0ZEQVkpCiAKLXN0cnVjdCB0aW1ldmFsIGN1cmx4X3R2bm93KHZvaWQpCitzdHJ1Y3QgY3VybHRpbWUgY3VybHhfdHZub3codm9pZCkKIHsKICAgLyoKICAgKiogZ2V0dGltZW9mZGF5KCkgaXMgbm90IGdyYW50ZWQgdG8gYmUgaW5jcmVhc2VkIG1vbm90b25pY2FsbHksIGR1ZSB0bwpAQCAtOTAsMTkgKzk0LDIyIEBACiAgICoqIGZvcndhcmQgb3IgYmFja3dhcmQgaW4gdGltZS4KICAgKi8KICAgc3RydWN0IHRpbWV2YWwgbm93OworICBzdHJ1Y3QgY3VybHRpbWUgcmV0OwogICAodm9pZClnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7Ci0gIHJldHVybiBub3c7CisgIHJldC50dl9zZWMgPSBub3cudHZfc2VjOworICByZXQudHZfdXNlYyA9IG5vdy50dl91c2VjOworICByZXR1cm4gcmV0OwogfQogCiAjZWxzZQogCi1zdHJ1Y3QgdGltZXZhbCBjdXJseF90dm5vdyh2b2lkKQorc3RydWN0IGN1cmx0aW1lIGN1cmx4X3R2bm93KHZvaWQpCiB7CiAgIC8qCiAgICoqIHRpbWUoKSByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aW1lIGluIHNlY29uZHMgc2luY2UgdGhlIEVwb2NoLgogICAqLwotICBzdHJ1Y3QgdGltZXZhbCBub3c7Ci0gIG5vdy50dl9zZWMgPSAobG9uZyl0aW1lKE5VTEwpOworICBzdHJ1Y3QgY3VybHRpbWUgbm93OworICBub3cudHZfc2VjID0gdGltZShOVUxMKTsKICAgbm93LnR2X3VzZWMgPSAwOwogICByZXR1cm4gbm93OwogfQpAQCAtMTE1LDggKzEyMiwxMCBAQAogICoKICAqIFJldHVybnM6IHRoZSB0aW1lIGRpZmZlcmVuY2UgaW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4gRm9yIGxhcmdlIGRpZmZzIGl0CiAgKiByZXR1cm5zIDB4N2ZmZmZmZmYgb24gMzJiaXQgdGltZV90IHN5c3RlbXMuCisgKgorICogQHVuaXR0ZXN0OiAxMzIzCiAgKi8KLXRpbWVfdCBjdXJseF90dmRpZmYoc3RydWN0IHRpbWV2YWwgbmV3ZXIsIHN0cnVjdCB0aW1ldmFsIG9sZGVyKQordGltZV90IGN1cmx4X3R2ZGlmZihzdHJ1Y3QgY3VybHRpbWUgbmV3ZXIsIHN0cnVjdCBjdXJsdGltZSBvbGRlcikKIHsKICNpZiBTSVpFT0ZfVElNRV9UIDwgOAogICAvKiBmb3IgMzJiaXQgdGltZV90IHN5c3RlbXMsIGFkZCBhIHByZWNhdXRpb24gdG8gYXZvaWQgb3ZlcmZsb3cgZm9yIHJlYWxseQpAQCAtMTI2LDE4ICsxMzUsMjggQEAKICAgICByZXR1cm4gMHg3ZmZmZmZmZjsKICNlbmRpZgogICByZXR1cm4gKG5ld2VyLnR2X3NlYy1vbGRlci50dl9zZWMpKjEwMDArCi0gICAgKHRpbWVfdCkobmV3ZXIudHZfdXNlYy1vbGRlci50dl91c2VjKS8xMDAwOworICAgIChpbnQpKG5ld2VyLnR2X3VzZWMtb2xkZXIudHZfdXNlYykvMTAwMDsKIH0KIAogLyoKLSAqIFNhbWUgYXMgY3VybHhfdHZkaWZmIGJ1dCB3aXRoIGZ1bGwgdXNlYyByZXNvbHV0aW9uLgorICogTWFrZSBzdXJlIHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBtb3JlIHJlY2VudCB0aW1lLCBhcyBvdGhlcndpc2UKKyAqIHdlJ2xsIGdldCBhIHdlaXJkIG5lZ2F0aXZlIHRpbWUtZGlmZiBiYWNrLi4uCiAgKgotICogUmV0dXJuczogdGhlIHRpbWUgZGlmZmVyZW5jZSBpbiBzZWNvbmRzIHdpdGggc3Vic2Vjb25kIHJlc29sdXRpb24uCisgKiBSZXR1cm5zOiB0aGUgdGltZSBkaWZmZXJlbmNlIGluIG51bWJlciBvZiBtaWNyb3NlY29uZHMuIEZvciB0b28gbGFyZ2UgZGlmZnMKKyAqIGl0IHJldHVybnMgbWF4IHZhbHVlLgogICovCi1kb3VibGUgY3VybHhfdHZkaWZmX3NlY3Moc3RydWN0IHRpbWV2YWwgbmV3ZXIsIHN0cnVjdCB0aW1ldmFsIG9sZGVyKQordGltZV90IEN1cmxfdHZkaWZmX3VzKHN0cnVjdCBjdXJsdGltZSBuZXdlciwgc3RydWN0IGN1cmx0aW1lIG9sZGVyKQogewotICBpZihuZXdlci50dl9zZWMgIT0gb2xkZXIudHZfc2VjKQotICAgIHJldHVybiAoZG91YmxlKShuZXdlci50dl9zZWMtb2xkZXIudHZfc2VjKSsKLSAgICAgIChkb3VibGUpKG5ld2VyLnR2X3VzZWMtb2xkZXIudHZfdXNlYykvMTAwMDAwMC4wOwotICByZXR1cm4gKGRvdWJsZSkobmV3ZXIudHZfdXNlYy1vbGRlci50dl91c2VjKS8xMDAwMDAwLjA7CisgIHRpbWVfdCBkaWZmID0gbmV3ZXIudHZfc2VjLW9sZGVyLnR2X3NlYzsKKyNpZiBTSVpFT0ZfVElNRV9UIDwgOAorICAvKiBmb3IgMzJiaXQgdGltZV90IHN5c3RlbXMgKi8KKyAgaWYoZGlmZiA+PSAoMHg3ZmZmZmZmZi8xMDAwMDAwKSkKKyAgICByZXR1cm4gMHg3ZmZmZmZmZjsKKyNlbHNlCisgIC8qIGZvciA2NGJpdCB0aW1lX3Qgc3lzdGVtcyAqLworICBpZihkaWZmID49ICgweDdmZmZmZmZmZmZmZmZmZmZMTC8xMDAwMDAwKSkKKyAgICByZXR1cm4gMHg3ZmZmZmZmZmZmZmZmZmZmTEw7CisjZW5kaWYKKyAgcmV0dXJuIChuZXdlci50dl9zZWMtb2xkZXIudHZfc2VjKSoxMDAwMDAwKworICAgIChpbnQpKG5ld2VyLnR2X3VzZWMtb2xkZXIudHZfdXNlYyk7CiB9CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi90aW1ldmFsLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi90aW1ldmFsLmgKaW5kZXggMzM5NjkzNS4uMWVlNGIzMCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdGltZXZhbC5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3RpbWV2YWwuaApAQCAtNyw3ICs3LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtMjksNyArMjksMTIgQEAKIAogI2luY2x1ZGUgImN1cmxfc2V0dXAuaCIKIAotc3RydWN0IHRpbWV2YWwgY3VybHhfdHZub3codm9pZCk7CitzdHJ1Y3QgY3VybHRpbWUgeworICB0aW1lX3QgICAgICAgdHZfc2VjOyAgICAgLyogc2Vjb25kcyAqLworICB1bnNpZ25lZCBpbnQgdHZfdXNlYzsgICAgLyogbWljcm9zZWNvbmRzICovCit9OworCitzdHJ1Y3QgY3VybHRpbWUgY3VybHhfdHZub3codm9pZCk7CiAKIC8qCiAgKiBNYWtlIHN1cmUgdGhhdCB0aGUgZmlyc3QgYXJndW1lbnQgKHQxKSBpcyB0aGUgbW9yZSByZWNlbnQgdGltZSBhbmQgdDIgaXMKQEAgLTM3LDIwICs0MiwyMCBAQAogICoKICAqIFJldHVybnM6IHRoZSB0aW1lIGRpZmZlcmVuY2UgaW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4KICAqLwotdGltZV90IGN1cmx4X3R2ZGlmZihzdHJ1Y3QgdGltZXZhbCB0MSwgc3RydWN0IHRpbWV2YWwgdDIpOwordGltZV90IGN1cmx4X3R2ZGlmZihzdHJ1Y3QgY3VybHRpbWUgdDEsIHN0cnVjdCBjdXJsdGltZSB0Mik7CiAKIC8qCi0gKiBTYW1lIGFzIGN1cmx4X3R2ZGlmZiBidXQgd2l0aCBmdWxsIHVzZWMgcmVzb2x1dGlvbi4KKyAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCAodDEpIGlzIHRoZSBtb3JlIHJlY2VudCB0aW1lIGFuZCB0MiBpcworICogdGhlIG9sZGVyIHRpbWUsIGFzIG90aGVyd2lzZSB5b3UgZ2V0IGEgd2VpcmQgbmVnYXRpdmUgdGltZS1kaWZmIGJhY2suLi4KICAqCi0gKiBSZXR1cm5zOiB0aGUgdGltZSBkaWZmZXJlbmNlIGluIHNlY29uZHMgd2l0aCBzdWJzZWNvbmQgcmVzb2x1dGlvbi4KKyAqIFJldHVybnM6IHRoZSB0aW1lIGRpZmZlcmVuY2UgaW4gbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcy4KICAqLwotZG91YmxlIGN1cmx4X3R2ZGlmZl9zZWNzKHN0cnVjdCB0aW1ldmFsIHQxLCBzdHJ1Y3QgdGltZXZhbCB0Mik7Cit0aW1lX3QgQ3VybF90dmRpZmZfdXMoc3RydWN0IGN1cmx0aW1lIG5ld2VyLCBzdHJ1Y3QgY3VybHRpbWUgb2xkZXIpOwogCiAvKiBUaGVzZSB0d28gZGVmaW5lcyBiZWxvdyBleGlzdCB0byBwcm92aWRlIHRoZSBvbGRlciBBUEkgZm9yIGxpYnJhcnkKICAgIGludGVybmFscyBvbmx5LiAqLwogI2RlZmluZSBDdXJsX3R2bm93KCkgY3VybHhfdHZub3coKQogI2RlZmluZSBDdXJsX3R2ZGlmZih4LHkpIGN1cmx4X3R2ZGlmZih4LHkpCi0jZGVmaW5lIEN1cmxfdHZkaWZmX3NlY3MoeCx5KSBjdXJseF90dmRpZmZfc2Vjcyh4LHkpCiAKICNlbmRpZiAvKiBIRUFERVJfQ1VSTF9USU1FVkFMX0ggKi8KIApkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdHJhbnNmZXIuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3RyYW5zZmVyLmMKaW5kZXggNDNlOGY2NC4uOGU2NmQwZCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdHJhbnNmZXIuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi90cmFuc2Zlci5jCkBAIC03MywxMiArNzMsMzggQEAKICNpbmNsdWRlICJjb25uZWN0LmgiCiAjaW5jbHVkZSAibm9uLWFzY2lpLmgiCiAjaW5jbHVkZSAiaHR0cDIuaCIKKyNpbmNsdWRlICJtaW1lLmgiCisjaW5jbHVkZSAic3RyY2FzZS5oIgogCiAvKiBUaGUgbGFzdCAzICNpbmNsdWRlIGZpbGVzIHNob3VsZCBiZSBpbiB0aGlzIG9yZGVyICovCiAjaW5jbHVkZSAiY3VybF9wcmludGYuaCIKICNpbmNsdWRlICJjdXJsX21lbW9yeS5oIgogI2luY2x1ZGUgIm1lbWRlYnVnLmgiCiAKKyNpZiAhZGVmaW5lZChDVVJMX0RJU0FCTEVfSFRUUCkgfHwgIWRlZmluZWQoQ1VSTF9ESVNBQkxFX1NNVFApIHx8IFwKKyAgICAhZGVmaW5lZChDVVJMX0RJU0FCTEVfSU1BUCkKKy8qCisgKiBjaGVja2hlYWRlcnMoKSBjaGVja3MgdGhlIGxpbmtlZCBsaXN0IG9mIGN1c3RvbSBoZWFkZXJzIGZvciBhCisgKiBwYXJ0aWN1bGFyIGhlYWRlciAocHJlZml4KS4KKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgbWF0Y2hpbmcgaGVhZGVyIG9yIE5VTEwgaWYgbm9uZSBtYXRjaGVkLgorICovCitjaGFyICpDdXJsX2NoZWNraGVhZGVycyhjb25zdCBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0aGlzaGVhZGVyKQoreworICBzdHJ1Y3QgY3VybF9zbGlzdCAqaGVhZDsKKyAgc2l6ZV90IHRoaXNsZW4gPSBzdHJsZW4odGhpc2hlYWRlcik7CisgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOworCisgIGZvcihoZWFkID0gZGF0YS0+c2V0LmhlYWRlcnM7IGhlYWQ7IGhlYWQgPSBoZWFkLT5uZXh0KSB7CisgICAgaWYoc3RybmNhc2Vjb21wYXJlKGhlYWQtPmRhdGEsIHRoaXNoZWFkZXIsIHRoaXNsZW4pKQorICAgICAgcmV0dXJuIGhlYWQtPmRhdGE7CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCiAvKgogICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGwgdGhlIHJlYWQgY2FsbGJhY2sgdG8gZmlsbCBvdXIgYnVmZmVyIHdpdGggZGF0YQogICogdG8gdXBsb2FkLgpAQCAtMTk1LDI3ICsyMjEsMjggQEAKICAgICAgICAgICAgc3RybGVuKGVuZG9mbGluZV9uZXR3b3JrKSk7CiAKICNpZmRlZiBDVVJMX0RPRVNfQ09OVkVSU0lPTlMKLSAgICBDVVJMY29kZSByZXN1bHQ7Ci0gICAgaW50IGxlbmd0aDsKLSAgICBpZihkYXRhLT5zZXQucHJlZmVyX2FzY2lpKSB7Ci0gICAgICAvKiB0cmFuc2xhdGUgdGhlIHByb3RvY29sIGFuZCBkYXRhICovCi0gICAgICBsZW5ndGggPSBucmVhZDsKKyAgICB7CisgICAgICBDVVJMY29kZSByZXN1bHQ7CisgICAgICBpbnQgbGVuZ3RoOworICAgICAgaWYoZGF0YS0+c2V0LnByZWZlcl9hc2NpaSkKKyAgICAgICAgLyogdHJhbnNsYXRlIHRoZSBwcm90b2NvbCBhbmQgZGF0YSAqLworICAgICAgICBsZW5ndGggPSBucmVhZDsKKyAgICAgIGVsc2UKKyAgICAgICAgLyoganVzdCB0cmFuc2xhdGUgdGhlIHByb3RvY29sIHBvcnRpb24gKi8KKyAgICAgICAgbGVuZ3RoID0gKGludClzdHJsZW4oaGV4YnVmZmVyKTsKKyAgICAgIHJlc3VsdCA9IEN1cmxfY29udmVydF90b19uZXR3b3JrKGRhdGEsIGRhdGEtPnJlcS51cGxvYWRfZnJvbWhlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOworICAgICAgLyogQ3VybF9jb252ZXJ0X3RvX25ldHdvcmsgY2FsbHMgZmFpbGYgaWYgdW5zdWNjZXNzZnVsICovCisgICAgICBpZihyZXN1bHQpCisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQotICAgIGVsc2UgewotICAgICAgLyoganVzdCB0cmFuc2xhdGUgdGhlIHByb3RvY29sIHBvcnRpb24gKi8KLSAgICAgIGxlbmd0aCA9IHN0cmxlbihoZXhidWZmZXIpOwotICAgIH0KLSAgICByZXN1bHQgPSBDdXJsX2NvbnZlcnRfdG9fbmV0d29yayhkYXRhLCBkYXRhLT5yZXEudXBsb2FkX2Zyb21oZXJlLCBsZW5ndGgpOwotICAgIC8qIEN1cmxfY29udmVydF90b19uZXR3b3JrIGNhbGxzIGZhaWxmIGlmIHVuc3VjY2Vzc2Z1bCAqLwotICAgIGlmKHJlc3VsdCkKLSAgICAgIHJldHVybiByZXN1bHQ7CiAjZW5kaWYgLyogQ1VSTF9ET0VTX0NPTlZFUlNJT05TICovCiAKICAgICBpZigobnJlYWQgLSBoZXhsZW4pID09IDApCiAgICAgICAvKiBtYXJrIHRoaXMgYXMgZG9uZSBvbmNlIHRoaXMgY2h1bmsgaXMgdHJhbnNmZXJyZWQgKi8KICAgICAgIGRhdGEtPnJlcS51cGxvYWRfZG9uZSA9IFRSVUU7CiAKLSAgICBucmVhZCs9KGludClzdHJsZW4oZW5kb2ZsaW5lX25hdGl2ZSk7IC8qIGZvciB0aGUgYWRkZWQgZW5kIG9mIGxpbmUgKi8KKyAgICBucmVhZCArPSAoaW50KXN0cmxlbihlbmRvZmxpbmVfbmF0aXZlKTsgLyogZm9yIHRoZSBhZGRlZCBlbmQgb2YgbGluZSAqLwogICB9CiAjaWZkZWYgQ1VSTF9ET0VTX0NPTlZFUlNJT05TCiAgIGVsc2UgaWYoKGRhdGEtPnNldC5wcmVmZXJfYXNjaWkpICYmICghc2VuZGluZ19odHRwX2hlYWRlcnMpKSB7CkBAIC0yNDEsNiArMjY4LDcgQEAKIENVUkxjb2RlIEN1cmxfcmVhZHJld2luZChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pCiB7CiAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOworICBjdXJsX21pbWVwYXJ0ICptaW1lcGFydCA9ICZkYXRhLT5zZXQubWltZXBvc3Q7CiAKICAgY29ubi0+Yml0cy5yZXdpbmRhZnRlcnNlbmQgPSBGQUxTRTsgLyogd2UgcmV3aW5kIG5vdyAqLwogCkBAIC0yNTMsOSArMjgxLDIxIEBACiAgIC8qIFdlIGhhdmUgc2VudCBhd2F5IGRhdGEuIElmIG5vdCB1c2luZyBDVVJMT1BUX1BPU1RGSUVMRFMgb3IKICAgICAgQ1VSTE9QVF9IVFRQUE9TVCwgY2FsbCBhcHAgdG8gcmV3aW5kCiAgICovCi0gIGlmKGRhdGEtPnNldC5wb3N0ZmllbGRzIHx8Ci0gICAgIChkYXRhLT5zZXQuaHR0cHJlcSA9PSBIVFRQUkVRX1BPU1RfRk9STSkpCisgIGlmKGNvbm4tPmhhbmRsZXItPnByb3RvY29sICYgUFJPVE9fRkFNSUxZX0hUVFApIHsKKyAgICBzdHJ1Y3QgSFRUUCAqaHR0cCA9IGRhdGEtPnJlcS5wcm90b3A7CisKKyAgICBpZihodHRwLT5zZW5kaXQpCisgICAgICBtaW1lcGFydCA9IGh0dHAtPnNlbmRpdDsKKyAgfQorICBpZihkYXRhLT5zZXQucG9zdGZpZWxkcykKICAgICA7IC8qIGRvIG5vdGhpbmcgKi8KKyAgZWxzZSBpZihkYXRhLT5zZXQuaHR0cHJlcSA9PSBIVFRQUkVRX1BPU1RfTUlNRSB8fAorICAgICAgICAgIGRhdGEtPnNldC5odHRwcmVxID09IEhUVFBSRVFfUE9TVF9GT1JNKSB7CisgICAgaWYoQ3VybF9taW1lX3Jld2luZChtaW1lcGFydCkpIHsKKyAgICAgIGZhaWxmKGRhdGEsICJDYW5ub3QgcmV3aW5kIG1pbWUvcG9zdCBkYXRhIik7CisgICAgICByZXR1cm4gQ1VSTEVfU0VORF9GQUlMX1JFV0lORDsKKyAgICB9CisgIH0KICAgZWxzZSB7CiAgICAgaWYoZGF0YS0+c2V0LnNlZWtfZnVuYykgewogICAgICAgaW50IGVycjsKQEAgLTU2MCw3ICs2MDAsNyBAQAogICAgICAgICAgICAgaW5mb2YoZGF0YSwgIklnbm9yaW5nIHRoZSByZXNwb25zZS1ib2R5XG4iKTsKICAgICAgICAgICB9CiAgICAgICAgICAgaWYoZGF0YS0+c3RhdGUucmVzdW1lX2Zyb20gJiYgIWstPmNvbnRlbnRfcmFuZ2UgJiYKLSAgICAgICAgICAgICAoZGF0YS0+c2V0Lmh0dHByZXE9PUhUVFBSRVFfR0VUKSAmJgorICAgICAgICAgICAgIChkYXRhLT5zZXQuaHR0cHJlcSA9PSBIVFRQUkVRX0dFVCkgJiYKICAgICAgICAgICAgICAhay0+aWdub3JlYm9keSkgewogCiAgICAgICAgICAgICBpZihrLT5zaXplID09IGRhdGEtPnN0YXRlLnJlc3VtZV9mcm9tKSB7CkBAIC05MTUsNyArOTU1LDcgQEAKICAgICAgICAgLyogdGhpcyBpcyBhIHBhdXNlZCB0cmFuc2ZlciAqLwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIGlmKG5yZWFkPD0wKSB7CisgICAgICBpZihucmVhZCA8PSAwKSB7CiAgICAgICAgIHJlc3VsdCA9IGRvbmVfc2VuZGluZyhjb25uLCBrKTsKICAgICAgICAgaWYocmVzdWx0KQogICAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC0xMDU1LDcgKzEwOTUsNyBAQAogewogICBzdHJ1Y3QgU2luZ2xlUmVxdWVzdCAqayA9ICZkYXRhLT5yZXE7CiAgIENVUkxjb2RlIHJlc3VsdDsKLSAgaW50IGRpZHdoYXQ9MDsKKyAgaW50IGRpZHdoYXQgPSAwOwogCiAgIGN1cmxfc29ja2V0X3QgZmRfcmVhZDsKICAgY3VybF9zb2NrZXRfdCBmZF93cml0ZTsKQEAgLTEyODgsNiArMTMyOCwxMyBAQAogICAgIGZhaWxmKGRhdGEsICJObyBVUkwgc2V0ISIpOwogICAgIHJldHVybiBDVVJMRV9VUkxfTUFMRk9STUFUOwogICB9CisgIC8qIHNpbmNlIHRoZSBVUkwgbWF5IGhhdmUgYmVlbiByZWRpcmVjdGVkIGluIGEgcHJldmlvdXMgdXNlIG9mIHRoaXMgaGFuZGxlICovCisgIGlmKGRhdGEtPmNoYW5nZS51cmxfYWxsb2MpIHsKKyAgICAvKiB0aGUgYWxyZWFkeSBzZXQgVVJMIGlzIGFsbG9jYXRlZCwgZnJlZSBpdCBmaXJzdCEgKi8KKyAgICBDdXJsX3NhZmVmcmVlKGRhdGEtPmNoYW5nZS51cmwpOworICAgIGRhdGEtPmNoYW5nZS51cmxfYWxsb2MgPSBGQUxTRTsKKyAgfQorICBkYXRhLT5jaGFuZ2UudXJsID0gZGF0YS0+c2V0LnN0cltTVFJJTkdfU0VUX1VSTF07CiAKICAgLyogSW5pdCB0aGUgU1NMIHNlc3Npb24gSUQgY2FjaGUgaGVyZS4gV2UgZG8gaXQgaGVyZSBzaW5jZSB3ZSB3YW50IHRvIGRvIGl0CiAgICAgIGFmdGVyIHRoZSAqX3NldG9wdCgpIGNhbGxzICh0aGF0IGNvdWxkIHNwZWNpZnkgdGhlIHNpemUgb2YgdGhlIGNhY2hlKSBidXQKQEAgLTEyOTYsNyArMTM0Myw3IEBACiAgIGlmKHJlc3VsdCkKICAgICByZXR1cm4gcmVzdWx0OwogCi0gIGRhdGEtPnNldC5mb2xsb3dsb2NhdGlvbj0wOyAvKiByZXNldCB0aGUgbG9jYXRpb24tZm9sbG93IGNvdW50ZXIgKi8KKyAgZGF0YS0+c2V0LmZvbGxvd2xvY2F0aW9uID0gMDsgLyogcmVzZXQgdGhlIGxvY2F0aW9uLWZvbGxvdyBjb3VudGVyICovCiAgIGRhdGEtPnN0YXRlLnRoaXNfaXNfYV9mb2xsb3cgPSBGQUxTRTsgLyogcmVzZXQgdGhpcyAqLwogICBkYXRhLT5zdGF0ZS5lcnJvcmJ1ZiA9IEZBTFNFOyAvKiBubyBlcnJvciBoYXMgb2NjdXJyZWQgKi8KICAgZGF0YS0+c3RhdGUuaHR0cHZlcnNpb24gPSAwOyAvKiBkb24ndCBhc3N1bWUgYW55IHBhcnRpY3VsYXIgc2VydmVyIHZlcnNpb24gKi8KQEAgLTEzMzgsNyArMTM4NSw3IEBACiAjZW5kaWYKIAogICAgIEN1cmxfaW5pdGluZm8oZGF0YSk7IC8qIHJlc2V0IHNlc3Npb24tc3BlY2lmaWMgaW5mb3JtYXRpb24gInZhcmlhYmxlcyIgKi8KLSAgICBDdXJsX3BncnNSZXNldFRpbWVzU2l6ZXMoZGF0YSk7CisgICAgQ3VybF9wZ3JzUmVzZXRUcmFuc2ZlclNpemVzKGRhdGEpOwogICAgIEN1cmxfcGdyc1N0YXJ0Tm93KGRhdGEpOwogCiAgICAgaWYoZGF0YS0+c2V0LnRpbWVvdXQpCkBAIC0xMzg0LDE5ICsxNDMxLDU5IEBACiAKICNpZm5kZWYgQ1VSTF9ESVNBQkxFX0hUVFAKIC8qCisgKiBGaW5kIHRoZSBzZXBhcmF0b3IgYXQgdGhlIGVuZCBvZiB0aGUgaG9zdCBuYW1lLCBvciB0aGUgJz8nIGluIGNhc2VzIGxpa2UKKyAqIGh0dHA6Ly93d3cudXJsLmNvbT9pZD0yMzgwCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpmaW5kX2hvc3Rfc2VwKGNvbnN0IGNoYXIgKnVybCkKK3sKKyAgY29uc3QgY2hhciAqc2VwOworICBjb25zdCBjaGFyICpxdWVyeTsKKworICAvKiBGaW5kIHRoZSBzdGFydCBvZiB0aGUgaG9zdG5hbWUgKi8KKyAgc2VwID0gc3Ryc3RyKHVybCwgIi8vIik7CisgIGlmKCFzZXApCisgICAgc2VwID0gdXJsOworICBlbHNlCisgICAgc2VwICs9IDI7CisKKyAgcXVlcnkgPSBzdHJjaHIoc2VwLCAnPycpOworICBzZXAgPSBzdHJjaHIoc2VwLCAnLycpOworCisgIGlmKCFzZXApCisgICAgc2VwID0gdXJsICsgc3RybGVuKHVybCk7CisKKyAgaWYoIXF1ZXJ5KQorICAgIHF1ZXJ5ID0gdXJsICsgc3RybGVuKHVybCk7CisKKyAgcmV0dXJuIHNlcCA8IHF1ZXJ5ID8gc2VwIDogcXVlcnk7Cit9CisKKy8qCiAgKiBzdHJsZW5fdXJsKCkgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiBVUkwgaWYgdGhlIHNwYWNlcyB3aXRoaW4gdGhlCiAgKiBVUkwgd2VyZSBwcm9wZXJseSBVUkwgZW5jb2RlZC4KKyAqIFVSTCBlbmNvZGluZyBzaG91bGQgYmUgc2tpcHBlZCBmb3IgaG9zdCBuYW1lcywgb3RoZXJ3aXNlIElETiByZXNvbHV0aW9uCisgKiB3aWxsIGZhaWwuCiAgKi8KLXN0YXRpYyBzaXplX3Qgc3RybGVuX3VybChjb25zdCBjaGFyICp1cmwpCitzdGF0aWMgc2l6ZV90IHN0cmxlbl91cmwoY29uc3QgY2hhciAqdXJsLCBib29sIHJlbGF0aXZlKQogewogICBjb25zdCB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gIHNpemVfdCBuZXdsZW49MDsKLSAgYm9vbCBsZWZ0PVRSVUU7IC8qIGxlZnQgc2lkZSBvZiB0aGUgPyAqLworICBzaXplX3QgbmV3bGVuID0gMDsKKyAgYm9vbCBsZWZ0ID0gVFJVRTsgLyogbGVmdCBzaWRlIG9mIHRoZSA/ICovCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhvc3Rfc2VwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgdXJsOwogCi0gIGZvcihwdHI9KHVuc2lnbmVkIGNoYXIgKil1cmw7ICpwdHI7IHB0cisrKSB7CisgIGlmKCFyZWxhdGl2ZSkKKyAgICBob3N0X3NlcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIGZpbmRfaG9zdF9zZXAodXJsKTsKKworICBmb3IocHRyID0gKHVuc2lnbmVkIGNoYXIgKil1cmw7ICpwdHI7IHB0cisrKSB7CisKKyAgICBpZihwdHIgPCBob3N0X3NlcCkgeworICAgICAgKytuZXdsZW47CisgICAgICBjb250aW51ZTsKKyAgICB9CisKICAgICBzd2l0Y2goKnB0cikgewogICAgIGNhc2UgJz8nOgotICAgICAgbGVmdD1GQUxTRTsKKyAgICAgIGxlZnQgPSBGQUxTRTsKICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogICAgIGRlZmF1bHQ6CiAgICAgICBpZigqcHRyID49IDB4ODApCkBAIC0xNDA1LDcgKzE0OTIsNyBAQAogICAgICAgYnJlYWs7CiAgICAgY2FzZSAnICc6CiAgICAgICBpZihsZWZ0KQotICAgICAgICBuZXdsZW4rPTM7CisgICAgICAgIG5ld2xlbiArPSAzOwogICAgICAgZWxzZQogICAgICAgICBuZXdsZW4rKzsKICAgICAgIGJyZWFrOwpAQCAtMTQxNiwxOSArMTUwMywzMiBAQAogCiAvKiBzdHJjcHlfdXJsKCkgY29waWVzIGEgdXJsIHRvIGEgb3V0cHV0IGJ1ZmZlciBhbmQgVVJMLWVuY29kZXMgdGhlIHNwYWNlcyBpbgogICogdGhlIHNvdXJjZSBVUkwgYWNjb3JkaW5nbHkuCisgKiBVUkwgZW5jb2Rpbmcgc2hvdWxkIGJlIHNraXBwZWQgZm9yIGhvc3QgbmFtZXMsIG90aGVyd2lzZSBJRE4gcmVzb2x1dGlvbgorICogd2lsbCBmYWlsLgogICovCi1zdGF0aWMgdm9pZCBzdHJjcHlfdXJsKGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqdXJsKQorc3RhdGljIHZvaWQgc3RyY3B5X3VybChjaGFyICpvdXRwdXQsIGNvbnN0IGNoYXIgKnVybCwgYm9vbCByZWxhdGl2ZSkKIHsKICAgLyogd2UgbXVzdCBhZGQgdGhpcyB3aXRoIHdoaXRlc3BhY2UtcmVwbGFjaW5nICovCi0gIGJvb2wgbGVmdD1UUlVFOworICBib29sIGxlZnQgPSBUUlVFOwogICBjb25zdCB1bnNpZ25lZCBjaGFyICppcHRyOwogICBjaGFyICpvcHRyID0gb3V0cHV0OworICBjb25zdCB1bnNpZ25lZCBjaGFyICpob3N0X3NlcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHVybDsKKworICBpZighcmVsYXRpdmUpCisgICAgaG9zdF9zZXAgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBmaW5kX2hvc3Rfc2VwKHVybCk7CisKICAgZm9yKGlwdHIgPSAodW5zaWduZWQgY2hhciAqKXVybDsgICAgLyogcmVhZCBmcm9tIGhlcmUgKi8KICAgICAgICppcHRyOyAgICAgICAgIC8qIHVudGlsIHplcm8gYnl0ZSAqLwogICAgICAgaXB0cisrKSB7CisKKyAgICBpZihpcHRyIDwgaG9zdF9zZXApIHsKKyAgICAgICpvcHRyKysgPSAqaXB0cjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKwogICAgIHN3aXRjaCgqaXB0cikgewogICAgIGNhc2UgJz8nOgotICAgICAgbGVmdD1GQUxTRTsKKyAgICAgIGxlZnQgPSBGQUxTRTsKICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogICAgIGRlZmF1bHQ6CiAgICAgICBpZigqaXB0ciA+PSAweDgwKSB7CkBAIC0xNDQ5LDcgKzE1NDksNyBAQAogICAgICAgYnJlYWs7CiAgICAgfQogICB9Ci0gICpvcHRyPTA7IC8qIHplcm8gdGVybWluYXRlIG91dHB1dCBidWZmZXIgKi8KKyAgKm9wdHIgPSAwOyAvKiB6ZXJvIHRlcm1pbmF0ZSBvdXRwdXQgYnVmZmVyICovCiAKIH0KIApAQCAtMTQ4MSwzMiArMTU4MSwzMyBAQAogICBjaGFyICpwcm90c2VwOwogICBjaGFyICpwYXRoc2VwOwogICBzaXplX3QgbmV3bGVuOworICBib29sIGhvc3RfY2hhbmdlZCA9IEZBTFNFOwogCiAgIGNvbnN0IGNoYXIgKnVzZXVybCA9IHJlbHVybDsKICAgc2l6ZV90IHVybGxlbjsKIAogICAvKiB3ZSBtdXN0IG1ha2Ugb3VyIG93biBjb3B5IG9mIHRoZSBVUkwgdG8gcGxheSB3aXRoLCBhcyBpdCBtYXkKICAgICAgcG9pbnQgdG8gcmVhZC1vbmx5IGRhdGEgKi8KLSAgY2hhciAqdXJsX2Nsb25lPXN0cmR1cChiYXNlKTsKKyAgY2hhciAqdXJsX2Nsb25lID0gc3RyZHVwKGJhc2UpOwogCiAgIGlmKCF1cmxfY2xvbmUpCiAgICAgcmV0dXJuIE5VTEw7IC8qIHNraXAgb3V0IG9mIHRoaXMgTk9XICovCiAKICAgLyogcHJvdHNlcCBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBob3N0IG5hbWUgKi8KLSAgcHJvdHNlcD1zdHJzdHIodXJsX2Nsb25lLCAiLy8iKTsKKyAgcHJvdHNlcCA9IHN0cnN0cih1cmxfY2xvbmUsICIvLyIpOwogICBpZighcHJvdHNlcCkKLSAgICBwcm90c2VwPXVybF9jbG9uZTsKKyAgICBwcm90c2VwID0gdXJsX2Nsb25lOwogICBlbHNlCi0gICAgcHJvdHNlcCs9MjsgLyogcGFzcyB0aGUgc2xhc2hlcyAqLworICAgIHByb3RzZXAgKz0gMjsgLyogcGFzcyB0aGUgc2xhc2hlcyAqLwogCiAgIGlmKCcvJyAhPSByZWx1cmxbMF0pIHsKLSAgICBpbnQgbGV2ZWw9MDsKKyAgICBpbnQgbGV2ZWwgPSAwOwogCiAgICAgLyogRmlyc3Qgd2UgbmVlZCB0byBmaW5kIG91dCBpZiB0aGVyZSdzIGEgPy1sZXR0ZXIgaW4gdGhlIFVSTCwKICAgICAgICBhbmQgY3V0IGl0IGFuZCB0aGUgcmlnaHQtc2lkZSBvZiB0aGF0IG9mZiAqLwogICAgIHBhdGhzZXAgPSBzdHJjaHIocHJvdHNlcCwgJz8nKTsKICAgICBpZihwYXRoc2VwKQotICAgICAgKnBhdGhzZXA9MDsKKyAgICAgICpwYXRoc2VwID0gMDsKIAogICAgIC8qIHdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoIHRvIGFwcGVuZCB0byB0aGUgbGFzdCBzbGFzaCBpZiB0aGVyZSdzIG9uZQogICAgICAgIGF2YWlsYWJsZSwgb3IgaWYgdGhlIG5ldyBVUkwgaXMganVzdCBhIHF1ZXJ5IHN0cmluZyAoc3RhcnRzIHdpdGggYQpAQCAtMTUxNSwxNCArMTYxNiwxNCBAQAogICAgIGlmKHVzZXVybFswXSAhPSAnPycpIHsKICAgICAgIHBhdGhzZXAgPSBzdHJyY2hyKHByb3RzZXAsICcvJyk7CiAgICAgICBpZihwYXRoc2VwKQotICAgICAgICAqcGF0aHNlcD0wOworICAgICAgICAqcGF0aHNlcCA9IDA7CiAgICAgfQogCiAgICAgLyogQ2hlY2sgaWYgdGhlcmUncyBhbnkgc2xhc2ggYWZ0ZXIgdGhlIGhvc3QgbmFtZSwgYW5kIGlmIHNvLCByZW1lbWJlcgogICAgICAgIHRoYXQgcG9zaXRpb24gaW5zdGVhZCAqLwogICAgIHBhdGhzZXAgPSBzdHJjaHIocHJvdHNlcCwgJy8nKTsKICAgICBpZihwYXRoc2VwKQotICAgICAgcHJvdHNlcCA9IHBhdGhzZXArMTsKKyAgICAgIHByb3RzZXAgPSBwYXRoc2VwICsgMTsKICAgICBlbHNlCiAgICAgICBwcm90c2VwID0gTlVMTDsKIApAQCAtMTUzMCwxMyArMTYzMSwxMyBAQAogICAgICAgIGFuZCBhY3QgYWNjb3JkaW5nbHkgKi8KIAogICAgIGlmKCh1c2V1cmxbMF0gPT0gJy4nKSAmJiAodXNldXJsWzFdID09ICcvJykpCi0gICAgICB1c2V1cmwrPTI7IC8qIGp1c3Qgc2tpcCB0aGUgIi4vIiAqLworICAgICAgdXNldXJsICs9IDI7IC8qIGp1c3Qgc2tpcCB0aGUgIi4vIiAqLwogCiAgICAgd2hpbGUoKHVzZXVybFswXSA9PSAnLicpICYmCiAgICAgICAgICAgKHVzZXVybFsxXSA9PSAnLicpICYmCiAgICAgICAgICAgKHVzZXVybFsyXSA9PSAnLycpKSB7CiAgICAgICBsZXZlbCsrOwotICAgICAgdXNldXJsKz0zOyAvKiBwYXNzIHRoZSAiLi4vIiAqLworICAgICAgdXNldXJsICs9IDM7IC8qIHBhc3MgdGhlICIuLi8iICovCiAgICAgfQogCiAgICAgaWYocHJvdHNlcCkgewpAQCAtMTU0NCw5ICsxNjQ1LDkgQEAKICAgICAgICAgLyogY3V0IG9mZiBvbmUgbW9yZSBsZXZlbCBmcm9tIHRoZSByaWdodCBvZiB0aGUgb3JpZ2luYWwgVVJMICovCiAgICAgICAgIHBhdGhzZXAgPSBzdHJyY2hyKHByb3RzZXAsICcvJyk7CiAgICAgICAgIGlmKHBhdGhzZXApCi0gICAgICAgICAgKnBhdGhzZXA9MDsKKyAgICAgICAgICAqcGF0aHNlcCA9IDA7CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICpwcm90c2VwPTA7CisgICAgICAgICAgKnByb3RzZXAgPSAwOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICB9CkBAIC0xNTU4LDkgKzE2NTksMTAgQEAKICAgICBpZigocmVsdXJsWzBdID09ICcvJykgJiYgKHJlbHVybFsxXSA9PSAnLycpKSB7CiAgICAgICAvKiB0aGUgbmV3IFVSTCBzdGFydHMgd2l0aCAvLywganVzdCBrZWVwIHRoZSBwcm90b2NvbCBwYXJ0IGZyb20gdGhlCiAgICAgICAgICBvcmlnaW5hbCBvbmUgKi8KLSAgICAgICpwcm90c2VwPTA7CisgICAgICAqcHJvdHNlcCA9IDA7CiAgICAgICB1c2V1cmwgPSAmcmVsdXJsWzJdOyAvKiB3ZSBrZWVwIHRoZSBzbGFzaGVzIGZyb20gdGhlIG9yaWdpbmFsLCBzbyB3ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCB0aGUgbmV3IG9uZXMgKi8KKyAgICAgIGhvc3RfY2hhbmdlZCA9IFRSVUU7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgLyogY3V0IG9mZiB0aGUgb3JpZ2luYWwgVVJMIGZyb20gdGhlIGZpcnN0IHNsYXNoLCBvciBkZWFsIHdpdGggVVJMcwpAQCAtMTU3Myw3ICsxNjc1LDcgQEAKICAgICAgICAgY2hhciAqc2VwID0gc3RyY2hyKHByb3RzZXAsICc/Jyk7CiAgICAgICAgIGlmKHNlcCAmJiAoc2VwIDwgcGF0aHNlcCkpCiAgICAgICAgICAgcGF0aHNlcCA9IHNlcDsKLSAgICAgICAgKnBhdGhzZXA9MDsKKyAgICAgICAgKnBhdGhzZXAgPSAwOwogICAgICAgfQogICAgICAgZWxzZSB7CiAgICAgICAgIC8qIFRoZXJlIHdhcyBubyBzbGFzaC4gTm93LCBzaW5jZSB3ZSBtaWdodCBiZSBvcGVyYXRpbmcgb24gYSBiYWRseQpAQCAtMTU4Miw3ICsxNjg0LDcgQEAKICAgICAgICAgICAgPy1sZXR0ZXIgYXMgd2VsbCEgKi8KICAgICAgICAgcGF0aHNlcCA9IHN0cmNocihwcm90c2VwLCAnPycpOwogICAgICAgICBpZihwYXRoc2VwKQotICAgICAgICAgICpwYXRoc2VwPTA7CisgICAgICAgICAgKnBhdGhzZXAgPSAwOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMTU5Miw3ICsxNjk0LDcgQEAKICAgICAgbGV0dGVyIHdlIHJlcGxhY2UgZWFjaCBzcGFjZSB3aXRoICUyMCB3aGlsZSBpdCBpcyByZXBsYWNlZCB3aXRoICcrJwogICAgICBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgJz8nIGxldHRlci4KICAgKi8KLSAgbmV3bGVuID0gc3RybGVuX3VybCh1c2V1cmwpOworICBuZXdsZW4gPSBzdHJsZW5fdXJsKHVzZXVybCwgIWhvc3RfY2hhbmdlZCk7CiAKICAgdXJsbGVuID0gc3RybGVuKHVybF9jbG9uZSk7CiAKQEAgLTE2MTQsNyArMTcxNiw3IEBACiAgICAgbmV3ZXN0W3VybGxlbisrXT0nLyc7CiAKICAgLyogdGhlbiBhcHBlbmQgdGhlIG5ldyBwaWVjZSBvbiB0aGUgcmlnaHQgc2lkZSAqLwotICBzdHJjcHlfdXJsKCZuZXdlc3RbdXJsbGVuXSwgdXNldXJsKTsKKyAgc3RyY3B5X3VybCgmbmV3ZXN0W3VybGxlbl0sIHVzZXVybCwgIWhvc3RfY2hhbmdlZCk7CiAKICAgZnJlZSh1cmxfY2xvbmUpOwogCkBAIC0xNjczLDcgKzE3NzUsNyBAQAogICAgIH0KICAgfQogCi0gIGlmKCFpc19hYnNvbHV0ZV91cmwobmV3dXJsKSkgIHsKKyAgaWYoIWlzX2Fic29sdXRlX3VybChuZXd1cmwpKSB7CiAgICAgLyoqKgogICAgICAqREFORyogdGhpcyBpcyBhbiBSRkMgMjA2OCB2aW9sYXRpb24uIFRoZSBVUkwgaXMgc3VwcG9zZWQKICAgICAgdG8gYmUgYWJzb2x1dGUgYW5kIHRoaXMgZG9lc24ndCBzZWVtIHRvIGJlIHRoYXQhCkBAIC0xNjg3LDE1ICsxNzg5LDE2IEBACiAgICAgLyogVGhlIG5ldyBVUkwgTUFZIGNvbnRhaW4gc3BhY2Ugb3IgaGlnaCBieXRlIHZhbHVlcywgdGhhdCBtZWFucyBhIG1pZ2h0eQogICAgICAgIHN0dXBpZCByZWRpcmVjdCBVUkwgYnV0IHdlIHN0aWxsIG1ha2UgYW4gZWZmb3J0IHRvIGRvICJyaWdodCIuICovCiAgICAgY2hhciAqbmV3ZXN0OwotICAgIHNpemVfdCBuZXdsZW4gPSBzdHJsZW5fdXJsKG5ld3VybCk7CisgICAgc2l6ZV90IG5ld2xlbiA9IHN0cmxlbl91cmwobmV3dXJsLCBGQUxTRSk7CiAKICAgICAvKiBUaGlzIGlzIGFuIGFic29sdXRlIFVSTCwgZG9uJ3QgYWxsb3cgdGhlIGN1c3RvbSBwb3J0IG51bWJlciAqLwogICAgIGRpc2FsbG93cG9ydCA9IFRSVUU7CiAKLSAgICBuZXdlc3QgPSBtYWxsb2MobmV3bGVuKzEpOyAvKiBnZXQgbWVtb3J5IGZvciB0aGlzICovCisgICAgbmV3ZXN0ID0gbWFsbG9jKG5ld2xlbiArIDEpOyAvKiBnZXQgbWVtb3J5IGZvciB0aGlzICovCiAgICAgaWYoIW5ld2VzdCkKICAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwotICAgIHN0cmNweV91cmwobmV3ZXN0LCBuZXd1cmwpOyAvKiBjcmVhdGUgYSBzcGFjZS1mcmVlIFVSTCAqLworCisgICAgc3RyY3B5X3VybChuZXdlc3QsIG5ld3VybCwgRkFMU0UpOyAvKiBjcmVhdGUgYSBzcGFjZS1mcmVlIFVSTCAqLwogICAgIG5ld3VybCA9IG5ld2VzdDsgLyogdXNlIHRoaXMgaW5zdGVhZCBub3cgKi8KIAogICB9CkBAIC0xNzYzLDcgKzE4NjYsOCBAQAogICAgICAqIGNhbiBiZSBvdmVycmlkZGVuIHdpdGggQ1VSTE9QVF9QT1NUUkVESVIuCiAgICAgICovCiAgICAgaWYoKGRhdGEtPnNldC5odHRwcmVxID09IEhUVFBSRVFfUE9TVAotICAgICAgICB8fCBkYXRhLT5zZXQuaHR0cHJlcSA9PSBIVFRQUkVRX1BPU1RfRk9STSkKKyAgICAgICAgfHwgZGF0YS0+c2V0Lmh0dHByZXEgPT0gSFRUUFJFUV9QT1NUX0ZPUk0KKyAgICAgICAgfHwgZGF0YS0+c2V0Lmh0dHByZXEgPT0gSFRUUFJFUV9QT1NUX01JTUUpCiAgICAgICAgJiYgIShkYXRhLT5zZXQua2VlcF9wb3N0ICYgQ1VSTF9SRURJUl9QT1NUXzMwMSkpIHsKICAgICAgIGluZm9mKGRhdGEsICJTd2l0Y2ggZnJvbSBQT1NUIHRvIEdFVFxuIik7CiAgICAgICBkYXRhLT5zZXQuaHR0cHJlcSA9IEhUVFBSRVFfR0VUOwpAQCAtMTc4Nyw3ICsxODkxLDggQEAKICAgICAgKiBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIENVUkxPUFRfUE9TVFJFRElSLgogICAgICAqLwogICAgIGlmKChkYXRhLT5zZXQuaHR0cHJlcSA9PSBIVFRQUkVRX1BPU1QKLSAgICAgICAgfHwgZGF0YS0+c2V0Lmh0dHByZXEgPT0gSFRUUFJFUV9QT1NUX0ZPUk0pCisgICAgICAgIHx8IGRhdGEtPnNldC5odHRwcmVxID09IEhUVFBSRVFfUE9TVF9GT1JNCisgICAgICAgIHx8IGRhdGEtPnNldC5odHRwcmVxID09IEhUVFBSRVFfUE9TVF9NSU1FKQogICAgICAgICYmICEoZGF0YS0+c2V0LmtlZXBfcG9zdCAmIENVUkxfUkVESVJfUE9TVF8zMDIpKSB7CiAgICAgICBpbmZvZihkYXRhLCAiU3dpdGNoIGZyb20gUE9TVCB0byBHRVRcbiIpOwogICAgICAgZGF0YS0+c2V0Lmh0dHByZXEgPSBIVFRQUkVRX0dFVDsKQEAgLTE4MjAsNyArMTkyNSw3IEBACiAgICAgYnJlYWs7CiAgIH0KICAgQ3VybF9wZ3JzVGltZShkYXRhLCBUSU1FUl9SRURJUkVDVCk7Ci0gIEN1cmxfcGdyc1Jlc2V0VGltZXNTaXplcyhkYXRhKTsKKyAgQ3VybF9wZ3JzUmVzZXRUcmFuc2ZlclNpemVzKGRhdGEpOwogCiAgIHJldHVybiBDVVJMRV9PSzsKICNlbmRpZiAvKiBDVVJMX0RJU0FCTEVfSFRUUCAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdHJhbnNmZXIuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3RyYW5zZmVyLmgKaW5kZXggNTE4OTY3Mi4uNzI1MjZhOCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdHJhbnNmZXIuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi90cmFuc2Zlci5oCkBAIC03LDcgKzcsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC0yMiw2ICsyMiw5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorY2hhciAqQ3VybF9jaGVja2hlYWRlcnMoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGhpc2hlYWRlcik7CisKIHZvaWQgQ3VybF9pbml0X0NPTk5FQ1Qoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSk7CiAKIENVUkxjb2RlIEN1cmxfcHJldHJhbnNmZXIoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSk7CmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi91cmwuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3VybC5jCmluZGV4IDg3NDQ2ZGIuLjU4NDYzNWIgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3VybC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3VybC5jCkBAIC03MSw2ICs3MSw3IEBACiAjaW5jbHVkZSAibmV0cmMuaCIKIAogI2luY2x1ZGUgImZvcm1kYXRhLmgiCisjaW5jbHVkZSAibWltZS5oIgogI2luY2x1ZGUgInZ0bHMvdnRscy5oIgogI2luY2x1ZGUgImhvc3RpcC5oIgogI2luY2x1ZGUgInRyYW5zZmVyLmgiCkBAIC0yNzQsNiArMjc1LDcgQEAKICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJmb3JtX2dldHNvY2sgKi8KICAgWkVST19OVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjb25uZWN0ICovCiAgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZHdyaXRlICovCisgIFpFUk9fTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbl9jaGVjayAqLwogICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZnBvcnQgKi8KICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLwogICBQUk9UT1BUX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzICovCkBAIC0yODMsNyArMjg1LDcgQEAKIHsKICAgLyogRnJlZSBhbGwgZHluYW1pYyBzdHJpbmdzIHN0b3JlZCBpbiB0aGUgZGF0YS0+c2V0IHN1YnN0cnVjdHVyZS4gKi8KICAgZW51bSBkdXBzdHJpbmcgaTsKLSAgZm9yKGk9KGVudW0gZHVwc3RyaW5nKTA7IGkgPCBTVFJJTkdfTEFTVDsgaSsrKSB7CisgIGZvcihpID0gKGVudW0gZHVwc3RyaW5nKTA7IGkgPCBTVFJJTkdfTEFTVDsgaSsrKSB7CiAgICAgQ3VybF9zYWZlZnJlZShkYXRhLT5zZXQuc3RyW2ldKTsKICAgfQogCkBAIC0zNzAsNyArMzcyLDcgQEAKICAgbWVtc2V0KGRzdC0+c2V0LnN0ciwgMCwgU1RSSU5HX0xBU1QgKiBzaXplb2YoY2hhciAqKSk7CiAKICAgLyogZHVwbGljYXRlIGFsbCBzdHJpbmdzICovCi0gIGZvcihpPShlbnVtIGR1cHN0cmluZykwOyBpPCBTVFJJTkdfTEFTVFpFUk9URVJNSU5BVEVEOyBpKyspIHsKKyAgZm9yKGkgPSAoZW51bSBkdXBzdHJpbmcpMDsgaTwgU1RSSU5HX0xBU1RaRVJPVEVSTUlOQVRFRDsgaSsrKSB7CiAgICAgcmVzdWx0ID0gc2V0c3Ryb3B0KCZkc3QtPnNldC5zdHJbaV0sIHNyYy0+c2V0LnN0cltpXSk7CiAgICAgaWYocmVzdWx0KQogICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTQ3OCw2ICs0ODAsOCBAQAogICBDdXJsX2h0dHAyX2NsZWFudXBfZGVwZW5kZW5jaWVzKGRhdGEpOwogICBDdXJsX2NvbnZlcnRfY2xvc2UoZGF0YSk7CiAKKyAgQ3VybF9taW1lX2NsZWFucGFydCgmZGF0YS0+c2V0Lm1pbWVwb3N0KTsKKwogICAvKiBObyBsb25nZXIgYSBkaXJ0eSBzaGFyZSwgaWYgaXQgZXhpc3RzICovCiAgIGlmKGRhdGEtPnNoYXJlKSB7CiAgICAgQ3VybF9zaGFyZV9sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX1NIQVJFLCBDVVJMX0xPQ0tfQUNDRVNTX1NJTkdMRSk7CkBAIC01NDUsNiArNTQ5LDkgQEAKICAgc2V0LT5odHRwYXV0aCA9IENVUkxBVVRIX0JBU0lDOyAgLyogZGVmYXVsdHMgdG8gYmFzaWMgKi8KICAgc2V0LT5wcm94eWF1dGggPSBDVVJMQVVUSF9CQVNJQzsgLyogZGVmYXVsdHMgdG8gYmFzaWMgKi8KIAorICAvKiBTT0NLUzUgcHJveHkgYXV0aCBkZWZhdWx0cyB0byB1c2VybmFtZS9wYXNzd29yZCArIEdTUy1BUEkgKi8KKyAgc2V0LT5zb2NrczVhdXRoID0gQ1VSTEFVVEhfQkFTSUMgfCBDVVJMQVVUSF9HU1NBUEk7CisKICAgLyogbWFrZSBsaWJjdXJsIHF1aWV0IGJ5IGRlZmF1bHQ6ICovCiAgIHNldC0+aGlkZV9wcm9ncmVzcyA9IFRSVUU7ICAvKiBDVVJMT1BUX05PUFJPR1JFU1MgY2hhbmdlcyB0aGVzZSAqLwogCkBAIC02NjQsNiArNjcxLDggQEAKICAgICByZXN1bHQgPSBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogICB9CiAKKyAgQ3VybF9taW1lX2luaXRwYXJ0KCZkYXRhLT5zZXQubWltZXBvc3QsIGRhdGEpOworCiAgIGRhdGEtPnN0YXRlLmhlYWRlcmJ1ZmYgPSBtYWxsb2MoSEVBREVSU0laRSk7CiAgIGlmKCFkYXRhLT5zdGF0ZS5oZWFkZXJidWZmKSB7CiAgICAgREVCVUdGKGZwcmludGYoc3RkZXJyLCAiRXJyb3I6IG1hbGxvYyBvZiBoZWFkZXJidWZmIGZhaWxlZFxuIikpOwpAQCAtNjcyLDcgKzY4MSw3IEBACiAgIGVsc2UgewogICAgIHJlc3VsdCA9IEN1cmxfaW5pdF91c2VyZGVmaW5lZCgmZGF0YS0+c2V0KTsKIAotICAgIGRhdGEtPnN0YXRlLmhlYWRlcnNpemU9SEVBREVSU0laRTsKKyAgICBkYXRhLT5zdGF0ZS5oZWFkZXJzaXplID0gSEVBREVSU0laRTsKIAogICAgIEN1cmxfY29udmVydF9pbml0KGRhdGEpOwogCkBAIC04MjksNiArODM4LDEwIEBACiAgICAgICAgICB0aGVuIHRoaXMgY2FuIGJlIGNoYW5nZWQgdG8gSEVBRCBsYXRlciBvbikgKi8KICAgICAgIGRhdGEtPnNldC5odHRwcmVxID0gSFRUUFJFUV9HRVQ7CiAgICAgYnJlYWs7CisgIGNhc2UgQ1VSTE9QVF9SRVFVRVNUX1RBUkdFVDoKKyAgICByZXN1bHQgPSBzZXRzdHJvcHQoJmRhdGEtPnNldC5zdHJbU1RSSU5HX1RBUkdFVF0sCisgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZyhwYXJhbSwgY2hhciAqKSk7CisgICAgYnJlYWs7CiAgIGNhc2UgQ1VSTE9QVF9GSUxFVElNRToKICAgICAvKgogICAgICAqIFRyeSB0byBnZXQgdGhlIGZpbGUgdGltZSBvZiB0aGUgcmVtb3RlIGRvY3VtZW50LiBUaGUgdGltZSB3aWxsCkBAIC0xMTM5LDYgKzExNTIsMjAgQEAKICAgICBkYXRhLT5zZXQuaHR0cHJlcSA9IEhUVFBSRVFfUE9TVF9GT1JNOwogICAgIGRhdGEtPnNldC5vcHRfbm9fYm9keSA9IEZBTFNFOyAvKiB0aGlzIGlzIGltcGxpZWQgKi8KICAgICBicmVhazsKKyNlbmRpZiAgIC8qIENVUkxfRElTQUJMRV9IVFRQICovCisKKyAgY2FzZSBDVVJMT1BUX01JTUVQT1NUOgorICAgIC8qCisgICAgICogU2V0IHRvIG1ha2UgdXMgZG8gTUlNRS9mb3JtIFBPU1QKKyAgICAgKi8KKyAgICByZXN1bHQgPSBjdXJsX21pbWVfc3VicGFydHMoJmRhdGEtPnNldC5taW1lcG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHBhcmFtLCBjdXJsX21pbWUgKikpOworICAgIGlmKCFyZXN1bHQpIHsKKyAgICAgIGRhdGEtPnNldC5taW1lcG9zdC5mcmVlZnVuYyA9IE5VTEw7IC8qIEF2b2lkIGZyZWUgdXBvbiBlYXN5IGNsZWFudXAuICovCisgICAgICBkYXRhLT5zZXQuaHR0cHJlcSA9IEhUVFBSRVFfUE9TVF9NSU1FOworICAgICAgZGF0YS0+c2V0Lm9wdF9ub19ib2R5ID0gRkFMU0U7IC8qIHRoaXMgaXMgaW1wbGllZCAqLworICAgIH0KKyAgICBicmVhazsKIAogICBjYXNlIENVUkxPUFRfUkVGRVJFUjoKICAgICAvKgpAQCAtMTE2OCw2ICsxMTk1LDcgQEAKICAgICBkYXRhLT5zZXQuaGVhZGVycyA9IHZhX2FyZyhwYXJhbSwgc3RydWN0IGN1cmxfc2xpc3QgKik7CiAgICAgYnJlYWs7CiAKKyNpZm5kZWYgQ1VSTF9ESVNBQkxFX0hUVFAKICAgY2FzZSBDVVJMT1BUX1BST1hZSEVBREVSOgogICAgIC8qCiAgICAgICogU2V0IGEgbGlzdCB3aXRoIHByb3h5IGhlYWRlcnMgdG8gdXNlIChvciByZXBsYWNlIGludGVybmFscyB3aXRoKQpAQCAtMTMxOSw3ICsxMzQ3LDcgQEAKICAgICB9CiAKICAgICBicmVhazsKLSNlbmRpZiAvKiBDVVJMX0RJU0FCTEVfQ09PS0lFUyAqLworI2VuZGlmIC8qICFDVVJMX0RJU0FCTEVfQ09PS0lFUyAqLwogCiAgIGNhc2UgQ1VSTE9QVF9IVFRQR0VUOgogICAgIC8qCkBAIC0xMzQ1LDYgKzEzNzMsMTYgQEAKICAgICBkYXRhLT5zZXQuaHR0cHZlcnNpb24gPSBhcmc7CiAgICAgYnJlYWs7CiAKKyAgY2FzZSBDVVJMT1BUX0VYUEVDVF8xMDBfVElNRU9VVF9NUzoKKyAgICAvKgorICAgICAqIFRpbWUgdG8gd2FpdCBmb3IgYSByZXNwb25zZSB0byBhIEhUVFAgcmVxdWVzdCBjb250YWluaW5nIGFuCisgICAgICogRXhwZWN0OiAxMDAtY29udGludWUgaGVhZGVyIGJlZm9yZSBzZW5kaW5nIHRoZSBkYXRhIGFueXdheS4KKyAgICAgKi8KKyAgICBkYXRhLT5zZXQuZXhwZWN0XzEwMF90aW1lb3V0ID0gdmFfYXJnKHBhcmFtLCBsb25nKTsKKyAgICBicmVhazsKKworI2VuZGlmICAgLyogQ1VSTF9ESVNBQkxFX0hUVFAgKi8KKwogICBjYXNlIENVUkxPUFRfSFRUUEFVVEg6CiAgICAgLyoKICAgICAgKiBTZXQgSFRUUCBBdXRoZW50aWNhdGlvbiB0eXBlIEJJVE1BU0suCkBAIC0xMzk2LDE2ICsxNDM0LDYgQEAKICAgfQogICBicmVhazsKIAotICBjYXNlIENVUkxPUFRfRVhQRUNUXzEwMF9USU1FT1VUX01TOgotICAgIC8qCi0gICAgICogVGltZSB0byB3YWl0IGZvciBhIHJlc3BvbnNlIHRvIGEgSFRUUCByZXF1ZXN0IGNvbnRhaW5pbmcgYW4KLSAgICAgKiBFeHBlY3Q6IDEwMC1jb250aW51ZSBoZWFkZXIgYmVmb3JlIHNlbmRpbmcgdGhlIGRhdGEgYW55d2F5LgotICAgICAqLwotICAgIGRhdGEtPnNldC5leHBlY3RfMTAwX3RpbWVvdXQgPSB2YV9hcmcocGFyYW0sIGxvbmcpOwotICAgIGJyZWFrOwotCi0jZW5kaWYgICAvKiBDVVJMX0RJU0FCTEVfSFRUUCAqLwotCiAgIGNhc2UgQ1VSTE9QVF9DVVNUT01SRVFVRVNUOgogICAgIC8qCiAgICAgICogU2V0IGEgY3VzdG9tIHN0cmluZyB0byB1c2UgYXMgcmVxdWVzdApAQCAtMTUzNyw2ICsxNTY1LDExIEBACiAgICAgYnJlYWs7CiAjZW5kaWYgICAvKiBDVVJMX0RJU0FCTEVfUFJPWFkgKi8KIAorICBjYXNlIENVUkxPUFRfU09DS1M1X0FVVEg6CisgICAgZGF0YS0+c2V0LnNvY2tzNWF1dGggPSB2YV9hcmcocGFyYW0sIHVuc2lnbmVkIGxvbmcpOworICAgIGlmKGRhdGEtPnNldC5zb2NrczVhdXRoICYgfihDVVJMQVVUSF9CQVNJQyB8IENVUkxBVVRIX0dTU0FQSSkpCisgICAgICByZXN1bHQgPSBDVVJMRV9OT1RfQlVJTFRfSU47CisgICAgYnJlYWs7CiAjaWYgZGVmaW5lZChIQVZFX0dTU0FQSSkgfHwgZGVmaW5lZChVU0VfV0lORE9XU19TU1BJKQogICBjYXNlIENVUkxPUFRfU09DS1M1X0dTU0FQSV9ORUM6CiAgICAgLyoKQEAgLTE2NDYsMjggKzE2NzksMjggQEAKICAgICAgKiBUaGUgbG93IHNwZWVkIGxpbWl0IHRoYXQgaWYgdHJhbnNmZXJzIGFyZSBiZWxvdyB0aGlzIGZvcgogICAgICAqIENVUkxPUFRfTE9XX1NQRUVEX1RJTUUsIHRoZSB0cmFuc2ZlciBpcyBhYm9ydGVkLgogICAgICAqLwotICAgIGRhdGEtPnNldC5sb3dfc3BlZWRfbGltaXQ9dmFfYXJnKHBhcmFtLCBsb25nKTsKKyAgICBkYXRhLT5zZXQubG93X3NwZWVkX2xpbWl0ID0gdmFfYXJnKHBhcmFtLCBsb25nKTsKICAgICBicmVhazsKICAgY2FzZSBDVVJMT1BUX01BWF9TRU5EX1NQRUVEX0xBUkdFOgogICAgIC8qCiAgICAgICogV2hlbiB0cmFuc2ZlciB1cGxvYWRzIGFyZSBmYXN0ZXIgdGhlbiBDVVJMT1BUX01BWF9TRU5EX1NQRUVEX0xBUkdFCiAgICAgICogYnl0ZXMgcGVyIHNlY29uZCB0aGUgdHJhbnNmZXIgaXMgdGhyb3R0bGVkLi4KICAgICAgKi8KLSAgICBkYXRhLT5zZXQubWF4X3NlbmRfc3BlZWQ9dmFfYXJnKHBhcmFtLCBjdXJsX29mZl90KTsKKyAgICBkYXRhLT5zZXQubWF4X3NlbmRfc3BlZWQgPSB2YV9hcmcocGFyYW0sIGN1cmxfb2ZmX3QpOwogICAgIGJyZWFrOwogICBjYXNlIENVUkxPUFRfTUFYX1JFQ1ZfU1BFRURfTEFSR0U6CiAgICAgLyoKICAgICAgKiBXaGVuIHJlY2VpdmluZyBkYXRhIGZhc3RlciB0aGFuIENVUkxPUFRfTUFYX1JFQ1ZfU1BFRURfTEFSR0UgYnl0ZXMgcGVyCiAgICAgICogc2Vjb25kIHRoZSB0cmFuc2ZlciBpcyB0aHJvdHRsZWQuLgogICAgICAqLwotICAgIGRhdGEtPnNldC5tYXhfcmVjdl9zcGVlZD12YV9hcmcocGFyYW0sIGN1cmxfb2ZmX3QpOworICAgIGRhdGEtPnNldC5tYXhfcmVjdl9zcGVlZCA9IHZhX2FyZyhwYXJhbSwgY3VybF9vZmZfdCk7CiAgICAgYnJlYWs7CiAgIGNhc2UgQ1VSTE9QVF9MT1dfU1BFRURfVElNRToKICAgICAvKgogICAgICAqIFRoZSBsb3cgc3BlZWQgdGltZSB0aGF0IGlmIHRyYW5zZmVycyBhcmUgYmVsb3cgdGhlIHNldAogICAgICAqIENVUkxPUFRfTE9XX1NQRUVEX0xJTUlUIGR1cmluZyB0aGlzIHRpbWUsIHRoZSB0cmFuc2ZlciBpcyBhYm9ydGVkLgogICAgICAqLwotICAgIGRhdGEtPnNldC5sb3dfc3BlZWRfdGltZT12YV9hcmcocGFyYW0sIGxvbmcpOworICAgIGRhdGEtPnNldC5sb3dfc3BlZWRfdGltZSA9IHZhX2FyZyhwYXJhbSwgbG9uZyk7CiAgICAgYnJlYWs7CiAgIGNhc2UgQ1VSTE9QVF9VUkw6CiAgICAgLyoKQEAgLTE4NjIsMTMgKzE4OTUsMTMgQEAKICAgICBicmVhazsKICAgY2FzZSBDVVJMT1BUX1JFU1VNRV9GUk9NOgogICAgIC8qCi0gICAgICogUmVzdW1lIHRyYW5zZmVyIGF0IHRoZSBnaXZlIGZpbGUgcG9zaXRpb24KKyAgICAgKiBSZXN1bWUgdHJhbnNmZXIgYXQgdGhlIGdpdmVuIGZpbGUgcG9zaXRpb24KICAgICAgKi8KICAgICBkYXRhLT5zZXQuc2V0X3Jlc3VtZV9mcm9tID0gdmFfYXJnKHBhcmFtLCBsb25nKTsKICAgICBicmVhazsKICAgY2FzZSBDVVJMT1BUX1JFU1VNRV9GUk9NX0xBUkdFOgogICAgIC8qCi0gICAgICogUmVzdW1lIHRyYW5zZmVyIGF0IHRoZSBnaXZlIGZpbGUgcG9zaXRpb24KKyAgICAgKiBSZXN1bWUgdHJhbnNmZXIgYXQgdGhlIGdpdmVuIGZpbGUgcG9zaXRpb24KICAgICAgKi8KICAgICBkYXRhLT5zZXQuc2V0X3Jlc3VtZV9mcm9tID0gdmFfYXJnKHBhcmFtLCBjdXJsX29mZl90KTsKICAgICBicmVhazsKQEAgLTIxNjYsMjQgKzIxOTksMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSA6IEZBTFNFOwogICAgIGJyZWFrOwogICBjYXNlIENVUkxPUFRfU1NMX0NUWF9GVU5DVElPTjoKLSNpZmRlZiBoYXZlX2N1cmxzc2xfc3NsX2N0eAogICAgIC8qCiAgICAgICogU2V0IGEgU1NMX0NUWCBjYWxsYmFjawogICAgICAqLwotICAgIGRhdGEtPnNldC5zc2wuZnNzbGN0eCA9IHZhX2FyZyhwYXJhbSwgY3VybF9zc2xfY3R4X2NhbGxiYWNrKTsKLSNlbHNlCi0gICAgcmVzdWx0ID0gQ1VSTEVfTk9UX0JVSUxUX0lOOworI2lmZGVmIFVTRV9TU0wKKyAgICBpZihDdXJsX3NzbC0+aGF2ZV9zc2xfY3R4KQorICAgICAgZGF0YS0+c2V0LnNzbC5mc3NsY3R4ID0gdmFfYXJnKHBhcmFtLCBjdXJsX3NzbF9jdHhfY2FsbGJhY2spOworICAgIGVsc2UKICNlbmRpZgorICAgICAgcmVzdWx0ID0gQ1VSTEVfTk9UX0JVSUxUX0lOOwogICAgIGJyZWFrOwogICBjYXNlIENVUkxPUFRfU1NMX0NUWF9EQVRBOgotI2lmZGVmIGhhdmVfY3VybHNzbF9zc2xfY3R4CiAgICAgLyoKICAgICAgKiBTZXQgYSBTU0xfQ1RYIGNhbGxiYWNrIHBhcmFtZXRlciBwb2ludGVyCiAgICAgICovCi0gICAgZGF0YS0+c2V0LnNzbC5mc3NsY3R4cCA9IHZhX2FyZyhwYXJhbSwgdm9pZCAqKTsKLSNlbHNlCi0gICAgcmVzdWx0ID0gQ1VSTEVfTk9UX0JVSUxUX0lOOworI2lmZGVmIFVTRV9TU0wKKyAgICBpZihDdXJsX3NzbC0+aGF2ZV9zc2xfY3R4KQorICAgICAgZGF0YS0+c2V0LnNzbC5mc3NsY3R4cCA9IHZhX2FyZyhwYXJhbSwgdm9pZCAqKTsKKyAgICBlbHNlCiAjZW5kaWYKKyAgICAgIHJlc3VsdCA9IENVUkxFX05PVF9CVUlMVF9JTjsKICAgICBicmVhazsKICAgY2FzZSBDVVJMT1BUX1NTTF9GQUxTRVNUQVJUOgogICAgIC8qCkBAIC0yMTk3LDM1ICsyMjMyLDM4IEBACiAgICAgZGF0YS0+c2V0LnNzbC5mYWxzZXN0YXJ0ID0gKDAgIT0gdmFfYXJnKHBhcmFtLCBsb25nKSkgPyBUUlVFIDogRkFMU0U7CiAgICAgYnJlYWs7CiAgIGNhc2UgQ1VSTE9QVF9DRVJUSU5GTzoKLSNpZmRlZiBoYXZlX2N1cmxzc2xfY2VydGluZm8KLSAgICBkYXRhLT5zZXQuc3NsLmNlcnRpbmZvID0gKDAgIT0gdmFfYXJnKHBhcmFtLCBsb25nKSkgPyBUUlVFIDogRkFMU0U7Ci0jZWxzZQotICAgIHJlc3VsdCA9IENVUkxFX05PVF9CVUlMVF9JTjsKKyNpZmRlZiBVU0VfU1NMCisgICAgaWYoQ3VybF9zc2wtPmhhdmVfY2VydGluZm8pCisgICAgICBkYXRhLT5zZXQuc3NsLmNlcnRpbmZvID0gKDAgIT0gdmFfYXJnKHBhcmFtLCBsb25nKSkgPyBUUlVFIDogRkFMU0U7CisgICAgZWxzZQogI2VuZGlmCisgICAgICByZXN1bHQgPSBDVVJMRV9OT1RfQlVJTFRfSU47CiAgICAgYnJlYWs7CiAgIGNhc2UgQ1VSTE9QVF9QSU5ORURQVUJMSUNLRVk6Ci0jaWZkZWYgaGF2ZV9jdXJsc3NsX3Bpbm5lZHB1YmtleSAvKiBvbmx5IGJ5IHN1cHBvcnRlZCBiYWNrZW5kcyAqLwogICAgIC8qCiAgICAgICogU2V0IHBpbm5lZCBwdWJsaWMga2V5IGZvciBTU0wgY29ubmVjdGlvbi4KICAgICAgKiBTcGVjaWZ5IGZpbGUgbmFtZSBvZiB0aGUgcHVibGljIGtleSBpbiBERVIgZm9ybWF0LgogICAgICAqLwotICAgIHJlc3VsdCA9IHNldHN0cm9wdCgmZGF0YS0+c2V0LnN0cltTVFJJTkdfU1NMX1BJTk5FRFBVQkxJQ0tFWV9PUklHXSwKLSAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHBhcmFtLCBjaGFyICopKTsKLSNlbHNlCi0gICAgcmVzdWx0ID0gQ1VSTEVfTk9UX0JVSUxUX0lOOworI2lmZGVmIFVTRV9TU0wKKyAgICBpZihDdXJsX3NzbC0+aGF2ZV9waW5uZWRwdWJrZXkpCisgICAgICByZXN1bHQgPSBzZXRzdHJvcHQoJmRhdGEtPnNldC5zdHJbU1RSSU5HX1NTTF9QSU5ORURQVUJMSUNLRVlfT1JJR10sCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHBhcmFtLCBjaGFyICopKTsKKyAgICBlbHNlCiAjZW5kaWYKKyAgICAgIHJlc3VsdCA9IENVUkxFX05PVF9CVUlMVF9JTjsKICAgICBicmVhazsKICAgY2FzZSBDVVJMT1BUX1BST1hZX1BJTk5FRFBVQkxJQ0tFWToKLSNpZmRlZiBoYXZlX2N1cmxzc2xfcGlubmVkcHVia2V5IC8qIG9ubHkgYnkgc3VwcG9ydGVkIGJhY2tlbmRzICovCiAgICAgLyoKICAgICAgKiBTZXQgcGlubmVkIHB1YmxpYyBrZXkgZm9yIFNTTCBjb25uZWN0aW9uLgogICAgICAqIFNwZWNpZnkgZmlsZSBuYW1lIG9mIHRoZSBwdWJsaWMga2V5IGluIERFUiBmb3JtYXQuCiAgICAgICovCi0gICAgcmVzdWx0ID0gc2V0c3Ryb3B0KCZkYXRhLT5zZXQuc3RyW1NUUklOR19TU0xfUElOTkVEUFVCTElDS0VZX1BST1hZXSwKLSAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHBhcmFtLCBjaGFyICopKTsKLSNlbHNlCi0gICAgcmVzdWx0ID0gQ1VSTEVfTk9UX0JVSUxUX0lOOworI2lmZGVmIFVTRV9TU0wKKyAgICBpZihDdXJsX3NzbC0+aGF2ZV9waW5uZWRwdWJrZXkpCisgICAgICByZXN1bHQgPSBzZXRzdHJvcHQoJmRhdGEtPnNldC5zdHJbU1RSSU5HX1NTTF9QSU5ORURQVUJMSUNLRVlfUFJPWFldLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZyhwYXJhbSwgY2hhciAqKSk7CisgICAgZWxzZQogI2VuZGlmCisgICAgICByZXN1bHQgPSBDVVJMRV9OT1RfQlVJTFRfSU47CiAgICAgYnJlYWs7CiAgIGNhc2UgQ1VSTE9QVF9DQUlORk86CiAgICAgLyoKQEAgLTIyNDMsMzAgKzIyODEsMzIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHBhcmFtLCBjaGFyICopKTsKICAgICBicmVhazsKICAgY2FzZSBDVVJMT1BUX0NBUEFUSDoKLSNpZmRlZiBoYXZlX2N1cmxzc2xfY2FfcGF0aCAvKiBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBiYWNrZW5kcyAqLwogICAgIC8qCiAgICAgICogU2V0IENBIHBhdGggaW5mbyBmb3IgU1NMIGNvbm5lY3Rpb24uIFNwZWNpZnkgZGlyZWN0b3J5IG5hbWUgb2YgdGhlIENBCiAgICAgICogY2VydGlmaWNhdGVzIHdoaWNoIGhhdmUgYmVlbiBwcmVwYXJlZCB1c2luZyBvcGVuc3NsIGNfcmVoYXNoIHV0aWxpdHkuCiAgICAgICovCi0gICAgLyogVGhpcyBkb2VzIG5vdCB3b3JrIG9uIHdpbmRvd3MuICovCi0gICAgcmVzdWx0ID0gc2V0c3Ryb3B0KCZkYXRhLT5zZXQuc3RyW1NUUklOR19TU0xfQ0FQQVRIX09SSUddLAotICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcocGFyYW0sIGNoYXIgKikpOwotI2Vsc2UKLSAgICByZXN1bHQgPSBDVVJMRV9OT1RfQlVJTFRfSU47CisjaWZkZWYgVVNFX1NTTAorICAgIGlmKEN1cmxfc3NsLT5oYXZlX2NhX3BhdGgpCisgICAgICAvKiBUaGlzIGRvZXMgbm90IHdvcmsgb24gd2luZG93cy4gKi8KKyAgICAgIHJlc3VsdCA9IHNldHN0cm9wdCgmZGF0YS0+c2V0LnN0cltTVFJJTkdfU1NMX0NBUEFUSF9PUklHXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcocGFyYW0sIGNoYXIgKikpOworICAgIGVsc2UKICNlbmRpZgorICAgICAgcmVzdWx0ID0gQ1VSTEVfTk9UX0JVSUxUX0lOOwogICAgIGJyZWFrOwogICBjYXNlIENVUkxPUFRfUFJPWFlfQ0FQQVRIOgotI2lmZGVmIGhhdmVfY3VybHNzbF9jYV9wYXRoIC8qIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGJhY2tlbmRzICovCiAgICAgLyoKICAgICAgKiBTZXQgQ0EgcGF0aCBpbmZvIGZvciBTU0wgY29ubmVjdGlvbiBwcm94eS4gU3BlY2lmeSBkaXJlY3RvcnkgbmFtZSBvZiB0aGUKICAgICAgKiBDQSBjZXJ0aWZpY2F0ZXMgd2hpY2ggaGF2ZSBiZWVuIHByZXBhcmVkIHVzaW5nIG9wZW5zc2wgY19yZWhhc2ggdXRpbGl0eS4KICAgICAgKi8KLSAgICAvKiBUaGlzIGRvZXMgbm90IHdvcmsgb24gd2luZG93cy4gKi8KLSAgICByZXN1bHQgPSBzZXRzdHJvcHQoJmRhdGEtPnNldC5zdHJbU1RSSU5HX1NTTF9DQVBBVEhfUFJPWFldLAotICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcocGFyYW0sIGNoYXIgKikpOwotI2Vsc2UKLSAgICByZXN1bHQgPSBDVVJMRV9OT1RfQlVJTFRfSU47CisjaWZkZWYgVVNFX1NTTAorICAgIGlmKEN1cmxfc3NsLT5oYXZlX2NhX3BhdGgpCisgICAgICAvKiBUaGlzIGRvZXMgbm90IHdvcmsgb24gd2luZG93cy4gKi8KKyAgICAgIHJlc3VsdCA9IHNldHN0cm9wdCgmZGF0YS0+c2V0LnN0cltTVFJJTkdfU1NMX0NBUEFUSF9QUk9YWV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHBhcmFtLCBjaGFyICopKTsKKyAgICBlbHNlCiAjZW5kaWYKKyAgICAgIHJlc3VsdCA9IENVUkxFX05PVF9CVUlMVF9JTjsKICAgICBicmVhazsKICAgY2FzZSBDVVJMT1BUX0NSTEZJTEU6CiAgICAgLyoKQEAgLTI4OTcsNyArMjkzNyw3IEBACiAgICAgcmV0dXJuIENVUkxFX05PVF9CVUlMVF9JTjsKICNlbHNlCiAgICAgYXJnID0gdmFfYXJnKHBhcmFtLCBsb25nKTsKLSAgICBpZigoYXJnPj0xKSAmJiAoYXJnIDw9IDI1NikpCisgICAgaWYoKGFyZyA+PSAxKSAmJiAoYXJnIDw9IDI1NikpCiAgICAgICBkYXRhLT5zZXQuc3RyZWFtX3dlaWdodCA9IChpbnQpYXJnOwogICAgIGJyZWFrOwogI2VuZGlmCkBAIC0yOTIzLDYgKzI5NjMsOSBAQAogICBjYXNlIENVUkxPUFRfU1VQUFJFU1NfQ09OTkVDVF9IRUFERVJTOgogICAgIGRhdGEtPnNldC5zdXBwcmVzc19jb25uZWN0X2hlYWRlcnMgPSAoMCAhPSB2YV9hcmcocGFyYW0sIGxvbmcpKT9UUlVFOkZBTFNFOwogICAgIGJyZWFrOworICBjYXNlIENVUkxPUFRfU1NIX0NPTVBSRVNTSU9OOgorICAgIGRhdGEtPnNldC5zc2hfY29tcHJlc3Npb24gPSAoMCAhPSB2YV9hcmcocGFyYW0sIGxvbmcpKT9UUlVFOkZBTFNFOworICAgIGJyZWFrOwogICBkZWZhdWx0OgogICAgIC8qIHVua25vd24gdGFnIGFuZCBpdHMgY29tcGFuaW9uLCBqdXN0IGlnbm9yZTogKi8KICAgICByZXN1bHQgPSBDVVJMRV9VTktOT1dOX09QVElPTjsKQEAgLTMwMjMsNyArMzA2Niw3IEBACiAgIEN1cmxfc2FmZWZyZWUoY29ubi0+aHR0cF9wcm94eS5ob3N0LnJhd2FsbG9jKTsgLyogaHR0cCBwcm94eSBuYW1lIGJ1ZmZlciAqLwogICBDdXJsX3NhZmVmcmVlKGNvbm4tPnNvY2tzX3Byb3h5Lmhvc3QucmF3YWxsb2MpOyAvKiBzb2NrcyBwcm94eSBuYW1lIGJ1ZmZlciAqLwogICBDdXJsX3NhZmVmcmVlKGNvbm4tPm1hc3Rlcl9idWZmZXIpOwotICBDdXJsX3NhZmVmcmVlKGNvbm4tPmNvbm5lY3RfYnVmZmVyKTsKKyAgQ3VybF9zYWZlZnJlZShjb25uLT5jb25uZWN0X3N0YXRlKTsKIAogICBjb25uX3Jlc2V0X2FsbF9wb3N0cG9uZWRfZGF0YShjb25uKTsKIApAQCAtMzI2MCw5ICszMzAzLDkgQEAKICAgc3RydWN0IGN1cmxfaGFzaF9pdGVyYXRvciBpdGVyOwogICBzdHJ1Y3QgY3VybF9sbGlzdF9lbGVtZW50ICpjdXJyOwogICBzdHJ1Y3QgY3VybF9oYXNoX2VsZW1lbnQgKmhlOwotICB0aW1lX3QgaGlnaHNjb3JlPS0xOworICB0aW1lX3QgaGlnaHNjb3JlID0tIDE7CiAgIHRpbWVfdCBzY29yZTsKLSAgc3RydWN0IHRpbWV2YWwgbm93OworICBzdHJ1Y3QgY3VybHRpbWUgbm93OwogICBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm5fY2FuZGlkYXRlID0gTlVMTDsKICAgc3RydWN0IGNvbm5lY3RidW5kbGUgKmJ1bmRsZTsKIApAQCAtMzMyMyw5ICszMzY2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbm5lY3RidW5kbGUgKmJ1bmRsZSkKIHsKICAgc3RydWN0IGN1cmxfbGxpc3RfZWxlbWVudCAqY3VycjsKLSAgdGltZV90IGhpZ2hzY29yZT0tMTsKKyAgdGltZV90IGhpZ2hzY29yZSA9IC0xOwogICB0aW1lX3Qgc2NvcmU7Ci0gIHN0cnVjdCB0aW1ldmFsIG5vdzsKKyAgc3RydWN0IGN1cmx0aW1lIG5vdzsKICAgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uX2NhbmRpZGF0ZSA9IE5VTEw7CiAgIHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubjsKIApAQCAtMzM2NywxMSArMzQxMCwxOSBAQAogICAgICAgIGhhbmRsZXMgaW4gcGlwZWxpbmUgYW5kIHRoZSBjb25uZWN0aW9uIGlzbid0IGFscmVhZHkgbWFya2VkIGluCiAgICAgICAgdXNlICovCiAgICAgYm9vbCBkZWFkOwotICAgIGlmKGNvbm4tPmhhbmRsZXItPnByb3RvY29sICYgQ1VSTFBST1RPX1JUU1ApCi0gICAgICAvKiBSVFNQIGlzIGEgc3BlY2lhbCBjYXNlIGR1ZSB0byBSVFAgaW50ZXJsZWF2aW5nICovCi0gICAgICBkZWFkID0gQ3VybF9ydHNwX2Nvbm5pc2RlYWQoY29ubik7Ci0gICAgZWxzZQorCisgICAgaWYoY29ubi0+aGFuZGxlci0+Y29ubmVjdGlvbl9jaGVjaykgeworICAgICAgLyogVGhlIHByb3RvY29sIGhhcyBhIHNwZWNpYWwgbWV0aG9kIGZvciBjaGVja2luZyB0aGUgc3RhdGUgb2YgdGhlCisgICAgICAgICBjb25uZWN0aW9uLiBVc2UgaXQgdG8gY2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gaXMgZGVhZC4gKi8KKyAgICAgIHVuc2lnbmVkIGludCBzdGF0ZTsKKworICAgICAgc3RhdGUgPSBjb25uLT5oYW5kbGVyLT5jb25uZWN0aW9uX2NoZWNrKGNvbm4sIENPTk5DSEVDS19JU0RFQUQpOworICAgICAgZGVhZCA9IChzdGF0ZSAmIENPTk5SRVNVTFRfREVBRCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgLyogVXNlIHRoZSBnZW5lcmFsIG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgdGhlIGRlYXRoIG9mIGEgY29ubmVjdGlvbiAqLwogICAgICAgZGVhZCA9IFNvY2tldElzRGVhZChjb25uLT5zb2NrW0ZJUlNUU09DS0VUXSk7CisgICAgfQogCiAgICAgaWYoZGVhZCkgewogICAgICAgY29ubi0+ZGF0YSA9IGRhdGE7CkBAIC0zNDA1LDcgKzM0NTYsNyBAQAogICovCiBzdGF0aWMgdm9pZCBwcnVuZV9kZWFkX2Nvbm5lY3Rpb25zKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCiB7Ci0gIHN0cnVjdCB0aW1ldmFsIG5vdyA9IEN1cmxfdHZub3coKTsKKyAgc3RydWN0IGN1cmx0aW1lIG5vdyA9IEN1cmxfdHZub3coKTsKICAgdGltZV90IGVsYXBzZWQgPSBDdXJsX3R2ZGlmZihub3csIGRhdGEtPnN0YXRlLmNvbm5fY2FjaGUtPmxhc3RfY2xlYW51cCk7CiAKICAgaWYoZWxhcHNlZCA+PSAxMDAwTCkgewpAQCAtMzk0Niw3ICszOTk3LDcgQEAKIENVUkxjb2RlIEN1cmxfcHJvdG9jb2xfY29ubmVjdGluZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqZG9uZSkKIHsKLSAgQ1VSTGNvZGUgcmVzdWx0PUNVUkxFX09LOworICBDVVJMY29kZSByZXN1bHQgPSBDVVJMRV9PSzsKIAogICBpZihjb25uICYmIGNvbm4tPmhhbmRsZXItPmNvbm5lY3RpbmcpIHsKICAgICAqZG9uZSA9IEZBTFNFOwpAQCAtMzk2NSw3ICs0MDE2LDcgQEAKIAogQ1VSTGNvZGUgQ3VybF9wcm90b2NvbF9kb2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGJvb2wgKmRvbmUpCiB7Ci0gIENVUkxjb2RlIHJlc3VsdD1DVVJMRV9PSzsKKyAgQ1VSTGNvZGUgcmVzdWx0ID0gQ1VSTEVfT0s7CiAKICAgaWYoY29ubiAmJiBjb25uLT5oYW5kbGVyLT5kb2luZykgewogICAgICpkb25lID0gRkFMU0U7CkBAIC0zOTg1LDcgKzQwMzYsNyBAQAogQ1VSTGNvZGUgQ3VybF9wcm90b2NvbF9jb25uZWN0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpwcm90b2NvbF9kb25lKQogewotICBDVVJMY29kZSByZXN1bHQ9Q1VSTEVfT0s7CisgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOwogCiAgICpwcm90b2NvbF9kb25lID0gRkFMU0U7CiAKQEAgLTQwMTMsNyArNDA2NCw3IEBACiAgICAgICByZXR1cm4gQ1VSTEVfT0s7CiAKICAgICBpZihjb25uLT5iaXRzLnR1bm5lbF9wcm94eSAmJiBjb25uLT5iaXRzLmh0dHBwcm94eSAmJgotICAgICAgIChjb25uLT50dW5uZWxfc3RhdGVbRklSU1RTT0NLRVRdICE9IFRVTk5FTF9DT01QTEVURSkpCisgICAgICAgQ3VybF9jb25uZWN0X29uZ29pbmcoY29ubikpCiAgICAgICAvKiB3aGVuIHVzaW5nIGFuIEhUVFAgdHVubmVsIHByb3h5LCBhd2FpdCBjb21wbGV0ZSB0dW5uZWwgZXN0YWJsaXNobWVudAogICAgICAgICAgYmVmb3JlIHByb2NlZWRpbmcgZnVydGhlci4gUmV0dXJuIENVUkxFX09LIHNvIHdlJ2xsIGJlIGNhbGxlZCBhZ2FpbiAqLwogICAgICAgcmV0dXJuIENVUkxFX09LOwpAQCAtNDA3Miw3ICs0MTIzLDcgQEAKICAgaWYobGVuICYmIChob3N0LT5uYW1lW2xlbi0xXSA9PSAnLicpKQogICAgIC8qIHN0cmlwIG9mZiBhIHNpbmdsZSB0cmFpbGluZyBkb3QgaWYgcHJlc2VudCwgcHJpbWFyaWx5IGZvciBTTkkgYnV0CiAgICAgICAgdGhlcmUncyBubyB1c2UgZm9yIGl0ICovCi0gICAgaG9zdC0+bmFtZVtsZW4tMV09MDsKKyAgICBob3N0LT5uYW1lW2xlbi0xXSA9IDA7CiAKICAgLyogQ2hlY2sgbmFtZSBmb3Igbm9uLUFTQ0lJIGFuZCBjb252ZXJ0IGhvc3RuYW1lIHRvIEFDRSBmb3JtIGlmIHdlIGNhbiAqLwogICBpZighaXNfQVNDSUlfbmFtZShob3N0LT5uYW1lKSkgewpAQCAtNDEyNSw3ICs0MTc2LDcgQEAKICAgICBob3N0LT5lbmNhbGxvYyA9IE5VTEw7CiAgIH0KICNlbGlmIGRlZmluZWQoVVNFX1dJTjMyX0lETikKLSAgZnJlZShob3N0LT5lbmNhbGxvYyk7IC8qIG11c3QgYmUgZnJlZWQgd2l0aGlkbl9mcmVlKCkgc2luY2UgdGhpcyB3YXMKKyAgZnJlZShob3N0LT5lbmNhbGxvYyk7IC8qIG11c3QgYmUgZnJlZWQgd2l0aCBmcmVlKCkgc2luY2UgdGhpcyB3YXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBieSBjdXJsX3dpbjMyX2lkbl90b19hc2NpaSAqLwogICBob3N0LT5lbmNhbGxvYyA9IE5VTEw7CiAjZWxzZQpAQCAtNDE0NSw3ICs0MTk2LDEyIEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgY29ubmVjdGRhdGEgKmFsbG9jYXRlX2Nvbm4oc3RydWN0IEN1cmxfZWFzeSAqZGF0YSkKIHsKLSAgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgY29ubmVjdGRhdGEpKTsKKyNpZmRlZiBVU0VfU1NMCisjZGVmaW5lIFNTTF9FWFRSQSArIDQgKiBDdXJsX3NzbC0+c2l6ZW9mX3NzbF9iYWNrZW5kX2RhdGEgLSBzaXplb2YobG9uZyBsb25nKQorI2Vsc2UKKyNkZWZpbmUgU1NMX0VYVFJBIDAKKyNlbmRpZgorICBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4gPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBjb25uZWN0ZGF0YSkgKyBTU0xfRVhUUkEpOwogICBpZighY29ubikKICAgICByZXR1cm4gTlVMTDsKIApAQCAtNDIyOCw2ICs0Mjg0LDIzIEBACiAKICAgY29ubi0+aXBfdmVyc2lvbiA9IGRhdGEtPnNldC5pcHZlcjsKIAorI2lmZGVmIFVTRV9TU0wKKyAgLyoKKyAgICogVG8gc2F2ZSBvbiBtYWxsb2MoKXMsIHRoZSBTU0wgYmFja2VuZC1zcGVjaWZpYyBkYXRhIGhhcyBiZWVuIGFsbG9jYXRlZAorICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBjb25uZWN0ZGF0YSBzdHJ1Y3QuCisgICAqLworICB7CisgICAgY2hhciAqcCA9IChjaGFyICopJmNvbm4tPmFsaWduX2RhdGFfX2RvX25vdF91c2U7CisgICAgY29ubi0+c3NsWzBdLmJhY2tlbmQgPSAoc3RydWN0IHNzbF9iYWNrZW5kX2RhdGEgKilwOworICAgIGNvbm4tPnNzbFsxXS5iYWNrZW5kID0KKyAgICAgIChzdHJ1Y3Qgc3NsX2JhY2tlbmRfZGF0YSAqKShwICsgQ3VybF9zc2wtPnNpemVvZl9zc2xfYmFja2VuZF9kYXRhKTsKKyAgICBjb25uLT5wcm94eV9zc2xbMF0uYmFja2VuZCA9CisgICAgICAoc3RydWN0IHNzbF9iYWNrZW5kX2RhdGEgKikocCArIEN1cmxfc3NsLT5zaXplb2Zfc3NsX2JhY2tlbmRfZGF0YSAqIDIpOworICAgIGNvbm4tPnByb3h5X3NzbFsxXS5iYWNrZW5kID0KKyAgICAgIChzdHJ1Y3Qgc3NsX2JhY2tlbmRfZGF0YSAqKShwICsgQ3VybF9zc2wtPnNpemVvZl9zc2xfYmFja2VuZF9kYXRhICogMyk7CisgIH0KKyNlbmRpZgorCiAjaWYgIWRlZmluZWQoQ1VSTF9ESVNBQkxFX0hUVFApICYmIGRlZmluZWQoVVNFX05UTE0pICYmIFwKICAgICBkZWZpbmVkKE5UTE1fV0JfRU5BQkxFRCkKICAgY29ubi0+bnRsbV9hdXRoX2hscHJfc29ja2V0ID0gQ1VSTF9TT0NLRVRfQkFEOwpAQCAtNDM2MywxMSArNDQzNiwxNiBAQAogICAgIHJldHVybiBDVVJMRV9VUkxfTUFMRk9STUFUOwogICB9CiAKLSAgLyogTWFrZSBzdXJlIHdlIGRvbid0IG1pc3Rha2UgYSBkcml2ZSBsZXR0ZXIgZm9yIGEgc2NoZW1lLCBmb3IgZXhhbXBsZToKKyAgLyogTVNET1MvV2luZG93cyBzdHlsZSBkcml2ZSBwcmVmaXgsIGVnIGM6IGluIGM6Zm9vICovCisjZGVmaW5lIFNUQVJUU19XSVRIX0RSSVZFX1BSRUZJWChzdHIpIFwKKyAgKCgoJ2EnIDw9IHN0clswXSAmJiBzdHJbMF0gPD0gJ3onKSB8fCBcCisgICAgKCdBJyA8PSBzdHJbMF0gJiYgc3RyWzBdIDw9ICdaJykpICYmIFwKKyAgIChzdHJbMV0gPT0gJzonKSkKKworICAvKiBEb24ndCBtaXN0YWtlIGEgZHJpdmUgbGV0dGVyIGZvciBhIHNjaGVtZSBpZiB0aGUgZGVmYXVsdCBwcm90b2NvbCBpcyBmaWxlLgogICAgICBjdXJsZCAtLXByb3RvLWRlZmF1bHQgZmlsZSBjOi9mb28vYmFyLnR4dCAqLwotICBpZigoKCdhJyA8PSBkYXRhLT5jaGFuZ2UudXJsWzBdICYmIGRhdGEtPmNoYW5nZS51cmxbMF0gPD0gJ3onKSB8fAotICAgICAgKCdBJyA8PSBkYXRhLT5jaGFuZ2UudXJsWzBdICYmIGRhdGEtPmNoYW5nZS51cmxbMF0gPD0gJ1onKSkgJiYKLSAgICAgZGF0YS0+Y2hhbmdlLnVybFsxXSA9PSAnOicgJiYgZGF0YS0+c2V0LnN0cltTVFJJTkdfREVGQVVMVF9QUk9UT0NPTF0gJiYKKyAgaWYoU1RBUlRTX1dJVEhfRFJJVkVfUFJFRklYKGRhdGEtPmNoYW5nZS51cmwpICYmCisgICAgIGRhdGEtPnNldC5zdHJbU1RSSU5HX0RFRkFVTFRfUFJPVE9DT0xdICYmCiAgICAgIHN0cmNhc2Vjb21wYXJlKGRhdGEtPnNldC5zdHJbU1RSSU5HX0RFRkFVTFRfUFJPVE9DT0xdLCAiZmlsZSIpKSB7CiAgICAgOyAvKiBkbyBub3RoaW5nICovCiAgIH0KQEAgLTQzODYsOCArNDQ2NCw2IEBACiAgIGlmKCh1cmxfaGFzX3NjaGVtZSAmJiBzdHJuY2FzZWNvbXBhcmUoZGF0YS0+Y2hhbmdlLnVybCwgImZpbGU6IiwgNSkpIHx8CiAgICAgICghdXJsX2hhc19zY2hlbWUgJiYgZGF0YS0+c2V0LnN0cltTVFJJTkdfREVGQVVMVF9QUk9UT0NPTF0gJiYKICAgICAgIHN0cmNhc2Vjb21wYXJlKGRhdGEtPnNldC5zdHJbU1RSSU5HX0RFRkFVTFRfUFJPVE9DT0xdLCAiZmlsZSIpKSkgewotICAgIGJvb2wgcGF0aF9oYXNfZHJpdmUgPSBGQUxTRTsKLQogICAgIGlmKHVybF9oYXNfc2NoZW1lKQogICAgICAgcmMgPSBzc2NhbmYoZGF0YS0+Y2hhbmdlLnVybCwgIiUqMTVbXlxuLzpdOiVbXlxuXSIsIHBhdGgpOwogICAgIGVsc2UKQEAgLTQ0MDYsMjAgKzQ0ODIsMTUgQEAKIAogICAgICAgLyogVGhpcyBjYW5ub3QgYmUgZG9uZSB3aXRoIHN0cmNweSgpIGluIGEgcG9ydGFibGUgbWFubmVyLCBzaW5jZSB0aGUKICAgICAgICAgIG1lbW9yeSBhcmVhcyBvdmVybGFwISAqLwotICAgICAgbWVtbW92ZShwYXRoLCBwYXRoICsgMiwgc3RybGVuKHBhdGggKyAyKSsxKTsKKyAgICAgIG1lbW1vdmUocGF0aCwgcGF0aCArIDIsIHN0cmxlbihwYXRoICsgMikgKyAxKTsKICAgICB9CiAKLSAgICAvKiB0aGUgcGF0aCBtYXkgc3RhcnQgd2l0aCBhIGRyaXZlIGxldHRlci4gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ci0gICAgICAgd2Ugc2tpcCBzb21lIHByb2Nlc3Npbmcgb24gdGhvc2UgcGF0aHMuICovCi0gICAgcGF0aF9oYXNfZHJpdmUgPSAoKCdhJyA8PSBwYXRoWzBdICYmIHBhdGhbMF0gPD0gJ3onKSB8fAotICAgICAgICAgICAgICAgICAgICAgICgnQScgPD0gcGF0aFswXSAmJiBwYXRoWzBdIDw9ICdaJykpICYmIHBhdGhbMV0gPT0gJzonOwotCiAgICAgLyoKICAgICAgKiB3ZSBkZWFsIHdpdGggZmlsZTovLzxob3N0Pi88cGF0aD4gZGlmZmVyZW50bHkgc2luY2UgaXQgc3VwcG9ydHMgbm8KICAgICAgKiBob3N0bmFtZSBvdGhlciB0aGFuICJsb2NhbGhvc3QiIGFuZCAiMTI3LjAuMC4xIiwgd2hpY2ggaXMgdW5pcXVlIGFtb25nCiAgICAgICogdGhlIFVSTCBwcm90b2NvbHMgc3BlY2lmaWVkIGluIFJGQyAxNzM4CiAgICAgICovCi0gICAgaWYocGF0aFswXSAhPSAnLycgJiYgIXBhdGhfaGFzX2RyaXZlKSB7CisgICAgaWYocGF0aFswXSAhPSAnLycgJiYgIVNUQVJUU19XSVRIX0RSSVZFX1BSRUZJWChwYXRoKSkgewogICAgICAgLyogdGhlIFVSTCBpbmNsdWRlcyBhIGhvc3QgbmFtZSwgaXQgbXVzdCBtYXRjaCAibG9jYWxob3N0IiBvcgogICAgICAgICAgIjEyNy4wLjAuMSIgdG8gYmUgdmFsaWQgKi8KICAgICAgIGNoYXIgKnB0cjsKQEAgLTQ0NTIsMTQgKzQ1MjMsMTEgQEAKICAgICAgICAgcHRyKys7CiAKICAgICAgIC8qIFRoaXMgY2Fubm90IGJlIG1hZGUgd2l0aCBzdHJjcHksIGFzIHRoZSBtZW1vcnkgY2h1bmtzIG92ZXJsYXAhICovCi0gICAgICBtZW1tb3ZlKHBhdGgsIHB0ciwgc3RybGVuKHB0cikrMSk7Ci0KLSAgICAgIHBhdGhfaGFzX2RyaXZlID0gKCgnYScgPD0gcGF0aFswXSAmJiBwYXRoWzBdIDw9ICd6JykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgnQScgPD0gcGF0aFswXSAmJiBwYXRoWzBdIDw9ICdaJykpICYmIHBhdGhbMV0gPT0gJzonOworICAgICAgbWVtbW92ZShwYXRoLCBwdHIsIHN0cmxlbihwdHIpICsgMSk7CiAgICAgfQogCiAjaWYgIWRlZmluZWQoTVNET1MpICYmICFkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotICAgIGlmKHBhdGhfaGFzX2RyaXZlKSB7CisgICAgaWYoU1RBUlRTX1dJVEhfRFJJVkVfUFJFRklYKHBhdGgpKSB7CiAgICAgICBmYWlsZihkYXRhLCAiRmlsZSBkcml2ZSBsZXR0ZXJzIGFyZSBvbmx5IGFjY2VwdGVkIGluIE1TRE9TL1dpbmRvd3MuIik7CiAgICAgICByZXR1cm4gQ1VSTEVfVVJMX01BTEZPUk1BVDsKICAgICB9CkBAIC00NDcxLDcgKzQ1MzksNyBAQAogICBlbHNlIHsKICAgICAvKiBjbGVhciBwYXRoICovCiAgICAgY2hhciBzbGFzaGJ1Zls0XTsKLSAgICBwYXRoWzBdPTA7CisgICAgcGF0aFswXSA9IDA7CiAKICAgICByYyA9IHNzY2FuZihkYXRhLT5jaGFuZ2UudXJsLAogICAgICAgICAgICAgICAgICIlMTVbXlxuLzpdOiUzWy9dJVteXG4vPyNdJVteXG5dIiwKQEAgLTQ1NTYsNyArNDYyNCw3IEBACiAgICAqLwogICBhdCA9IHN0cmNocihjb25uLT5ob3N0Lm5hbWUsICdAJyk7CiAgIGlmKGF0KQotICAgIHF1ZXJ5ID0gc3RyY2hyKGF0KzEsICc/Jyk7CisgICAgcXVlcnkgPSBzdHJjaHIoYXQgKyAxLCAnPycpOwogICBlbHNlCiAgICAgcXVlcnkgPSBzdHJjaHIoY29ubi0+aG9zdC5uYW1lLCAnPycpOwogCkBAIC00NTc0LDE1ICs0NjQyLDE1IEBACiAKICAgICAvKiBtb3ZlIHRoZSBleGlzdGluZyBwYXRoIHBsdXMgdGhlIHplcm8gYnl0ZSBmb3J3YXJkLCB0byBtYWtlIHJvb20gZm9yCiAgICAgICAgdGhlIGhvc3QtbmFtZSBwYXJ0ICovCi0gICAgbWVtbW92ZShwYXRoK2hvc3RsZW4rMSwgcGF0aCwgcGF0aGxlbisxKTsKKyAgICBtZW1tb3ZlKHBhdGggKyBob3N0bGVuICsgMSwgcGF0aCwgcGF0aGxlbiArIDEpOwogCiAgICAgIC8qIG5vdyBjb3B5IHRoZSB0cmFpbGluZyBob3N0IHBhcnQgaW4gZnJvbnQgb2YgdGhlIGV4aXN0aW5nIHBhdGggKi8KLSAgICBtZW1jcHkocGF0aCsxLCBxdWVyeSwgaG9zdGxlbik7CisgICAgbWVtY3B5KHBhdGggKyAxLCBxdWVyeSwgaG9zdGxlbik7CiAKICAgICBwYXRoWzBdPScvJzsgLyogcHJlcGVuZCB0aGUgbWlzc2luZyBzbGFzaCAqLwogICAgIHJlYnVpbGRfdXJsID0gVFJVRTsKIAotICAgICpxdWVyeT0wOyAvKiBub3cgY3V0IG9mZiB0aGUgaG9zdG5hbWUgYXQgdGhlID8gKi8KKyAgICAqcXVlcnkgPSAwOyAvKiBub3cgY3V0IG9mZiB0aGUgaG9zdG5hbWUgYXQgdGhlID8gKi8KICAgfQogICBlbHNlIGlmKCFwYXRoWzBdKSB7CiAgICAgLyogaWYgdGhlcmUncyBubyBwYXRoIHNldCwgdXNlIGEgc2luZ2xlIHNsYXNoICovCkBAIC00NTk4LDcgKzQ2NjYsNyBAQAogICAgIC8qIFdlIG5lZWQgdGhpcyBmdW5jdGlvbiB0byBkZWFsIHdpdGggb3ZlcmxhcHBpbmcgbWVtb3J5IGFyZWFzLiBXZSBrbm93CiAgICAgICAgdGhhdCB0aGUgbWVtb3J5IGFyZWEgJ3BhdGgnIHBvaW50cyB0byBpcyAndXJsbGVuJyBieXRlcyBiaWcgYW5kIHRoYXQKICAgICAgICBpcyBiaWdnZXIgdGhhbiB0aGUgcGF0aC4gVXNlICsxIHRvIG1vdmUgdGhlIHplcm8gYnl0ZSB0b28uICovCi0gICAgbWVtbW92ZSgmcGF0aFsxXSwgcGF0aCwgc3RybGVuKHBhdGgpKzEpOworICAgIG1lbW1vdmUoJnBhdGhbMV0sIHBhdGgsIHN0cmxlbihwYXRoKSArIDEpOwogICAgIHBhdGhbMF0gPSAnLyc7CiAgICAgcmVidWlsZF91cmwgPSBUUlVFOwogICB9CkBAIC00NzA0LDcgKzQ3NzIsNyBAQAogICAgICAgaWYoKmVuZHAgPT0gJ10nKSB7CiAgICAgICAgIC8qIFRoZSBhZGRyZXNzIHNjb3BlIHdhcyB3ZWxsIGZvcm1lZC4gIEtub2NrIGl0IG91dCBvZiB0aGUKICAgICAgICAgICAgaG9zdG5hbWUuICovCi0gICAgICAgIG1lbW1vdmUocGVyY2VudCwgZW5kcCwgc3RybGVuKGVuZHApKzEpOworICAgICAgICBtZW1tb3ZlKHBlcmNlbnQsIGVuZHAsIHN0cmxlbihlbmRwKSArIDEpOwogICAgICAgICBjb25uLT5zY29wZV9pZCA9ICh1bnNpZ25lZCBpbnQpc2NvcGU7CiAgICAgICB9CiAgICAgICBlbHNlIHsKQEAgLTQ5NzQsNyArNTA0Miw3IEBACiAgIHN0cmNweShlbnZwLCAiX3Byb3h5Iik7CiAKICAgLyogcmVhZCB0aGUgcHJvdG9jb2wgcHJveHk6ICovCi0gIHByb3g9Y3VybF9nZXRlbnYocHJveHlfZW52KTsKKyAgcHJveCA9IGN1cmxfZ2V0ZW52KHByb3h5X2Vudik7CiAKICAgLyoKICAgICogV2UgZG9uJ3QgdHJ5IHRoZSB1cHBlcmNhc2UgdmVyc2lvbiBvZiBIVFRQX1BST1hZIGJlY2F1c2Ugb2YKQEAgLTQ5OTEsNyArNTA1OSw3IEBACiAgIGlmKCFwcm94ICYmICFzdHJjYXNlY29tcGFyZSgiaHR0cF9wcm94eSIsIHByb3h5X2VudikpIHsKICAgICAvKiBUaGVyZSB3YXMgbm8gbG93ZXJjYXNlIHZhcmlhYmxlLCB0cnkgdGhlIHVwcGVyY2FzZSB2ZXJzaW9uOiAqLwogICAgIEN1cmxfc3RybnRvdXBwZXIocHJveHlfZW52LCBwcm94eV9lbnYsIHNpemVvZihwcm94eV9lbnYpKTsKLSAgICBwcm94PWN1cmxfZ2V0ZW52KHByb3h5X2Vudik7CisgICAgcHJveCA9IGN1cmxfZ2V0ZW52KHByb3h5X2Vudik7CiAgIH0KIAogICBpZihwcm94KQpAQCAtNDk5OSw3ICs1MDY3LDcgQEAKICAgZWxzZSB7CiAgICAgcHJveHkgPSBjdXJsX2dldGVudigiYWxsX3Byb3h5Iik7IC8qIGRlZmF1bHQgcHJveHkgdG8gdXNlICovCiAgICAgaWYoIXByb3h5KQotICAgICAgcHJveHk9Y3VybF9nZXRlbnYoIkFMTF9QUk9YWSIpOworICAgICAgcHJveHkgPSBjdXJsX2dldGVudigiQUxMX1BST1hZIik7CiAgIH0KIAogICByZXR1cm4gcHJveHk7CkBAIC01MDM0LDcgKzUxMDIsNyBAQAogICAvKiBQYXJzZSB0aGUgcHJvdG9jb2wgcGFydCBpZiBwcmVzZW50ICovCiAgIGVuZG9mcHJvdCA9IHN0cnN0cihwcm94eSwgIjovLyIpOwogICBpZihlbmRvZnByb3QpIHsKLSAgICBwcm94eXB0ciA9IGVuZG9mcHJvdCszOworICAgIHByb3h5cHRyID0gZW5kb2Zwcm90ICsgMzsKICAgICBpZihjaGVja3ByZWZpeCgiaHR0cHMiLCBwcm94eSkpCiAgICAgICBwcm94eXR5cGUgPSBDVVJMUFJPWFlfSFRUUFM7CiAgICAgZWxzZSBpZihjaGVja3ByZWZpeCgic29ja3M1aCIsIHByb3h5KSkKQEAgLTUwNTYsMTMgKzUxMjQsMTQgQEAKICAgZWxzZQogICAgIHByb3h5cHRyID0gcHJveHk7IC8qIE5vIHh4eDovLyBoZWFkOiBJdCdzIGEgSFRUUCBwcm94eSAqLwogCi0jaWZuZGVmIEhUVFBTX1BST1hZX1NVUFBPUlQKLSAgaWYocHJveHl0eXBlID09IENVUkxQUk9YWV9IVFRQUykgewotICAgIGZhaWxmKGRhdGEsICJVbnN1cHBvcnRlZCBwcm94eSBcJyVzXCciCi0gICAgICAgICAgICAgICAgIiwgbGliY3VybCBpcyBidWlsdCB3aXRob3V0IHRoZSBIVFRQUy1wcm94eSBzdXBwb3J0LiIsIHByb3h5KTsKLSAgICByZXR1cm4gQ1VSTEVfTk9UX0JVSUxUX0lOOwotICB9CisjaWZkZWYgVVNFX1NTTAorICBpZighQ3VybF9zc2wtPnN1cHBvcnRfaHR0cHNfcHJveHkpCiAjZW5kaWYKKyAgICBpZihwcm94eXR5cGUgPT0gQ1VSTFBST1hZX0hUVFBTKSB7CisgICAgICBmYWlsZihkYXRhLCAiVW5zdXBwb3J0ZWQgcHJveHkgXCclc1wnLCBsaWJjdXJsIGlzIGJ1aWx0IHdpdGhvdXQgdGhlICIKKyAgICAgICAgICAgICAgICAgICJIVFRQUy1wcm94eSBzdXBwb3J0LiIsIHByb3h5KTsKKyAgICAgIHJldHVybiBDVVJMRV9OT1RfQlVJTFRfSU47CisgICAgfQogCiAgIHNvY2tzdHlwZSA9IHByb3h5dHlwZSA9PSBDVVJMUFJPWFlfU09DS1M1X0hPU1ROQU1FIHx8CiAgICAgICAgICAgICAgIHByb3h5dHlwZSA9PSBDVVJMUFJPWFlfU09DS1M1IHx8CkBAIC01MTMzLDExICs1MjAyLDE0IEBACiAgICAgICBjb25uLT5wb3J0ID0gcG9ydDsKICAgfQogICBlbHNlIHsKLSAgICBpZihwcm94eXB0clswXT09Jy8nKQorICAgIGlmKHByb3h5cHRyWzBdPT0nLycpIHsKICAgICAgIC8qIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHByb3h5IHN0cmluZyBpcyBhIHNsYXNoLCBmYWlsCiAgICAgICAgICBpbW1lZGlhdGVseS4gVGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgb3RoZXJ3aXNlIGNsZWFyIHRoZSBzdHJpbmcgd2hpY2gKICAgICAgICAgIHdpbGwgbGVhZCB0byBjb2RlIHJ1bm5pbmcgYXMgaWYgbm8gcHJveHkgd2FzIHNldCEgKi8KKyAgICAgIEN1cmxfc2FmZWZyZWUocHJveHl1c2VyKTsKKyAgICAgIEN1cmxfc2FmZWZyZWUocHJveHlwYXNzd2QpOwogICAgICAgcmV0dXJuIENVUkxFX0NPVUxETlRfUkVTT0xWRV9QUk9YWTsKKyAgICB9CiAKICAgICAvKiB3aXRob3V0IGEgcG9ydCBudW1iZXIgYWZ0ZXIgdGhlIGhvc3QgbmFtZSwgc29tZSBwZW9wbGUgc2VlbSB0byB1c2UKICAgICAgICBhIHNsYXNoIHNvIHdlIHN0cmlwIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgZmlyc3Qgc2xhc2ggKi8KQEAgLTUyODAsMjIgKzUzNTIsMjEgQEAKICAgICB9CiAgIH0KIAotICBub19wcm94eSA9IGN1cmxfZ2V0ZW52KCJub19wcm94eSIpOwotICBpZighbm9fcHJveHkpCi0gICAgbm9fcHJveHkgPSBjdXJsX2dldGVudigiTk9fUFJPWFkiKTsKKyAgaWYoIWRhdGEtPnNldC5zdHJbU1RSSU5HX05PUFJPWFldKSB7CisgICAgbm9fcHJveHkgPSBjdXJsX2dldGVudigibm9fcHJveHkiKTsKKyAgICBpZighbm9fcHJveHkpCisgICAgICBub19wcm94eSA9IGN1cmxfZ2V0ZW52KCJOT19QUk9YWSIpOworICB9CiAKLSAgaWYoY2hlY2tfbm9wcm94eShjb25uLT5ob3N0Lm5hbWUsIGRhdGEtPnNldC5zdHJbU1RSSU5HX05PUFJPWFldKSB8fAotICAgICAoIWRhdGEtPnNldC5zdHJbU1RSSU5HX05PUFJPWFldICYmCi0gICAgICBjaGVja19ub3Byb3h5KGNvbm4tPmhvc3QubmFtZSwgbm9fcHJveHkpKSkgeworICBpZihjaGVja19ub3Byb3h5KGNvbm4tPmhvc3QubmFtZSwgZGF0YS0+c2V0LnN0cltTVFJJTkdfTk9QUk9YWV0gPworICAgICAgZGF0YS0+c2V0LnN0cltTVFJJTkdfTk9QUk9YWV0gOiBub19wcm94eSkpIHsKICAgICBDdXJsX3NhZmVmcmVlKHByb3h5KTsKICAgICBDdXJsX3NhZmVmcmVlKHNvY2tzcHJveHkpOwogICB9Ci0gIGVsc2UgaWYoIXByb3h5ICYmICFzb2Nrc3Byb3h5KQogI2lmbmRlZiBDVVJMX0RJU0FCTEVfSFRUUAorICBlbHNlIGlmKCFwcm94eSAmJiAhc29ja3Nwcm94eSkKICAgICAvKiBpZiB0aGUgaG9zdCBpcyBub3QgaW4gdGhlIG5vcHJveHkgbGlzdCwgZGV0ZWN0IHByb3h5LiAqLwogICAgIHByb3h5ID0gZGV0ZWN0X3Byb3h5KGNvbm4pOwotI2Vsc2UgIC8qICFDVVJMX0RJU0FCTEVfSFRUUCAqLwotICAgIHByb3h5ID0gTlVMTDsKICNlbmRpZiAvKiBDVVJMX0RJU0FCTEVfSFRUUCAqLwogCiAgIEN1cmxfc2FmZWZyZWUobm9fcHJveHkpOwpAQCAtNTM0OCwxMiArNTQxOSwxNSBAQAogICAgICAgcmVzdWx0ID0gQ1VSTEVfVU5TVVBQT1JURURfUFJPVE9DT0w7CiAgICAgICBnb3RvIG91dDsKICNlbHNlCi0gICAgICAvKiBmb3JjZSB0aGlzIGNvbm5lY3Rpb24ncyBwcm90b2NvbCB0byBiZWNvbWUgSFRUUCBpZiBub3QgYWxyZWFkeQotICAgICAgICAgY29tcGF0aWJsZSAtIGlmIGl0IGlzbid0IHR1bm5lbGluZyB0aHJvdWdoICovCi0gICAgICBpZighKGNvbm4tPmhhbmRsZXItPnByb3RvY29sICYgUFJPVE9fRkFNSUxZX0hUVFApICYmCi0gICAgICAgICAhY29ubi0+Yml0cy50dW5uZWxfcHJveHkpCi0gICAgICAgIGNvbm4tPmhhbmRsZXIgPSAmQ3VybF9oYW5kbGVyX2h0dHA7Ci0KKyAgICAgIC8qIGZvcmNlIHRoaXMgY29ubmVjdGlvbidzIHByb3RvY29sIHRvIGJlY29tZSBIVFRQIGlmIGNvbXBhdGlibGUgKi8KKyAgICAgIGlmKCEoY29ubi0+aGFuZGxlci0+cHJvdG9jb2wgJiBQUk9UT19GQU1JTFlfSFRUUCkpIHsKKyAgICAgICAgaWYoKGNvbm4tPmhhbmRsZXItPmZsYWdzICYgUFJPVE9QVF9QUk9YWV9BU19IVFRQKSAmJgorICAgICAgICAgICAhY29ubi0+Yml0cy50dW5uZWxfcHJveHkpCisgICAgICAgICAgY29ubi0+aGFuZGxlciA9ICZDdXJsX2hhbmRsZXJfaHR0cDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIC8qIGlmIG5vdCBjb252ZXJ0aW5nIHRvIEhUVFAgb3ZlciB0aGUgcHJveHksIGVuZm9yY2UgdHVubmVsaW5nICovCisgICAgICAgICAgY29ubi0+Yml0cy50dW5uZWxfcHJveHkgPSBUUlVFOworICAgICAgfQogICAgICAgY29ubi0+Yml0cy5odHRwcHJveHkgPSBUUlVFOwogI2VuZGlmCiAgICAgfQpAQCAtNTc0MCw3ICs1ODE0LDcgQEAKICAgICBjaGFyICpyZXN0OwogICAgIGxvbmcgcG9ydDsKIAotICAgIHBvcnQ9c3RydG9sKHBvcnRwdHIrMSwgJnJlc3QsIDEwKTsgIC8qIFBvcnQgbnVtYmVyIG11c3QgYmUgZGVjaW1hbCAqLworICAgIHBvcnQgPSBzdHJ0b2wocG9ydHB0ciArIDEsICZyZXN0LCAxMCk7ICAvKiBQb3J0IG51bWJlciBtdXN0IGJlIGRlY2ltYWwgKi8KIAogICAgIGlmKChwb3J0IDwgMCkgfHwgKHBvcnQgPiAweGZmZmYpKSB7CiAgICAgICAvKiBTaW5nbGUgdW5peCBzdGFuZGFyZCBzYXlzIHBvcnQgbnVtYmVycyBhcmUgMTYgYml0cyBsb25nICovCkBAIC02MDk2LDcgKzYxNzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICphc3luYykKIHsKLSAgQ1VSTGNvZGUgcmVzdWx0PUNVUkxFX09LOworICBDVVJMY29kZSByZXN1bHQgPSBDVVJMRV9PSzsKICAgdGltZV90IHRpbWVvdXRfbXMgPSBDdXJsX3RpbWVsZWZ0KGRhdGEsIE5VTEwsIFRSVUUpOwogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02MjU5LDExICs2MzMzLDEwIEBACiAgIGZyZWVfZml4ZWRfaG9zdG5hbWUoJmNvbm4tPmNvbm5fdG9faG9zdCk7CiAgIEN1cmxfc2FmZWZyZWUoY29ubi0+aG9zdC5yYXdhbGxvYyk7CiAgIEN1cmxfc2FmZWZyZWUoY29ubi0+Y29ubl90b19ob3N0LnJhd2FsbG9jKTsKLSAgY29ubi0+aG9zdD1vbGRfY29ubi0+aG9zdDsKLSAgY29ubi0+Yml0cy5jb25uX3RvX2hvc3QgPSBvbGRfY29ubi0+Yml0cy5jb25uX3RvX2hvc3Q7CisgIGNvbm4tPmhvc3QgPSBvbGRfY29ubi0+aG9zdDsKICAgY29ubi0+Y29ubl90b19ob3N0ID0gb2xkX2Nvbm4tPmNvbm5fdG9faG9zdDsKLSAgY29ubi0+Yml0cy5jb25uX3RvX3BvcnQgPSBvbGRfY29ubi0+Yml0cy5jb25uX3RvX3BvcnQ7CiAgIGNvbm4tPmNvbm5fdG9fcG9ydCA9IG9sZF9jb25uLT5jb25uX3RvX3BvcnQ7CisgIGNvbm4tPnJlbW90ZV9wb3J0ID0gb2xkX2Nvbm4tPnJlbW90ZV9wb3J0OwogCiAgIC8qIHBlcnNpc3QgY29ubmVjdGlvbiBpbmZvIGluIHNlc3Npb24gaGFuZGxlICovCiAgIEN1cmxfcGVyc2lzdGNvbm5pbmZvKGNvbm4pOwpAQCAtNjM2Miw5ICs2NDM1LDkgQEAKICAgICogb3RoZXIgcGFydHMgb2YgdGhlIGNvZGUgd2lsbCByZWx5IG9uIHRoaXMgZmFjdAogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIExFQVNUX1BBVEhfQUxMT0MgMjU2Ci0gIHVybGxlbj1zdHJsZW4oZGF0YS0+Y2hhbmdlLnVybCk7CisgIHVybGxlbiA9IHN0cmxlbihkYXRhLT5jaGFuZ2UudXJsKTsKICAgaWYodXJsbGVuIDwgTEVBU1RfUEFUSF9BTExPQykKLSAgICB1cmxsZW49TEVBU1RfUEFUSF9BTExPQzsKKyAgICB1cmxsZW4gPSBMRUFTVF9QQVRIX0FMTE9DOwogCiAgIC8qCiAgICAqIFdlIG1hbGxvYygpIHRoZSBidWZmZXJzIGJlbG93IHVybGxlbisyIHRvIG1ha2Ugcm9vbSBmb3IgMiBwb3NzaWJpbGl0aWVzOgpAQCAtNjM3NSwxNCArNjQ0OCwxNCBAQAogICBDdXJsX3NhZmVmcmVlKGRhdGEtPnN0YXRlLnBhdGhidWZmZXIpOwogICBkYXRhLT5zdGF0ZS5wYXRoID0gTlVMTDsKIAotICBkYXRhLT5zdGF0ZS5wYXRoYnVmZmVyID0gbWFsbG9jKHVybGxlbisyKTsKKyAgZGF0YS0+c3RhdGUucGF0aGJ1ZmZlciA9IG1hbGxvYyh1cmxsZW4gKyAyKTsKICAgaWYoTlVMTCA9PSBkYXRhLT5zdGF0ZS5wYXRoYnVmZmVyKSB7CiAgICAgcmVzdWx0ID0gQ1VSTEVfT1VUX09GX01FTU9SWTsgLyogcmVhbGx5IGJhZCBlcnJvciAqLwogICAgIGdvdG8gb3V0OwogICB9CiAgIGRhdGEtPnN0YXRlLnBhdGggPSBkYXRhLT5zdGF0ZS5wYXRoYnVmZmVyOwogCi0gIGNvbm4tPmhvc3QucmF3YWxsb2MgPSBtYWxsb2ModXJsbGVuKzIpOworICBjb25uLT5ob3N0LnJhd2FsbG9jID0gbWFsbG9jKHVybGxlbiArIDIpOwogICBpZihOVUxMID09IGNvbm4tPmhvc3QucmF3YWxsb2MpIHsKICAgICBDdXJsX3NhZmVmcmVlKGRhdGEtPnN0YXRlLnBhdGhidWZmZXIpOwogICAgIGRhdGEtPnN0YXRlLnBhdGggPSBOVUxMOwpAQCAtNzAxNSw3ICs3MDg4LDcgQEAKIAogICBrLT5idWYgPSBkYXRhLT5zdGF0ZS5idWZmZXI7CiAgIGstPmhidWZwID0gZGF0YS0+c3RhdGUuaGVhZGVyYnVmZjsKLSAgay0+aWdub3JlYm9keT1GQUxTRTsKKyAgay0+aWdub3JlYm9keSA9IEZBTFNFOwogCiAgIEN1cmxfc3BlZWRpbml0KGRhdGEpOwogCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi91cmxkYXRhLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi91cmxkYXRhLmgKaW5kZXggZDRhNGE5OC4uNjZlNDU5NiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdXJsZGF0YS5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3VybGRhdGEuaApAQCAtODIsNzUgKzgyLDYgQEAKICNpbmNsdWRlICJjb29raWUuaCIKICNpbmNsdWRlICJmb3JtZGF0YS5oIgogCi0jaWZkZWYgVVNFX09QRU5TU0wKLSNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgotI2lmZGVmIEhBVkVfT1BFTlNTTF9FTkdJTkVfSAotI2luY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+Ci0jZW5kaWYKLSNlbmRpZiAvKiBVU0VfT1BFTlNTTCAqLwotCi0jaWZkZWYgVVNFX0dOVVRMUwotI2luY2x1ZGUgPGdudXRscy9nbnV0bHMuaD4KLSNlbmRpZgotCi0jaWZkZWYgVVNFX01CRURUTFMKLQotI2luY2x1ZGUgPG1iZWR0bHMvc3NsLmg+Ci0jaW5jbHVkZSA8bWJlZHRscy92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8bWJlZHRscy9lbnRyb3B5Lmg+Ci0jaW5jbHVkZSA8bWJlZHRscy9jdHJfZHJiZy5oPgotCi0jZWxpZiBkZWZpbmVkIFVTRV9QT0xBUlNTTAotCi0jaW5jbHVkZSA8cG9sYXJzc2wvc3NsLmg+Ci0jaW5jbHVkZSA8cG9sYXJzc2wvdmVyc2lvbi5oPgotI2lmIFBPTEFSU1NMX1ZFUlNJT05fTlVNQkVSPDB4MDEwMTAwMDAKLSNpbmNsdWRlIDxwb2xhcnNzbC9oYXZlZ2UuaD4KLSNlbHNlCi0jaW5jbHVkZSA8cG9sYXJzc2wvZW50cm9weS5oPgotI2luY2x1ZGUgPHBvbGFyc3NsL2N0cl9kcmJnLmg+Ci0jZW5kaWYgLyogUE9MQVJTU0xfVkVSU0lPTl9OVU1CRVI8MHgwMTAxMDAwMCAqLwotCi0jZW5kaWYgLyogVVNFX1BPTEFSU1NMICovCi0KLSNpZmRlZiBVU0VfQ1lBU1NMCi0jdW5kZWYgT0NTUF9SRVFVRVNUICAvKiBhdm9pZCBjeWFzc2wvb3BlbnNzbC9zc2wuaCBjbGFzaCB3aXRoIHdpbmNyeXB0LmggKi8KLSN1bmRlZiBPQ1NQX1JFU1BPTlNFIC8qIGF2b2lkIGN5YXNzbC9vcGVuc3NsL3NzbC5oIGNsYXNoIHdpdGggd2luY3J5cHQuaCAqLwotI2luY2x1ZGUgPGN5YXNzbC9vcGVuc3NsL3NzbC5oPgotI2VuZGlmCi0KLSNpZmRlZiBVU0VfTlNTCi0jaW5jbHVkZSA8bnNwci5oPgotI2luY2x1ZGUgPHBrMTFwdWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgVVNFX0dTS0lUCi0jaW5jbHVkZSA8Z3Nrc3NsLmg+Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9BWFRMUwotI2luY2x1ZGUgPGF4VExTL2NvbmZpZy5oPgotI2luY2x1ZGUgPGF4VExTL3NzbC5oPgotI3VuZGVmIG1hbGxvYwotI3VuZGVmIGNhbGxvYwotI3VuZGVmIHJlYWxsb2MKLSNlbmRpZiAvKiBVU0VfQVhUTFMgKi8KLQotI2lmIGRlZmluZWQoVVNFX1NDSEFOTkVMKSB8fCBkZWZpbmVkKFVTRV9XSU5ET1dTX1NTUEkpCi0jaW5jbHVkZSAiY3VybF9zc3BpLmgiCi0jZW5kaWYKLSNpZmRlZiBVU0VfU0NIQU5ORUwKLSNpbmNsdWRlIDxzY2hubHNwLmg+Ci0jaW5jbHVkZSA8c2NoYW5uZWwuaD4KLSNlbmRpZgotCi0jaWZkZWYgVVNFX0RBUldJTlNTTAotI2luY2x1ZGUgPFNlY3VyaXR5L1NlY3VyaXR5Lmg+Ci0vKiBGb3Igc29tZSByZWFzb24sIHdoZW4gYnVpbGRpbmcgZm9yIGlPUywgdGhlIG9tbmlidXMgaGVhZGVyIGFib3ZlIGRvZXMKLSAqIG5vdCBpbmNsdWRlIFNlY3VyZVRyYW5zcG9ydC5oIGFzIG9mIGlPUyBTREsgNS4xLiAqLwotI2luY2x1ZGUgPFNlY3VyaXR5L1NlY3VyZVRyYW5zcG9ydC5oPgotI2VuZGlmCi0KICNpZmRlZiBIQVZFX05FVElORVRfSU5fSAogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KICNlbmRpZgpAQCAtMTcyLDYgKzEwMyw3IEBACiAjaW5jbHVkZSAiaGFzaC5oIgogI2luY2x1ZGUgInNwbGF5LmgiCiAKKyNpbmNsdWRlICJtaW1lLmgiCiAjaW5jbHVkZSAiaW1hcC5oIgogI2luY2x1ZGUgInBvcDMuaCIKICNpbmNsdWRlICJzbXRwLmgiCkBAIC0yNDAsMjAgKzE3Miw2IEBACiB9OwogI2VuZGlmCiAKLSNpZmRlZiBVU0VfU0NIQU5ORUwKLS8qIFN0cnVjdHMgdG8gc3RvcmUgU2NoYW5uZWwgaGFuZGxlcyAqLwotc3RydWN0IGN1cmxfc2NoYW5uZWxfY3JlZCB7Ci0gIENyZWRIYW5kbGUgY3JlZF9oYW5kbGU7Ci0gIFRpbWVTdGFtcCB0aW1lX3N0YW1wOwotICBpbnQgcmVmY291bnQ7Ci19OwotCi1zdHJ1Y3QgY3VybF9zY2hhbm5lbF9jdHh0IHsKLSAgQ3R4dEhhbmRsZSBjdHh0X2hhbmRsZTsKLSAgVGltZVN0YW1wIHRpbWVfc3RhbXA7Ci19OwotI2VuZGlmCi0KIC8qIGVudW0gZm9yIHRoZSBub25ibG9ja2luZyBTU0wgY29ubmVjdGlvbiBzdGF0ZSBtYWNoaW5lICovCiB0eXBlZGVmIGVudW0gewogICBzc2xfY29ubmVjdF8xLApAQCAtMjcwLDYgKzE4OCw5IEBACiAgIHNzbF9jb25uZWN0aW9uX2NvbXBsZXRlCiB9IHNzbF9jb25uZWN0aW9uX3N0YXRlOwogCisvKiBTU0wgYmFja2VuZC1zcGVjaWZpYyBkYXRhOyBkZWNsYXJlZCBkaWZmZXJlbnRseSBieSBlYWNoIFNTTCBiYWNrZW5kICovCitzdHJ1Y3Qgc3NsX2JhY2tlbmRfZGF0YTsKKwogLyogc3RydWN0IGZvciBkYXRhIHJlbGF0ZWQgdG8gZWFjaCBTU0wgY29ubmVjdGlvbiAqLwogc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgewogICAvKiBVc2Ugc3NsIGVuY3J5cHRlZCBjb21tdW5pY2F0aW9ucyBUUlVFL0ZBTFNFLCBub3QgbmVjZXNzYXJpbHkgdXNpbmcgaXQgYXRtCkBAIC0yNzgsNzggKzE5OSw4IEBACiAgIGJvb2wgdXNlOwogICBzc2xfY29ubmVjdGlvbl9zdGF0ZSBzdGF0ZTsKICAgc3NsX2Nvbm5lY3Rfc3RhdGUgY29ubmVjdGluZ19zdGF0ZTsKLSNpZiBkZWZpbmVkKFVTRV9PUEVOU1NMKQotICAvKiB0aGVzZSBvbmVzIHJlcXVpcmVzIHNwZWNpZmljIFNTTC10eXBlcyAqLwotICBTU0xfQ1RYKiBjdHg7Ci0gIFNTTCogICAgIGhhbmRsZTsKLSAgWDUwOSogICAgc2VydmVyX2NlcnQ7Ci0jZWxpZiBkZWZpbmVkKFVTRV9HTlVUTFMpCi0gIGdudXRsc19zZXNzaW9uX3Qgc2Vzc2lvbjsKLSAgZ251dGxzX2NlcnRpZmljYXRlX2NyZWRlbnRpYWxzX3QgY3JlZDsKLSNpZmRlZiBVU0VfVExTX1NSUAotICBnbnV0bHNfc3JwX2NsaWVudF9jcmVkZW50aWFsc190IHNycF9jbGllbnRfY3JlZDsKLSNlbmRpZgotI2VsaWYgZGVmaW5lZChVU0VfTUJFRFRMUykKLSAgbWJlZHRsc19jdHJfZHJiZ19jb250ZXh0IGN0cl9kcmJnOwotICBtYmVkdGxzX2VudHJvcHlfY29udGV4dCBlbnRyb3B5OwotICBtYmVkdGxzX3NzbF9jb250ZXh0IHNzbDsKLSAgaW50IHNlcnZlcl9mZDsKLSAgbWJlZHRsc194NTA5X2NydCBjYWNlcnQ7Ci0gIG1iZWR0bHNfeDUwOV9jcnQgY2xpY2VydDsKLSAgbWJlZHRsc194NTA5X2NybCBjcmw7Ci0gIG1iZWR0bHNfcGtfY29udGV4dCBwazsKLSAgbWJlZHRsc19zc2xfY29uZmlnIGNvbmZpZzsKLSAgY29uc3QgY2hhciAqcHJvdG9jb2xzWzNdOwotI2VsaWYgZGVmaW5lZChVU0VfUE9MQVJTU0wpCi0gIGN0cl9kcmJnX2NvbnRleHQgY3RyX2RyYmc7Ci0gIGVudHJvcHlfY29udGV4dCBlbnRyb3B5OwotICBzc2xfY29udGV4dCBzc2w7Ci0gIGludCBzZXJ2ZXJfZmQ7Ci0gIHg1MDlfY3J0IGNhY2VydDsKLSAgeDUwOV9jcnQgY2xpY2VydDsKLSAgeDUwOV9jcmwgY3JsOwotICByc2FfY29udGV4dCByc2E7Ci0jZWxpZiBkZWZpbmVkKFVTRV9DWUFTU0wpCi0gIFNTTF9DVFgqIGN0eDsKLSAgU1NMKiAgICAgaGFuZGxlOwotI2VsaWYgZGVmaW5lZChVU0VfTlNTKQotICBQUkZpbGVEZXNjICpoYW5kbGU7Ci0gIGNoYXIgKmNsaWVudF9uaWNrbmFtZTsKLSAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YTsKLSAgc3RydWN0IGN1cmxfbGxpc3Qgb2JqX2xpc3Q7Ci0gIFBLMTFHZW5lcmljT2JqZWN0ICpvYmpfY2xpY2VydDsKLSNlbGlmIGRlZmluZWQoVVNFX0dTS0lUKQotICBnc2tfaGFuZGxlIGhhbmRsZTsKLSAgaW50IGlvY3BvcnQ7Ci0gIGludCBsb2NhbGZkOwotICBpbnQgcmVtb3RlZmQ7Ci0jZWxpZiBkZWZpbmVkKFVTRV9BWFRMUykKLSAgU1NMX0NUWCogc3NsX2N0eDsKLSAgU1NMKiAgICAgc3NsOwotI2VsaWYgZGVmaW5lZChVU0VfU0NIQU5ORUwpCi0gIHN0cnVjdCBjdXJsX3NjaGFubmVsX2NyZWQgKmNyZWQ7Ci0gIHN0cnVjdCBjdXJsX3NjaGFubmVsX2N0eHQgKmN0eHQ7Ci0gIFNlY1BrZ0NvbnRleHRfU3RyZWFtU2l6ZXMgc3RyZWFtX3NpemVzOwotICBzaXplX3QgZW5jZGF0YV9sZW5ndGgsIGRlY2RhdGFfbGVuZ3RoOwotICBzaXplX3QgZW5jZGF0YV9vZmZzZXQsIGRlY2RhdGFfb2Zmc2V0OwotICB1bnNpZ25lZCBjaGFyICplbmNkYXRhX2J1ZmZlciwgKmRlY2RhdGFfYnVmZmVyOwotICAvKiBlbmNkYXRhX2lzX2luY29tcGxldGU6IGlmIGVuY2RhdGEgY29udGFpbnMgb25seSBhIHBhcnRpYWwgcmVjb3JkIHRoYXQKLSAgICAgY2FuJ3QgYmUgZGVjcnlwdGVkIHdpdGhvdXQgYW5vdGhlciBDdXJsX3JlYWRfcGxhaW4gKHRoYXQgaXMsIHN0YXR1cyBpcwotICAgICBTRUNfRV9JTkNPTVBMRVRFX01FU1NBR0UpIHRoZW4gc2V0IHRoaXMgdHJ1ZS4gYWZ0ZXIgQ3VybF9yZWFkX3BsYWluIHdyaXRlcwotICAgICBtb3JlIGJ5dGVzIGludG8gZW5jZGF0YSB0aGVuIHNldCB0aGlzIGJhY2sgdG8gZmFsc2UuICovCi0gIGJvb2wgZW5jZGF0YV9pc19pbmNvbXBsZXRlOwotICB1bnNpZ25lZCBsb25nIHJlcV9mbGFncywgcmV0X2ZsYWdzOwotICBDVVJMY29kZSByZWN2X3VucmVjb3ZlcmFibGVfZXJyOyAvKiBzY2hhbm5lbF9yZWN2IGhhZCBhbiB1bnJlY292ZXJhYmxlIGVyciAqLwotICBib29sIHJlY3Zfc3NwaV9jbG9zZV9ub3RpZnk7IC8qIHRydWUgaWYgY29ubmVjdGlvbiBjbG9zZWQgYnkgY2xvc2Vfbm90aWZ5ICovCi0gIGJvb2wgcmVjdl9jb25uZWN0aW9uX2Nsb3NlZDsgLyogdHJ1ZSBpZiBjb25uZWN0aW9uIGNsb3NlZCwgcmVnYXJkbGVzcyBob3cgKi8KLSAgYm9vbCB1c2VfYWxwbjsgLyogdHJ1ZSBpZiBBTFBOIGlzIHVzZWQgZm9yIHRoaXMgY29ubmVjdGlvbiAqLwotI2VsaWYgZGVmaW5lZChVU0VfREFSV0lOU1NMKQotICBTU0xDb250ZXh0UmVmIHNzbF9jdHg7Ci0gIGN1cmxfc29ja2V0X3Qgc3NsX3NvY2tmZDsKLSAgYm9vbCBzc2xfZGlyZWN0aW9uOyAvKiB0cnVlIGlmIHdyaXRpbmcsIGZhbHNlIGlmIHJlYWRpbmcgKi8KLSAgc2l6ZV90IHNzbF93cml0ZV9idWZmZXJlZF9sZW5ndGg7Ci0jZWxpZiBkZWZpbmVkKFVTRV9TU0wpCi0jZXJyb3IgIlNTTCBiYWNrZW5kIHNwZWNpZmljIGluZm9ybWF0aW9uIG1pc3NpbmcgZnJvbSBzc2xfY29ubmVjdF9kYXRhIgorI2lmIGRlZmluZWQoVVNFX1NTTCkKKyAgc3RydWN0IHNzbF9iYWNrZW5kX2RhdGEgKmJhY2tlbmQ7CiAjZW5kaWYKIH07CiAKQEAgLTM1OSwxMyArMjEwLDEzIEBACiAgIGJvb2wgdmVyaWZ5cGVlcjsgICAgICAgLyogc2V0IFRSVUUgaWYgdGhpcyBpcyBkZXNpcmVkICovCiAgIGJvb2wgdmVyaWZ5aG9zdDsgICAgICAgLyogc2V0IFRSVUUgaWYgQ04vU0FOIG11c3QgbWF0Y2ggaG9zdG5hbWUgKi8KICAgYm9vbCB2ZXJpZnlzdGF0dXM7ICAgICAvKiBzZXQgVFJVRSBpZiBjZXJ0aWZpY2F0ZSBzdGF0dXMgbXVzdCBiZSBjaGVja2VkICovCisgIGJvb2wgc2Vzc2lvbmlkOyAgICAgICAgLyogY2FjaGUgc2Vzc2lvbiBJRHMgb3Igbm90ICovCiAgIGNoYXIgKkNBcGF0aDsgICAgICAgICAgLyogY2VydGlmaWNhdGUgZGlyIChkb2Vzbid0IHdvcmsgb24gd2luZG93cykgKi8KICAgY2hhciAqQ0FmaWxlOyAgICAgICAgICAvKiBjZXJ0aWZpY2F0ZSB0byB2ZXJpZnkgcGVlciBhZ2FpbnN0ICovCiAgIGNoYXIgKmNsaWVudGNlcnQ7CiAgIGNoYXIgKnJhbmRvbV9maWxlOyAgICAgLyogcGF0aCB0byBmaWxlIGNvbnRhaW5pbmcgInJhbmRvbSIgZGF0YSAqLwogICBjaGFyICplZ2Rzb2NrZXQ7ICAgICAgIC8qIHBhdGggdG8gZmlsZSBjb250YWluaW5nIHRoZSBFR0QgZGFlbW9uIHNvY2tldCAqLwogICBjaGFyICpjaXBoZXJfbGlzdDsgICAgIC8qIGxpc3Qgb2YgY2lwaGVycyB0byB1c2UgKi8KLSAgYm9vbCBzZXNzaW9uaWQ7ICAgICAgICAvKiBjYWNoZSBzZXNzaW9uIElEcyBvciBub3QgKi8KIH07CiAKIHN0cnVjdCBzc2xfY29uZmlnX2RhdGEgewpAQCAtNDExLDEyICsyNjIsMjAgQEAKICAgc3RydWN0IHNzbF9wcmltYXJ5X2NvbmZpZyBzc2xfY29uZmlnOyAvKiBzZXR1cCBmb3IgdGhpcyBzZXNzaW9uICovCiB9OwogCisjaWZkZWYgVVNFX1dJTkRPV1NfU1NQSQorI2luY2x1ZGUgImN1cmxfc3NwaS5oIgorI2VuZGlmCisKIC8qIFN0cnVjdCB1c2VkIGZvciBEaWdlc3QgY2hhbGxlbmdlLXJlc3BvbnNlIGF1dGhlbnRpY2F0aW9uICovCiBzdHJ1Y3QgZGlnZXN0ZGF0YSB7CiAjaWYgZGVmaW5lZChVU0VfV0lORE9XU19TU1BJKQogICBCWVRFICppbnB1dF90b2tlbjsKICAgc2l6ZV90IGlucHV0X3Rva2VuX2xlbjsKICAgQ3R4dEhhbmRsZSAqaHR0cF9jb250ZXh0OworICAvKiBjb3B5IG9mIHVzZXIvcGFzc3dkIHVzZWQgdG8gbWFrZSB0aGUgaWRlbnRpdHkgZm9yIGh0dHBfY29udGV4dC4KKyAgICAgZWl0aGVyIG1heSBiZSBOVUxMLiAqLworICBjaGFyICp1c2VyOworICBjaGFyICpwYXNzd2Q7CiAjZWxzZQogICBjaGFyICpub25jZTsKICAgY2hhciAqY25vbmNlOwpAQCAtNDM4LDEwICsyOTcsNiBAQAogICBOVExNU1RBVEVfTEFTVAogfSBjdXJsbnRsbTsKIAotI2lmZGVmIFVTRV9XSU5ET1dTX1NTUEkKLSNpbmNsdWRlICJjdXJsX3NzcGkuaCIKLSNlbmRpZgotCiAjaWYgZGVmaW5lZChDVVJMX0RPRVNfQ09OVkVSU0lPTlMpICYmIGRlZmluZWQoSEFWRV9JQ09OVikKICNpbmNsdWRlIDxpY29udi5oPgogI2VuZGlmCkBAIC02NzgsOCArNTMzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwIHJlcGx5ICh3aXRob3V0IGEgZm9sbG93aW5nIHNlY29uZCByZXNwb25zZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlKSByZXN1bHQgaW4gYSBDVVJMRV9HT1RfTk9USElORyBlcnJvciBjb2RlICovCiAKLSAgc3RydWN0IHRpbWV2YWwgc3RhcnQ7ICAgICAgICAgLyogdHJhbnNmZXIgc3RhcnRlZCBhdCB0aGlzIHRpbWUgKi8KLSAgc3RydWN0IHRpbWV2YWwgbm93OyAgICAgICAgICAgLyogY3VycmVudCB0aW1lICovCisgIHN0cnVjdCBjdXJsdGltZSBzdGFydDsgICAgICAgICAvKiB0cmFuc2ZlciBzdGFydGVkIGF0IHRoaXMgdGltZSAqLworICBzdHJ1Y3QgY3VybHRpbWUgbm93OyAgICAgICAgICAgLyogY3VycmVudCB0aW1lICovCiAgIGJvb2wgaGVhZGVyOyAgICAgICAgICAgICAgICAgIC8qIGluY29taW5nIGRhdGEgaGFzIEhUVFAgaGVhZGVyICovCiAgIGVudW0gewogICAgIEhFQURFUl9OT1JNQUwsICAgICAgICAgICAgICAvKiBubyBiYWQgaGVhZGVyIGF0IGFsbCAqLwpAQCAtNzAxLDcgKzU1Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQtUmFuZ2U6IGhlYWRlciAqLwogICBpbnQgaHR0cGNvZGU7ICAgICAgICAgICAgICAgICAvKiBlcnJvciBjb2RlIGZyb20gdGhlICdIVFRQLzEuPyBYWFgnIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSVFNQLzEuPyBYWFgnIGxpbmUgKi8KLSAgc3RydWN0IHRpbWV2YWwgc3RhcnQxMDA7ICAgICAgLyogdGltZSBzdGFtcCB0byB3YWl0IGZvciB0aGUgMTAwIGNvZGUgZnJvbSAqLworICBzdHJ1Y3QgY3VybHRpbWUgc3RhcnQxMDA7ICAgICAgLyogdGltZSBzdGFtcCB0byB3YWl0IGZvciB0aGUgMTAwIGNvZGUgZnJvbSAqLwogICBlbnVtIGV4cGVjdDEwMCBleHAxMDA7ICAgICAgICAvKiBleHBlY3QgMTAwIGNvbnRpbnVlIHN0YXRlICovCiAgIGVudW0gdXBncmFkZTEwMSB1cGdyMTAxOyAgICAgIC8qIDEwMSB1cGdyYWRlIHN0YXRlICovCiAKQEAgLTgyOSw2ICs2ODQsMTIgQEAKICAgQ1VSTGNvZGUgKCpyZWFkd3JpdGUpKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsIHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgKm5yZWFkLCBib29sICpyZWFkbW9yZSk7CiAKKyAgLyogVGhpcyBmdW5jdGlvbiBjYW4gcGVyZm9ybSB2YXJpb3VzIGNoZWNrcyBvbiB0aGUgY29ubmVjdGlvbi4gU2VlCisgICAgIENPTk5DSEVDS18qIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGVja3MgdGhhdCBjYW4gYmUgcGVyZm9ybWVkLAorICAgICBhbmQgQ09OTlJFU1VMVF8qIGZvciB0aGUgcmVzdWx0cyB0aGF0IGNhbiBiZSByZXR1cm5lZC4gKi8KKyAgdW5zaWduZWQgaW50ICgqY29ubmVjdGlvbl9jaGVjaykoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2hlY2tzX3RvX3BlcmZvcm0pOworCiAgIGxvbmcgZGVmcG9ydDsgICAgICAgICAgIC8qIERlZmF1bHQgcG9ydC4gKi8KICAgdW5zaWduZWQgaW50IHByb3RvY29sOyAgLyogU2VlIENVUkxQUk9UT18qIC0gdGhpcyBuZWVkcyB0byBiZSB0aGUgc2luZ2xlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljIHByb3RvY29sIGJpdCAqLwpAQCAtODU1LDYgKzcxNiwxNSBAQAogI2RlZmluZSBQUk9UT1BUX1NUUkVBTSAoMTw8OSkgLyogYSBwcm90b2NvbCB3aXRoIGluZGl2aWR1YWwgbG9naWNhbCBzdHJlYW1zICovCiAjZGVmaW5lIFBST1RPUFRfVVJMT1BUSU9OUyAoMTw8MTApIC8qIGFsbG93IG9wdGlvbnMgcGFydCBpbiB0aGUgdXNlcmluZm8gZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIFVSTCAqLworI2RlZmluZSBQUk9UT1BUX1BST1hZX0FTX0hUVFAgKDE8PDExKSAvKiBhbGxvdyB0aGlzIG5vbi1IVFRQIHNjaGVtZSBvdmVyIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUCBwcm94eSBhcyBIVFRQIHByb3hpZXMgbWF5IGtub3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBwcm90b2NvbCBhbmQgYWN0IGFzIGEgZ2F0ZXdheSAqLworCisjZGVmaW5lIENPTk5DSEVDS19OT05FIDAgICAgICAgICAgICAgICAgIC8qIE5vIGNoZWNrcyAqLworI2RlZmluZSBDT05OQ0hFQ0tfSVNERUFEICgxPDwwKSAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgY29ubmVjdGlvbiBpcyBkZWFkLiAqLworCisjZGVmaW5lIENPTk5SRVNVTFRfTk9ORSAwICAgICAgICAgICAgICAgIC8qIE5vIGV4dHJhIGluZm9ybWF0aW9uLiAqLworI2RlZmluZSBDT05OUkVTVUxUX0RFQUQgKDE8PDApICAgICAgICAgICAvKiBUaGUgY29ubmVjdGlvbiBpcyBkZWFkLiAqLwogCiAvKiByZXR1cm4gdGhlIGNvdW50IG9mIGJ5dGVzIHNlbnQsIG9yIC0xIG9uIGVycm9yICovCiB0eXBlZGVmIHNzaXplX3QgKEN1cmxfc2VuZCkoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCAvKiBjb25uZWN0aW9uIGRhdGEgKi8KQEAgLTg5Miw2ICs3NjIsMjQgQEAKICAgY2hhciAqcGFzc3dkOyAgLyogcHJveHkgcGFzc3dvcmQgc3RyaW5nLCBhbGxvY2F0ZWQgKi8KIH07CiAKKyNkZWZpbmUgQ09OTkVDVF9CVUZGRVJfU0laRSAxNjM4NAorCisvKiBzdHJ1Y3QgZm9yIEhUVFAgQ09OTkVDVCBzdGF0ZSBkYXRhICovCitzdHJ1Y3QgaHR0cF9jb25uZWN0X3N0YXRlIHsKKyAgY2hhciBjb25uZWN0X2J1ZmZlcltDT05ORUNUX0JVRkZFUl9TSVpFXTsKKyAgaW50IHBlcmxpbmU7IC8qIGNvdW50IGJ5dGVzIHBlciBsaW5lICovCisgIGludCBrZWVwb247CisgIGNoYXIgKmxpbmVfc3RhcnQ7CisgIGNoYXIgKnB0cjsgLyogd2hlcmUgdG8gc3RvcmUgbW9yZSBkYXRhICovCisgIGN1cmxfb2ZmX3QgY2w7IC8qIHNpemUgb2YgY29udGVudCB0byByZWFkIGFuZCBpZ25vcmUgKi8KKyAgYm9vbCBjaHVua2VkX2VuY29kaW5nOworICBlbnVtIHsKKyAgICBUVU5ORUxfSU5JVCwgICAgLyogaW5pdC9kZWZhdWx0L25vIHR1bm5lbCBzdGF0ZSAqLworICAgIFRVTk5FTF9DT05ORUNULCAvKiBDT05ORUNUIGhhcyBiZWVuIHNlbnQgb2ZmICovCisgICAgVFVOTkVMX0NPTVBMRVRFIC8qIENPTk5FQ1QgcmVzcG9uc2UgcmVjZWl2ZWQgY29tcGxldGVseSAqLworICB9IHR1bm5lbF9zdGF0ZTsKK307CisKIC8qCiAgKiBUaGUgY29ubmVjdGRhdGEgc3RydWN0IGNvbnRhaW5zIGFsbCBmaWVsZHMgYW5kIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBiZQogICogdW5pcXVlIGZvciBhbiBlbnRpcmUgY29ubmVjdGlvbi4KQEAgLTk4Myw4ICs4NzEsOCBAQAogICBpbnQgaHR0cHZlcnNpb247ICAgICAgICAvKiB0aGUgSFRUUCB2ZXJzaW9uKjEwIHJlcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIgKi8KICAgaW50IHJ0c3B2ZXJzaW9uOyAgICAgICAgLyogdGhlIFJUU1AgdmVyc2lvbioxMCByZXBvcnRlZCBieSB0aGUgc2VydmVyICovCiAKLSAgc3RydWN0IHRpbWV2YWwgbm93OyAgICAgLyogImN1cnJlbnQiIHRpbWUgKi8KLSAgc3RydWN0IHRpbWV2YWwgY3JlYXRlZDsgLyogY3JlYXRpb24gdGltZSAqLworICBzdHJ1Y3QgY3VybHRpbWUgbm93OyAgICAgLyogImN1cnJlbnQiIHRpbWUgKi8KKyAgc3RydWN0IGN1cmx0aW1lIGNyZWF0ZWQ7IC8qIGNyZWF0aW9uIHRpbWUgKi8KICAgY3VybF9zb2NrZXRfdCBzb2NrWzJdOyAvKiB0d28gc29ja2V0cywgdGhlIHNlY29uZCBpcyB1c2VkIGZvciB0aGUgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyIHdoZW4gZG9pbmcgRlRQICovCiAgIGN1cmxfc29ja2V0X3QgdGVtcHNvY2tbMl07IC8qIHRlbXBvcmFyeSBzb2NrZXRzIGZvciBoYXBweSBleWViYWxscyAqLwpAQCAtMTAwNyw3ICs4OTUsNyBAQAogIC8qIGNvbm5lY3R0aW1lOiB3aGVuIGNvbm5lY3QoKSBpcyBjYWxsZWQgb24gdGhlIGN1cnJlbnQgSVAgYWRkcmVzcy4gVXNlZCB0bwogICAgIGJlIGFibGUgdG8gdHJhY2sgd2hlbiB0byBtb3ZlIG9uIHRvIHRyeSBuZXh0IElQIC0gYnV0IG9ubHkgd2hlbiB0aGUgbXVsdGkKICAgICBpbnRlcmZhY2UgaXMgdXNlZC4gKi8KLSAgc3RydWN0IHRpbWV2YWwgY29ubmVjdHRpbWU7CisgIHN0cnVjdCBjdXJsdGltZSBjb25uZWN0dGltZTsKICAgLyogVGhlIHR3byBmaWVsZHMgYmVsb3cgZ2V0IHNldCBpbiBDdXJsX2Nvbm5lY3Rob3N0ICovCiAgIGludCBudW1fYWRkcjsgLyogbnVtYmVyIG9mIGFkZHJlc3NlcyB0byB0cnkgdG8gY29ubmVjdCB0byAqLwogICB0aW1lX3QgdGltZW91dG1zX3Blcl9hZGRyOyAvKiBob3cgbG9uZyB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBzcGVuZCBvbgpAQCAtMTEzNCwyMiArMTAyMiwyNCBAQAogICBjaGFyICpsb2NhbGRldjsKICAgdW5zaWduZWQgc2hvcnQgbG9jYWxwb3J0OwogICBpbnQgbG9jYWxwb3J0cmFuZ2U7Ci0KLSAgLyogdHVubmVsIGFzIGluIHR1bm5lbCB0aHJvdWdoIGEgSFRUUCBwcm94eSB3aXRoIENPTk5FQ1QgKi8KLSAgZW51bSB7Ci0gICAgVFVOTkVMX0lOSVQsICAgIC8qIGluaXQvZGVmYXVsdC9ubyB0dW5uZWwgc3RhdGUgKi8KLSAgICBUVU5ORUxfQ09OTkVDVCwgLyogQ09OTkVDVCBoYXMgYmVlbiBzZW50IG9mZiAqLwotICAgIFRVTk5FTF9DT01QTEVURSAvKiBDT05ORUNUIHJlc3BvbnNlIHJlY2VpdmVkIGNvbXBsZXRlbHkgKi8KLSAgfSB0dW5uZWxfc3RhdGVbMl07IC8qIHR3byBzZXBhcmF0ZSBvbmVzIHRvIGFsbG93IEZUUCAqLworICBzdHJ1Y3QgaHR0cF9jb25uZWN0X3N0YXRlICpjb25uZWN0X3N0YXRlOyAvKiBmb3IgSFRUUCBDT05ORUNUICovCiAgIHN0cnVjdCBjb25uZWN0YnVuZGxlICpidW5kbGU7IC8qIFRoZSBidW5kbGUgd2UgYXJlIG1lbWJlciBvZiAqLwotCiAgIGludCBuZWducG47IC8qIEFQTE4gb3IgTlBOIFRMUyBuZWdvdGlhdGVkIHByb3RvY29sLCBDVVJMX0hUVFBfVkVSU0lPTiogKi8KLSAgY2hhciAqY29ubmVjdF9idWZmZXI7IC8qIGZvciBDT05ORUNUIGJ1c2luZXNzICovCiAKICNpZmRlZiBVU0VfVU5JWF9TT0NLRVRTCiAgIGNoYXIgKnVuaXhfZG9tYWluX3NvY2tldDsKICAgYm9vbCBhYnN0cmFjdF91bml4X3NvY2tldDsKICNlbmRpZgorCisjaWZkZWYgVVNFX1NTTAorICAvKgorICAgKiBUbyBhdm9pZCBtdWx0aXBsZSBtYWxsb2MoKSBjYWxscywgdGhlIHNzbF9jb25uZWN0X2RhdGEgc3RydWN0dXJlcworICAgKiBhc3NvY2lhdGVkIHdpdGggYSBjb25uZWN0ZGF0YSBzdHJ1Y3QgYXJlIGFsbG9jYXRlZCBpbiB0aGUgc2FtZSBibG9jaworICAgKiBhcyB0aGUgbGF0dGVyLiBUaGlzIGZpZWxkIGZvcmNlcyBhbGlnbm1lbnQgdG8gYW4gOC1ieXRlIGJvdW5kYXJ5IHNvCisgICAqIHRoYXQgdGhpcyBhbGwgd29ya3MuCisgICAqLworICBsb25nIGxvbmcgKmFsaWduX2RhdGFfX2RvX25vdF91c2U7CisjZW5kaWYKIH07CiAKIC8qIFRoZSBlbmQgb2YgY29ubmVjdGRhdGEuICovCkBAIC0xMjEzLDM0ICsxMTAzLDM2IEBACiAgIGludCB3aWR0aDsgLyogc2NyZWVuIHdpZHRoIGF0IGRvd25sb2FkIHN0YXJ0ICovCiAgIGludCBmbGFnczsgLyogc2VlIHByb2dyZXNzLmggKi8KIAotICBkb3VibGUgdGltZXNwZW50OworICB0aW1lX3QgdGltZXNwZW50OwogCiAgIGN1cmxfb2ZmX3QgZGxzcGVlZDsKICAgY3VybF9vZmZfdCB1bHNwZWVkOwogCi0gIGRvdWJsZSB0X25zbG9va3VwOwotICBkb3VibGUgdF9jb25uZWN0OwotICBkb3VibGUgdF9hcHBjb25uZWN0OwotICBkb3VibGUgdF9wcmV0cmFuc2ZlcjsKLSAgZG91YmxlIHRfc3RhcnR0cmFuc2ZlcjsKLSAgZG91YmxlIHRfcmVkaXJlY3Q7CisgIHRpbWVfdCB0X25zbG9va3VwOworICB0aW1lX3QgdF9jb25uZWN0OworICB0aW1lX3QgdF9hcHBjb25uZWN0OworICB0aW1lX3QgdF9wcmV0cmFuc2ZlcjsKKyAgdGltZV90IHRfc3RhcnR0cmFuc2ZlcjsKKyAgdGltZV90IHRfcmVkaXJlY3Q7CiAKLSAgc3RydWN0IHRpbWV2YWwgc3RhcnQ7Ci0gIHN0cnVjdCB0aW1ldmFsIHRfc3RhcnRzaW5nbGU7Ci0gIHN0cnVjdCB0aW1ldmFsIHRfc3RhcnRvcDsKLSAgc3RydWN0IHRpbWV2YWwgdF9hY2NlcHRkYXRhOworICBzdHJ1Y3QgY3VybHRpbWUgc3RhcnQ7CisgIHN0cnVjdCBjdXJsdGltZSB0X3N0YXJ0c2luZ2xlOworICBzdHJ1Y3QgY3VybHRpbWUgdF9zdGFydG9wOworICBzdHJ1Y3QgY3VybHRpbWUgdF9hY2NlcHRkYXRhOworCisgIGJvb2wgaXNfdF9zdGFydHJhbnNmZXJfc2V0OwogCiAgIC8qIHVwbG9hZCBzcGVlZCBsaW1pdCAqLwotICBzdHJ1Y3QgdGltZXZhbCB1bF9saW1pdF9zdGFydDsKKyAgc3RydWN0IGN1cmx0aW1lIHVsX2xpbWl0X3N0YXJ0OwogICBjdXJsX29mZl90IHVsX2xpbWl0X3NpemU7CiAgIC8qIGRvd25sb2FkIHNwZWVkIGxpbWl0ICovCi0gIHN0cnVjdCB0aW1ldmFsIGRsX2xpbWl0X3N0YXJ0OworICBzdHJ1Y3QgY3VybHRpbWUgZGxfbGltaXRfc3RhcnQ7CiAgIGN1cmxfb2ZmX3QgZGxfbGltaXRfc2l6ZTsKIAotI2RlZmluZSBDVVJSX1RJTUUgKDUrMSkgLyogNiBlbnRyaWVzIGZvciA1IHNlY29uZHMgKi8KKyNkZWZpbmUgQ1VSUl9USU1FICg1ICsgMSkgLyogNiBlbnRyaWVzIGZvciA1IHNlY29uZHMgKi8KIAogICBjdXJsX29mZl90IHNwZWVkZXJbIENVUlJfVElNRSBdOwotICBzdHJ1Y3QgdGltZXZhbCBzcGVlZGVyX3RpbWVbIENVUlJfVElNRSBdOworICBzdHJ1Y3QgY3VybHRpbWUgc3BlZWRlcl90aW1lWyBDVVJSX1RJTUUgXTsKICAgaW50IHNwZWVkZXJfYzsKIH07CiAKQEAgLTEyNDksOCArMTE0MSwxMCBAQAogICBIVFRQUkVRX0dFVCwKICAgSFRUUFJFUV9QT1NULAogICBIVFRQUkVRX1BPU1RfRk9STSwgLyogd2UgbWFrZSBhIGRpZmZlcmVuY2UgaW50ZXJuYWxseSAqLworICBIVFRQUkVRX1BPU1RfTUlNRSwgLyogd2UgbWFrZSBhIGRpZmZlcmVuY2UgaW50ZXJuYWxseSAqLwogICBIVFRQUkVRX1BVVCwKICAgSFRUUFJFUV9IRUFELAorICBIVFRQUkVRX09QVElPTlMsCiAgIEhUVFBSRVFfQ1VTVE9NLAogICBIVFRQUkVRX0xBU1QgLyogbGFzdCBpbiBsaXN0ICovCiB9IEN1cmxfSHR0cFJlcTsKQEAgLTEzMzQsNyArMTIyOCw3IEBACiAgKi8KIHN0cnVjdCB0aW1lX25vZGUgewogICBzdHJ1Y3QgY3VybF9sbGlzdF9lbGVtZW50IGxpc3Q7Ci0gIHN0cnVjdCB0aW1ldmFsIHRpbWU7CisgIHN0cnVjdCBjdXJsdGltZSB0aW1lOwogICBleHBpcmVfaWQgZWlkOwogfTsKIApAQCAtMTM0OSw3ICsxMjQzLDcgQEAKICAgYm9vbCBtdWx0aV9vd25lZF9ieV9lYXN5OwogCiAgIC8qIGJ1ZmZlcnMgdG8gc3RvcmUgYXV0aGVudGljYXRpb24gZGF0YSBpbiwgYXMgcGFyc2VkIGZyb20gaW5wdXQgb3B0aW9ucyAqLwotICBzdHJ1Y3QgdGltZXZhbCBrZWVwc19zcGVlZDsgLyogZm9yIHRoZSBwcm9ncmVzcyBtZXRlciByZWFsbHkgKi8KKyAgc3RydWN0IGN1cmx0aW1lIGtlZXBzX3NwZWVkOyAvKiBmb3IgdGhlIHByb2dyZXNzIG1ldGVyIHJlYWxseSAqLwogCiAgIHN0cnVjdCBjb25uZWN0ZGF0YSAqbGFzdGNvbm5lY3Q7IC8qIFRoZSBsYXN0IGNvbm5lY3Rpb24sIE5VTEwgaWYgdW5kZWZpbmVkICovCiAKQEAgLTEzNTcsNyArMTI1MSw3IEBACiAgIHNpemVfdCBoZWFkZXJzaXplOyAgIC8qIHNpemUgb2YgdGhlIGFsbG9jYXRpb24gKi8KIAogICBjaGFyICpidWZmZXI7IC8qIGRvd25sb2FkIGJ1ZmZlciAqLwotICBjaGFyIHVwbG9hZGJ1ZmZlcltVUExPQURfQlVGU0laRSsxXTsgLyogdXBsb2FkIGJ1ZmZlciAqLworICBjaGFyIHVwbG9hZGJ1ZmZlcltVUExPQURfQlVGU0laRSArIDFdOyAvKiB1cGxvYWQgYnVmZmVyICovCiAgIGN1cmxfb2ZmX3QgY3VycmVudF9zcGVlZDsgIC8qIHRoZSBQcm9ncmVzc1Nob3coKSBmdW5jdGlvbiBzZXRzIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzIC8gc2Vjb25kICovCiAgIGJvb2wgdGhpc19pc19hX2ZvbGxvdzsgLyogdGhpcyBpcyBhIGZvbGxvd2VkIExvY2F0aW9uOiByZXF1ZXN0ICovCkBAIC0xNDAxLDkgKzEyOTUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgIGFyZXNfY2hhbm5lbCBmLmUuICovCiAKICNpZiBkZWZpbmVkKFVTRV9PUEVOU1NMKSAmJiBkZWZpbmVkKEhBVkVfT1BFTlNTTF9FTkdJTkVfSCkKLSAgRU5HSU5FICplbmdpbmU7CisgIC8qIHZvaWQgaW5zdGVhZCBvZiBFTkdJTkUgdG8gYXZvaWQgYmxlZWRpbmcgT3BlblNTTCBpbnRvIHRoaXMgaGVhZGVyICovCisgIHZvaWQgKmVuZ2luZTsKICNlbmRpZiAvKiBVU0VfT1BFTlNTTCAqLwotICBzdHJ1Y3QgdGltZXZhbCBleHBpcmV0aW1lOyAvKiBzZXQgdGhpcyB3aXRoIEN1cmxfZXhwaXJlKCkgb25seSAqLworICBzdHJ1Y3QgY3VybHRpbWUgZXhwaXJldGltZTsgLyogc2V0IHRoaXMgd2l0aCBDdXJsX2V4cGlyZSgpIG9ubHkgKi8KICAgc3RydWN0IEN1cmxfdHJlZSB0aW1lbm9kZTsgLyogZm9yIHRoZSBzcGxheSBzdHVmZiAqLwogICBzdHJ1Y3QgY3VybF9sbGlzdCB0aW1lb3V0bGlzdDsgLyogbGlzdCBvZiBwZW5kaW5nIHRpbWVvdXRzICovCiAgIHN0cnVjdCB0aW1lX25vZGUgZXhwaXJlc1tFWFBJUkVfTEFTVF07IC8qIG5vZGVzIGZvciBlYWNoIGV4cGlyZSB0eXBlICovCkBAIC0xNTc0LDcgKzE0NjksNyBAQAogI2lmZGVmIFVTRV9VTklYX1NPQ0tFVFMKICAgU1RSSU5HX1VOSVhfU09DS0VUX1BBVEgsICAgICAgLyogcGF0aCB0byBVbml4IHNvY2tldCwgaWYgdXNlZCAqLwogI2VuZGlmCi0KKyAgU1RSSU5HX1RBUkdFVCwgICAgICAgICAgICAgICAgLyogQ1VSTE9QVF9SRVFVRVNUX1RBUkdFVCAqLwogICAvKiAtLSBlbmQgb2YgemVyby10ZXJtaW5hdGVkIHN0cmluZ3MgLS0gKi8KIAogICBTVFJJTkdfTEFTVFpFUk9URVJNSU5BVEVELApAQCAtMTYwMSw2ICsxNDk2LDcgQEAKICAgbG9uZyB1c2VfcG9ydDsgICAgIC8qIHdoaWNoIHBvcnQgdG8gdXNlICh3aGVuIG5vdCB1c2luZyBkZWZhdWx0KSAqLwogICB1bnNpZ25lZCBsb25nIGh0dHBhdXRoOyAgLyoga2luZCBvZiBIVFRQIGF1dGhlbnRpY2F0aW9uIHRvIHVzZSAoYml0bWFzaykgKi8KICAgdW5zaWduZWQgbG9uZyBwcm94eWF1dGg7IC8qIGtpbmQgb2YgcHJveHkgYXV0aGVudGljYXRpb24gdG8gdXNlIChiaXRtYXNrKSAqLworICB1bnNpZ25lZCBsb25nIHNvY2tzNWF1dGg7Lyoga2luZCBvZiBTT0NLUzUgYXV0aGVudGljYXRpb24gdG8gdXNlIChiaXRtYXNrKSAqLwogICBsb25nIGZvbGxvd2xvY2F0aW9uOyAvKiBhcyBpbiBIVFRQIExvY2F0aW9uOiAqLwogICBsb25nIG1heHJlZGlyczsgICAgLyogbWF4aW11bSBuby4gb2YgaHR0cChzKSByZWRpcmVjdHMgdG8gZm9sbG93LCBzZXQgdG8gLTEKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpbmZpbml0eSAqLwpAQCAtMTY2Myw3ICsxNTU5LDggQEAKICAgY3VybF9vZmZfdCBzZXRfcmVzdW1lX2Zyb207ICAvKiBjb250aW51ZSBbZnRwXSB0cmFuc2ZlciBmcm9tIGhlcmUgKi8KICAgc3RydWN0IGN1cmxfc2xpc3QgKmhlYWRlcnM7IC8qIGxpbmtlZCBsaXN0IG9mIGV4dHJhIGhlYWRlcnMgKi8KICAgc3RydWN0IGN1cmxfc2xpc3QgKnByb3h5aGVhZGVyczsgLyogbGlua2VkIGxpc3Qgb2YgZXh0cmEgQ09OTkVDVCBoZWFkZXJzICovCi0gIHN0cnVjdCBjdXJsX2h0dHBwb3N0ICpodHRwcG9zdDsgIC8qIGxpbmtlZCBsaXN0IG9mIFBPU1QgZGF0YSAqLworICBzdHJ1Y3QgY3VybF9odHRwcG9zdCAqaHR0cHBvc3Q7ICAvKiBsaW5rZWQgbGlzdCBvZiBvbGQgUE9TVCBkYXRhICovCisgIGN1cmxfbWltZXBhcnQgbWltZXBvc3Q7ICAvKiBNSU1FL1BPU1QgZGF0YS4gKi8KICAgYm9vbCBzZXBfaGVhZGVyczsgICAgIC8qIGhhbmRsZSBob3N0IGFuZCBwcm94eSBoZWFkZXJzIHNlcGFyYXRlbHkgKi8KICAgYm9vbCBjb29raWVzZXNzaW9uOyAgIC8qIG5ldyBjb29raWUgc2Vzc2lvbj8gKi8KICAgYm9vbCBjcmxmOyAgICAgICAgICAgIC8qIGNvbnZlcnQgY3JsZiBvbiBmdHAgdXBsb2FkKD8pICovCkBAIC0xNjg1LDYgKzE1ODIsNyBAQAogICBDdXJsX0h0dHBSZXEgaHR0cHJlcTsgICAvKiB3aGF0IGtpbmQgb2YgSFRUUCByZXF1ZXN0IChpZiBhbnkpIGlzIHRoaXMgKi8KICAgbG9uZyBodHRwdmVyc2lvbjsgLyogd2hlbiBub24temVybywgYSBzcGVjaWZpYyBIVFRQIHZlcnNpb24gcmVxdWVzdGVkIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgaW4gdGhlIGxpYnJhcnkncyByZXF1ZXN0KHMpICovCisgIGJvb2wgc3RyaXBfcGF0aF9zbGFzaDsgLyogc3RyaXAgb2ZmIGluaXRpYWwgc2xhc2ggZnJvbSBwYXRoICovCiAgIHN0cnVjdCBzc2xfY29uZmlnX2RhdGEgc3NsOyAgLyogdXNlciBkZWZpbmVkIFNTTCBzdHVmZiAqLwogICBzdHJ1Y3Qgc3NsX2NvbmZpZ19kYXRhIHByb3h5X3NzbDsgIC8qIHVzZXIgZGVmaW5lZCBTU0wgc3R1ZmYgZm9yIHByb3h5ICovCiAgIHN0cnVjdCBzc2xfZ2VuZXJhbF9jb25maWcgZ2VuZXJhbF9zc2w7IC8qIGdlbmVyYWwgdXNlciBkZWZpbmVkIFNTTCBzdHVmZiAqLwpAQCAtMTcwOCw2ICsxNjA2LDcgQEAKIAogICBjdXJsX3NzaGtleWNhbGxiYWNrIHNzaF9rZXlmdW5jOyAvKiBrZXkgbWF0Y2hpbmcgY2FsbGJhY2sgKi8KICAgdm9pZCAqc3NoX2tleWZ1bmNfdXNlcnA7ICAgICAgICAgLyogY3VzdG9tIHBvaW50ZXIgdG8gY2FsbGJhY2sgKi8KKyAgYm9vbCBzc2hfY29tcHJlc3Npb247ICAgICAgICAgICAgLyogZW5hYmxlIFNTSCBjb21wcmVzc2lvbiAqLwogCiAvKiBIZXJlIGZvbGxvd3MgYm9vbGVhbiBzZXR0aW5ncyB0aGF0IGRlZmluZSBob3cgdG8gYmVoYXZlIGR1cmluZwogICAgdGhpcyBzZXNzaW9uLiBUaGV5IGFyZSBTVEFUSUMsIHNldCBieSBsaWJjdXJsIHVzZXJzIG9yIGF0IGxlYXN0IGluaXRpYWxseQpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdmF1dGgvZGlnZXN0X3NzcGkuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3ZhdXRoL2RpZ2VzdF9zc3BpLmMKaW5kZXggMGJkOTQ0NC4uYTNmOTZlZCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdmF1dGgvZGlnZXN0X3NzcGkuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92YXV0aC9kaWdlc3Rfc3NwaS5jCkBAIC0zNTIsOCArMzUyLDggQEAKICAgICAgIGlmKCFDdXJsX2F1dGhfZGlnZXN0X2dldF9wYWlyKHAsIHZhbHVlLCBjb250ZW50LCAmcCkpCiAgICAgICAgIGJyZWFrOwogCi0gICAgICBpZihDdXJsX3N0cmNhc2Vjb21wYXJlKHZhbHVlLCAic3RhbGUiKQotICAgICAgICAgJiYgQ3VybF9zdHJjYXNlY29tcGFyZShjb250ZW50LCAidHJ1ZSIpKSB7CisgICAgICBpZihzdHJjYXNlY29tcGFyZSh2YWx1ZSwgInN0YWxlIikgJiYKKyAgICAgICAgIHN0cmNhc2Vjb21wYXJlKGNvbnRlbnQsICJ0cnVlIikpIHsKICAgICAgICAgc3RhbGUgPSB0cnVlOwogICAgICAgICBicmVhazsKICAgICAgIH0KQEAgLTQzOCw2ICs0MzgsMjAgQEAKICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKICAgfQogCisgIC8qIElmIHRoZSB1c2VyL3Bhc3N3ZCB0aGF0IHdhcyB1c2VkIHRvIG1ha2UgdGhlIGlkZW50aXR5IGZvciBodHRwX2NvbnRleHQKKyAgICAgaGFzIGNoYW5nZWQgdGhlbiBkZWxldGUgdGhhdCBjb250ZXh0LiAqLworICBpZigodXNlcnAgJiYgIWRpZ2VzdC0+dXNlcikgfHwgKCF1c2VycCAmJiBkaWdlc3QtPnVzZXIpIHx8CisgICAgIChwYXNzd2RwICYmICFkaWdlc3QtPnBhc3N3ZCkgfHwgKCFwYXNzd2RwICYmIGRpZ2VzdC0+cGFzc3dkKSB8fAorICAgICAodXNlcnAgJiYgZGlnZXN0LT51c2VyICYmIHN0cmNtcCh1c2VycCwgZGlnZXN0LT51c2VyKSkgfHwKKyAgICAgKHBhc3N3ZHAgJiYgZGlnZXN0LT5wYXNzd2QgJiYgc3RyY21wKHBhc3N3ZHAsIGRpZ2VzdC0+cGFzc3dkKSkpIHsKKyAgICBpZihkaWdlc3QtPmh0dHBfY29udGV4dCkgeworICAgICAgc19wU2VjRm4tPkRlbGV0ZVNlY3VyaXR5Q29udGV4dChkaWdlc3QtPmh0dHBfY29udGV4dCk7CisgICAgICBDdXJsX3NhZmVmcmVlKGRpZ2VzdC0+aHR0cF9jb250ZXh0KTsKKyAgICB9CisgICAgQ3VybF9zYWZlZnJlZShkaWdlc3QtPnVzZXIpOworICAgIEN1cmxfc2FmZWZyZWUoZGlnZXN0LT5wYXNzd2QpOworICB9CisKICAgaWYoZGlnZXN0LT5odHRwX2NvbnRleHQpIHsKICAgICBjaGxnX2Rlc2MudWxWZXJzaW9uICAgID0gU0VDQlVGRkVSX1ZFUlNJT047CiAgICAgY2hsZ19kZXNjLmNCdWZmZXJzICAgICA9IDU7CkBAIC00NzksNiArNDkzLDEwIEBACiAgICAgVGltZVN0YW1wIGV4cGlyeTsgLyogRm9yIFdpbmRvd3MgOXggY29tcGF0aWJpbGl0eSBvZiBTU1BJIGNhbGxzICovCiAgICAgVENIQVIgKnNwbjsKIAorICAgIC8qIGZyZWUgdGhlIGNvcHkgb2YgdXNlci9wYXNzd2QgdXNlZCB0byBtYWtlIHRoZSBwcmV2aW91cyBpZGVudGl0eSAqLworICAgIEN1cmxfc2FmZWZyZWUoZGlnZXN0LT51c2VyKTsKKyAgICBDdXJsX3NhZmVmcmVlKGRpZ2VzdC0+cGFzc3dkKTsKKwogICAgIGlmKHVzZXJwICYmICp1c2VycCkgewogICAgICAgLyogUG9wdWxhdGUgb3VyIGlkZW50aXR5IHN0cnVjdHVyZSAqLwogICAgICAgaWYoQ3VybF9jcmVhdGVfc3NwaV9pZGVudGl0eSh1c2VycCwgcGFzc3dkcCwgJmlkZW50aXR5KSkgewpAQCAtNTAwLDYgKzUxOCwyNSBAQAogICAgICAgLyogVXNlIHRoZSBjdXJyZW50IFdpbmRvd3MgdXNlciAqLwogICAgICAgcF9pZGVudGl0eSA9IE5VTEw7CiAKKyAgICBpZih1c2VycCkgeworICAgICAgZGlnZXN0LT51c2VyID0gc3RyZHVwKHVzZXJwKTsKKworICAgICAgaWYoIWRpZ2VzdC0+dXNlcikgeworICAgICAgICBmcmVlKG91dHB1dF90b2tlbik7CisgICAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOworICAgICAgfQorICAgIH0KKworICAgIGlmKHBhc3N3ZHApIHsKKyAgICAgIGRpZ2VzdC0+cGFzc3dkID0gc3RyZHVwKHBhc3N3ZHApOworCisgICAgICBpZighZGlnZXN0LT5wYXNzd2QpIHsKKyAgICAgICAgZnJlZShvdXRwdXRfdG9rZW4pOworICAgICAgICBDdXJsX3NhZmVmcmVlKGRpZ2VzdC0+dXNlcik7CisgICAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOworICAgICAgfQorICAgIH0KKwogICAgIC8qIEFjcXVpcmUgb3VyIGNyZWRlbnRpYWxzIGhhbmRsZSAqLwogICAgIHN0YXR1cyA9IHNfcFNlY0ZuLT5BY3F1aXJlQ3JlZGVudGlhbHNIYW5kbGUoTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUQ0hBUiAqKSBURVhUKFNQX05BTUVfRElHRVNUKSwKQEAgLTYyMyw2ICs2NjAsMTAgQEAKICAgICBzX3BTZWNGbi0+RGVsZXRlU2VjdXJpdHlDb250ZXh0KGRpZ2VzdC0+aHR0cF9jb250ZXh0KTsKICAgICBDdXJsX3NhZmVmcmVlKGRpZ2VzdC0+aHR0cF9jb250ZXh0KTsKICAgfQorCisgIC8qIEZyZWUgdGhlIGNvcHkgb2YgdXNlci9wYXNzd2QgdXNlZCB0byBtYWtlIHRoZSBpZGVudGl0eSBmb3IgaHR0cF9jb250ZXh0ICovCisgIEN1cmxfc2FmZWZyZWUoZGlnZXN0LT51c2VyKTsKKyAgQ3VybF9zYWZlZnJlZShkaWdlc3QtPnBhc3N3ZCk7CiB9CiAKICNlbmRpZiAvKiBVU0VfV0lORE9XU19TU1BJICYmICFDVVJMX0RJU0FCTEVfQ1JZUFRPX0FVVEggKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3ZhdXRoL250bG0uYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3ZhdXRoL250bG0uYwppbmRleCA0MjE5NjQ1Li41MGQ5MjIyIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92YXV0aC9udGxtLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdmF1dGgvbnRsbS5jCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC00NCw3ICs0NCw5IEBACiAjaW5jbHVkZSAicmFuZC5oIgogI2luY2x1ZGUgInZ0bHMvdnRscy5oIgogCi0jaWZkZWYgVVNFX05TUworLyogU1NMIGJhY2tlbmQtc3BlY2lmaWMgI2lmIGJyYW5jaGVzIGluIHRoaXMgZmlsZSBtdXN0IGJlIGtlcHQgaW4gdGhlIG9yZGVyCisgICBkb2N1bWVudGVkIGluIGN1cmxfbnRsbV9jb3JlLiAqLworI2lmIGRlZmluZWQoTlRMTV9ORUVEU19OU1NfSU5JVCkKICNpbmNsdWRlICJ2dGxzL25zc2cuaCIgLyogZm9yIEN1cmxfbnNzX2ZvcmNlX2luaXQoKSAqLwogI2VuZGlmCiAKQEAgLTI3Miw3ICsyNzQsNyBAQAogICB1bnNpZ25lZCBjaGFyICp0eXBlMiA9IE5VTEw7CiAgIHNpemVfdCB0eXBlMl9sZW4gPSAwOwogCi0jaWYgZGVmaW5lZChVU0VfTlNTKQorI2lmIGRlZmluZWQoTlRMTV9ORUVEU19OU1NfSU5JVCkKICAgLyogTWFrZSBzdXJlIHRoZSBjcnlwdG8gYmFja2VuZCBpcyBpbml0aWFsaXplZCAqLwogICByZXN1bHQgPSBDdXJsX25zc19mb3JjZV9pbml0KGRhdGEpOwogICBpZihyZXN1bHQpCkBAIC0zNTAsNiArMzUyLDcgQEAKICAqCiAgKiBQYXJhbWV0ZXJzOgogICoKKyAqIGRhdGEgICAgW2luXSAgICAgLSBUaGUgc2Vzc2lvbiBoYW5kbGUuCiAgKiB1c2VycCAgIFtpbl0gICAgIC0gVGhlIHVzZXIgbmFtZSBpbiB0aGUgZm9ybWF0IFVzZXIgb3IgRG9tYWluXFVzZXIuCiAgKiBwYXNzZHdwIFtpbl0gICAgIC0gVGhlIHVzZXIncyBwYXNzd29yZC4KICAqIG50bG0gICAgW2luL291dF0gLSBUaGUgTlRMTSBkYXRhIHN0cnVjdCBiZWluZyB1c2VkIGFuZCBtb2RpZmllZC4KQEAgLTM1OSw3ICszNjIsOCBAQAogICoKICAqIFJldHVybnMgQ1VSTEVfT0sgb24gc3VjY2Vzcy4KICAqLwotQ1VSTGNvZGUgQ3VybF9hdXRoX2NyZWF0ZV9udGxtX3R5cGUxX21lc3NhZ2UoY29uc3QgY2hhciAqdXNlcnAsCitDVVJMY29kZSBDdXJsX2F1dGhfY3JlYXRlX250bG1fdHlwZTFfbWVzc2FnZShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXNlcnAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXNzd2RwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG50bG1kYXRhICpudGxtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKm91dHB0ciwgc2l6ZV90ICpvdXRsZW4pCkBAIC00NTgsNyArNDYyLDcgQEAKICAgfSk7CiAKICAgLyogUmV0dXJuIHdpdGggYmluYXJ5IGJsb2IgZW5jb2RlZCBpbnRvIGJhc2U2NCAqLwotICByZXR1cm4gQ3VybF9iYXNlNjRfZW5jb2RlKE5VTEwsIChjaGFyICopbnRsbWJ1Ziwgc2l6ZSwgb3V0cHRyLCBvdXRsZW4pOworICByZXR1cm4gQ3VybF9iYXNlNjRfZW5jb2RlKGRhdGEsIChjaGFyICopbnRsbWJ1Ziwgc2l6ZSwgb3V0cHRyLCBvdXRsZW4pOwogfQogCiAvKgpAQCAtODI3LDcgKzgzMSw3IEBACiAgICAgcmV0dXJuIENVUkxFX0NPTlZfRkFJTEVEOwogCiAgIC8qIFJldHVybiB3aXRoIGJpbmFyeSBibG9iIGVuY29kZWQgaW50byBiYXNlNjQgKi8KLSAgcmVzdWx0ID0gQ3VybF9iYXNlNjRfZW5jb2RlKE5VTEwsIChjaGFyICopbnRsbWJ1Ziwgc2l6ZSwgb3V0cHRyLCBvdXRsZW4pOworICByZXN1bHQgPSBDdXJsX2Jhc2U2NF9lbmNvZGUoZGF0YSwgKGNoYXIgKiludGxtYnVmLCBzaXplLCBvdXRwdHIsIG91dGxlbik7CiAKICAgQ3VybF9hdXRoX250bG1fY2xlYW51cChudGxtKTsKIApkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdmF1dGgvbnRsbV9zc3BpLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92YXV0aC9udGxtX3NzcGkuYwppbmRleCBjMzMwNTE3Li5lNzQ4Y2UzIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92YXV0aC9udGxtX3NzcGkuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92YXV0aC9udGxtX3NzcGkuYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNywgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGFzIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24uIFRoZSB0ZXJtcwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgInZhdXRoL3ZhdXRoLmgiCiAjaW5jbHVkZSAidXJsZGF0YS5oIgogI2luY2x1ZGUgImN1cmxfYmFzZTY0LmgiCisjaW5jbHVkZSAiY3VybF9udGxtX2NvcmUuaCIKICNpbmNsdWRlICJ3YXJubGVzcy5oIgogI2luY2x1ZGUgImN1cmxfbXVsdGlieXRlLmgiCiAjaW5jbHVkZSAic2VuZGYuaCIKQEAgLTY2LDYgKzY3LDcgQEAKICAqCiAgKiBQYXJhbWV0ZXJzOgogICoKKyAqIGRhdGEgICAgW2luXSAgICAgLSBUaGUgc2Vzc2lvbiBoYW5kbGUuCiAgKiB1c2VycCAgIFtpbl0gICAgIC0gVGhlIHVzZXIgbmFtZSBpbiB0aGUgZm9ybWF0IFVzZXIgb3IgRG9tYWluXFVzZXIuCiAgKiBwYXNzZHdwIFtpbl0gICAgIC0gVGhlIHVzZXIncyBwYXNzd29yZC4KICAqIG50bG0gICAgW2luL291dF0gLSBUaGUgTlRMTSBkYXRhIHN0cnVjdCBiZWluZyB1c2VkIGFuZCBtb2RpZmllZC4KQEAgLTc1LDcgKzc3LDggQEAKICAqCiAgKiBSZXR1cm5zIENVUkxFX09LIG9uIHN1Y2Nlc3MuCiAgKi8KLUNVUkxjb2RlIEN1cmxfYXV0aF9jcmVhdGVfbnRsbV90eXBlMV9tZXNzYWdlKGNvbnN0IGNoYXIgKnVzZXJwLAorQ1VSTGNvZGUgQ3VybF9hdXRoX2NyZWF0ZV9udGxtX3R5cGUxX21lc3NhZ2Uoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVzZXJwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGFzc3dkcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBudGxtZGF0YSAqbnRsbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipvdXRwdHIsIHNpemVfdCAqb3V0bGVuKQpAQCAtMTY2LDcgKzE2OSw3IEBACiAgICAgcmV0dXJuIENVUkxFX1JFQ1ZfRVJST1I7CiAKICAgLyogQmFzZTY0IGVuY29kZSB0aGUgcmVzcG9uc2UgKi8KLSAgcmV0dXJuIEN1cmxfYmFzZTY0X2VuY29kZShOVUxMLCAoY2hhciAqKSBudGxtLT5vdXRwdXRfdG9rZW4sCisgIHJldHVybiBDdXJsX2Jhc2U2NF9lbmNvZGUoZGF0YSwgKGNoYXIgKikgbnRsbS0+b3V0cHV0X3Rva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfMV9idWYuY2JCdWZmZXIsIG91dHB0ciwgb3V0bGVuKTsKIH0KIApkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdmF1dGgvc3BuZWdvX2dzc2FwaS5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdmF1dGgvc3BuZWdvX2dzc2FwaS5jCmluZGV4IDg4NDBkYjguLjUxOTZjMjcgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3ZhdXRoL3NwbmVnb19nc3NhcGkuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92YXV0aC9zcG5lZ29fZ3NzYXBpLmMKQEAgLTE4MCw2ICsxODAsMTAgQEAKICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKICAgfQogCisgIC8qIEZyZWUgcHJldmlvdXMgdG9rZW4gKi8KKyAgaWYobmVnby0+b3V0cHV0X3Rva2VuLmxlbmd0aCAmJiBuZWdvLT5vdXRwdXRfdG9rZW4udmFsdWUpCisgICAgZ3NzX3JlbGVhc2VfYnVmZmVyKCZ1bnVzZWRfc3RhdHVzLCAmbmVnby0+b3V0cHV0X3Rva2VuKTsKKwogICBuZWdvLT5vdXRwdXRfdG9rZW4gPSBvdXRwdXRfdG9rZW47CiAKICAgcmV0dXJuIENVUkxFX09LOwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdmF1dGgvdmF1dGguaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3ZhdXRoL3ZhdXRoLmgKaW5kZXggOWQ2MTIyOC4uZGZhZjk4NSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdmF1dGgvdmF1dGguaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92YXV0aC92YXV0aC5oCkBAIC03LDcgKzcsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMjAxNCAtIDIwMTYsIFN0ZXZlIEhvbG1lLCA8c3RldmVfaG9sbWVAaG90bWFpbC5jb20+LgorICogQ29weXJpZ2h0IChDKSAyMDE0IC0gMjAxNywgU3RldmUgSG9sbWUsIDxzdGV2ZV9ob2xtZUBob3RtYWlsLmNvbT4uCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTExOSw3ICsxMTksOCBAQAogYm9vbCBDdXJsX2F1dGhfaXNfbnRsbV9zdXBwb3J0ZWQodm9pZCk7CiAKIC8qIFRoaXMgaXMgdXNlZCB0byBnZW5lcmF0ZSBhIGJhc2U2NCBlbmNvZGVkIE5UTE0gdHlwZS0xIG1lc3NhZ2UgKi8KLUNVUkxjb2RlIEN1cmxfYXV0aF9jcmVhdGVfbnRsbV90eXBlMV9tZXNzYWdlKGNvbnN0IGNoYXIgKnVzZXJwLAorQ1VSTGNvZGUgQ3VybF9hdXRoX2NyZWF0ZV9udGxtX3R5cGUxX21lc3NhZ2Uoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVzZXJwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGFzc3dkcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBudGxtZGF0YSAqbnRsbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipvdXRwdHIsCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92ZXJzaW9uLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92ZXJzaW9uLmMKaW5kZXggM2QxNzc2OC4uZWJkNjAwNiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdmVyc2lvbi5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3ZlcnNpb24uYwpAQCAtMzI0LDggKzMyNCw4IEBACiAjaWYgZGVmaW5lZChVU0VfTElCUFNMKQogICB8IENVUkxfVkVSU0lPTl9QU0wKICNlbmRpZgotI2lmIGRlZmluZWQoSFRUUFNfUFJPWFlfU1VQUE9SVCkKLSAgfCBDVVJMX1ZFUlNJT05fSFRUUFNfUFJPWFkKKyNpZiBkZWZpbmVkKENVUkxfV0lUSF9NVUxUSV9TU0wpCisgIHwgQ1VSTF9WRVJTSU9OX01VTFRJX1NTTAogI2VuZGlmCiAgICwKICAgTlVMTCwgLyogc3NsX3ZlcnNpb24gKi8KQEAgLTM1NSw2ICszNTUsMTAgQEAKICNpZmRlZiBVU0VfU1NMCiAgIEN1cmxfc3NsX3ZlcnNpb24oc3NsX2J1ZmZlciwgc2l6ZW9mKHNzbF9idWZmZXIpKTsKICAgdmVyc2lvbl9pbmZvLnNzbF92ZXJzaW9uID0gc3NsX2J1ZmZlcjsKKyAgaWYoQ3VybF9zc2wtPnN1cHBvcnRfaHR0cHNfcHJveHkpCisgICAgdmVyc2lvbl9pbmZvLmZlYXR1cmVzIHw9IENVUkxfVkVSU0lPTl9IVFRQU19QUk9YWTsKKyAgZWxzZQorICAgIHZlcnNpb25faW5mby5mZWF0dXJlcyAmPSB+Q1VSTF9WRVJTSU9OX0hUVFBTX1BST1hZOwogI2VuZGlmCiAKICNpZmRlZiBIQVZFX0xJQloKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvYXh0bHMuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvYXh0bHMuYwppbmRleCBmMGUzNzY2Li42YjQyNzA4IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2F4dGxzLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9heHRscy5jCkBAIC00NywyMSArNDcsMTIgQEAKICNpbmNsdWRlICJjdXJsX21lbW9yeS5oIgogI2luY2x1ZGUgIm1lbWRlYnVnLmgiCiAKK3N0cnVjdCBzc2xfYmFja2VuZF9kYXRhIHsKKyAgU1NMX0NUWCogc3NsX2N0eDsKKyAgU1NMKiAgICAgc3NsOworfTsKIAotLyogR2xvYmFsIGF4VExTIGluaXQsIGNhbGxlZCBmcm9tIEN1cmxfc3NsX2luaXQoKSAqLwotaW50IEN1cmxfYXh0bHNfaW5pdCh2b2lkKQotewotLyogYXhUTFMgaGFzIG5vIGdsb2JhbCBpbml0LiAgRXZlcnl0aGluZyBpcyBkb25lIHRocm91Z2ggU1NMIGFuZCBTU0xfQ1RYCi0gKiBzdHJ1Y3RzIHN0b3JlZCBpbiBjb25uZWN0ZGF0YSBzdHJ1Y3R1cmUuICBQZXJoYXBzIGNhbiBtb3ZlIHRvIGF4dGxzLmguCi0gKi8KLSAgcmV0dXJuIDE7Ci19Ci0KLWludCBDdXJsX2F4dGxzX2NsZWFudXAodm9pZCkKLXsKLSAgLyogYXhUTFMgaGFzIG5vIGdsb2JhbCBjbGVhbnVwLiAgUGVyaGFwcyBjYW4gbW92ZSB0aGlzIHRvIGF4dGxzLmguICovCi0gIHJldHVybiAxOwotfQorI2RlZmluZSBCQUNLRU5EIGNvbm5zc2wtPmJhY2tlbmQKIAogc3RhdGljIENVUkxjb2RlIG1hcF9lcnJvcl90b19jdXJsKGludCBheHRsc19lcnIpCiB7CkBAIC0xMjAsMTMgKzExMSwxMyBAQAogCiBzdGF0aWMgdm9pZCBmcmVlX3NzbF9zdHJ1Y3RzKHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsKQogewotICBpZihjb25uc3NsLT5zc2wpIHsKLSAgICBzc2xfZnJlZShjb25uc3NsLT5zc2wpOwotICAgIGNvbm5zc2wtPnNzbCA9IE5VTEw7CisgIGlmKEJBQ0tFTkQtPnNzbCkgeworICAgIHNzbF9mcmVlKEJBQ0tFTkQtPnNzbCk7CisgICAgQkFDS0VORC0+c3NsID0gTlVMTDsKICAgfQotICBpZihjb25uc3NsLT5zc2xfY3R4KSB7Ci0gICAgc3NsX2N0eF9mcmVlKGNvbm5zc2wtPnNzbF9jdHgpOwotICAgIGNvbm5zc2wtPnNzbF9jdHggPSBOVUxMOworICBpZihCQUNLRU5ELT5zc2xfY3R4KSB7CisgICAgc3NsX2N0eF9mcmVlKEJBQ0tFTkQtPnNzbF9jdHgpOworICAgIEJBQ0tFTkQtPnNzbF9jdHggPSBOVUxMOwogICB9CiB9CiAKQEAgLTEzNyw2ICsxMjgsNyBAQAogICovCiBzdGF0aWMgQ1VSTGNvZGUgY29ubmVjdF9wcmVwKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CiAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwogICBTU0xfQ1RYICpzc2xfY3R4OwogICBTU0wgKnNzbCA9IE5VTEw7CkBAIC0xNTEsNyArMTQzLDcgQEAKICAgICBTU0xfU0VSVkVSX1ZFUklGWV9MQVRFUiB8CiAgICAgU1NMX0NPTk5FQ1RfSU5fUEFSVFM7CiAKLSAgaWYoY29ubi0+c3NsW3NvY2tpbmRleF0uc3RhdGUgPT0gc3NsX2Nvbm5lY3Rpb25fY29tcGxldGUpCisgIGlmKGNvbm5zc2wtPnN0YXRlID09IHNzbF9jb25uZWN0aW9uX2NvbXBsZXRlKQogICAgIC8qIHRvIG1ha2UgdXMgdG9sZXJhbnQgYWdhaW5zdCBiZWluZyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgZm9yIHRoZQogICAgICAgIHNhbWUgY29ubmVjdGlvbiAqLwogICAgIHJldHVybiBDVVJMRV9PSzsKQEAgLTE4NSw4ICsxNzcsOCBAQAogICAgIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKICAgfQogCi0gIGNvbm4tPnNzbFtzb2NraW5kZXhdLnNzbF9jdHggPSBzc2xfY3R4OwotICBjb25uLT5zc2xbc29ja2luZGV4XS5zc2wgPSBOVUxMOworICBCQUNLRU5ELT5zc2xfY3R4ID0gc3NsX2N0eDsKKyAgQkFDS0VORC0+c3NsID0gTlVMTDsKIAogICAvKiBMb2FkIHRoZSB0cnVzdGVkIENBIGNlcnQgYnVuZGxlIGZpbGUgKi8KICAgaWYoU1NMX0NPTk5fQ09ORklHKENBZmlsZSkpIHsKQEAgLTIxMiw3ICsyMDQsNyBAQAogCiAgIC8qIExvYWQgY2xpZW50IGNlcnRpZmljYXRlICovCiAgIGlmKFNTTF9TRVRfT1BUSU9OKGNlcnQpKSB7Ci0gICAgaT0wOworICAgIGkgPSAwOwogICAgIC8qIEluc3RlYWQgb2YgdHJ5aW5nIHRvIGFuYWx5emUgY2VydCB0eXBlIGhlcmUsIGxldCBheFRMUyB0cnkgdGhlbSBhbGwuICovCiAgICAgd2hpbGUoY2VydF90eXBlc1tpXSAhPSAwKSB7CiAgICAgICBzc2xfZmNuX3JldHVybiA9IHNzbF9vYmpfbG9hZChzc2xfY3R4LCBjZXJ0X3R5cGVzW2ldLApAQCAtMjM2LDcgKzIyOCw3IEBACiAgICAgIElmIGEgcGtjczEyIGZpbGUgc3VjY2Vzc2Z1bGx5IGxvYWRlZCBhIGNlcnQsIHRoZW4gdGhlcmUncyBub3RoaW5nIHRvIGRvCiAgICAgIGJlY2F1c2UgdGhlIGtleSBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZC4gKi8KICAgaWYoU1NMX1NFVF9PUFRJT04oa2V5KSAmJiBjZXJ0X3R5cGVzW2ldICE9IFNTTF9PQkpfUEtDUzEyKSB7Ci0gICAgaT0wOworICAgIGkgPSAwOwogICAgIC8qIEluc3RlYWQgb2YgdHJ5aW5nIHRvIGFuYWx5emUga2V5IHR5cGUgaGVyZSwgbGV0IGF4VExTIHRyeSB0aGVtIGFsbC4gKi8KICAgICB3aGlsZShrZXlfdHlwZXNbaV0gIT0gMCkgewogICAgICAgc3NsX2Zjbl9yZXR1cm4gPSBzc2xfb2JqX2xvYWQoc3NsX2N0eCwga2V5X3R5cGVzW2ldLApAQCAtMjgxLDEwICsyNzMsMjYgQEAKICAgaWYoIXNzbCkKICAgICBzc2wgPSBzc2xfY2xpZW50X25ldyhzc2xfY3R4LCBjb25uLT5zb2NrW3NvY2tpbmRleF0sIE5VTEwsIDAsIE5VTEwpOwogCi0gIGNvbm4tPnNzbFtzb2NraW5kZXhdLnNzbCA9IHNzbDsKKyAgQkFDS0VORC0+c3NsID0gc3NsOwogICByZXR1cm4gQ1VSTEVfT0s7CiB9CiAKK3N0YXRpYyB2b2lkIEN1cmxfYXh0bHNfY2xvc2Uoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQoreworICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbc29ja2luZGV4XTsKKworICBpbmZvZihjb25uLT5kYXRhLCAiICBDdXJsX2F4dGxzX2Nsb3NlXG4iKTsKKworICAgIC8qIGxpbmUgZnJvbSBvcGVuc3NsLmM6ICh2b2lkKVNTTF9zaHV0ZG93bihCQUNLRU5ELT5zc2wpOworICAgICAgIGF4VExTIGNvbXBhdCBsYXllciBkb2VzIG5vdGhpbmcgZm9yIFNTTF9zaHV0ZG93biAqLworCisgICAgLyogVGhlIGZvbGxvd2luZyBsaW5lIGlzIGZyb20gb3BlbnNzbC5jLiAgVGhlcmUgc2VlbXMgdG8gYmUgbm8gYXhUTFMKKyAgICAgICBlcXVpdmFsZW50LiAgc3NsX2ZyZWUgYW5kIHNzbF9jdHhfZnJlZSBjbG9zZSB0aGluZ3MuCisgICAgICAgU1NMX3NldF9jb25uZWN0X3N0YXRlKGNvbm5zc2wtPmhhbmRsZSk7ICovCisKKyAgZnJlZV9zc2xfc3RydWN0cyhjb25uc3NsKTsKK30KKwogLyoKICAqIEZvciBib3RoIGJsb2NraW5nIGFuZCBub24tYmxvY2tpbmcgY29ubmVjdHMsIHRoaXMgZnVuY3Rpb24gZmluYWxpemVzIHRoZQogICogU1NMIGNvbm5lY3Rpb24uCkBAIC0yOTIsNyArMzAwLDggQEAKIHN0YXRpYyBDVVJMY29kZSBjb25uZWN0X2ZpbmlzaChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7CiAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwotICBTU0wgKnNzbCA9IGNvbm4tPnNzbFtzb2NraW5kZXhdLnNzbDsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CisgIFNTTCAqc3NsID0gQkFDS0VORC0+c3NsOwogICBjb25zdCBjaGFyICpwZWVyX0NOOwogICB1aW50MzJfdCBkbnNfYWx0bmFtZV9pbmRleDsKICAgY29uc3QgY2hhciAqZG5zX2FsdG5hbWU7CkBAIC0zODcsNyArMzk2LDcgQEAKICAgfQogCiAgIC8qIEdlbmVyYWwgaG91c2VrZWVwaW5nICovCi0gIGNvbm4tPnNzbFtzb2NraW5kZXhdLnN0YXRlID0gc3NsX2Nvbm5lY3Rpb25fY29tcGxldGU7CisgIGNvbm5zc2wtPnN0YXRlID0gc3NsX2Nvbm5lY3Rpb25fY29tcGxldGU7CiAgIGNvbm4tPnJlY3Zbc29ja2luZGV4XSA9IGF4dGxzX3JlY3Y7CiAgIGNvbm4tPnNlbmRbc29ja2luZGV4XSA9IGF4dGxzX3NlbmQ7CiAKQEAgLTQwOSwxMSArNDE4LDEwIEBACiAgKiBVc2UgYXhUTFMncyBub24tYmxvY2tpbmcgY29ubmVjdGlvbiBmZWF0dXJlIHRvIG9wZW4gYW4gU1NMIGNvbm5lY3Rpb24uCiAgKiBUaGlzIGlzIGNhbGxlZCBhZnRlciBhIFRDUCBjb25uZWN0aW9uIGlzIGFscmVhZHkgZXN0YWJsaXNoZWQuCiAgKi8KLUNVUkxjb2RlIEN1cmxfYXh0bHNfY29ubmVjdF9ub25ibG9ja2luZygKLSAgICBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgaW50IHNvY2tpbmRleCwKLSAgICBib29sICpkb25lKQorc3RhdGljIENVUkxjb2RlIEN1cmxfYXh0bHNfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsIGJvb2wgKmRvbmUpCiB7CisgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOwogICBDVVJMY29kZSBjb25uX3N0ZXA7CiAgIGludCBzc2xfZmNuX3JldHVybjsKICAgaW50IGk7CkBAIC00MjEsMjMgKzQyOSwyMyBAQAogICpkb25lID0gRkFMU0U7CiAgIC8qIGNvbm5lY3RkYXRhIGlzIGNhbGxvYydkIGFuZCBjb25uZWN0aW5nX3N0YXRlIGlzIG9ubHkgY2hhbmdlZCBpbiB0aGlzCiAgICAgIGZ1bmN0aW9uLCBzbyB0aGlzIGlzIHNhZmUsIGFzIHRoZSBzdGF0ZSBpcyBlZmZlY3RpdmVseSBpbml0aWFsaXplZC4gKi8KLSAgaWYoY29ubi0+c3NsW3NvY2tpbmRleF0uY29ubmVjdGluZ19zdGF0ZSA9PSBzc2xfY29ubmVjdF8xKSB7CisgIGlmKGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPT0gc3NsX2Nvbm5lY3RfMSkgewogICAgIGNvbm5fc3RlcCA9IGNvbm5lY3RfcHJlcChjb25uLCBzb2NraW5kZXgpOwogICAgIGlmKGNvbm5fc3RlcCAhPSBDVVJMRV9PSykgewogICAgICAgQ3VybF9heHRsc19jbG9zZShjb25uLCBzb2NraW5kZXgpOwogICAgICAgcmV0dXJuIGNvbm5fc3RlcDsKICAgICB9Ci0gICAgY29ubi0+c3NsW3NvY2tpbmRleF0uY29ubmVjdGluZ19zdGF0ZSA9IHNzbF9jb25uZWN0XzI7CisgICAgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSA9IHNzbF9jb25uZWN0XzI7CiAgIH0KIAotICBpZihjb25uLT5zc2xbc29ja2luZGV4XS5jb25uZWN0aW5nX3N0YXRlID09IHNzbF9jb25uZWN0XzIpIHsKKyAgaWYoY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSA9PSBzc2xfY29ubmVjdF8yKSB7CiAgICAgLyogQ2hlY2sgdG8gbWFrZSBzdXJlIGhhbmRzaGFrZSB3YXMgb2suICovCi0gICAgaWYoc3NsX2hhbmRzaGFrZV9zdGF0dXMoY29ubi0+c3NsW3NvY2tpbmRleF0uc3NsKSAhPSBTU0xfT0spIHsKKyAgICBpZihzc2xfaGFuZHNoYWtlX3N0YXR1cyhCQUNLRU5ELT5zc2wpICE9IFNTTF9PSykgewogICAgICAgLyogTG9vcCB0byBwZXJmb3JtIG1vcmUgd29yayBpbiBiZXR3ZWVuIHNsZWVwcy4gVGhpcyBpcyB3b3JrIGFyb3VuZCB0aGUKICAgICAgICAgIGZhY3QgdGhhdCBheHRscyBkb2VzIG5vdCBleHBvc2UgYW55IGtub3dsZWRnZSBhYm91dCB3aGVuIHdvcmsgbmVlZHMKICAgICAgICAgIHRvIGJlIHBlcmZvcm1lZC4gVGhpcyBjYW4gc2F2ZSB+MjUlIG9mIHRpbWUgb24gU1NMIGhhbmRzaGFrZXMuICovCi0gICAgICBmb3IoaT0wOyBpPDU7IGkrKykgewotICAgICAgICBzc2xfZmNuX3JldHVybiA9IHNzbF9yZWFkKGNvbm4tPnNzbFtzb2NraW5kZXhdLnNzbCwgTlVMTCk7CisgICAgICBmb3IoaSA9IDA7IGk8NTsgaSsrKSB7CisgICAgICAgIHNzbF9mY25fcmV0dXJuID0gc3NsX3JlYWQoQkFDS0VORC0+c3NsLCBOVUxMKTsKICAgICAgICAgaWYoc3NsX2Zjbl9yZXR1cm4gPCAwKSB7CiAgICAgICAgICAgQ3VybF9heHRsc19jbG9zZShjb25uLCBzb2NraW5kZXgpOwogICAgICAgICAgIHNzbF9kaXNwbGF5X2Vycm9yKHNzbF9mY25fcmV0dXJuKTsgLyogZ29lcyB0byBzdGRvdXQuICovCkBAIC00NDcsMTAgKzQ1NSwxMCBAQAogICAgICAgfQogICAgIH0KICAgICBpbmZvZihjb25uLT5kYXRhLCAiaGFuZHNoYWtlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiIpOwotICAgIGNvbm4tPnNzbFtzb2NraW5kZXhdLmNvbm5lY3Rpbmdfc3RhdGUgPSBzc2xfY29ubmVjdF8zOworICAgIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPSBzc2xfY29ubmVjdF8zOwogICB9CiAKLSAgaWYoY29ubi0+c3NsW3NvY2tpbmRleF0uY29ubmVjdGluZ19zdGF0ZSA9PSBzc2xfY29ubmVjdF8zKSB7CisgIGlmKGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPT0gc3NsX2Nvbm5lY3RfMykgewogICAgIGNvbm5fc3RlcCA9IGNvbm5lY3RfZmluaXNoKGNvbm4sIHNvY2tpbmRleCk7CiAgICAgaWYoY29ubl9zdGVwICE9IENVUkxFX09LKSB7CiAgICAgICBDdXJsX2F4dGxzX2Nsb3NlKGNvbm4sIHNvY2tpbmRleCk7CkBAIC00NTgsMTUgKzQ2NiwxNSBAQAogICAgIH0KIAogICAgIC8qIFJlc2V0IGNvbm5lY3Qgc3RhdGUgKi8KLSAgICBjb25uLT5zc2xbc29ja2luZGV4XS5jb25uZWN0aW5nX3N0YXRlID0gc3NsX2Nvbm5lY3RfMTsKKyAgICBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlID0gc3NsX2Nvbm5lY3RfMTsKIAogICAgICpkb25lID0gVFJVRTsKICAgICByZXR1cm4gQ1VSTEVfT0s7CiAgIH0KIAogICAvKiBVbnJlY29nbml6ZWQgc3RhdGUuICBUaGluZ3MgYXJlIHZlcnkgYmFkLiAqLwotICBjb25uLT5zc2xbc29ja2luZGV4XS5zdGF0ZSAgPSBzc2xfY29ubmVjdGlvbl9ub25lOwotICBjb25uLT5zc2xbc29ja2luZGV4XS5jb25uZWN0aW5nX3N0YXRlID0gc3NsX2Nvbm5lY3RfMTsKKyAgY29ubnNzbC0+c3RhdGUgID0gc3NsX2Nvbm5lY3Rpb25fbm9uZTsKKyAgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSA9IHNzbF9jb25uZWN0XzE7CiAgIC8qIFJldHVybiB2YWx1ZSBwZXJoYXBzIG5vdCBzdHJpY3RseSBjb3JyZWN0LCBidXQgZGlzdGluZ3Vpc2hlcyB0aGUgaXNzdWUuKi8KICAgcmV0dXJuIENVUkxFX0JBRF9GVU5DVElPTl9BUkdVTUVOVDsKIH0KQEAgLTQ3NiwxNSArNDg0LDEzIEBACiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgVENQIGNvbm5lY3QgaGFzIGNvbXBsZXRlZC4gU2V0dXAgdGhlIFRMUwogICogbGF5ZXIgYW5kIGRvIGFsbCBuZWNlc3NhcnkgbWFnaWMgZm9yIGEgYmxvY2tpbmcgY29ubmVjdC4KICAqLwotQ1VSTGNvZGUKLUN1cmxfYXh0bHNfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4KQotCitzdGF0aWMgQ1VSTGNvZGUgQ3VybF9heHRsc19jb25uZWN0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIENVUkxjb2RlIGNvbm5fc3RlcCA9IGNvbm5lY3RfcHJlcChjb25uLCBzb2NraW5kZXgpOwogICBpbnQgc3NsX2Zjbl9yZXR1cm47Ci0gIFNTTCAqc3NsID0gY29ubi0+c3NsW3NvY2tpbmRleF0uc3NsOworICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbc29ja2luZGV4XTsKKyAgU1NMICpzc2wgPSBCQUNLRU5ELT5zc2w7CiAgIGxvbmcgdGltZW91dF9tczsKIAogICBpZihjb25uX3N0ZXAgIT0gQ1VSTEVfT0spIHsKQEAgLTUzMCw4ICs1MzYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMY29kZSAqZXJyKQogeworICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbc29ja2luZGV4XTsKICAgLyogc3NsX3dyaXRlKCkgcmV0dXJucyAnaW50JyB3aGlsZSB3cml0ZSgpIGFuZCBzZW5kKCkgcmV0dXJucyAnc2l6ZV90JyAqLwotICBpbnQgcmMgPSBzc2xfd3JpdGUoY29ubi0+c3NsW3NvY2tpbmRleF0uc3NsLCBtZW0sIChpbnQpbGVuKTsKKyAgaW50IHJjID0gc3NsX3dyaXRlKEJBQ0tFTkQtPnNzbCwgbWVtLCAoaW50KWxlbik7CiAKICAgaW5mb2YoY29ubi0+ZGF0YSwgIiAgYXh0bHNfc2VuZFxuIik7CiAKQEAgLTU0NCwyNyArNTUxLDExIEBACiAgIHJldHVybiByYzsKIH0KIAotdm9pZCBDdXJsX2F4dGxzX2Nsb3NlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKLXsKLSAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07Ci0KLSAgaW5mb2YoY29ubi0+ZGF0YSwgIiAgQ3VybF9heHRsc19jbG9zZVxuIik7Ci0KLSAgICAvKiBsaW5lIGZyb20gb3BlbnNzbC5jOiAodm9pZClTU0xfc2h1dGRvd24oY29ubnNzbC0+c3NsKTsKLSAgICAgICBheFRMUyBjb21wYXQgbGF5ZXIgZG9lcyBub3RoaW5nIGZvciBTU0xfc2h1dGRvd24gKi8KLQotICAgIC8qIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBmcm9tIG9wZW5zc2wuYy4gIFRoZXJlIHNlZW1zIHRvIGJlIG5vIGF4VExTCi0gICAgICAgZXF1aXZhbGVudC4gIHNzbF9mcmVlIGFuZCBzc2xfY3R4X2ZyZWUgY2xvc2UgdGhpbmdzLgotICAgICAgIFNTTF9zZXRfY29ubmVjdF9zdGF0ZShjb25uc3NsLT5oYW5kbGUpOyAqLwotCi0gIGZyZWVfc3NsX3N0cnVjdHMoY29ubnNzbCk7Ci19Ci0KIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzaHV0IGRvd24gdGhlIFNTTCBsYXllciBidXQga2VlcCB0aGUKICAqIHNvY2tldCBvcGVuIChDQ0MgLSBDbGVhciBDb21tYW5kIENoYW5uZWwpCiAgKi8KLWludCBDdXJsX2F4dGxzX3NodXRkb3duKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKK3N0YXRpYyBpbnQgQ3VybF9heHRsc19zaHV0ZG93bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7CiAgIC8qIE91dGxpbmUgdGFrZW4gZnJvbSBvcGVuc3NsLmMgc2luY2UgZnVuY3Rpb25zIGFyZSBpbiBheFRMUyBjb21wYXQgbGF5ZXIuCiAgICAgIGF4VExTJ3MgZXJyb3Igc2V0IGlzIG11Y2ggc21hbGxlciwgc28gYSBsb3Qgb2YgZXJyb3ItaGFuZGxpbmcgd2FzIHJlbW92ZWQuCkBAIC01ODQsMTcgKzU3NSwxNyBAQAogCiAgIC8qIGF4VExTIGNvbXBhdCBsYXllciBkb2VzIG5vdGhpbmcgZm9yIFNTTF9zaHV0ZG93biwgc28gd2UgZG8gbm90aGluZyB0b28KICAgaWYoZGF0YS0+c2V0LmZ0cF9jY2MgPT0gQ1VSTEZUUFNTTF9DQ0NfQUNUSVZFKQotICAgICAgKHZvaWQpU1NMX3NodXRkb3duKGNvbm5zc2wtPnNzbCk7CisgICAgICAodm9pZClTU0xfc2h1dGRvd24oQkFDS0VORC0+c3NsKTsKICAgKi8KIAotICBpZihjb25uc3NsLT5zc2wpIHsKKyAgaWYoQkFDS0VORC0+c3NsKSB7CiAgICAgaW50IHdoYXQgPSBTT0NLRVRfUkVBREFCTEUoY29ubi0+c29ja1tzb2NraW5kZXhdLCBTU0xfU0hVVERPV05fVElNRU9VVCk7CiAgICAgaWYod2hhdCA+IDApIHsKICAgICAgIC8qIFNvbWV0aGluZyB0byByZWFkLCBsZXQncyBkbyBpdCBhbmQgaG9wZSB0aGF0IGl0IGlzIHRoZSBjbG9zZQogICAgICAgICAgbm90aWZ5IGFsZXJ0IGZyb20gdGhlIHNlcnZlci4gIGJ1ZiBpcyBtYW5hZ2VkIGludGVybmFsbHkgYnkKICAgICAgICAgIGF4VExTIGFuZCB3aWxsIGJlIHJlbGVhc2VkIHVwb24gY2FsbGluZyBzc2xfZnJlZSB2aWEKICAgICAgICAgIGZyZWVfc3NsX3N0cnVjdHMuICovCi0gICAgICBucmVhZCA9IChzc2l6ZV90KXNzbF9yZWFkKGNvbm5zc2wtPnNzbCwgJmJ1Zik7CisgICAgICBucmVhZCA9IChzc2l6ZV90KXNzbF9yZWFkKEJBQ0tFTkQtPnNzbCwgJmJ1Zik7CiAKICAgICAgIGlmKG5yZWFkIDwgU1NMX09LKSB7CiAgICAgICAgIGZhaWxmKGRhdGEsICJjbG9zZSBub3RpZnkgYWxlcnQgbm90IHJlY2VpdmVkIGR1cmluZyBzaHV0ZG93biIpOwpAQCAtNjMwLDcgKzYyMSw3IEBACiAKICAgKmVyciA9IENVUkxFX09LOwogICBpZihjb25uc3NsKSB7Ci0gICAgcmV0ID0gc3NsX3JlYWQoY29ubnNzbC0+c3NsLCAmcmVhZF9idWYpOworICAgIHJldCA9IHNzbF9yZWFkKEJBQ0tFTkQtPnNzbCwgJnJlYWRfYnVmKTsKICAgICBpZihyZXQgPiBTU0xfT0spIHsKICAgICAgIC8qIHNzbF9yZWFkIHJldHVybnMgU1NMX09LIGlmIHRoZXJlIGlzIG1vcmUgZGF0YSB0byByZWFkLCBzbyBpZiBpdCBpcwogICAgICAgICAgbGFyZ2VyLCB0aGVuIGFsbCBkYXRhIGhhcyBiZWVuIHJlYWQgYWxyZWFkeS4gICovCkBAIC02NjMsOSArNjU0LDEwIEBACiAgKiAgICAgMCBtZWFucyB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQKICAqICAgIC0xIG1lYW5zIHRoZSBjb25uZWN0aW9uIHN0YXR1cyBpcyB1bmtub3duCiAgKi8KLWludCBDdXJsX2F4dGxzX2NoZWNrX2N4bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pCitzdGF0aWMgaW50IEN1cmxfYXh0bHNfY2hlY2tfY3huKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubikKIHsKLSAgLyogb3BlbnNzbC5jIGxpbmU6IHJjID0gU1NMX3BlZWsoY29ubi0+c3NsW0ZJUlNUU09DS0VUXS5zc2wsICh2b2lkKikmYnVmLCAxKTsKKyAgLyogb3BlbnNzbC5jIGxpbmU6CisgICAgIHJjID0gU1NMX3BlZWsoY29ubi0+c3NsW0ZJUlNUU09DS0VUXS5iYWNrZW5kLT5zc2wsICh2b2lkKikmYnVmLCAxKTsKICAgICAgYXhUTFMgY29tcGF0IGxheWVyIGFsd2F5cyByZXR1cm5zIHRoZSBsYXN0IGFyZ3VtZW50LCBzbyBjb25uZWN0aW9uIGlzCiAgICAgIGFsd2F5cyBhbGl2ZT8gKi8KIApAQCAtNjczLDcgKzY2NSw3IEBACiAgICByZXR1cm4gMTsgLyogY29ubmVjdGlvbiBzdGlsbCBpbiBwbGFjZSAqLwogfQogCi12b2lkIEN1cmxfYXh0bHNfc2Vzc2lvbl9mcmVlKHZvaWQgKnB0cikKK3N0YXRpYyB2b2lkIEN1cmxfYXh0bHNfc2Vzc2lvbl9mcmVlKHZvaWQgKnB0cikKIHsKICAgKHZvaWQpcHRyOwogICAvKiBmcmVlIHRoZSBJRCAqLwpAQCAtNjgxLDE0ICs2NzMsMTMgQEAKICAgICAgY29tcGF0aWJpbGl0eSBsYXllciBkb2VzIG5vdGhpbmcsIHNvIHdlIGRvIG5vdGhpbmcgdG9vLiAqLwogfQogCi1zaXplX3QgQ3VybF9heHRsc192ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCitzdGF0aWMgc2l6ZV90IEN1cmxfYXh0bHNfdmVyc2lvbihjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQogewogICByZXR1cm4gc25wcmludGYoYnVmZmVyLCBzaXplLCAiYXhUTFMvJXMiLCBzc2xfdmVyc2lvbigpKTsKIH0KIAotQ1VSTGNvZGUgQ3VybF9heHRsc19yYW5kb20oc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmVudHJvcHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKQorc3RhdGljIENVUkxjb2RlIEN1cmxfYXh0bHNfcmFuZG9tKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW50cm9weSwgc2l6ZV90IGxlbmd0aCkKIHsKICAgc3RhdGljIGJvb2wgc3NsX3NlZWRlZCA9IEZBTFNFOwogICAodm9pZClkYXRhOwpAQCAtNzAzLDQgKzY5NCw0OSBAQAogICByZXR1cm4gQ1VSTEVfT0s7CiB9CiAKK3N0YXRpYyB2b2lkICpDdXJsX2F4dGxzX2dldF9pbnRlcm5hbHMoc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxJTkZPIGluZm8gVU5VU0VEX1BBUkFNKQoreworICAodm9pZClpbmZvOworICByZXR1cm4gQkFDS0VORC0+c3NsOworfQorCitjb25zdCBzdHJ1Y3QgQ3VybF9zc2wgQ3VybF9zc2xfYXh0bHMgPSB7CisgIHsgQ1VSTFNTTEJBQ0tFTkRfQVhUTFMsICJheHRscyIgfSwgLyogaW5mbyAqLworCisgIDAsIC8qIGhhdmVfY2FfcGF0aCAqLworICAwLCAvKiBoYXZlX2NlcnRpbmZvICovCisgIDAsIC8qIGhhdmVfcGlubmVkcHVia2V5ICovCisgIDAsIC8qIGhhdmVfc3NsX2N0eCAqLworICAwLCAvKiBzdXBwb3J0X2h0dHBzX3Byb3h5ICovCisKKyAgc2l6ZW9mKHN0cnVjdCBzc2xfYmFja2VuZF9kYXRhKSwKKworICAvKgorICAgKiBheFRMUyBoYXMgbm8gZ2xvYmFsIGluaXQuICBFdmVyeXRoaW5nIGlzIGRvbmUgdGhyb3VnaCBTU0wgYW5kIFNTTF9DVFgKKyAgICogc3RydWN0cyBzdG9yZWQgaW4gY29ubmVjdGRhdGEgc3RydWN0dXJlLgorICAgKi8KKyAgQ3VybF9ub25lX2luaXQsICAgICAgICAgICAgICAgICAvKiBpbml0ICovCisgIC8qIGF4VExTIGhhcyBubyBnbG9iYWwgY2xlYW51cC4gKi8KKyAgQ3VybF9ub25lX2NsZWFudXAsICAgICAgICAgICAgICAvKiBjbGVhbnVwICovCisgIEN1cmxfYXh0bHNfdmVyc2lvbiwgICAgICAgICAgICAgLyogdmVyc2lvbiAqLworICBDdXJsX2F4dGxzX2NoZWNrX2N4biwgICAgICAgICAgIC8qIGNoZWNrX2N4biAqLworICBDdXJsX2F4dGxzX3NodXRkb3duLCAgICAgICAgICAgIC8qIHNodXRkb3duICovCisgIEN1cmxfbm9uZV9kYXRhX3BlbmRpbmcsICAgICAgICAgLyogZGF0YV9wZW5kaW5nICovCisgIEN1cmxfYXh0bHNfcmFuZG9tLCAgICAgICAgICAgICAgLyogcmFuZG9tICovCisgIEN1cmxfbm9uZV9jZXJ0X3N0YXR1c19yZXF1ZXN0LCAgLyogY2VydF9zdGF0dXNfcmVxdWVzdCAqLworICBDdXJsX2F4dGxzX2Nvbm5lY3QsICAgICAgICAgICAgIC8qIGNvbm5lY3QgKi8KKyAgQ3VybF9heHRsc19jb25uZWN0X25vbmJsb2NraW5nLCAvKiBjb25uZWN0X25vbmJsb2NraW5nICovCisgIEN1cmxfYXh0bHNfZ2V0X2ludGVybmFscywgICAgICAgLyogZ2V0X2ludGVybmFscyAqLworICBDdXJsX2F4dGxzX2Nsb3NlLCAgICAgICAgICAgICAgIC8qIGNsb3NlICovCisgIEN1cmxfbm9uZV9jbG9zZV9hbGwsICAgICAgICAgICAgLyogY2xvc2VfYWxsICovCisgIEN1cmxfYXh0bHNfc2Vzc2lvbl9mcmVlLCAgICAgICAgLyogc2Vzc2lvbl9mcmVlICovCisgIEN1cmxfbm9uZV9zZXRfZW5naW5lLCAgICAgICAgICAgLyogc2V0X2VuZ2luZSAqLworICBDdXJsX25vbmVfc2V0X2VuZ2luZV9kZWZhdWx0LCAgIC8qIHNldF9lbmdpbmVfZGVmYXVsdCAqLworICBDdXJsX25vbmVfZW5naW5lc19saXN0LCAgICAgICAgIC8qIGVuZ2luZXNfbGlzdCAqLworICBDdXJsX25vbmVfZmFsc2Vfc3RhcnQsICAgICAgICAgIC8qIGZhbHNlX3N0YXJ0ICovCisgIEN1cmxfbm9uZV9tZDVzdW0sICAgICAgICAgICAgICAgLyogbWQ1c3VtICovCisgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hhMjU2c3VtICovCit9OworCiAjZW5kaWYgLyogVVNFX0FYVExTICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2F4dGxzLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2F4dGxzLmgKaW5kZXggNTM3OTdlYS4uM2YxZTEyOSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9heHRscy5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvYXh0bHMuaApAQCAtMjcsNDQgKzI3LDcgQEAKICNpbmNsdWRlICJjdXJsL2N1cmwuaCIKICNpbmNsdWRlICJ1cmxkYXRhLmgiCiAKLWludCBDdXJsX2F4dGxzX2luaXQodm9pZCk7Ci1pbnQgQ3VybF9heHRsc19jbGVhbnVwKHZvaWQpOwotQ1VSTGNvZGUgQ3VybF9heHRsc19jb25uZWN0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7Ci1DVVJMY29kZSBDdXJsX2F4dGxzX2Nvbm5lY3Rfbm9uYmxvY2tpbmcoCi0gICAgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAotICAgIGludCBzb2NraW5kZXgsCi0gICAgYm9vbCAqZG9uZSk7Ci0KLSAvKiBjbG9zZSBhIFNTTCBjb25uZWN0aW9uICovCi12b2lkIEN1cmxfYXh0bHNfY2xvc2Uoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLQotdm9pZCBDdXJsX2F4dGxzX3Nlc3Npb25fZnJlZSh2b2lkICpwdHIpOwotc2l6ZV90IEN1cmxfYXh0bHNfdmVyc2lvbihjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKTsKLWludCBDdXJsX2F4dGxzX3NodXRkb3duKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7Ci1pbnQgQ3VybF9heHRsc19jaGVja19jeG4oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKTsKLUNVUkxjb2RlIEN1cmxfYXh0bHNfcmFuZG9tKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplbnRyb3B5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCk7Ci0KLS8qIFNldCB0aGUgQVBJIGJhY2tlbmQgZGVmaW5pdGlvbiB0byBheFRMUyAqLwotI2RlZmluZSBDVVJMX1NTTF9CQUNLRU5EIENVUkxTU0xCQUNLRU5EX0FYVExTCi0KLS8qIEFQSSBzZXR1cCBmb3IgYXhUTFMgKi8KLSNkZWZpbmUgY3VybHNzbF9pbml0IEN1cmxfYXh0bHNfaW5pdAotI2RlZmluZSBjdXJsc3NsX2NsZWFudXAgQ3VybF9heHRsc19jbGVhbnVwCi0jZGVmaW5lIGN1cmxzc2xfY29ubmVjdCBDdXJsX2F4dGxzX2Nvbm5lY3QKLSNkZWZpbmUgY3VybHNzbF9jb25uZWN0X25vbmJsb2NraW5nIEN1cmxfYXh0bHNfY29ubmVjdF9ub25ibG9ja2luZwotI2RlZmluZSBjdXJsc3NsX3Nlc3Npb25fZnJlZSh4KSAgQ3VybF9heHRsc19zZXNzaW9uX2ZyZWUoeCkKLSNkZWZpbmUgY3VybHNzbF9jbG9zZV9hbGwoeCkgKCh2b2lkKXgpCi0jZGVmaW5lIGN1cmxzc2xfY2xvc2UgQ3VybF9heHRsc19jbG9zZQotI2RlZmluZSBjdXJsc3NsX3NodXRkb3duKHgseSkgQ3VybF9heHRsc19zaHV0ZG93bih4LHkpCi0jZGVmaW5lIGN1cmxzc2xfc2V0X2VuZ2luZSh4LHkpICgodm9pZCl4LCAodm9pZCl5LCBDVVJMRV9OT1RfQlVJTFRfSU4pCi0jZGVmaW5lIGN1cmxzc2xfc2V0X2VuZ2luZV9kZWZhdWx0KHgpICgodm9pZCl4LCBDVVJMRV9OT1RfQlVJTFRfSU4pCi0jZGVmaW5lIGN1cmxzc2xfZW5naW5lc19saXN0KHgpICgodm9pZCl4LCAoc3RydWN0IGN1cmxfc2xpc3QgKilOVUxMKQotI2RlZmluZSBjdXJsc3NsX3ZlcnNpb24gQ3VybF9heHRsc192ZXJzaW9uCi0jZGVmaW5lIGN1cmxzc2xfY2hlY2tfY3huKHgpIEN1cmxfYXh0bHNfY2hlY2tfY3huKHgpCi0jZGVmaW5lIGN1cmxzc2xfZGF0YV9wZW5kaW5nKHgseSkgKCh2b2lkKXgsICh2b2lkKXksIDApCi0jZGVmaW5lIGN1cmxzc2xfcmFuZG9tKHgseSx6KSBDdXJsX2F4dGxzX3JhbmRvbSh4LHkseikKK2V4dGVybiBjb25zdCBzdHJ1Y3QgQ3VybF9zc2wgQ3VybF9zc2xfYXh0bHM7CiAKICNlbmRpZiAvKiBVU0VfQVhUTFMgKi8KICNlbmRpZiAvKiBIRUFERVJfQ1VSTF9BWFRMU19IICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2N5YXNzbC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9jeWFzc2wuYwppbmRleCAwMWJmZGFiLi5iYTVlZTE1IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2N5YXNzbC5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvY3lhc3NsLmMKQEAgLTkxLDYgKzkxLDcgQEAKICNpbmNsdWRlICJ4NTA5YXNuMS5oIgogI2luY2x1ZGUgImN1cmxfcHJpbnRmLmgiCiAKKyNpbmNsdWRlIDxjeWFzc2wvb3BlbnNzbC9zc2wuaD4KICNpbmNsdWRlIDxjeWFzc2wvc3NsLmg+CiAjaWZkZWYgSEFWRV9DWUFTU0xfRVJST1JfU1NMX0gKICNpbmNsdWRlIDxjeWFzc2wvZXJyb3Itc3NsLmg+CkBAIC0xMTAsNiArMTExLDI1IEBACiAjZGVmaW5lIENZQVNTTF9NQVhfRVJST1JfU1ogODAKICNlbmRpZgogCisvKiBLRUVQX1BFRVJfQ0VSVCBpcyBhIHByb2R1Y3Qgb2YgdGhlIHByZXNlbmNlIG9mIGJ1aWxkIHRpbWUgc3ltYm9sCisgICBPUEVOU1NMX0VYVFJBIHdpdGhvdXQgTk9fQ0VSVFMsIGRlcGVuZGluZyBvbiB0aGUgdmVyc2lvbi4gS0VFUF9QRUVSX0NFUlQgaXMKKyAgIGluIHdvbGZTU0wncyBzZXR0aW5ncy5oLCBhbmQgdGhlIGxhdHRlciB0d28gYXJlIGJ1aWxkIHRpbWUgc3ltYm9scyBpbgorICAgb3B0aW9ucy5oLiAqLworI2lmbmRlZiBLRUVQX1BFRVJfQ0VSVAorI2lmIGRlZmluZWQoSEFWRV9DWUFTU0xfR0VUX1BFRVJfQ0VSVElGSUNBVEUpIHx8IFwKKyAgICBkZWZpbmVkKEhBVkVfV09MRlNTTF9HRVRfUEVFUl9DRVJUSUZJQ0FURSkgfHwgXAorICAgIChkZWZpbmVkKE9QRU5TU0xfRVhUUkEpICYmICFkZWZpbmVkKE5PX0NFUlRTKSkKKyNkZWZpbmUgS0VFUF9QRUVSX0NFUlQKKyNlbmRpZgorI2VuZGlmCisKK3N0cnVjdCBzc2xfYmFja2VuZF9kYXRhIHsKKyAgU1NMX0NUWCogY3R4OworICBTU0wqICAgICBoYW5kbGU7Cit9OworCisjZGVmaW5lIEJBQ0tFTkQgY29ubnNzbC0+YmFja2VuZAorCiBzdGF0aWMgQ3VybF9yZWN2IGN5YXNzbF9yZWN2Owogc3RhdGljIEN1cmxfc2VuZCBjeWFzc2xfc2VuZDsKIApAQCAtMTM2LDcgKzE1Niw3IEBACiAgIGNoYXIgZXJyb3JfYnVmZmVyW0NZQVNTTF9NQVhfRVJST1JfU1pdOwogICBjaGFyICpjaXBoZXJzOwogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKLSAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEqIGNvbnNzbCA9ICZjb25uLT5zc2xbc29ja2luZGV4XTsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEqIGNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CiAgIFNTTF9NRVRIT0QqIHJlcV9tZXRob2QgPSBOVUxMOwogICBjdXJsX3NvY2tldF90IHNvY2tmZCA9IGNvbm4tPnNvY2tbc29ja2luZGV4XTsKICNpZmRlZiBIQVZFX1NOSQpAQCAtMTQ2LDcgKzE2Niw3IEBACiAjZGVmaW5lIHVzZV9zbmkoeCkgIEN1cmxfbm9wX3N0bXQKICNlbmRpZgogCi0gIGlmKGNvbnNzbC0+c3RhdGUgPT0gc3NsX2Nvbm5lY3Rpb25fY29tcGxldGUpCisgIGlmKGNvbm5zc2wtPnN0YXRlID09IHNzbF9jb25uZWN0aW9uX2NvbXBsZXRlKQogICAgIHJldHVybiBDVVJMRV9PSzsKIAogICBpZihTU0xfQ09OTl9DT05GSUcodmVyc2lvbl9tYXgpICE9IENVUkxfU1NMVkVSU0lPTl9NQVhfTk9ORSkgewpAQCAtMjA1LDExICsyMjUsMTEgQEAKICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKICAgfQogCi0gIGlmKGNvbnNzbC0+Y3R4KQotICAgIFNTTF9DVFhfZnJlZShjb25zc2wtPmN0eCk7Ci0gIGNvbnNzbC0+Y3R4ID0gU1NMX0NUWF9uZXcocmVxX21ldGhvZCk7CisgIGlmKEJBQ0tFTkQtPmN0eCkKKyAgICBTU0xfQ1RYX2ZyZWUoQkFDS0VORC0+Y3R4KTsKKyAgQkFDS0VORC0+Y3R4ID0gU1NMX0NUWF9uZXcocmVxX21ldGhvZCk7CiAKLSAgaWYoIWNvbnNzbC0+Y3R4KSB7CisgIGlmKCFCQUNLRU5ELT5jdHgpIHsKICAgICBmYWlsZihkYXRhLCAiU1NMOiBjb3VsZG4ndCBjcmVhdGUgYSBjb250ZXh0ISIpOwogICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogICB9CkBAIC0yMjUsOSArMjQ1LDkgQEAKICAgICB2ZXJzaW9uLiBXZSB1c2Ugd29sZlNTTF9DVFhfU2V0TWluVmVyc2lvbiBhbmQgbm90IEN5YVNTTF9TZXRNaW5WZXJzaW9uCiAgICAgYmVjYXVzZSBvbmx5IHRoZSBmb3JtZXIgd2lsbCB3b3JrIGJlZm9yZSB0aGUgdXNlcidzIENUWCBjYWxsYmFjayBpcyBjYWxsZWQuCiAgICAgKi8KLSAgICBpZigod29sZlNTTF9DVFhfU2V0TWluVmVyc2lvbihjb25zc2wtPmN0eCwgV09MRlNTTF9UTFNWMSkgIT0gMSkgJiYKLSAgICAgICAod29sZlNTTF9DVFhfU2V0TWluVmVyc2lvbihjb25zc2wtPmN0eCwgV09MRlNTTF9UTFNWMV8xKSAhPSAxKSAmJgotICAgICAgICh3b2xmU1NMX0NUWF9TZXRNaW5WZXJzaW9uKGNvbnNzbC0+Y3R4LCBXT0xGU1NMX1RMU1YxXzIpICE9IDEpKSB7CisgICAgaWYoKHdvbGZTU0xfQ1RYX1NldE1pblZlcnNpb24oQkFDS0VORC0+Y3R4LCBXT0xGU1NMX1RMU1YxKSAhPSAxKSAmJgorICAgICAgICh3b2xmU1NMX0NUWF9TZXRNaW5WZXJzaW9uKEJBQ0tFTkQtPmN0eCwgV09MRlNTTF9UTFNWMV8xKSAhPSAxKSAmJgorICAgICAgICh3b2xmU1NMX0NUWF9TZXRNaW5WZXJzaW9uKEJBQ0tFTkQtPmN0eCwgV09MRlNTTF9UTFNWMV8yKSAhPSAxKSkgewogICAgICAgZmFpbGYoZGF0YSwgIlNTTDogY291bGRuJ3Qgc2V0IHRoZSBtaW5pbXVtIHByb3RvY29sIHZlcnNpb24iKTsKICAgICAgIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKICAgICB9CkBAIC0yMzcsNyArMjU3LDcgQEAKIAogICBjaXBoZXJzID0gU1NMX0NPTk5fQ09ORklHKGNpcGhlcl9saXN0KTsKICAgaWYoY2lwaGVycykgewotICAgIGlmKCFTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdChjb25zc2wtPmN0eCwgY2lwaGVycykpIHsKKyAgICBpZighU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QoQkFDS0VORC0+Y3R4LCBjaXBoZXJzKSkgewogICAgICAgZmFpbGYoZGF0YSwgImZhaWxlZCBzZXR0aW5nIGNpcGhlciBsaXN0OiAlcyIsIGNpcGhlcnMpOwogICAgICAgcmV0dXJuIENVUkxFX1NTTF9DSVBIRVI7CiAgICAgfQpAQCAtMjQ3LDcgKzI2Nyw3IEBACiAjaWZuZGVmIE5PX0ZJTEVTWVNURU0KICAgLyogbG9hZCB0cnVzdGVkIGNhY2VydCAqLwogICBpZihTU0xfQ09OTl9DT05GSUcoQ0FmaWxlKSkgewotICAgIGlmKDEgIT0gU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY29uc3NsLT5jdHgsCisgICAgaWYoMSAhPSBTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhCQUNLRU5ELT5jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9DT05OX0NPTkZJRyhDQWZpbGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ09OTl9DT05GSUcoQ0FwYXRoKSkpIHsKICAgICAgIGlmKFNTTF9DT05OX0NPTkZJRyh2ZXJpZnlwZWVyKSkgewpAQCAtMjg0LDcgKzMwNCw3IEBACiAgIGlmKFNTTF9TRVRfT1BUSU9OKGNlcnQpICYmIFNTTF9TRVRfT1BUSU9OKGtleSkpIHsKICAgICBpbnQgZmlsZV90eXBlID0gZG9fZmlsZV90eXBlKFNTTF9TRVRfT1BUSU9OKGNlcnRfdHlwZSkpOwogCi0gICAgaWYoU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfZmlsZShjb25zc2wtPmN0eCwgU1NMX1NFVF9PUFRJT04oY2VydCksCisgICAgaWYoU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfZmlsZShCQUNLRU5ELT5jdHgsIFNTTF9TRVRfT1BUSU9OKGNlcnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfdHlwZSkgIT0gMSkgewogICAgICAgZmFpbGYoZGF0YSwgInVuYWJsZSB0byB1c2UgY2xpZW50IGNlcnRpZmljYXRlIChubyBrZXkgb3Igd3JvbmcgcGFzcyIKICAgICAgICAgICAgICIgcGhyYXNlPykiKTsKQEAgLTI5Miw3ICszMTIsNyBAQAogICAgIH0KIAogICAgIGZpbGVfdHlwZSA9IGRvX2ZpbGVfdHlwZShTU0xfU0VUX09QVElPTihrZXlfdHlwZSkpOwotICAgIGlmKFNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShjb25zc2wtPmN0eCwgU1NMX1NFVF9PUFRJT04oa2V5KSwKKyAgICBpZihTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoQkFDS0VORC0+Y3R4LCBTU0xfU0VUX09QVElPTihrZXkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV90eXBlKSAhPSAxKSB7CiAgICAgICBmYWlsZihkYXRhLCAidW5hYmxlIHRvIHNldCBwcml2YXRlIGtleSIpOwogICAgICAgcmV0dXJuIENVUkxFX1NTTF9DT05ORUNUX0VSUk9SOwpAQCAtMzA0LDcgKzMyNCw3IEBACiAgICAqIGZhaWwgdG8gY29ubmVjdCBpZiB0aGUgdmVyaWZpY2F0aW9uIGZhaWxzLCBvciBpZiBpdCBzaG91bGQgY29udGludWUKICAgICogYW55d2F5LiBJbiB0aGUgbGF0dGVyIGNhc2UgdGhlIHJlc3VsdCBvZiB0aGUgdmVyaWZpY2F0aW9uIGlzIGNoZWNrZWQgd2l0aAogICAgKiBTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoKSBiZWxvdy4gKi8KLSAgU1NMX0NUWF9zZXRfdmVyaWZ5KGNvbnNzbC0+Y3R4LAorICBTU0xfQ1RYX3NldF92ZXJpZnkoQkFDS0VORC0+Y3R4LAogICAgICAgICAgICAgICAgICAgICAgU1NMX0NPTk5fQ09ORklHKHZlcmlmeXBlZXIpP1NTTF9WRVJJRllfUEVFUjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfVkVSSUZZX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKQEAgLTMyMyw3ICszNDMsNyBAQAogI2lmZGVmIEVOQUJMRV9JUFY2CiAgICAgICAgKDAgPT0gQ3VybF9pbmV0X3B0b24oQUZfSU5FVDYsIGhvc3RuYW1lLCAmYWRkcjYpKSAmJgogI2VuZGlmCi0gICAgICAgKEN5YVNTTF9DVFhfVXNlU05JKGNvbnNzbC0+Y3R4LCBDWUFTU0xfU05JX0hPU1RfTkFNRSwgaG9zdG5hbWUsCisgICAgICAgKEN5YVNTTF9DVFhfVXNlU05JKEJBQ0tFTkQtPmN0eCwgQ1lBU1NMX1NOSV9IT1NUX05BTUUsIGhvc3RuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgc2hvcnQpaG9zdG5hbWVfbGVuKSAhPSAxKSkgewogICAgICAgaW5mb2YoZGF0YSwgIldBUk5JTkc6IGZhaWxlZCB0byBjb25maWd1cmUgc2VydmVyIG5hbWUgaW5kaWNhdGlvbiAoU05JKSAiCiAgICAgICAgICAgICAiVExTIGV4dGVuc2lvblxuIik7CkBAIC0zMzYsMTUgKzM1NiwxNSBAQAogICAgICBodHRwczovL2dpdGh1Yi5jb20vd29sZlNTTC93b2xmc3NsL2lzc3Vlcy8zNjYKICAgICAgVGhlIHN1cHBvcnRlZCBjdXJ2ZXMgYmVsb3cgYXJlIHRob3NlIGFsc28gc3VwcG9ydGVkIGJ5IE9wZW5TU0wgMS4wLjIgYW5kCiAgICAgIGluIHRoZSBzYW1lIG9yZGVyLiAqLwotICBDeWFTU0xfQ1RYX1VzZVN1cHBvcnRlZEN1cnZlKGNvbnNzbC0+Y3R4LCAweDE3KTsgLyogc2VjcDI1NnIxICovCi0gIEN5YVNTTF9DVFhfVXNlU3VwcG9ydGVkQ3VydmUoY29uc3NsLT5jdHgsIDB4MTkpOyAvKiBzZWNwNTIxcjEgKi8KLSAgQ3lhU1NMX0NUWF9Vc2VTdXBwb3J0ZWRDdXJ2ZShjb25zc2wtPmN0eCwgMHgxOCk7IC8qIHNlY3AzODRyMSAqLworICBDeWFTU0xfQ1RYX1VzZVN1cHBvcnRlZEN1cnZlKEJBQ0tFTkQtPmN0eCwgMHgxNyk7IC8qIHNlY3AyNTZyMSAqLworICBDeWFTU0xfQ1RYX1VzZVN1cHBvcnRlZEN1cnZlKEJBQ0tFTkQtPmN0eCwgMHgxOSk7IC8qIHNlY3A1MjFyMSAqLworICBDeWFTU0xfQ1RYX1VzZVN1cHBvcnRlZEN1cnZlKEJBQ0tFTkQtPmN0eCwgMHgxOCk7IC8qIHNlY3AzODRyMSAqLwogI2VuZGlmCiAKICAgLyogZ2l2ZSBhcHBsaWNhdGlvbiBhIGNoYW5jZSB0byBpbnRlcmZlcmUgd2l0aCBTU0wgc2V0IHVwLiAqLwogICBpZihkYXRhLT5zZXQuc3NsLmZzc2xjdHgpIHsKICAgICBDVVJMY29kZSByZXN1bHQgPSBDVVJMRV9PSzsKLSAgICByZXN1bHQgPSAoKmRhdGEtPnNldC5zc2wuZnNzbGN0eCkoZGF0YSwgY29uc3NsLT5jdHgsCisgICAgcmVzdWx0ID0gKCpkYXRhLT5zZXQuc3NsLmZzc2xjdHgpKGRhdGEsIEJBQ0tFTkQtPmN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+c2V0LnNzbC5mc3NsY3R4cCk7CiAgICAgaWYocmVzdWx0KSB7CiAgICAgICBmYWlsZihkYXRhLCAiZXJyb3Igc2lnbmFsZWQgYnkgc3NsIGN0eCBjYWxsYmFjayIpOwpAQCAtMzYyLDEwICszODIsMTAgQEAKICNlbmRpZgogCiAgIC8qIExldCdzIG1ha2UgYW4gU1NMIHN0cnVjdHVyZSAqLwotICBpZihjb25zc2wtPmhhbmRsZSkKLSAgICBTU0xfZnJlZShjb25zc2wtPmhhbmRsZSk7Ci0gIGNvbnNzbC0+aGFuZGxlID0gU1NMX25ldyhjb25zc2wtPmN0eCk7Ci0gIGlmKCFjb25zc2wtPmhhbmRsZSkgeworICBpZihCQUNLRU5ELT5oYW5kbGUpCisgICAgU1NMX2ZyZWUoQkFDS0VORC0+aGFuZGxlKTsKKyAgQkFDS0VORC0+aGFuZGxlID0gU1NMX25ldyhCQUNLRU5ELT5jdHgpOworICBpZighQkFDS0VORC0+aGFuZGxlKSB7CiAgICAgZmFpbGYoZGF0YSwgIlNTTDogY291bGRuJ3QgY3JlYXRlIGEgY29udGV4dCAoaGFuZGxlKSEiKTsKICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKICAgfQpAQCAtMzg4LDcgKzQwOCw3IEBACiAgICAgc3RyY3B5KHByb3RvY29scyArIHN0cmxlbihwcm90b2NvbHMpLCBBTFBOX0hUVFBfMV8xKTsKICAgICBpbmZvZihkYXRhLCAiQUxQTiwgb2ZmZXJpbmcgJXNcbiIsIEFMUE5fSFRUUF8xXzEpOwogCi0gICAgaWYod29sZlNTTF9Vc2VBTFBOKGNvbnNzbC0+aGFuZGxlLCBwcm90b2NvbHMsCisgICAgaWYod29sZlNTTF9Vc2VBTFBOKEJBQ0tFTkQtPmhhbmRsZSwgcHJvdG9jb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpc3RybGVuKHByb3RvY29scyksCiAgICAgICAgICAgICAgICAgICAgICAgIFdPTEZTU0xfQUxQTl9DT05USU5VRV9PTl9NSVNNQVRDSCkgIT0gU1NMX1NVQ0NFU1MpIHsKICAgICAgIGZhaWxmKGRhdGEsICJTU0w6IGZhaWxlZCBzZXR0aW5nIEFMUE4gcHJvdG9jb2xzIik7CkBAIC00MDQsMTAgKzQyNCwxMCBAQAogICAgIEN1cmxfc3NsX3Nlc3Npb25pZF9sb2NrKGNvbm4pOwogICAgIGlmKCFDdXJsX3NzbF9nZXRzZXNzaW9uaWQoY29ubiwgJnNzbF9zZXNzaW9uaWQsIE5VTEwsIHNvY2tpbmRleCkpIHsKICAgICAgIC8qIHdlIGdvdCBhIHNlc3Npb24gaWQsIHVzZSBpdCEgKi8KLSAgICAgIGlmKCFTU0xfc2V0X3Nlc3Npb24oY29uc3NsLT5oYW5kbGUsIHNzbF9zZXNzaW9uaWQpKSB7CisgICAgICBpZighU1NMX3NldF9zZXNzaW9uKEJBQ0tFTkQtPmhhbmRsZSwgc3NsX3Nlc3Npb25pZCkpIHsKICAgICAgICAgQ3VybF9zc2xfc2Vzc2lvbmlkX3VubG9jayhjb25uKTsKICAgICAgICAgZmFpbGYoZGF0YSwgIlNTTDogU1NMX3NldF9zZXNzaW9uIGZhaWxlZDogJXMiLAotICAgICAgICAgICAgICBFUlJfZXJyb3Jfc3RyaW5nKFNTTF9nZXRfZXJyb3IoY29uc3NsLT5oYW5kbGUsIDApLAorICAgICAgICAgICAgICBFUlJfZXJyb3Jfc3RyaW5nKFNTTF9nZXRfZXJyb3IoQkFDS0VORC0+aGFuZGxlLCAwKSwKICAgICAgICAgICAgICAgZXJyb3JfYnVmZmVyKSk7CiAgICAgICAgIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKICAgICAgIH0KQEAgLTQxOCwxMiArNDM4LDEyIEBACiAgIH0KIAogICAvKiBwYXNzIHRoZSByYXcgc29ja2V0IGludG8gdGhlIFNTTCBsYXllciAqLwotICBpZighU1NMX3NldF9mZChjb25zc2wtPmhhbmRsZSwgKGludClzb2NrZmQpKSB7CisgIGlmKCFTU0xfc2V0X2ZkKEJBQ0tFTkQtPmhhbmRsZSwgKGludClzb2NrZmQpKSB7CiAgICAgZmFpbGYoZGF0YSwgIlNTTDogU1NMX3NldF9mZCBmYWlsZWQiKTsKICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CiAgIH0KIAotICBjb25zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPSBzc2xfY29ubmVjdF8yOworICBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlID0gc3NsX2Nvbm5lY3RfMjsKICAgcmV0dXJuIENVUkxFX09LOwogfQogCkBAIC00MzQsNyArNDU0LDcgQEAKIHsKICAgaW50IHJldCA9IC0xOwogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKLSAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEqIGNvbnNzbCA9ICZjb25uLT5zc2xbc29ja2luZGV4XTsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEqIGNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CiAgIGNvbnN0IGNoYXIgKiBjb25zdCBob3N0bmFtZSA9IFNTTF9JU19QUk9YWSgpID8gY29ubi0+aHR0cF9wcm94eS5ob3N0Lm5hbWUgOgogICAgIGNvbm4tPmhvc3QubmFtZTsKICAgY29uc3QgY2hhciAqIGNvbnN0IGRpc3BuYW1lID0gU1NMX0lTX1BST1hZKCkgPwpAQCAtNDQ4LDIyICs0NjgsMjIgQEAKIAogICAvKiBFbmFibGUgUkZDMjgxOCBjaGVja3MgKi8KICAgaWYoU1NMX0NPTk5fQ09ORklHKHZlcmlmeWhvc3QpKSB7Ci0gICAgcmV0ID0gQ3lhU1NMX2NoZWNrX2RvbWFpbl9uYW1lKGNvbnNzbC0+aGFuZGxlLCBob3N0bmFtZSk7CisgICAgcmV0ID0gQ3lhU1NMX2NoZWNrX2RvbWFpbl9uYW1lKEJBQ0tFTkQtPmhhbmRsZSwgaG9zdG5hbWUpOwogICAgIGlmKHJldCA9PSBTU0xfRkFJTFVSRSkKICAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogICB9CiAKLSAgcmV0ID0gU1NMX2Nvbm5lY3QoY29uc3NsLT5oYW5kbGUpOworICByZXQgPSBTU0xfY29ubmVjdChCQUNLRU5ELT5oYW5kbGUpOwogICBpZihyZXQgIT0gMSkgewogICAgIGNoYXIgZXJyb3JfYnVmZmVyW0NZQVNTTF9NQVhfRVJST1JfU1pdOwotICAgIGludCAgZGV0YWlsID0gU1NMX2dldF9lcnJvcihjb25zc2wtPmhhbmRsZSwgcmV0KTsKKyAgICBpbnQgIGRldGFpbCA9IFNTTF9nZXRfZXJyb3IoQkFDS0VORC0+aGFuZGxlLCByZXQpOwogCiAgICAgaWYoU1NMX0VSUk9SX1dBTlRfUkVBRCA9PSBkZXRhaWwpIHsKLSAgICAgIGNvbnNzbC0+Y29ubmVjdGluZ19zdGF0ZSA9IHNzbF9jb25uZWN0XzJfcmVhZGluZzsKKyAgICAgIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPSBzc2xfY29ubmVjdF8yX3JlYWRpbmc7CiAgICAgICByZXR1cm4gQ1VSTEVfT0s7CiAgICAgfQogICAgIGVsc2UgaWYoU1NMX0VSUk9SX1dBTlRfV1JJVEUgPT0gZGV0YWlsKSB7Ci0gICAgICBjb25zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPSBzc2xfY29ubmVjdF8yX3dyaXRpbmc7CisgICAgICBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlID0gc3NsX2Nvbm5lY3RfMl93cml0aW5nOwogICAgICAgcmV0dXJuIENVUkxFX09LOwogICAgIH0KICAgICAvKiBUaGVyZSBpcyBubyBlYXN5IHdheSB0byBvdmVycmlkZSBvbmx5IHRoZSBDTiBtYXRjaGluZy4KQEAgLTUyNCw3ICs1NDQsNyBAQAogICAgIGN1cmxfYXNuMUVsZW1lbnQgKnB1YmtleTsKICAgICBDVVJMY29kZSByZXN1bHQ7CiAKLSAgICB4NTA5ID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKGNvbnNzbC0+aGFuZGxlKTsKKyAgICB4NTA5ID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKEJBQ0tFTkQtPmhhbmRsZSk7CiAgICAgaWYoIXg1MDkpIHsKICAgICAgIGZhaWxmKGRhdGEsICJTU0w6IGZhaWxlZCByZXRyaWV2aW5nIHNlcnZlciBjZXJ0aWZpY2F0ZSIpOwogICAgICAgcmV0dXJuIENVUkxFX1NTTF9QSU5ORURQVUJLRVlOT1RNQVRDSDsKQEAgLTU2Niw3ICs1ODYsNyBAQAogICAgIGNoYXIgKnByb3RvY29sID0gTlVMTDsKICAgICB1bnNpZ25lZCBzaG9ydCBwcm90b2NvbF9sZW4gPSAwOwogCi0gICAgcmMgPSB3b2xmU1NMX0FMUE5fR2V0UHJvdG9jb2woY29uc3NsLT5oYW5kbGUsICZwcm90b2NvbCwgJnByb3RvY29sX2xlbik7CisgICAgcmMgPSB3b2xmU1NMX0FMUE5fR2V0UHJvdG9jb2woQkFDS0VORC0+aGFuZGxlLCAmcHJvdG9jb2wsICZwcm90b2NvbF9sZW4pOwogCiAgICAgaWYocmMgPT0gU1NMX1NVQ0NFU1MpIHsKICAgICAgIGluZm9mKGRhdGEsICJBTFBOLCBzZXJ2ZXIgYWNjZXB0ZWQgdG8gdXNlICUuKnNcbiIsIHByb3RvY29sX2xlbiwKQEAgLTU5NSwxMSArNjE1LDExIEBACiAgIH0KICNlbmRpZiAvKiBIQVZFX0FMUE4gKi8KIAotICBjb25zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPSBzc2xfY29ubmVjdF8zOworICBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlID0gc3NsX2Nvbm5lY3RfMzsKICNpZiAoTElCQ1lBU1NMX1ZFUlNJT05fSEVYID49IDB4MDMwMDkwMTApCiAgIGluZm9mKGRhdGEsICJTU0wgY29ubmVjdGlvbiB1c2luZyAlcyAvICVzXG4iLAotICAgICAgICB3b2xmU1NMX2dldF92ZXJzaW9uKGNvbnNzbC0+aGFuZGxlKSwKLSAgICAgICAgd29sZlNTTF9nZXRfY2lwaGVyX25hbWUoY29uc3NsLT5oYW5kbGUpKTsKKyAgICAgICAgd29sZlNTTF9nZXRfdmVyc2lvbihCQUNLRU5ELT5oYW5kbGUpLAorICAgICAgICB3b2xmU1NMX2dldF9jaXBoZXJfbmFtZShCQUNLRU5ELT5oYW5kbGUpKTsKICNlbHNlCiAgIGluZm9mKGRhdGEsICJTU0wgY29ubmVjdGVkXG4iKTsKICNlbmRpZgpAQCAtNjIzLDcgKzY0Myw3IEBACiAgICAgU1NMX1NFU1NJT04gKm91cl9zc2xfc2Vzc2lvbmlkOwogICAgIHZvaWQgKm9sZF9zc2xfc2Vzc2lvbmlkID0gTlVMTDsKIAotICAgIG91cl9zc2xfc2Vzc2lvbmlkID0gU1NMX2dldF9zZXNzaW9uKGNvbm5zc2wtPmhhbmRsZSk7CisgICAgb3VyX3NzbF9zZXNzaW9uaWQgPSBTU0xfZ2V0X3Nlc3Npb24oQkFDS0VORC0+aGFuZGxlKTsKIAogICAgIEN1cmxfc3NsX3Nlc3Npb25pZF9sb2NrKGNvbm4pOwogICAgIGluY2FjaGUgPSAhKEN1cmxfc3NsX2dldHNlc3Npb25pZChjb25uLCAmb2xkX3NzbF9zZXNzaW9uaWQsIE5VTEwsCkBAIC02NjAsMTIgKzY4MCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxjb2RlICpjdXJsY29kZSkKIHsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CiAgIGNoYXIgZXJyb3JfYnVmZmVyW0NZQVNTTF9NQVhfRVJST1JfU1pdOwogICBpbnQgIG1lbWxlbiA9IChsZW4gPiAoc2l6ZV90KUlOVF9NQVgpID8gSU5UX01BWCA6IChpbnQpbGVuOwotICBpbnQgIHJjICAgICA9IFNTTF93cml0ZShjb25uLT5zc2xbc29ja2luZGV4XS5oYW5kbGUsIG1lbSwgbWVtbGVuKTsKKyAgaW50ICByYyAgICAgPSBTU0xfd3JpdGUoQkFDS0VORC0+aGFuZGxlLCBtZW0sIG1lbWxlbik7CiAKICAgaWYocmMgPCAwKSB7Ci0gICAgaW50IGVyciA9IFNTTF9nZXRfZXJyb3IoY29ubi0+c3NsW3NvY2tpbmRleF0uaGFuZGxlLCByYyk7CisgICAgaW50IGVyciA9IFNTTF9nZXRfZXJyb3IoQkFDS0VORC0+aGFuZGxlLCByYyk7CiAKICAgICBzd2l0Y2goZXJyKSB7CiAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgpAQCAtNjg0LDE4ICs3MDUsMTggQEAKICAgcmV0dXJuIHJjOwogfQogCi12b2lkIEN1cmxfY3lhc3NsX2Nsb3NlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKK3N0YXRpYyB2b2lkIEN1cmxfY3lhc3NsX2Nsb3NlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKLSAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbnNzbCA9ICZjb25uLT5zc2xbc29ja2luZGV4XTsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CiAKLSAgaWYoY29uc3NsLT5oYW5kbGUpIHsKLSAgICAodm9pZClTU0xfc2h1dGRvd24oY29uc3NsLT5oYW5kbGUpOwotICAgIFNTTF9mcmVlKGNvbnNzbC0+aGFuZGxlKTsKLSAgICBjb25zc2wtPmhhbmRsZSA9IE5VTEw7CisgIGlmKEJBQ0tFTkQtPmhhbmRsZSkgeworICAgICh2b2lkKVNTTF9zaHV0ZG93bihCQUNLRU5ELT5oYW5kbGUpOworICAgIFNTTF9mcmVlKEJBQ0tFTkQtPmhhbmRsZSk7CisgICAgQkFDS0VORC0+aGFuZGxlID0gTlVMTDsKICAgfQotICBpZihjb25zc2wtPmN0eCkgewotICAgIFNTTF9DVFhfZnJlZShjb25zc2wtPmN0eCk7Ci0gICAgY29uc3NsLT5jdHggPSBOVUxMOworICBpZihCQUNLRU5ELT5jdHgpIHsKKyAgICBTU0xfQ1RYX2ZyZWUoQkFDS0VORC0+Y3R4KTsKKyAgICBCQUNLRU5ELT5jdHggPSBOVUxMOwogICB9CiB9CiAKQEAgLTcwNSwxMiArNzI2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxjb2RlICpjdXJsY29kZSkKIHsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW251bV07CiAgIGNoYXIgZXJyb3JfYnVmZmVyW0NZQVNTTF9NQVhfRVJST1JfU1pdOwogICBpbnQgIGJ1ZmZzaXplID0gKGJ1ZmZlcnNpemUgPiAoc2l6ZV90KUlOVF9NQVgpID8gSU5UX01BWCA6IChpbnQpYnVmZmVyc2l6ZTsKLSAgaW50ICBucmVhZCAgICA9IFNTTF9yZWFkKGNvbm4tPnNzbFtudW1dLmhhbmRsZSwgYnVmLCBidWZmc2l6ZSk7CisgIGludCAgbnJlYWQgICAgPSBTU0xfcmVhZChCQUNLRU5ELT5oYW5kbGUsIGJ1ZiwgYnVmZnNpemUpOwogCiAgIGlmKG5yZWFkIDwgMCkgewotICAgIGludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKGNvbm4tPnNzbFtudW1dLmhhbmRsZSwgbnJlYWQpOworICAgIGludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKEJBQ0tFTkQtPmhhbmRsZSwgbnJlYWQpOwogCiAgICAgc3dpdGNoKGVycikgewogICAgIGNhc2UgU1NMX0VSUk9SX1pFUk9fUkVUVVJOOiAvKiBubyBtb3JlIGRhdGEgKi8KQEAgLTczMiwxNCArNzU0LDE0IEBACiB9CiAKIAotdm9pZCBDdXJsX2N5YXNzbF9zZXNzaW9uX2ZyZWUodm9pZCAqcHRyKQorc3RhdGljIHZvaWQgQ3VybF9jeWFzc2xfc2Vzc2lvbl9mcmVlKHZvaWQgKnB0cikKIHsKICAgKHZvaWQpcHRyOwogICAvKiBDeWFTU0wgcmV1c2VzIHNlc3Npb25zIG9uIG93biwgbm8gZnJlZSAqLwogfQogCiAKLXNpemVfdCBDdXJsX2N5YXNzbF92ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCitzdGF0aWMgc2l6ZV90IEN1cmxfY3lhc3NsX3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKICNpZiBMSUJDWUFTU0xfVkVSU0lPTl9IRVggPj0gMHgwMzAwNjAwMAogICByZXR1cm4gc25wcmludGYoYnVmZmVyLCBzaXplLCAid29sZlNTTC8lcyIsIHdvbGZTU0xfbGliX3ZlcnNpb24oKSk7CkBAIC03NTMsMTYgKzc3NSwxOCBAQAogfQogCiAKLWludCBDdXJsX2N5YXNzbF9pbml0KHZvaWQpCitzdGF0aWMgaW50IEN1cmxfY3lhc3NsX2luaXQodm9pZCkKIHsKICAgcmV0dXJuIChDeWFTU0xfSW5pdCgpID09IFNTTF9TVUNDRVNTKTsKIH0KIAogCi1ib29sIEN1cmxfY3lhc3NsX2RhdGFfcGVuZGluZyhjb25zdCBzdHJ1Y3QgY29ubmVjdGRhdGEqIGNvbm4sIGludCBjb25uaW5kZXgpCitzdGF0aWMgYm9vbCBDdXJsX2N5YXNzbF9kYXRhX3BlbmRpbmcoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhKiBjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25uaW5kZXgpCiB7Ci0gIGlmKGNvbm4tPnNzbFtjb25uaW5kZXhdLmhhbmRsZSkgICAvKiBTU0wgaXMgaW4gdXNlICovCi0gICAgcmV0dXJuICgwICE9IFNTTF9wZW5kaW5nKGNvbm4tPnNzbFtjb25uaW5kZXhdLmhhbmRsZSkpID8gVFJVRSA6IEZBTFNFOworICBjb25zdCBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbY29ubmluZGV4XTsKKyAgaWYoQkFDS0VORC0+aGFuZGxlKSAgIC8qIFNTTCBpcyBpbiB1c2UgKi8KKyAgICByZXR1cm4gKDAgIT0gU1NMX3BlbmRpbmcoQkFDS0VORC0+aGFuZGxlKSkgPyBUUlVFIDogRkFMU0U7CiAgIGVsc2UKICAgICByZXR1cm4gRkFMU0U7CiB9CkBAIC03NzIsMTQgKzc5NiwxNCBAQAogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2h1dCBkb3duIHRoZSBTU0wgbGF5ZXIgYnV0IGtlZXAgdGhlCiAgKiBzb2NrZXQgb3BlbiAoQ0NDIC0gQ2xlYXIgQ29tbWFuZCBDaGFubmVsKQogICovCi1pbnQgQ3VybF9jeWFzc2xfc2h1dGRvd24oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQorc3RhdGljIGludCBDdXJsX2N5YXNzbF9zaHV0ZG93bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7CiAgIGludCByZXR2YWwgPSAwOwogICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbc29ja2luZGV4XTsKIAotICBpZihjb25uc3NsLT5oYW5kbGUpIHsKLSAgICBTU0xfZnJlZShjb25uc3NsLT5oYW5kbGUpOwotICAgIGNvbm5zc2wtPmhhbmRsZSA9IE5VTEw7CisgIGlmKEJBQ0tFTkQtPmhhbmRsZSkgeworICAgIFNTTF9mcmVlKEJBQ0tFTkQtPmhhbmRsZSk7CisgICAgQkFDS0VORC0+aGFuZGxlID0gTlVMTDsKICAgfQogICByZXR1cm4gcmV0dmFsOwogfQpAQCAtODA0LDcgKzgyOCw3IEBACiAgICAgcmV0dXJuIENVUkxFX09LOwogICB9CiAKLSAgaWYoc3NsX2Nvbm5lY3RfMT09Y29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSkgeworICBpZihzc2xfY29ubmVjdF8xID09IGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUpIHsKICAgICAvKiBGaW5kIG91dCBob3cgbXVjaCBtb3JlIHRpbWUgd2UncmUgYWxsb3dlZCAqLwogICAgIHRpbWVvdXRfbXMgPSBDdXJsX3RpbWVsZWZ0KGRhdGEsIE5VTEwsIFRSVUUpOwogCkBAIC04MzYsOSArODYwLDkgQEAKICAgICBpZihjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlID09IHNzbF9jb25uZWN0XzJfcmVhZGluZwogICAgICAgIHx8IGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPT0gc3NsX2Nvbm5lY3RfMl93cml0aW5nKSB7CiAKLSAgICAgIGN1cmxfc29ja2V0X3Qgd3JpdGVmZCA9IHNzbF9jb25uZWN0XzJfd3JpdGluZz09CisgICAgICBjdXJsX3NvY2tldF90IHdyaXRlZmQgPSBzc2xfY29ubmVjdF8yX3dyaXRpbmcgPT0KICAgICAgICAgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZT9zb2NrZmQ6Q1VSTF9TT0NLRVRfQkFEOwotICAgICAgY3VybF9zb2NrZXRfdCByZWFkZmQgPSBzc2xfY29ubmVjdF8yX3JlYWRpbmc9PQorICAgICAgY3VybF9zb2NrZXRfdCByZWFkZmQgPSBzc2xfY29ubmVjdF8yX3JlYWRpbmcgPT0KICAgICAgICAgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZT9zb2NrZmQ6Q1VSTF9TT0NLRVRfQkFEOwogCiAgICAgICB3aGF0ID0gQ3VybF9zb2NrZXRfY2hlY2socmVhZGZkLCBDVVJMX1NPQ0tFVF9CQUQsIHdyaXRlZmQsCkBAIC04OTksMTggKzkyMywxNCBAQAogfQogCiAKLUNVUkxjb2RlCi1DdXJsX2N5YXNzbF9jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqZG9uZSkKK3N0YXRpYyBDVVJMY29kZSBDdXJsX2N5YXNzbF9jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsIGJvb2wgKmRvbmUpCiB7CiAgIHJldHVybiBjeWFzc2xfY29ubmVjdF9jb21tb24oY29ubiwgc29ja2luZGV4LCBUUlVFLCBkb25lKTsKIH0KIAogCi1DVVJMY29kZQotQ3VybF9jeWFzc2xfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgpCitzdGF0aWMgQ1VSTGNvZGUgQ3VybF9jeWFzc2xfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7CiAgIENVUkxjb2RlIHJlc3VsdDsKICAgYm9vbCBkb25lID0gRkFMU0U7CkBAIC05MjQsOSArOTQ0LDggQEAKICAgcmV0dXJuIENVUkxFX09LOwogfQogCi1DVVJMY29kZSBDdXJsX2N5YXNzbF9yYW5kb20oc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplbnRyb3B5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpCitzdGF0aWMgQ1VSTGNvZGUgQ3VybF9jeWFzc2xfcmFuZG9tKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmVudHJvcHksIHNpemVfdCBsZW5ndGgpCiB7CiAgIFJORyBybmc7CiAgICh2b2lkKWRhdGE7CkBAIC05MzksMTAgKzk1OCwxMCBAQAogICByZXR1cm4gQ1VSTEVfT0s7CiB9CiAKLXZvaWQgQ3VybF9jeWFzc2xfc2hhMjU2c3VtKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRtcCwgLyogaW5wdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdG1wbGVuLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNoYTI1NnN1bSAvKiBvdXRwdXQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHVudXNlZCkKK3N0YXRpYyB2b2lkIEN1cmxfY3lhc3NsX3NoYTI1NnN1bShjb25zdCB1bnNpZ25lZCBjaGFyICp0bXAsIC8qIGlucHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRtcGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzaGEyNTZzdW0gLyogb3V0cHV0ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB1bnVzZWQpCiB7CiAgIFNoYTI1NiBTSEEyNTZwdzsKICAgKHZvaWQpdW51c2VkOwpAQCAtOTUxLDQgKzk3MCw0OCBAQAogICBTaGEyNTZGaW5hbCgmU0hBMjU2cHcsIHNoYTI1NnN1bSk7CiB9CiAKK3N0YXRpYyB2b2lkICpDdXJsX2N5YXNzbF9nZXRfaW50ZXJuYWxzKHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTElORk8gaW5mbyBVTlVTRURfUEFSQU0pCit7CisgICh2b2lkKWluZm87CisgIHJldHVybiBCQUNLRU5ELT5oYW5kbGU7Cit9CisKK2NvbnN0IHN0cnVjdCBDdXJsX3NzbCBDdXJsX3NzbF9jeWFzc2wgPSB7CisgIHsgQ1VSTFNTTEJBQ0tFTkRfV09MRlNTTCwgIldvbGZTU0wiIH0sIC8qIGluZm8gKi8KKworICAwLCAvKiBoYXZlX2NhX3BhdGggKi8KKyAgMCwgLyogaGF2ZV9jZXJ0aW5mbyAqLworI2lmZGVmIEtFRVBfUEVFUl9DRVJUCisgIDEsIC8qIGhhdmVfcGlubmVkcHVia2V5ICovCisjZWxzZQorICAwLCAvKiBoYXZlX3Bpbm5lZHB1YmtleSAqLworI2VuZGlmCisgIDEsIC8qIGhhdmVfc3NsX2N0eCAqLworICAwLCAvKiBzdXBwb3J0X2h0dHBzX3Byb3h5ICovCisKKyAgc2l6ZW9mKHN0cnVjdCBzc2xfYmFja2VuZF9kYXRhKSwKKworICBDdXJsX2N5YXNzbF9pbml0LCAgICAgICAgICAgICAgICAvKiBpbml0ICovCisgIEN1cmxfbm9uZV9jbGVhbnVwLCAgICAgICAgICAgICAgIC8qIGNsZWFudXAgKi8KKyAgQ3VybF9jeWFzc2xfdmVyc2lvbiwgICAgICAgICAgICAgLyogdmVyc2lvbiAqLworICBDdXJsX25vbmVfY2hlY2tfY3huLCAgICAgICAgICAgICAvKiBjaGVja19jeG4gKi8KKyAgQ3VybF9jeWFzc2xfc2h1dGRvd24sICAgICAgICAgICAgLyogc2h1dGRvd24gKi8KKyAgQ3VybF9jeWFzc2xfZGF0YV9wZW5kaW5nLCAgICAgICAgLyogZGF0YV9wZW5kaW5nICovCisgIEN1cmxfY3lhc3NsX3JhbmRvbSwgICAgICAgICAgICAgIC8qIHJhbmRvbSAqLworICBDdXJsX25vbmVfY2VydF9zdGF0dXNfcmVxdWVzdCwgICAvKiBjZXJ0X3N0YXR1c19yZXF1ZXN0ICovCisgIEN1cmxfY3lhc3NsX2Nvbm5lY3QsICAgICAgICAgICAgIC8qIGNvbm5lY3QgKi8KKyAgQ3VybF9jeWFzc2xfY29ubmVjdF9ub25ibG9ja2luZywgLyogY29ubmVjdF9ub25ibG9ja2luZyAqLworICBDdXJsX2N5YXNzbF9nZXRfaW50ZXJuYWxzLCAgICAgICAvKiBnZXRfaW50ZXJuYWxzICovCisgIEN1cmxfY3lhc3NsX2Nsb3NlLCAgICAgICAgICAgICAgIC8qIGNsb3NlICovCisgIEN1cmxfbm9uZV9jbG9zZV9hbGwsICAgICAgICAgICAgIC8qIGNsb3NlX2FsbCAqLworICBDdXJsX2N5YXNzbF9zZXNzaW9uX2ZyZWUsICAgICAgICAvKiBzZXNzaW9uX2ZyZWUgKi8KKyAgQ3VybF9ub25lX3NldF9lbmdpbmUsICAgICAgICAgICAgLyogc2V0X2VuZ2luZSAqLworICBDdXJsX25vbmVfc2V0X2VuZ2luZV9kZWZhdWx0LCAgICAvKiBzZXRfZW5naW5lX2RlZmF1bHQgKi8KKyAgQ3VybF9ub25lX2VuZ2luZXNfbGlzdCwgICAgICAgICAgLyogZW5naW5lc19saXN0ICovCisgIEN1cmxfbm9uZV9mYWxzZV9zdGFydCwgICAgICAgICAgIC8qIGZhbHNlX3N0YXJ0ICovCisgIEN1cmxfbm9uZV9tZDVzdW0sICAgICAgICAgICAgICAgIC8qIG1kNXN1bSAqLworICBDdXJsX2N5YXNzbF9zaGEyNTZzdW0gICAgICAgICAgICAvKiBzaGEyNTZzdW0gKi8KK307CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9jeWFzc2wuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvY3lhc3NsLmgKaW5kZXggZjQ3NzE5ZS4uMDFlMTFjYyAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9jeWFzc2wuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2N5YXNzbC5oCkBAIC0yNSw2OCArMjUsNyBAQAogCiAjaWZkZWYgVVNFX0NZQVNTTAogCi0vKiBLRUVQX1BFRVJfQ0VSVCBpcyBhIHByb2R1Y3Qgb2YgdGhlIHByZXNlbmNlIG9mIGJ1aWxkIHRpbWUgc3ltYm9sCi0gICBPUEVOU1NMX0VYVFJBIHdpdGhvdXQgTk9fQ0VSVFMsIGRlcGVuZGluZyBvbiB0aGUgdmVyc2lvbi4gS0VFUF9QRUVSX0NFUlQgaXMKLSAgIGluIHdvbGZTU0wncyBzZXR0aW5ncy5oLCBhbmQgdGhlIGxhdHRlciB0d28gYXJlIGJ1aWxkIHRpbWUgc3ltYm9scyBpbgotICAgb3B0aW9ucy5oLiAqLwotI2lmbmRlZiBLRUVQX1BFRVJfQ0VSVAotI2lmIGRlZmluZWQoSEFWRV9DWUFTU0xfR0VUX1BFRVJfQ0VSVElGSUNBVEUpIHx8IFwKLSAgICBkZWZpbmVkKEhBVkVfV09MRlNTTF9HRVRfUEVFUl9DRVJUSUZJQ0FURSkgfHwgXAotICAgIChkZWZpbmVkKE9QRU5TU0xfRVhUUkEpICYmICFkZWZpbmVkKE5PX0NFUlRTKSkKLSNkZWZpbmUgS0VFUF9QRUVSX0NFUlQKLSNlbmRpZgotI2VuZGlmCi0KLUNVUkxjb2RlIEN1cmxfY3lhc3NsX2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLWJvb2wgQ3VybF9jeWFzc2xfZGF0YV9wZW5kaW5nKGNvbnN0IHN0cnVjdCBjb25uZWN0ZGF0YSogY29ubiwgaW50IGNvbm5pbmRleCk7Ci1pbnQgQ3VybF9jeWFzc2xfc2h1dGRvd24oc3RydWN0IGNvbm5lY3RkYXRhKiBjb25uLCBpbnQgc29ja2luZGV4KTsKLQotIC8qIGNsb3NlIGEgU1NMIGNvbm5lY3Rpb24gKi8KLXZvaWQgQ3VybF9jeWFzc2xfY2xvc2Uoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLQotdm9pZCBDdXJsX2N5YXNzbF9zZXNzaW9uX2ZyZWUodm9pZCAqcHRyKTsKLXNpemVfdCBDdXJsX2N5YXNzbF92ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOwotaW50IEN1cmxfY3lhc3NsX3NodXRkb3duKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7Ci1pbnQgQ3VybF9jeWFzc2xfaW5pdCh2b2lkKTsKLUNVUkxjb2RlIEN1cmxfY3lhc3NsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpkb25lKTsKLUNVUkxjb2RlIEN1cmxfY3lhc3NsX3JhbmRvbShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmVudHJvcHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCk7Ci12b2lkIEN1cmxfY3lhc3NsX3NoYTI1NnN1bShjb25zdCB1bnNpZ25lZCBjaGFyICp0bXAsIC8qIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICBzaXplX3QgdG1wbGVuLAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqc2hhMjU2c3VtLCAvKiBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB1bnVzZWQpOwotCi0vKiBTZXQgdGhlIEFQSSBiYWNrZW5kIGRlZmluaXRpb24gdG8gQ3lhU1NMICovCi0jZGVmaW5lIENVUkxfU1NMX0JBQ0tFTkQgQ1VSTFNTTEJBQ0tFTkRfQ1lBU1NMCi0KLS8qIHRoaXMgYmFja2VuZCBzdXBwb3J0cyBDVVJMT1BUX1NTTF9DVFhfKiAqLwotI2RlZmluZSBoYXZlX2N1cmxzc2xfc3NsX2N0eCAxCi0KLSNpZmRlZiBLRUVQX1BFRVJfQ0VSVAotLyogdGhpcyBiYWNrZW5kIHN1cHBvcnRzIENVUkxPUFRfUElOTkVEUFVCTElDS0VZICovCi0jZGVmaW5lIGhhdmVfY3VybHNzbF9waW5uZWRwdWJrZXkgMQotI2VuZGlmCi0KLS8qIEFQSSBzZXR1cCBmb3IgQ3lhU1NMICovCi0jZGVmaW5lIGN1cmxzc2xfaW5pdCBDdXJsX2N5YXNzbF9pbml0Ci0jZGVmaW5lIGN1cmxzc2xfY2xlYW51cCgpIEN1cmxfbm9wX3N0bXQKLSNkZWZpbmUgY3VybHNzbF9jb25uZWN0IEN1cmxfY3lhc3NsX2Nvbm5lY3QKLSNkZWZpbmUgY3VybHNzbF9jb25uZWN0X25vbmJsb2NraW5nIEN1cmxfY3lhc3NsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcKLSNkZWZpbmUgY3VybHNzbF9zZXNzaW9uX2ZyZWUoeCkgIEN1cmxfY3lhc3NsX3Nlc3Npb25fZnJlZSh4KQotI2RlZmluZSBjdXJsc3NsX2Nsb3NlX2FsbCh4KSAoKHZvaWQpeCkKLSNkZWZpbmUgY3VybHNzbF9jbG9zZSBDdXJsX2N5YXNzbF9jbG9zZQotI2RlZmluZSBjdXJsc3NsX3NodXRkb3duKHgseSkgQ3VybF9jeWFzc2xfc2h1dGRvd24oeCx5KQotI2RlZmluZSBjdXJsc3NsX3NldF9lbmdpbmUoeCx5KSAoKHZvaWQpeCwgKHZvaWQpeSwgQ1VSTEVfTk9UX0JVSUxUX0lOKQotI2RlZmluZSBjdXJsc3NsX3NldF9lbmdpbmVfZGVmYXVsdCh4KSAoKHZvaWQpeCwgQ1VSTEVfTk9UX0JVSUxUX0lOKQotI2RlZmluZSBjdXJsc3NsX2VuZ2luZXNfbGlzdCh4KSAoKHZvaWQpeCwgKHN0cnVjdCBjdXJsX3NsaXN0ICopTlVMTCkKLSNkZWZpbmUgY3VybHNzbF92ZXJzaW9uIEN1cmxfY3lhc3NsX3ZlcnNpb24KLSNkZWZpbmUgY3VybHNzbF9jaGVja19jeG4oeCkgKCh2b2lkKXgsIC0xKQotI2RlZmluZSBjdXJsc3NsX2RhdGFfcGVuZGluZyh4LHkpIEN1cmxfY3lhc3NsX2RhdGFfcGVuZGluZyh4LHkpCi0jZGVmaW5lIGN1cmxzc2xfcmFuZG9tKHgseSx6KSBDdXJsX2N5YXNzbF9yYW5kb20oeCx5LHopCi0jZGVmaW5lIGN1cmxzc2xfc2hhMjU2c3VtKGEsYixjLGQpIEN1cmxfY3lhc3NsX3NoYTI1NnN1bShhLGIsYyxkKQorZXh0ZXJuIGNvbnN0IHN0cnVjdCBDdXJsX3NzbCBDdXJsX3NzbF9jeWFzc2w7CiAKICNlbmRpZiAvKiBVU0VfQ1lBU1NMICovCiAjZW5kaWYgLyogSEVBREVSX0NVUkxfQ1lBU1NMX0ggKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvZGFyd2luc3NsLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2RhcndpbnNzbC5jCmluZGV4IDA0MTc2NjUuLmE5OGY0MzMgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvZGFyd2luc3NsLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9kYXJ3aW5zc2wuYwpAQCAtMzQsMTEgKzM0LDE4IEBACiAKICNpZmRlZiBVU0VfREFSV0lOU1NMCiAKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd0YXV0b2xvZ2ljYWwtcG9pbnRlci1jb21wYXJlIgorI2VuZGlmIC8qIF9fY2xhbmdfXyAqLworCiAjaWZkZWYgSEFWRV9MSU1JVFNfSAogI2luY2x1ZGUgPGxpbWl0cy5oPgogI2VuZGlmCiAKICNpbmNsdWRlIDxTZWN1cml0eS9TZWN1cml0eS5oPgorLyogRm9yIHNvbWUgcmVhc29uLCB3aGVuIGJ1aWxkaW5nIGZvciBpT1MsIHRoZSBvbW5pYnVzIGhlYWRlciBhYm92ZSBkb2VzCisgKiBub3QgaW5jbHVkZSBTZWN1cmVUcmFuc3BvcnQuaCBhcyBvZiBpT1MgU0RLIDUuMS4gKi8KICNpbmNsdWRlIDxTZWN1cml0eS9TZWN1cmVUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDxDb3JlRm91bmRhdGlvbi9Db3JlRm91bmRhdGlvbi5oPgogI2luY2x1ZGUgPENvbW1vbkNyeXB0by9Db21tb25EaWdlc3QuaD4KQEAgLTExMyw2ICsxMjAsMzMgQEAKICNkZWZpbmUgaW9FcnIgLTM2CiAjZGVmaW5lIHBhcmFtRXJyIC01MAogCitzdHJ1Y3Qgc3NsX2JhY2tlbmRfZGF0YSB7CisgIFNTTENvbnRleHRSZWYgc3NsX2N0eDsKKyAgY3VybF9zb2NrZXRfdCBzc2xfc29ja2ZkOworICBib29sIHNzbF9kaXJlY3Rpb247IC8qIHRydWUgaWYgd3JpdGluZywgZmFsc2UgaWYgcmVhZGluZyAqLworICBzaXplX3Qgc3NsX3dyaXRlX2J1ZmZlcmVkX2xlbmd0aDsKK307CisKKyNkZWZpbmUgQkFDS0VORCBjb25uc3NsLT5iYWNrZW5kCisKKy8qIHBpbm5lZCBwdWJsaWMga2V5IHN1cHBvcnQgdGVzdHMgKi8KKworLyogdmVyc2lvbiAxIHN1cHBvcnRzIG1hY09TIDEwLjEyKyBhbmQgaU9TIDEwKyAqLworI2lmICgoVEFSR0VUX09TX0lQSE9ORSAmJiBfX0lQSE9ORV9PU19WRVJTSU9OX01JTl9SRVFVSVJFRCA+PSAxMDAwMDApIHx8IFwKKyAgICAoIVRBUkdFVF9PU19JUEhPTkUgJiYgX19NQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCAgPj0gMTAxMjAwKSkKKyNkZWZpbmUgREFSV0lOX1NTTF9QSU5ORURQVUJLRVlfVjEgMQorI2VuZGlmCisKKy8qIHZlcnNpb24gMiBzdXBwb3J0cyBNYWNPU1ggMTAuNysgKi8KKyNpZiAoIVRBUkdFVF9PU19JUEhPTkUgJiYgX19NQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA+PSAxMDcwKQorI2RlZmluZSBEQVJXSU5fU1NMX1BJTk5FRFBVQktFWV9WMiAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoREFSV0lOX1NTTF9QSU5ORURQVUJLRVlfVjEpIHx8IGRlZmluZWQoREFSV0lOX1NTTF9QSU5ORURQVUJLRVlfVjIpCisvKiB0aGlzIGJhY2tlbmQgc3VwcG9ydHMgQ1VSTE9QVF9QSU5ORURQVUJMSUNLRVkgKi8KKyNkZWZpbmUgREFSV0lOX1NTTF9QSU5ORURQVUJLRVkgMQorI2VuZGlmIC8qIERBUldJTl9TU0xfUElOTkVEUFVCS0VZICovCisKICNpZmRlZiBEQVJXSU5fU1NMX1BJTk5FRFBVQktFWQogLyogYm90aCBuZXcgYW5kIG9sZCBBUElzIHJldHVybiByc2Ega2V5cyBtaXNzaW5nIHRoZSBzcGtpIGhlYWRlciAobm90IERFUikgKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHJzYTQwOTZTcGtpSGVhZGVyW10gPSB7CkBAIC0xNTYsNyArMTkwLDcgQEAKICAgVUludDggKmN1cnJEYXRhID0gKFVJbnQ4ICopZGF0YTsKICAgLyppbnQgc29jayA9ICooaW50ICopY29ubmVjdGlvbjsqLwogICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9IChzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqKWNvbm5lY3Rpb247Ci0gIGludCBzb2NrID0gY29ubnNzbC0+c3NsX3NvY2tmZDsKKyAgaW50IHNvY2sgPSBCQUNLRU5ELT5zc2xfc29ja2ZkOwogICBPU1N0YXR1cyBydG4gPSBub0VycjsKICAgc2l6ZV90IGJ5dGVzUmVhZDsKICAgc3NpemVfdCBycnRuOwpAQCAtMTg1LDcgKzIxOSw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBjYXNlIEVBR0FJTjoKICAgICAgICAgICAgIHJ0biA9IGVyclNTTFdvdWxkQmxvY2s7Ci0gICAgICAgICAgICBjb25uc3NsLT5zc2xfZGlyZWN0aW9uID0gZmFsc2U7CisgICAgICAgICAgICBCQUNLRU5ELT5zc2xfZGlyZWN0aW9uID0gZmFsc2U7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcnRuID0gaW9FcnI7CkBAIC0yMTYsNyArMjUwLDcgQEAKICAgc2l6ZV90IGJ5dGVzU2VudCA9IDA7CiAgIC8qaW50IHNvY2sgPSAqKGludCAqKWNvbm5lY3Rpb247Ki8KICAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAoc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKiljb25uZWN0aW9uOwotICBpbnQgc29jayA9IGNvbm5zc2wtPnNzbF9zb2NrZmQ7CisgIGludCBzb2NrID0gQkFDS0VORC0+c3NsX3NvY2tmZDsKICAgc3NpemVfdCBsZW5ndGg7CiAgIHNpemVfdCBkYXRhTGVuID0gKmRhdGFMZW5ndGg7CiAgIGNvbnN0IFVJbnQ4ICpkYXRhUHRyID0gKFVJbnQ4ICopZGF0YTsKQEAgLTIzNiw3ICsyNzAsNyBAQAogICAgIHRoZUVyciA9IGVycm5vOwogICAgIGlmKHRoZUVyciA9PSBFQUdBSU4pIHsKICAgICAgIG9ydG4gPSBlcnJTU0xXb3VsZEJsb2NrOwotICAgICAgY29ubnNzbC0+c3NsX2RpcmVjdGlvbiA9IHRydWU7CisgICAgICBCQUNLRU5ELT5zc2xfZGlyZWN0aW9uID0gdHJ1ZTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICBvcnRuID0gaW9FcnI7CkBAIC04NDQsNyArODc4LDcgQEAKICAgIGludG8gYSBzdHJpbmcuIFNvbWUgYXJlbid0IGF2YWlsYWJsZSB1bmRlciBpT1Mgb3IgbmV3ZXIgY2F0cy4gU28gaGVyZSdzCiAgICBhIHVuaWZpZWQgZnVuY3Rpb24gZm9yIGdldHRpbmcgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgY2VydGlmaWNhdGUgdGhhdAogICAgb3VnaHQgdG8gd29yayBpbiBhbGwgY2F0cyBzdGFydGluZyB3aXRoIExlb3BhcmQuICovCi1DRl9JTkxJTkUgQ0ZTdHJpbmdSZWYgQ29weUNlcnRTdWJqZWN0KFNlY0NlcnRpZmljYXRlUmVmIGNlcnQpCitDRl9JTkxJTkUgQ0ZTdHJpbmdSZWYgZ2V0c3ViamVjdChTZWNDZXJ0aWZpY2F0ZVJlZiBjZXJ0KQogewogICBDRlN0cmluZ1JlZiBzZXJ2ZXJfY2VydF9zdW1tYXJ5ID0gQ0ZTVFIoIihudWxsKSIpOwogCkBAIC04NzEsNiArOTA1LDU0IEBACiAgIHJldHVybiBzZXJ2ZXJfY2VydF9zdW1tYXJ5OwogfQogCitzdGF0aWMgQ1VSTGNvZGUgQ29weUNlcnRTdWJqZWN0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY0NlcnRpZmljYXRlUmVmIGNlcnQsIGNoYXIgKipjZXJ0cCkKK3sKKyAgQ0ZTdHJpbmdSZWYgYyA9IGdldHN1YmplY3QoY2VydCk7CisgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX09LOworICBjb25zdCBjaGFyICpkaXJlY3Q7CisgIGNoYXIgKmNidWYgPSBOVUxMOworICAqY2VydHAgPSBOVUxMOworCisgIGlmKCFjKSB7CisgICAgZmFpbGYoZGF0YSwgIlNTTDogaW52YWxpZCBDQSBjZXJ0aWZpY2F0ZSBzdWJqZWN0Iik7CisgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CisgIH0KKworICAvKiBJZiB0aGUgc3ViamVjdCBpcyBhbHJlYWR5IGF2YWlsYWJsZSBhcyBVVEYtOCBlbmNvZGVkIChpZSAnZGlyZWN0JykgdGhlbgorICAgICB1c2UgdGhhdCwgZWxzZSBjb252ZXJ0IGl0LiAqLworICBkaXJlY3QgPSBDRlN0cmluZ0dldENTdHJpbmdQdHIoYywga0NGU3RyaW5nRW5jb2RpbmdVVEY4KTsKKyAgaWYoZGlyZWN0KSB7CisgICAgKmNlcnRwID0gc3RyZHVwKGRpcmVjdCk7CisgICAgaWYoISpjZXJ0cCkgeworICAgICAgZmFpbGYoZGF0YSwgIlNTTDogb3V0IG9mIG1lbW9yeSIpOworICAgICAgcmVzdWx0ID0gQ1VSTEVfT1VUX09GX01FTU9SWTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgc2l6ZV90IGNidWZfc2l6ZSA9ICgoc2l6ZV90KUNGU3RyaW5nR2V0TGVuZ3RoKGMpICogNCkgKyAxOworICAgIGNidWYgPSBjYWxsb2MoY2J1Zl9zaXplLCAxKTsKKyAgICBpZihjYnVmKSB7CisgICAgICBpZighQ0ZTdHJpbmdHZXRDU3RyaW5nKGMsIGNidWYsIGNidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyaW5nRW5jb2RpbmdVVEY4KSkgeworICAgICAgICBmYWlsZihkYXRhLCAiU1NMOiBpbnZhbGlkIENBIGNlcnRpZmljYXRlIHN1YmplY3QiKTsKKyAgICAgICAgcmVzdWx0ID0gQ1VSTEVfU1NMX0NBQ0VSVDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgLyogcGFzcyBiYWNrIHRoZSBidWZmZXIgKi8KKyAgICAgICAgKmNlcnRwID0gY2J1ZjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBmYWlsZihkYXRhLCAiU1NMOiBjb3VsZG4ndCBhbGxvY2F0ZSAlenUgYnl0ZXMgb2YgbWVtb3J5IiwgY2J1Zl9zaXplKTsKKyAgICAgIHJlc3VsdCA9IENVUkxFX09VVF9PRl9NRU1PUlk7CisgICAgfQorICB9CisgIGlmKHJlc3VsdCkKKyAgICBmcmVlKGNidWYpOworICBDRlJlbGVhc2UoYyk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKICNpZiBDVVJMX1NVUFBPUlRfTUFDXzEwXzYKIC8qIFRoZSBTZWNLZXljaGFpblNlYXJjaCBBUEkgd2FzIGRlcHJlY2F0ZWQgaW4gTGlvbiwgYW5kIHVzaW5nIGl0IHdpbGwgcmFpc2UKICAgIGRlcHJlY2F0aW9uIHdhcm5pbmdzLCBzbyBsZXQncyBub3QgY29tcGlsZSB0aGlzIHVubGVzcyBpdCdzIG5lY2Vzc2FyeTogKi8KQEAgLTk2Myw3ICsxMDQ1LDcgQEAKICAgICAgIGtleXNfbGlzdF9jb3VudCA9IENGQXJyYXlHZXRDb3VudChrZXlzX2xpc3QpOwogICAgICAgKm91dF9jZXJ0X2FuZF9rZXkgPSBOVUxMOwogICAgICAgc3RhdHVzID0gMTsKLSAgICAgIGZvcihpPTA7IGk8a2V5c19saXN0X2NvdW50OyBpKyspIHsKKyAgICAgIGZvcihpID0gMDsgaTxrZXlzX2xpc3RfY291bnQ7IGkrKykgewogICAgICAgICBPU1N0YXR1cyBlcnIgPSBub0VycjsKICAgICAgICAgU2VjQ2VydGlmaWNhdGVSZWYgY2VydCA9IE5VTEw7CiAgICAgICAgIFNlY0lkZW50aXR5UmVmIGlkZW50aXR5ID0KQEAgLTEwNzUsNyArMTE1Nyw4IEBACiB9CiAKICNpZiBDVVJMX0JVSUxEX01BQ18xMF84IHx8IENVUkxfQlVJTERfSU9TCi1zdGF0aWMgQ1VSTGNvZGUgZGFyd2luc3NsX3ZlcnNpb25fZnJvbV9jdXJsKGxvbmcgKmRhcndpbnZlciwgbG9uZyBzc2xfdmVyc2lvbikKK3N0YXRpYyBDVVJMY29kZSBkYXJ3aW5zc2xfdmVyc2lvbl9mcm9tX2N1cmwoU1NMUHJvdG9jb2wgKmRhcndpbnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBzc2xfdmVyc2lvbikKIHsKICAgc3dpdGNoKHNzbF92ZXJzaW9uKSB7CiAgICAgY2FzZSBDVVJMX1NTTFZFUlNJT05fVExTdjFfMDoKQEAgLTExMzYsMzAgKzEyMTksMzAgQEAKICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCi0gICAgKHZvaWQpU1NMU2V0UHJvdG9jb2xWZXJzaW9uTWluKGNvbm5zc2wtPnNzbF9jdHgsIGRhcndpbl92ZXJfbWluKTsKLSAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25NYXgoY29ubnNzbC0+c3NsX2N0eCwgZGFyd2luX3Zlcl9tYXgpOworICAgICh2b2lkKVNTTFNldFByb3RvY29sVmVyc2lvbk1pbihCQUNLRU5ELT5zc2xfY3R4LCBkYXJ3aW5fdmVyX21pbik7CisgICAgKHZvaWQpU1NMU2V0UHJvdG9jb2xWZXJzaW9uTWF4KEJBQ0tFTkQtPnNzbF9jdHgsIGRhcndpbl92ZXJfbWF4KTsKICAgICByZXR1cm4gcmVzdWx0OwogICB9CiAgIGVsc2UgewogI2lmIENVUkxfU1VQUE9SVF9NQUNfMTBfOAogICAgIGxvbmcgaSA9IHNzbF92ZXJzaW9uOwotICAgICh2b2lkKVNTTFNldFByb3RvY29sVmVyc2lvbkVuYWJsZWQoY29ubnNzbC0+c3NsX2N0eCwKKyAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKEJBQ0tFTkQtPnNzbF9jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU1NMUHJvdG9jb2xBbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CiAgICAgZm9yKDsgaSA8PSAoc3NsX3ZlcnNpb25fbWF4ID4+IDE2KTsgaSsrKSB7CiAgICAgICBzd2l0Y2goaSkgewogICAgICAgICBjYXNlIENVUkxfU1NMVkVSU0lPTl9UTFN2MV8wOgotICAgICAgICAgICh2b2lkKVNTTFNldFByb3RvY29sVmVyc2lvbkVuYWJsZWQoY29ubnNzbC0+c3NsX2N0eCwKKyAgICAgICAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKEJBQ0tFTkQtPnNzbF9jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUTFNQcm90b2NvbDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIENVUkxfU1NMVkVSU0lPTl9UTFN2MV8xOgotICAgICAgICAgICh2b2lkKVNTTFNldFByb3RvY29sVmVyc2lvbkVuYWJsZWQoY29ubnNzbC0+c3NsX2N0eCwKKyAgICAgICAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKEJBQ0tFTkQtPnNzbF9jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUTFNQcm90b2NvbDExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBDVVJMX1NTTFZFUlNJT05fVExTdjFfMjoKLSAgICAgICAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKGNvbm5zc2wtPnNzbF9jdHgsCisgICAgICAgICAgKHZvaWQpU1NMU2V0UHJvdG9jb2xWZXJzaW9uRW5hYmxlZChCQUNLRU5ELT5zc2xfY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVExTUHJvdG9jb2wxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CiAgICAgICAgICAgYnJlYWs7CkBAIC0xMjA1LDEwICsxMjg4LDEwIEBACiAKICNpZiBDVVJMX0JVSUxEX01BQ18xMF84IHx8IENVUkxfQlVJTERfSU9TCiAgIGlmKFNTTENyZWF0ZUNvbnRleHQgIT0gTlVMTCkgeyAgLyogdXNlIHRoZSBuZXdlciBBUEkgaWYgYXZhaWFsYmxlICovCi0gICAgaWYoY29ubnNzbC0+c3NsX2N0eCkKLSAgICAgIENGUmVsZWFzZShjb25uc3NsLT5zc2xfY3R4KTsKLSAgICBjb25uc3NsLT5zc2xfY3R4ID0gU1NMQ3JlYXRlQ29udGV4dChOVUxMLCBrU1NMQ2xpZW50U2lkZSwga1NTTFN0cmVhbVR5cGUpOwotICAgIGlmKCFjb25uc3NsLT5zc2xfY3R4KSB7CisgICAgaWYoQkFDS0VORC0+c3NsX2N0eCkKKyAgICAgIENGUmVsZWFzZShCQUNLRU5ELT5zc2xfY3R4KTsKKyAgICBCQUNLRU5ELT5zc2xfY3R4ID0gU1NMQ3JlYXRlQ29udGV4dChOVUxMLCBrU1NMQ2xpZW50U2lkZSwga1NTTFN0cmVhbVR5cGUpOworICAgIGlmKCFCQUNLRU5ELT5zc2xfY3R4KSB7CiAgICAgICBmYWlsZihkYXRhLCAiU1NMOiBjb3VsZG4ndCBjcmVhdGUgYSBjb250ZXh0ISIpOwogICAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CiAgICAgfQpAQCAtMTIxNiw5ICsxMjk5LDkgQEAKICAgZWxzZSB7CiAgIC8qIFRoZSBvbGQgU1QgQVBJIGRvZXMgbm90IGV4aXN0IHVuZGVyIGlPUywgc28gZG9uJ3QgY29tcGlsZSBpdDogKi8KICNpZiBDVVJMX1NVUFBPUlRfTUFDXzEwXzgKLSAgICBpZihjb25uc3NsLT5zc2xfY3R4KQotICAgICAgKHZvaWQpU1NMRGlzcG9zZUNvbnRleHQoY29ubnNzbC0+c3NsX2N0eCk7Ci0gICAgZXJyID0gU1NMTmV3Q29udGV4dChmYWxzZSwgJihjb25uc3NsLT5zc2xfY3R4KSk7CisgICAgaWYoQkFDS0VORC0+c3NsX2N0eCkKKyAgICAgICh2b2lkKVNTTERpc3Bvc2VDb250ZXh0KEJBQ0tFTkQtPnNzbF9jdHgpOworICAgIGVyciA9IFNTTE5ld0NvbnRleHQoZmFsc2UsICYoQkFDS0VORC0+c3NsX2N0eCkpOwogICAgIGlmKGVyciAhPSBub0VycikgewogICAgICAgZmFpbGYoZGF0YSwgIlNTTDogY291bGRuJ3QgY3JlYXRlIGEgY29udGV4dDogT1NTdGF0dXMgJWQiLCBlcnIpOwogICAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CkBAIC0xMjI2LDE1ICsxMzA5LDE1IEBACiAjZW5kaWYgLyogQ1VSTF9TVVBQT1JUX01BQ18xMF84ICovCiAgIH0KICNlbHNlCi0gIGlmKGNvbm5zc2wtPnNzbF9jdHgpCi0gICAgKHZvaWQpU1NMRGlzcG9zZUNvbnRleHQoY29ubnNzbC0+c3NsX2N0eCk7Ci0gIGVyciA9IFNTTE5ld0NvbnRleHQoZmFsc2UsICYoY29ubnNzbC0+c3NsX2N0eCkpOworICBpZihCQUNLRU5ELT5zc2xfY3R4KQorICAgICh2b2lkKVNTTERpc3Bvc2VDb250ZXh0KEJBQ0tFTkQtPnNzbF9jdHgpOworICBlcnIgPSBTU0xOZXdDb250ZXh0KGZhbHNlLCAmKEJBQ0tFTkQtPnNzbF9jdHgpKTsKICAgaWYoZXJyICE9IG5vRXJyKSB7CiAgICAgZmFpbGYoZGF0YSwgIlNTTDogY291bGRuJ3QgY3JlYXRlIGEgY29udGV4dDogT1NTdGF0dXMgJWQiLCBlcnIpOwogICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogICB9CiAjZW5kaWYgLyogQ1VSTF9CVUlMRF9NQUNfMTBfOCB8fCBDVVJMX0JVSUxEX0lPUyAqLwotICBjb25uc3NsLT5zc2xfd3JpdGVfYnVmZmVyZWRfbGVuZ3RoID0gMFVMOyAvKiByZXNldCBidWZmZXJlZCB3cml0ZSBsZW5ndGggKi8KKyAgQkFDS0VORC0+c3NsX3dyaXRlX2J1ZmZlcmVkX2xlbmd0aCA9IDBVTDsgLyogcmVzZXQgYnVmZmVyZWQgd3JpdGUgbGVuZ3RoICovCiAKICAgLyogY2hlY2sgdG8gc2VlIGlmIHdlJ3ZlIGJlZW4gdG9sZCB0byB1c2UgYW4gZXhwbGljaXQgU1NML1RMUyB2ZXJzaW9uICovCiAjaWYgQ1VSTF9CVUlMRF9NQUNfMTBfOCB8fCBDVVJMX0JVSUxEX0lPUwpAQCAtMTI0Miw4ICsxMzI1LDggQEAKICAgICBzd2l0Y2goY29ubi0+c3NsX2NvbmZpZy52ZXJzaW9uKSB7CiAgICAgY2FzZSBDVVJMX1NTTFZFUlNJT05fREVGQVVMVDoKICAgICBjYXNlIENVUkxfU1NMVkVSU0lPTl9UTFN2MToKLSAgICAgICh2b2lkKVNTTFNldFByb3RvY29sVmVyc2lvbk1pbihjb25uc3NsLT5zc2xfY3R4LCBrVExTUHJvdG9jb2wxKTsKLSAgICAgICh2b2lkKVNTTFNldFByb3RvY29sVmVyc2lvbk1heChjb25uc3NsLT5zc2xfY3R4LCBrVExTUHJvdG9jb2wxMik7CisgICAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25NaW4oQkFDS0VORC0+c3NsX2N0eCwga1RMU1Byb3RvY29sMSk7CisgICAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25NYXgoQkFDS0VORC0+c3NsX2N0eCwga1RMU1Byb3RvY29sMTIpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBDVVJMX1NTTFZFUlNJT05fVExTdjFfMDoKICAgICBjYXNlIENVUkxfU1NMVkVSU0lPTl9UTFN2MV8xOgpAQCAtMTI1NiwyMCArMTMzOSwyMCBAQAogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICBjYXNlIENVUkxfU1NMVkVSU0lPTl9TU0x2MzoKLSAgICAgIGVyciA9IFNTTFNldFByb3RvY29sVmVyc2lvbk1pbihjb25uc3NsLT5zc2xfY3R4LCBrU1NMUHJvdG9jb2wzKTsKKyAgICAgIGVyciA9IFNTTFNldFByb3RvY29sVmVyc2lvbk1pbihCQUNLRU5ELT5zc2xfY3R4LCBrU1NMUHJvdG9jb2wzKTsKICAgICAgIGlmKGVyciAhPSBub0VycikgewogICAgICAgICBmYWlsZihkYXRhLCAiWW91ciB2ZXJzaW9uIG9mIHRoZSBPUyBkb2VzIG5vdCBzdXBwb3J0IFNTTHYzIik7CiAgICAgICAgIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKICAgICAgIH0KLSAgICAgICh2b2lkKVNTTFNldFByb3RvY29sVmVyc2lvbk1heChjb25uc3NsLT5zc2xfY3R4LCBrU1NMUHJvdG9jb2wzKTsKKyAgICAgICh2b2lkKVNTTFNldFByb3RvY29sVmVyc2lvbk1heChCQUNLRU5ELT5zc2xfY3R4LCBrU1NMUHJvdG9jb2wzKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgQ1VSTF9TU0xWRVJTSU9OX1NTTHYyOgotICAgICAgZXJyID0gU1NMU2V0UHJvdG9jb2xWZXJzaW9uTWluKGNvbm5zc2wtPnNzbF9jdHgsIGtTU0xQcm90b2NvbDIpOworICAgICAgZXJyID0gU1NMU2V0UHJvdG9jb2xWZXJzaW9uTWluKEJBQ0tFTkQtPnNzbF9jdHgsIGtTU0xQcm90b2NvbDIpOwogICAgICAgaWYoZXJyICE9IG5vRXJyKSB7CiAgICAgICAgIGZhaWxmKGRhdGEsICJZb3VyIHZlcnNpb24gb2YgdGhlIE9TIGRvZXMgbm90IHN1cHBvcnQgU1NMdjIiKTsKICAgICAgICAgcmV0dXJuIENVUkxFX1NTTF9DT05ORUNUX0VSUk9SOwogICAgICAgfQotICAgICAgKHZvaWQpU1NMU2V0UHJvdG9jb2xWZXJzaW9uTWF4KGNvbm5zc2wtPnNzbF9jdHgsIGtTU0xQcm90b2NvbDIpOworICAgICAgKHZvaWQpU1NMU2V0UHJvdG9jb2xWZXJzaW9uTWF4KEJBQ0tFTkQtPnNzbF9jdHgsIGtTU0xQcm90b2NvbDIpOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIGZhaWxmKGRhdGEsICJVbnJlY29nbml6ZWQgcGFyYW1ldGVyIHBhc3NlZCB2aWEgQ1VSTE9QVF9TU0xWRVJTSU9OIik7CkBAIC0xMjc4LDE5ICsxMzYxLDE5IEBACiAgIH0KICAgZWxzZSB7CiAjaWYgQ1VSTF9TVVBQT1JUX01BQ18xMF84Ci0gICAgKHZvaWQpU1NMU2V0UHJvdG9jb2xWZXJzaW9uRW5hYmxlZChjb25uc3NsLT5zc2xfY3R4LAorICAgICh2b2lkKVNTTFNldFByb3RvY29sVmVyc2lvbkVuYWJsZWQoQkFDS0VORC0+c3NsX2N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTU0xQcm90b2NvbEFsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKICAgICBzd2l0Y2goY29ubi0+c3NsX2NvbmZpZy52ZXJzaW9uKSB7CiAgICAgY2FzZSBDVVJMX1NTTFZFUlNJT05fREVGQVVMVDoKICAgICBjYXNlIENVUkxfU1NMVkVSU0lPTl9UTFN2MToKLSAgICAgICh2b2lkKVNTTFNldFByb3RvY29sVmVyc2lvbkVuYWJsZWQoY29ubnNzbC0+c3NsX2N0eCwKKyAgICAgICh2b2lkKVNTTFNldFByb3RvY29sVmVyc2lvbkVuYWJsZWQoQkFDS0VORC0+c3NsX2N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1RMU1Byb3RvY29sMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKGNvbm5zc2wtPnNzbF9jdHgsCisgICAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKEJBQ0tFTkQtPnNzbF9jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUTFNQcm90b2NvbDExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICh2b2lkKVNTTFNldFByb3RvY29sVmVyc2lvbkVuYWJsZWQoY29ubnNzbC0+c3NsX2N0eCwKKyAgICAgICh2b2lkKVNTTFNldFByb3RvY29sVmVyc2lvbkVuYWJsZWQoQkFDS0VORC0+c3NsX2N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1RMU1Byb3RvY29sMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwogICAgICAgYnJlYWs7CkBAIC0xMzA1LDcgKzEzODgsNyBAQAogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICBjYXNlIENVUkxfU1NMVkVSU0lPTl9TU0x2MzoKLSAgICAgIGVyciA9IFNTTFNldFByb3RvY29sVmVyc2lvbkVuYWJsZWQoY29ubnNzbC0+c3NsX2N0eCwKKyAgICAgIGVyciA9IFNTTFNldFByb3RvY29sVmVyc2lvbkVuYWJsZWQoQkFDS0VORC0+c3NsX2N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NTTFByb3RvY29sMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CiAgICAgICBpZihlcnIgIT0gbm9FcnIpIHsKQEAgLTEzMTQsNyArMTM5Nyw3IEBACiAgICAgICB9CiAgICAgICBicmVhazsKICAgICBjYXNlIENVUkxfU1NMVkVSU0lPTl9TU0x2MjoKLSAgICAgIGVyciA9IFNTTFNldFByb3RvY29sVmVyc2lvbkVuYWJsZWQoY29ubnNzbC0+c3NsX2N0eCwKKyAgICAgIGVyciA9IFNTTFNldFByb3RvY29sVmVyc2lvbkVuYWJsZWQoQkFDS0VORC0+c3NsX2N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NTTFByb3RvY29sMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CiAgICAgICBpZihlcnIgIT0gbm9FcnIpIHsKQEAgLTEzMzQsMTIgKzE0MTcsMTIgQEAKICAgICAgICAgICAgICAgICAiIFNTTC9UTFMgdmVyc2lvbiIpOwogICAgIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKICAgfQotICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKGNvbm5zc2wtPnNzbF9jdHgsIGtTU0xQcm90b2NvbEFsbCwgZmFsc2UpOworICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKEJBQ0tFTkQtPnNzbF9jdHgsIGtTU0xQcm90b2NvbEFsbCwgZmFsc2UpOwogICBzd2l0Y2goY29ubi0+c3NsX2NvbmZpZy52ZXJzaW9uKSB7CiAgIGNhc2UgQ1VSTF9TU0xWRVJTSU9OX0RFRkFVTFQ6CiAgIGNhc2UgQ1VSTF9TU0xWRVJTSU9OX1RMU3YxOgogICBjYXNlIENVUkxfU1NMVkVSU0lPTl9UTFN2MV8wOgotICAgICh2b2lkKVNTTFNldFByb3RvY29sVmVyc2lvbkVuYWJsZWQoY29ubnNzbC0+c3NsX2N0eCwKKyAgICAodm9pZClTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKEJBQ0tFTkQtPnNzbF9jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVExTUHJvdG9jb2wxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CiAgICAgYnJlYWs7CkBAIC0xMzUzLDcgKzE0MzYsNyBAQAogICAgIGZhaWxmKGRhdGEsICJZb3VyIHZlcnNpb24gb2YgdGhlIE9TIGRvZXMgbm90IHN1cHBvcnQgVExTdjEuMyIpOwogICAgIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKICAgY2FzZSBDVVJMX1NTTFZFUlNJT05fU1NMdjI6Ci0gICAgZXJyID0gU1NMU2V0UHJvdG9jb2xWZXJzaW9uRW5hYmxlZChjb25uc3NsLT5zc2xfY3R4LAorICAgIGVyciA9IFNTTFNldFByb3RvY29sVmVyc2lvbkVuYWJsZWQoQkFDS0VORC0+c3NsX2N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTU0xQcm90b2NvbDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKICAgICBpZihlcnIgIT0gbm9FcnIpIHsKQEAgLTEzNjIsNyArMTQ0NSw3IEBACiAgICAgfQogICAgIGJyZWFrOwogICBjYXNlIENVUkxfU1NMVkVSU0lPTl9TU0x2MzoKLSAgICBlcnIgPSBTU0xTZXRQcm90b2NvbFZlcnNpb25FbmFibGVkKGNvbm5zc2wtPnNzbF9jdHgsCisgICAgZXJyID0gU1NMU2V0UHJvdG9jb2xWZXJzaW9uRW5hYmxlZChCQUNLRU5ELT5zc2xfY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NTTFByb3RvY29sMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwogICAgIGlmKGVyciAhPSBub0VycikgewpAQCAtMTQxMiwyNSArMTQ5NSwyMSBAQAogICAgICAgLyogSWYgd2UgZm91bmQgb25lLCBwcmludCBpdCBvdXQ6ICovCiAgICAgICBlcnIgPSBTZWNJZGVudGl0eUNvcHlDZXJ0aWZpY2F0ZShjZXJ0X2FuZF9rZXksICZjZXJ0KTsKICAgICAgIGlmKGVyciA9PSBub0VycikgewotICAgICAgICBDRlN0cmluZ1JlZiBjZXJ0X3N1bW1hcnkgPSBDb3B5Q2VydFN1YmplY3QoY2VydCk7Ci0gICAgICAgIGNoYXIgY2VydF9zdW1tYXJ5X2NbMTI4XTsKLQotICAgICAgICBpZihjZXJ0X3N1bW1hcnkpIHsKLSAgICAgICAgICBtZW1zZXQoY2VydF9zdW1tYXJ5X2MsIDAsIDEyOCk7Ci0gICAgICAgICAgaWYoQ0ZTdHJpbmdHZXRDU3RyaW5nKGNlcnRfc3VtbWFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9zdW1tYXJ5X2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyaW5nRW5jb2RpbmdVVEY4KSkgewotICAgICAgICAgICAgaW5mb2YoZGF0YSwgIkNsaWVudCBjZXJ0aWZpY2F0ZTogJXNcbiIsIGNlcnRfc3VtbWFyeV9jKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgQ0ZSZWxlYXNlKGNlcnRfc3VtbWFyeSk7Ci0gICAgICAgICAgQ0ZSZWxlYXNlKGNlcnQpOworICAgICAgICBjaGFyICpjZXJ0cDsKKyAgICAgICAgQ1VSTGNvZGUgcmVzdWx0ID0gQ29weUNlcnRTdWJqZWN0KGRhdGEsIGNlcnQsICZjZXJ0cCk7CisgICAgICAgIGlmKCFyZXN1bHQpIHsKKyAgICAgICAgICBpbmZvZihkYXRhLCAiQ2xpZW50IGNlcnRpZmljYXRlOiAlc1xuIiwgY2VydHApOworICAgICAgICAgIGZyZWUoY2VydHApOwogICAgICAgICB9CisKKyAgICAgICAgQ0ZSZWxlYXNlKGNlcnQpOworICAgICAgICBpZihyZXN1bHQpCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgIH0KICAgICAgIGNlcnRzX2NbMF0gPSBjZXJ0X2FuZF9rZXk7CiAgICAgICBjZXJ0cyA9IENGQXJyYXlDcmVhdGUoTlVMTCwgKGNvbnN0IHZvaWQgKiopY2VydHNfYywgMUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVBcnJheUNhbGxCYWNrcyk7Ci0gICAgICBlcnIgPSBTU0xTZXRDZXJ0aWZpY2F0ZShjb25uc3NsLT5zc2xfY3R4LCBjZXJ0cyk7CisgICAgICBlcnIgPSBTU0xTZXRDZXJ0aWZpY2F0ZShCQUNLRU5ELT5zc2xfY3R4LCBjZXJ0cyk7CiAgICAgICBpZihjZXJ0cykKICAgICAgICAgQ0ZSZWxlYXNlKGNlcnRzKTsKICAgICAgIGlmKGVyciAhPSBub0VycikgewpAQCAtMTQ5Myw3ICsxNTcyLDcgQEAKICAgaWYoU1NMU2V0U2Vzc2lvbk9wdGlvbiAhPSBOVUxMKSB7CiAjZW5kaWYgLyogQ1VSTF9CVUlMRF9NQUMgKi8KICAgICBib29sIGJyZWFrX29uX2F1dGggPSAhY29ubi0+c3NsX2NvbmZpZy52ZXJpZnlwZWVyIHx8IHNzbF9jYWZpbGU7Ci0gICAgZXJyID0gU1NMU2V0U2Vzc2lvbk9wdGlvbihjb25uc3NsLT5zc2xfY3R4LAorICAgIGVyciA9IFNTTFNldFNlc3Npb25PcHRpb24oQkFDS0VORC0+c3NsX2N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTU0xTZXNzaW9uT3B0aW9uQnJlYWtPblNlcnZlckF1dGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha19vbl9hdXRoKTsKICAgICBpZihlcnIgIT0gbm9FcnIpIHsKQEAgLTE1MDMsNyArMTU4Miw3IEBACiAgIH0KICAgZWxzZSB7CiAjaWYgQ1VSTF9TVVBQT1JUX01BQ18xMF84Ci0gICAgZXJyID0gU1NMU2V0RW5hYmxlQ2VydFZlcmlmeShjb25uc3NsLT5zc2xfY3R4LAorICAgIGVyciA9IFNTTFNldEVuYWJsZUNlcnRWZXJpZnkoQkFDS0VORC0+c3NsX2N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4tPnNzbF9jb25maWcudmVyaWZ5cGVlcj90cnVlOmZhbHNlKTsKICAgICBpZihlcnIgIT0gbm9FcnIpIHsKICAgICAgIGZhaWxmKGRhdGEsICJTU0w6IFNTTFNldEVuYWJsZUNlcnRWZXJpZnkoKSBmYWlsZWQ6IE9TU3RhdHVzICVkIiwgZXJyKTsKQEAgLTE1MTIsNyArMTU5MSw3IEBACiAjZW5kaWYgLyogQ1VSTF9TVVBQT1JUX01BQ18xMF84ICovCiAgIH0KICNlbHNlCi0gIGVyciA9IFNTTFNldEVuYWJsZUNlcnRWZXJpZnkoY29ubnNzbC0+c3NsX2N0eCwKKyAgZXJyID0gU1NMU2V0RW5hYmxlQ2VydFZlcmlmeShCQUNLRU5ELT5zc2xfY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4tPnNzbF9jb25maWcudmVyaWZ5cGVlcj90cnVlOmZhbHNlKTsKICAgaWYoZXJyICE9IG5vRXJyKSB7CiAgICAgZmFpbGYoZGF0YSwgIlNTTDogU1NMU2V0RW5hYmxlQ2VydFZlcmlmeSgpIGZhaWxlZDogT1NTdGF0dXMgJWQiLCBlcnIpOwpAQCAtMTUzMyw3ICsxNjEyLDcgQEAKICAgICogQm90aCBob3N0bmFtZSBjaGVjayBhbmQgU05JIHJlcXVpcmUgU1NMU2V0UGVlckRvbWFpbk5hbWUoKS4KICAgICogQWxzbzogdGhlIHZlcmlmeWhvc3Qgc2V0dGluZyBpbmZsdWVuY2VzIFNOSSB1c2FnZSAqLwogICBpZihjb25uLT5zc2xfY29uZmlnLnZlcmlmeWhvc3QpIHsKLSAgICBlcnIgPSBTU0xTZXRQZWVyRG9tYWluTmFtZShjb25uc3NsLT5zc2xfY3R4LCBob3N0bmFtZSwKKyAgICBlcnIgPSBTU0xTZXRQZWVyRG9tYWluTmFtZShCQUNLRU5ELT5zc2xfY3R4LCBob3N0bmFtZSwKICAgICBzdHJsZW4oaG9zdG5hbWUpKTsKIAogICAgIGlmKGVyciAhPSBub0VycikgewpAQCAtMTU1OSwxMSArMTYzOCwxMSBAQAogICAgICBoaWdoZXIgcHJpb3JpdHksIGJ1dCBpdCdzIHByb2JhYmx5IGJldHRlciB0aGF0IHdlIG5vdCBjb25uZWN0IGF0IGFsbCB0aGFuCiAgICAgIHRvIGdpdmUgdGhlIHVzZXIgYSBmYWxzZSBzZW5zZSBvZiBzZWN1cml0eSBpZiB0aGUgc2VydmVyIG9ubHkgc3VwcG9ydHMKICAgICAgaW5zZWN1cmUgY2lwaGVycy4gKE5vdGU6IFdlIGRvbid0IGNhcmUgYWJvdXQgU1NMdjItb25seSBjaXBoZXJzLikgKi8KLSAgKHZvaWQpU1NMR2V0TnVtYmVyU3VwcG9ydGVkQ2lwaGVycyhjb25uc3NsLT5zc2xfY3R4LCAmYWxsX2NpcGhlcnNfY291bnQpOworICAodm9pZClTU0xHZXROdW1iZXJTdXBwb3J0ZWRDaXBoZXJzKEJBQ0tFTkQtPnNzbF9jdHgsICZhbGxfY2lwaGVyc19jb3VudCk7CiAgIGFsbF9jaXBoZXJzID0gbWFsbG9jKGFsbF9jaXBoZXJzX2NvdW50KnNpemVvZihTU0xDaXBoZXJTdWl0ZSkpOwogICBhbGxvd2VkX2NpcGhlcnMgPSBtYWxsb2MoYWxsX2NpcGhlcnNfY291bnQqc2l6ZW9mKFNTTENpcGhlclN1aXRlKSk7CiAgIGlmKGFsbF9jaXBoZXJzICYmIGFsbG93ZWRfY2lwaGVycyAmJgotICAgICBTU0xHZXRTdXBwb3J0ZWRDaXBoZXJzKGNvbm5zc2wtPnNzbF9jdHgsIGFsbF9jaXBoZXJzLAorICAgICBTU0xHZXRTdXBwb3J0ZWRDaXBoZXJzKEJBQ0tFTkQtPnNzbF9jdHgsIGFsbF9jaXBoZXJzLAogICAgICAgICZhbGxfY2lwaGVyc19jb3VudCkgPT0gbm9FcnIpIHsKICAgICBmb3IoaSA9IDBVTCA7IGkgPCBhbGxfY2lwaGVyc19jb3VudCA7IGkrKykgewogI2lmIENVUkxfQlVJTERfTUFDCkBAIC0xNjQ1LDcgKzE3MjQsNyBAQAogICAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KLSAgICBlcnIgPSBTU0xTZXRFbmFibGVkQ2lwaGVycyhjb25uc3NsLT5zc2xfY3R4LCBhbGxvd2VkX2NpcGhlcnMsCisgICAgZXJyID0gU1NMU2V0RW5hYmxlZENpcGhlcnMoQkFDS0VORC0+c3NsX2N0eCwgYWxsb3dlZF9jaXBoZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRfY2lwaGVyc19jb3VudCk7CiAgICAgaWYoZXJyICE9IG5vRXJyKSB7CiAgICAgICBmYWlsZihkYXRhLCAiU1NMOiBTU0xTZXRFbmFibGVkQ2lwaGVycygpIGZhaWxlZDogT1NTdGF0dXMgJWQiLCBlcnIpOwpAQCAtMTY2Niw5ICsxNzQ1LDkgQEAKICAgICAgc3BlY2lmaWNhbGx5IGRvZXNuJ3Qgd2FudCB1cyBkb2luZyB0aGF0OiAqLwogICBpZihTU0xTZXRTZXNzaW9uT3B0aW9uICE9IE5VTEwpIHsKICAgICAvKiBUT0RPIHMvZGF0YS0+c2V0LnNzbC5lbmFibGVfYmVhc3QvU1NMX1NFVF9PUFRJT04oZW5hYmxlX2JlYXN0KS9nICovCi0gICAgU1NMU2V0U2Vzc2lvbk9wdGlvbihjb25uc3NsLT5zc2xfY3R4LCBrU1NMU2Vzc2lvbk9wdGlvblNlbmRPbmVCeXRlUmVjb3JkLAorICAgIFNTTFNldFNlc3Npb25PcHRpb24oQkFDS0VORC0+c3NsX2N0eCwga1NTTFNlc3Npb25PcHRpb25TZW5kT25lQnl0ZVJlY29yZCwKICAgICAgICAgICAgICAgICAgICAgICAhZGF0YS0+c2V0LnNzbC5lbmFibGVfYmVhc3QpOwotICAgIFNTTFNldFNlc3Npb25PcHRpb24oY29ubnNzbC0+c3NsX2N0eCwga1NTTFNlc3Npb25PcHRpb25GYWxzZVN0YXJ0LAorICAgIFNTTFNldFNlc3Npb25PcHRpb24oQkFDS0VORC0+c3NsX2N0eCwga1NTTFNlc3Npb25PcHRpb25GYWxzZVN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnNldC5zc2wuZmFsc2VzdGFydCk7IC8qIGZhbHNlIHN0YXJ0IHN1cHBvcnQgKi8KICAgfQogI2VuZGlmIC8qIENVUkxfQlVJTERfTUFDXzEwXzkgfHwgQ1VSTF9CVUlMRF9JT1NfNyAqLwpAQCAtMTY4Miw3ICsxNzYxLDcgQEAKICAgICBpZighQ3VybF9zc2xfZ2V0c2Vzc2lvbmlkKGNvbm4sICh2b2lkICoqKSZzc2xfc2Vzc2lvbmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNzbF9zZXNzaW9uaWRfbGVuLCBzb2NraW5kZXgpKSB7CiAgICAgICAvKiB3ZSBnb3QgYSBzZXNzaW9uIGlkLCB1c2UgaXQhICovCi0gICAgICBlcnIgPSBTU0xTZXRQZWVySUQoY29ubnNzbC0+c3NsX2N0eCwgc3NsX3Nlc3Npb25pZCwgc3NsX3Nlc3Npb25pZF9sZW4pOworICAgICAgZXJyID0gU1NMU2V0UGVlcklEKEJBQ0tFTkQtPnNzbF9jdHgsIHNzbF9zZXNzaW9uaWQsIHNzbF9zZXNzaW9uaWRfbGVuKTsKICAgICAgIEN1cmxfc3NsX3Nlc3Npb25pZF91bmxvY2soY29ubik7CiAgICAgICBpZihlcnIgIT0gbm9FcnIpIHsKICAgICAgICAgZmFpbGYoZGF0YSwgIlNTTDogU1NMU2V0UGVlcklEKCkgZmFpbGVkOiBPU1N0YXR1cyAlZCIsIGVycik7CkBAIC0xNzAwLDcgKzE3NzksNyBAQAogICAgICAgICAgICAgICAgIHZlcmlmeXBlZXIsIFNTTF9DT05OX0NPTkZJRyh2ZXJpZnlob3N0KSwgaG9zdG5hbWUsIHBvcnQpOwogICAgICAgc3NsX3Nlc3Npb25pZF9sZW4gPSBzdHJsZW4oc3NsX3Nlc3Npb25pZCk7CiAKLSAgICAgIGVyciA9IFNTTFNldFBlZXJJRChjb25uc3NsLT5zc2xfY3R4LCBzc2xfc2Vzc2lvbmlkLCBzc2xfc2Vzc2lvbmlkX2xlbik7CisgICAgICBlcnIgPSBTU0xTZXRQZWVySUQoQkFDS0VORC0+c3NsX2N0eCwgc3NsX3Nlc3Npb25pZCwgc3NsX3Nlc3Npb25pZF9sZW4pOwogICAgICAgaWYoZXJyICE9IG5vRXJyKSB7CiAgICAgICAgIEN1cmxfc3NsX3Nlc3Npb25pZF91bmxvY2soY29ubik7CiAgICAgICAgIGZhaWxmKGRhdGEsICJTU0w6IFNTTFNldFBlZXJJRCgpIGZhaWxlZDogT1NTdGF0dXMgJWQiLCBlcnIpOwpAQCAtMTcxNyw3ICsxNzk2LDcgQEAKICAgICB9CiAgIH0KIAotICBlcnIgPSBTU0xTZXRJT0Z1bmNzKGNvbm5zc2wtPnNzbF9jdHgsIFNvY2tldFJlYWQsIFNvY2tldFdyaXRlKTsKKyAgZXJyID0gU1NMU2V0SU9GdW5jcyhCQUNLRU5ELT5zc2xfY3R4LCBTb2NrZXRSZWFkLCBTb2NrZXRXcml0ZSk7CiAgIGlmKGVyciAhPSBub0VycikgewogICAgIGZhaWxmKGRhdGEsICJTU0w6IFNTTFNldElPRnVuY3MoKSBmYWlsZWQ6IE9TU3RhdHVzICVkIiwgZXJyKTsKICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CkBAIC0xNzI3LDggKzE4MDYsOCBAQAogICAvKiBXZSBuZWVkIHRvIHN0b3JlIHRoZSBGRCBpbiBhIGNvbnN0YW50IG1lbW9yeSBhZGRyZXNzLCBiZWNhdXNlCiAgICAqIFNTTFNldENvbm5lY3Rpb24oKSB3aWxsIG5vdCBjb3B5IHRoYXQgYWRkcmVzcy4gSSd2ZSBmb3VuZCB0aGF0CiAgICAqIGNvbm4tPnNvY2tbc29ja2luZGV4XSBtYXkgY2hhbmdlIG9uIGl0cyBvd24uICovCi0gIGNvbm5zc2wtPnNzbF9zb2NrZmQgPSBzb2NrZmQ7Ci0gIGVyciA9IFNTTFNldENvbm5lY3Rpb24oY29ubnNzbC0+c3NsX2N0eCwgY29ubnNzbCk7CisgIEJBQ0tFTkQtPnNzbF9zb2NrZmQgPSBzb2NrZmQ7CisgIGVyciA9IFNTTFNldENvbm5lY3Rpb24oQkFDS0VORC0+c3NsX2N0eCwgY29ubnNzbCk7CiAgIGlmKGVyciAhPSBub0VycikgewogICAgIGZhaWxmKGRhdGEsICJTU0w6IFNTTFNldENvbm5lY3Rpb24oKSBmYWlsZWQ6ICVkIiwgZXJyKTsKICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CkBAIC0xNzkxLDcgKzE4NzAsNyBAQAogewogICBpbnQgZmQ7CiAgIHNzaXplX3QgbiwgbGVuID0gMCwgY2FwID0gNTEyOwotICB1bnNpZ25lZCBjaGFyIGJ1ZltjYXBdLCAqZGF0YTsKKyAgdW5zaWduZWQgY2hhciBidWZbNTEyXSwgKmRhdGE7CiAKICAgZmQgPSBvcGVuKGZpbGUsIDApOwogICBpZihmZCA8IDApCkBAIC0xODY5LDYgKzE5NDgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVBcnJheVJlZiBhcnJheSkKIHsKICAgICBDRkRhdGFSZWYgY2VydGRhdGEgPSBDRkRhdGFDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgYnVmLCBidWZsZW4pOworICAgIGNoYXIgKmNlcnRwOworICAgIENVUkxjb2RlIHJlc3VsdDsKICAgICBpZighY2VydGRhdGEpIHsKICAgICAgIGZhaWxmKGRhdGEsICJTU0w6IGZhaWxlZCB0byBhbGxvY2F0ZSBhcnJheSBmb3IgQ0EgY2VydGlmaWNhdGUiKTsKICAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwpAQCAtMTg4MywyNSArMTk2NCwxMCBAQAogICAgIH0KIAogICAgIC8qIENoZWNrIGlmIGNhY2VydCBpcyB2YWxpZC4gKi8KLSAgICBDRlN0cmluZ1JlZiBzdWJqZWN0ID0gQ29weUNlcnRTdWJqZWN0KGNhY2VydCk7Ci0gICAgaWYoc3ViamVjdCkgewotICAgICAgY2hhciBzdWJqZWN0X2NidWZbMTI4XTsKLSAgICAgIG1lbXNldChzdWJqZWN0X2NidWYsIDAsIDEyOCk7Ci0gICAgICBpZighQ0ZTdHJpbmdHZXRDU3RyaW5nKHN1YmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdF9jYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpKSB7Ci0gICAgICAgIENGUmVsZWFzZShjYWNlcnQpOwotICAgICAgICBmYWlsZihkYXRhLCAiU1NMOiBpbnZhbGlkIENBIGNlcnRpZmljYXRlIHN1YmplY3QiKTsKLSAgICAgICAgcmV0dXJuIENVUkxFX1NTTF9DQUNFUlQ7Ci0gICAgICB9Ci0gICAgICBDRlJlbGVhc2Uoc3ViamVjdCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgQ0ZSZWxlYXNlKGNhY2VydCk7Ci0gICAgICBmYWlsZihkYXRhLCAiU1NMOiBpbnZhbGlkIENBIGNlcnRpZmljYXRlIik7Ci0gICAgICByZXR1cm4gQ1VSTEVfU1NMX0NBQ0VSVDsKLSAgICB9CisgICAgcmVzdWx0ID0gQ29weUNlcnRTdWJqZWN0KGRhdGEsIGNhY2VydCwgJmNlcnRwKTsKKyAgICBpZihyZXN1bHQpCisgICAgICByZXR1cm4gcmVzdWx0OworICAgIGZyZWUoY2VydHApOwogCiAgICAgQ0ZBcnJheUFwcGVuZFZhbHVlKGFycmF5LCBjYWNlcnQpOwogICAgIENGUmVsZWFzZShjYWNlcnQpOwpAQCAtMjAyNywxMiArMjA5MywxMyBAQAogfQogCiAjaWZkZWYgREFSV0lOX1NTTF9QSU5ORURQVUJLRVkKLXN0YXRpYyBDVVJMY29kZSBwa3BfcGluX3BlZXJfcHVia2V5KHN0cnVjdCBTZXNzaW9uSGFuZGxlICpkYXRhLAorc3RhdGljIENVUkxjb2RlIHBrcF9waW5fcGVlcl9wdWJrZXkoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTENvbnRleHRSZWYgY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGlubmVkcHVia2V5KQogeyAgLyogU2NyYXRjaCAqLwogICBzaXplX3QgcHVia2V5bGVuLCByZWFscHVia2V5bGVuLCBzcGtpSGVhZGVyTGVuZ3RoID0gMjQ7Ci0gIHVuc2lnbmVkIGNoYXIgKnB1YmtleSA9IE5VTEwsICpyZWFscHVia2V5ID0gTlVMTCwgKnNwa2lIZWFkZXIgPSBOVUxMOworICB1bnNpZ25lZCBjaGFyICpwdWJrZXkgPSBOVUxMLCAqcmVhbHB1YmtleSA9IE5VTEw7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNwa2lIZWFkZXIgPSBOVUxMOwogICBDRkRhdGFSZWYgcHVibGljS2V5Qml0cyA9IE5VTEw7CiAKICAgLyogUmVzdWx0IGlzIHJldHVybmVkIHRvIGNhbGxlciAqLwpAQCAtMjA3NSw3ICsyMTQyLDcgQEAKICNlbmRpZiAvKiBEQVJXSU5fU1NMX1BJTk5FRFBVQktFWV9WMiAqLwogCiAgICAgcHVia2V5bGVuID0gQ0ZEYXRhR2V0TGVuZ3RoKHB1YmxpY0tleUJpdHMpOwotICAgIHB1YmtleSA9IENGRGF0YUdldEJ5dGVQdHIocHVibGljS2V5Qml0cyk7CisgICAgcHVia2V5ID0gKHVuc2lnbmVkIGNoYXIgKilDRkRhdGFHZXRCeXRlUHRyKHB1YmxpY0tleUJpdHMpOwogCiAgICAgc3dpdGNoKHB1YmtleWxlbikgewogICAgICAgY2FzZSA1MjY6CkBAIC0yMTQ4LDEyICsyMjE1LDEyIEBACiAgICAgICAgICAgICAgIHx8IHNzbF9jb25uZWN0XzJfd3JpdGluZyA9PSBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlKTsKIAogICAvKiBIZXJlIGdvZXMgbm90aGluZzogKi8KLSAgZXJyID0gU1NMSGFuZHNoYWtlKGNvbm5zc2wtPnNzbF9jdHgpOworICBlcnIgPSBTU0xIYW5kc2hha2UoQkFDS0VORC0+c3NsX2N0eCk7CiAKICAgaWYoZXJyICE9IG5vRXJyKSB7CiAgICAgc3dpdGNoKGVycikgewogICAgICAgY2FzZSBlcnJTU0xXb3VsZEJsb2NrOiAgLyogdGhleSdyZSBub3QgZG9uZSB3aXRoIHVzIHlldCAqLwotICAgICAgICBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlID0gY29ubnNzbC0+c3NsX2RpcmVjdGlvbiA/CisgICAgICAgIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPSBCQUNLRU5ELT5zc2xfZGlyZWN0aW9uID8KICAgICAgICAgICAgIHNzbF9jb25uZWN0XzJfd3JpdGluZyA6IHNzbF9jb25uZWN0XzJfcmVhZGluZzsKICAgICAgICAgcmV0dXJuIENVUkxFX09LOwogCkBAIC0yMTYyLDcgKzIyMjksNyBAQAogICAgICAgY2FzZSAtOTg0MToKICAgICAgICAgaWYoU1NMX0NPTk5fQ09ORklHKENBZmlsZSkgJiYgU1NMX0NPTk5fQ09ORklHKHZlcmlmeXBlZXIpKSB7CiAgICAgICAgICAgaW50IHJlcyA9IHZlcmlmeV9jZXJ0KFNTTF9DT05OX0NPTkZJRyhDQWZpbGUpLCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uc3NsLT5zc2xfY3R4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFDS0VORC0+c3NsX2N0eCk7CiAgICAgICAgICAgaWYocmVzICE9IENVUkxFX09LKQogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQpAQCAtMjI0MCw3ICsyMzA3LDcgQEAKIAogI2lmZGVmIERBUldJTl9TU0xfUElOTkVEUFVCS0VZCiAgICAgaWYoZGF0YS0+c2V0LnN0cltTVFJJTkdfU1NMX1BJTk5FRFBVQkxJQ0tFWV9PUklHXSkgewotICAgICAgQ1VSTGNvZGUgcmVzdWx0ID0gcGtwX3Bpbl9wZWVyX3B1YmtleShkYXRhLCBjb25uc3NsLT5zc2xfY3R4LAorICAgICAgQ1VSTGNvZGUgcmVzdWx0ID0gcGtwX3Bpbl9wZWVyX3B1YmtleShkYXRhLCBCQUNLRU5ELT5zc2xfY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnNldC5zdHJbU1RSSU5HX1NTTF9QSU5ORURQVUJMSUNLRVlfT1JJR10pOwogICAgICAgaWYocmVzdWx0KSB7CiAgICAgICAgIGZhaWxmKGRhdGEsICJTU0w6IHB1YmxpYyBrZXkgZG9lcyBub3QgbWF0Y2ggcGlubmVkIHB1YmxpYyBrZXkhIik7CkBAIC0yMjUwLDggKzIzMTcsOCBAQAogI2VuZGlmIC8qIERBUldJTl9TU0xfUElOTkVEUFVCS0VZICovCiAKICAgICAvKiBJbmZvcm1hdGlvbmFsIG1lc3NhZ2UgKi8KLSAgICAodm9pZClTU0xHZXROZWdvdGlhdGVkQ2lwaGVyKGNvbm5zc2wtPnNzbF9jdHgsICZjaXBoZXIpOwotICAgICh2b2lkKVNTTEdldE5lZ290aWF0ZWRQcm90b2NvbFZlcnNpb24oY29ubnNzbC0+c3NsX2N0eCwgJnByb3RvY29sKTsKKyAgICAodm9pZClTU0xHZXROZWdvdGlhdGVkQ2lwaGVyKEJBQ0tFTkQtPnNzbF9jdHgsICZjaXBoZXIpOworICAgICh2b2lkKVNTTEdldE5lZ290aWF0ZWRQcm90b2NvbFZlcnNpb24oQkFDS0VORC0+c3NsX2N0eCwgJnByb3RvY29sKTsKICAgICBzd2l0Y2gocHJvdG9jb2wpIHsKICAgICAgIGNhc2Uga1NTTFByb3RvY29sMjoKICAgICAgICAgaW5mb2YoZGF0YSwgIlNTTCAyLjAgY29ubmVjdGlvbiB1c2luZyAlc1xuIiwKQEAgLTIyOTIsMzYgKzIzNTksMzIgQEAKIHsKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOwotICBDRlN0cmluZ1JlZiBzZXJ2ZXJfY2VydF9zdW1tYXJ5OwotICBjaGFyIHNlcnZlcl9jZXJ0X3N1bW1hcnlfY1sxMjhdOwogICBDRkFycmF5UmVmIHNlcnZlcl9jZXJ0cyA9IE5VTEw7CiAgIFNlY0NlcnRpZmljYXRlUmVmIHNlcnZlcl9jZXJ0OwogICBPU1N0YXR1cyBlcnI7CiAgIENGSW5kZXggaSwgY291bnQ7CiAgIFNlY1RydXN0UmVmIHRydXN0ID0gTlVMTDsKIAotICBpZighY29ubnNzbC0+c3NsX2N0eCkKKyAgaWYoIUJBQ0tFTkQtPnNzbF9jdHgpCiAgICAgcmV0dXJuOwogCiAjaWYgQ1VSTF9CVUlMRF9NQUNfMTBfNyB8fCBDVVJMX0JVSUxEX0lPUwogI2lmIENVUkxfQlVJTERfSU9TCiAjcHJhZ21hIHVudXNlZChzZXJ2ZXJfY2VydHMpCi0gIGVyciA9IFNTTENvcHlQZWVyVHJ1c3QoY29ubnNzbC0+c3NsX2N0eCwgJnRydXN0KTsKKyAgZXJyID0gU1NMQ29weVBlZXJUcnVzdChCQUNLRU5ELT5zc2xfY3R4LCAmdHJ1c3QpOwogICAvKiBGb3Igc29tZSByZWFzb24sIFNTTENvcHlQZWVyVHJ1c3QoKSBjYW4gcmV0dXJuIG5vRXJyIGFuZCB5ZXQgcmV0dXJuCiAgICAgIGEgbnVsbCB0cnVzdCwgc28gYmUgb24gZ3VhcmQgZm9yIHRoYXQ6ICovCiAgIGlmKGVyciA9PSBub0VyciAmJiB0cnVzdCkgewogICAgIGNvdW50ID0gU2VjVHJ1c3RHZXRDZXJ0aWZpY2F0ZUNvdW50KHRydXN0KTsKICAgICBmb3IoaSA9IDBMIDsgaSA8IGNvdW50IDsgaSsrKSB7CisgICAgICBDVVJMY29kZSByZXN1bHQ7CisgICAgICBjaGFyICpjZXJ0cDsKICAgICAgIHNlcnZlcl9jZXJ0ID0gU2VjVHJ1c3RHZXRDZXJ0aWZpY2F0ZUF0SW5kZXgodHJ1c3QsIGkpOwotICAgICAgc2VydmVyX2NlcnRfc3VtbWFyeSA9IENvcHlDZXJ0U3ViamVjdChzZXJ2ZXJfY2VydCk7Ci0gICAgICBtZW1zZXQoc2VydmVyX2NlcnRfc3VtbWFyeV9jLCAwLCAxMjgpOwotICAgICAgaWYoQ0ZTdHJpbmdHZXRDU3RyaW5nKHNlcnZlcl9jZXJ0X3N1bW1hcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2NlcnRfc3VtbWFyeV9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpKSB7Ci0gICAgICAgIGluZm9mKGRhdGEsICJTZXJ2ZXIgY2VydGlmaWNhdGU6ICVzXG4iLCBzZXJ2ZXJfY2VydF9zdW1tYXJ5X2MpOworICAgICAgcmVzdWx0ID0gQ29weUNlcnRTdWJqZWN0KGRhdGEsIHNlcnZlcl9jZXJ0LCAmY2VydHApOworICAgICAgaWYoIXJlc3VsdCkgeworICAgICAgICBpbmZvZihkYXRhLCAiU2VydmVyIGNlcnRpZmljYXRlOiAlc1xuIiwgY2VydHApOworICAgICAgICBmcmVlKGNlcnRwKTsKICAgICAgIH0KLSAgICAgIENGUmVsZWFzZShzZXJ2ZXJfY2VydF9zdW1tYXJ5KTsKICAgICB9CiAgICAgQ0ZSZWxlYXNlKHRydXN0KTsKICAgfQpAQCAtMjMzNCw0NSArMjM5Nyw0MCBAQAogICAgICBMaW9uIG9yIGxhdGVyLiAqLwogICBpZihTZWNUcnVzdEV2YWx1YXRlQXN5bmMgIT0gTlVMTCkgewogI3ByYWdtYSB1bnVzZWQoc2VydmVyX2NlcnRzKQotICAgIGVyciA9IFNTTENvcHlQZWVyVHJ1c3QoY29ubnNzbC0+c3NsX2N0eCwgJnRydXN0KTsKKyAgICBlcnIgPSBTU0xDb3B5UGVlclRydXN0KEJBQ0tFTkQtPnNzbF9jdHgsICZ0cnVzdCk7CiAgICAgLyogRm9yIHNvbWUgcmVhc29uLCBTU0xDb3B5UGVlclRydXN0KCkgY2FuIHJldHVybiBub0VyciBhbmQgeWV0IHJldHVybgogICAgICAgIGEgbnVsbCB0cnVzdCwgc28gYmUgb24gZ3VhcmQgZm9yIHRoYXQ6ICovCiAgICAgaWYoZXJyID09IG5vRXJyICYmIHRydXN0KSB7CiAgICAgICBjb3VudCA9IFNlY1RydXN0R2V0Q2VydGlmaWNhdGVDb3VudCh0cnVzdCk7CiAgICAgICBmb3IoaSA9IDBMIDsgaSA8IGNvdW50IDsgaSsrKSB7CisgICAgICAgIGNoYXIgKmNlcnRwOworICAgICAgICBDVVJMY29kZSByZXN1bHQ7CiAgICAgICAgIHNlcnZlcl9jZXJ0ID0gU2VjVHJ1c3RHZXRDZXJ0aWZpY2F0ZUF0SW5kZXgodHJ1c3QsIGkpOwotICAgICAgICBzZXJ2ZXJfY2VydF9zdW1tYXJ5ID0gQ29weUNlcnRTdWJqZWN0KHNlcnZlcl9jZXJ0KTsKLSAgICAgICAgbWVtc2V0KHNlcnZlcl9jZXJ0X3N1bW1hcnlfYywgMCwgMTI4KTsKLSAgICAgICAgaWYoQ0ZTdHJpbmdHZXRDU3RyaW5nKHNlcnZlcl9jZXJ0X3N1bW1hcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfY2VydF9zdW1tYXJ5X2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpKSB7Ci0gICAgICAgICAgaW5mb2YoZGF0YSwgIlNlcnZlciBjZXJ0aWZpY2F0ZTogJXNcbiIsIHNlcnZlcl9jZXJ0X3N1bW1hcnlfYyk7CisgICAgICAgIHJlc3VsdCA9IENvcHlDZXJ0U3ViamVjdChkYXRhLCBzZXJ2ZXJfY2VydCwgJmNlcnRwKTsKKyAgICAgICAgaWYoIXJlc3VsdCkgeworICAgICAgICAgIGluZm9mKGRhdGEsICJTZXJ2ZXIgY2VydGlmaWNhdGU6ICVzXG4iLCBjZXJ0cCk7CisgICAgICAgICAgZnJlZShjZXJ0cCk7CiAgICAgICAgIH0KLSAgICAgICAgQ0ZSZWxlYXNlKHNlcnZlcl9jZXJ0X3N1bW1hcnkpOwogICAgICAgfQogICAgICAgQ0ZSZWxlYXNlKHRydXN0KTsKICAgICB9CiAgIH0KICAgZWxzZSB7CiAjaWYgQ1VSTF9TVVBQT1JUX01BQ18xMF84Ci0gICAgZXJyID0gU1NMQ29weVBlZXJDZXJ0aWZpY2F0ZXMoY29ubnNzbC0+c3NsX2N0eCwgJnNlcnZlcl9jZXJ0cyk7CisgICAgZXJyID0gU1NMQ29weVBlZXJDZXJ0aWZpY2F0ZXMoQkFDS0VORC0+c3NsX2N0eCwgJnNlcnZlcl9jZXJ0cyk7CiAgICAgLyogSnVzdCBpbiBjYXNlIFNTTENvcHlQZWVyQ2VydGlmaWNhdGVzKCkgcmV0dXJucyBudWxsIHRvby4uLiAqLwogICAgIGlmKGVyciA9PSBub0VyciAmJiBzZXJ2ZXJfY2VydHMpIHsKICAgICAgIGNvdW50ID0gQ0ZBcnJheUdldENvdW50KHNlcnZlcl9jZXJ0cyk7CiAgICAgICBmb3IoaSA9IDBMIDsgaSA8IGNvdW50IDsgaSsrKSB7CisgICAgICAgIGNoYXIgKmNlcnRwOworICAgICAgICBDVVJMY29kZSByZXN1bHQ7CiAgICAgICAgIHNlcnZlcl9jZXJ0ID0gKFNlY0NlcnRpZmljYXRlUmVmKUNGQXJyYXlHZXRWYWx1ZUF0SW5kZXgoc2VydmVyX2NlcnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpOwotCi0gICAgICAgIHNlcnZlcl9jZXJ0X3N1bW1hcnkgPSBDb3B5Q2VydFN1YmplY3Qoc2VydmVyX2NlcnQpOwotICAgICAgICBtZW1zZXQoc2VydmVyX2NlcnRfc3VtbWFyeV9jLCAwLCAxMjgpOwotICAgICAgICBpZihDRlN0cmluZ0dldENTdHJpbmcoc2VydmVyX2NlcnRfc3VtbWFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9jZXJ0X3N1bW1hcnlfYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRlN0cmluZ0VuY29kaW5nVVRGOCkpIHsKLSAgICAgICAgICBpbmZvZihkYXRhLCAiU2VydmVyIGNlcnRpZmljYXRlOiAlc1xuIiwgc2VydmVyX2NlcnRfc3VtbWFyeV9jKTsKKyAgICAgICAgcmVzdWx0ID0gQ29weUNlcnRTdWJqZWN0KGRhdGEsIHNlcnZlcl9jZXJ0LCAmY2VydHApOworICAgICAgICBpZighcmVzdWx0KSB7CisgICAgICAgICAgaW5mb2YoZGF0YSwgIlNlcnZlciBjZXJ0aWZpY2F0ZTogJXNcbiIsIGNlcnRwKTsKKyAgICAgICAgICBmcmVlKGNlcnRwKTsKICAgICAgICAgfQotICAgICAgICBDRlJlbGVhc2Uoc2VydmVyX2NlcnRfc3VtbWFyeSk7CiAgICAgICB9CiAgICAgICBDRlJlbGVhc2Uoc2VydmVyX2NlcnRzKTsKICAgICB9CkBAIC0yMzgxLDIwICsyNDM5LDE4IEBACiAjZW5kaWYgLyogQ1VSTF9CVUlMRF9JT1MgKi8KICNlbHNlCiAjcHJhZ21hIHVudXNlZCh0cnVzdCkKLSAgZXJyID0gU1NMQ29weVBlZXJDZXJ0aWZpY2F0ZXMoY29ubnNzbC0+c3NsX2N0eCwgJnNlcnZlcl9jZXJ0cyk7CisgIGVyciA9IFNTTENvcHlQZWVyQ2VydGlmaWNhdGVzKEJBQ0tFTkQtPnNzbF9jdHgsICZzZXJ2ZXJfY2VydHMpOwogICBpZihlcnIgPT0gbm9FcnIpIHsKICAgICBjb3VudCA9IENGQXJyYXlHZXRDb3VudChzZXJ2ZXJfY2VydHMpOwogICAgIGZvcihpID0gMEwgOyBpIDwgY291bnQgOyBpKyspIHsKKyAgICAgIENVUkxjb2RlIHJlc3VsdDsKKyAgICAgIGNoYXIgKmNlcnRwOwogICAgICAgc2VydmVyX2NlcnQgPSAoU2VjQ2VydGlmaWNhdGVSZWYpQ0ZBcnJheUdldFZhbHVlQXRJbmRleChzZXJ2ZXJfY2VydHMsIGkpOwotICAgICAgc2VydmVyX2NlcnRfc3VtbWFyeSA9IENvcHlDZXJ0U3ViamVjdChzZXJ2ZXJfY2VydCk7Ci0gICAgICBtZW1zZXQoc2VydmVyX2NlcnRfc3VtbWFyeV9jLCAwLCAxMjgpOwotICAgICAgaWYoQ0ZTdHJpbmdHZXRDU3RyaW5nKHNlcnZlcl9jZXJ0X3N1bW1hcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2NlcnRfc3VtbWFyeV9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpKSB7Ci0gICAgICAgIGluZm9mKGRhdGEsICJTZXJ2ZXIgY2VydGlmaWNhdGU6ICVzXG4iLCBzZXJ2ZXJfY2VydF9zdW1tYXJ5X2MpOworICAgICAgcmVzdWx0ID0gQ29weUNlcnRTdWJqZWN0KGRhdGEsIHNlcnZlcl9jZXJ0LCAmY2VydHApOworICAgICAgaWYoIXJlc3VsdCkgeworICAgICAgICBpbmZvZihkYXRhLCAiU2VydmVyIGNlcnRpZmljYXRlOiAlc1xuIiwgY2VydHApOworICAgICAgICBmcmVlKGNlcnRwKTsKICAgICAgIH0KLSAgICAgIENGUmVsZWFzZShzZXJ2ZXJfY2VydF9zdW1tYXJ5KTsKICAgICB9CiAgICAgQ0ZSZWxlYXNlKHNlcnZlcl9jZXJ0cyk7CiAgIH0KQEAgLTI0NDMsNyArMjQ5OSw3IEBACiAgICAgcmV0dXJuIENVUkxFX09LOwogICB9CiAKLSAgaWYoc3NsX2Nvbm5lY3RfMT09Y29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSkgeworICBpZihzc2xfY29ubmVjdF8xID09IGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUpIHsKICAgICAvKiBGaW5kIG91dCBob3cgbXVjaCBtb3JlIHRpbWUgd2UncmUgYWxsb3dlZCAqLwogICAgIHRpbWVvdXRfbXMgPSBDdXJsX3RpbWVsZWZ0KGRhdGEsIE5VTEwsIFRSVUUpOwogCkBAIC0yNTM4LDE3ICsyNTk0LDEzIEBACiAgIHJldHVybiBDVVJMRV9PSzsKIH0KIAotQ1VSTGNvZGUKLUN1cmxfZGFyd2luc3NsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpkb25lKQorc3RhdGljIENVUkxjb2RlIEN1cmxfZGFyd2luc3NsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCwgYm9vbCAqZG9uZSkKIHsKICAgcmV0dXJuIGRhcndpbnNzbF9jb25uZWN0X2NvbW1vbihjb25uLCBzb2NraW5kZXgsIFRSVUUsIGRvbmUpOwogfQogCi1DVVJMY29kZQotQ3VybF9kYXJ3aW5zc2xfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgpCitzdGF0aWMgQ1VSTGNvZGUgQ3VybF9kYXJ3aW5zc2xfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7CiAgIENVUkxjb2RlIHJlc3VsdDsKICAgYm9vbCBkb25lID0gRkFMU0U7CkBAIC0yNTYzLDI4ICsyNjE1LDI4IEBACiAgIHJldHVybiBDVVJMRV9PSzsKIH0KIAotdm9pZCBDdXJsX2RhcndpbnNzbF9jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCitzdGF0aWMgdm9pZCBDdXJsX2RhcndpbnNzbF9jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7CiAgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOwogCi0gIGlmKGNvbm5zc2wtPnNzbF9jdHgpIHsKLSAgICAodm9pZClTU0xDbG9zZShjb25uc3NsLT5zc2xfY3R4KTsKKyAgaWYoQkFDS0VORC0+c3NsX2N0eCkgeworICAgICh2b2lkKVNTTENsb3NlKEJBQ0tFTkQtPnNzbF9jdHgpOwogI2lmIENVUkxfQlVJTERfTUFDXzEwXzggfHwgQ1VSTF9CVUlMRF9JT1MKICAgICBpZihTU0xDcmVhdGVDb250ZXh0ICE9IE5VTEwpCi0gICAgICBDRlJlbGVhc2UoY29ubnNzbC0+c3NsX2N0eCk7CisgICAgICBDRlJlbGVhc2UoQkFDS0VORC0+c3NsX2N0eCk7CiAjaWYgQ1VSTF9TVVBQT1JUX01BQ18xMF84CiAgICAgZWxzZQotICAgICAgKHZvaWQpU1NMRGlzcG9zZUNvbnRleHQoY29ubnNzbC0+c3NsX2N0eCk7CisgICAgICAodm9pZClTU0xEaXNwb3NlQ29udGV4dChCQUNLRU5ELT5zc2xfY3R4KTsKICNlbmRpZiAgLyogQ1VSTF9TVVBQT1JUX01BQ18xMF84ICovCiAjZWxzZQotICAgICh2b2lkKVNTTERpc3Bvc2VDb250ZXh0KGNvbm5zc2wtPnNzbF9jdHgpOworICAgICh2b2lkKVNTTERpc3Bvc2VDb250ZXh0KEJBQ0tFTkQtPnNzbF9jdHgpOwogI2VuZGlmIC8qIENVUkxfQlVJTERfTUFDXzEwXzggfHwgQ1VSTF9CVUlMRF9JT1MgKi8KLSAgICBjb25uc3NsLT5zc2xfY3R4ID0gTlVMTDsKKyAgICBCQUNLRU5ELT5zc2xfY3R4ID0gTlVMTDsKICAgfQotICBjb25uc3NsLT5zc2xfc29ja2ZkID0gMDsKKyAgQkFDS0VORC0+c3NsX3NvY2tmZCA9IDA7CiB9CiAKLWludCBDdXJsX2RhcndpbnNzbF9zaHV0ZG93bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCitzdGF0aWMgaW50IEN1cmxfZGFyd2luc3NsX3NodXRkb3duKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKICAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CiAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwpAQCAtMjU5Myw3ICsyNjQ1LDcgQEAKICAgaW50IHJjOwogICBjaGFyIGJ1ZlsxMjBdOwogCi0gIGlmKCFjb25uc3NsLT5zc2xfY3R4KQorICBpZighQkFDS0VORC0+c3NsX2N0eCkKICAgICByZXR1cm4gMDsKIAogICBpZihkYXRhLT5zZXQuZnRwX2NjYyAhPSBDVVJMRlRQU1NMX0NDQ19BQ1RJVkUpCkBAIC0yNjM3LDcgKzI2ODksNyBAQAogICByZXR1cm4gcmM7CiB9CiAKLXZvaWQgQ3VybF9kYXJ3aW5zc2xfc2Vzc2lvbl9mcmVlKHZvaWQgKnB0cikKK3N0YXRpYyB2b2lkIEN1cmxfZGFyd2luc3NsX3Nlc3Npb25fZnJlZSh2b2lkICpwdHIpCiB7CiAgIC8qIFNULCBhcyBvZiBpT1MgNSBhbmQgTW91bnRhaW4gTGlvbiwgaGFzIG5vIHB1YmxpYyBtZXRob2Qgb2YgZGVsZXRpbmcgYQogICAgICBjYWNoZWQgc2Vzc2lvbiBJRCBpbnNpZGUgdGhlIFNlY3VyaXR5IGZyYW1ld29yay4gVGhlcmUgaXMgYSBwcml2YXRlCkBAIC0yNjQ4LDcgKzI3MDAsNyBAQAogICBDdXJsX3NhZmVmcmVlKHB0cik7CiB9CiAKLXNpemVfdCBDdXJsX2RhcndpbnNzbF92ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCitzdGF0aWMgc2l6ZV90IEN1cmxfZGFyd2luc3NsX3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKICAgcmV0dXJuIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIlNlY3VyZVRyYW5zcG9ydCIpOwogfQpAQCAtMjY2MSwxNCArMjcxMywxNCBAQAogICogICAgIDAgbWVhbnMgdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkCiAgKiAgICAtMSBtZWFucyB0aGUgY29ubmVjdGlvbiBzdGF0dXMgaXMgdW5rbm93bgogICovCi1pbnQgQ3VybF9kYXJ3aW5zc2xfY2hlY2tfY3huKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubikKK3N0YXRpYyBpbnQgQ3VybF9kYXJ3aW5zc2xfY2hlY2tfY3huKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubikKIHsKICAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW0ZJUlNUU09DS0VUXTsKICAgT1NTdGF0dXMgZXJyOwogICBTU0xTZXNzaW9uU3RhdGUgc3RhdGU7CiAKLSAgaWYoY29ubnNzbC0+c3NsX2N0eCkgewotICAgIGVyciA9IFNTTEdldFNlc3Npb25TdGF0ZShjb25uc3NsLT5zc2xfY3R4LCAmc3RhdGUpOworICBpZihCQUNLRU5ELT5zc2xfY3R4KSB7CisgICAgZXJyID0gU1NMR2V0U2Vzc2lvblN0YXRlKEJBQ0tFTkQtPnNzbF9jdHgsICZzdGF0ZSk7CiAgICAgaWYoZXJyID09IG5vRXJyKQogICAgICAgcmV0dXJuIHN0YXRlID09IGtTU0xDb25uZWN0ZWQgfHwgc3RhdGUgPT0ga1NTTEhhbmRzaGFrZTsKICAgICByZXR1cm4gLTE7CkBAIC0yNjc2LDE1ICsyNzI4LDE1IEBACiAgIHJldHVybiAwOwogfQogCi1ib29sIEN1cmxfZGFyd2luc3NsX2RhdGFfcGVuZGluZyhjb25zdCBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29ubmluZGV4KQorc3RhdGljIGJvb2wgQ3VybF9kYXJ3aW5zc2xfZGF0YV9wZW5kaW5nKGNvbnN0IHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29ubmluZGV4KQogewogICBjb25zdCBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbY29ubmluZGV4XTsKICAgT1NTdGF0dXMgZXJyOwogICBzaXplX3QgYnVmZmVyOwogCi0gIGlmKGNvbm5zc2wtPnNzbF9jdHgpIHsgIC8qIFNTTCBpcyBpbiB1c2UgKi8KLSAgICBlcnIgPSBTU0xHZXRCdWZmZXJlZFJlYWRTaXplKGNvbm5zc2wtPnNzbF9jdHgsICZidWZmZXIpOworICBpZihCQUNLRU5ELT5zc2xfY3R4KSB7ICAvKiBTU0wgaXMgaW4gdXNlICovCisgICAgZXJyID0gU1NMR2V0QnVmZmVyZWRSZWFkU2l6ZShCQUNLRU5ELT5zc2xfY3R4LCAmYnVmZmVyKTsKICAgICBpZihlcnIgPT0gbm9FcnIpCiAgICAgICByZXR1cm4gYnVmZmVyID4gMFVMOwogICAgIHJldHVybiBmYWxzZTsKQEAgLTI2OTMsMTQgKzI3NDUsMTYgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUNVUkxjb2RlIEN1cmxfZGFyd2luc3NsX3JhbmRvbSh1bnNpZ25lZCBjaGFyICplbnRyb3B5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpCitzdGF0aWMgQ1VSTGNvZGUgQ3VybF9kYXJ3aW5zc2xfcmFuZG9tKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgVU5VU0VEX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplbnRyb3B5LCBzaXplX3QgbGVuZ3RoKQogewogICAvKiBhcmM0cmFuZG9tX2J1ZigpIGlzbid0IGF2YWlsYWJsZSBvbiBjYXRzIG9sZGVyIHRoYW4gTGlvbiwgc28gbGV0J3MKICAgICAgZG8gdGhpcyBtYW51YWxseSBmb3IgdGhlIGJlbmVmaXQgb2YgdGhlIG9sZGVyIGNhdHMuICovCiAgIHNpemVfdCBpOwogICB1X2ludDMyX3QgcmFuZG9tX251bWJlciA9IDA7CiAKKyAgKHZvaWQpZGF0YTsKKwogICBmb3IoaSA9IDAgOyBpIDwgbGVuZ3RoIDsgaSsrKSB7CiAgICAgaWYoaSAlIHNpemVvZih1X2ludDMyX3QpID09IDApCiAgICAgICByYW5kb21fbnVtYmVyID0gYXJjNHJhbmRvbSgpOwpAQCAtMjcxMSwyNSArMjc2NSwyNiBAQAogICByZXR1cm4gQ1VSTEVfT0s7CiB9CiAKLXZvaWQgQ3VybF9kYXJ3aW5zc2xfbWQ1c3VtKHVuc2lnbmVkIGNoYXIgKnRtcCwgLyogaW5wdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0bXBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICptZDVzdW0sIC8qIG91dHB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1kNWxlbikKK3N0YXRpYyBDVVJMY29kZSBDdXJsX2RhcndpbnNzbF9tZDVzdW0odW5zaWduZWQgY2hhciAqdG1wLCAvKiBpbnB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdG1wbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICptZDVzdW0sIC8qIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWQ1bGVuKQogewogICAodm9pZCltZDVsZW47CiAgICh2b2lkKUNDX01ENSh0bXAsIChDQ19MT05HKXRtcGxlbiwgbWQ1c3VtKTsKKyAgcmV0dXJuIENVUkxFX09LOwogfQogCi12b2lkIEN1cmxfZGFyd2luc3NsX3NoYTI1NnN1bSh1bnNpZ25lZCBjaGFyICp0bXAsIC8qIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdG1wbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqc2hhMjU2c3VtLCAvKiBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaGEyNTZsZW4pCitzdGF0aWMgdm9pZCBDdXJsX2RhcndpbnNzbF9zaGEyNTZzdW0oY29uc3QgdW5zaWduZWQgY2hhciAqdG1wLCAvKiBpbnB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0bXBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqc2hhMjU2c3VtLCAvKiBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2hhMjU2bGVuKQogewotICBhc3NlcnQoc2hhMjU2bGVuID49IFNIQTI1Nl9ESUdFU1RfTEVOR1RIKTsKKyAgYXNzZXJ0KHNoYTI1NmxlbiA+PSBDVVJMX1NIQTI1Nl9ESUdFU1RfTEVOR1RIKTsKICAgKHZvaWQpQ0NfU0hBMjU2KHRtcCwgKENDX0xPTkcpdG1wbGVuLCBzaGEyNTZzdW0pOwogfQogCi1ib29sIEN1cmxfZGFyd2luc3NsX2ZhbHNlX3N0YXJ0KHZvaWQpCitzdGF0aWMgYm9vbCBDdXJsX2RhcndpbnNzbF9mYWxzZV9zdGFydCh2b2lkKQogewogI2lmIENVUkxfQlVJTERfTUFDXzEwXzkgfHwgQ1VSTF9CVUlMRF9JT1NfNwogICBpZihTU0xTZXRTZXNzaW9uT3B0aW9uICE9IE5VTEwpCkBAIC0yNzY0LDE1ICsyODE5LDE1IEBACiAgICAgIG92ZXIgYWdhaW4gd2l0aCBubyBuZXcgZGF0YSB1bnRpbCBpdCBxdWl0cyByZXR1cm5pbmcgZXJyU1NMV291bGRCbG9jay4gKi8KIAogICAvKiBEbyB3ZSBoYXZlIGJ1ZmZlcmVkIGRhdGEgdG8gd3JpdGUgZnJvbSB0aGUgbGFzdCB0aW1lIHdlIHdlcmUgY2FsbGVkPyAqLwotICBpZihjb25uc3NsLT5zc2xfd3JpdGVfYnVmZmVyZWRfbGVuZ3RoKSB7CisgIGlmKEJBQ0tFTkQtPnNzbF93cml0ZV9idWZmZXJlZF9sZW5ndGgpIHsKICAgICAvKiBXcml0ZSB0aGUgYnVmZmVyZWQgZGF0YTogKi8KLSAgICBlcnIgPSBTU0xXcml0ZShjb25uc3NsLT5zc2xfY3R4LCBOVUxMLCAwVUwsICZwcm9jZXNzZWQpOworICAgIGVyciA9IFNTTFdyaXRlKEJBQ0tFTkQtPnNzbF9jdHgsIE5VTEwsIDBVTCwgJnByb2Nlc3NlZCk7CiAgICAgc3dpdGNoKGVycikgewogICAgICAgY2FzZSBub0VycjoKICAgICAgICAgLyogcHJvY2Vzc2VkIGlzIGFsd2F5cyBnb2luZyB0byBiZSAwIGJlY2F1c2Ugd2UgZGlkbid0IHdyaXRlIHRvCiAgICAgICAgICAgIHRoZSBidWZmZXIsIHNvIHJldHVybiBob3cgbXVjaCB3YXMgd3JpdHRlbiB0byB0aGUgc29ja2V0ICovCi0gICAgICAgIHByb2Nlc3NlZCA9IGNvbm5zc2wtPnNzbF93cml0ZV9idWZmZXJlZF9sZW5ndGg7Ci0gICAgICAgIGNvbm5zc2wtPnNzbF93cml0ZV9idWZmZXJlZF9sZW5ndGggPSAwVUw7CisgICAgICAgIHByb2Nlc3NlZCA9IEJBQ0tFTkQtPnNzbF93cml0ZV9idWZmZXJlZF9sZW5ndGg7CisgICAgICAgIEJBQ0tFTkQtPnNzbF93cml0ZV9idWZmZXJlZF9sZW5ndGggPSAwVUw7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBlcnJTU0xXb3VsZEJsb2NrOiAvKiBhcmdoLCB0cnkgYWdhaW4gKi8KICAgICAgICAgKmN1cmxjb2RlID0gQ1VSTEVfQUdBSU47CkBAIC0yNzg1LDEzICsyODQwLDEzIEBACiAgIH0KICAgZWxzZSB7CiAgICAgLyogV2UndmUgZ290IG5ldyBkYXRhIHRvIHdyaXRlOiAqLwotICAgIGVyciA9IFNTTFdyaXRlKGNvbm5zc2wtPnNzbF9jdHgsIG1lbSwgbGVuLCAmcHJvY2Vzc2VkKTsKKyAgICBlcnIgPSBTU0xXcml0ZShCQUNLRU5ELT5zc2xfY3R4LCBtZW0sIGxlbiwgJnByb2Nlc3NlZCk7CiAgICAgaWYoZXJyICE9IG5vRXJyKSB7CiAgICAgICBzd2l0Y2goZXJyKSB7CiAgICAgICAgIGNhc2UgZXJyU1NMV291bGRCbG9jazoKICAgICAgICAgICAvKiBEYXRhIHdhcyBidWZmZXJlZCBidXQgbm90IHNlbnQsIHdlIGhhdmUgdG8gdGVsbCB0aGUgY2FsbGVyCiAgICAgICAgICAgICAgdG8gdHJ5IHNlbmRpbmcgYWdhaW4sIGFuZCByZW1lbWJlciBob3cgbXVjaCB3YXMgYnVmZmVyZWQgKi8KLSAgICAgICAgICBjb25uc3NsLT5zc2xfd3JpdGVfYnVmZmVyZWRfbGVuZ3RoID0gbGVuOworICAgICAgICAgIEJBQ0tFTkQtPnNzbF93cml0ZV9idWZmZXJlZF9sZW5ndGggPSBsZW47CiAgICAgICAgICAgKmN1cmxjb2RlID0gQ1VSTEVfQUdBSU47CiAgICAgICAgICAgcmV0dXJuIC0xTDsKICAgICAgICAgZGVmYXVsdDoKQEAgLTI4MTMsNyArMjg2OCw3IEBACiAgIC8qc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7Ki8KICAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW251bV07CiAgIHNpemVfdCBwcm9jZXNzZWQgPSAwVUw7Ci0gIE9TU3RhdHVzIGVyciA9IFNTTFJlYWQoY29ubnNzbC0+c3NsX2N0eCwgYnVmLCBidWZmZXJzaXplLCAmcHJvY2Vzc2VkKTsKKyAgT1NTdGF0dXMgZXJyID0gU1NMUmVhZChCQUNLRU5ELT5zc2xfY3R4LCBidWYsIGJ1ZmZlcnNpemUsICZwcm9jZXNzZWQpOwogCiAgIGlmKGVyciAhPSBub0VycikgewogICAgIHN3aXRjaChlcnIpIHsKQEAgLTI4NDQsNCArMjg5OSw1MiBAQAogICByZXR1cm4gKHNzaXplX3QpcHJvY2Vzc2VkOwogfQogCitzdGF0aWMgdm9pZCAqQ3VybF9kYXJ3aW5zc2xfZ2V0X2ludGVybmFscyhzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxJTkZPIGluZm8gVU5VU0VEX1BBUkFNKQoreworICAodm9pZClpbmZvOworICByZXR1cm4gQkFDS0VORC0+c3NsX2N0eDsKK30KKworY29uc3Qgc3RydWN0IEN1cmxfc3NsIEN1cmxfc3NsX2RhcndpbnNzbCA9IHsKKyAgeyBDVVJMU1NMQkFDS0VORF9EQVJXSU5TU0wsICJkYXJ3aW5zc2wiIH0sIC8qIGluZm8gKi8KKworICAwLCAvKiBoYXZlX2NhX3BhdGggKi8KKyAgMCwgLyogaGF2ZV9jZXJ0aW5mbyAqLworI2lmZGVmIERBUldJTl9TU0xfUElOTkVEUFVCS0VZCisgIDEsIC8qIGhhdmVfcGlubmVkcHVia2V5ICovCisjZWxzZQorICAwLCAvKiBoYXZlX3Bpbm5lZHB1YmtleSAqLworI2VuZGlmIC8qIERBUldJTl9TU0xfUElOTkVEUFVCS0VZICovCisgIDAsIC8qIGhhdmVfc3NsX2N0eCAqLworICAwLCAvKiBzdXBwb3J0X2h0dHBzX3Byb3h5ICovCisKKyAgc2l6ZW9mKHN0cnVjdCBzc2xfYmFja2VuZF9kYXRhKSwKKworICBDdXJsX25vbmVfaW5pdCwgICAgICAgICAgICAgICAgICAgICAvKiBpbml0ICovCisgIEN1cmxfbm9uZV9jbGVhbnVwLCAgICAgICAgICAgICAgICAgIC8qIGNsZWFudXAgKi8KKyAgQ3VybF9kYXJ3aW5zc2xfdmVyc2lvbiwgICAgICAgICAgICAgLyogdmVyc2lvbiAqLworICBDdXJsX2RhcndpbnNzbF9jaGVja19jeG4sICAgICAgICAgICAvKiBjaGVja19jeG4gKi8KKyAgQ3VybF9kYXJ3aW5zc2xfc2h1dGRvd24sICAgICAgICAgICAgLyogc2h1dGRvd24gKi8KKyAgQ3VybF9kYXJ3aW5zc2xfZGF0YV9wZW5kaW5nLCAgICAgICAgLyogZGF0YV9wZW5kaW5nICovCisgIEN1cmxfZGFyd2luc3NsX3JhbmRvbSwgICAgICAgICAgICAgIC8qIHJhbmRvbSAqLworICBDdXJsX25vbmVfY2VydF9zdGF0dXNfcmVxdWVzdCwgICAgICAvKiBjZXJ0X3N0YXR1c19yZXF1ZXN0ICovCisgIEN1cmxfZGFyd2luc3NsX2Nvbm5lY3QsICAgICAgICAgICAgIC8qIGNvbm5lY3QgKi8KKyAgQ3VybF9kYXJ3aW5zc2xfY29ubmVjdF9ub25ibG9ja2luZywgLyogY29ubmVjdF9ub25ibG9ja2luZyAqLworICBDdXJsX2RhcndpbnNzbF9nZXRfaW50ZXJuYWxzLCAgICAgICAvKiBnZXRfaW50ZXJuYWxzICovCisgIEN1cmxfZGFyd2luc3NsX2Nsb3NlLCAgICAgICAgICAgICAgIC8qIGNsb3NlICovCisgIEN1cmxfbm9uZV9jbG9zZV9hbGwsICAgICAgICAgICAgICAgIC8qIGNsb3NlX2FsbCAqLworICBDdXJsX2RhcndpbnNzbF9zZXNzaW9uX2ZyZWUsICAgICAgICAvKiBzZXNzaW9uX2ZyZWUgKi8KKyAgQ3VybF9ub25lX3NldF9lbmdpbmUsICAgICAgICAgICAgICAgLyogc2V0X2VuZ2luZSAqLworICBDdXJsX25vbmVfc2V0X2VuZ2luZV9kZWZhdWx0LCAgICAgICAvKiBzZXRfZW5naW5lX2RlZmF1bHQgKi8KKyAgQ3VybF9ub25lX2VuZ2luZXNfbGlzdCwgICAgICAgICAgICAgLyogZW5naW5lc19saXN0ICovCisgIEN1cmxfZGFyd2luc3NsX2ZhbHNlX3N0YXJ0LCAgICAgICAgIC8qIGZhbHNlX3N0YXJ0ICovCisgIEN1cmxfZGFyd2luc3NsX21kNXN1bSwgICAgICAgICAgICAgIC8qIG1kNXN1bSAqLworICBDdXJsX2RhcndpbnNzbF9zaGEyNTZzdW0gICAgICAgICAgICAvKiBzaGEyNTZzdW0gKi8KK307CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCiAjZW5kaWYgLyogVVNFX0RBUldJTlNTTCAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9kYXJ3aW5zc2wuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvZGFyd2luc3NsLmgKaW5kZXggZmQzNzJmZi4uMjNjN2Y3MCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9kYXJ3aW5zc2wuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2RhcndpbnNzbC5oCkBAIC0yNiw3NSArMjYsNyBAQAogCiAjaWZkZWYgVVNFX0RBUldJTlNTTAogCi1DVVJMY29kZSBDdXJsX2RhcndpbnNzbF9jb25uZWN0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7Ci0KLUNVUkxjb2RlIEN1cmxfZGFyd2luc3NsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpkb25lKTsKLQotLyogY2xvc2UgYSBTU0wgY29ubmVjdGlvbiAqLwotdm9pZCBDdXJsX2RhcndpbnNzbF9jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOwotCi12b2lkIEN1cmxfZGFyd2luc3NsX3Nlc3Npb25fZnJlZSh2b2lkICpwdHIpOwotc2l6ZV90IEN1cmxfZGFyd2luc3NsX3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci1pbnQgQ3VybF9kYXJ3aW5zc2xfc2h1dGRvd24oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLWludCBDdXJsX2RhcndpbnNzbF9jaGVja19jeG4oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKTsKLWJvb2wgQ3VybF9kYXJ3aW5zc2xfZGF0YV9wZW5kaW5nKGNvbnN0IHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25uaW5kZXgpOwotCi1DVVJMY29kZSBDdXJsX2RhcndpbnNzbF9yYW5kb20odW5zaWduZWQgY2hhciAqZW50cm9weSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKTsKLXZvaWQgQ3VybF9kYXJ3aW5zc2xfbWQ1c3VtKHVuc2lnbmVkIGNoYXIgKnRtcCwgLyogaW5wdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0bXBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICptZDVzdW0sIC8qIG91dHB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1kNWxlbik7Ci12b2lkIEN1cmxfZGFyd2luc3NsX3NoYTI1NnN1bSh1bnNpZ25lZCBjaGFyICp0bXAsIC8qIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdG1wbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqc2hhMjU2c3VtLCAvKiBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaGEyNTZsZW4pOwotYm9vbCBDdXJsX2RhcndpbnNzbF9mYWxzZV9zdGFydCh2b2lkKTsKLQotLyogU2V0IHRoZSBBUEkgYmFja2VuZCBkZWZpbml0aW9uIHRvIFNlY3VyZVRyYW5zcG9ydCAqLwotI2RlZmluZSBDVVJMX1NTTF9CQUNLRU5EIENVUkxTU0xCQUNLRU5EX0RBUldJTlNTTAotCi0vKiBwaW5uZWQgcHVibGljIGtleSBzdXBwb3J0IHRlc3RzICovCi0KLS8qIHZlcnNpb24gMSBzdXBwb3J0cyBtYWNPUyAxMC4xMisgYW5kIGlPUyAxMCsgKi8KLSNpZiAoKFRBUkdFVF9PU19JUEhPTkUgJiYgX19JUEhPTkVfT1NfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPj0gMTAwMDAwKSB8fCBcCi0gICAgKCFUQVJHRVRfT1NfSVBIT05FICYmIF9fTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgID49IDEwMTIwMCkpCi0jZGVmaW5lIERBUldJTl9TU0xfUElOTkVEUFVCS0VZX1YxIDEKLSNlbmRpZgotCi0vKiB2ZXJzaW9uIDIgc3VwcG9ydHMgTWFjT1NYIDEwLjcrICovCi0jaWYgKCFUQVJHRVRfT1NfSVBIT05FICYmIF9fTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPj0gMTA3MCkKLSNkZWZpbmUgREFSV0lOX1NTTF9QSU5ORURQVUJLRVlfVjIgMQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKERBUldJTl9TU0xfUElOTkVEUFVCS0VZX1YxKSB8fCBkZWZpbmVkKERBUldJTl9TU0xfUElOTkVEUFVCS0VZX1YyKQotLyogdGhpcyBiYWNrZW5kIHN1cHBvcnRzIENVUkxPUFRfUElOTkVEUFVCTElDS0VZICovCi0jZGVmaW5lIERBUldJTl9TU0xfUElOTkVEUFVCS0VZIDEKLSNkZWZpbmUgaGF2ZV9jdXJsc3NsX3Bpbm5lZHB1YmtleSAxCi0jZW5kaWYgLyogREFSV0lOX1NTTF9QSU5ORURQVUJLRVkgKi8KLQotLyogQVBJIHNldHVwIGZvciBTZWN1cmVUcmFuc3BvcnQgKi8KLSNkZWZpbmUgY3VybHNzbF9pbml0KCkgKDEpCi0jZGVmaW5lIGN1cmxzc2xfY2xlYW51cCgpIEN1cmxfbm9wX3N0bXQKLSNkZWZpbmUgY3VybHNzbF9jb25uZWN0IEN1cmxfZGFyd2luc3NsX2Nvbm5lY3QKLSNkZWZpbmUgY3VybHNzbF9jb25uZWN0X25vbmJsb2NraW5nIEN1cmxfZGFyd2luc3NsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcKLSNkZWZpbmUgY3VybHNzbF9zZXNzaW9uX2ZyZWUoeCkgQ3VybF9kYXJ3aW5zc2xfc2Vzc2lvbl9mcmVlKHgpCi0jZGVmaW5lIGN1cmxzc2xfY2xvc2VfYWxsKHgpICgodm9pZCl4KQotI2RlZmluZSBjdXJsc3NsX2Nsb3NlIEN1cmxfZGFyd2luc3NsX2Nsb3NlCi0jZGVmaW5lIGN1cmxzc2xfc2h1dGRvd24oeCx5KSAwCi0jZGVmaW5lIGN1cmxzc2xfc2V0X2VuZ2luZSh4LHkpICgodm9pZCl4LCAodm9pZCl5LCBDVVJMRV9OT1RfQlVJTFRfSU4pCi0jZGVmaW5lIGN1cmxzc2xfc2V0X2VuZ2luZV9kZWZhdWx0KHgpICgodm9pZCl4LCBDVVJMRV9OT1RfQlVJTFRfSU4pCi0jZGVmaW5lIGN1cmxzc2xfZW5naW5lc19saXN0KHgpICgodm9pZCl4LCAoc3RydWN0IGN1cmxfc2xpc3QgKilOVUxMKQotI2RlZmluZSBjdXJsc3NsX3ZlcnNpb24gQ3VybF9kYXJ3aW5zc2xfdmVyc2lvbgotI2RlZmluZSBjdXJsc3NsX2NoZWNrX2N4biBDdXJsX2RhcndpbnNzbF9jaGVja19jeG4KLSNkZWZpbmUgY3VybHNzbF9kYXRhX3BlbmRpbmcoeCx5KSBDdXJsX2RhcndpbnNzbF9kYXRhX3BlbmRpbmcoeCwgeSkKLSNkZWZpbmUgY3VybHNzbF9yYW5kb20oeCx5LHopICgodm9pZCl4LCBDdXJsX2RhcndpbnNzbF9yYW5kb20oeSx6KSkKLSNkZWZpbmUgY3VybHNzbF9tZDVzdW0oYSxiLGMsZCkgQ3VybF9kYXJ3aW5zc2xfbWQ1c3VtKGEsYixjLGQpCi0jZGVmaW5lIGN1cmxzc2xfc2hhMjU2c3VtKGEsYixjLGQpIEN1cmxfZGFyd2luc3NsX3NoYTI1NnN1bShhLGIsYyxkKQotI2RlZmluZSBjdXJsc3NsX2ZhbHNlX3N0YXJ0KCkgQ3VybF9kYXJ3aW5zc2xfZmFsc2Vfc3RhcnQoKQorZXh0ZXJuIGNvbnN0IHN0cnVjdCBDdXJsX3NzbCBDdXJsX3NzbF9kYXJ3aW5zc2w7CiAKICNlbmRpZiAvKiBVU0VfREFSV0lOU1NMICovCiAjZW5kaWYgLyogSEVBREVSX0NVUkxfREFSV0lOU1NMX0ggKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvZ3NraXQuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvZ3NraXQuYwppbmRleCBiZjc1YmRkLi5iYTVmYWVmIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2dza2l0LmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9nc2tpdC5jCkBAIC05OCw2ICs5OCwxNCBAQAogI2RlZmluZSBDVVJMX0dTS1BST1RPX1RMU1YxMl9NQVNLICAgICAgICAoMSA8PCBDVVJMX0dTS1BST1RPX1RMU1YxMikKICNkZWZpbmUgQ1VSTF9HU0tQUk9UT19MQVNUICAgICAgNQogCitzdHJ1Y3Qgc3NsX2JhY2tlbmRfZGF0YSB7CisgIGdza19oYW5kbGUgaGFuZGxlOworICBpbnQgaW9jcG9ydDsKKyAgaW50IGxvY2FsZmQ7CisgIGludCByZW1vdGVmZDsKK307CisKKyNkZWZpbmUgQkFDS0VORCBjb25uc3NsLT5iYWNrZW5kCiAKIC8qIFN1cHBvcnRlZCBjaXBoZXJzLiAqLwogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtNDI3LDcgKzQzNSw3IEBACiB9CiAKIAotaW50IEN1cmxfZ3NraXRfaW5pdCh2b2lkKQorc3RhdGljIGludCBDdXJsX2dza2l0X2luaXQodm9pZCkKIHsKICAgLyogTm8gaW5pdGlhbGlzYXRpb24gbmVlZGVkLiAqLwogCkBAIC00MzUsNyArNDQzLDcgQEAKIH0KIAogCi12b2lkIEN1cmxfZ3NraXRfY2xlYW51cCh2b2lkKQorc3RhdGljIHZvaWQgQ3VybF9nc2tpdF9jbGVhbnVwKHZvaWQpCiB7CiAgIC8qIE5vdGhpbmcgdG8gZG8uICovCiB9CkBAIC00OTUsMTQgKzUwMywxNCBAQAogICBRc29fT3ZlcmxhcHBlZElPX3QgY3N0YXQ7CiAKICAgaWYoUXNvQ2FuY2VsT3BlcmF0aW9uKGNvbm4tPnNvY2tbc29ja2luZGV4XSwgMCkgPiAwKQotICAgIFFzb1dhaXRGb3JJT0NvbXBsZXRpb24oY29ubnNzbC0+aW9jcG9ydCwgJmNzdGF0LCAoc3RydWN0IHRpbWV2YWwgKikgTlVMTCk7CisgICAgUXNvV2FpdEZvcklPQ29tcGxldGlvbihCQUNLRU5ELT5pb2Nwb3J0LCAmY3N0YXQsIChzdHJ1Y3QgdGltZXZhbCAqKSBOVUxMKTsKIH0KIAogCiBzdGF0aWMgdm9pZCBjbG9zZV9hc3luY19oYW5kc2hha2Uoc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wpCiB7Ci0gIFFzb0Rlc3Ryb3lJT0NvbXBsZXRpb25Qb3J0KGNvbm5zc2wtPmlvY3BvcnQpOwotICBjb25uc3NsLT5pb2Nwb3J0ID0gLTE7CisgIFFzb0Rlc3Ryb3lJT0NvbXBsZXRpb25Qb3J0KEJBQ0tFTkQtPmlvY3BvcnQpOworICBCQUNLRU5ELT5pb2Nwb3J0ID0gLTE7CiB9CiAKIC8qIFNTTCBvdmVyIFNTTApAQCAtNjIwLDEyICs2MjgsMTIgQEAKICAgRkRfWkVSTygmZmRzX3dyaXRlKTsKICAgbiA9IC0xOwogICBpZihkaXJlY3Rpb25zICYgU09TX1JFQUQpIHsKLSAgICBGRF9TRVQoY29ubnNzbC0+cmVtb3RlZmQsICZmZHNfd3JpdGUpOwotICAgIG4gPSBjb25uc3NsLT5yZW1vdGVmZDsKKyAgICBGRF9TRVQoQkFDS0VORC0+cmVtb3RlZmQsICZmZHNfd3JpdGUpOworICAgIG4gPSBCQUNLRU5ELT5yZW1vdGVmZDsKICAgfQogICBpZihkaXJlY3Rpb25zICYgU09TX1dSSVRFKSB7Ci0gICAgRkRfU0VUKGNvbm5zc2wtPnJlbW90ZWZkLCAmZmRzX3JlYWQpOwotICAgIG4gPSBjb25uc3NsLT5yZW1vdGVmZDsKKyAgICBGRF9TRVQoQkFDS0VORC0+cmVtb3RlZmQsICZmZHNfcmVhZCk7CisgICAgbiA9IEJBQ0tFTkQtPnJlbW90ZWZkOwogICAgIEZEX1NFVChjb25uLT5zb2NrW3NvY2tpbmRleF0sICZmZHNfd3JpdGUpOwogICAgIGlmKG4gPCBjb25uLT5zb2NrW3NvY2tpbmRleF0pCiAgICAgICBuID0gY29ubi0+c29ja1tzb2NraW5kZXhdOwpAQCAtNjM0LDE0ICs2NDIsMTUgQEAKICAgaWYoaSA8IDApCiAgICAgcmV0dXJuIC0xOyAgLyogU2VsZWN0IGVycm9yLiAqLwogCi0gIGlmKEZEX0lTU0VUKGNvbm5zc2wtPnJlbW90ZWZkLCAmZmRzX3dyaXRlKSkgeworICBpZihGRF9JU1NFVChCQUNLRU5ELT5yZW1vdGVmZCwgJmZkc193cml0ZSkpIHsKICAgICAvKiBUcnkgZ2V0dGluZyBkYXRhIGZyb20gSFRUUFMgcHJveHkgYW5kIHBpcGUgaXQgdXBzdHJlYW0uICovCiAgICAgbiA9IDA7Ci0gICAgaSA9IGdza19zZWN1cmVfc29jX3JlYWQoY29ubnByb3h5c3NsLT5oYW5kbGUsIGJ1Ziwgc2l6ZW9mIGJ1ZiwgJm4pOworICAgIGkgPSBnc2tfc2VjdXJlX3NvY19yZWFkKGNvbm5wcm94eXNzbC0+YmFja2VuZC0+aGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Ziwgc2l6ZW9mIGJ1ZiwgJm4pOwogICAgIHN3aXRjaChpKSB7CiAgICAgY2FzZSBHU0tfT0s6CiAgICAgICBpZihuKSB7Ci0gICAgICAgIGkgPSB3cml0ZShjb25uc3NsLT5yZW1vdGVmZCwgYnVmLCBuKTsKKyAgICAgICAgaSA9IHdyaXRlKEJBQ0tFTkQtPnJlbW90ZWZkLCBidWYsIG4pOwogICAgICAgICBpZihpIDwgMCkKICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIHJldCA9IDE7CkBAIC02NTUsMTQgKzY2NCwxNCBAQAogICAgIH0KICAgfQogCi0gIGlmKEZEX0lTU0VUKGNvbm5zc2wtPnJlbW90ZWZkLCAmZmRzX3JlYWQpICYmCisgIGlmKEZEX0lTU0VUKEJBQ0tFTkQtPnJlbW90ZWZkLCAmZmRzX3JlYWQpICYmCiAgICAgIEZEX0lTU0VUKGNvbm4tPnNvY2tbc29ja2luZGV4XSwgJmZkc193cml0ZSkpIHsKICAgICAvKiBQaXBlIGRhdGEgdG8gSFRUUFMgcHJveHkuICovCi0gICAgbiA9IHJlYWQoY29ubnNzbC0+cmVtb3RlZmQsIGJ1Ziwgc2l6ZW9mIGJ1Zik7CisgICAgbiA9IHJlYWQoQkFDS0VORC0+cmVtb3RlZmQsIGJ1Ziwgc2l6ZW9mIGJ1Zik7CiAgICAgaWYobiA8IDApCiAgICAgICByZXR1cm4gLTE7CiAgICAgaWYobikgewotICAgICAgaSA9IGdza19zZWN1cmVfc29jX3dyaXRlKGNvbm5wcm94eXNzbC0+aGFuZGxlLCBidWYsIG4sICZtKTsKKyAgICAgIGkgPSBnc2tfc2VjdXJlX3NvY193cml0ZShjb25ucHJveHlzc2wtPmJhY2tlbmQtPmhhbmRsZSwgYnVmLCBuLCAmbSk7CiAgICAgICBpZihpICE9IEdTS19PSyB8fCBuICE9IG0pCiAgICAgICAgIHJldHVybiAtMTsKICAgICAgIHJldCA9IDE7CkBAIC02NzYsMjMgKzY4NSwyMyBAQAogc3RhdGljIHZvaWQgY2xvc2Vfb25lKHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsLAogICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKLSAgaWYoY29ubnNzbC0+aGFuZGxlKSB7Ci0gICAgZ3NraXRfc3RhdHVzKGNvbm4tPmRhdGEsIGdza19zZWN1cmVfc29jX2Nsb3NlKCZjb25uc3NsLT5oYW5kbGUpLAorICBpZihCQUNLRU5ELT5oYW5kbGUpIHsKKyAgICBnc2tpdF9zdGF0dXMoY29ubi0+ZGF0YSwgZ3NrX3NlY3VyZV9zb2NfY2xvc2UoJkJBQ0tFTkQtPmhhbmRsZSksCiAgICAgICAgICAgICAgICJnc2tfc2VjdXJlX3NvY19jbG9zZSgpIiwgMCk7CiAgICAgLyogTGFzdCBjaGFuY2UgdG8gZHJhaW4gb3V0cHV0LiAqLwogICAgIHdoaWxlKHBpcGVfc3Nsb3ZlcnNzbChjb25uLCBzb2NraW5kZXgsIFNPU19XUklURSkgPiAwKQogICAgICAgOwotICAgIGNvbm5zc2wtPmhhbmRsZSA9IChnc2tfaGFuZGxlKSBOVUxMOwotICAgIGlmKGNvbm5zc2wtPmxvY2FsZmQgPj0gMCkgewotICAgICAgY2xvc2UoY29ubnNzbC0+bG9jYWxmZCk7Ci0gICAgICBjb25uc3NsLT5sb2NhbGZkID0gLTE7CisgICAgQkFDS0VORC0+aGFuZGxlID0gKGdza19oYW5kbGUpIE5VTEw7CisgICAgaWYoQkFDS0VORC0+bG9jYWxmZCA+PSAwKSB7CisgICAgICBjbG9zZShCQUNLRU5ELT5sb2NhbGZkKTsKKyAgICAgIEJBQ0tFTkQtPmxvY2FsZmQgPSAtMTsKICAgICB9Ci0gICAgaWYoY29ubnNzbC0+cmVtb3RlZmQgPj0gMCkgewotICAgICAgY2xvc2UoY29ubnNzbC0+cmVtb3RlZmQpOwotICAgICAgY29ubnNzbC0+cmVtb3RlZmQgPSAtMTsKKyAgICBpZihCQUNLRU5ELT5yZW1vdGVmZCA+PSAwKSB7CisgICAgICBjbG9zZShCQUNLRU5ELT5yZW1vdGVmZCk7CisgICAgICBCQUNLRU5ELT5yZW1vdGVmZCA9IC0xOwogICAgIH0KICAgfQotICBpZihjb25uc3NsLT5pb2Nwb3J0ID49IDApCisgIGlmKEJBQ0tFTkQtPmlvY3BvcnQgPj0gMCkKICAgICBjbG9zZV9hc3luY19oYW5kc2hha2UoY29ubnNzbCk7CiB9CiAKQEAgLTcwMCwxMyArNzA5LDE0IEBACiBzdGF0aWMgc3NpemVfdCBnc2tpdF9zZW5kKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKm1lbSwgc2l6ZV90IGxlbiwgQ1VSTGNvZGUgKmN1cmxjb2RlKQogeworICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbc29ja2luZGV4XTsKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgIENVUkxjb2RlIGNjID0gQ1VSTEVfU0VORF9FUlJPUjsKICAgaW50IHdyaXR0ZW47CiAKICAgaWYocGlwZV9zc2xvdmVyc3NsKGNvbm4sIHNvY2tpbmRleCwgU09TX1dSSVRFKSA+PSAwKSB7CiAgICAgY2MgPSBnc2tpdF9zdGF0dXMoZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICBnc2tfc2VjdXJlX3NvY193cml0ZShjb25uLT5zc2xbc29ja2luZGV4XS5oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgZ3NrX3NlY3VyZV9zb2Nfd3JpdGUoQkFDS0VORC0+aGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1lbSwgKGludCkgbGVuLCAmd3JpdHRlbiksCiAgICAgICAgICAgICAgICAgICAgICAgImdza19zZWN1cmVfc29jX3dyaXRlKCkiLCBDVVJMRV9TRU5EX0VSUk9SKTsKICAgICBpZihjYyA9PSBDVVJMRV9PSykKQEAgLTcyNCw2ICs3MzQsNyBAQAogc3RhdGljIHNzaXplX3QgZ3NraXRfcmVjdihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBudW0sIGNoYXIgKmJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJzaXplLCBDVVJMY29kZSAqY3VybGNvZGUpCiB7CisgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtudW1dOwogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKICAgaW50IGJ1ZmZzaXplOwogICBpbnQgbnJlYWQ7CkBAIC03MzEsNyArNzQyLDcgQEAKIAogICBpZihwaXBlX3NzbG92ZXJzc2woY29ubiwgbnVtLCBTT1NfUkVBRCkgPj0gMCkgewogICAgIGJ1ZmZzaXplID0gYnVmZmVyc2l6ZSA+IChzaXplX3QpIElOVF9NQVg/IElOVF9NQVg6IChpbnQpIGJ1ZmZlcnNpemU7Ci0gICAgY2MgPSBnc2tpdF9zdGF0dXMoZGF0YSwgZ3NrX3NlY3VyZV9zb2NfcmVhZChjb25uLT5zc2xbbnVtXS5oYW5kbGUsCisgICAgY2MgPSBnc2tpdF9zdGF0dXMoZGF0YSwgZ3NrX3NlY3VyZV9zb2NfcmVhZChCQUNLRU5ELT5oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGJ1ZmZzaXplLCAmbnJlYWQpLAogICAgICAgICAgICAgICAgICAgICAgICJnc2tfc2VjdXJlX3NvY19yZWFkKCkiLCBDVVJMRV9SRUNWX0VSUk9SKTsKICAgfQpAQCAtODA2LDEwICs4MTcsMTAgQEAKIAogICAvKiBDcmVhdGUgU1NMIGVudmlyb25tZW50LCBzdGFydCAocHJlZmVyYWJseSBhc3luY2hyb25vdXMpIGhhbmRzaGFrZS4gKi8KIAotICBjb25uc3NsLT5oYW5kbGUgPSAoZ3NrX2hhbmRsZSkgTlVMTDsKLSAgY29ubnNzbC0+aW9jcG9ydCA9IC0xOwotICBjb25uc3NsLT5sb2NhbGZkID0gLTE7Ci0gIGNvbm5zc2wtPnJlbW90ZWZkID0gLTE7CisgIEJBQ0tFTkQtPmhhbmRsZSA9IChnc2tfaGFuZGxlKSBOVUxMOworICBCQUNLRU5ELT5pb2Nwb3J0ID0gLTE7CisgIEJBQ0tFTkQtPmxvY2FsZmQgPSAtMTsKKyAgQkFDS0VORC0+cmVtb3RlZmQgPSAtMTsKIAogICAvKiBHU0tpdCBzdXBwb3J0cyB0d28gd2F5cyBvZiBzcGVjaWZ5aW5nIGFuIFNTTCBjb250ZXh0OiBlaXRoZXIgYnkKICAgICogIGFwcGxpY2F0aW9uIGlkZW50aWZpZXIgKHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBkZWZpbmVkIGF0IHRoZSBzeXN0ZW0KQEAgLTg0Miw3ICs4NTMsNyBAQAogICB9CiAKICAgLyogQ3JlYXRlIHNlY3VyZSBzZXNzaW9uLiAqLwotICByZXN1bHQgPSBnc2tpdF9zdGF0dXMoZGF0YSwgZ3NrX3NlY3VyZV9zb2Nfb3BlbihlbnZpciwgJmNvbm5zc2wtPmhhbmRsZSksCisgIHJlc3VsdCA9IGdza2l0X3N0YXR1cyhkYXRhLCBnc2tfc2VjdXJlX3NvY19vcGVuKGVudmlyLCAmQkFDS0VORC0+aGFuZGxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJnc2tfc2VjdXJlX3NvY19vcGVuKCkiLCBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUik7CiAgIGdza19lbnZpcm9ubWVudF9jbG9zZSgmZW52aXIpOwogICBpZihyZXN1bHQpCkBAIC04NTIsMTggKzg2MywxOCBAQAogICBpZihjb25uLT5wcm94eV9zc2xbc29ja2luZGV4XS51c2UpIHsKICAgICBpZihpbmV0c29ja2V0cGFpcihzb2NrcGFpcikpCiAgICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7Ci0gICAgY29ubnNzbC0+bG9jYWxmZCA9IHNvY2twYWlyWzBdOwotICAgIGNvbm5zc2wtPnJlbW90ZWZkID0gc29ja3BhaXJbMV07Ci0gICAgc2V0c29ja29wdChjb25uc3NsLT5sb2NhbGZkLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsCisgICAgQkFDS0VORC0+bG9jYWxmZCA9IHNvY2twYWlyWzBdOworICAgIEJBQ0tFTkQtPnJlbW90ZWZkID0gc29ja3BhaXJbMV07CisgICAgc2V0c29ja29wdChCQUNLRU5ELT5sb2NhbGZkLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsCiAgICAgICAgICAgICAgICAodm9pZCAqKSBzb2J1ZnNpemUsIHNpemVvZiBzb2J1ZnNpemUpOwotICAgIHNldHNvY2tvcHQoY29ubnNzbC0+cmVtb3RlZmQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwKKyAgICBzZXRzb2Nrb3B0KEJBQ0tFTkQtPnJlbW90ZWZkLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsCiAgICAgICAgICAgICAgICAodm9pZCAqKSBzb2J1ZnNpemUsIHNpemVvZiBzb2J1ZnNpemUpOwotICAgIHNldHNvY2tvcHQoY29ubnNzbC0+bG9jYWxmZCwgU09MX1NPQ0tFVCwgU09fU05EQlVGLAorICAgIHNldHNvY2tvcHQoQkFDS0VORC0+bG9jYWxmZCwgU09MX1NPQ0tFVCwgU09fU05EQlVGLAogICAgICAgICAgICAgICAgKHZvaWQgKikgc29idWZzaXplLCBzaXplb2Ygc29idWZzaXplKTsKLSAgICBzZXRzb2Nrb3B0KGNvbm5zc2wtPnJlbW90ZWZkLCBTT0xfU09DS0VULCBTT19TTkRCVUYsCisgICAgc2V0c29ja29wdChCQUNLRU5ELT5yZW1vdGVmZCwgU09MX1NPQ0tFVCwgU09fU05EQlVGLAogICAgICAgICAgICAgICAgKHZvaWQgKikgc29idWZzaXplLCBzaXplb2Ygc29idWZzaXplKTsKLSAgICBjdXJseF9ub25ibG9jayhjb25uc3NsLT5sb2NhbGZkLCBUUlVFKTsKLSAgICBjdXJseF9ub25ibG9jayhjb25uc3NsLT5yZW1vdGVmZCwgVFJVRSk7CisgICAgY3VybHhfbm9uYmxvY2soQkFDS0VORC0+bG9jYWxmZCwgVFJVRSk7CisgICAgY3VybHhfbm9uYmxvY2soQkFDS0VORC0+cmVtb3RlZmQsIFRSVUUpOwogICB9CiAKICAgLyogRGV0ZXJtaW5lIHdoaWNoIFNTTC9UTFMgdmVyc2lvbiBzaG91bGQgYmUgZW5hYmxlZC4gKi8KQEAgLTg5Nyw3ICs5MDgsNyBAQAogCiAgIC8qIFByb2Nlc3MgU05JLiBJZ25vcmUgaWYgbm90IHN1cHBvcnRlZCAob24gT1M0MDAgPCBWN1IxKS4gKi8KICAgaWYoc25pKSB7Ci0gICAgcmVzdWx0ID0gc2V0X2J1ZmZlcihkYXRhLCBjb25uc3NsLT5oYW5kbGUsCisgICAgcmVzdWx0ID0gc2V0X2J1ZmZlcihkYXRhLCBCQUNLRU5ELT5oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBHU0tfU1NMX0VYVE5fU0VSVkVSTkFNRV9SRVFVRVNULCBzbmksIFRSVUUpOwogICAgIGlmKHJlc3VsdCA9PSBDVVJMRV9VTlNVUFBPUlRFRF9QUk9UT0NPTCkKICAgICAgIHJlc3VsdCA9IENVUkxFX09LOwpAQCAtOTExLDM0ICs5MjIsMzQgQEAKICAgICBpZih0aW1lb3V0IDwgMCkKICAgICAgIHJlc3VsdCA9IENVUkxFX09QRVJBVElPTl9USU1FRE9VVDsKICAgICBlbHNlCi0gICAgICByZXN1bHQgPSBzZXRfbnVtZXJpYyhkYXRhLCBjb25uc3NsLT5oYW5kbGUsIEdTS19IQU5EU0hBS0VfVElNRU9VVCwKKyAgICAgIHJlc3VsdCA9IHNldF9udW1lcmljKGRhdGEsIEJBQ0tFTkQtPmhhbmRsZSwgR1NLX0hBTkRTSEFLRV9USU1FT1VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpbWVvdXQgKyA5OTkpIC8gMTAwMCk7CiAgIH0KICAgaWYoIXJlc3VsdCkKLSAgICByZXN1bHQgPSBzZXRfbnVtZXJpYyhkYXRhLCBjb25uc3NsLT5oYW5kbGUsIEdTS19PUzQwMF9SRUFEX1RJTUVPVVQsIDEpOworICAgIHJlc3VsdCA9IHNldF9udW1lcmljKGRhdGEsIEJBQ0tFTkQtPmhhbmRsZSwgR1NLX09TNDAwX1JFQURfVElNRU9VVCwgMSk7CiAgIGlmKCFyZXN1bHQpCi0gICAgcmVzdWx0ID0gc2V0X251bWVyaWMoZGF0YSwgY29ubnNzbC0+aGFuZGxlLCBHU0tfRkQsIGNvbm5zc2wtPmxvY2FsZmQgPj0gMD8KLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25uc3NsLT5sb2NhbGZkOiBjb25uLT5zb2NrW3NvY2tpbmRleF0pOworICAgIHJlc3VsdCA9IHNldF9udW1lcmljKGRhdGEsIEJBQ0tFTkQtPmhhbmRsZSwgR1NLX0ZELCBCQUNLRU5ELT5sb2NhbGZkID49IDA/CisgICAgICAgICAgICAgICAgICAgICAgICAgQkFDS0VORC0+bG9jYWxmZDogY29ubi0+c29ja1tzb2NraW5kZXhdKTsKICAgaWYoIXJlc3VsdCkKLSAgICByZXN1bHQgPSBzZXRfY2lwaGVycyhjb25uLCBjb25uc3NsLT5oYW5kbGUsICZwcm90b2ZsYWdzKTsKKyAgICByZXN1bHQgPSBzZXRfY2lwaGVycyhjb25uLCBCQUNLRU5ELT5oYW5kbGUsICZwcm90b2ZsYWdzKTsKICAgaWYoIXByb3RvZmxhZ3MpIHsKICAgICBmYWlsZihkYXRhLCAiTm8gU1NMIHByb3RvY29sL2NpcGhlciBjb21iaW5hdGlvbiBlbmFibGVkIik7CiAgICAgcmVzdWx0ID0gQ1VSTEVfU1NMX0NJUEhFUjsKICAgfQogICBpZighcmVzdWx0KQotICAgIHJlc3VsdCA9IHNldF9lbnVtKGRhdGEsIGNvbm5zc2wtPmhhbmRsZSwgR1NLX1BST1RPQ09MX1NTTFYyLAorICAgIHJlc3VsdCA9IHNldF9lbnVtKGRhdGEsIEJBQ0tFTkQtPmhhbmRsZSwgR1NLX1BST1RPQ09MX1NTTFYyLAogICAgICAgICAgICAgICAgICAgICAgIChwcm90b2ZsYWdzICYgQ1VSTF9HU0tQUk9UT19TU0xWMl9NQVNLKT8KICAgICAgICAgICAgICAgICAgICAgICBHU0tfUFJPVE9DT0xfU1NMVjJfT046IEdTS19QUk9UT0NPTF9TU0xWMl9PRkYsIEZBTFNFKTsKICAgaWYoIXJlc3VsdCkKLSAgICByZXN1bHQgPSBzZXRfZW51bShkYXRhLCBjb25uc3NsLT5oYW5kbGUsIEdTS19QUk9UT0NPTF9TU0xWMywKKyAgICByZXN1bHQgPSBzZXRfZW51bShkYXRhLCBCQUNLRU5ELT5oYW5kbGUsIEdTS19QUk9UT0NPTF9TU0xWMywKICAgICAgICAgICAgICAgICAgICAgICAocHJvdG9mbGFncyAmIENVUkxfR1NLUFJPVE9fU1NMVjNfTUFTSyk/CiAgICAgICAgICAgICAgICAgICAgICAgR1NLX1BST1RPQ09MX1NTTFYzX09OOiBHU0tfUFJPVE9DT0xfU1NMVjNfT0ZGLCBGQUxTRSk7CiAgIGlmKCFyZXN1bHQpCi0gICAgcmVzdWx0ID0gc2V0X2VudW0oZGF0YSwgY29ubnNzbC0+aGFuZGxlLCBHU0tfUFJPVE9DT0xfVExTVjEsCisgICAgcmVzdWx0ID0gc2V0X2VudW0oZGF0YSwgQkFDS0VORC0+aGFuZGxlLCBHU0tfUFJPVE9DT0xfVExTVjEsCiAgICAgICAgICAgICAgICAgICAgICAgKHByb3RvZmxhZ3MgJiBDVVJMX0dTS1BST1RPX1RMU1YxMF9NQVNLKT8KICAgICAgICAgICAgICAgICAgICAgICBHU0tfUFJPVE9DT0xfVExTVjFfT046IEdTS19QUk9UT0NPTF9UTFNWMV9PRkYsIEZBTFNFKTsKICAgaWYoIXJlc3VsdCkgewotICAgIHJlc3VsdCA9IHNldF9lbnVtKGRhdGEsIGNvbm5zc2wtPmhhbmRsZSwgR1NLX1BST1RPQ09MX1RMU1YxMSwKKyAgICByZXN1bHQgPSBzZXRfZW51bShkYXRhLCBCQUNLRU5ELT5oYW5kbGUsIEdTS19QUk9UT0NPTF9UTFNWMTEsCiAgICAgICAgICAgICAgICAgICAgICAgKHByb3RvZmxhZ3MgJiBDVVJMX0dTS1BST1RPX1RMU1YxMV9NQVNLKT8KICAgICAgICAgICAgICAgICAgICAgICBHU0tfVFJVRTogR1NLX0ZBTFNFLCBUUlVFKTsKICAgICBpZihyZXN1bHQgPT0gQ1VSTEVfVU5TVVBQT1JURURfUFJPVE9DT0wpIHsKQEAgLTk1MCw3ICs5NjEsNyBAQAogICAgIH0KICAgfQogICBpZighcmVzdWx0KSB7Ci0gICAgcmVzdWx0ID0gc2V0X2VudW0oZGF0YSwgY29ubnNzbC0+aGFuZGxlLCBHU0tfUFJPVE9DT0xfVExTVjEyLAorICAgIHJlc3VsdCA9IHNldF9lbnVtKGRhdGEsIEJBQ0tFTkQtPmhhbmRsZSwgR1NLX1BST1RPQ09MX1RMU1YxMiwKICAgICAgICAgICAgICAgICAgICAgICAocHJvdG9mbGFncyAmIENVUkxfR1NLUFJPVE9fVExTVjEyX01BU0spPwogICAgICAgICAgICAgICAgICAgICAgIEdTS19UUlVFOiBHU0tfRkFMU0UsIFRSVUUpOwogICAgIGlmKHJlc3VsdCA9PSBDVVJMRV9VTlNVUFBPUlRFRF9QUk9UT0NPTCkgewpAQCAtOTYyLDE4ICs5NzMsMTggQEAKICAgICB9CiAgIH0KICAgaWYoIXJlc3VsdCkKLSAgICByZXN1bHQgPSBzZXRfZW51bShkYXRhLCBjb25uc3NsLT5oYW5kbGUsIEdTS19TRVJWRVJfQVVUSF9UWVBFLAorICAgIHJlc3VsdCA9IHNldF9lbnVtKGRhdGEsIEJBQ0tFTkQtPmhhbmRsZSwgR1NLX1NFUlZFUl9BVVRIX1RZUEUsCiAgICAgICAgICAgICAgICAgICAgICAgdmVyaWZ5cGVlcj8gR1NLX1NFUlZFUl9BVVRIX0ZVTEw6CiAgICAgICAgICAgICAgICAgICAgICAgR1NLX1NFUlZFUl9BVVRIX1BBU1NUSFJVLCBGQUxTRSk7CiAKICAgaWYoIXJlc3VsdCkgewogICAgIC8qIFN0YXJ0IGhhbmRzaGFrZS4gVHJ5IGFzeW5jaHJvbm91cyBmaXJzdC4gKi8KICAgICBtZW1zZXQoJmNvbW1hcmVhLCAwLCBzaXplb2YgY29tbWFyZWEpOwotICAgIGNvbm5zc2wtPmlvY3BvcnQgPSBRc29DcmVhdGVJT0NvbXBsZXRpb25Qb3J0KCk7Ci0gICAgaWYoY29ubnNzbC0+aW9jcG9ydCAhPSAtMSkgeworICAgIEJBQ0tFTkQtPmlvY3BvcnQgPSBRc29DcmVhdGVJT0NvbXBsZXRpb25Qb3J0KCk7CisgICAgaWYoQkFDS0VORC0+aW9jcG9ydCAhPSAtMSkgewogICAgICAgcmVzdWx0ID0gZ3NraXRfc3RhdHVzKGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NrX3NlY3VyZV9zb2Nfc3RhcnRJbml0KGNvbm5zc2wtPmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubnNzbC0+aW9jcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc2tfc2VjdXJlX3NvY19zdGFydEluaXQoQkFDS0VORC0+aGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQUNLRU5ELT5pb2Nwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWFyZWEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnc2tfc2VjdXJlX3NvY19zdGFydEluaXQoKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1IpOwpAQCAtOTkzLDcgKzEwMDQsNyBAQAogICAgIH0KICAgICBlbHNlIHsKICAgICAgIC8qIE5vIG1vcmUgY29tcGxldGlvbiBwb3J0IGF2YWlsYWJsZS4gVXNlIHN5bmNocm9ub3VzIElPLiAqLwotICAgICAgcmVzdWx0ID0gZ3NraXRfc3RhdHVzKGRhdGEsIGdza19zZWN1cmVfc29jX2luaXQoY29ubnNzbC0+aGFuZGxlKSwKKyAgICAgIHJlc3VsdCA9IGdza2l0X3N0YXR1cyhkYXRhLCBnc2tfc2VjdXJlX3NvY19pbml0KEJBQ0tFTkQtPmhhbmRsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdza19zZWN1cmVfc29jX2luaXQoKSIsIENVUkxFX1NTTF9DT05ORUNUX0VSUk9SKTsKICAgICAgIGlmKCFyZXN1bHQpIHsKICAgICAgICAgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSA9IHNzbF9jb25uZWN0XzM7CkBAIC0xMDI2LDcgKzEwMzcsNyBAQAogICAgICAgdGltZW91dF9tcyA9IDA7CiAgICAgc3Rtdi50dl9zZWMgPSB0aW1lb3V0X21zIC8gMTAwMDsKICAgICBzdG12LnR2X3VzZWMgPSAodGltZW91dF9tcyAtIHN0bXYudHZfc2VjICogMTAwMCkgKiAxMDAwOwotICAgIHN3aXRjaChRc29XYWl0Rm9ySU9Db21wbGV0aW9uKGNvbm5zc2wtPmlvY3BvcnQsICZjc3RhdCwgJnN0bXYpKSB7CisgICAgc3dpdGNoKFFzb1dhaXRGb3JJT0NvbXBsZXRpb24oQkFDS0VORC0+aW9jcG9ydCwgJmNzdGF0LCAmc3RtdikpIHsKICAgICBjYXNlIDE6ICAgICAgICAgICAgIC8qIE9wZXJhdGlvbiBjb21wbGV0ZS4gKi8KICAgICAgIGJyZWFrOwogICAgIGNhc2UgLTE6ICAgICAgICAgICAgLyogQW4gZXJyb3Igb2NjdXJyZWQ6IGhhbmRzaGFrZSBzdGlsbCBpbiBwcm9ncmVzcy4gKi8KQEAgLTEwNzUsNyArMTA4Niw3IEBACiAKICAgLyogU1NMIGhhbmRzaGFrZSBkb25lOiBnYXRoZXIgY2VydGlmaWNhdGUgaW5mbyBhbmQgdmVyaWZ5IGhvc3QuICovCiAKLSAgaWYoZ3NraXRfc3RhdHVzKGRhdGEsIGdza19hdHRyaWJ1dGVfZ2V0X2NlcnRfaW5mbyhjb25uc3NsLT5oYW5kbGUsCisgIGlmKGdza2l0X3N0YXR1cyhkYXRhLCBnc2tfYXR0cmlidXRlX2dldF9jZXJ0X2luZm8oQkFDS0VORC0+aGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdTS19QQVJUTkVSX0NFUlRfSU5GTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2RldiwgJmNkZWMpLAogICAgICAgICAgICAgICAgICAgImdza19hdHRyaWJ1dGVfZ2V0X2NlcnRfaW5mbygpIiwgQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1IpID09CkBAIC0xMjE2LDkgKzEyMjcsOCBAQAogfQogCiAKLUNVUkxjb2RlIEN1cmxfZ3NraXRfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpkb25lKQorc3RhdGljIENVUkxjb2RlIEN1cmxfZ3NraXRfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsIGJvb2wgKmRvbmUpCiB7CiAgIENVUkxjb2RlIHJlc3VsdDsKIApAQCAtMTIyOSw3ICsxMjM5LDcgQEAKIH0KIAogCi1DVVJMY29kZSBDdXJsX2dza2l0X2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQorc3RhdGljIENVUkxjb2RlIEN1cmxfZ3NraXRfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7CiAgIENVUkxjb2RlIHJlc3VsdDsKICAgYm9vbCBkb25lOwpAQCAtMTI0NSwxNCArMTI1NSwxNCBAQAogfQogCiAKLXZvaWQgQ3VybF9nc2tpdF9jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCitzdGF0aWMgdm9pZCBDdXJsX2dza2l0X2Nsb3NlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKICAgY2xvc2Vfb25lKCZjb25uLT5zc2xbc29ja2luZGV4XSwgY29ubiwgc29ja2luZGV4KTsKICAgY2xvc2Vfb25lKCZjb25uLT5wcm94eV9zc2xbc29ja2luZGV4XSwgY29ubiwgc29ja2luZGV4KTsKIH0KIAogCi1pbnQgQ3VybF9nc2tpdF9zaHV0ZG93bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCitzdGF0aWMgaW50IEN1cmxfZ3NraXRfc2h1dGRvd24oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQogewogICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbc29ja2luZGV4XTsKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CkBAIC0xMjYxLDcgKzEyNzEsNyBAQAogICBpbnQgcmM7CiAgIGNoYXIgYnVmWzEyMF07CiAKLSAgaWYoIWNvbm5zc2wtPmhhbmRsZSkKKyAgaWYoIUJBQ0tFTkQtPmhhbmRsZSkKICAgICByZXR1cm4gMDsKIAogICBpZihkYXRhLT5zZXQuZnRwX2NjYyAhPSBDVVJMRlRQU1NMX0NDQ19BQ1RJVkUpCkBAIC0xMzA2LDIxICsxMzE2LDIyIEBACiB9CiAKIAotc2l6ZV90IEN1cmxfZ3NraXRfdmVyc2lvbihjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQorc3RhdGljIHNpemVfdCBDdXJsX2dza2l0X3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKICAgc3RybmNweShidWZmZXIsICJHU0tpdCIsIHNpemUpOwogICByZXR1cm4gc3RybGVuKGJ1ZmZlcik7CiB9CiAKIAotaW50IEN1cmxfZ3NraXRfY2hlY2tfY3huKHN0cnVjdCBjb25uZWN0ZGF0YSAqY3huKQorc3RhdGljIGludCBDdXJsX2dza2l0X2NoZWNrX2N4bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmN4bikKIHsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY3huLT5zc2xbRklSU1RTT0NLRVRdOwogICBpbnQgZXJyOwogICBpbnQgZXJybGVuOwogCiAgIC8qIFRoZSBvbmx5IHRoaW5nIHRoYXQgY2FuIGJlIHRlc3RlZCBoZXJlIGlzIGF0IHRoZSBzb2NrZXQgbGV2ZWwuICovCiAKLSAgaWYoIWN4bi0+c3NsW0ZJUlNUU09DS0VUXS5oYW5kbGUpCisgIGlmKCFCQUNLRU5ELT5oYW5kbGUpCiAgICAgcmV0dXJuIDA7IC8qIGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkICovCiAKICAgZXJyID0gMDsKQEAgLTEzMzQsNCArMTM0NSw0NiBAQAogICByZXR1cm4gLTE7ICAvKiBjb25uZWN0aW9uIHN0YXR1cyB1bmtub3duICovCiB9CiAKK3N0YXRpYyB2b2lkICpDdXJsX2dza2l0X2dldF9pbnRlcm5hbHMoc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxJTkZPIGluZm8gVU5VU0VEX1BBUkFNKQoreworICAodm9pZClpbmZvOworICByZXR1cm4gQkFDS0VORC0+aGFuZGxlOworfQorCitjb25zdCBzdHJ1Y3QgQ3VybF9zc2wgQ3VybF9zc2xfZ3NraXQgPSB7CisgIHsgQ1VSTFNTTEJBQ0tFTkRfR1NLSVQsICJnc2tpdCIgfSwgLyogaW5mbyAqLworCisgIDAsIC8qIGhhdmVfY2FfcGF0aCAqLworICAxLCAvKiBoYXZlX2NlcnRpbmZvICovCisgIDAsIC8qIGhhdmVfcGlubmVkcHVia2V5ICovCisgIDAsIC8qIGhhdmVfc3NsX2N0eCAqLworICAvKiBUT0RPOiBjb252ZXJ0IHRvIDEgYW5kIGZpeCB0ZXN0ICMxMDE0IChpZiBuZWVkKSAqLworICAwLCAvKiBzdXBwb3J0X2h0dHBzX3Byb3h5ICovCisKKyAgc2l6ZW9mKHN0cnVjdCBzc2xfYmFja2VuZF9kYXRhKSwKKworICBDdXJsX2dza2l0X2luaXQsICAgICAgICAgICAgICAgIC8qIGluaXQgKi8KKyAgQ3VybF9nc2tpdF9jbGVhbnVwLCAgICAgICAgICAgICAvKiBjbGVhbnVwICovCisgIEN1cmxfZ3NraXRfdmVyc2lvbiwgICAgICAgICAgICAgLyogdmVyc2lvbiAqLworICBDdXJsX2dza2l0X2NoZWNrX2N4biwgICAgICAgICAgIC8qIGNoZWNrX2N4biAqLworICBDdXJsX2dza2l0X3NodXRkb3duLCAgICAgICAgICAgIC8qIHNodXRkb3duICovCisgIEN1cmxfbm9uZV9kYXRhX3BlbmRpbmcsICAgICAgICAgLyogZGF0YV9wZW5kaW5nICovCisgIEN1cmxfbm9uZV9yYW5kb20sICAgICAgICAgICAgICAgLyogcmFuZG9tICovCisgIEN1cmxfbm9uZV9jZXJ0X3N0YXR1c19yZXF1ZXN0LCAgLyogY2VydF9zdGF0dXNfcmVxdWVzdCAqLworICBDdXJsX2dza2l0X2Nvbm5lY3QsICAgICAgICAgICAgIC8qIGNvbm5lY3QgKi8KKyAgQ3VybF9nc2tpdF9jb25uZWN0X25vbmJsb2NraW5nLCAvKiBjb25uZWN0X25vbmJsb2NraW5nICovCisgIEN1cmxfZ3NraXRfZ2V0X2ludGVybmFscywgICAgICAgLyogZ2V0X2ludGVybmFscyAqLworICBDdXJsX2dza2l0X2Nsb3NlLCAgICAgICAgICAgICAgIC8qIGNsb3NlICovCisgIEN1cmxfbm9uZV9jbG9zZV9hbGwsICAgICAgICAgICAgLyogY2xvc2VfYWxsICovCisgIC8qIE5vIHNlc3Npb24gaGFuZGxpbmcgZm9yIEdTS2l0ICovCisgIEN1cmxfbm9uZV9zZXNzaW9uX2ZyZWUsICAgICAgICAgLyogc2Vzc2lvbl9mcmVlICovCisgIEN1cmxfbm9uZV9zZXRfZW5naW5lLCAgICAgICAgICAgLyogc2V0X2VuZ2luZSAqLworICBDdXJsX25vbmVfc2V0X2VuZ2luZV9kZWZhdWx0LCAgIC8qIHNldF9lbmdpbmVfZGVmYXVsdCAqLworICBDdXJsX25vbmVfZW5naW5lc19saXN0LCAgICAgICAgIC8qIGVuZ2luZXNfbGlzdCAqLworICBDdXJsX25vbmVfZmFsc2Vfc3RhcnQsICAgICAgICAgIC8qIGZhbHNlX3N0YXJ0ICovCisgIEN1cmxfbm9uZV9tZDVzdW0sICAgICAgICAgICAgICAgLyogbWQ1c3VtICovCisgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hhMjU2c3VtICovCit9OworCiAjZW5kaWYgLyogVVNFX0dTS0lUICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2dza2l0LmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2dza2l0LmgKaW5kZXggMjI5NzU5Mi4uNDY2ZWU0ZCAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9nc2tpdC5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvZ3NraXQuaApAQCAtMzAsNDQgKzMwLDggQEAKICNpbmNsdWRlICJ1cmxkYXRhLmgiCiAKICNpZmRlZiBVU0VfR1NLSVQKLWludCBDdXJsX2dza2l0X2luaXQodm9pZCk7Ci12b2lkIEN1cmxfZ3NraXRfY2xlYW51cCh2b2lkKTsKLUNVUkxjb2RlIEN1cmxfZ3NraXRfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOwotQ1VSTGNvZGUgQ3VybF9nc2tpdF9jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LCBib29sICpkb25lKTsKLXZvaWQgQ3VybF9nc2tpdF9jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOwotaW50IEN1cmxfZ3NraXRfc2h1dGRvd24oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKIAotc2l6ZV90IEN1cmxfZ3NraXRfdmVyc2lvbihjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKTsKLWludCBDdXJsX2dza2l0X2NoZWNrX2N4bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmN4bik7Ci0KLS8qIFN1cHBvcnQgSFRUUFMtcHJveHkgKi8KLS8qIFRPRE86IGFkZCAnI2RlZmluZSBIVFRQU19QUk9YWV9TVVBQT1JUIDEnIGFuZCBmaXggdGVzdCAjMTAxNCAoaWYgbmVlZCkgKi8KLQotLyogU2V0IHRoZSBBUEkgYmFja2VuZCBkZWZpbml0aW9uIHRvIEdTS2l0ICovCi0jZGVmaW5lIENVUkxfU1NMX0JBQ0tFTkQgQ1VSTFNTTEJBQ0tFTkRfR1NLSVQKLQotLyogdGhpcyBiYWNrZW5kIHN1cHBvcnRzIENVUkxPUFRfQ0VSVElORk8gKi8KLSNkZWZpbmUgaGF2ZV9jdXJsc3NsX2NlcnRpbmZvIDEKLQotLyogQVBJIHNldHVwIGZvciBHU0tpdCAqLwotI2RlZmluZSBjdXJsc3NsX2luaXQgQ3VybF9nc2tpdF9pbml0Ci0jZGVmaW5lIGN1cmxzc2xfY2xlYW51cCBDdXJsX2dza2l0X2NsZWFudXAKLSNkZWZpbmUgY3VybHNzbF9jb25uZWN0IEN1cmxfZ3NraXRfY29ubmVjdAotI2RlZmluZSBjdXJsc3NsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcgQ3VybF9nc2tpdF9jb25uZWN0X25vbmJsb2NraW5nCi0KLS8qICBObyBzZXNzaW9uIGhhbmRsaW5nIGZvciBHU0tpdCAqLwotI2RlZmluZSBjdXJsc3NsX3Nlc3Npb25fZnJlZSh4KSBDdXJsX25vcF9zdG10Ci0jZGVmaW5lIGN1cmxzc2xfY2xvc2VfYWxsKHgpICgodm9pZCl4KQotI2RlZmluZSBjdXJsc3NsX2Nsb3NlIEN1cmxfZ3NraXRfY2xvc2UKLSNkZWZpbmUgY3VybHNzbF9zaHV0ZG93bih4LHkpIEN1cmxfZ3NraXRfc2h1dGRvd24oeCx5KQotI2RlZmluZSBjdXJsc3NsX3NldF9lbmdpbmUoeCx5KSBDVVJMRV9OT1RfQlVJTFRfSU4KLSNkZWZpbmUgY3VybHNzbF9zZXRfZW5naW5lX2RlZmF1bHQoeCkgQ1VSTEVfTk9UX0JVSUxUX0lOCi0jZGVmaW5lIGN1cmxzc2xfZW5naW5lc19saXN0KHgpIE5VTEwKLSNkZWZpbmUgY3VybHNzbF92ZXJzaW9uIEN1cmxfZ3NraXRfdmVyc2lvbgotI2RlZmluZSBjdXJsc3NsX2NoZWNrX2N4bih4KSBDdXJsX2dza2l0X2NoZWNrX2N4bih4KQotI2RlZmluZSBjdXJsc3NsX2RhdGFfcGVuZGluZyh4LHkpIDAKLSNkZWZpbmUgY3VybHNzbF9yYW5kb20oeCx5LHopICh4PXgsIHk9eSwgej16LCBDVVJMRV9OT1RfQlVJTFRfSU4pCitleHRlcm4gY29uc3Qgc3RydWN0IEN1cmxfc3NsIEN1cmxfc3NsX2dza2l0OwogCiAjZW5kaWYgLyogVVNFX0dTS0lUICovCiAKZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvZ3Rscy5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9ndGxzLmMKaW5kZXggODQ0YmUyZC4uYTg0NDkxNSAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9ndGxzLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9ndGxzLmMKQEAgLTYwLDE1ICs2MCwxMyBAQAogLyogVGhlIGxhc3QgI2luY2x1ZGUgZmlsZSBzaG91bGQgYmU6ICovCiAjaW5jbHVkZSAibWVtZGVidWcuaCIKIAotLyoKLSBTb21lIGhhY2tpc2ggY2FzdCBtYWNyb3MgYmFzZWQgb246Ci0gaHR0cHM6Ly9kZXZlbG9wZXIuZ25vbWUub3JnL2dsaWIvdW5zdGFibGUvZ2xpYi1UeXBlLUNvbnZlcnNpb24tTWFjcm9zLmh0bWwKLSovCi0jaWZuZGVmIEdOVVRMU19QT0lOVEVSX1RPX0lOVF9DQVNUCi0jZGVmaW5lIEdOVVRMU19QT0lOVEVSX1RPX0lOVF9DQVNUKHApICgoaW50KSAobG9uZykgKHApKQorI2lmbmRlZiBHTlVUTFNfUE9JTlRFUl9UT19TT0NLRVRfQ0FTVAorI2RlZmluZSBHTlVUTFNfUE9JTlRFUl9UT19TT0NLRVRfQ0FTVChwKSBcCisgICgoY3VybF9zb2NrZXRfdCkgKChjaGFyICopKHApIC0gKGNoYXIgKilOVUxMKSkKICNlbmRpZgotI2lmbmRlZiBHTlVUTFNfSU5UX1RPX1BPSU5URVJfQ0FTVAotI2RlZmluZSBHTlVUTFNfSU5UX1RPX1BPSU5URVJfQ0FTVChpKSAoKHZvaWQgKikgKGxvbmcpIChpKSkKKyNpZm5kZWYgR05VVExTX1NPQ0tFVF9UT19QT0lOVEVSX0NBU1QKKyNkZWZpbmUgR05VVExTX1NPQ0tFVF9UT19QT0lOVEVSX0NBU1QocykgXAorICAoKHZvaWQgKikgKChjaGFyICopTlVMTCArIChzKSkpCiAjZW5kaWYKIAogLyogRW5hYmxlIEdudVRMUyBkZWJ1Z2dpbmcgYnkgZGVmaW5pbmcgR1RMU0RFQlVHICovCkBAIC0xMDksNiArMTA3LDE2IEBACiAjIGluY2x1ZGUgPGdudXRscy9vY3NwLmg+CiAjZW5kaWYKIAorc3RydWN0IHNzbF9iYWNrZW5kX2RhdGEgeworICBnbnV0bHNfc2Vzc2lvbl90IHNlc3Npb247CisgIGdudXRsc19jZXJ0aWZpY2F0ZV9jcmVkZW50aWFsc190IGNyZWQ7CisjaWZkZWYgVVNFX1RMU19TUlAKKyAgZ251dGxzX3NycF9jbGllbnRfY3JlZGVudGlhbHNfdCBzcnBfY2xpZW50X2NyZWQ7CisjZW5kaWYKK307CisKKyNkZWZpbmUgQkFDS0VORCBjb25uc3NsLT5iYWNrZW5kCisKIC8qCiAgKiBDdXN0b20gcHVzaCBhbmQgcHVsbCBjYWxsYmFjayBmdW5jdGlvbnMgdXNlZCBieSBHTlUgVExTIHRvIHJlYWQgYW5kIHdyaXRlCiAgKiB0byB0aGUgc29ja2V0LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBzaW1wbGUgd3JhcHBlcnMgdG8gc2VuZCgpIGFuZCByZWN2KCkKQEAgLTE1Myw3ICsxNjEsNyBAQAogCiBzdGF0aWMgc3NpemVfdCBDdXJsX2d0bHNfcHVzaCh2b2lkICpzLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4pCiB7Ci0gIHNzaXplX3QgcmV0ID0gc3dyaXRlKEdOVVRMU19QT0lOVEVSX1RPX0lOVF9DQVNUKHMpLCBidWYsIGxlbik7CisgIHNzaXplX3QgcmV0ID0gc3dyaXRlKEdOVVRMU19QT0lOVEVSX1RPX1NPQ0tFVF9DQVNUKHMpLCBidWYsIGxlbik7CiAjaWYgZGVmaW5lZChVU0VfV0lOU09DSykgJiYgIWRlZmluZWQoR05VVExTX01BUFNfV0lOU09DS19FUlJPUlMpCiAgIGlmKHJldCA8IDApCiAgICAgZ251dGxzX3RyYW5zcG9ydF9zZXRfZ2xvYmFsX2Vycm5vKGd0bHNfbWFwcGVkX3NvY2tlcnJubygpKTsKQEAgLTE2Myw3ICsxNzEsNyBAQAogCiBzdGF0aWMgc3NpemVfdCBDdXJsX2d0bHNfcHVsbCh2b2lkICpzLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCiB7Ci0gIHNzaXplX3QgcmV0ID0gc3JlYWQoR05VVExTX1BPSU5URVJfVE9fSU5UX0NBU1QocyksIGJ1ZiwgbGVuKTsKKyAgc3NpemVfdCByZXQgPSBzcmVhZChHTlVUTFNfUE9JTlRFUl9UT19TT0NLRVRfQ0FTVChzKSwgYnVmLCBsZW4pOwogI2lmIGRlZmluZWQoVVNFX1dJTlNPQ0spICYmICFkZWZpbmVkKEdOVVRMU19NQVBTX1dJTlNPQ0tfRVJST1JTKQogICBpZihyZXQgPCAwKQogICAgIGdudXRsc190cmFuc3BvcnRfc2V0X2dsb2JhbF9lcnJubyhndGxzX21hcHBlZF9zb2NrZXJybm8oKSk7CkBAIC0xODgsNyArMTk2LDcgQEAKICAqIG11c3Qgb25seSBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gY3VybF9nbG9iYWxfaW5pdCgpIHRvIGtlZXAgdGhlIHRocmVhZAogICogc2l0dWF0aW9uIHVuZGVyIGNvbnRyb2whCiAgKi8KLWludCBDdXJsX2d0bHNfaW5pdCh2b2lkKQorc3RhdGljIGludCBDdXJsX2d0bHNfaW5pdCh2b2lkKQogewogICBpbnQgcmV0ID0gMTsKICAgaWYoIWd0bHNfaW5pdGVkKSB7CkBAIC0yMDIsMTMgKzIxMCwxMiBAQAogICByZXR1cm4gcmV0OwogfQogCi1pbnQgQ3VybF9ndGxzX2NsZWFudXAodm9pZCkKK3N0YXRpYyB2b2lkIEN1cmxfZ3Rsc19jbGVhbnVwKHZvaWQpCiB7CiAgIGlmKGd0bHNfaW5pdGVkKSB7CiAgICAgZ251dGxzX2dsb2JhbF9kZWluaXQoKTsKICAgICBndGxzX2luaXRlZCA9IEZBTFNFOwogICB9Ci0gIHJldHVybiAxOwogfQogCiAjaWZuZGVmIENVUkxfRElTQUJMRV9WRVJCT1NFX1NUUklOR1MKQEAgLTI3OSw3ICsyODYsNyBAQAogewogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKICAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07Ci0gIGdudXRsc19zZXNzaW9uX3Qgc2Vzc2lvbiA9IGNvbm4tPnNzbFtzb2NraW5kZXhdLnNlc3Npb247CisgIGdudXRsc19zZXNzaW9uX3Qgc2Vzc2lvbiA9IEJBQ0tFTkQtPnNlc3Npb247CiAgIGN1cmxfc29ja2V0X3Qgc29ja2ZkID0gY29ubi0+c29ja1tzb2NraW5kZXhdOwogICB0aW1lX3QgdGltZW91dF9tczsKICAgaW50IHJjOwpAQCAtMjk5LDkgKzMwNiw5IEBACiAgICAgaWYoY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSA9PSBzc2xfY29ubmVjdF8yX3JlYWRpbmcKICAgICAgICB8fCBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlID09IHNzbF9jb25uZWN0XzJfd3JpdGluZykgewogCi0gICAgICBjdXJsX3NvY2tldF90IHdyaXRlZmQgPSBzc2xfY29ubmVjdF8yX3dyaXRpbmc9PQorICAgICAgY3VybF9zb2NrZXRfdCB3cml0ZWZkID0gc3NsX2Nvbm5lY3RfMl93cml0aW5nID09CiAgICAgICAgIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGU/c29ja2ZkOkNVUkxfU09DS0VUX0JBRDsKLSAgICAgIGN1cmxfc29ja2V0X3QgcmVhZGZkID0gc3NsX2Nvbm5lY3RfMl9yZWFkaW5nPT0KKyAgICAgIGN1cmxfc29ja2V0X3QgcmVhZGZkID0gc3NsX2Nvbm5lY3RfMl9yZWFkaW5nID09CiAgICAgICAgIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGU/c29ja2ZkOkNVUkxfU09DS0VUX0JBRDsKIAogICAgICAgd2hhdCA9IEN1cmxfc29ja2V0X2NoZWNrKHJlYWRmZCwgQ1VSTF9TT0NLRVRfQkFELCB3cml0ZWZkLApAQCAtNDc3LDYgKzQ4NCw3IEBACiAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCkKIHsKICAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CisgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOwogICB1bnNpZ25lZCBpbnQgaW5pdF9mbGFnczsKICAgZ251dGxzX3Nlc3Npb25fdCBzZXNzaW9uOwogICBpbnQgcmM7CkBAIC01MTIsNyArNTIwLDcgQEAKICAgY29uc3QgY2hhciAqIGNvbnN0IGhvc3RuYW1lID0gU1NMX0lTX1BST1hZKCkgPyBjb25uLT5odHRwX3Byb3h5Lmhvc3QubmFtZSA6CiAgICAgY29ubi0+aG9zdC5uYW1lOwogCi0gIGlmKGNvbm4tPnNzbFtzb2NraW5kZXhdLnN0YXRlID09IHNzbF9jb25uZWN0aW9uX2NvbXBsZXRlKQorICBpZihjb25uc3NsLT5zdGF0ZSA9PSBzc2xfY29ubmVjdGlvbl9jb21wbGV0ZSkKICAgICAvKiB0byBtYWtlIHVzIHRvbGVyYW50IGFnYWluc3QgYmVpbmcgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGZvciB0aGUKICAgICAgICBzYW1lIGNvbm5lY3Rpb24gKi8KICAgICByZXR1cm4gQ1VSTEVfT0s7CkBAIC01MjgsNyArNTM2LDcgQEAKICAgICBzbmkgPSBGQUxTRTsgLyogU1NMdjMgaGFzIG5vIFNOSSAqLwogCiAgIC8qIGFsbG9jYXRlIGEgY3JlZCBzdHJ1Y3QgKi8KLSAgcmMgPSBnbnV0bHNfY2VydGlmaWNhdGVfYWxsb2NhdGVfY3JlZGVudGlhbHMoJmNvbm4tPnNzbFtzb2NraW5kZXhdLmNyZWQpOworICByYyA9IGdudXRsc19jZXJ0aWZpY2F0ZV9hbGxvY2F0ZV9jcmVkZW50aWFscygmQkFDS0VORC0+Y3JlZCk7CiAgIGlmKHJjICE9IEdOVVRMU19FX1NVQ0NFU1MpIHsKICAgICBmYWlsZihkYXRhLCAiZ251dGxzX2NlcnRfYWxsX2NyZWQoKSBmYWlsZWQ6ICVzIiwgZ251dGxzX3N0cmVycm9yKHJjKSk7CiAgICAgcmV0dXJuIENVUkxFX1NTTF9DT05ORUNUX0VSUk9SOwpAQCAtNTM5LDE1ICs1NDcsMTQgQEAKICAgICBpbmZvZihkYXRhLCAiVXNpbmcgVExTLVNSUCB1c2VybmFtZTogJXNcbiIsIFNTTF9TRVRfT1BUSU9OKHVzZXJuYW1lKSk7CiAKICAgICByYyA9IGdudXRsc19zcnBfYWxsb2NhdGVfY2xpZW50X2NyZWRlbnRpYWxzKAotICAgICAgICAgICAmY29ubi0+c3NsW3NvY2tpbmRleF0uc3JwX2NsaWVudF9jcmVkKTsKKyAgICAgICAgICAgJkJBQ0tFTkQtPnNycF9jbGllbnRfY3JlZCk7CiAgICAgaWYocmMgIT0gR05VVExTX0VfU1VDQ0VTUykgewogICAgICAgZmFpbGYoZGF0YSwgImdudXRsc19zcnBfYWxsb2NhdGVfY2xpZW50X2NyZWQoKSBmYWlsZWQ6ICVzIiwKICAgICAgICAgICAgIGdudXRsc19zdHJlcnJvcihyYykpOwogICAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CiAgICAgfQogCi0gICAgcmMgPSBnbnV0bHNfc3JwX3NldF9jbGllbnRfY3JlZGVudGlhbHMoY29ubi0+c3NsW3NvY2tpbmRleF0uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JwX2NsaWVudF9jcmVkLAorICAgIHJjID0gZ251dGxzX3NycF9zZXRfY2xpZW50X2NyZWRlbnRpYWxzKEJBQ0tFTkQtPnNycF9jbGllbnRfY3JlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfU0VUX09QVElPTih1c2VybmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1NFVF9PUFRJT04ocGFzc3dvcmQpKTsKICAgICBpZihyYyAhPSBHTlVUTFNfRV9TVUNDRVNTKSB7CkBAIC01NjAsMTAgKzU2NywxMCBAQAogCiAgIGlmKFNTTF9DT05OX0NPTkZJRyhDQWZpbGUpKSB7CiAgICAgLyogc2V0IHRoZSB0cnVzdGVkIENBIGNlcnQgYnVuZGxlIGZpbGUgKi8KLSAgICBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3ZlcmlmeV9mbGFncyhjb25uLT5zc2xbc29ja2luZGV4XS5jcmVkLAorICAgIGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfdmVyaWZ5X2ZsYWdzKEJBQ0tFTkQtPmNyZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR05VVExTX1ZFUklGWV9BTExPV19YNTA5X1YxX0NBX0NSVCk7CiAKLSAgICByYyA9IGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV90cnVzdF9maWxlKGNvbm4tPnNzbFtzb2NraW5kZXhdLmNyZWQsCisgICAgcmMgPSBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfdHJ1c3RfZmlsZShCQUNLRU5ELT5jcmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NPTk5fQ09ORklHKENBZmlsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTlVUTFNfWDUwOV9GTVRfUEVNKTsKICAgICBpZihyYyA8IDApIHsKQEAgLTU4MCw3ICs1ODcsNyBAQAogI2lmZGVmIEhBU19DQVBBVEgKICAgaWYoU1NMX0NPTk5fQ09ORklHKENBcGF0aCkpIHsKICAgICAvKiBzZXQgdGhlIHRydXN0ZWQgQ0EgY2VydCBkaXJlY3RvcnkgKi8KLSAgICByYyA9IGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV90cnVzdF9kaXIoY29ubi0+c3NsW3NvY2tpbmRleF0uY3JlZCwKKyAgICByYyA9IGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV90cnVzdF9kaXIoQkFDS0VORC0+Y3JlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NPTk5fQ09ORklHKENBcGF0aCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdOVVRMU19YNTA5X0ZNVF9QRU0pOwogICAgIGlmKHJjIDwgMCkgewpAQCAtNTk5LDEzICs2MDYsMTMgQEAKICAgLyogdXNlIHN5c3RlbSBjYSBjZXJ0aWZpY2F0ZSBzdG9yZSBhcyBmYWxsYmFjayAqLwogICBpZihTU0xfQ09OTl9DT05GSUcodmVyaWZ5cGVlcikgJiYKICAgICAgIShTU0xfQ09OTl9DT05GSUcoQ0FmaWxlKSB8fCBTU0xfQ09OTl9DT05GSUcoQ0FwYXRoKSkpIHsKLSAgICBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfc3lzdGVtX3RydXN0KGNvbm4tPnNzbFtzb2NraW5kZXhdLmNyZWQpOworICAgIGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV9zeXN0ZW1fdHJ1c3QoQkFDS0VORC0+Y3JlZCk7CiAgIH0KICNlbmRpZgogCiAgIGlmKFNTTF9TRVRfT1BUSU9OKENSTGZpbGUpKSB7CiAgICAgLyogc2V0IHRoZSBDUkwgbGlzdCBmaWxlICovCi0gICAgcmMgPSBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfY3JsX2ZpbGUoY29ubi0+c3NsW3NvY2tpbmRleF0uY3JlZCwKKyAgICByYyA9IGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV9jcmxfZmlsZShCQUNLRU5ELT5jcmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9TRVRfT1BUSU9OKENSTGZpbGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdOVVRMU19YNTA5X0ZNVF9QRU0pOwogICAgIGlmKHJjIDwgMCkgewpAQCAtNjI2LDE0ICs2MzMsMTQgQEAKICAgaW5pdF9mbGFncyB8PSBHTlVUTFNfTk9fVElDS0VUUzsKICNlbmRpZgogCi0gIHJjID0gZ251dGxzX2luaXQoJmNvbm4tPnNzbFtzb2NraW5kZXhdLnNlc3Npb24sIGluaXRfZmxhZ3MpOworICByYyA9IGdudXRsc19pbml0KCZCQUNLRU5ELT5zZXNzaW9uLCBpbml0X2ZsYWdzKTsKICAgaWYocmMgIT0gR05VVExTX0VfU1VDQ0VTUykgewogICAgIGZhaWxmKGRhdGEsICJnbnV0bHNfaW5pdCgpIGZhaWxlZDogJWQiLCByYyk7CiAgICAgcmV0dXJuIENVUkxFX1NTTF9DT05ORUNUX0VSUk9SOwogICB9CiAKICAgLyogY29udmVuaWVudCBhc3NpZ24gKi8KLSAgc2Vzc2lvbiA9IGNvbm4tPnNzbFtzb2NraW5kZXhdLnNlc3Npb247CisgIHNlc3Npb24gPSBCQUNLRU5ELT5zZXNzaW9uOwogCiAgIGlmKCgwID09IEN1cmxfaW5ldF9wdG9uKEFGX0lORVQsIGhvc3RuYW1lLCAmYWRkcikpICYmCiAjaWZkZWYgRU5BQkxFX0lQVjYKQEAgLTc2Myw3ICs3NzAsOCBAQAogICAgIGdudXRsc19kYXR1bV90IHByb3RvY29sc1syXTsKIAogI2lmZGVmIFVTRV9OR0hUVFAyCi0gICAgaWYoZGF0YS0+c2V0Lmh0dHB2ZXJzaW9uID49IENVUkxfSFRUUF9WRVJTSU9OXzIpIHsKKyAgICBpZihkYXRhLT5zZXQuaHR0cHZlcnNpb24gPj0gQ1VSTF9IVFRQX1ZFUlNJT05fMiAmJgorICAgICAgICghU1NMX0lTX1BST1hZKCkgfHwgIWNvbm4tPmJpdHMudHVubmVsX3Byb3h5KSkgewogICAgICAgcHJvdG9jb2xzW2N1cl0uZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopTkdIVFRQMl9QUk9UT19WRVJTSU9OX0lEOwogICAgICAgcHJvdG9jb2xzW2N1cl0uc2l6ZSA9IE5HSFRUUDJfUFJPVE9fVkVSU0lPTl9JRF9MRU47CiAgICAgICBjdXIrKzsKQEAgLTc4OSw3ICs3OTcsNyBAQAogICAgICAgICBHTlVUTFNfUEtDU19VU0VfUEJFUzJfQUVTXzEyOCB8IEdOVVRMU19QS0NTX1VTRV9QQkVTMl9BRVNfMTkyIHwKICAgICAgICAgR05VVExTX1BLQ1NfVVNFX1BCRVMyX0FFU18yNTY7CiAgICAgICByYyA9IGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV9rZXlfZmlsZTIoCi0gICAgICAgICAgIGNvbm4tPnNzbFtzb2NraW5kZXhdLmNyZWQsCisgICAgICAgICAgIEJBQ0tFTkQtPmNyZWQsCiAgICAgICAgICAgIFNTTF9TRVRfT1BUSU9OKGNlcnQpLAogICAgICAgICAgICBTU0xfU0VUX09QVElPTihrZXkpID8KICAgICAgICAgICAgU1NMX1NFVF9PUFRJT04oa2V5KSA6IFNTTF9TRVRfT1BUSU9OKGNlcnQpLApAQCAtODA5LDcgKzgxNyw3IEBACiAgICAgfQogICAgIGVsc2UgewogICAgICAgaWYoZ251dGxzX2NlcnRpZmljYXRlX3NldF94NTA5X2tleV9maWxlKAotICAgICAgICAgICBjb25uLT5zc2xbc29ja2luZGV4XS5jcmVkLAorICAgICAgICAgICBCQUNLRU5ELT5jcmVkLAogICAgICAgICAgICBTU0xfU0VUX09QVElPTihjZXJ0KSwKICAgICAgICAgICAgU1NMX1NFVF9PUFRJT04oa2V5KSA/CiAgICAgICAgICAgIFNTTF9TRVRfT1BUSU9OKGtleSkgOiBTU0xfU0VUX09QVElPTihjZXJ0KSwKQEAgLTgyNSw3ICs4MzMsNyBAQAogICAvKiBwdXQgdGhlIGNyZWRlbnRpYWxzIHRvIHRoZSBjdXJyZW50IHNlc3Npb24gKi8KICAgaWYoU1NMX1NFVF9PUFRJT04oYXV0aHR5cGUpID09IENVUkxfVExTQVVUSF9TUlApIHsKICAgICByYyA9IGdudXRsc19jcmVkZW50aWFsc19zZXQoc2Vzc2lvbiwgR05VVExTX0NSRF9TUlAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4tPnNzbFtzb2NraW5kZXhdLnNycF9jbGllbnRfY3JlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBQ0tFTkQtPnNycF9jbGllbnRfY3JlZCk7CiAgICAgaWYocmMgIT0gR05VVExTX0VfU1VDQ0VTUykgewogICAgICAgZmFpbGYoZGF0YSwgImdudXRsc19jcmVkZW50aWFsc19zZXQoKSBmYWlsZWQ6ICVzIiwgZ251dGxzX3N0cmVycm9yKHJjKSk7CiAgICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CkBAIC04MzUsNyArODQzLDcgQEAKICNlbmRpZgogICB7CiAgICAgcmMgPSBnbnV0bHNfY3JlZGVudGlhbHNfc2V0KHNlc3Npb24sIEdOVVRMU19DUkRfQ0VSVElGSUNBVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4tPnNzbFtzb2NraW5kZXhdLmNyZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQUNLRU5ELT5jcmVkKTsKICAgICBpZihyYyAhPSBHTlVUTFNfRV9TVUNDRVNTKSB7CiAgICAgICBmYWlsZihkYXRhLCAiZ251dGxzX2NyZWRlbnRpYWxzX3NldCgpIGZhaWxlZDogJXMiLCBnbnV0bHNfc3RyZXJyb3IocmMpKTsKICAgICAgIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKQEAgLTg0MywxMyArODUxLDEzIEBACiAgIH0KIAogICBpZihjb25uLT5wcm94eV9zc2xbc29ja2luZGV4XS51c2UpIHsKLSAgICB0cmFuc3BvcnRfcHRyID0gY29ubi0+cHJveHlfc3NsW3NvY2tpbmRleF0uc2Vzc2lvbjsKKyAgICB0cmFuc3BvcnRfcHRyID0gY29ubi0+cHJveHlfc3NsW3NvY2tpbmRleF0uYmFja2VuZC0+c2Vzc2lvbjsKICAgICBnbnV0bHNfdHJhbnNwb3J0X3B1c2ggPSBDdXJsX2d0bHNfcHVzaF9zc2w7CiAgICAgZ251dGxzX3RyYW5zcG9ydF9wdWxsID0gQ3VybF9ndGxzX3B1bGxfc3NsOwogICB9CiAgIGVsc2UgewogICAgIC8qIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIHNvY2tldCAqLwotICAgIHRyYW5zcG9ydF9wdHIgPSBHTlVUTFNfSU5UX1RPX1BPSU5URVJfQ0FTVChjb25uLT5zb2NrW3NvY2tpbmRleF0pOworICAgIHRyYW5zcG9ydF9wdHIgPSBHTlVUTFNfU09DS0VUX1RPX1BPSU5URVJfQ0FTVChjb25uLT5zb2NrW3NvY2tpbmRleF0pOwogICAgIGdudXRsc190cmFuc3BvcnRfcHVzaCA9IEN1cmxfZ3Rsc19wdXNoOwogICAgIGdudXRsc190cmFuc3BvcnRfcHVsbCA9IEN1cmxfZ3Rsc19wdWxsOwogICB9CkBAIC05NjgsNyArOTc2LDggQEAKICAgdGltZV90IGNlcnRjbG9jazsKICAgY29uc3QgY2hhciAqcHRyOwogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKLSAgZ251dGxzX3Nlc3Npb25fdCBzZXNzaW9uID0gY29ubi0+c3NsW3NvY2tpbmRleF0uc2Vzc2lvbjsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CisgIGdudXRsc19zZXNzaW9uX3Qgc2Vzc2lvbiA9IEJBQ0tFTkQtPnNlc3Npb247CiAgIGludCByYzsKICNpZmRlZiBIQVNfQUxQTgogICBnbnV0bHNfZGF0dW1fdCBwcm90bzsKQEAgLTExOTksNyArMTIwOCw3IEBACiAgICAgICAgICAgU1NMX1NFVF9PUFRJT04oaXNzdWVyY2VydCk/U1NMX1NFVF9PUFRJT04oaXNzdWVyY2VydCk6Im5vbmUiKTsKICAgfQogCi0gIHNpemU9c2l6ZW9mKGNlcnRidWYpOworICBzaXplID0gc2l6ZW9mKGNlcnRidWYpOwogICByYyA9IGdudXRsc194NTA5X2NydF9nZXRfZG5fYnlfb2lkKHg1MDlfY2VydCwgR05VVExTX09JRF9YNTIwX0NPTU1PTl9OQU1FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIHRoZSBmaXJzdCBhbmQgb25seSBvbmUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwKQEAgLTEyMzksNyArMTI0OCw3IEBACiAjZW5kaWYKIAogICAgIGlmKGFkZHJsZW4pIHsKLSAgICAgIGZvcihpPTA7IDsgaSsrKSB7CisgICAgICBmb3IoaSA9IDA7IDsgaSsrKSB7CiAgICAgICAgIGNlcnRhZGRybGVuID0gc2l6ZW9mKGNlcnRhZGRyKTsKICAgICAgICAgcmV0ID0gZ251dGxzX3g1MDlfY3J0X2dldF9zdWJqZWN0X2FsdF9uYW1lKHg1MDlfY2VydCwgaSwgY2VydGFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2VydGFkZHJsZW4sIE5VTEwpOwpAQCAtMTQ3Miw3ICsxNDgxLDcgQEAKICAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CiAKICAgLyogSW5pdGlhdGUgdGhlIGNvbm5lY3Rpb24sIGlmIG5vdCBhbHJlYWR5IGRvbmUgKi8KLSAgaWYoc3NsX2Nvbm5lY3RfMT09Y29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSkgeworICBpZihzc2xfY29ubmVjdF8xID09IGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUpIHsKICAgICByYyA9IGd0bHNfY29ubmVjdF9zdGVwMShjb25uLCBzb2NraW5kZXgpOwogICAgIGlmKHJjKQogICAgICAgcmV0dXJuIHJjOwpAQCAtMTQ4NCwyOSArMTQ5MywyNCBAQAogICAgIHJldHVybiByYzsKIAogICAvKiBGaW5pc2ggY29ubmVjdGluZyBvbmNlIHRoZSBoYW5kc2hha2UgaXMgZG9uZSAqLwotICBpZihzc2xfY29ubmVjdF8xPT1jb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlKSB7CisgIGlmKHNzbF9jb25uZWN0XzEgPT0gY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSkgewogICAgIHJjID0gZ3Rsc19jb25uZWN0X3N0ZXAzKGNvbm4sIHNvY2tpbmRleCk7CiAgICAgaWYocmMpCiAgICAgICByZXR1cm4gcmM7CiAgIH0KIAotICAqZG9uZSA9IHNzbF9jb25uZWN0XzE9PWNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGU7CisgICpkb25lID0gc3NsX2Nvbm5lY3RfMSA9PSBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlOwogCiAgIHJldHVybiBDVVJMRV9PSzsKIH0KIAotQ1VSTGNvZGUKLUN1cmxfZ3Rsc19jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpkb25lKQorc3RhdGljIENVUkxjb2RlIEN1cmxfZ3Rsc19jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LCBib29sICpkb25lKQogewogICByZXR1cm4gZ3Rsc19jb25uZWN0X2NvbW1vbihjb25uLCBzb2NraW5kZXgsIFRSVUUsIGRvbmUpOwogfQogCi1DVVJMY29kZQotQ3VybF9ndGxzX2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAotICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCkKLQorc3RhdGljIENVUkxjb2RlIEN1cmxfZ3Rsc19jb25uZWN0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKICAgQ1VSTGNvZGUgcmVzdWx0OwogICBib29sIGRvbmUgPSBGQUxTRTsKQEAgLTE1MjAsMTUgKzE1MjQsMTggQEAKICAgcmV0dXJuIENVUkxFX09LOwogfQogCi1ib29sIEN1cmxfZ3Rsc19kYXRhX3BlbmRpbmcoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgY29ubmluZGV4KQorc3RhdGljIGJvb2wgQ3VybF9ndGxzX2RhdGFfcGVuZGluZyhjb25zdCBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25uaW5kZXgpCiB7CisgIGNvbnN0IHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtjb25uaW5kZXhdOwogICBib29sIHJlcyA9IEZBTFNFOwotICBpZihjb25uLT5zc2xbY29ubmluZGV4XS5zZXNzaW9uICYmCi0gICAgIDAgIT0gZ251dGxzX3JlY29yZF9jaGVja19wZW5kaW5nKGNvbm4tPnNzbFtjb25uaW5kZXhdLnNlc3Npb24pKQorICBpZihCQUNLRU5ELT5zZXNzaW9uICYmCisgICAgIDAgIT0gZ251dGxzX3JlY29yZF9jaGVja19wZW5kaW5nKEJBQ0tFTkQtPnNlc3Npb24pKQogICAgIHJlcyA9IFRSVUU7CiAKLSAgaWYoY29ubi0+cHJveHlfc3NsW2Nvbm5pbmRleF0uc2Vzc2lvbiAmJgotICAgICAwICE9IGdudXRsc19yZWNvcmRfY2hlY2tfcGVuZGluZyhjb25uLT5wcm94eV9zc2xbY29ubmluZGV4XS5zZXNzaW9uKSkKKyAgY29ubnNzbCA9ICZjb25uLT5wcm94eV9zc2xbY29ubmluZGV4XTsKKyAgaWYoQkFDS0VORC0+c2Vzc2lvbiAmJgorICAgICAwICE9IGdudXRsc19yZWNvcmRfY2hlY2tfcGVuZGluZyhCQUNLRU5ELT5zZXNzaW9uKSkKICAgICByZXMgPSBUUlVFOwogCiAgIHJldHVybiByZXM7CkBAIC0xNTQwLDcgKzE1NDcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTGNvZGUgKmN1cmxjb2RlKQogewotICBzc2l6ZV90IHJjID0gZ251dGxzX3JlY29yZF9zZW5kKGNvbm4tPnNzbFtzb2NraW5kZXhdLnNlc3Npb24sIG1lbSwgbGVuKTsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CisgIHNzaXplX3QgcmMgPSBnbnV0bHNfcmVjb3JkX3NlbmQoQkFDS0VORC0+c2Vzc2lvbiwgbWVtLCBsZW4pOwogCiAgIGlmKHJjIDwgMCkgewogICAgICpjdXJsY29kZSA9IChyYyA9PSBHTlVUTFNfRV9BR0FJTikKQEAgLTE1NTMsMjYgKzE1NjEsMjYgQEAKICAgcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCBjbG9zZV9vbmUoc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKnNzbCkKK3N0YXRpYyB2b2lkIGNsb3NlX29uZShzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCkKIHsKLSAgaWYoc3NsLT5zZXNzaW9uKSB7Ci0gICAgZ251dGxzX2J5ZShzc2wtPnNlc3Npb24sIEdOVVRMU19TSFVUX1JEV1IpOwotICAgIGdudXRsc19kZWluaXQoc3NsLT5zZXNzaW9uKTsKLSAgICBzc2wtPnNlc3Npb24gPSBOVUxMOworICBpZihCQUNLRU5ELT5zZXNzaW9uKSB7CisgICAgZ251dGxzX2J5ZShCQUNLRU5ELT5zZXNzaW9uLCBHTlVUTFNfU0hVVF9SRFdSKTsKKyAgICBnbnV0bHNfZGVpbml0KEJBQ0tFTkQtPnNlc3Npb24pOworICAgIEJBQ0tFTkQtPnNlc3Npb24gPSBOVUxMOwogICB9Ci0gIGlmKHNzbC0+Y3JlZCkgewotICAgIGdudXRsc19jZXJ0aWZpY2F0ZV9mcmVlX2NyZWRlbnRpYWxzKHNzbC0+Y3JlZCk7Ci0gICAgc3NsLT5jcmVkID0gTlVMTDsKKyAgaWYoQkFDS0VORC0+Y3JlZCkgeworICAgIGdudXRsc19jZXJ0aWZpY2F0ZV9mcmVlX2NyZWRlbnRpYWxzKEJBQ0tFTkQtPmNyZWQpOworICAgIEJBQ0tFTkQtPmNyZWQgPSBOVUxMOwogICB9CiAjaWZkZWYgVVNFX1RMU19TUlAKLSAgaWYoc3NsLT5zcnBfY2xpZW50X2NyZWQpIHsKLSAgICBnbnV0bHNfc3JwX2ZyZWVfY2xpZW50X2NyZWRlbnRpYWxzKHNzbC0+c3JwX2NsaWVudF9jcmVkKTsKLSAgICBzc2wtPnNycF9jbGllbnRfY3JlZCA9IE5VTEw7CisgIGlmKEJBQ0tFTkQtPnNycF9jbGllbnRfY3JlZCkgeworICAgIGdudXRsc19zcnBfZnJlZV9jbGllbnRfY3JlZGVudGlhbHMoQkFDS0VORC0+c3JwX2NsaWVudF9jcmVkKTsKKyAgICBCQUNLRU5ELT5zcnBfY2xpZW50X2NyZWQgPSBOVUxMOwogICB9CiAjZW5kaWYKIH0KIAotdm9pZCBDdXJsX2d0bHNfY2xvc2Uoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQorc3RhdGljIHZvaWQgQ3VybF9ndGxzX2Nsb3NlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKICAgY2xvc2Vfb25lKCZjb25uLT5zc2xbc29ja2luZGV4XSk7CiAgIGNsb3NlX29uZSgmY29ubi0+cHJveHlfc3NsW3NvY2tpbmRleF0pOwpAQCAtMTU4Miw4ICsxNTkwLDkgQEAKICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNodXQgZG93biB0aGUgU1NMIGxheWVyIGJ1dCBrZWVwIHRoZQogICogc29ja2V0IG9wZW4gKENDQyAtIENsZWFyIENvbW1hbmQgQ2hhbm5lbCkKICAqLwotaW50IEN1cmxfZ3Rsc19zaHV0ZG93bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCitzdGF0aWMgaW50IEN1cmxfZ3Rsc19zaHV0ZG93bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7CisgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOwogICBzc2l6ZV90IHJlc3VsdDsKICAgaW50IHJldHZhbCA9IDA7CiAgIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uLT5kYXRhOwpAQCAtMTU5NiwxNiArMTYwNSwxNiBAQAogICAgICB3ZSBkbyBub3Qgc2VuZCBvbmUuIExldCdzIGhvcGUgb3RoZXIgc2VydmVycyBkbyB0aGUgc2FtZS4uLiAqLwogCiAgIGlmKGRhdGEtPnNldC5mdHBfY2NjID09IENVUkxGVFBTU0xfQ0NDX0FDVElWRSkKLSAgICAgIGdudXRsc19ieWUoY29ubi0+c3NsW3NvY2tpbmRleF0uc2Vzc2lvbiwgR05VVExTX1NIVVRfV1IpOworICAgICAgZ251dGxzX2J5ZShCQUNLRU5ELT5zZXNzaW9uLCBHTlVUTFNfU0hVVF9XUik7CiAKLSAgaWYoY29ubi0+c3NsW3NvY2tpbmRleF0uc2Vzc2lvbikgeworICBpZihCQUNLRU5ELT5zZXNzaW9uKSB7CiAgICAgd2hpbGUoIWRvbmUpIHsKICAgICAgIGludCB3aGF0ID0gU09DS0VUX1JFQURBQkxFKGNvbm4tPnNvY2tbc29ja2luZGV4XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9TSFVURE9XTl9USU1FT1VUKTsKICAgICAgIGlmKHdoYXQgPiAwKSB7CiAgICAgICAgIC8qIFNvbWV0aGluZyB0byByZWFkLCBsZXQncyBkbyBpdCBhbmQgaG9wZSB0aGF0IGl0IGlzIHRoZSBjbG9zZQogICAgICAgICAgICBub3RpZnkgYWxlcnQgZnJvbSB0aGUgc2VydmVyICovCi0gICAgICAgIHJlc3VsdCA9IGdudXRsc19yZWNvcmRfcmVjdihjb25uLT5zc2xbc29ja2luZGV4XS5zZXNzaW9uLAorICAgICAgICByZXN1bHQgPSBnbnV0bHNfcmVjb3JkX3JlY3YoQkFDS0VORC0+c2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogICAgICAgICBzd2l0Y2gocmVzdWx0KSB7CiAgICAgICAgIGNhc2UgMDoKQEAgLTE2MzYsMTggKzE2NDUsMTggQEAKICAgICAgICAgZG9uZSA9IDE7CiAgICAgICB9CiAgICAgfQotICAgIGdudXRsc19kZWluaXQoY29ubi0+c3NsW3NvY2tpbmRleF0uc2Vzc2lvbik7CisgICAgZ251dGxzX2RlaW5pdChCQUNLRU5ELT5zZXNzaW9uKTsKICAgfQotICBnbnV0bHNfY2VydGlmaWNhdGVfZnJlZV9jcmVkZW50aWFscyhjb25uLT5zc2xbc29ja2luZGV4XS5jcmVkKTsKKyAgZ251dGxzX2NlcnRpZmljYXRlX2ZyZWVfY3JlZGVudGlhbHMoQkFDS0VORC0+Y3JlZCk7CiAKICNpZmRlZiBVU0VfVExTX1NSUAogICBpZihTU0xfU0VUX09QVElPTihhdXRodHlwZSkgPT0gQ1VSTF9UTFNBVVRIX1NSUAogICAgICAmJiBTU0xfU0VUX09QVElPTih1c2VybmFtZSkgIT0gTlVMTCkKLSAgICBnbnV0bHNfc3JwX2ZyZWVfY2xpZW50X2NyZWRlbnRpYWxzKGNvbm4tPnNzbFtzb2NraW5kZXhdLnNycF9jbGllbnRfY3JlZCk7CisgICAgZ251dGxzX3NycF9mcmVlX2NsaWVudF9jcmVkZW50aWFscyhCQUNLRU5ELT5zcnBfY2xpZW50X2NyZWQpOwogI2VuZGlmCiAKLSAgY29ubi0+c3NsW3NvY2tpbmRleF0uY3JlZCA9IE5VTEw7Ci0gIGNvbm4tPnNzbFtzb2NraW5kZXhdLnNlc3Npb24gPSBOVUxMOworICBCQUNLRU5ELT5jcmVkID0gTlVMTDsKKyAgQkFDS0VORC0+c2Vzc2lvbiA9IE5VTEw7CiAKICAgcmV0dXJuIHJldHZhbDsKIH0KQEAgLTE2NTgsOSArMTY2NywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJzaXplLCAgICAgICAgLyogbWF4IGFtb3VudCB0byByZWFkICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTGNvZGUgKmN1cmxjb2RlKQogeworICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbbnVtXTsKICAgc3NpemVfdCByZXQ7CiAKLSAgcmV0ID0gZ251dGxzX3JlY29yZF9yZWN2KGNvbm4tPnNzbFtudW1dLnNlc3Npb24sIGJ1ZiwgYnVmZmVyc2l6ZSk7CisgIHJldCA9IGdudXRsc19yZWNvcmRfcmVjdihCQUNLRU5ELT5zZXNzaW9uLCBidWYsIGJ1ZmZlcnNpemUpOwogICBpZigocmV0ID09IEdOVVRMU19FX0FHQUlOKSB8fCAocmV0ID09IEdOVVRMU19FX0lOVEVSUlVQVEVEKSkgewogICAgICpjdXJsY29kZSA9IENVUkxFX0FHQUlOOwogICAgIHJldHVybiAtMTsKQEAgLTE2ODAsNiArMTY5MCw3IEBACiAKICAgaWYocmV0IDwgMCkgewogICAgIGZhaWxmKGNvbm4tPmRhdGEsICJHbnVUTFMgcmVjdiBlcnJvciAoJWQpOiAlcyIsCisKICAgICAgICAgICAoaW50KXJldCwgZ251dGxzX3N0cmVycm9yKChpbnQpcmV0KSk7CiAgICAgKmN1cmxjb2RlID0gQ1VSTEVfUkVDVl9FUlJPUjsKICAgICByZXR1cm4gLTE7CkBAIC0xNjg4LDEyICsxNjk5LDEyIEBACiAgIHJldHVybiByZXQ7CiB9CiAKLXZvaWQgQ3VybF9ndGxzX3Nlc3Npb25fZnJlZSh2b2lkICpwdHIpCitzdGF0aWMgdm9pZCBDdXJsX2d0bHNfc2Vzc2lvbl9mcmVlKHZvaWQgKnB0cikKIHsKICAgZnJlZShwdHIpOwogfQogCi1zaXplX3QgQ3VybF9ndGxzX3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyBzaXplX3QgQ3VybF9ndGxzX3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKICAgcmV0dXJuIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIkdudVRMUy8lcyIsIGdudXRsc19jaGVja192ZXJzaW9uKE5VTEwpKTsKIH0KQEAgLTE3MjMsOSArMTczNCw4IEBACiAjZW5kaWYKIAogLyogZGF0YSBtaWdodCBiZSBOVUxMISAqLwotQ1VSTGNvZGUgQ3VybF9ndGxzX3JhbmRvbShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplbnRyb3B5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKQorc3RhdGljIENVUkxjb2RlIEN1cmxfZ3Rsc19yYW5kb20oc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmVudHJvcHksIHNpemVfdCBsZW5ndGgpCiB7CiAjaWYgZGVmaW5lZChVU0VfR05VVExTX05FVFRMRSkKICAgaW50IHJjOwpAQCAtMTc0MCwxMCArMTc1MCwxMCBAQAogICByZXR1cm4gQ1VSTEVfT0s7CiB9CiAKLXZvaWQgQ3VybF9ndGxzX21kNXN1bSh1bnNpZ25lZCBjaGFyICp0bXAsIC8qIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRtcGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICptZDVzdW0sIC8qIG91dHB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtZDVsZW4pCitzdGF0aWMgQ1VSTGNvZGUgQ3VybF9ndGxzX21kNXN1bSh1bnNpZ25lZCBjaGFyICp0bXAsIC8qIGlucHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdG1wbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbWQ1c3VtLCAvKiBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtZDVsZW4pCiB7CiAjaWYgZGVmaW5lZChVU0VfR05VVExTX05FVFRMRSkKICAgc3RydWN0IG1kNV9jdHggTUQ1cHc7CkBAIC0xNzU3LDEyICsxNzY3LDEzIEBACiAgIG1lbWNweShtZDVzdW0sIGdjcnlfbWRfcmVhZChNRDVwdywgMCksIG1kNWxlbik7CiAgIGdjcnlfbWRfY2xvc2UoTUQ1cHcpOwogI2VuZGlmCisgIHJldHVybiBDVVJMRV9PSzsKIH0KIAotdm9pZCBDdXJsX2d0bHNfc2hhMjU2c3VtKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRtcCwgLyogaW5wdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdG1wbGVuLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNoYTI1NnN1bSwgLyogb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNoYTI1NmxlbikKK3N0YXRpYyB2b2lkIEN1cmxfZ3Rsc19zaGEyNTZzdW0oY29uc3QgdW5zaWduZWQgY2hhciAqdG1wLCAvKiBpbnB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdG1wbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzaGEyNTZzdW0sIC8qIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2hhMjU2bGVuKQogewogI2lmIGRlZmluZWQoVVNFX0dOVVRMU19ORVRUTEUpCiAgIHN0cnVjdCBzaGEyNTZfY3R4IFNIQTI1NnB3OwpAQCAtMTc3OCw3ICsxNzg5LDcgQEAKICNlbmRpZgogfQogCi1ib29sIEN1cmxfZ3Rsc19jZXJ0X3N0YXR1c19yZXF1ZXN0KHZvaWQpCitzdGF0aWMgYm9vbCBDdXJsX2d0bHNfY2VydF9zdGF0dXNfcmVxdWVzdCh2b2lkKQogewogI2lmZGVmIEhBU19PQ1NQCiAgIHJldHVybiBUUlVFOwpAQCAtMTc4Nyw0ICsxNzk4LDQ0IEBACiAjZW5kaWYKIH0KIAorc3RhdGljIHZvaWQgKkN1cmxfZ3Rsc19nZXRfaW50ZXJuYWxzKHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxJTkZPIGluZm8gVU5VU0VEX1BBUkFNKQoreworICAodm9pZClpbmZvOworICByZXR1cm4gQkFDS0VORC0+c2Vzc2lvbjsKK30KKworY29uc3Qgc3RydWN0IEN1cmxfc3NsIEN1cmxfc3NsX2dudXRscyA9IHsKKyAgeyBDVVJMU1NMQkFDS0VORF9HTlVUTFMsICJnbnV0bHMiIH0sIC8qIGluZm8gKi8KKworICAxLCAvKiBoYXZlX2NhX3BhdGggKi8KKyAgMSwgLyogaGF2ZV9jZXJ0aW5mbyAqLworICAxLCAvKiBoYXZlX3Bpbm5lZHB1YmtleSAqLworICAwLCAvKiBoYXZlX3NzbF9jdHggKi8KKyAgMSwgLyogc3VwcG9ydF9odHRwc19wcm94eSAqLworCisgIHNpemVvZihzdHJ1Y3Qgc3NsX2JhY2tlbmRfZGF0YSksCisKKyAgQ3VybF9ndGxzX2luaXQsICAgICAgICAgICAgICAgIC8qIGluaXQgKi8KKyAgQ3VybF9ndGxzX2NsZWFudXAsICAgICAgICAgICAgIC8qIGNsZWFudXAgKi8KKyAgQ3VybF9ndGxzX3ZlcnNpb24sICAgICAgICAgICAgIC8qIHZlcnNpb24gKi8KKyAgQ3VybF9ub25lX2NoZWNrX2N4biwgICAgICAgICAgIC8qIGNoZWNrX2N4biAqLworICBDdXJsX2d0bHNfc2h1dGRvd24sICAgICAgICAgICAgLyogc2h1dGRvd24gKi8KKyAgQ3VybF9ndGxzX2RhdGFfcGVuZGluZywgICAgICAgIC8qIGRhdGFfcGVuZGluZyAqLworICBDdXJsX2d0bHNfcmFuZG9tLCAgICAgICAgICAgICAgLyogcmFuZG9tICovCisgIEN1cmxfZ3Rsc19jZXJ0X3N0YXR1c19yZXF1ZXN0LCAvKiBjZXJ0X3N0YXR1c19yZXF1ZXN0ICovCisgIEN1cmxfZ3Rsc19jb25uZWN0LCAgICAgICAgICAgICAvKiBjb25uZWN0ICovCisgIEN1cmxfZ3Rsc19jb25uZWN0X25vbmJsb2NraW5nLCAvKiBjb25uZWN0X25vbmJsb2NraW5nICovCisgIEN1cmxfZ3Rsc19nZXRfaW50ZXJuYWxzLCAgICAgICAvKiBnZXRfaW50ZXJuYWxzICovCisgIEN1cmxfZ3Rsc19jbG9zZSwgICAgICAgICAgICAgICAvKiBjbG9zZSAqLworICBDdXJsX25vbmVfY2xvc2VfYWxsLCAgICAgICAgICAgLyogY2xvc2VfYWxsICovCisgIEN1cmxfZ3Rsc19zZXNzaW9uX2ZyZWUsICAgICAgICAvKiBzZXNzaW9uX2ZyZWUgKi8KKyAgQ3VybF9ub25lX3NldF9lbmdpbmUsICAgICAgICAgIC8qIHNldF9lbmdpbmUgKi8KKyAgQ3VybF9ub25lX3NldF9lbmdpbmVfZGVmYXVsdCwgIC8qIHNldF9lbmdpbmVfZGVmYXVsdCAqLworICBDdXJsX25vbmVfZW5naW5lc19saXN0LCAgICAgICAgLyogZW5naW5lc19saXN0ICovCisgIEN1cmxfbm9uZV9mYWxzZV9zdGFydCwgICAgICAgICAvKiBmYWxzZV9zdGFydCAqLworICBDdXJsX2d0bHNfbWQ1c3VtLCAgICAgICAgICAgICAgLyogbWQ1c3VtICovCisgIEN1cmxfZ3Rsc19zaGEyNTZzdW0gICAgICAgICAgICAvKiBzaGEyNTZzdW0gKi8KK307CisKICNlbmRpZiAvKiBVU0VfR05VVExTICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL2d0bHMuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvZ3Rscy5oCmluZGV4IDQ2MmMwNDguLjc4MGZjMTAgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvZ3Rscy5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvZ3Rscy5oCkBAIC0yOCw2OSArMjgsNyBAQAogCiAjaW5jbHVkZSAidXJsZGF0YS5oIgogCi1pbnQgQ3VybF9ndGxzX2luaXQodm9pZCk7Ci1pbnQgQ3VybF9ndGxzX2NsZWFudXAodm9pZCk7Ci1DVVJMY29kZSBDdXJsX2d0bHNfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOwotQ1VSTGNvZGUgQ3VybF9ndGxzX2Nvbm5lY3Rfbm9uYmxvY2tpbmcoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmRvbmUpOwotYm9vbCBDdXJsX2d0bHNfZGF0YV9wZW5kaW5nKGNvbnN0IHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29ubmluZGV4KTsKLQotIC8qIGNsb3NlIGEgU1NMIGNvbm5lY3Rpb24gKi8KLXZvaWQgQ3VybF9ndGxzX2Nsb3NlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7Ci0KLXZvaWQgQ3VybF9ndGxzX3Nlc3Npb25fZnJlZSh2b2lkICpwdHIpOwotc2l6ZV90IEN1cmxfZ3Rsc192ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOwotaW50IEN1cmxfZ3Rsc19zaHV0ZG93bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOwotQ1VSTGNvZGUgQ3VybF9ndGxzX3JhbmRvbShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplbnRyb3B5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKTsKLXZvaWQgQ3VybF9ndGxzX21kNXN1bSh1bnNpZ25lZCBjaGFyICp0bXAsIC8qIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRtcGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICptZDVzdW0sIC8qIG91dHB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtZDVsZW4pOwotdm9pZCBDdXJsX2d0bHNfc2hhMjU2c3VtKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRtcCwgLyogaW5wdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdG1wbGVuLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNoYTI1NnN1bSwgLyogb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNoYTI1Nmxlbik7Ci0KLWJvb2wgQ3VybF9ndGxzX2NlcnRfc3RhdHVzX3JlcXVlc3Qodm9pZCk7Ci0KLS8qIFN1cHBvcnQgSFRUUFMtcHJveHkgKi8KLSNkZWZpbmUgSFRUUFNfUFJPWFlfU1VQUE9SVCAxCi0KLS8qIFNldCB0aGUgQVBJIGJhY2tlbmQgZGVmaW5pdGlvbiB0byBHbnVUTFMgKi8KLSNkZWZpbmUgQ1VSTF9TU0xfQkFDS0VORCBDVVJMU1NMQkFDS0VORF9HTlVUTFMKLQotLyogdGhpcyBiYWNrZW5kIHN1cHBvcnRzIHRoZSBDQVBBVEggb3B0aW9uICovCi0jZGVmaW5lIGhhdmVfY3VybHNzbF9jYV9wYXRoIDEKLQotLyogdGhpcyBiYWNrZW5kIHN1cHBvcnRzIENVUkxPUFRfQ0VSVElORk8gKi8KLSNkZWZpbmUgaGF2ZV9jdXJsc3NsX2NlcnRpbmZvIDEKLQotLyogdGhpcyBiYWNrZW5kIHN1cHBvcnRzIENVUkxPUFRfUElOTkVEUFVCTElDS0VZICovCi0jZGVmaW5lIGhhdmVfY3VybHNzbF9waW5uZWRwdWJrZXkgMQotCi0vKiBBUEkgc2V0dXAgZm9yIEdudVRMUyAqLwotI2RlZmluZSBjdXJsc3NsX2luaXQgQ3VybF9ndGxzX2luaXQKLSNkZWZpbmUgY3VybHNzbF9jbGVhbnVwIEN1cmxfZ3Rsc19jbGVhbnVwCi0jZGVmaW5lIGN1cmxzc2xfY29ubmVjdCBDdXJsX2d0bHNfY29ubmVjdAotI2RlZmluZSBjdXJsc3NsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcgQ3VybF9ndGxzX2Nvbm5lY3Rfbm9uYmxvY2tpbmcKLSNkZWZpbmUgY3VybHNzbF9zZXNzaW9uX2ZyZWUoeCkgIEN1cmxfZ3Rsc19zZXNzaW9uX2ZyZWUoeCkKLSNkZWZpbmUgY3VybHNzbF9jbG9zZV9hbGwoeCkgKCh2b2lkKXgpCi0jZGVmaW5lIGN1cmxzc2xfY2xvc2UgQ3VybF9ndGxzX2Nsb3NlCi0jZGVmaW5lIGN1cmxzc2xfc2h1dGRvd24oeCx5KSBDdXJsX2d0bHNfc2h1dGRvd24oeCx5KQotI2RlZmluZSBjdXJsc3NsX3NldF9lbmdpbmUoeCx5KSAoKHZvaWQpeCwgKHZvaWQpeSwgQ1VSTEVfTk9UX0JVSUxUX0lOKQotI2RlZmluZSBjdXJsc3NsX3NldF9lbmdpbmVfZGVmYXVsdCh4KSAoKHZvaWQpeCwgQ1VSTEVfTk9UX0JVSUxUX0lOKQotI2RlZmluZSBjdXJsc3NsX2VuZ2luZXNfbGlzdCh4KSAoKHZvaWQpeCwgKHN0cnVjdCBjdXJsX3NsaXN0ICopTlVMTCkKLSNkZWZpbmUgY3VybHNzbF92ZXJzaW9uIEN1cmxfZ3Rsc192ZXJzaW9uCi0jZGVmaW5lIGN1cmxzc2xfY2hlY2tfY3huKHgpICgodm9pZCl4LCAtMSkKLSNkZWZpbmUgY3VybHNzbF9kYXRhX3BlbmRpbmcoeCx5KSBDdXJsX2d0bHNfZGF0YV9wZW5kaW5nKHgseSkKLSNkZWZpbmUgY3VybHNzbF9yYW5kb20oeCx5LHopIEN1cmxfZ3Rsc19yYW5kb20oeCx5LHopCi0jZGVmaW5lIGN1cmxzc2xfbWQ1c3VtKGEsYixjLGQpIEN1cmxfZ3Rsc19tZDVzdW0oYSxiLGMsZCkKLSNkZWZpbmUgY3VybHNzbF9zaGEyNTZzdW0oYSxiLGMsZCkgQ3VybF9ndGxzX3NoYTI1NnN1bShhLGIsYyxkKQotI2RlZmluZSBjdXJsc3NsX2NlcnRfc3RhdHVzX3JlcXVlc3QoKSBDdXJsX2d0bHNfY2VydF9zdGF0dXNfcmVxdWVzdCgpCitleHRlcm4gY29uc3Qgc3RydWN0IEN1cmxfc3NsIEN1cmxfc3NsX2dudXRsczsKIAogI2VuZGlmIC8qIFVTRV9HTlVUTFMgKi8KICNlbmRpZiAvKiBIRUFERVJfQ1VSTF9HVExTX0ggKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvbWJlZHRscy5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9tYmVkdGxzLmMKaW5kZXggMDM3YmFiZS4uY2UxZjhlYiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9tYmVkdGxzLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9tYmVkdGxzLmMKQEAgLTYxLDYgKzYxLDIxIEBACiAjaW5jbHVkZSAiY3VybF9tZW1vcnkuaCIKICNpbmNsdWRlICJtZW1kZWJ1Zy5oIgogCitzdHJ1Y3Qgc3NsX2JhY2tlbmRfZGF0YSB7CisgIG1iZWR0bHNfY3RyX2RyYmdfY29udGV4dCBjdHJfZHJiZzsKKyAgbWJlZHRsc19lbnRyb3B5X2NvbnRleHQgZW50cm9weTsKKyAgbWJlZHRsc19zc2xfY29udGV4dCBzc2w7CisgIGludCBzZXJ2ZXJfZmQ7CisgIG1iZWR0bHNfeDUwOV9jcnQgY2FjZXJ0OworICBtYmVkdGxzX3g1MDlfY3J0IGNsaWNlcnQ7CisgIG1iZWR0bHNfeDUwOV9jcmwgY3JsOworICBtYmVkdGxzX3BrX2NvbnRleHQgcGs7CisgIG1iZWR0bHNfc3NsX2NvbmZpZyBjb25maWc7CisgIGNvbnN0IGNoYXIgKnByb3RvY29sc1szXTsKK307CisKKyNkZWZpbmUgQkFDS0VORCBjb25uc3NsLT5iYWNrZW5kCisKIC8qIGFwcGx5IHRocmVhZGluZz8gKi8KICNpZiBkZWZpbmVkKFVTRV9USFJFQURTX1BPU0lYKSB8fCBkZWZpbmVkKFVTRV9USFJFQURTX1dJTjMyKQogI2RlZmluZSBUSFJFQURJTkdfU1VQUE9SVApAQCAtMjE0LDkgKzIyOSw5IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKICAgfQogCi0gIG1iZWR0bHNfc3NsX2NvbmZfbWluX3ZlcnNpb24oJmNvbm5zc2wtPmNvbmZpZywgTUJFRFRMU19TU0xfTUFKT1JfVkVSU0lPTl8zLAorICBtYmVkdGxzX3NzbF9jb25mX21pbl92ZXJzaW9uKCZCQUNLRU5ELT5jb25maWcsIE1CRURUTFNfU1NMX01BSk9SX1ZFUlNJT05fMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYmVkdGxzX3Zlcl9taW4pOwotICBtYmVkdGxzX3NzbF9jb25mX21heF92ZXJzaW9uKCZjb25uc3NsLT5jb25maWcsIE1CRURUTFNfU1NMX01BSk9SX1ZFUlNJT05fMywKKyAgbWJlZHRsc19zc2xfY29uZl9tYXhfdmVyc2lvbigmQkFDS0VORC0+Y29uZmlnLCBNQkVEVExTX1NTTF9NQUpPUl9WRVJTSU9OXzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJlZHRsc192ZXJfbWF4KTsKIAogICByZXR1cm4gcmVzdWx0OwpAQCAtMjM4LDcgKzI1Myw3IEBACiAgIGNvbnN0IGxvbmcgaW50IHBvcnQgPSBTU0xfSVNfUFJPWFkoKSA/IGNvbm4tPnBvcnQgOiBjb25uLT5yZW1vdGVfcG9ydDsKICAgaW50IHJldCA9IC0xOwogICBjaGFyIGVycm9yYnVmWzEyOF07Ci0gIGVycm9yYnVmWzBdPTA7CisgIGVycm9yYnVmWzBdID0gMDsKIAogICAvKiBtYmVkVExTIG9ubHkgc3VwcG9ydHMgU1NMdjMgYW5kIFRMU3YxICovCiAgIGlmKFNTTF9DT05OX0NPTkZJRyh2ZXJzaW9uKSA9PSBDVVJMX1NTTFZFUlNJT05fU1NMdjIpIHsKQEAgLTI0OCw5ICsyNjMsOSBAQAogCiAjaWZkZWYgVEhSRUFESU5HX1NVUFBPUlQKICAgZW50cm9weV9pbml0X211dGV4KCZ0c19lbnRyb3B5KTsKLSAgbWJlZHRsc19jdHJfZHJiZ19pbml0KCZjb25uc3NsLT5jdHJfZHJiZyk7CisgIG1iZWR0bHNfY3RyX2RyYmdfaW5pdCgmQkFDS0VORC0+Y3RyX2RyYmcpOwogCi0gIHJldCA9IG1iZWR0bHNfY3RyX2RyYmdfc2VlZCgmY29ubnNzbC0+Y3RyX2RyYmcsIGVudHJvcHlfZnVuY19tdXRleCwKKyAgcmV0ID0gbWJlZHRsc19jdHJfZHJiZ19zZWVkKCZCQUNLRU5ELT5jdHJfZHJiZywgZW50cm9weV9mdW5jX211dGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRzX2VudHJvcHksIE5VTEwsIDApOwogICBpZihyZXQpIHsKICNpZmRlZiBNQkVEVExTX0VSUk9SX0MKQEAgLTI2MCwxMSArMjc1LDExIEBACiAgICAgICAgICAgLXJldCwgZXJyb3JidWYpOwogICB9CiAjZWxzZQotICBtYmVkdGxzX2VudHJvcHlfaW5pdCgmY29ubnNzbC0+ZW50cm9weSk7Ci0gIG1iZWR0bHNfY3RyX2RyYmdfaW5pdCgmY29ubnNzbC0+Y3RyX2RyYmcpOworICBtYmVkdGxzX2VudHJvcHlfaW5pdCgmQkFDS0VORC0+ZW50cm9weSk7CisgIG1iZWR0bHNfY3RyX2RyYmdfaW5pdCgmQkFDS0VORC0+Y3RyX2RyYmcpOwogCi0gIHJldCA9IG1iZWR0bHNfY3RyX2RyYmdfc2VlZCgmY29ubnNzbC0+Y3RyX2RyYmcsIG1iZWR0bHNfZW50cm9weV9mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbm5zc2wtPmVudHJvcHksIE5VTEwsIDApOworICByZXQgPSBtYmVkdGxzX2N0cl9kcmJnX3NlZWQoJkJBQ0tFTkQtPmN0cl9kcmJnLCBtYmVkdGxzX2VudHJvcHlfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCQUNLRU5ELT5lbnRyb3B5LCBOVUxMLCAwKTsKICAgaWYocmV0KSB7CiAjaWZkZWYgTUJFRFRMU19FUlJPUl9DCiAgICAgbWJlZHRsc19zdHJlcnJvcihyZXQsIGVycm9yYnVmLCBzaXplb2YoZXJyb3JidWYpKTsKQEAgLTI3NSwxMCArMjkwLDEwIEBACiAjZW5kaWYgLyogVEhSRUFESU5HX1NVUFBPUlQgKi8KIAogICAvKiBMb2FkIHRoZSB0cnVzdGVkIENBICovCi0gIG1iZWR0bHNfeDUwOV9jcnRfaW5pdCgmY29ubnNzbC0+Y2FjZXJ0KTsKKyAgbWJlZHRsc194NTA5X2NydF9pbml0KCZCQUNLRU5ELT5jYWNlcnQpOwogCiAgIGlmKHNzbF9jYWZpbGUpIHsKLSAgICByZXQgPSBtYmVkdGxzX3g1MDlfY3J0X3BhcnNlX2ZpbGUoJmNvbm5zc2wtPmNhY2VydCwgc3NsX2NhZmlsZSk7CisgICAgcmV0ID0gbWJlZHRsc194NTA5X2NydF9wYXJzZV9maWxlKCZCQUNLRU5ELT5jYWNlcnQsIHNzbF9jYWZpbGUpOwogCiAgICAgaWYocmV0PDApIHsKICNpZmRlZiBNQkVEVExTX0VSUk9SX0MKQEAgLTI5Myw3ICszMDgsNyBAQAogICB9CiAKICAgaWYoc3NsX2NhcGF0aCkgewotICAgIHJldCA9IG1iZWR0bHNfeDUwOV9jcnRfcGFyc2VfcGF0aCgmY29ubnNzbC0+Y2FjZXJ0LCBzc2xfY2FwYXRoKTsKKyAgICByZXQgPSBtYmVkdGxzX3g1MDlfY3J0X3BhcnNlX3BhdGgoJkJBQ0tFTkQtPmNhY2VydCwgc3NsX2NhcGF0aCk7CiAKICAgICBpZihyZXQ8MCkgewogI2lmZGVmIE1CRURUTFNfRVJST1JfQwpAQCAtMzA4LDEwICszMjMsMTAgQEAKICAgfQogCiAgIC8qIExvYWQgdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZSAqLwotICBtYmVkdGxzX3g1MDlfY3J0X2luaXQoJmNvbm5zc2wtPmNsaWNlcnQpOworICBtYmVkdGxzX3g1MDlfY3J0X2luaXQoJkJBQ0tFTkQtPmNsaWNlcnQpOwogCiAgIGlmKHNzbF9jZXJ0KSB7Ci0gICAgcmV0ID0gbWJlZHRsc194NTA5X2NydF9wYXJzZV9maWxlKCZjb25uc3NsLT5jbGljZXJ0LCBzc2xfY2VydCk7CisgICAgcmV0ID0gbWJlZHRsc194NTA5X2NydF9wYXJzZV9maWxlKCZCQUNLRU5ELT5jbGljZXJ0LCBzc2xfY2VydCk7CiAKICAgICBpZihyZXQpIHsKICNpZmRlZiBNQkVEVExTX0VSUk9SX0MKQEAgLTMyNSwxMiArMzQwLDEyIEBACiAgIH0KIAogICAvKiBMb2FkIHRoZSBjbGllbnQgcHJpdmF0ZSBrZXkgKi8KLSAgbWJlZHRsc19wa19pbml0KCZjb25uc3NsLT5wayk7CisgIG1iZWR0bHNfcGtfaW5pdCgmQkFDS0VORC0+cGspOwogCiAgIGlmKFNTTF9TRVRfT1BUSU9OKGtleSkpIHsKLSAgICByZXQgPSBtYmVkdGxzX3BrX3BhcnNlX2tleWZpbGUoJmNvbm5zc2wtPnBrLCBTU0xfU0VUX09QVElPTihrZXkpLAorICAgIHJldCA9IG1iZWR0bHNfcGtfcGFyc2Vfa2V5ZmlsZSgmQkFDS0VORC0+cGssIFNTTF9TRVRfT1BUSU9OKGtleSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9TRVRfT1BUSU9OKGtleV9wYXNzd2QpKTsKLSAgICBpZihyZXQgPT0gMCAmJiAhbWJlZHRsc19wa19jYW5fZG8oJmNvbm5zc2wtPnBrLCBNQkVEVExTX1BLX1JTQSkpCisgICAgaWYocmV0ID09IDAgJiYgIW1iZWR0bHNfcGtfY2FuX2RvKCZCQUNLRU5ELT5waywgTUJFRFRMU19QS19SU0EpKQogICAgICAgcmV0ID0gTUJFRFRMU19FUlJfUEtfVFlQRV9NSVNNQVRDSDsKIAogICAgIGlmKHJldCkgewpAQCAtMzQ1LDEwICszNjAsMTAgQEAKICAgfQogCiAgIC8qIExvYWQgdGhlIENSTCAqLwotICBtYmVkdGxzX3g1MDlfY3JsX2luaXQoJmNvbm5zc2wtPmNybCk7CisgIG1iZWR0bHNfeDUwOV9jcmxfaW5pdCgmQkFDS0VORC0+Y3JsKTsKIAogICBpZihzc2xfY3JsZmlsZSkgewotICAgIHJldCA9IG1iZWR0bHNfeDUwOV9jcmxfcGFyc2VfZmlsZSgmY29ubnNzbC0+Y3JsLCBzc2xfY3JsZmlsZSk7CisgICAgcmV0ID0gbWJlZHRsc194NTA5X2NybF9wYXJzZV9maWxlKCZCQUNLRU5ELT5jcmwsIHNzbF9jcmxmaWxlKTsKIAogICAgIGlmKHJldCkgewogI2lmZGVmIE1CRURUTFNfRVJST1JfQwpAQCAtMzYzLDE0ICszNzgsMTQgQEAKIAogICBpbmZvZihkYXRhLCAibWJlZFRMUzogQ29ubmVjdGluZyB0byAlczolZFxuIiwgaG9zdG5hbWUsIHBvcnQpOwogCi0gIG1iZWR0bHNfc3NsX2NvbmZpZ19pbml0KCZjb25uc3NsLT5jb25maWcpOworICBtYmVkdGxzX3NzbF9jb25maWdfaW5pdCgmQkFDS0VORC0+Y29uZmlnKTsKIAotICBtYmVkdGxzX3NzbF9pbml0KCZjb25uc3NsLT5zc2wpOwotICBpZihtYmVkdGxzX3NzbF9zZXR1cCgmY29ubnNzbC0+c3NsLCAmY29ubnNzbC0+Y29uZmlnKSkgeworICBtYmVkdGxzX3NzbF9pbml0KCZCQUNLRU5ELT5zc2wpOworICBpZihtYmVkdGxzX3NzbF9zZXR1cCgmQkFDS0VORC0+c3NsLCAmQkFDS0VORC0+Y29uZmlnKSkgewogICAgIGZhaWxmKGRhdGEsICJtYmVkVExTOiBzc2xfaW5pdCBmYWlsZWQiKTsKICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CiAgIH0KLSAgcmV0ID0gbWJlZHRsc19zc2xfY29uZmlnX2RlZmF1bHRzKCZjb25uc3NsLT5jb25maWcsCisgIHJldCA9IG1iZWR0bHNfc3NsX2NvbmZpZ19kZWZhdWx0cygmQkFDS0VORC0+Y29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJFRFRMU19TU0xfSVNfQ0xJRU5ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJFRFRMU19TU0xfVFJBTlNQT1JUX1NUUkVBTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CRURUTFNfU1NMX1BSRVNFVF9ERUZBVUxUKTsKQEAgLTM4MCwyMCArMzk1LDIwIEBACiAgIH0KIAogICAvKiBuZXcgcHJvZmlsZSB3aXRoIFJTQSBtaW4ga2V5IGxlbiA9IDEwMjQgLi4uICovCi0gIG1iZWR0bHNfc3NsX2NvbmZfY2VydF9wcm9maWxlKCZjb25uc3NsLT5jb25maWcsCisgIG1iZWR0bHNfc3NsX2NvbmZfY2VydF9wcm9maWxlKCZCQUNLRU5ELT5jb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYmVkdGxzX3g1MDlfY3J0X3Byb2ZpbGVfZnIpOwogCiAgIHN3aXRjaChTU0xfQ09OTl9DT05GSUcodmVyc2lvbikpIHsKICAgY2FzZSBDVVJMX1NTTFZFUlNJT05fREVGQVVMVDoKICAgY2FzZSBDVVJMX1NTTFZFUlNJT05fVExTdjE6Ci0gICAgbWJlZHRsc19zc2xfY29uZl9taW5fdmVyc2lvbigmY29ubnNzbC0+Y29uZmlnLCBNQkVEVExTX1NTTF9NQUpPUl9WRVJTSU9OXzMsCisgICAgbWJlZHRsc19zc2xfY29uZl9taW5fdmVyc2lvbigmQkFDS0VORC0+Y29uZmlnLCBNQkVEVExTX1NTTF9NQUpPUl9WRVJTSU9OXzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkVEVExTX1NTTF9NSU5PUl9WRVJTSU9OXzEpOwogICAgIGluZm9mKGRhdGEsICJtYmVkVExTOiBTZXQgbWluIFNTTCB2ZXJzaW9uIHRvIFRMUyAxLjBcbiIpOwogICAgIGJyZWFrOwogICBjYXNlIENVUkxfU1NMVkVSU0lPTl9TU0x2MzoKLSAgICBtYmVkdGxzX3NzbF9jb25mX21pbl92ZXJzaW9uKCZjb25uc3NsLT5jb25maWcsIE1CRURUTFNfU1NMX01BSk9SX1ZFUlNJT05fMywKKyAgICBtYmVkdGxzX3NzbF9jb25mX21pbl92ZXJzaW9uKCZCQUNLRU5ELT5jb25maWcsIE1CRURUTFNfU1NMX01BSk9SX1ZFUlNJT05fMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CRURUTFNfU1NMX01JTk9SX1ZFUlNJT05fMCk7Ci0gICAgbWJlZHRsc19zc2xfY29uZl9tYXhfdmVyc2lvbigmY29ubnNzbC0+Y29uZmlnLCBNQkVEVExTX1NTTF9NQUpPUl9WRVJTSU9OXzMsCisgICAgbWJlZHRsc19zc2xfY29uZl9tYXhfdmVyc2lvbigmQkFDS0VORC0+Y29uZmlnLCBNQkVEVExTX1NTTF9NQUpPUl9WRVJTSU9OXzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQkVEVExTX1NTTF9NSU5PUl9WRVJTSU9OXzApOwogICAgIGluZm9mKGRhdGEsICJtYmVkVExTOiBTZXQgU1NMIHZlcnNpb24gdG8gU1NMdjNcbiIpOwogICAgIGJyZWFrOwpAQCAtNDEyLDI1ICs0MjcsMjUgQEAKICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CiAgIH0KIAotICBtYmVkdGxzX3NzbF9jb25mX2F1dGhtb2RlKCZjb25uc3NsLT5jb25maWcsIE1CRURUTFNfU1NMX1ZFUklGWV9PUFRJT05BTCk7CisgIG1iZWR0bHNfc3NsX2NvbmZfYXV0aG1vZGUoJkJBQ0tFTkQtPmNvbmZpZywgTUJFRFRMU19TU0xfVkVSSUZZX09QVElPTkFMKTsKIAotICBtYmVkdGxzX3NzbF9jb25mX3JuZygmY29ubnNzbC0+Y29uZmlnLCBtYmVkdGxzX2N0cl9kcmJnX3JhbmRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgJmNvbm5zc2wtPmN0cl9kcmJnKTsKLSAgbWJlZHRsc19zc2xfc2V0X2JpbygmY29ubnNzbC0+c3NsLCAmY29ubi0+c29ja1tzb2NraW5kZXhdLAorICBtYmVkdGxzX3NzbF9jb25mX3JuZygmQkFDS0VORC0+Y29uZmlnLCBtYmVkdGxzX2N0cl9kcmJnX3JhbmRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgJkJBQ0tFTkQtPmN0cl9kcmJnKTsKKyAgbWJlZHRsc19zc2xfc2V0X2JpbygmQkFDS0VORC0+c3NsLCAmY29ubi0+c29ja1tzb2NraW5kZXhdLAogICAgICAgICAgICAgICAgICAgICAgIG1iZWR0bHNfbmV0X3NlbmQsCiAgICAgICAgICAgICAgICAgICAgICAgbWJlZHRsc19uZXRfcmVjdiwKICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qICByZXZfdGltZW91dCgpICovKTsKIAotICBtYmVkdGxzX3NzbF9jb25mX2NpcGhlcnN1aXRlcygmY29ubnNzbC0+Y29uZmlnLAorICBtYmVkdGxzX3NzbF9jb25mX2NpcGhlcnN1aXRlcygmQkFDS0VORC0+Y29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYmVkdGxzX3NzbF9saXN0X2NpcGhlcnN1aXRlcygpKTsKIAogI2lmIGRlZmluZWQoTUJFRFRMU19TU0xfUkVORUdPVElBVElPTikKLSAgbWJlZHRsc19zc2xfY29uZl9yZW5lZ290aWF0aW9uKCZjb25uc3NsLT5jb25maWcsCisgIG1iZWR0bHNfc3NsX2NvbmZfcmVuZWdvdGlhdGlvbigmQkFDS0VORC0+Y29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJFRFRMU19TU0xfUkVORUdPVElBVElPTl9FTkFCTEVEKTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChNQkVEVExTX1NTTF9TRVNTSU9OX1RJQ0tFVFMpCi0gIG1iZWR0bHNfc3NsX2NvbmZfc2Vzc2lvbl90aWNrZXRzKCZjb25uc3NsLT5jb25maWcsCisgIG1iZWR0bHNfc3NsX2NvbmZfc2Vzc2lvbl90aWNrZXRzKCZCQUNLRU5ELT5jb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CRURUTFNfU1NMX1NFU1NJT05fVElDS0VUU19ESVNBQkxFRCk7CiAjZW5kaWYKIApAQCAtNDQwLDcgKzQ1NSw3IEBACiAKICAgICBDdXJsX3NzbF9zZXNzaW9uaWRfbG9jayhjb25uKTsKICAgICBpZighQ3VybF9zc2xfZ2V0c2Vzc2lvbmlkKGNvbm4sICZvbGRfc2Vzc2lvbiwgTlVMTCwgc29ja2luZGV4KSkgewotICAgICAgcmV0ID0gbWJlZHRsc19zc2xfc2V0X3Nlc3Npb24oJmNvbm5zc2wtPnNzbCwgb2xkX3Nlc3Npb24pOworICAgICAgcmV0ID0gbWJlZHRsc19zc2xfc2V0X3Nlc3Npb24oJkJBQ0tFTkQtPnNzbCwgb2xkX3Nlc3Npb24pOwogICAgICAgaWYocmV0KSB7CiAgICAgICAgIEN1cmxfc3NsX3Nlc3Npb25pZF91bmxvY2soY29ubik7CiAgICAgICAgIGZhaWxmKGRhdGEsICJtYmVkdGxzX3NzbF9zZXRfc2Vzc2lvbiByZXR1cm5lZCAtMHgleCIsIC1yZXQpOwpAQCAtNDUxLDE1ICs0NjYsMTUgQEAKICAgICBDdXJsX3NzbF9zZXNzaW9uaWRfdW5sb2NrKGNvbm4pOwogICB9CiAKLSAgbWJlZHRsc19zc2xfY29uZl9jYV9jaGFpbigmY29ubnNzbC0+Y29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25uc3NsLT5jYWNlcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbm5zc2wtPmNybCk7CisgIG1iZWR0bHNfc3NsX2NvbmZfY2FfY2hhaW4oJkJBQ0tFTkQtPmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQkFDS0VORC0+Y2FjZXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCQUNLRU5ELT5jcmwpOwogCiAgIGlmKFNTTF9TRVRfT1BUSU9OKGtleSkpIHsKLSAgICBtYmVkdGxzX3NzbF9jb25mX293bl9jZXJ0KCZjb25uc3NsLT5jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ubnNzbC0+Y2xpY2VydCwgJmNvbm5zc2wtPnBrKTsKKyAgICBtYmVkdGxzX3NzbF9jb25mX293bl9jZXJ0KCZCQUNLRU5ELT5jb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQkFDS0VORC0+Y2xpY2VydCwgJkJBQ0tFTkQtPnBrKTsKICAgfQotICBpZihtYmVkdGxzX3NzbF9zZXRfaG9zdG5hbWUoJmNvbm5zc2wtPnNzbCwgaG9zdG5hbWUpKSB7CisgIGlmKG1iZWR0bHNfc3NsX3NldF9ob3N0bmFtZSgmQkFDS0VORC0+c3NsLCBob3N0bmFtZSkpIHsKICAgICAvKiBtYmVkdGxzX3NzbF9zZXRfaG9zdG5hbWUoKSBzZXRzIHRoZSBuYW1lIHRvIHVzZSBpbiBDTi9TQU4gY2hlY2tzICphbmQqCiAgICAgICAgdGhlIG5hbWUgdG8gc2V0IGluIHRoZSBTTkkgZXh0ZW5zaW9uLiBTbyBldmVuIGlmIGN1cmwgY29ubmVjdHMgdG8gYQogICAgICAgIGhvc3Qgc3BlY2lmaWVkIGFzIGFuIElQIGFkZHJlc3MsIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkLiAqLwpAQCAtNDY5LDcgKzQ4NCw3IEBACiAKICNpZmRlZiBIQVNfQUxQTgogICBpZihjb25uLT5iaXRzLnRsc19lbmFibGVfYWxwbikgewotICAgIGNvbnN0IGNoYXIgKipwID0gJmNvbm5zc2wtPnByb3RvY29sc1swXTsKKyAgICBjb25zdCBjaGFyICoqcCA9ICZCQUNLRU5ELT5wcm90b2NvbHNbMF07CiAjaWZkZWYgVVNFX05HSFRUUDIKICAgICBpZihkYXRhLT5zZXQuaHR0cHZlcnNpb24gPj0gQ1VSTF9IVFRQX1ZFUlNJT05fMikKICAgICAgICpwKysgPSBOR0hUVFAyX1BST1RPX1ZFUlNJT05fSUQ7CkBAIC00NzgsMTkgKzQ5MywxOSBAQAogICAgICpwID0gTlVMTDsKICAgICAvKiB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2xvbmUgdGhlIHByb3RvY29scyBhcnJheSwgd2hpY2ggaXMgd2h5IHdlIG5lZWQKICAgICAgICB0byBrZWVwIGl0IGFyb3VuZCAqLwotICAgIGlmKG1iZWR0bHNfc3NsX2NvbmZfYWxwbl9wcm90b2NvbHMoJmNvbm5zc2wtPmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25uc3NsLT5wcm90b2NvbHNbMF0pKSB7CisgICAgaWYobWJlZHRsc19zc2xfY29uZl9hbHBuX3Byb3RvY29scygmQkFDS0VORC0+Y29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJBQ0tFTkQtPnByb3RvY29sc1swXSkpIHsKICAgICAgIGZhaWxmKGRhdGEsICJGYWlsZWQgc2V0dGluZyBBTFBOIHByb3RvY29scyIpOwogICAgICAgcmV0dXJuIENVUkxFX1NTTF9DT05ORUNUX0VSUk9SOwogICAgIH0KLSAgICBmb3IocCA9ICZjb25uc3NsLT5wcm90b2NvbHNbMF07ICpwOyArK3ApCisgICAgZm9yKHAgPSAmQkFDS0VORC0+cHJvdG9jb2xzWzBdOyAqcDsgKytwKQogICAgICAgaW5mb2YoZGF0YSwgIkFMUE4sIG9mZmVyaW5nICVzXG4iLCAqcCk7CiAgIH0KICNlbmRpZgogCiAjaWZkZWYgTUJFRFRMU19ERUJVRwogICAvKiBJbiBvcmRlciB0byBtYWtlIHRoYXQgd29yayBpbiBtYmVkdGxzIE1CRURUTFNfREVCVUdfQyBtdXN0IGJlIGRlZmluZWQuICovCi0gIG1iZWR0bHNfc3NsX2NvbmZfZGJnKCZjb25uc3NsLT5jb25maWcsIG1iZWRfZGVidWcsIGRhdGEpOworICBtYmVkdGxzX3NzbF9jb25mX2RiZygmQkFDS0VORC0+Y29uZmlnLCBtYmVkX2RlYnVnLCBkYXRhKTsKICAgLyogLSAwIE5vIGRlYnVnCiAgICAqIC0gMSBFcnJvcgogICAgKiAtIDIgU3RhdGUgY2hhbmdlCkBAIC01MDIsNyArNTE3LDcgQEAKIAogICAvKiBnaXZlIGFwcGxpY2F0aW9uIGEgY2hhbmNlIHRvIGludGVyZmVyZSB3aXRoIG1iZWRUTFMgc2V0IHVwLiAqLwogICBpZihkYXRhLT5zZXQuc3NsLmZzc2xjdHgpIHsKLSAgICByZXQgPSAoKmRhdGEtPnNldC5zc2wuZnNzbGN0eCkoZGF0YSwgJmNvbm5zc2wtPmNvbmZpZywKKyAgICByZXQgPSAoKmRhdGEtPnNldC5zc2wuZnNzbGN0eCkoZGF0YSwgJkJBQ0tFTkQtPmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+c2V0LnNzbC5mc3NsY3R4cCk7CiAgICAgaWYocmV0KSB7CiAgICAgICBmYWlsZihkYXRhLCAiZXJyb3Igc2lnbmFsZWQgYnkgc3NsIGN0eCBjYWxsYmFjayIpOwpAQCAtNTM3LDcgKzU1Miw3IEBACiAgIGNvbm4tPnJlY3Zbc29ja2luZGV4XSA9IG1iZWRfcmVjdjsKICAgY29ubi0+c2VuZFtzb2NraW5kZXhdID0gbWJlZF9zZW5kOwogCi0gIHJldCA9IG1iZWR0bHNfc3NsX2hhbmRzaGFrZSgmY29ubnNzbC0+c3NsKTsKKyAgcmV0ID0gbWJlZHRsc19zc2xfaGFuZHNoYWtlKCZCQUNLRU5ELT5zc2wpOwogCiAgIGlmKHJldCA9PSBNQkVEVExTX0VSUl9TU0xfV0FOVF9SRUFEKSB7CiAgICAgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSA9IHNzbF9jb25uZWN0XzJfcmVhZGluZzsKQEAgLTU1NywxMCArNTcyLDEwIEBACiAgIH0KIAogICBpbmZvZihkYXRhLCAibWJlZFRMUzogSGFuZHNoYWtlIGNvbXBsZXRlLCBjaXBoZXIgaXMgJXNcbiIsCi0gICAgICAgIG1iZWR0bHNfc3NsX2dldF9jaXBoZXJzdWl0ZSgmY29ubi0+c3NsW3NvY2tpbmRleF0uc3NsKQorICAgICAgICBtYmVkdGxzX3NzbF9nZXRfY2lwaGVyc3VpdGUoJkJBQ0tFTkQtPnNzbCkKICAgICApOwogCi0gIHJldCA9IG1iZWR0bHNfc3NsX2dldF92ZXJpZnlfcmVzdWx0KCZjb25uLT5zc2xbc29ja2luZGV4XS5zc2wpOworICByZXQgPSBtYmVkdGxzX3NzbF9nZXRfdmVyaWZ5X3Jlc3VsdCgmQkFDS0VORC0+c3NsKTsKIAogICBpZihyZXQgJiYgU1NMX0NPTk5fQ09ORklHKHZlcmlmeXBlZXIpKSB7CiAgICAgaWYocmV0ICYgTUJFRFRMU19YNTA5X0JBRENFUlRfRVhQSVJFRCkKQEAgLTU4MCw3ICs1OTUsNyBAQAogICAgIHJldHVybiBDVVJMRV9QRUVSX0ZBSUxFRF9WRVJJRklDQVRJT047CiAgIH0KIAotICBwZWVyY2VydCA9IG1iZWR0bHNfc3NsX2dldF9wZWVyX2NlcnQoJmNvbm5zc2wtPnNzbCk7CisgIHBlZXJjZXJ0ID0gbWJlZHRsc19zc2xfZ2V0X3BlZXJfY2VydCgmQkFDS0VORC0+c3NsKTsKIAogICBpZihwZWVyY2VydCAmJiBkYXRhLT5zZXQudmVyYm9zZSkgewogICAgIGNvbnN0IHNpemVfdCBidWZzaXplID0gMTYzODQ7CkBAIC02NTAsNyArNjY1LDcgQEAKIAogI2lmZGVmIEhBU19BTFBOCiAgIGlmKGNvbm4tPmJpdHMudGxzX2VuYWJsZV9hbHBuKSB7Ci0gICAgbmV4dF9wcm90b2NvbCA9IG1iZWR0bHNfc3NsX2dldF9hbHBuX3Byb3RvY29sKCZjb25uc3NsLT5zc2wpOworICAgIG5leHRfcHJvdG9jb2wgPSBtYmVkdGxzX3NzbF9nZXRfYWxwbl9wcm90b2NvbCgmQkFDS0VORC0+c3NsKTsKIAogICAgIGlmKG5leHRfcHJvdG9jb2wpIHsKICAgICAgIGluZm9mKGRhdGEsICJBTFBOLCBzZXJ2ZXIgYWNjZXB0ZWQgdG8gdXNlICVzXG4iLCBuZXh0X3Byb3RvY29sKTsKQEAgLTcwMCw3ICs3MTUsNyBAQAogCiAgICAgbWJlZHRsc19zc2xfc2Vzc2lvbl9pbml0KG91cl9zc2xfc2Vzc2lvbmlkKTsKIAotICAgIHJldCA9IG1iZWR0bHNfc3NsX2dldF9zZXNzaW9uKCZjb25uc3NsLT5zc2wsIG91cl9zc2xfc2Vzc2lvbmlkKTsKKyAgICByZXQgPSBtYmVkdGxzX3NzbF9nZXRfc2Vzc2lvbigmQkFDS0VORC0+c3NsLCBvdXJfc3NsX3Nlc3Npb25pZCk7CiAgICAgaWYocmV0KSB7CiAgICAgICBmcmVlKG91cl9zc2xfc2Vzc2lvbmlkKTsKICAgICAgIGZhaWxmKGRhdGEsICJtYmVkdGxzX3NzbF9nZXRfc2Vzc2lvbiByZXR1cm5lZCAtMHgleCIsIC1yZXQpOwpAQCAtNzMwLDkgKzc0NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKm1lbSwgc2l6ZV90IGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMY29kZSAqY3VybGNvZGUpCiB7CisgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOwogICBpbnQgcmV0ID0gLTE7CiAKLSAgcmV0ID0gbWJlZHRsc19zc2xfd3JpdGUoJmNvbm4tPnNzbFtzb2NraW5kZXhdLnNzbCwKKyAgcmV0ID0gbWJlZHRsc19zc2xfd3JpdGUoJkJBQ0tFTkQtPnNzbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKiltZW0sIGxlbik7CiAKICAgaWYocmV0IDwgMCkgewpAQCAtNzQ0LDIyICs3NjAsMjMgQEAKICAgcmV0dXJuIHJldDsKIH0KIAotdm9pZCBDdXJsX21iZWR0bHNfY2xvc2VfYWxsKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCitzdGF0aWMgdm9pZCBDdXJsX21iZWR0bHNfY2xvc2VfYWxsKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCiB7CiAgICh2b2lkKWRhdGE7CiB9CiAKLXZvaWQgQ3VybF9tYmVkdGxzX2Nsb3NlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKK3N0YXRpYyB2b2lkIEN1cmxfbWJlZHRsc19jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCiB7Ci0gIG1iZWR0bHNfcGtfZnJlZSgmY29ubi0+c3NsW3NvY2tpbmRleF0ucGspOwotICBtYmVkdGxzX3g1MDlfY3J0X2ZyZWUoJmNvbm4tPnNzbFtzb2NraW5kZXhdLmNsaWNlcnQpOwotICBtYmVkdGxzX3g1MDlfY3J0X2ZyZWUoJmNvbm4tPnNzbFtzb2NraW5kZXhdLmNhY2VydCk7Ci0gIG1iZWR0bHNfeDUwOV9jcmxfZnJlZSgmY29ubi0+c3NsW3NvY2tpbmRleF0uY3JsKTsKLSAgbWJlZHRsc19zc2xfY29uZmlnX2ZyZWUoJmNvbm4tPnNzbFtzb2NraW5kZXhdLmNvbmZpZyk7Ci0gIG1iZWR0bHNfc3NsX2ZyZWUoJmNvbm4tPnNzbFtzb2NraW5kZXhdLnNzbCk7Ci0gIG1iZWR0bHNfY3RyX2RyYmdfZnJlZSgmY29ubi0+c3NsW3NvY2tpbmRleF0uY3RyX2RyYmcpOworICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbc29ja2luZGV4XTsKKyAgbWJlZHRsc19wa19mcmVlKCZCQUNLRU5ELT5wayk7CisgIG1iZWR0bHNfeDUwOV9jcnRfZnJlZSgmQkFDS0VORC0+Y2xpY2VydCk7CisgIG1iZWR0bHNfeDUwOV9jcnRfZnJlZSgmQkFDS0VORC0+Y2FjZXJ0KTsKKyAgbWJlZHRsc194NTA5X2NybF9mcmVlKCZCQUNLRU5ELT5jcmwpOworICBtYmVkdGxzX3NzbF9jb25maWdfZnJlZSgmQkFDS0VORC0+Y29uZmlnKTsKKyAgbWJlZHRsc19zc2xfZnJlZSgmQkFDS0VORC0+c3NsKTsKKyAgbWJlZHRsc19jdHJfZHJiZ19mcmVlKCZCQUNLRU5ELT5jdHJfZHJiZyk7CiAjaWZuZGVmIFRIUkVBRElOR19TVVBQT1JUCi0gIG1iZWR0bHNfZW50cm9weV9mcmVlKCZjb25uLT5zc2xbc29ja2luZGV4XS5lbnRyb3B5KTsKKyAgbWJlZHRsc19lbnRyb3B5X2ZyZWUoJkJBQ0tFTkQtPmVudHJvcHkpOwogI2VuZGlmIC8qIFRIUkVBRElOR19TVVBQT1JUICovCiB9CiAKQEAgLTc2NywxMSArNzg0LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYnVmLCBzaXplX3QgYnVmZmVyc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMY29kZSAqY3VybGNvZGUpCiB7CisgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtudW1dOwogICBpbnQgcmV0ID0gLTE7CiAgIHNzaXplX3QgbGVuID0gLTE7CiAKICAgbWVtc2V0KGJ1ZiwgMCwgYnVmZmVyc2l6ZSk7Ci0gIHJldCA9IG1iZWR0bHNfc3NsX3JlYWQoJmNvbm4tPnNzbFtudW1dLnNzbCwgKHVuc2lnbmVkIGNoYXIgKilidWYsCisgIHJldCA9IG1iZWR0bHNfc3NsX3JlYWQoJkJBQ0tFTkQtPnNzbCwgKHVuc2lnbmVkIGNoYXIgKilidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyc2l6ZSk7CiAKICAgaWYocmV0IDw9IDApIHsKQEAgLTc4OCwyMSArODA2LDIxIEBACiAgIHJldHVybiBsZW47CiB9CiAKLXZvaWQgQ3VybF9tYmVkdGxzX3Nlc3Npb25fZnJlZSh2b2lkICpwdHIpCitzdGF0aWMgdm9pZCBDdXJsX21iZWR0bHNfc2Vzc2lvbl9mcmVlKHZvaWQgKnB0cikKIHsKICAgbWJlZHRsc19zc2xfc2Vzc2lvbl9mcmVlKHB0cik7CiAgIGZyZWUocHRyKTsKIH0KIAotc2l6ZV90IEN1cmxfbWJlZHRsc192ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCitzdGF0aWMgc2l6ZV90IEN1cmxfbWJlZHRsc192ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7CiAgIHVuc2lnbmVkIGludCB2ZXJzaW9uID0gbWJlZHRsc192ZXJzaW9uX2dldF9udW1iZXIoKTsKICAgcmV0dXJuIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIm1iZWRUTFMvJWQuJWQuJWQiLCB2ZXJzaW9uPj4yNCwKICAgICAgICAgICAgICAgICAgICh2ZXJzaW9uPj4xNikmMHhmZiwgKHZlcnNpb24+PjgpJjB4ZmYpOwogfQogCi1DVVJMY29kZSBDdXJsX21iZWR0bHNfcmFuZG9tKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsIHVuc2lnbmVkIGNoYXIgKmVudHJvcHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpCitzdGF0aWMgQ1VSTGNvZGUgQ3VybF9tYmVkdGxzX3JhbmRvbShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW50cm9weSwgc2l6ZV90IGxlbmd0aCkKIHsKICNpZiBkZWZpbmVkKE1CRURUTFNfQ1RSX0RSQkdfQykKICAgaW50IHJldCA9IC0xOwpAQCAtODExLDcgKzgyOSw3IEBACiAgIG1iZWR0bHNfY3RyX2RyYmdfY29udGV4dCBjdHJfZHJiZzsKICAgbWJlZHRsc19lbnRyb3B5X2luaXQoJmN0cl9lbnRyb3B5KTsKICAgbWJlZHRsc19jdHJfZHJiZ19pbml0KCZjdHJfZHJiZyk7Ci0gIGVycm9yYnVmWzBdPTA7CisgIGVycm9yYnVmWzBdID0gMDsKIAogICByZXQgPSBtYmVkdGxzX2N0cl9kcmJnX3NlZWQoJmN0cl9kcmJnLCBtYmVkdGxzX2VudHJvcHlfZnVuYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHJfZW50cm9weSwgTlVMTCwgMCk7CkBAIC04NjksNyArODg3LDcgQEAKICAgICByZXR1cm4gQ1VSTEVfT0s7CiAgIH0KIAotICBpZihzc2xfY29ubmVjdF8xPT1jb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlKSB7CisgIGlmKHNzbF9jb25uZWN0XzEgPT0gY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSkgewogICAgIC8qIEZpbmQgb3V0IGhvdyBtdWNoIG1vcmUgdGltZSB3ZSdyZSBhbGxvd2VkICovCiAgICAgdGltZW91dF9tcyA9IEN1cmxfdGltZWxlZnQoZGF0YSwgTlVMTCwgVFJVRSk7CiAKQEAgLTkwMCw5ICs5MTgsOSBAQAogICAgIGlmKGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPT0gc3NsX2Nvbm5lY3RfMl9yZWFkaW5nCiAgICAgICAgfHwgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSA9PSBzc2xfY29ubmVjdF8yX3dyaXRpbmcpIHsKIAotICAgICAgY3VybF9zb2NrZXRfdCB3cml0ZWZkID0gc3NsX2Nvbm5lY3RfMl93cml0aW5nPT0KKyAgICAgIGN1cmxfc29ja2V0X3Qgd3JpdGVmZCA9IHNzbF9jb25uZWN0XzJfd3JpdGluZyA9PQogICAgICAgICBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlP3NvY2tmZDpDVVJMX1NPQ0tFVF9CQUQ7Ci0gICAgICBjdXJsX3NvY2tldF90IHJlYWRmZCA9IHNzbF9jb25uZWN0XzJfcmVhZGluZz09CisgICAgICBjdXJsX3NvY2tldF90IHJlYWRmZCA9IHNzbF9jb25uZWN0XzJfcmVhZGluZyA9PQogICAgICAgICBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlP3NvY2tmZDpDVVJMX1NPQ0tFVF9CQUQ7CiAKICAgICAgIHdoYXQgPSBDdXJsX3NvY2tldF9jaGVjayhyZWFkZmQsIENVUkxfU09DS0VUX0JBRCwgd3JpdGVmZCwKQEAgLTk0MiwxMyArOTYwLDEzIEBACiAKICAgfSAvKiByZXBlYXQgc3RlcDIgdW50aWwgYWxsIHRyYW5zYWN0aW9ucyBhcmUgZG9uZS4gKi8KIAotICBpZihzc2xfY29ubmVjdF8zPT1jb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlKSB7CisgIGlmKHNzbF9jb25uZWN0XzMgPT0gY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSkgewogICAgIHJldGNvZGUgPSBtYmVkX2Nvbm5lY3Rfc3RlcDMoY29ubiwgc29ja2luZGV4KTsKICAgICBpZihyZXRjb2RlKQogICAgICAgcmV0dXJuIHJldGNvZGU7CiAgIH0KIAotICBpZihzc2xfY29ubmVjdF9kb25lPT1jb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlKSB7CisgIGlmKHNzbF9jb25uZWN0X2RvbmUgPT0gY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSkgewogICAgIGNvbm5zc2wtPnN0YXRlID0gc3NsX2Nvbm5lY3Rpb25fY29tcGxldGU7CiAgICAgY29ubi0+cmVjdltzb2NraW5kZXhdID0gbWJlZF9yZWN2OwogICAgIGNvbm4tPnNlbmRbc29ja2luZGV4XSA9IG1iZWRfc2VuZDsKQEAgLTk2MywxOCArOTgxLDE0IEBACiAgIHJldHVybiBDVVJMRV9PSzsKIH0KIAotQ1VSTGNvZGUKLUN1cmxfbWJlZHRsc19jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpkb25lKQorc3RhdGljIENVUkxjb2RlIEN1cmxfbWJlZHRsc19jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LCBib29sICpkb25lKQogewogICByZXR1cm4gbWJlZF9jb25uZWN0X2NvbW1vbihjb25uLCBzb2NraW5kZXgsIFRSVUUsIGRvbmUpOwogfQogCiAKLUNVUkxjb2RlCi1DdXJsX21iZWR0bHNfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4KQorc3RhdGljIENVUkxjb2RlIEN1cmxfbWJlZHRsc19jb25uZWN0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKICAgQ1VSTGNvZGUgcmV0Y29kZTsKICAgYm9vbCBkb25lID0gRkFMU0U7CkBAIC05OTIsMTkgKzEwMDYsNzAgQEAKICAqIHJldHVybiAwIGVycm9yIGluaXRpYWxpemluZyBTU0wKICAqIHJldHVybiAxIFNTTCBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkKICAqLwotaW50IEN1cmxfbWJlZHRsc19pbml0KHZvaWQpCitzdGF0aWMgaW50IEN1cmxfbWJlZHRsc19pbml0KHZvaWQpCiB7CiAgIHJldHVybiBDdXJsX3BvbGFyc3NsdGhyZWFkbG9ja190aHJlYWRfc2V0dXAoKTsKIH0KIAotdm9pZCBDdXJsX21iZWR0bHNfY2xlYW51cCh2b2lkKQorc3RhdGljIHZvaWQgQ3VybF9tYmVkdGxzX2NsZWFudXAodm9pZCkKIHsKICAgKHZvaWQpQ3VybF9wb2xhcnNzbHRocmVhZGxvY2tfdGhyZWFkX2NsZWFudXAoKTsKIH0KIAotaW50IEN1cmxfbWJlZHRsc19kYXRhX3BlbmRpbmcoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQorc3RhdGljIGJvb2wgQ3VybF9tYmVkdGxzX2RhdGFfcGVuZGluZyhjb25zdCBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgpCiB7Ci0gIHJldHVybiBtYmVkdGxzX3NzbF9nZXRfYnl0ZXNfYXZhaWwoJmNvbm4tPnNzbFtzb2NraW5kZXhdLnNzbCkgIT0gMDsKKyAgY29uc3Qgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CisgIHJldHVybiBtYmVkdGxzX3NzbF9nZXRfYnl0ZXNfYXZhaWwoJkJBQ0tFTkQtPnNzbCkgIT0gMDsKIH0KIAorc3RhdGljIHZvaWQgQ3VybF9tYmVkdGxzX3NoYTI1NnN1bShjb25zdCB1bnNpZ25lZCBjaGFyICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbnB1dGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNoYTI1NnN1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaGEyNTZsZW4gVU5VU0VEX1BBUkFNKQoreworICAodm9pZClzaGEyNTZsZW47CisgIG1iZWR0bHNfc2hhMjU2KGlucHV0LCBpbnB1dGxlbiwgc2hhMjU2c3VtLCAwKTsKK30KKworc3RhdGljIHZvaWQgKkN1cmxfbWJlZHRsc19nZXRfaW50ZXJuYWxzKHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxJTkZPIGluZm8gVU5VU0VEX1BBUkFNKQoreworICAodm9pZClpbmZvOworICByZXR1cm4gJkJBQ0tFTkQtPnNzbDsKK30KKworY29uc3Qgc3RydWN0IEN1cmxfc3NsIEN1cmxfc3NsX21iZWR0bHMgPSB7CisgIHsgQ1VSTFNTTEJBQ0tFTkRfTUJFRFRMUywgIm1iZWR0bHMiIH0sIC8qIGluZm8gKi8KKworICAxLCAvKiBoYXZlX2NhX3BhdGggKi8KKyAgMCwgLyogaGF2ZV9jZXJ0aW5mbyAqLworICAxLCAvKiBoYXZlX3Bpbm5lZHB1YmtleSAqLworICAxLCAvKiBoYXZlX3NzbF9jdHggKi8KKyAgMCwgLyogc3VwcG9ydF9odHRwc19wcm94eSAqLworCisgIHNpemVvZihzdHJ1Y3Qgc3NsX2JhY2tlbmRfZGF0YSksCisKKyAgQ3VybF9tYmVkdGxzX2luaXQsICAgICAgICAgICAgICAgIC8qIGluaXQgKi8KKyAgQ3VybF9tYmVkdGxzX2NsZWFudXAsICAgICAgICAgICAgIC8qIGNsZWFudXAgKi8KKyAgQ3VybF9tYmVkdGxzX3ZlcnNpb24sICAgICAgICAgICAgIC8qIHZlcnNpb24gKi8KKyAgQ3VybF9ub25lX2NoZWNrX2N4biwgICAgICAgICAgICAgIC8qIGNoZWNrX2N4biAqLworICBDdXJsX25vbmVfc2h1dGRvd24sICAgICAgICAgICAgICAgLyogc2h1dGRvd24gKi8KKyAgQ3VybF9tYmVkdGxzX2RhdGFfcGVuZGluZywgICAgICAgIC8qIGRhdGFfcGVuZGluZyAqLworICBDdXJsX21iZWR0bHNfcmFuZG9tLCAgICAgICAgICAgICAgLyogcmFuZG9tICovCisgIEN1cmxfbm9uZV9jZXJ0X3N0YXR1c19yZXF1ZXN0LCAgICAvKiBjZXJ0X3N0YXR1c19yZXF1ZXN0ICovCisgIEN1cmxfbWJlZHRsc19jb25uZWN0LCAgICAgICAgICAgICAvKiBjb25uZWN0ICovCisgIEN1cmxfbWJlZHRsc19jb25uZWN0X25vbmJsb2NraW5nLCAvKiBjb25uZWN0X25vbmJsb2NraW5nICovCisgIEN1cmxfbWJlZHRsc19nZXRfaW50ZXJuYWxzLCAgICAgICAvKiBnZXRfaW50ZXJuYWxzICovCisgIEN1cmxfbWJlZHRsc19jbG9zZSwgICAgICAgICAgICAgICAvKiBjbG9zZSAqLworICBDdXJsX21iZWR0bHNfY2xvc2VfYWxsLCAgICAgICAgICAgLyogY2xvc2VfYWxsICovCisgIEN1cmxfbWJlZHRsc19zZXNzaW9uX2ZyZWUsICAgICAgICAvKiBzZXNzaW9uX2ZyZWUgKi8KKyAgQ3VybF9ub25lX3NldF9lbmdpbmUsICAgICAgICAgICAgIC8qIHNldF9lbmdpbmUgKi8KKyAgQ3VybF9ub25lX3NldF9lbmdpbmVfZGVmYXVsdCwgICAgIC8qIHNldF9lbmdpbmVfZGVmYXVsdCAqLworICBDdXJsX25vbmVfZW5naW5lc19saXN0LCAgICAgICAgICAgLyogZW5naW5lc19saXN0ICovCisgIEN1cmxfbm9uZV9mYWxzZV9zdGFydCwgICAgICAgICAgICAvKiBmYWxzZV9zdGFydCAqLworICBDdXJsX25vbmVfbWQ1c3VtLCAgICAgICAgICAgICAgICAgLyogbWQ1c3VtICovCisgIEN1cmxfbWJlZHRsc19zaGEyNTZzdW0gICAgICAgICAgICAvKiBzaGEyNTZzdW0gKi8KK307CisKICNlbmRpZiAvKiBVU0VfTUJFRFRMUyAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9tYmVkdGxzLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL21iZWR0bHMuaAppbmRleCA3MWQxN2E0Li40YTkzODYwIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL21iZWR0bHMuaAorKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL21iZWR0bHMuaApAQCAtMjYsNTcgKzI2LDcgQEAKIAogI2lmZGVmIFVTRV9NQkVEVExTCiAKLSNpbmNsdWRlIDxtYmVkdGxzL3NoYTI1Ni5oPgotCi0vKiBDYWxsZWQgb24gZmlyc3QgdXNlIG1iZWRUTFMsIHNldHVwIHRocmVhZGluZyBpZiBzdXBwb3J0ZWQgKi8KLWludCAgQ3VybF9tYmVkdGxzX2luaXQodm9pZCk7Ci12b2lkIEN1cmxfbWJlZHRsc19jbGVhbnVwKHZvaWQpOwotaW50IEN1cmxfbWJlZHRsc19kYXRhX3BlbmRpbmcoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLQotQ1VSTGNvZGUgQ3VybF9tYmVkdGxzX2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLQotQ1VSTGNvZGUgQ3VybF9tYmVkdGxzX2Nvbm5lY3Rfbm9uYmxvY2tpbmcoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqZG9uZSk7Ci0KLS8qIHRlbGwgbWJlZFRMUyB0byBjbG9zZSBkb3duIGFsbCBvcGVuIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb25uZWN0aW9ucyAoYW5kCi0gICB0aHVzIHNlc3Npb24gSUQgY2FjaGluZyBldGMpICovCi12b2lkIEN1cmxfbWJlZHRsc19jbG9zZV9hbGwoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSk7Ci0KLSAvKiBjbG9zZSBhIFNTTCBjb25uZWN0aW9uICovCi12b2lkIEN1cmxfbWJlZHRsc19jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOwotCi12b2lkIEN1cmxfbWJlZHRsc19zZXNzaW9uX2ZyZWUodm9pZCAqcHRyKTsKLXNpemVfdCBDdXJsX21iZWR0bHNfdmVyc2lvbihjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKTsKLWludCBDdXJsX21iZWR0bHNfc2h1dGRvd24oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLQotQ1VSTGNvZGUgQ3VybF9tYmVkdGxzX3JhbmRvbShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLCB1bnNpZ25lZCBjaGFyICplbnRyb3B5LAotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCk7Ci0KLS8qIHRoaXMgYmFja2VuZHMgc3VwcG9ydHMgQ1VSTE9QVF9QSU5ORURQVUJMSUNLRVkgKi8KLSNkZWZpbmUgaGF2ZV9jdXJsc3NsX3Bpbm5lZHB1YmtleSAxCi0KLS8qIHRoaXMgYmFja2VuZCBzdXBwb3J0cyBDVVJMT1BUX1NTTF9DVFhfKiAqLwotI2RlZmluZSBoYXZlX2N1cmxzc2xfc3NsX2N0eCAxCi0KLS8qIEFQSSBzZXR1cCBmb3IgbWJlZFRMUyAqLwotI2RlZmluZSBjdXJsc3NsX2luaXQoKSBDdXJsX21iZWR0bHNfaW5pdCgpCi0jZGVmaW5lIGN1cmxzc2xfY2xlYW51cCgpIEN1cmxfbWJlZHRsc19jbGVhbnVwKCkKLSNkZWZpbmUgY3VybHNzbF9jb25uZWN0IEN1cmxfbWJlZHRsc19jb25uZWN0Ci0jZGVmaW5lIGN1cmxzc2xfY29ubmVjdF9ub25ibG9ja2luZyBDdXJsX21iZWR0bHNfY29ubmVjdF9ub25ibG9ja2luZwotI2RlZmluZSBjdXJsc3NsX3Nlc3Npb25fZnJlZSh4KSAgQ3VybF9tYmVkdGxzX3Nlc3Npb25fZnJlZSh4KQotI2RlZmluZSBjdXJsc3NsX2Nsb3NlX2FsbCBDdXJsX21iZWR0bHNfY2xvc2VfYWxsCi0jZGVmaW5lIGN1cmxzc2xfY2xvc2UgQ3VybF9tYmVkdGxzX2Nsb3NlCi0jZGVmaW5lIGN1cmxzc2xfc2h1dGRvd24oeCx5KSAwCi0jZGVmaW5lIGN1cmxzc2xfc2V0X2VuZ2luZSh4LHkpICh4PXgsIHk9eSwgQ1VSTEVfTk9UX0JVSUxUX0lOKQotI2RlZmluZSBjdXJsc3NsX3NldF9lbmdpbmVfZGVmYXVsdCh4KSAoeD14LCBDVVJMRV9OT1RfQlVJTFRfSU4pCi0jZGVmaW5lIGN1cmxzc2xfZW5naW5lc19saXN0KHgpICh4PXgsIChzdHJ1Y3QgY3VybF9zbGlzdCAqKU5VTEwpCi0jZGVmaW5lIGN1cmxzc2xfdmVyc2lvbiBDdXJsX21iZWR0bHNfdmVyc2lvbgotI2RlZmluZSBjdXJsc3NsX2NoZWNrX2N4bih4KSAoeD14LCAtMSkKLSNkZWZpbmUgY3VybHNzbF9kYXRhX3BlbmRpbmcoeCx5KSBDdXJsX21iZWR0bHNfZGF0YV9wZW5kaW5nKHgsIHkpCi0jZGVmaW5lIENVUkxfU1NMX0JBQ0tFTkQgQ1VSTFNTTEJBQ0tFTkRfTUJFRFRMUwotI2RlZmluZSBjdXJsc3NsX3NoYTI1NnN1bShhLGIsYyxkKSBtYmVkdGxzX3NoYTI1NihhLGIsYywwKQotI2RlZmluZSBjdXJsc3NsX3JhbmRvbSh4LHkseikgQ3VybF9tYmVkdGxzX3JhbmRvbSh4LCB5LCB6KQorZXh0ZXJuIGNvbnN0IHN0cnVjdCBDdXJsX3NzbCBDdXJsX3NzbF9tYmVkdGxzOwogCiAjZW5kaWYgLyogVVNFX01CRURUTFMgKi8KICNlbmRpZiAvKiBIRUFERVJfQ1VSTF9NQkVEVExTX0ggKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvbnNzLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL25zcy5jCmluZGV4IGNkMDEzODkuLmMwYjdlNjMgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvbnNzLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9uc3MuYwpAQCAtNzgsNiArNzgsMTYgQEAKIC8qIGVub3VnaCB0byBmaXQgdGhlIHN0cmluZyAiUEVNIFRva2VuICNbMHwxXSIgKi8KICNkZWZpbmUgU0xPVFNJWkUgMTMKIAorc3RydWN0IHNzbF9iYWNrZW5kX2RhdGEgeworICBQUkZpbGVEZXNjICpoYW5kbGU7CisgIGNoYXIgKmNsaWVudF9uaWNrbmFtZTsKKyAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YTsKKyAgc3RydWN0IGN1cmxfbGxpc3Qgb2JqX2xpc3Q7CisgIFBLMTFHZW5lcmljT2JqZWN0ICpvYmpfY2xpY2VydDsKK307CisKKyNkZWZpbmUgQkFDS0VORCBjb25uc3NsLT5iYWNrZW5kCisKIHN0YXRpYyBQUkxvY2sgKm5zc19pbml0bG9jayA9IE5VTEw7CiBzdGF0aWMgUFJMb2NrICpuc3NfY3JsbG9jayA9IE5VTEw7CiBzdGF0aWMgUFJMb2NrICpuc3NfZmluZHNsb3RfbG9jayA9IE5VTEw7CkBAIC0yNzEsNyArMjgxLDcgQEAKIAogICAgIGZvdW5kID0gUFJfRkFMU0U7CiAKLSAgICBmb3IoaT0wOyBpPE5VTV9PRl9DSVBIRVJTOyBpKyspIHsKKyAgICBmb3IoaSA9IDA7IGk8TlVNX09GX0NJUEhFUlM7IGkrKykgewogICAgICAgaWYoc3RyY2FzZWNvbXBhcmUoY2lwaGVyLCBjaXBoZXJsaXN0W2ldLm5hbWUpKSB7CiAgICAgICAgIGNpcGhlcl9zdGF0ZVtpXSA9IFBSX1RSVUU7CiAgICAgICAgIGZvdW5kID0gUFJfVFJVRTsKQEAgLTI5MCw3ICszMDAsNyBAQAogICB9CiAKICAgLyogRmluYWxseSBhY3R1YWxseSBlbmFibGUgdGhlIHNlbGVjdGVkIGNpcGhlcnMgKi8KLSAgZm9yKGk9MDsgaTxOVU1fT0ZfQ0lQSEVSUzsgaSsrKSB7CisgIGZvcihpID0gMDsgaTxOVU1fT0ZfQ0lQSEVSUzsgaSsrKSB7CiAgICAgaWYoIWNpcGhlcl9zdGF0ZVtpXSkKICAgICAgIGNvbnRpbnVlOwogCkBAIC0zMTEsNyArMzIxLDcgQEAKIHsKICAgdW5zaWduZWQgaW50IGk7CiAKLSAgZm9yKGk9MDsgaTxOVU1fT0ZfQ0lQSEVSUzsgaSsrKSB7CisgIGZvcihpID0gMDsgaTxOVU1fT0ZfQ0lQSEVSUzsgaSsrKSB7CiAgICAgUFJJbnQzMiBwb2xpY3kgPSAwOwogICAgIFNTTF9DaXBoZXJQb2xpY3lHZXQoY2lwaGVybGlzdFtpXS5udW0sICZwb2xpY3kpOwogICAgIGlmKHBvbGljeSkKQEAgLTM5Niw3ICs0MDYsNyBAQAogLyogQ2FsbCBQSzExX0NyZWF0ZUdlbmVyaWNPYmplY3QoKSB3aXRoIHRoZSBnaXZlbiBvYmpfY2xhc3MgYW5kIGZpbGVuYW1lLiAgSWYKICAqIHRoZSBjYWxsIHN1Y2NlZWRzLCBhcHBlbmQgdGhlIG9iamVjdCBoYW5kbGUgdG8gdGhlIGxpc3Qgb2Ygb2JqZWN0cyBzbyB0aGF0CiAgKiB0aGUgb2JqZWN0IGNhbiBiZSBkZXN0cm95ZWQgaW4gQ3VybF9uc3NfY2xvc2UoKS4gKi8KLXN0YXRpYyBDVVJMY29kZSBuc3NfY3JlYXRlX29iamVjdChzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqc3NsLAorc3RhdGljIENVUkxjb2RlIG5zc19jcmVhdGVfb2JqZWN0KHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENLX09CSkVDVF9DTEFTUyBvYmpfY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIGJvb2wgY2FjZXJ0KQogewpAQCAtNDM1LDE0ICs0NDUsMTQgQEAKICAgaWYoIW9iaikKICAgICByZXR1cm4gcmVzdWx0OwogCi0gIGlmKGluc2VydF93cmFwcGVkX3B0cigmc3NsLT5vYmpfbGlzdCwgb2JqKSAhPSBDVVJMRV9PSykgeworICBpZihpbnNlcnRfd3JhcHBlZF9wdHIoJkJBQ0tFTkQtPm9ial9saXN0LCBvYmopICE9IENVUkxFX09LKSB7CiAgICAgUEsxMV9EZXN0cm95R2VuZXJpY09iamVjdChvYmopOwogICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogICB9CiAKICAgaWYoIWNhY2VydCAmJiBDS09fQ0VSVElGSUNBVEUgPT0gb2JqX2NsYXNzKQogICAgIC8qIHN0b3JlIHJlZmVyZW5jZSB0byBhIGNsaWVudCBjZXJ0aWZpY2F0ZSAqLwotICAgIHNzbC0+b2JqX2NsaWNlcnQgPSBvYmo7CisgICAgQkFDS0VORC0+b2JqX2NsaWNlcnQgPSBvYmo7CiAKICAgcmV0dXJuIENVUkxFX09LOwogfQpAQCAtOTkyLDcgKzEwMDIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICppc3N1ZXJfbmlja25hbWUpCiB7CiAgIENFUlRDZXJ0aWZpY2F0ZSAqY2VydCwgKmNlcnRfaXNzdWVyLCAqaXNzdWVyOwotICBTRUNTdGF0dXMgcmVzPVNFQ1N1Y2Nlc3M7CisgIFNFQ1N0YXR1cyByZXMgPSBTRUNTdWNjZXNzOwogICB2b2lkICpwcm90b193aW4gPSBOVUxMOwogCiAgIGNlcnQgPSBTU0xfUGVlckNlcnRpZmljYXRlKHNvY2spOwpAQCAtMTAwNCw3ICsxMDE0LDcgQEAKICAgaWYoKCFjZXJ0X2lzc3VlcikgfHwgKCFpc3N1ZXIpKQogICAgIHJlcyA9IFNFQ0ZhaWx1cmU7CiAgIGVsc2UgaWYoU0VDSVRFTV9Db21wYXJlSXRlbSgmY2VydF9pc3N1ZXItPmRlckNlcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNzdWVyLT5kZXJDZXJ0KSE9U0VDRXF1YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNzdWVyLT5kZXJDZXJ0KSAhPSBTRUNFcXVhbCkKICAgICByZXMgPSBTRUNGYWlsdXJlOwogCiAgIENFUlRfRGVzdHJveUNlcnRpZmljYXRlKGNlcnQpOwpAQCAtMTAxNyw3ICsxMDI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGlubmVkcHVia2V5KQogewogICBDVVJMY29kZSByZXN1bHQgPSBDVVJMRV9TU0xfUElOTkVEUFVCS0VZTk9UTUFUQ0g7Ci0gIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uc3NsLT5kYXRhOworICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gQkFDS0VORC0+ZGF0YTsKICAgQ0VSVENlcnRpZmljYXRlICpjZXJ0OwogCiAgIGlmKCFwaW5uZWRwdWJrZXkpCkBAIC0xMDI1LDcgKzEwMzUsNyBAQAogICAgIHJldHVybiBDVVJMRV9PSzsKIAogICAvKiBnZXQgcGVlciBjZXJ0aWZpY2F0ZSAqLwotICBjZXJ0ID0gU1NMX1BlZXJDZXJ0aWZpY2F0ZShjb25uc3NsLT5oYW5kbGUpOworICBjZXJ0ID0gU1NMX1BlZXJDZXJ0aWZpY2F0ZShCQUNLRU5ELT5oYW5kbGUpOwogICBpZihjZXJ0KSB7CiAgICAgLyogZXh0cmFjdCBwdWJsaWMga2V5IGZyb20gcGVlciBjZXJ0aWZpY2F0ZSAqLwogICAgIFNFQ0tFWVB1YmxpY0tleSAqcHVia2V5ID0gQ0VSVF9FeHRyYWN0UHVibGljS2V5KGNlcnQpOwpAQCAtMTA2OSwxMSArMTA3OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBTRUNLRVlQcml2YXRlS2V5U3RyICoqcFJldEtleSkKIHsKICAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAoc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKilhcmc7Ci0gIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgPSBjb25uc3NsLT5kYXRhOwotICBjb25zdCBjaGFyICpuaWNrbmFtZSA9IGNvbm5zc2wtPmNsaWVudF9uaWNrbmFtZTsKKyAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IEJBQ0tFTkQtPmRhdGE7CisgIGNvbnN0IGNoYXIgKm5pY2tuYW1lID0gQkFDS0VORC0+Y2xpZW50X25pY2tuYW1lOwogICBzdGF0aWMgY29uc3QgY2hhciBwZW1fc2xvdG5hbWVbXSA9ICJQRU0gVG9rZW4gIzEiOwogCi0gIGlmKGNvbm5zc2wtPm9ial9jbGljZXJ0KSB7CisgIGlmKEJBQ0tFTkQtPm9ial9jbGljZXJ0KSB7CiAgICAgLyogdXNlIHRoZSBjZXJ0L2tleSBwcm92aWRlZCBieSBQRU0gcmVhZGVyICovCiAgICAgU0VDSXRlbSBjZXJ0X2RlciA9IHsgMCwgTlVMTCwgMCB9OwogICAgIHZvaWQgKnByb3RvX3dpbiA9IFNTTF9SZXZlYWxQaW5Bcmcoc29jayk7CkBAIC0xMDg2LDcgKzEwOTYsNyBAQAogICAgICAgcmV0dXJuIFNFQ0ZhaWx1cmU7CiAgICAgfQogCi0gICAgaWYoUEsxMV9SZWFkUmF3QXR0cmlidXRlKFBLMTFfVHlwZUdlbmVyaWMsIGNvbm5zc2wtPm9ial9jbGljZXJ0LCBDS0FfVkFMVUUsCisgICAgaWYoUEsxMV9SZWFkUmF3QXR0cmlidXRlKFBLMTFfVHlwZUdlbmVyaWMsIEJBQ0tFTkQtPm9ial9jbGljZXJ0LCBDS0FfVkFMVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjZXJ0X2RlcikgIT0gU0VDU3VjY2VzcykgewogICAgICAgZmFpbGYoZGF0YSwgIk5TUzogQ0tBX1ZBTFVFIG5vdCBmb3VuZCBpbiBQSzExIGdlbmVyaWMgb2JqZWN0Iik7CiAgICAgICBQSzExX0ZyZWVTbG90KHNsb3QpOwpAQCAtMTM1MSw3ICsxMzYxLDcgQEAKICAqIEByZXR2YWwgMCBlcnJvciBpbml0aWFsaXppbmcgU1NMCiAgKiBAcmV0dmFsIDEgU1NMIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseQogICovCi1pbnQgQ3VybF9uc3NfaW5pdCh2b2lkKQorc3RhdGljIGludCBDdXJsX25zc19pbml0KHZvaWQpCiB7CiAgIC8qIGN1cmxfZ2xvYmFsX2luaXQoKSBpcyBub3QgdGhyZWFkLXNhZmUgc28gdGhpcyB0ZXN0IGlzIG9rICovCiAgIGlmKG5zc19pbml0bG9jayA9PSBOVUxMKSB7CkBAIC0xMzg2LDcgKzEzOTYsNyBAQAogfQogCiAvKiBHbG9iYWwgY2xlYW51cCAqLwotdm9pZCBDdXJsX25zc19jbGVhbnVwKHZvaWQpCitzdGF0aWMgdm9pZCBDdXJsX25zc19jbGVhbnVwKHZvaWQpCiB7CiAgIC8qIFRoaXMgZnVuY3Rpb24gaXNuJ3QgcmVxdWlyZWQgdG8gYmUgdGhyZWFkc2FmZSBhbmQgdGhpcyBpcyBvbmx5IGRvbmUKICAgICogYXMgYSBzYWZldHkgZmVhdHVyZS4KQEAgLTE0MjYsMTQgKzE0MzYsMTQgQEAKICAqICAgICAwIG1lYW5zIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZAogICogICAgLTEgbWVhbnMgdGhlIGNvbm5lY3Rpb24gc3RhdHVzIGlzIHVua25vd24KICAqLwotaW50Ci1DdXJsX25zc19jaGVja19jeG4oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKQorc3RhdGljIGludCBDdXJsX25zc19jaGVja19jeG4oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKQogeworICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbRklSU1RTT0NLRVRdOwogICBpbnQgcmM7CiAgIGNoYXIgYnVmOwogCiAgIHJjID0KLSAgICBQUl9SZWN2KGNvbm4tPnNzbFtGSVJTVFNPQ0tFVF0uaGFuZGxlLCAodm9pZCAqKSZidWYsIDEsIFBSX01TR19QRUVLLAorICAgIFBSX1JlY3YoQkFDS0VORC0+aGFuZGxlLCAodm9pZCAqKSZidWYsIDEsIFBSX01TR19QRUVLLAogICAgICAgICAgICAgUFJfU2Vjb25kc1RvSW50ZXJ2YWwoMSkpOwogICBpZihyYyA+IDApCiAgICAgcmV0dXJuIDE7IC8qIGNvbm5lY3Rpb24gc3RpbGwgaW4gcGxhY2UgKi8KQEAgLTE0NDcsNDggKzE0NTcsNDkgQEAKIHN0YXRpYyB2b2lkIG5zc19jbG9zZShzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCkKIHsKICAgLyogYmVmb3JlIHRoZSBjbGVhbnVwLCBjaGVjayB3aGV0aGVyIHdlIGFyZSB1c2luZyBhIGNsaWVudCBjZXJ0aWZpY2F0ZSAqLwotICBjb25zdCBib29sIGNsaWVudF9jZXJ0ID0gKGNvbm5zc2wtPmNsaWVudF9uaWNrbmFtZSAhPSBOVUxMKQotICAgIHx8IChjb25uc3NsLT5vYmpfY2xpY2VydCAhPSBOVUxMKTsKKyAgY29uc3QgYm9vbCBjbGllbnRfY2VydCA9IChCQUNLRU5ELT5jbGllbnRfbmlja25hbWUgIT0gTlVMTCkKKyAgICB8fCAoQkFDS0VORC0+b2JqX2NsaWNlcnQgIT0gTlVMTCk7CiAKLSAgZnJlZShjb25uc3NsLT5jbGllbnRfbmlja25hbWUpOwotICBjb25uc3NsLT5jbGllbnRfbmlja25hbWUgPSBOVUxMOworICBmcmVlKEJBQ0tFTkQtPmNsaWVudF9uaWNrbmFtZSk7CisgIEJBQ0tFTkQtPmNsaWVudF9uaWNrbmFtZSA9IE5VTEw7CiAKICAgLyogZGVzdHJveSBhbGwgTlNTIG9iamVjdHMgaW4gb3JkZXIgdG8gYXZvaWQgZmFpbHVyZSBvZiBOU1Mgc2h1dGRvd24gKi8KLSAgQ3VybF9sbGlzdF9kZXN0cm95KCZjb25uc3NsLT5vYmpfbGlzdCwgTlVMTCk7Ci0gIGNvbm5zc2wtPm9ial9jbGljZXJ0ID0gTlVMTDsKKyAgQ3VybF9sbGlzdF9kZXN0cm95KCZCQUNLRU5ELT5vYmpfbGlzdCwgTlVMTCk7CisgIEJBQ0tFTkQtPm9ial9jbGljZXJ0ID0gTlVMTDsKIAotICBpZihjb25uc3NsLT5oYW5kbGUpIHsKKyAgaWYoQkFDS0VORC0+aGFuZGxlKSB7CiAgICAgaWYoY2xpZW50X2NlcnQpCiAgICAgICAvKiBBIHNlcnZlciBtaWdodCByZXF1aXJlIGRpZmZlcmVudCBhdXRoZW50aWNhdGlvbiBiYXNlZCBvbiB0aGUKICAgICAgICAqIHBhcnRpY3VsYXIgcGF0aCBiZWluZyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gIFRvIHN1cHBvcnQgdGhpcwogICAgICAgICogc2NlbmFyaW8sIHdlIG11c3QgZW5zdXJlIHRoYXQgYSBjb25uZWN0aW9uIHdpbGwgbmV2ZXIgcmV1c2UgdGhlCiAgICAgICAgKiBhdXRoZW50aWNhdGlvbiBkYXRhIGZyb20gYSBwcmV2aW91cyBjb25uZWN0aW9uLiAqLwotICAgICAgU1NMX0ludmFsaWRhdGVTZXNzaW9uKGNvbm5zc2wtPmhhbmRsZSk7CisgICAgICBTU0xfSW52YWxpZGF0ZVNlc3Npb24oQkFDS0VORC0+aGFuZGxlKTsKIAotICAgIFBSX0Nsb3NlKGNvbm5zc2wtPmhhbmRsZSk7Ci0gICAgY29ubnNzbC0+aGFuZGxlID0gTlVMTDsKKyAgICBQUl9DbG9zZShCQUNLRU5ELT5oYW5kbGUpOworICAgIEJBQ0tFTkQtPmhhbmRsZSA9IE5VTEw7CiAgIH0KIH0KIAogLyoKICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYW4gU1NMIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgogICovCi12b2lkIEN1cmxfbnNzX2Nsb3NlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKK3N0YXRpYyB2b2lkIEN1cmxfbnNzX2Nsb3NlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKICAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CiAgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsX3Byb3h5ID0gJmNvbm4tPnByb3h5X3NzbFtzb2NraW5kZXhdOwogCi0gIGlmKGNvbm5zc2wtPmhhbmRsZSB8fCBjb25uc3NsX3Byb3h5LT5oYW5kbGUpIHsKKyAgaWYoQkFDS0VORC0+aGFuZGxlIHx8IGNvbm5zc2xfcHJveHktPmJhY2tlbmQtPmhhbmRsZSkgewogICAgIC8qIE5TUyBjbG9zZXMgdGhlIHNvY2tldCB3ZSBwcmV2aW91c2x5IGhhbmRlZCB0byBpdCwgc28gd2UgbXVzdCBtYXJrIGl0CiAgICAgICAgYXMgY2xvc2VkIHRvIGF2b2lkIGRvdWJsZSBjbG9zZSAqLwogICAgIGZha2Vfc2Nsb3NlKGNvbm4tPnNvY2tbc29ja2luZGV4XSk7CiAgICAgY29ubi0+c29ja1tzb2NraW5kZXhdID0gQ1VSTF9TT0NLRVRfQkFEOwogICB9CiAKLSAgaWYoY29ubnNzbC0+aGFuZGxlKQotICAgIC8qIG5zc19jbG9zZShjb25uc3NsKSB3aWxsIHRyYW5zaXRpdmVseSBjbG9zZSBhbHNvIGNvbm5zc2xfcHJveHktPmhhbmRsZQotICAgICAgIGlmIGJvdGggYXJlIHVzZWQuIENsZWFyIGl0IHRvIGF2b2lkIGEgZG91YmxlIGNsb3NlIGxlYWRpbmcgdG8gY3Jhc2guICovCi0gICAgY29ubnNzbF9wcm94eS0+aGFuZGxlID0gTlVMTDsKKyAgaWYoQkFDS0VORC0+aGFuZGxlKQorICAgIC8qIG5zc19jbG9zZShjb25uc3NsKSB3aWxsIHRyYW5zaXRpdmVseSBjbG9zZSBhbHNvCisgICAgICAgY29ubnNzbF9wcm94eS0+YmFja2VuZC0+aGFuZGxlIGlmIGJvdGggYXJlIHVzZWQuIENsZWFyIGl0IHRvIGF2b2lkCisgICAgICAgYSBkb3VibGUgY2xvc2UgbGVhZGluZyB0byBjcmFzaC4gKi8KKyAgICBjb25uc3NsX3Byb3h5LT5iYWNrZW5kLT5oYW5kbGUgPSBOVUxMOwogCiAgIG5zc19jbG9zZShjb25uc3NsKTsKICAgbnNzX2Nsb3NlKGNvbm5zc2xfcHJveHkpOwpAQCAtMTczMiw3ICsxNzQzLDcgQEAKICAgfQogCiAgIC8qIGNsZWFudXAgb24gY29ubmVjdGlvbiBmYWlsdXJlICovCi0gIEN1cmxfbGxpc3RfZGVzdHJveSgmY29ubnNzbC0+b2JqX2xpc3QsIE5VTEwpOworICBDdXJsX2xsaXN0X2Rlc3Ryb3koJkJBQ0tFTkQtPm9ial9saXN0LCBOVUxMKTsKIAogICByZXR1cm4gY3VybGVycjsKIH0KQEAgLTE3NDYsNyArMTc1Nyw3IEBACiAgIHNvY2tfb3B0Lm9wdGlvbiA9IFBSX1NvY2tPcHRfTm9uYmxvY2tpbmc7CiAgIHNvY2tfb3B0LnZhbHVlLm5vbl9ibG9ja2luZyA9ICFibG9ja2luZzsKIAotICBpZihQUl9TZXRTb2NrZXRPcHRpb24oY29ubnNzbC0+aGFuZGxlLCAmc29ja19vcHQpICE9IFBSX1NVQ0NFU1MpCisgIGlmKFBSX1NldFNvY2tldE9wdGlvbihCQUNLRU5ELT5oYW5kbGUsICZzb2NrX29wdCkgIT0gUFJfU1VDQ0VTUykKICAgICByZXR1cm4gbnNzX2ZhaWxfY29ubmVjdChjb25uc3NsLCBkYXRhLCBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUik7CiAKICAgcmV0dXJuIENVUkxFX09LOwpAQCAtMTc3MCwxMCArMTc4MSwxMCBAQAogICAgIFNTTF9MSUJSQVJZX1ZFUlNJT05fVExTXzFfMCAgIC8qIG1heCAqLwogICB9OwogCi0gIGNvbm5zc2wtPmRhdGEgPSBkYXRhOworICBCQUNLRU5ELT5kYXRhID0gZGF0YTsKIAogICAvKiBsaXN0IG9mIGFsbCBOU1Mgb2JqZWN0cyB3ZSBuZWVkIHRvIGRlc3Ryb3kgaW4gQ3VybF9uc3NfY2xvc2UoKSAqLwotICBDdXJsX2xsaXN0X2luaXQoJmNvbm5zc2wtPm9ial9saXN0LCBuc3NfZGVzdHJveV9vYmplY3QpOworICBDdXJsX2xsaXN0X2luaXQoJkJBQ0tFTkQtPm9ial9saXN0LCBuc3NfZGVzdHJveV9vYmplY3QpOwogCiAgIC8qIEZJWE1FLiBOU1MgZG9lc24ndCBzdXBwb3J0IG11bHRpcGxlIGRhdGFiYXNlcyBvcGVuIGF0IHRoZSBzYW1lIHRpbWUuICovCiAgIFBSX0xvY2sobnNzX2luaXRsb2NrKTsKQEAgLTE4ODIsNyArMTg5Myw3IEBACiAgICAgY2hhciAqbmlja25hbWUgPSBkdXBfbmlja25hbWUoZGF0YSwgU1NMX1NFVF9PUFRJT04oY2VydCkpOwogICAgIGlmKG5pY2tuYW1lKSB7CiAgICAgICAvKiB3ZSBhcmUgbm90IGdvaW5nIHRvIHVzZSBsaWJuc3NwZW0uc28gdG8gcmVhZCB0aGUgY2xpZW50IGNlcnQgKi8KLSAgICAgIGNvbm5zc2wtPm9ial9jbGljZXJ0ID0gTlVMTDsKKyAgICAgIEJBQ0tFTkQtPm9ial9jbGljZXJ0ID0gTlVMTDsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICBDVVJMY29kZSBydiA9IGNlcnRfc3R1ZmYoY29ubiwgc29ja2luZGV4LCBTU0xfU0VUX09QVElPTihjZXJ0KSwKQEAgLTE4OTUsMTAgKzE5MDYsMTAgQEAKICAgICB9CiAKICAgICAvKiBzdG9yZSB0aGUgbmlja25hbWUgZm9yIFNlbGVjdENsaWVudENlcnQoKSBjYWxsZWQgZHVyaW5nIGhhbmRzaGFrZSAqLwotICAgIGNvbm5zc2wtPmNsaWVudF9uaWNrbmFtZSA9IG5pY2tuYW1lOworICAgIEJBQ0tFTkQtPmNsaWVudF9uaWNrbmFtZSA9IG5pY2tuYW1lOwogICB9CiAgIGVsc2UKLSAgICBjb25uc3NsLT5jbGllbnRfbmlja25hbWUgPSBOVUxMOworICAgIEJBQ0tFTkQtPmNsaWVudF9uaWNrbmFtZSA9IE5VTEw7CiAKICAgaWYoU1NMX0dldENsaWVudEF1dGhEYXRhSG9vayhtb2RlbCwgU2VsZWN0Q2xpZW50Q2VydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNvbm5zc2wpICE9IFNFQ1N1Y2Nlc3MpIHsKQEAgLTE5MDgsOCArMTkxOSw4IEBACiAKICAgaWYoY29ubi0+cHJveHlfc3NsW3NvY2tpbmRleF0udXNlKSB7CiAgICAgREVCVUdBU1NFUlQoc3NsX2Nvbm5lY3Rpb25fY29tcGxldGUgPT0gY29ubi0+cHJveHlfc3NsW3NvY2tpbmRleF0uc3RhdGUpOwotICAgIERFQlVHQVNTRVJUKGNvbm4tPnByb3h5X3NzbFtzb2NraW5kZXhdLmhhbmRsZSAhPSBOVUxMKTsKLSAgICBuc3ByX2lvID0gY29ubi0+cHJveHlfc3NsW3NvY2tpbmRleF0uaGFuZGxlOworICAgIERFQlVHQVNTRVJUKGNvbm4tPnByb3h5X3NzbFtzb2NraW5kZXhdLmJhY2tlbmQtPmhhbmRsZSAhPSBOVUxMKTsKKyAgICBuc3ByX2lvID0gY29ubi0+cHJveHlfc3NsW3NvY2tpbmRleF0uYmFja2VuZC0+aGFuZGxlOwogICAgIHNlY29uZF9sYXllciA9IFRSVUU7CiAgIH0KICAgZWxzZSB7CkBAIC0xOTM5LDggKzE5NTAsOCBAQAogICB9CiAKICAgLyogaW1wb3J0IG91ciBtb2RlbCBzb2NrZXQgb250byB0aGUgY3VycmVudCBJL08gc3RhY2sgKi8KLSAgY29ubnNzbC0+aGFuZGxlID0gU1NMX0ltcG9ydEZEKG1vZGVsLCBuc3ByX2lvKTsKLSAgaWYoIWNvbm5zc2wtPmhhbmRsZSkgeworICBCQUNLRU5ELT5oYW5kbGUgPSBTU0xfSW1wb3J0RkQobW9kZWwsIG5zcHJfaW8pOworICBpZighQkFDS0VORC0+aGFuZGxlKSB7CiAgICAgaWYoIXNlY29uZF9sYXllcikKICAgICAgIFBSX0Nsb3NlKG5zcHJfaW8pOwogICAgIGdvdG8gZXJyb3I7CkBAIC0xOTUxLDM2ICsxOTYyLDM2IEBACiAKICAgLyogVGhpcyBpcyB0aGUgcGFzc3dvcmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjZXJ0IHRoYXQgd2UncmUgdXNpbmcgKi8KICAgaWYoU1NMX1NFVF9PUFRJT04oa2V5X3Bhc3N3ZCkpIHsKLSAgICBTU0xfU2V0UEtDUzExUGluQXJnKGNvbm5zc2wtPmhhbmRsZSwgU1NMX1NFVF9PUFRJT04oa2V5X3Bhc3N3ZCkpOworICAgIFNTTF9TZXRQS0NTMTFQaW5BcmcoQkFDS0VORC0+aGFuZGxlLCBTU0xfU0VUX09QVElPTihrZXlfcGFzc3dkKSk7CiAgIH0KIAogI2lmZGVmIFNTTF9FTkFCTEVfT0NTUF9TVEFQTElORwogICBpZihTU0xfQ09OTl9DT05GSUcodmVyaWZ5c3RhdHVzKSkgewotICAgIGlmKFNTTF9PcHRpb25TZXQoY29ubnNzbC0+aGFuZGxlLCBTU0xfRU5BQkxFX09DU1BfU1RBUExJTkcsIFBSX1RSVUUpCisgICAgaWYoU1NMX09wdGlvblNldChCQUNLRU5ELT5oYW5kbGUsIFNTTF9FTkFCTEVfT0NTUF9TVEFQTElORywgUFJfVFJVRSkKICAgICAgICAgIT0gU0VDU3VjY2VzcykKICAgICAgIGdvdG8gZXJyb3I7CiAgIH0KICNlbmRpZgogCiAjaWZkZWYgU1NMX0VOQUJMRV9OUE4KLSAgaWYoU1NMX09wdGlvblNldChjb25uc3NsLT5oYW5kbGUsIFNTTF9FTkFCTEVfTlBOLCBjb25uLT5iaXRzLnRsc19lbmFibGVfbnBuCisgIGlmKFNTTF9PcHRpb25TZXQoQkFDS0VORC0+aGFuZGxlLCBTU0xfRU5BQkxFX05QTiwgY29ubi0+Yml0cy50bHNfZW5hYmxlX25wbgogICAgICAgICAgICAgICAgICAgID8gUFJfVFJVRSA6IFBSX0ZBTFNFKSAhPSBTRUNTdWNjZXNzKQogICAgIGdvdG8gZXJyb3I7CiAjZW5kaWYKIAogI2lmZGVmIFNTTF9FTkFCTEVfQUxQTgotICBpZihTU0xfT3B0aW9uU2V0KGNvbm5zc2wtPmhhbmRsZSwgU1NMX0VOQUJMRV9BTFBOLCBjb25uLT5iaXRzLnRsc19lbmFibGVfYWxwbgorICBpZihTU0xfT3B0aW9uU2V0KEJBQ0tFTkQtPmhhbmRsZSwgU1NMX0VOQUJMRV9BTFBOLCBjb25uLT5iaXRzLnRsc19lbmFibGVfYWxwbgogICAgICAgICAgICAgICAgICAgID8gUFJfVFJVRSA6IFBSX0ZBTFNFKSAhPSBTRUNTdWNjZXNzKQogICAgIGdvdG8gZXJyb3I7CiAjZW5kaWYKIAogI2lmIE5TU1ZFUk5VTSA+PSAweDAzMGYwNCAvKiAzLjE1LjQgKi8KICAgaWYoZGF0YS0+c2V0LnNzbC5mYWxzZXN0YXJ0KSB7Ci0gICAgaWYoU1NMX09wdGlvblNldChjb25uc3NsLT5oYW5kbGUsIFNTTF9FTkFCTEVfRkFMU0VfU1RBUlQsIFBSX1RSVUUpCisgICAgaWYoU1NMX09wdGlvblNldChCQUNLRU5ELT5oYW5kbGUsIFNTTF9FTkFCTEVfRkFMU0VfU1RBUlQsIFBSX1RSVUUpCiAgICAgICAgICE9IFNFQ1N1Y2Nlc3MpCiAgICAgICBnb3RvIGVycm9yOwogCi0gICAgaWYoU1NMX1NldENhbkZhbHNlU3RhcnRDYWxsYmFjayhjb25uc3NsLT5oYW5kbGUsIENhbkZhbHNlU3RhcnRDYWxsYmFjaywKKyAgICBpZihTU0xfU2V0Q2FuRmFsc2VTdGFydENhbGxiYWNrKEJBQ0tFTkQtPmhhbmRsZSwgQ2FuRmFsc2VTdGFydENhbGxiYWNrLAogICAgICAgICBjb25uKSAhPSBTRUNTdWNjZXNzKQogICAgICAgZ290byBlcnJvcjsKICAgfQpAQCAtMTk5Miw3ICsyMDAzLDggQEAKICAgICB1bnNpZ25lZCBjaGFyIHByb3RvY29sc1sxMjhdOwogCiAjaWZkZWYgVVNFX05HSFRUUDIKLSAgICBpZihkYXRhLT5zZXQuaHR0cHZlcnNpb24gPj0gQ1VSTF9IVFRQX1ZFUlNJT05fMikgeworICAgIGlmKGRhdGEtPnNldC5odHRwdmVyc2lvbiA+PSBDVVJMX0hUVFBfVkVSU0lPTl8yICYmCisgICAgICAgKCFTU0xfSVNfUFJPWFkoKSB8fCAhY29ubi0+Yml0cy50dW5uZWxfcHJveHkpKSB7CiAgICAgICBwcm90b2NvbHNbY3VyKytdID0gTkdIVFRQMl9QUk9UT19WRVJTSU9OX0lEX0xFTjsKICAgICAgIG1lbWNweSgmcHJvdG9jb2xzW2N1cl0sIE5HSFRUUDJfUFJPVE9fVkVSU0lPTl9JRCwKICAgICAgICAgICBOR0hUVFAyX1BST1RPX1ZFUlNJT05fSURfTEVOKTsKQEAgLTIwMDMsMjQgKzIwMTUsMjQgQEAKICAgICBtZW1jcHkoJnByb3RvY29sc1tjdXJdLCBBTFBOX0hUVFBfMV8xLCBBTFBOX0hUVFBfMV8xX0xFTkdUSCk7CiAgICAgY3VyICs9IEFMUE5fSFRUUF8xXzFfTEVOR1RIOwogCi0gICAgaWYoU1NMX1NldE5leHRQcm90b05lZ28oY29ubnNzbC0+aGFuZGxlLCBwcm90b2NvbHMsIGN1cikgIT0gU0VDU3VjY2VzcykKKyAgICBpZihTU0xfU2V0TmV4dFByb3RvTmVnbyhCQUNLRU5ELT5oYW5kbGUsIHByb3RvY29scywgY3VyKSAhPSBTRUNTdWNjZXNzKQogICAgICAgZ290byBlcnJvcjsKICAgfQogI2VuZGlmCiAKIAogICAvKiBGb3JjZSBoYW5kc2hha2Ugb24gbmV4dCBJL08gKi8KLSAgaWYoU1NMX1Jlc2V0SGFuZHNoYWtlKGNvbm5zc2wtPmhhbmRsZSwgLyogYXNTZXJ2ZXIgKi8gUFJfRkFMU0UpCisgIGlmKFNTTF9SZXNldEhhbmRzaGFrZShCQUNLRU5ELT5oYW5kbGUsIC8qIGFzU2VydmVyICovIFBSX0ZBTFNFKQogICAgICAgIT0gU0VDU3VjY2VzcykKICAgICBnb3RvIGVycm9yOwogCiAgIC8qIHByb3BhZ2F0ZSBob3N0bmFtZSB0byB0aGUgVExTIGxheWVyICovCi0gIGlmKFNTTF9TZXRVUkwoY29ubnNzbC0+aGFuZGxlLCBTU0xfSVNfUFJPWFkoKSA/IGNvbm4tPmh0dHBfcHJveHkuaG9zdC5uYW1lIDoKKyAgaWYoU1NMX1NldFVSTChCQUNLRU5ELT5oYW5kbGUsIFNTTF9JU19QUk9YWSgpID8gY29ubi0+aHR0cF9wcm94eS5ob3N0Lm5hbWUgOgogICAgICAgICAgICAgICAgIGNvbm4tPmhvc3QubmFtZSkgIT0gU0VDU3VjY2VzcykKICAgICBnb3RvIGVycm9yOwogCiAgIC8qIHByZXZlbnQgTlNTIGZyb20gcmUtdXNpbmcgdGhlIHNlc3Npb24gZm9yIGEgZGlmZmVyZW50IGhvc3RuYW1lICovCi0gIGlmKFNTTF9TZXRTb2NrUGVlcklEKGNvbm5zc2wtPmhhbmRsZSwgU1NMX0lTX1BST1hZKCkgPworICBpZihTU0xfU2V0U29ja1BlZXJJRChCQUNLRU5ELT5oYW5kbGUsIFNTTF9JU19QUk9YWSgpID8KICAgICAgICAgICAgICAgICAgICAgICAgY29ubi0+aHR0cF9wcm94eS5ob3N0Lm5hbWUgOiBjb25uLT5ob3N0Lm5hbWUpCiAgICAgICE9IFNFQ1N1Y2Nlc3MpCiAgICAgZ290byBlcnJvcjsKQEAgLTIwNTcsNyArMjA2OSw3IEBACiAKICAgLyogRm9yY2UgdGhlIGhhbmRzaGFrZSBub3cgKi8KICAgdGltZW91dCA9IFBSX01pbGxpc2Vjb25kc1RvSW50ZXJ2YWwoKFBSVWludDMyKSB0aW1lX2xlZnQpOwotICBpZihTU0xfRm9yY2VIYW5kc2hha2VXaXRoVGltZW91dChjb25uc3NsLT5oYW5kbGUsIHRpbWVvdXQpICE9IFNFQ1N1Y2Nlc3MpIHsKKyAgaWYoU1NMX0ZvcmNlSGFuZHNoYWtlV2l0aFRpbWVvdXQoQkFDS0VORC0+aGFuZGxlLCB0aW1lb3V0KSAhPSBTRUNTdWNjZXNzKSB7CiAgICAgaWYoUFJfR2V0RXJyb3IoKSA9PSBQUl9XT1VMRF9CTE9DS19FUlJPUikKICAgICAgIC8qIGJsb2NraW5nIGRpcmVjdGlvbiBpcyB1cGRhdGVkIGJ5IG5zc191cGRhdGVfY29ubmVjdGluZ19zdGF0ZSgpICovCiAgICAgICByZXR1cm4gQ1VSTEVfQUdBSU47CkBAIC0yMDY4LDcgKzIwODAsNyBAQAogICAgIGdvdG8gZXJyb3I7CiAgIH0KIAotICByZXN1bHQgPSBkaXNwbGF5X2Nvbm5faW5mbyhjb25uLCBjb25uc3NsLT5oYW5kbGUpOworICByZXN1bHQgPSBkaXNwbGF5X2Nvbm5faW5mbyhjb25uLCBCQUNLRU5ELT5oYW5kbGUpOwogICBpZihyZXN1bHQpCiAgICAgZ290byBlcnJvcjsKIApAQCAtMjA3Nyw3ICsyMDg5LDcgQEAKICAgICBjaGFyICpuaWNrbmFtZSA9IGR1cF9uaWNrbmFtZShkYXRhLCBTU0xfU0VUX09QVElPTihpc3N1ZXJjZXJ0KSk7CiAgICAgaWYobmlja25hbWUpIHsKICAgICAgIC8qIHdlIHN1cHBvcnQgb25seSBuaWNrbmFtZXMgaW4gY2FzZSBvZiBpc3N1ZXJjZXJ0IGZvciBub3cgKi8KLSAgICAgIHJldCA9IGNoZWNrX2lzc3Vlcl9jZXJ0KGNvbm5zc2wtPmhhbmRsZSwgbmlja25hbWUpOworICAgICAgcmV0ID0gY2hlY2tfaXNzdWVyX2NlcnQoQkFDS0VORC0+aGFuZGxlLCBuaWNrbmFtZSk7CiAgICAgICBmcmVlKG5pY2tuYW1lKTsKICAgICB9CiAKQEAgLTIxNjMsMTMgKzIxNzUsMTMgQEAKICAgcmV0dXJuIENVUkxFX09LOwogfQogCi1DVVJMY29kZSBDdXJsX25zc19jb25uZWN0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKK3N0YXRpYyBDVVJMY29kZSBDdXJsX25zc19jb25uZWN0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKICAgcmV0dXJuIG5zc19jb25uZWN0X2NvbW1vbihjb25uLCBzb2NraW5kZXgsIC8qIGJsb2NraW5nICovIE5VTEwpOwogfQogCi1DVVJMY29kZSBDdXJsX25zc19jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCwgYm9vbCAqZG9uZSkKK3N0YXRpYyBDVVJMY29kZSBDdXJsX25zc19jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsIGJvb2wgKmRvbmUpCiB7CiAgIHJldHVybiBuc3NfY29ubmVjdF9jb21tb24oY29ubiwgc29ja2luZGV4LCBkb25lKTsKIH0KQEAgLTIxODAsOCArMjE5MiwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiwgICAgICAgICAgICAgICAgLyogYW1vdW50IHRvIHdyaXRlICovCiAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMY29kZSAqY3VybGNvZGUpCiB7Ci0gIHNzaXplX3QgcmMgPSBQUl9TZW5kKGNvbm4tPnNzbFtzb2NraW5kZXhdLmhhbmRsZSwgbWVtLCAoaW50KWxlbiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgUFJfSU5URVJWQUxfTk9fV0FJVCk7CisgIHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOworICBzc2l6ZV90IHJjOworCisgIC8qIFRoZSBTZWxlY3RDbGllbnRDZXJ0KCkgaG9vayB1c2VzIHRoaXMgZm9yIGluZm9mKCkgYW5kIGZhaWxmKCkgYnV0IHRoZQorICAgICBoYW5kbGUgc3RvcmVkIGluIG5zc19zZXR1cF9jb25uZWN0KCkgY291bGQgaGF2ZSBhbHJlYWR5IGJlZW4gZnJlZWQuICovCisgIEJBQ0tFTkQtPmRhdGEgPSBjb25uLT5kYXRhOworCisgIHJjID0gUFJfU2VuZChCQUNLRU5ELT5oYW5kbGUsIG1lbSwgKGludClsZW4sIDAsIFBSX0lOVEVSVkFMX05PX1dBSVQpOwogICBpZihyYyA8IDApIHsKICAgICBQUkludDMyIGVyciA9IFBSX0dldEVycm9yKCk7CiAgICAgaWYoZXJyID09IFBSX1dPVUxEX0JMT0NLX0VSUk9SKQpAQCAtMjIwNSwxNCArMjIyMywyMSBAQAogICByZXR1cm4gcmM7IC8qIG51bWJlciBvZiBieXRlcyAqLwogfQogCi1zdGF0aWMgc3NpemVfdCBuc3NfcmVjdihzdHJ1Y3QgY29ubmVjdGRhdGEgKiBjb25uLCAvKiBjb25uZWN0aW9uIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW0sICAgICAgICAgICAgICAgICAgIC8qIHNvY2tldGluZGV4ICovCitzdGF0aWMgc3NpemVfdCBuc3NfcmVjdihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sICAvKiBjb25uZWN0aW9uIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsICAgICAgICAgICAgIC8qIHNvY2tldGluZGV4ICovCiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpidWYsICAgICAgICAgICAgICAgICAvKiBzdG9yZSByZWFkIGRhdGEgaGVyZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlcnNpemUsICAgICAgICAgLyogbWF4IGFtb3VudCB0byByZWFkICovCiAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMY29kZSAqY3VybGNvZGUpCiB7Ci0gIHNzaXplX3QgbnJlYWQgPSBQUl9SZWN2KGNvbm4tPnNzbFtudW1dLmhhbmRsZSwgYnVmLCAoaW50KWJ1ZmZlcnNpemUsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBSX0lOVEVSVkFMX05PX1dBSVQpOworICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbc29ja2luZGV4XTsKKyAgc3NpemVfdCBucmVhZDsKKworICAvKiBUaGUgU2VsZWN0Q2xpZW50Q2VydCgpIGhvb2sgdXNlcyB0aGlzIGZvciBpbmZvZigpIGFuZCBmYWlsZigpIGJ1dCB0aGUKKyAgICAgaGFuZGxlIHN0b3JlZCBpbiBuc3Nfc2V0dXBfY29ubmVjdCgpIGNvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGZyZWVkLiAqLworICBCQUNLRU5ELT5kYXRhID0gY29ubi0+ZGF0YTsKKworICBucmVhZCA9IFBSX1JlY3YoQkFDS0VORC0+aGFuZGxlLCBidWYsIChpbnQpYnVmZmVyc2l6ZSwgMCwKKyAgICAgICAgICAgICAgICAgIFBSX0lOVEVSVkFMX05PX1dBSVQpOwogICBpZihucmVhZCA8IDApIHsKICAgICAvKiBmYWlsZWQgU1NMIHJlYWQgKi8KICAgICBQUkludDMyIGVyciA9IFBSX0dldEVycm9yKCk7CkBAIC0yMjM4LDIyICsyMjYzLDIyIEBACiAgIHJldHVybiBucmVhZDsKIH0KIAotc2l6ZV90IEN1cmxfbnNzX3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyBzaXplX3QgQ3VybF9uc3NfdmVyc2lvbihjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQogewogICByZXR1cm4gc25wcmludGYoYnVmZmVyLCBzaXplLCAiTlNTLyVzIiwgTlNTX1ZFUlNJT04pOwogfQogCiAvKiBkYXRhIG1pZ2h0IGJlIE5VTEwgKi8KLWludCBDdXJsX25zc19zZWVkKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCitzdGF0aWMgaW50IEN1cmxfbnNzX3NlZWQoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSkKIHsKICAgLyogbWFrZSBzdXJlIHRoYXQgTlNTIGlzIGluaXRpYWxpemVkICovCiAgIHJldHVybiAhIUN1cmxfbnNzX2ZvcmNlX2luaXQoZGF0YSk7CiB9CiAKIC8qIGRhdGEgbWlnaHQgYmUgTlVMTCAqLwotQ1VSTGNvZGUgQ3VybF9uc3NfcmFuZG9tKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW50cm9weSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKQorc3RhdGljIENVUkxjb2RlIEN1cmxfbnNzX3JhbmRvbShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplbnRyb3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKQogewogICBDdXJsX25zc19zZWVkKGRhdGEpOyAgLyogSW5pdGlhdGUgdGhlIHNlZWQgaWYgbm90IGFscmVhZHkgZG9uZSAqLwogCkBAIC0yMjY0LDEwICsyMjg5LDEwIEBACiAgIHJldHVybiBDVVJMRV9PSzsKIH0KIAotdm9pZCBDdXJsX25zc19tZDVzdW0odW5zaWduZWQgY2hhciAqdG1wLCAvKiBpbnB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRtcGxlbiwKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm1kNXN1bSwgLyogb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWQ1bGVuKQorc3RhdGljIENVUkxjb2RlIEN1cmxfbnNzX21kNXN1bSh1bnNpZ25lZCBjaGFyICp0bXAsIC8qIGlucHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0bXBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm1kNXN1bSwgLyogb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtZDVsZW4pCiB7CiAgIFBLMTFDb250ZXh0ICpNRDVwdyA9IFBLMTFfQ3JlYXRlRGlnZXN0Q29udGV4dChTRUNfT0lEX01ENSk7CiAgIHVuc2lnbmVkIGludCBNRDVvdXQ7CkBAIC0yMjc1LDEyICsyMzAwLDE0IEBACiAgIFBLMTFfRGlnZXN0T3AoTUQ1cHcsIHRtcCwgY3VybHhfdXp0b3VpKHRtcGxlbikpOwogICBQSzExX0RpZ2VzdEZpbmFsKE1ENXB3LCBtZDVzdW0sICZNRDVvdXQsIGN1cmx4X3V6dG91aShtZDVsZW4pKTsKICAgUEsxMV9EZXN0cm95Q29udGV4dChNRDVwdywgUFJfVFJVRSk7CisKKyAgcmV0dXJuIENVUkxFX09LOwogfQogCi12b2lkIEN1cmxfbnNzX3NoYTI1NnN1bShjb25zdCB1bnNpZ25lZCBjaGFyICp0bXAsIC8qIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICBzaXplX3QgdG1wbGVuLAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqc2hhMjU2c3VtLCAvKiBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaGEyNTZsZW4pCitzdGF0aWMgdm9pZCBDdXJsX25zc19zaGEyNTZzdW0oY29uc3QgdW5zaWduZWQgY2hhciAqdG1wLCAvKiBpbnB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0bXBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqc2hhMjU2c3VtLCAvKiBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2hhMjU2bGVuKQogewogICBQSzExQ29udGV4dCAqU0hBMjU2cHcgPSBQSzExX0NyZWF0ZURpZ2VzdENvbnRleHQoU0VDX09JRF9TSEEyNTYpOwogICB1bnNpZ25lZCBpbnQgU0hBMjU2b3V0OwpAQCAtMjI5MCw3ICsyMzE3LDcgQEAKICAgUEsxMV9EZXN0cm95Q29udGV4dChTSEEyNTZwdywgUFJfVFJVRSk7CiB9CiAKLWJvb2wgQ3VybF9uc3NfY2VydF9zdGF0dXNfcmVxdWVzdCh2b2lkKQorc3RhdGljIGJvb2wgQ3VybF9uc3NfY2VydF9zdGF0dXNfcmVxdWVzdCh2b2lkKQogewogI2lmZGVmIFNTTF9FTkFCTEVfT0NTUF9TVEFQTElORwogICByZXR1cm4gVFJVRTsKQEAgLTIyOTksNyArMjMyNiw3IEBACiAjZW5kaWYKIH0KIAotYm9vbCBDdXJsX25zc19mYWxzZV9zdGFydCh2b2lkKQorc3RhdGljIGJvb2wgQ3VybF9uc3NfZmFsc2Vfc3RhcnQodm9pZCkKIHsKICNpZiBOU1NWRVJOVU0gPj0gMHgwMzBmMDQgLyogMy4xNS40ICovCiAgIHJldHVybiBUUlVFOwpAQCAtMjMwOCw0ICsyMzM1LDQ2IEBACiAjZW5kaWYKIH0KIAorc3RhdGljIHZvaWQgKkN1cmxfbnNzX2dldF9pbnRlcm5hbHMoc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMSU5GTyBpbmZvIFVOVVNFRF9QQVJBTSkKK3sKKyAgKHZvaWQpaW5mbzsKKyAgcmV0dXJuIEJBQ0tFTkQtPmhhbmRsZTsKK30KKworY29uc3Qgc3RydWN0IEN1cmxfc3NsIEN1cmxfc3NsX25zcyA9IHsKKyAgeyBDVVJMU1NMQkFDS0VORF9OU1MsICJuc3MiIH0sIC8qIGluZm8gKi8KKworICAxLCAvKiBoYXZlX2NhX3BhdGggKi8KKyAgMSwgLyogaGF2ZV9jZXJ0aW5mbyAqLworICAxLCAvKiBoYXZlX3Bpbm5lZHB1YmtleSAqLworICAwLCAvKiBoYXZlX3NzbF9jdHggKi8KKyAgMSwgLyogc3VwcG9ydF9odHRwc19wcm94eSAqLworCisgIHNpemVvZihzdHJ1Y3Qgc3NsX2JhY2tlbmRfZGF0YSksCisKKyAgQ3VybF9uc3NfaW5pdCwgICAgICAgICAgICAgICAgLyogaW5pdCAqLworICBDdXJsX25zc19jbGVhbnVwLCAgICAgICAgICAgICAvKiBjbGVhbnVwICovCisgIEN1cmxfbnNzX3ZlcnNpb24sICAgICAgICAgICAgIC8qIHZlcnNpb24gKi8KKyAgQ3VybF9uc3NfY2hlY2tfY3huLCAgICAgICAgICAgLyogY2hlY2tfY3huICovCisgIC8qIE5TUyBoYXMgbm8gc2h1dGRvd24gZnVuY3Rpb24gcHJvdmlkZWQgYW5kIHRodXMgYWx3YXlzIGZhaWwgKi8KKyAgQ3VybF9ub25lX3NodXRkb3duLCAgICAgICAgICAgLyogc2h1dGRvd24gKi8KKyAgQ3VybF9ub25lX2RhdGFfcGVuZGluZywgICAgICAgLyogZGF0YV9wZW5kaW5nICovCisgIEN1cmxfbnNzX3JhbmRvbSwgICAgICAgICAgICAgIC8qIHJhbmRvbSAqLworICBDdXJsX25zc19jZXJ0X3N0YXR1c19yZXF1ZXN0LCAvKiBjZXJ0X3N0YXR1c19yZXF1ZXN0ICovCisgIEN1cmxfbnNzX2Nvbm5lY3QsICAgICAgICAgICAgIC8qIGNvbm5lY3QgKi8KKyAgQ3VybF9uc3NfY29ubmVjdF9ub25ibG9ja2luZywgLyogY29ubmVjdF9ub25ibG9ja2luZyAqLworICBDdXJsX25zc19nZXRfaW50ZXJuYWxzLCAgICAgICAvKiBnZXRfaW50ZXJuYWxzICovCisgIEN1cmxfbnNzX2Nsb3NlLCAgICAgICAgICAgICAgIC8qIGNsb3NlICovCisgIEN1cmxfbm9uZV9jbG9zZV9hbGwsICAgICAgICAgIC8qIGNsb3NlX2FsbCAqLworICAvKiBOU1MgaGFzIGl0cyBvd24gc2Vzc2lvbiBJRCBjYWNoZSAqLworICBDdXJsX25vbmVfc2Vzc2lvbl9mcmVlLCAgICAgICAvKiBzZXNzaW9uX2ZyZWUgKi8KKyAgQ3VybF9ub25lX3NldF9lbmdpbmUsICAgICAgICAgLyogc2V0X2VuZ2luZSAqLworICBDdXJsX25vbmVfc2V0X2VuZ2luZV9kZWZhdWx0LCAvKiBzZXRfZW5naW5lX2RlZmF1bHQgKi8KKyAgQ3VybF9ub25lX2VuZ2luZXNfbGlzdCwgICAgICAgLyogZW5naW5lc19saXN0ICovCisgIEN1cmxfbnNzX2ZhbHNlX3N0YXJ0LCAgICAgICAgIC8qIGZhbHNlX3N0YXJ0ICovCisgIEN1cmxfbnNzX21kNXN1bSwgICAgICAgICAgICAgIC8qIG1kNXN1bSAqLworICBDdXJsX25zc19zaGEyNTZzdW0gICAgICAgICAgICAvKiBzaGEyNTZzdW0gKi8KK307CisKICNlbmRpZiAvKiBVU0VfTlNTICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL25zc2cuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvbnNzZy5oCmluZGV4IDhjNDY5MjkuLjQxZTUxYjAgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvbnNzZy5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvbnNzZy5oCkBAIC0zMCw3OSArMzAsMTAgQEAKIAogI2luY2x1ZGUgInVybGRhdGEuaCIKIAotQ1VSTGNvZGUgQ3VybF9uc3NfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOwotQ1VSTGNvZGUgQ3VybF9uc3NfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmRvbmUpOwotLyogY2xvc2UgYSBTU0wgY29ubmVjdGlvbiAqLwotdm9pZCBDdXJsX25zc19jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOwotCi1pbnQgQ3VybF9uc3NfaW5pdCh2b2lkKTsKLXZvaWQgQ3VybF9uc3NfY2xlYW51cCh2b2lkKTsKLQotc2l6ZV90IEN1cmxfbnNzX3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci1pbnQgQ3VybF9uc3NfY2hlY2tfY3huKHN0cnVjdCBjb25uZWN0ZGF0YSAqY3huKTsKLWludCBDdXJsX25zc19zZWVkKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpOwotCiAvKiBpbml0aWFsaXplIE5TUyBsaWJyYXJ5IGlmIG5vdCBhbHJlYWR5ICovCiBDVVJMY29kZSBDdXJsX25zc19mb3JjZV9pbml0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpOwogCi1DVVJMY29kZSBDdXJsX25zc19yYW5kb20oc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplbnRyb3B5LAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpOwotCi12b2lkIEN1cmxfbnNzX21kNXN1bSh1bnNpZ25lZCBjaGFyICp0bXAsIC8qIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICBzaXplX3QgdG1wbGVuLAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbWQ1c3VtLCAvKiBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtZDVsZW4pOwotCi12b2lkIEN1cmxfbnNzX3NoYTI1NnN1bShjb25zdCB1bnNpZ25lZCBjaGFyICp0bXAsIC8qIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICBzaXplX3QgdG1wbGVuLAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqc2hhMjU2c3VtLCAvKiBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaGEyNTZsZW4pOwotCi1ib29sIEN1cmxfbnNzX2NlcnRfc3RhdHVzX3JlcXVlc3Qodm9pZCk7Ci0KLWJvb2wgQ3VybF9uc3NfZmFsc2Vfc3RhcnQodm9pZCk7Ci0KLS8qIFN1cHBvcnQgSFRUUFMtcHJveHkgKi8KLSNkZWZpbmUgSFRUUFNfUFJPWFlfU1VQUE9SVCAxCi0KLS8qIFNldCB0aGUgQVBJIGJhY2tlbmQgZGVmaW5pdGlvbiB0byBOU1MgKi8KLSNkZWZpbmUgQ1VSTF9TU0xfQkFDS0VORCBDVVJMU1NMQkFDS0VORF9OU1MKLQotLyogdGhpcyBiYWNrZW5kIHN1cHBvcnRzIHRoZSBDQVBBVEggb3B0aW9uICovCi0jZGVmaW5lIGhhdmVfY3VybHNzbF9jYV9wYXRoIDEKLQotLyogdGhpcyBiYWNrZW5kIHN1cHBvcnRzIENVUkxPUFRfQ0VSVElORk8gKi8KLSNkZWZpbmUgaGF2ZV9jdXJsc3NsX2NlcnRpbmZvIDEKLQotLyogdGhpcyBiYWNrZW5kcyBzdXBwb3J0cyBDVVJMT1BUX1BJTk5FRFBVQkxJQ0tFWSAqLwotI2RlZmluZSBoYXZlX2N1cmxzc2xfcGlubmVkcHVia2V5IDEKLQotLyogQVBJIHNldHVwIGZvciBOU1MgKi8KLSNkZWZpbmUgY3VybHNzbF9pbml0IEN1cmxfbnNzX2luaXQKLSNkZWZpbmUgY3VybHNzbF9jbGVhbnVwIEN1cmxfbnNzX2NsZWFudXAKLSNkZWZpbmUgY3VybHNzbF9jb25uZWN0IEN1cmxfbnNzX2Nvbm5lY3QKLSNkZWZpbmUgY3VybHNzbF9jb25uZWN0X25vbmJsb2NraW5nIEN1cmxfbnNzX2Nvbm5lY3Rfbm9uYmxvY2tpbmcKLQotLyogTlNTIGhhcyBpdHMgb3duIHNlc3Npb24gSUQgY2FjaGUgKi8KLSNkZWZpbmUgY3VybHNzbF9zZXNzaW9uX2ZyZWUoeCkgQ3VybF9ub3Bfc3RtdAotI2RlZmluZSBjdXJsc3NsX2Nsb3NlX2FsbCh4KSAoKHZvaWQpeCkKLSNkZWZpbmUgY3VybHNzbF9jbG9zZSBDdXJsX25zc19jbG9zZQotLyogTlNTIGhhcyBubyBzaHV0ZG93biBmdW5jdGlvbiBwcm92aWRlZCBhbmQgdGh1cyBhbHdheXMgZmFpbCAqLwotI2RlZmluZSBjdXJsc3NsX3NodXRkb3duKHgseSkgKCh2b2lkKXgsICh2b2lkKXksIDEpCi0jZGVmaW5lIGN1cmxzc2xfc2V0X2VuZ2luZSh4LHkpICgodm9pZCl4LCAodm9pZCl5LCBDVVJMRV9OT1RfQlVJTFRfSU4pCi0jZGVmaW5lIGN1cmxzc2xfc2V0X2VuZ2luZV9kZWZhdWx0KHgpICgodm9pZCl4LCBDVVJMRV9OT1RfQlVJTFRfSU4pCi0jZGVmaW5lIGN1cmxzc2xfZW5naW5lc19saXN0KHgpICgodm9pZCl4LCAoc3RydWN0IGN1cmxfc2xpc3QgKilOVUxMKQotI2RlZmluZSBjdXJsc3NsX3ZlcnNpb24gQ3VybF9uc3NfdmVyc2lvbgotI2RlZmluZSBjdXJsc3NsX2NoZWNrX2N4bih4KSBDdXJsX25zc19jaGVja19jeG4oeCkKLSNkZWZpbmUgY3VybHNzbF9kYXRhX3BlbmRpbmcoeCx5KSAoKHZvaWQpeCwgKHZvaWQpeSwgMCkKLSNkZWZpbmUgY3VybHNzbF9yYW5kb20oeCx5LHopIEN1cmxfbnNzX3JhbmRvbSh4LHkseikKLSNkZWZpbmUgY3VybHNzbF9tZDVzdW0oYSxiLGMsZCkgQ3VybF9uc3NfbWQ1c3VtKGEsYixjLGQpCi0jZGVmaW5lIGN1cmxzc2xfc2hhMjU2c3VtKGEsYixjLGQpIEN1cmxfbnNzX3NoYTI1NnN1bShhLGIsYyxkKQotI2RlZmluZSBjdXJsc3NsX2NlcnRfc3RhdHVzX3JlcXVlc3QoKSBDdXJsX25zc19jZXJ0X3N0YXR1c19yZXF1ZXN0KCkKLSNkZWZpbmUgY3VybHNzbF9mYWxzZV9zdGFydCgpIEN1cmxfbnNzX2ZhbHNlX3N0YXJ0KCkKK2V4dGVybiBjb25zdCBzdHJ1Y3QgQ3VybF9zc2wgQ3VybF9zc2xfbnNzOwogCiAjZW5kaWYgLyogVVNFX05TUyAqLwogI2VuZGlmIC8qIEhFQURFUl9DVVJMX05TU0dfSCAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9vcGVuc3NsLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL29wZW5zc2wuYwppbmRleCBkYmVlMzY5Li40MjUzMTYwIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL29wZW5zc2wuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL29wZW5zc2wuYwpAQCAtNTEsOCArNTEsMTAgQEAKICNpbmNsdWRlICJzdHJjYXNlLmgiCiAjaW5jbHVkZSAiaG9zdGNoZWNrLmgiCiAjaW5jbHVkZSAiY3VybF9wcmludGYuaCIKLQogI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaWZkZWYgSEFWRV9PUEVOU1NMX0VOR0lORV9ICisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNlbmRpZgogI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgogI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CiAjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCkBAIC02NCw2ICs2Niw4IEBACiAjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgogI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgogCiAjaWZkZWYgSEFWRV9PUEVOU1NMX1BLQ1MxMl9ICiAjaW5jbHVkZSA8b3BlbnNzbC9wa2NzMTIuaD4KQEAgLTExMSw3ICsxMTUsNiBAQAogI2RlZmluZSBIQVZFX09QQVFVRV9FVlBfUEtFWSAxIC8qIHNpbmNlIDEuMS4wIC1wcmUzICovCiAjZGVmaW5lIEhBVkVfT1BBUVVFX1JTQV9EU0FfREggMSAvKiBzaW5jZSAxLjEuMCAtcHJlNSAqLwogI2RlZmluZSBDT05TVF9FWFRTIGNvbnN0Ci0jZGVmaW5lIENPTlNUX0FTTjFfQklUX1NUUklORyBjb25zdAogI2RlZmluZSBIQVZFX0VSUl9SRU1PVkVfVEhSRUFEX1NUQVRFX0RFUFJFQ0FURUQgMQogI2Vsc2UKIC8qIEZvciBPcGVuU1NMIGJlZm9yZSAxLjEuMCAqLwpAQCAtMTE5LDcgKzEyMiw2IEBACiAjZGVmaW5lIFg1MDlfZ2V0MF9ub3RCZWZvcmUoeCkgWDUwOV9nZXRfbm90QmVmb3JlKHgpCiAjZGVmaW5lIFg1MDlfZ2V0MF9ub3RBZnRlcih4KSBYNTA5X2dldF9ub3RBZnRlcih4KQogI2RlZmluZSBDT05TVF9FWFRTIC8qIG5vcGUgKi8KLSNkZWZpbmUgQ09OU1RfQVNOMV9CSVRfU1RSSU5HIC8qIG5vcGUgKi8KICNpZmRlZiBMSUJSRVNTTF9WRVJTSU9OX05VTUJFUgogc3RhdGljIHVuc2lnbmVkIGxvbmcgT3BlblNTTF92ZXJzaW9uX251bSh2b2lkKQogewpAQCAtMTQ2LDYgKzE0OCwyMCBAQAogI2RlZmluZSBPUEVOU1NMX2xvYWRfYnVpbHRpbl9tb2R1bGVzKHgpCiAjZW5kaWYKIAorLyoKKyAqIFdoZXRoZXIgU1NMX0NUWF9zZXRfa2V5bG9nX2NhbGxiYWNrIGlzIGF2YWlsYWJsZS4KKyAqIE9wZW5TU0w6IHN1cHBvcnRlZCBzaW5jZSAxLjEuMSBodHRwczovL2dpdGh1Yi5jb20vb3BlbnNzbC9vcGVuc3NsL3B1bGwvMjI4NworICogQm9yaW5nU1NMOiBzdXBwb3J0ZWQgc2luY2UgZDI4ZjU5YzI3YmFjIChjb21taXR0ZWQgMjAxNS0xMS0xOSksIHRoZQorICogICAgICAgICAgICBCT1JJTkdTU0xfMjAxNTEyIG1hY3JvIGZyb20gMjAxNi0wMS0yMSBzaG91bGQgYmUgY2xvc2UgZW5vdWdoLgorICogTGlicmVTU0w6IHVuc3VwcG9ydGVkIGluIGF0IGxlYXN0IDIuNS4xIChleHBsaWNpdGx5IGNoZWNrIGZvciBpdCBzaW5jZSBpdAorICogICAgICAgICAgIGxpZXMgYW5kIHByZXRlbmRzIHRvIGJlIE9wZW5TU0wgMi4wLjApLgorICovCisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgxMDEwMTAwMEwgJiYgXAorICAgICAhZGVmaW5lZChMSUJSRVNTTF9WRVJTSU9OX05VTUJFUikpIHx8IFwKKyAgICBkZWZpbmVkKEJPUklOR1NTTF8yMDE1MTIpCisjZGVmaW5lIEhBVkVfS0VZTE9HX0NBTExCQUNLCisjZW5kaWYKKwogI2lmIGRlZmluZWQoTElCUkVTU0xfVkVSU0lPTl9OVU1CRVIpCiAjZGVmaW5lIE9TU0xfUEFDS0FHRSAiTGlicmVTU0wiCiAjZWxpZiBkZWZpbmVkKE9QRU5TU0xfSVNfQk9SSU5HU1NMKQpAQCAtMTU0LDYgKzE3MCwzOCBAQAogI2RlZmluZSBPU1NMX1BBQ0tBR0UgIk9wZW5TU0wiCiAjZW5kaWYKIAorI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MTAxMDAwMDBMKQorLyogdXAyZGF0ZSB2ZXJzaW9ucyBvZiBPcGVuU1NMIG1haW50YWluIHRoZSBkZWZhdWx0IHJlYXNvbmFibHkgc2VjdXJlIHdpdGhvdXQKKyAqIGJyZWFraW5nIGNvbXBhdGliaWxpdHksIHNvIGl0IGlzIGJldHRlciBub3QgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYnkgY3VybAorICovCisjZGVmaW5lIERFRkFVTFRfQ0lQSEVSX1NFTEVDVElPTiBOVUxMCisjZWxzZQorLyogLi4uIGJ1dCBpdCBpcyBub3QgdGhlIGNhc2Ugd2l0aCBvbGQgdmVyc2lvbnMgb2YgT3BlblNTTCAqLworI2RlZmluZSBERUZBVUxUX0NJUEhFUl9TRUxFQ1RJT04gXAorICAiQUxMOiFFWFBPUlQ6IUVYUE9SVDQwOiFFWFBPUlQ1NjohYU5VTEw6IUxPVzohUkM0OkBTVFJFTkdUSCIKKyNlbmRpZgorCisjaWZkZWYgRU5BQkxFX1NTTEtFWUxPR0ZJTEUKK3R5cGVkZWYgc3RydWN0IHNzbF90YXBfc3RhdGUgeworICBpbnQgbWFzdGVyX2tleV9sZW5ndGg7CisgIHVuc2lnbmVkIGNoYXIgbWFzdGVyX2tleVtTU0xfTUFYX01BU1RFUl9LRVlfTEVOR1RIXTsKKyAgdW5zaWduZWQgY2hhciBjbGllbnRfcmFuZG9tW1NTTDNfUkFORE9NX1NJWkVdOworfSBzc2xfdGFwX3N0YXRlX3Q7CisjZW5kaWYgLyogRU5BQkxFX1NTTEtFWUxPR0ZJTEUgKi8KKworc3RydWN0IHNzbF9iYWNrZW5kX2RhdGEgeworICAvKiB0aGVzZSBvbmVzIHJlcXVpcmVzIHNwZWNpZmljIFNTTC10eXBlcyAqLworICBTU0xfQ1RYKiBjdHg7CisgIFNTTCogICAgIGhhbmRsZTsKKyAgWDUwOSogICAgc2VydmVyX2NlcnQ7CisjaWZkZWYgRU5BQkxFX1NTTEtFWUxPR0ZJTEUKKyAgLyogdGFwX3N0YXRlIGhvbGRzIHRoZSBsYXN0IHNlZW4gbWFzdGVyIGtleSBpZiB3ZSdyZSBsb2dnaW5nIHRoZW0gKi8KKyAgc3NsX3RhcF9zdGF0ZV90IHRhcF9zdGF0ZTsKKyNlbmRpZgorfTsKKworI2RlZmluZSBCQUNLRU5EIGNvbm5zc2wtPmJhY2tlbmQKKwogLyoKICAqIE51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIHJhbmRvbSBudW1iZXIgc2VlZCBmaWxlLiBUaGlzIG11c3QgYmUKICAqIGEgZmluaXRlIHZhbHVlIChiZWNhdXNlIHNvbWUgZW50cm9weSAiZmlsZXMiIGxpa2UgL2Rldi91cmFuZG9tIGhhdmUKQEAgLTE2Miw2ICsyMTAsMTEyIEBACiAgKi8KICNkZWZpbmUgUkFORF9MT0FEX0xFTkdUSCAxMDI0CiAKKyNpZmRlZiBFTkFCTEVfU1NMS0VZTE9HRklMRQorLyogVGhlIGZwIGZvciB0aGUgb3BlbiBTU0xLRVlMT0dGSUxFLCBvciBOVUxMIGlmIG5vdCBvcGVuICovCitzdGF0aWMgRklMRSAqa2V5bG9nX2ZpbGVfZnA7CisKKyNpZmRlZiBIQVZFX0tFWUxPR19DQUxMQkFDSworc3RhdGljIHZvaWQgb3NzbF9rZXlsb2dfY2FsbGJhY2soY29uc3QgU1NMICpzc2wsIGNvbnN0IGNoYXIgKmxpbmUpCit7CisgICh2b2lkKXNzbDsKKworICAvKiBVc2luZyBmcHV0cyBoZXJlIGluc3RlYWQgb2YgZnByaW50ZiBzaW5jZSBsaWJjdXJsJ3MgZnByaW50ZiByZXBsYWNlbWVudAorICAgICBtYXkgbm90IGJlIHRocmVhZC1zYWZlLiAqLworICBpZihrZXlsb2dfZmlsZV9mcCAmJiBsaW5lICYmICpsaW5lKSB7CisgICAgY2hhciBzdGFja2J1ZlsyNTZdOworICAgIGNoYXIgKmJ1ZjsKKyAgICBzaXplX3QgbGluZWxlbiA9IHN0cmxlbihsaW5lKTsKKworICAgIGlmKGxpbmVsZW4gPD0gc2l6ZW9mKHN0YWNrYnVmKSAtIDIpCisgICAgICBidWYgPSBzdGFja2J1ZjsKKyAgICBlbHNlIHsKKyAgICAgIGJ1ZiA9IG1hbGxvYyhsaW5lbGVuICsgMik7CisgICAgICBpZighYnVmKQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0cm5jcHkoYnVmLCBsaW5lLCBsaW5lbGVuKTsKKyAgICBidWZbbGluZWxlbl0gPSAnXG4nOworICAgIGJ1ZltsaW5lbGVuICsgMV0gPSAnXDAnOworCisgICAgZnB1dHMoYnVmLCBrZXlsb2dfZmlsZV9mcCk7CisgICAgaWYoYnVmICE9IHN0YWNrYnVmKQorICAgICAgZnJlZShidWYpOworICB9Cit9CisjZWxzZQorI2RlZmluZSBLRVlMT0dfUFJFRklYICAgICAgIkNMSUVOVF9SQU5ET00gIgorI2RlZmluZSBLRVlMT0dfUFJFRklYX0xFTiAgKHNpemVvZihLRVlMT0dfUFJFRklYKSAtIDEpCisvKgorICogdGFwX3NzbF9rZXkgaXMgY2FsbGVkIGJ5IGxpYmN1cmwgdG8gbWFrZSB0aGUgQ0xJRU5UX1JBTkRPTXMgaWYgdGhlIE9wZW5TU0wKKyAqIGJlaW5nIHVzZWQgZG9lc24ndCBoYXZlIG5hdGl2ZSBzdXBwb3J0IGZvciBkb2luZyB0aGF0LgorICovCitzdGF0aWMgdm9pZCB0YXBfc3NsX2tleShjb25zdCBTU0wgKnNzbCwgc3NsX3RhcF9zdGF0ZV90ICpzdGF0ZSkKK3sKKyAgY29uc3QgY2hhciAqaGV4ID0gIjAxMjM0NTY3ODlBQkNERUYiOworICBpbnQgcG9zLCBpOworICBjaGFyIGxpbmVbS0VZTE9HX1BSRUZJWF9MRU4gKyAyICogU1NMM19SQU5ET01fU0laRSArIDEgKworICAgICAgICAgICAgMiAqIFNTTF9NQVhfTUFTVEVSX0tFWV9MRU5HVEggKyAxICsgMV07CisgIGNvbnN0IFNTTF9TRVNTSU9OICpzZXNzaW9uID0gU1NMX2dldF9zZXNzaW9uKHNzbCk7CisgIHVuc2lnbmVkIGNoYXIgY2xpZW50X3JhbmRvbVtTU0wzX1JBTkRPTV9TSVpFXTsKKyAgdW5zaWduZWQgY2hhciBtYXN0ZXJfa2V5W1NTTF9NQVhfTUFTVEVSX0tFWV9MRU5HVEhdOworICBpbnQgbWFzdGVyX2tleV9sZW5ndGggPSAwOworCisgIGlmKCFzZXNzaW9uIHx8ICFrZXlsb2dfZmlsZV9mcCkKKyAgICByZXR1cm47CisKKyNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MTAxMDAwMDBMCisgIC8qIHNzbC0+czMgaXMgbm90IGNoZWNrZWQgaW4gb3BlbnNzbCAxLjEuMC1wcmU2LCBidXQgbGV0J3MgYXNzdW1lIHRoYXQKKyAgICogd2UgaGF2ZSBhIHZhbGlkIFNTTCBjb250ZXh0IGlmIHdlIGhhdmUgYSBub24tTlVMTCBzZXNzaW9uLiAqLworICBTU0xfZ2V0X2NsaWVudF9yYW5kb20oc3NsLCBjbGllbnRfcmFuZG9tLCBTU0wzX1JBTkRPTV9TSVpFKTsKKyAgbWFzdGVyX2tleV9sZW5ndGggPQorICAgIFNTTF9TRVNTSU9OX2dldF9tYXN0ZXJfa2V5KHNlc3Npb24sIG1hc3Rlcl9rZXksIFNTTF9NQVhfTUFTVEVSX0tFWV9MRU5HVEgpOworI2Vsc2UKKyAgaWYoc3NsLT5zMyAmJiBzZXNzaW9uLT5tYXN0ZXJfa2V5X2xlbmd0aCA+IDApIHsKKyAgICBtYXN0ZXJfa2V5X2xlbmd0aCA9IHNlc3Npb24tPm1hc3Rlcl9rZXlfbGVuZ3RoOworICAgIG1lbWNweShtYXN0ZXJfa2V5LCBzZXNzaW9uLT5tYXN0ZXJfa2V5LCBzZXNzaW9uLT5tYXN0ZXJfa2V5X2xlbmd0aCk7CisgICAgbWVtY3B5KGNsaWVudF9yYW5kb20sIHNzbC0+czMtPmNsaWVudF9yYW5kb20sIFNTTDNfUkFORE9NX1NJWkUpOworICB9CisjZW5kaWYKKworICBpZihtYXN0ZXJfa2V5X2xlbmd0aCA8PSAwKQorICAgIHJldHVybjsKKworICAvKiBTa2lwIHdyaXRpbmcga2V5cyBpZiB0aGVyZSBpcyBubyBrZXkgb3IgaXQgZGlkIG5vdCBjaGFuZ2UuICovCisgIGlmKHN0YXRlLT5tYXN0ZXJfa2V5X2xlbmd0aCA9PSBtYXN0ZXJfa2V5X2xlbmd0aCAmJgorICAgICAhbWVtY21wKHN0YXRlLT5tYXN0ZXJfa2V5LCBtYXN0ZXJfa2V5LCBtYXN0ZXJfa2V5X2xlbmd0aCkgJiYKKyAgICAgIW1lbWNtcChzdGF0ZS0+Y2xpZW50X3JhbmRvbSwgY2xpZW50X3JhbmRvbSwgU1NMM19SQU5ET01fU0laRSkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdGF0ZS0+bWFzdGVyX2tleV9sZW5ndGggPSBtYXN0ZXJfa2V5X2xlbmd0aDsKKyAgbWVtY3B5KHN0YXRlLT5tYXN0ZXJfa2V5LCBtYXN0ZXJfa2V5LCBtYXN0ZXJfa2V5X2xlbmd0aCk7CisgIG1lbWNweShzdGF0ZS0+Y2xpZW50X3JhbmRvbSwgY2xpZW50X3JhbmRvbSwgU1NMM19SQU5ET01fU0laRSk7CisKKyAgbWVtY3B5KGxpbmUsIEtFWUxPR19QUkVGSVgsIEtFWUxPR19QUkVGSVhfTEVOKTsKKyAgcG9zID0gS0VZTE9HX1BSRUZJWF9MRU47CisKKyAgLyogQ2xpZW50IFJhbmRvbSBmb3IgU1NMdjMvVExTICovCisgIGZvcihpID0gMDsgaSA8IFNTTDNfUkFORE9NX1NJWkU7IGkrKykgeworICAgIGxpbmVbcG9zKytdID0gaGV4W2NsaWVudF9yYW5kb21baV0gPj4gNF07CisgICAgbGluZVtwb3MrK10gPSBoZXhbY2xpZW50X3JhbmRvbVtpXSAmIDB4Rl07CisgIH0KKyAgbGluZVtwb3MrK10gPSAnICc7CisKKyAgLyogTWFzdGVyIFNlY3JldCAoc2l6ZSBpcyBhdCBtb3N0IFNTTF9NQVhfTUFTVEVSX0tFWV9MRU5HVEgpICovCisgIGZvcihpID0gMDsgaSA8IG1hc3Rlcl9rZXlfbGVuZ3RoOyBpKyspIHsKKyAgICBsaW5lW3BvcysrXSA9IGhleFttYXN0ZXJfa2V5W2ldID4+IDRdOworICAgIGxpbmVbcG9zKytdID0gaGV4W21hc3Rlcl9rZXlbaV0gJiAweEZdOworICB9CisgIGxpbmVbcG9zKytdID0gJ1xuJzsKKyAgbGluZVtwb3NdID0gJ1wwJzsKKworICAvKiBVc2luZyBmcHV0cyBoZXJlIGluc3RlYWQgb2YgZnByaW50ZiBzaW5jZSBsaWJjdXJsJ3MgZnByaW50ZiByZXBsYWNlbWVudAorICAgICBtYXkgbm90IGJlIHRocmVhZC1zYWZlLiAqLworICBmcHV0cyhsaW5lLCBrZXlsb2dfZmlsZV9mcCk7Cit9CisjZW5kaWYgLyogIUhBVkVfS0VZTE9HX0NBTExCQUNLICovCisjZW5kaWYgLyogRU5BQkxFX1NTTEtFWUxPR0ZJTEUgKi8KKwogc3RhdGljIGNvbnN0IGNoYXIgKlNTTF9FUlJPUl90b19zdHIoaW50IGVycikKIHsKICAgc3dpdGNoKGVycikgewpAQCAtMjE2LDcgKzM3MCw3IEBACiAgIGlmKCFlbmNyeXB0aW5nKSB7CiAgICAgaW50IGtsZW4gPSBjdXJseF91enRvc2koc3RybGVuKChjaGFyICopZ2xvYmFsX3Bhc3N3ZCkpOwogICAgIGlmKG51bSA+IGtsZW4pIHsKLSAgICAgIG1lbWNweShidWYsIGdsb2JhbF9wYXNzd2QsIGtsZW4rMSk7CisgICAgICBtZW1jcHkoYnVmLCBnbG9iYWxfcGFzc3dkLCBrbGVuICsgMSk7CiAgICAgICByZXR1cm4ga2xlbjsKICAgICB9CiAgIH0KQEAgLTIzNiw3ICszOTAsNiBAQAogICAvKiB3ZSBoYXZlIHRoZSAiU1NMIGlzIHNlZWRlZCIgYm9vbGVhbiBzdGF0aWMgdG8gcHJldmVudCBtdWx0aXBsZQogICAgICB0aW1lLWNvbnN1bWluZyBzZWVkaW5ncyBpbiB2YWluICovCiAgIHN0YXRpYyBib29sIHNzbF9zZWVkZWQgPSBGQUxTRTsKLSAgaW50IG5yZWFkPTA7CiAgIGNoYXIgZm5hbWVbMjU2XTsKIAogICBpZihzc2xfc2VlZGVkKQpAQCAtMjU2LDEyICs0MDksMTIgQEAKICNlbmRpZgogICB7CiAgICAgLyogbGV0IHRoZSBvcHRpb24gb3ZlcnJpZGUgdGhlIGRlZmluZSAqLwotICAgIG5yZWFkICs9IFJBTkRfbG9hZF9maWxlKChkYXRhLT5zZXQuc3RyW1NUUklOR19TU0xfUkFORE9NX0ZJTEVdPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5zZXQuc3RyW1NUUklOR19TU0xfUkFORE9NX0ZJTEVdOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQU5ET01fRklMRSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFORF9MT0FEX0xFTkdUSCk7CisgICAgUkFORF9sb2FkX2ZpbGUoKGRhdGEtPnNldC5zdHJbU1RSSU5HX1NTTF9SQU5ET01fRklMRV0/CisgICAgICAgICAgICAgICAgICAgIGRhdGEtPnNldC5zdHJbU1RSSU5HX1NTTF9SQU5ET01fRklMRV06CisgICAgICAgICAgICAgICAgICAgIFJBTkRPTV9GSUxFKSwKKyAgICAgICAgICAgICAgICAgICBSQU5EX0xPQURfTEVOR1RIKTsKICAgICBpZihyYW5kX2Vub3VnaCgpKQotICAgICAgcmV0dXJuIG5yZWFkOworICAgICAgcmV0dXJuIENVUkxFX09LOwogICB9CiAKICNpZiBkZWZpbmVkKEhBVkVfUkFORF9FR0QpCkBAIC0yNzksMzUgKzQzMiw0NyBAQAogICAgIGludCByZXQgPSBSQU5EX2VnZChkYXRhLT5zZXQuc3RyW1NUUklOR19TU0xfRUdEU09DS0VUXT8KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+c2V0LnN0cltTVFJJTkdfU1NMX0VHRFNPQ0tFVF06RUdEX1NPQ0tFVCk7CiAgICAgaWYoLTEgIT0gcmV0KSB7Ci0gICAgICBucmVhZCArPSByZXQ7CiAgICAgICBpZihyYW5kX2Vub3VnaCgpKQotICAgICAgICByZXR1cm4gbnJlYWQ7CisgICAgICAgIHJldHVybiBDVVJMRV9PSzsKICAgICB9CiAgIH0KICNlbmRpZgogCi0gIC8qIElmIHdlIGdldCBoZXJlLCBpdCBtZWFucyB3ZSBuZWVkIHRvIHNlZWQgdGhlIFBSTkcgdXNpbmcgYSAic2lsbHkiCi0gICAgIGFwcHJvYWNoISAqLworICAvKiBmYWxsYmFjayB0byBhIGN1c3RvbSBzZWVkaW5nIG9mIHRoZSBQUk5HIHVzaW5nIGEgaGFzaCBiYXNlZCBvbiBhIGN1cnJlbnQKKyAgICAgdGltZSAqLwogICBkbyB7CiAgICAgdW5zaWduZWQgY2hhciByYW5kYls2NF07Ci0gICAgaW50IGxlbiA9IHNpemVvZihyYW5kYik7Ci0gICAgaWYoIVJBTkRfYnl0ZXMocmFuZGIsIGxlbikpCi0gICAgICBicmVhazsKLSAgICBSQU5EX2FkZChyYW5kYiwgbGVuLCAobGVuID4+IDEpKTsKKyAgICBzaXplX3QgbGVuID0gc2l6ZW9mKHJhbmRiKTsKKyAgICBzaXplX3QgaSwgaV9tYXg7CisgICAgZm9yKGkgPSAwLCBpX21heCA9IGxlbiAvIHNpemVvZihzdHJ1Y3QgY3VybHRpbWUpOyBpIDwgaV9tYXg7ICsraSkgeworICAgICAgc3RydWN0IGN1cmx0aW1lIHR2ID0gY3VybHhfdHZub3coKTsKKyAgICAgIEN1cmxfd2FpdF9tcygxKTsKKyAgICAgIHR2LnR2X3NlYyAqPSBpICsgMTsKKyAgICAgIHR2LnR2X3VzZWMgKj0gKHVuc2lnbmVkIGludClpICsgMjsKKyAgICAgIHR2LnR2X3NlYyBePSAoKGN1cmx4X3R2bm93KCkudHZfc2VjICsgY3VybHhfdHZub3coKS50dl91c2VjKSAqCisgICAgICAgICAgICAgICAgICAgIChpICsgMykpIDw8IDg7CisgICAgICB0di50dl91c2VjIF49ICh1bnNpZ25lZCBpbnQpICgoY3VybHhfdHZub3coKS50dl9zZWMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmx4X3R2bm93KCkudHZfdXNlYykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgKyA0KSkgPDwgMTY7CisgICAgICBtZW1jcHkoJnJhbmRiW2kgKiBzaXplb2Yoc3RydWN0IGN1cmx0aW1lKV0sICZ0diwKKyAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGN1cmx0aW1lKSk7CisgICAgfQorICAgIFJBTkRfYWRkKHJhbmRiLCAoaW50KWxlbiwgKGRvdWJsZSlsZW4vMik7CiAgIH0gd2hpbGUoIXJhbmRfZW5vdWdoKCkpOwogCiAgIC8qIGdlbmVyYXRlcyBhIGRlZmF1bHQgcGF0aCBmb3IgdGhlIHJhbmRvbSBzZWVkIGZpbGUgKi8KLSAgZm5hbWVbMF09MDsgLyogYmxhbmsgaXQgZmlyc3QgKi8KKyAgZm5hbWVbMF0gPSAwOyAvKiBibGFuayBpdCBmaXJzdCAqLwogICBSQU5EX2ZpbGVfbmFtZShmbmFtZSwgc2l6ZW9mKGZuYW1lKSk7CiAgIGlmKGZuYW1lWzBdKSB7CiAgICAgLyogd2UgZ290IGEgZmlsZSBuYW1lIHRvIHRyeSAqLwotICAgIG5yZWFkICs9IFJBTkRfbG9hZF9maWxlKGZuYW1lLCBSQU5EX0xPQURfTEVOR1RIKTsKKyAgICBSQU5EX2xvYWRfZmlsZShmbmFtZSwgUkFORF9MT0FEX0xFTkdUSCk7CiAgICAgaWYocmFuZF9lbm91Z2goKSkKLSAgICAgIHJldHVybiBucmVhZDsKKyAgICAgIHJldHVybiBDVVJMRV9PSzsKICAgfQogCiAgIGluZm9mKGRhdGEsICJsaWJjdXJsIGlzIG5vdyB1c2luZyBhIHdlYWsgcmFuZG9tIHNlZWQhXG4iKTsKLSAgcmV0dXJuIENVUkxFX1NTTF9DT05ORUNUX0VSUk9SOyAvKiBjb25mdXNpbmcgZXJyb3IgY29kZSAqLworICByZXR1cm4gKHJhbmRfZW5vdWdoKCkgPyBDVVJMRV9PSyA6CisgICAgQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1IgLyogY29uZnVzaW5nIGVycm9yIGNvZGUgKi8pOwogfQogCiAjaWZuZGVmIFNTTF9GSUxFVFlQRV9FTkdJTkUKQEAgLTM4NCw2ICs1NDksNyBAQAogewogICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsKICAgY2hhciBlcnJvcl9idWZmZXJbMjU2XTsKKyAgYm9vbCBjaGVja19wcml2a2V5ID0gVFJVRTsKIAogICBpbnQgZmlsZV90eXBlID0gZG9fZmlsZV90eXBlKGNlcnRfdHlwZSk7CiAKQEAgLTU5Miw3ICs3NTgsNyBAQAogICAgICAgICBicmVhazsKICAgICAgIGlmKCFrZXlfZmlsZSkKICAgICAgICAgLyogY2VydCAmIGtleSBjYW4gb25seSBiZSBpbiBQRU0gY2FzZSBpbiB0aGUgc2FtZSBmaWxlICovCi0gICAgICAgIGtleV9maWxlPWNlcnRfZmlsZTsKKyAgICAgICAga2V5X2ZpbGUgPSBjZXJ0X2ZpbGU7CiAgICAgICAvKiBGQUxMVEhST1VHSCAqLwogICAgIGNhc2UgU1NMX0ZJTEVUWVBFX0FTTjE6CiAgICAgICBpZihTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoY3R4LCBrZXlfZmlsZSwgZmlsZV90eXBlKSAhPSAxKSB7CkBAIC02NTUsMTMgKzgyMSwxMyBAQAogICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgc3NsPVNTTF9uZXcoY3R4KTsKKyAgICBzc2wgPSBTU0xfbmV3KGN0eCk7CiAgICAgaWYoIXNzbCkgewogICAgICAgZmFpbGYoZGF0YSwgInVuYWJsZSB0byBjcmVhdGUgYW4gU1NMIHN0cnVjdHVyZSIpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgeDUwOT1TU0xfZ2V0X2NlcnRpZmljYXRlKHNzbCk7CisgICAgeDUwOSA9IFNTTF9nZXRfY2VydGlmaWNhdGUoc3NsKTsKIAogICAgIC8qIFRoaXMgdmVyc2lvbiB3YXMgcHJvdmlkZWQgYnkgRXZhbiBKb3JkYW4gYW5kIGlzIHN1cHBvc2VkIHRvIG5vdAogICAgICAgIGxlYWsgbWVtb3J5IGFzIHRoZSBwcmV2aW91cyB2ZXJzaW9uOiAqLwpAQCAtNjcxLDE3ICs4MzcsMzIgQEAKICAgICAgIEVWUF9QS0VZX2ZyZWUocGt0bXApOwogICAgIH0KIAorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorICAgIHsKKyAgICAgIC8qIElmIFJTQSBpcyB1c2VkLCBkb24ndCBjaGVjayB0aGUgcHJpdmF0ZSBrZXkgaWYgaXRzIGZsYWdzIGluZGljYXRlCisgICAgICAgKiBpdCBkb2Vzbid0IHN1cHBvcnQgaXQuICovCisgICAgICBFVlBfUEtFWSAqcHJpdl9rZXkgPSBTU0xfZ2V0X3ByaXZhdGVrZXkoc3NsKTsKKyAgICAgIGlmKEVWUF9QS0VZX2lkKHByaXZfa2V5KSA9PSBFVlBfUEtFWV9SU0EpIHsKKyAgICAgICAgUlNBICpyc2EgPSBFVlBfUEtFWV9nZXQxX1JTQShwcml2X2tleSk7CisgICAgICAgIGlmKFJTQV9mbGFncyhyc2EpICYgUlNBX01FVEhPRF9GTEFHX05PX0NIRUNLKQorICAgICAgICAgIGNoZWNrX3ByaXZrZXkgPSBGQUxTRTsKKyAgICAgICAgUlNBX2ZyZWUocnNhKTsgLyogRGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCAqLworICAgICAgfQorICAgIH0KKyNlbmRpZgorCiAgICAgU1NMX2ZyZWUoc3NsKTsKIAogICAgIC8qIElmIHdlIGFyZSB1c2luZyBEU0EsIHdlIGNhbiBjb3B5IHRoZSBwYXJhbWV0ZXJzIGZyb20KICAgICAgKiB0aGUgcHJpdmF0ZSBrZXkgKi8KIAotCi0gICAgLyogTm93IHdlIGtub3cgdGhhdCBhIGtleSBhbmQgY2VydCBoYXZlIGJlZW4gc2V0IGFnYWluc3QKLSAgICAgKiB0aGUgU1NMIGNvbnRleHQgKi8KLSAgICBpZighU1NMX0NUWF9jaGVja19wcml2YXRlX2tleShjdHgpKSB7Ci0gICAgICBmYWlsZihkYXRhLCAiUHJpdmF0ZSBrZXkgZG9lcyBub3QgbWF0Y2ggdGhlIGNlcnRpZmljYXRlIHB1YmxpYyBrZXkiKTsKLSAgICAgIHJldHVybiAwOworICAgIGlmKGNoZWNrX3ByaXZrZXkgPT0gVFJVRSkgeworICAgICAgLyogTm93IHdlIGtub3cgdGhhdCBhIGtleSBhbmQgY2VydCBoYXZlIGJlZW4gc2V0IGFnYWluc3QKKyAgICAgICAqIHRoZSBTU0wgY29udGV4dCAqLworICAgICAgaWYoIVNTTF9DVFhfY2hlY2tfcHJpdmF0ZV9rZXkoY3R4KSkgeworICAgICAgICBmYWlsZihkYXRhLCAiUHJpdmF0ZSBrZXkgZG9lcyBub3QgbWF0Y2ggdGhlIGNlcnRpZmljYXRlIHB1YmxpYyBrZXkiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CiAgICAgfQogICB9CiAgIHJldHVybiAxOwpAQCAtNzA5LDcgKzg5MCw3IEBACiAgICAgc2l6ZS0tOyAvKiBkb24ndCBvdmVyd3JpdGUgdGhlIGJ1ZmZlciBlbmQgKi8KIAogICBtZW1jcHkoYnVmLCBiaW9tZW0tPmRhdGEsIHNpemUpOwotICBidWZbc2l6ZV09MDsKKyAgYnVmW3NpemVdID0gMDsKIAogICBCSU9fZnJlZShiaW9fb3V0KTsKIApAQCAtNzIzLDggKzkwNCwxMiBAQAogICogQHJldHZhbCAwIGVycm9yIGluaXRpYWxpemluZyBTU0wKICAqIEByZXR2YWwgMSBTU0wgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5CiAgKi8KLWludCBDdXJsX29zc2xfaW5pdCh2b2lkKQorc3RhdGljIGludCBDdXJsX29zc2xfaW5pdCh2b2lkKQogeworI2lmZGVmIEVOQUJMRV9TU0xLRVlMT0dGSUxFCisgIGNvbnN0IGNoYXIgKmtleWxvZ19maWxlX25hbWU7CisjZW5kaWYKKwogICBPUEVOU1NMX2xvYWRfYnVpbHRpbl9tb2R1bGVzKCk7CiAKICNpZmRlZiBIQVZFX0VOR0lORV9MT0FEX0JVSUxUSU5fRU5HSU5FUwpAQCAtNzYxLDExICs5NDYsMjQgQEAKICAgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKTsKICNlbmRpZgogCisjaWZkZWYgRU5BQkxFX1NTTEtFWUxPR0ZJTEUKKyAga2V5bG9nX2ZpbGVfbmFtZSA9IGN1cmxfZ2V0ZW52KCJTU0xLRVlMT0dGSUxFIik7CisgIGlmKGtleWxvZ19maWxlX25hbWUgJiYgIWtleWxvZ19maWxlX2ZwKSB7CisgICAga2V5bG9nX2ZpbGVfZnAgPSBmb3BlbihrZXlsb2dfZmlsZV9uYW1lLCBGT1BFTl9BUFBFTkRURVhUKTsKKyAgICBpZihrZXlsb2dfZmlsZV9mcCkgeworICAgICAgaWYoc2V0dmJ1ZihrZXlsb2dfZmlsZV9mcCwgTlVMTCwgX0lPTEJGLCA0MDk2KSkgeworICAgICAgICBmY2xvc2Uoa2V5bG9nX2ZpbGVfZnApOworICAgICAgICBrZXlsb2dfZmlsZV9mcCA9IE5VTEw7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKwogICByZXR1cm4gMTsKIH0KIAogLyogR2xvYmFsIGNsZWFudXAgKi8KLXZvaWQgQ3VybF9vc3NsX2NsZWFudXAodm9pZCkKK3N0YXRpYyB2b2lkIEN1cmxfb3NzbF9jbGVhbnVwKHZvaWQpCiB7CiAjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgxMDEwMDAwMEwpICYmIFwKICAgICAhZGVmaW5lZChMSUJSRVNTTF9WRVJTSU9OX05VTUJFUikKQEAgLTc5Nyw2ICs5OTUsMTMgQEAKICAgU1NMX0NPTVBfZnJlZV9jb21wcmVzc2lvbl9tZXRob2RzKCk7CiAjZW5kaWYKICNlbmRpZgorCisjaWZkZWYgRU5BQkxFX1NTTEtFWUxPR0ZJTEUKKyAgaWYoa2V5bG9nX2ZpbGVfZnApIHsKKyAgICBmY2xvc2Uoa2V5bG9nX2ZpbGVfZnApOworICAgIGtleWxvZ19maWxlX2ZwID0gTlVMTDsKKyAgfQorI2VuZGlmCiB9CiAKIC8qCkBAIC04MDcsNyArMTAxMiw3IEBACiAgKiAgICAgMCBtZWFucyB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQKICAqICAgIC0xIG1lYW5zIHRoZSBjb25uZWN0aW9uIHN0YXR1cyBpcyB1bmtub3duCiAgKi8KLWludCBDdXJsX29zc2xfY2hlY2tfY3huKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubikKK3N0YXRpYyBpbnQgQ3VybF9vc3NsX2NoZWNrX2N4bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pCiB7CiAgIC8qIFNTTF9wZWVrIHRha2VzIGRhdGEgb3V0IG9mIHRoZSByYXcgcmVjdiBidWZmZXIgd2l0aG91dCBwZWVraW5nIHNvIHdlIHVzZQogICAgICByZWN2IE1TR19QRUVLIGluc3RlYWQuIEJ1ZyAjNzk1ICovCkBAIC04NTMsNyArMTA1OCw4IEBACiAKIC8qIFNlbGVjdHMgYW4gT3BlblNTTCBjcnlwdG8gZW5naW5lCiAgKi8KLUNVUkxjb2RlIEN1cmxfb3NzbF9zZXRfZW5naW5lKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsIGNvbnN0IGNoYXIgKmVuZ2luZSkKK3N0YXRpYyBDVVJMY29kZSBDdXJsX29zc2xfc2V0X2VuZ2luZShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZ2luZSkKIHsKICNpZiBkZWZpbmVkKFVTRV9PUEVOU1NMKSAmJiBkZWZpbmVkKEhBVkVfT1BFTlNTTF9FTkdJTkVfSCkKICAgRU5HSU5FICplOwpAQCAtODk4LDcgKzExMDQsNyBAQAogCiAvKiBTZXRzIGVuZ2luZSBhcyBkZWZhdWx0IGZvciBhbGwgU1NMIG9wZXJhdGlvbnMKICAqLwotQ1VSTGNvZGUgQ3VybF9vc3NsX3NldF9lbmdpbmVfZGVmYXVsdChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKQorc3RhdGljIENVUkxjb2RlIEN1cmxfb3NzbF9zZXRfZW5naW5lX2RlZmF1bHQoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSkKIHsKICNpZmRlZiBIQVZFX09QRU5TU0xfRU5HSU5FX0gKICAgaWYoZGF0YS0+c3RhdGUuZW5naW5lKSB7CkBAIC05MjAsNyArMTEyNiw3IEBACiAKIC8qIFJldHVybiBsaXN0IG9mIE9wZW5TU0wgY3J5cHRvIGVuZ2luZSBuYW1lcy4KICAqLwotc3RydWN0IGN1cmxfc2xpc3QgKkN1cmxfb3NzbF9lbmdpbmVzX2xpc3Qoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSkKK3N0YXRpYyBzdHJ1Y3QgY3VybF9zbGlzdCAqQ3VybF9vc3NsX2VuZ2luZXNfbGlzdChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKQogewogICBzdHJ1Y3QgY3VybF9zbGlzdCAqbGlzdCA9IE5VTEw7CiAjaWYgZGVmaW5lZChVU0VfT1BFTlNTTCkgJiYgZGVmaW5lZChIQVZFX09QRU5TU0xfRU5HSU5FX0gpCkBAIC05NDMsMjMgKzExNDksMjMgQEAKIAogc3RhdGljIHZvaWQgb3NzbF9jbG9zZShzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCkKIHsKLSAgaWYoY29ubnNzbC0+aGFuZGxlKSB7Ci0gICAgKHZvaWQpU1NMX3NodXRkb3duKGNvbm5zc2wtPmhhbmRsZSk7Ci0gICAgU1NMX3NldF9jb25uZWN0X3N0YXRlKGNvbm5zc2wtPmhhbmRsZSk7CisgIGlmKEJBQ0tFTkQtPmhhbmRsZSkgeworICAgICh2b2lkKVNTTF9zaHV0ZG93bihCQUNLRU5ELT5oYW5kbGUpOworICAgIFNTTF9zZXRfY29ubmVjdF9zdGF0ZShCQUNLRU5ELT5oYW5kbGUpOwogCi0gICAgU1NMX2ZyZWUoY29ubnNzbC0+aGFuZGxlKTsKLSAgICBjb25uc3NsLT5oYW5kbGUgPSBOVUxMOworICAgIFNTTF9mcmVlKEJBQ0tFTkQtPmhhbmRsZSk7CisgICAgQkFDS0VORC0+aGFuZGxlID0gTlVMTDsKICAgfQotICBpZihjb25uc3NsLT5jdHgpIHsKLSAgICBTU0xfQ1RYX2ZyZWUoY29ubnNzbC0+Y3R4KTsKLSAgICBjb25uc3NsLT5jdHggPSBOVUxMOworICBpZihCQUNLRU5ELT5jdHgpIHsKKyAgICBTU0xfQ1RYX2ZyZWUoQkFDS0VORC0+Y3R4KTsKKyAgICBCQUNLRU5ELT5jdHggPSBOVUxMOwogICB9CiB9CiAKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIFNTTCBjb25uZWN0aW9uIGlzIGNsb3NlZC4KICAqLwotdm9pZCBDdXJsX29zc2xfY2xvc2Uoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQorc3RhdGljIHZvaWQgQ3VybF9vc3NsX2Nsb3NlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKICAgb3NzbF9jbG9zZSgmY29ubi0+c3NsW3NvY2tpbmRleF0pOwogICBvc3NsX2Nsb3NlKCZjb25uLT5wcm94eV9zc2xbc29ja2luZGV4XSk7CkBAIC05NjksNyArMTE3NSw3IEBACiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzaHV0IGRvd24gdGhlIFNTTCBsYXllciBidXQga2VlcCB0aGUKICAqIHNvY2tldCBvcGVuIChDQ0MgLSBDbGVhciBDb21tYW5kIENoYW5uZWwpCiAgKi8KLWludCBDdXJsX29zc2xfc2h1dGRvd24oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQorc3RhdGljIGludCBDdXJsX29zc2xfc2h1dGRvd24oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQogewogICBpbnQgcmV0dmFsID0gMDsKICAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CkBAIC05ODgsOSArMTE5NCw5IEBACiAgICAgIHdlIGRvIG5vdCBzZW5kIG9uZS4gTGV0J3MgaG9wZSBvdGhlciBzZXJ2ZXJzIGRvIHRoZSBzYW1lLi4uICovCiAKICAgaWYoZGF0YS0+c2V0LmZ0cF9jY2MgPT0gQ1VSTEZUUFNTTF9DQ0NfQUNUSVZFKQotICAgICAgKHZvaWQpU1NMX3NodXRkb3duKGNvbm5zc2wtPmhhbmRsZSk7CisgICAgICAodm9pZClTU0xfc2h1dGRvd24oQkFDS0VORC0+aGFuZGxlKTsKIAotICBpZihjb25uc3NsLT5oYW5kbGUpIHsKKyAgaWYoQkFDS0VORC0+aGFuZGxlKSB7CiAgICAgYnVmZnNpemUgPSAoaW50KXNpemVvZihidWYpOwogICAgIHdoaWxlKCFkb25lKSB7CiAgICAgICBpbnQgd2hhdCA9IFNPQ0tFVF9SRUFEQUJMRShjb25uLT5zb2NrW3NvY2tpbmRleF0sCkBAIC0xMDAwLDkgKzEyMDYsOCBAQAogCiAgICAgICAgIC8qIFNvbWV0aGluZyB0byByZWFkLCBsZXQncyBkbyBpdCBhbmQgaG9wZSB0aGF0IGl0IGlzIHRoZSBjbG9zZQogICAgICAgICAgICBub3RpZnkgYWxlcnQgZnJvbSB0aGUgc2VydmVyICovCi0gICAgICAgIG5yZWFkID0gKHNzaXplX3QpU1NMX3JlYWQoY29ubi0+c3NsW3NvY2tpbmRleF0uaGFuZGxlLCBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZnNpemUpOwotICAgICAgICBlcnIgPSBTU0xfZ2V0X2Vycm9yKGNvbm4tPnNzbFtzb2NraW5kZXhdLmhhbmRsZSwgKGludClucmVhZCk7CisgICAgICAgIG5yZWFkID0gKHNzaXplX3QpU1NMX3JlYWQoQkFDS0VORC0+aGFuZGxlLCBidWYsIGJ1ZmZzaXplKTsKKyAgICAgICAgZXJyID0gU1NMX2dldF9lcnJvcihCQUNLRU5ELT5oYW5kbGUsIChpbnQpbnJlYWQpOwogCiAgICAgICAgIHN3aXRjaChlcnIpIHsKICAgICAgICAgY2FzZSBTU0xfRVJST1JfTk9ORTogLyogdGhpcyBpcyBub3QgYW4gZXJyb3IgKi8KQEAgLTEwNDcsNyArMTI1Miw3IEBACiAKICAgICBpZihkYXRhLT5zZXQudmVyYm9zZSkgewogI2lmZGVmIEhBVkVfU1NMX0dFVF9TSFVURE9XTgotICAgICAgc3dpdGNoKFNTTF9nZXRfc2h1dGRvd24oY29ubnNzbC0+aGFuZGxlKSkgeworICAgICAgc3dpdGNoKFNTTF9nZXRfc2h1dGRvd24oQkFDS0VORC0+aGFuZGxlKSkgewogICAgICAgY2FzZSBTU0xfU0VOVF9TSFVURE9XTjoKICAgICAgICAgaW5mb2YoZGF0YSwgIlNTTF9nZXRfc2h1dGRvd24oKSByZXR1cm5lZCBTU0xfU0VOVF9TSFVURE9XTlxuIik7CiAgICAgICAgIGJyZWFrOwpAQCAtMTA2MiwxMyArMTI2NywxMyBAQAogI2VuZGlmCiAgICAgfQogCi0gICAgU1NMX2ZyZWUoY29ubnNzbC0+aGFuZGxlKTsKLSAgICBjb25uc3NsLT5oYW5kbGUgPSBOVUxMOworICAgIFNTTF9mcmVlKEJBQ0tFTkQtPmhhbmRsZSk7CisgICAgQkFDS0VORC0+aGFuZGxlID0gTlVMTDsKICAgfQogICByZXR1cm4gcmV0dmFsOwogfQogCi12b2lkIEN1cmxfb3NzbF9zZXNzaW9uX2ZyZWUodm9pZCAqcHRyKQorc3RhdGljIHZvaWQgQ3VybF9vc3NsX3Nlc3Npb25fZnJlZSh2b2lkICpwdHIpCiB7CiAgIC8qIGZyZWUgdGhlIElEICovCiAgIFNTTF9TRVNTSU9OX2ZyZWUocHRyKTsKQEAgLTEwNzgsNyArMTI4Myw3IEBACiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSAnZGF0YScgc3RydWN0IGlzIGdvaW5nIGF3YXkuIENsb3NlCiAgKiBkb3duIGV2ZXJ5dGhpbmcgYW5kIGZyZWUgYWxsIHJlc291cmNlcyEKICAqLwotdm9pZCBDdXJsX29zc2xfY2xvc2VfYWxsKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCitzdGF0aWMgdm9pZCBDdXJsX29zc2xfY2xvc2VfYWxsKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCiB7CiAjaWZkZWYgSEFWRV9PUEVOU1NMX0VOR0lORV9ICiAgIGlmKGRhdGEtPnN0YXRlLmVuZ2luZSkgewpAQCAtMTE3MCw3ICsxMzc1LDcgQEAKICAgICBudW1hbHRzID0gc2tfR0VORVJBTF9OQU1FX251bShhbHRuYW1lcyk7CiAKICAgICAvKiBsb29wIHRocm91Z2ggYWxsIGFsdGVybmF0aXZlcyAtIHVudGlsIGEgZG5zbWF0Y2ggKi8KLSAgICBmb3IoaT0wOyAoaSA8IG51bWFsdHMpICYmICFkbnNtYXRjaGVkOyBpKyspIHsKKyAgICBmb3IoaSA9IDA7IChpIDwgbnVtYWx0cykgJiYgIWRuc21hdGNoZWQ7IGkrKykgewogICAgICAgLyogZ2V0IGEgaGFuZGxlIHRvIGFsdGVybmF0aXZlIG5hbWUgbnVtYmVyIGkgKi8KICAgICAgIGNvbnN0IEdFTkVSQUxfTkFNRSAqY2hlY2sgPSBza19HRU5FUkFMX05BTUVfdmFsdWUoYWx0bmFtZXMsIGkpOwogCkBAIC0xMjM5LDcgKzE0NDQsNyBAQAogICBlbHNlIHsKICAgICAvKiB3ZSBoYXZlIHRvIGxvb2sgdG8gdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBhIGNvbW1vbk5hbWUgaW4gdGhlCiAgICAgICAgZGlzdGluZ3Vpc2hlZCBvbmUgdG8gZ2V0IHRoZSBtb3N0IHNpZ25pZmljYW50IG9uZS4gKi8KLSAgICBpbnQgaiwgaT0tMTsKKyAgICBpbnQgaiwgaSA9IC0xOwogCiAgICAgLyogVGhlIGZvbGxvd2luZyBpcyBkb25lIGJlY2F1c2Ugb2YgYSBidWcgaW4gMC45LjZiICovCiAKQEAgLTEyNDgsMTQgKzE0NTMsMTQgQEAKIAogICAgIFg1MDlfTkFNRSAqbmFtZSA9IFg1MDlfZ2V0X3N1YmplY3RfbmFtZShzZXJ2ZXJfY2VydCk7CiAgICAgaWYobmFtZSkKLSAgICAgIHdoaWxlKChqID0gWDUwOV9OQU1FX2dldF9pbmRleF9ieV9OSUQobmFtZSwgTklEX2NvbW1vbk5hbWUsIGkpKT49MCkKLSAgICAgICAgaT1qOworICAgICAgd2hpbGUoKGogPSBYNTA5X05BTUVfZ2V0X2luZGV4X2J5X05JRChuYW1lLCBOSURfY29tbW9uTmFtZSwgaSkpID49IDApCisgICAgICAgIGkgPSBqOwogCiAgICAgLyogd2UgaGF2ZSB0aGUgbmFtZSBlbnRyeSBhbmQgd2Ugd2lsbCBub3cgY29udmVydCB0aGlzIHRvIGEgc3RyaW5nCiAgICAgICAgdGhhdCB3ZSBjYW4gdXNlIGZvciBjb21wYXJpc29uLiBEb2luZyB0aGlzIHdlIHN1cHBvcnQgQk1Qc3RyaW5nLAogICAgICAgIFVURjggZXRjLiAqLwogCi0gICAgaWYoaT49MCkgeworICAgIGlmKGkgPj0gMCkgewogICAgICAgQVNOMV9TVFJJTkcgKnRtcCA9CiAgICAgICAgIFg1MDlfTkFNRV9FTlRSWV9nZXRfZGF0YShYNTA5X05BTUVfZ2V0X2VudHJ5KG5hbWUsIGkpKTsKIApAQCAtMTI2OCw3ICsxNDczLDcgQEAKICAgICAgICAgaWYoQVNOMV9TVFJJTkdfdHlwZSh0bXApID09IFZfQVNOMV9VVEY4U1RSSU5HKSB7CiAgICAgICAgICAgaiA9IEFTTjFfU1RSSU5HX2xlbmd0aCh0bXApOwogICAgICAgICAgIGlmKGogPj0gMCkgewotICAgICAgICAgICAgcGVlcl9DTiA9IE9QRU5TU0xfbWFsbG9jKGorMSk7CisgICAgICAgICAgICBwZWVyX0NOID0gT1BFTlNTTF9tYWxsb2MoaiArIDEpOwogICAgICAgICAgICAgaWYocGVlcl9DTikgewogICAgICAgICAgICAgICBtZW1jcHkocGVlcl9DTiwgQVNOMV9TVFJJTkdfZ2V0MF9kYXRhKHRtcCksIGopOwogICAgICAgICAgICAgICBwZWVyX0NOW2pdID0gJ1wwJzsKQEAgLTEyOTEsNyArMTQ5Niw4IEBACiAgICAgICAgcGVlcl9DTiA9IE5VTEw7CiAgICAgZWxzZSB7CiAgICAgICAvKiBjb252ZXJ0IHBlZXJfQ04gZnJvbSBVVEY4ICovCi0gICAgICBDVVJMY29kZSByYyA9IEN1cmxfY29udmVydF9mcm9tX3V0ZjgoZGF0YSwgcGVlcl9DTiwgc3RybGVuKHBlZXJfQ04pKTsKKyAgICAgIENVUkxjb2RlIHJjID0gQ3VybF9jb252ZXJ0X2Zyb21fdXRmOChkYXRhLCAoY2hhciAqKXBlZXJfQ04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKChjaGFyICopcGVlcl9DTikpOwogICAgICAgLyogQ3VybF9jb252ZXJ0X2Zyb21fdXRmOCBjYWxscyBmYWlsZiBpZiB1bnN1Y2Nlc3NmdWwgKi8KICAgICAgIGlmKHJjKSB7CiAgICAgICAgIE9QRU5TU0xfZnJlZShwZWVyX0NOKTsKQEAgLTEzMzcsNyArMTU0Myw3IEBACiAgIFg1MDlfU1RPUkUgICAgICpzdCA9IE5VTEw7CiAgIFNUQUNLX09GKFg1MDkpICpjaCA9IE5VTEw7CiAKLSAgbG9uZyBsZW4gPSBTU0xfZ2V0X3Rsc2V4dF9zdGF0dXNfb2NzcF9yZXNwKGNvbm5zc2wtPmhhbmRsZSwgJnApOworICBsb25nIGxlbiA9IFNTTF9nZXRfdGxzZXh0X3N0YXR1c19vY3NwX3Jlc3AoQkFDS0VORC0+aGFuZGxlLCAmcCk7CiAKICAgaWYoIXApIHsKICAgICBmYWlsZihkYXRhLCAiTm8gT0NTUCByZXNwb25zZSByZWNlaXZlZCIpOwpAQCAtMTM2Nyw4ICsxNTczLDggQEAKICAgICBnb3RvIGVuZDsKICAgfQogCi0gIGNoID0gU1NMX2dldF9wZWVyX2NlcnRfY2hhaW4oY29ubnNzbC0+aGFuZGxlKTsKLSAgc3QgPSBTU0xfQ1RYX2dldF9jZXJ0X3N0b3JlKGNvbm5zc2wtPmN0eCk7CisgIGNoID0gU1NMX2dldF9wZWVyX2NlcnRfY2hhaW4oQkFDS0VORC0+aGFuZGxlKTsKKyAgc3QgPSBTU0xfQ1RYX2dldF9jZXJ0X3N0b3JlKEJBQ0tFTkQtPmN0eCk7CiAKICNpZiAoKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPD0gMHgxMDAwMjAxZkwpIC8qIEZpeGVkIGFmdGVyIDEuMC4yYSAqLyB8fCBcCiAgICAgIChkZWZpbmVkKExJQlJFU1NMX1ZFUlNJT05fTlVNQkVSKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xNzU5LDcgKzE5NjUsNyBAQAogI2lmZGVmIFRMUzFfM19WRVJTSU9OCiAgICAgewogICAgICAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07Ci0gICAgICBTU0xfQ1RYX3NldF9tYXhfcHJvdG9fdmVyc2lvbihjb25uc3NsLT5jdHgsIFRMUzFfM19WRVJTSU9OKTsKKyAgICAgIFNTTF9DVFhfc2V0X21heF9wcm90b192ZXJzaW9uKEJBQ0tFTkQtPmN0eCwgVExTMV8zX1ZFUlNJT04pOwogICAgICAgKmN0eF9vcHRpb25zIHw9IFNTTF9PUF9OT19UTFN2MV8yOwogICAgIH0KICNlbHNlCkBAIC0xNzY3LDYgKzE5NzMsNyBAQAogICAgICAgZmFpbGYoZGF0YSwgT1NTTF9QQUNLQUdFICIgd2FzIGJ1aWx0IHdpdGhvdXQgVExTIDEuMyBzdXBwb3J0Iik7CiAgICAgICByZXR1cm4gQ1VSTEVfTk9UX0JVSUxUX0lOOwogI2VuZGlmCisgICAgICAvKiBGQUxMVEhST1VHSCAqLwogICAgIGNhc2UgQ1VSTF9TU0xWRVJTSU9OX1RMU3YxXzI6CiAjaWYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDEwMDAxMDBGTAogICAgICAgKmN0eF9vcHRpb25zIHw9IFNTTF9PUF9OT19UTFN2MV8xOwpAQCAtMTkwOSwyNSArMjExNiwyNSBAQAogICAgIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKICAgfQogCi0gIGlmKGNvbm5zc2wtPmN0eCkKLSAgICBTU0xfQ1RYX2ZyZWUoY29ubnNzbC0+Y3R4KTsKLSAgY29ubnNzbC0+Y3R4ID0gU1NMX0NUWF9uZXcocmVxX21ldGhvZCk7CisgIGlmKEJBQ0tFTkQtPmN0eCkKKyAgICBTU0xfQ1RYX2ZyZWUoQkFDS0VORC0+Y3R4KTsKKyAgQkFDS0VORC0+Y3R4ID0gU1NMX0NUWF9uZXcocmVxX21ldGhvZCk7CiAKLSAgaWYoIWNvbm5zc2wtPmN0eCkgeworICBpZighQkFDS0VORC0+Y3R4KSB7CiAgICAgZmFpbGYoZGF0YSwgIlNTTDogY291bGRuJ3QgY3JlYXRlIGEgY29udGV4dDogJXMiLAogICAgICAgICAgIG9zc2xfc3RyZXJyb3IoRVJSX3BlZWtfZXJyb3IoKSwgZXJyb3JfYnVmZmVyLCBzaXplb2YoZXJyb3JfYnVmZmVyKSkpOwogICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogICB9CiAKICNpZmRlZiBTU0xfTU9ERV9SRUxFQVNFX0JVRkZFUlMKLSAgU1NMX0NUWF9zZXRfbW9kZShjb25uc3NsLT5jdHgsIFNTTF9NT0RFX1JFTEVBU0VfQlVGRkVSUyk7CisgIFNTTF9DVFhfc2V0X21vZGUoQkFDS0VORC0+Y3R4LCBTU0xfTU9ERV9SRUxFQVNFX0JVRkZFUlMpOwogI2VuZGlmCiAKICNpZmRlZiBTU0xfQ1RSTF9TRVRfTVNHX0NBTExCQUNLCiAgIGlmKGRhdGEtPnNldC5mZGVidWcgJiYgZGF0YS0+c2V0LnZlcmJvc2UpIHsKICAgICAvKiB0aGUgU1NMIHRyYWNlIGNhbGxiYWNrIGlzIG9ubHkgdXNlZCBmb3IgdmVyYm9zZSBsb2dnaW5nICovCi0gICAgU1NMX0NUWF9zZXRfbXNnX2NhbGxiYWNrKGNvbm5zc2wtPmN0eCwgc3NsX3Rsc190cmFjZSk7Ci0gICAgU1NMX0NUWF9zZXRfbXNnX2NhbGxiYWNrX2FyZyhjb25uc3NsLT5jdHgsIGNvbm4pOworICAgIFNTTF9DVFhfc2V0X21zZ19jYWxsYmFjayhCQUNLRU5ELT5jdHgsIHNzbF90bHNfdHJhY2UpOworICAgIFNTTF9DVFhfc2V0X21zZ19jYWxsYmFja19hcmcoQkFDS0VORC0+Y3R4LCBjb25uKTsKICAgfQogI2VuZGlmCiAKQEAgLTIwNDQsMTEgKzIyNTEsMTEgQEAKICAgICByZXR1cm4gQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1I7CiAgIH0KIAotICBTU0xfQ1RYX3NldF9vcHRpb25zKGNvbm5zc2wtPmN0eCwgY3R4X29wdGlvbnMpOworICBTU0xfQ1RYX3NldF9vcHRpb25zKEJBQ0tFTkQtPmN0eCwgY3R4X29wdGlvbnMpOwogCiAjaWZkZWYgSEFTX05QTgogICBpZihjb25uLT5iaXRzLnRsc19lbmFibGVfbnBuKQotICAgIFNTTF9DVFhfc2V0X25leHRfcHJvdG9fc2VsZWN0X2NiKGNvbm5zc2wtPmN0eCwgc2VsZWN0X25leHRfcHJvdG9fY2IsIGNvbm4pOworICAgIFNTTF9DVFhfc2V0X25leHRfcHJvdG9fc2VsZWN0X2NiKEJBQ0tFTkQtPmN0eCwgc2VsZWN0X25leHRfcHJvdG9fY2IsIGNvbm4pOwogI2VuZGlmCiAKICNpZmRlZiBIQVNfQUxQTgpAQCAtMjA1Nyw3ICsyMjY0LDggQEAKICAgICB1bnNpZ25lZCBjaGFyIHByb3RvY29sc1sxMjhdOwogCiAjaWZkZWYgVVNFX05HSFRUUDIKLSAgICBpZihkYXRhLT5zZXQuaHR0cHZlcnNpb24gPj0gQ1VSTF9IVFRQX1ZFUlNJT05fMikgeworICAgIGlmKGRhdGEtPnNldC5odHRwdmVyc2lvbiA+PSBDVVJMX0hUVFBfVkVSU0lPTl8yICYmCisgICAgICAgKCFTU0xfSVNfUFJPWFkoKSB8fCAhY29ubi0+Yml0cy50dW5uZWxfcHJveHkpKSB7CiAgICAgICBwcm90b2NvbHNbY3VyKytdID0gTkdIVFRQMl9QUk9UT19WRVJTSU9OX0lEX0xFTjsKIAogICAgICAgbWVtY3B5KCZwcm90b2NvbHNbY3VyXSwgTkdIVFRQMl9QUk9UT19WRVJTSU9OX0lELApAQCAtMjA3NSwxMiArMjI4MywxMiBAQAogICAgIC8qIGV4cGVjdHMgbGVuZ3RoIHByZWZpeGVkIHByZWZlcmVuY2Ugb3JkZXJlZCBsaXN0IG9mIHByb3RvY29scyBpbiB3aXJlCiAgICAgICogZm9ybWF0CiAgICAgICovCi0gICAgU1NMX0NUWF9zZXRfYWxwbl9wcm90b3MoY29ubnNzbC0+Y3R4LCBwcm90b2NvbHMsIGN1cik7CisgICAgU1NMX0NUWF9zZXRfYWxwbl9wcm90b3MoQkFDS0VORC0+Y3R4LCBwcm90b2NvbHMsIGN1cik7CiAgIH0KICNlbmRpZgogCiAgIGlmKHNzbF9jZXJ0IHx8IHNzbF9jZXJ0X3R5cGUpIHsKLSAgICBpZighY2VydF9zdHVmZihjb25uLCBjb25uc3NsLT5jdHgsIHNzbF9jZXJ0LCBzc2xfY2VydF90eXBlLAorICAgIGlmKCFjZXJ0X3N0dWZmKGNvbm4sIEJBQ0tFTkQtPmN0eCwgc3NsX2NlcnQsIHNzbF9jZXJ0X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgU1NMX1NFVF9PUFRJT04oa2V5KSwgU1NMX1NFVF9PUFRJT04oa2V5X3R5cGUpLAogICAgICAgICAgICAgICAgICAgIFNTTF9TRVRfT1BUSU9OKGtleV9wYXNzd2QpKSkgewogICAgICAgLyogZmFpbGYoKSBpcyBhbHJlYWR5IGRvbmUgaW4gY2VydF9zdHVmZigpICovCkBAIC0yMDkxLDExICsyMjk5LDEzIEBACiAgIGNpcGhlcnMgPSBTU0xfQ09OTl9DT05GSUcoY2lwaGVyX2xpc3QpOwogICBpZighY2lwaGVycykKICAgICBjaXBoZXJzID0gKGNoYXIgKilERUZBVUxUX0NJUEhFUl9TRUxFQ1RJT047Ci0gIGlmKCFTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdChjb25uc3NsLT5jdHgsIGNpcGhlcnMpKSB7Ci0gICAgZmFpbGYoZGF0YSwgImZhaWxlZCBzZXR0aW5nIGNpcGhlciBsaXN0OiAlcyIsIGNpcGhlcnMpOwotICAgIHJldHVybiBDVVJMRV9TU0xfQ0lQSEVSOworICBpZihjaXBoZXJzKSB7CisgICAgaWYoIVNTTF9DVFhfc2V0X2NpcGhlcl9saXN0KEJBQ0tFTkQtPmN0eCwgY2lwaGVycykpIHsKKyAgICAgIGZhaWxmKGRhdGEsICJmYWlsZWQgc2V0dGluZyBjaXBoZXIgbGlzdDogJXMiLCBjaXBoZXJzKTsKKyAgICAgIHJldHVybiBDVVJMRV9TU0xfQ0lQSEVSOworICAgIH0KKyAgICBpbmZvZihkYXRhLCAiQ2lwaGVyIHNlbGVjdGlvbjogJXNcbiIsIGNpcGhlcnMpOwogICB9Ci0gIGluZm9mKGRhdGEsICJDaXBoZXIgc2VsZWN0aW9uOiAlc1xuIiwgY2lwaGVycyk7CiAKICNpZmRlZiBVU0VfVExTX1NSUAogICBpZihzc2xfYXV0aHR5cGUgPT0gQ1VSTF9UTFNBVVRIX1NSUCkgewpAQCAtMjEwMywxOCArMjMxMywxOCBAQAogCiAgICAgaW5mb2YoZGF0YSwgIlVzaW5nIFRMUy1TUlAgdXNlcm5hbWU6ICVzXG4iLCBzc2xfdXNlcm5hbWUpOwogCi0gICAgaWYoIVNTTF9DVFhfc2V0X3NycF91c2VybmFtZShjb25uc3NsLT5jdHgsIHNzbF91c2VybmFtZSkpIHsKKyAgICBpZighU1NMX0NUWF9zZXRfc3JwX3VzZXJuYW1lKEJBQ0tFTkQtPmN0eCwgc3NsX3VzZXJuYW1lKSkgewogICAgICAgZmFpbGYoZGF0YSwgIlVuYWJsZSB0byBzZXQgU1JQIHVzZXIgbmFtZSIpOwogICAgICAgcmV0dXJuIENVUkxFX0JBRF9GVU5DVElPTl9BUkdVTUVOVDsKICAgICB9Ci0gICAgaWYoIVNTTF9DVFhfc2V0X3NycF9wYXNzd29yZChjb25uc3NsLT5jdHgsIFNTTF9TRVRfT1BUSU9OKHBhc3N3b3JkKSkpIHsKKyAgICBpZighU1NMX0NUWF9zZXRfc3JwX3Bhc3N3b3JkKEJBQ0tFTkQtPmN0eCwgU1NMX1NFVF9PUFRJT04ocGFzc3dvcmQpKSkgewogICAgICAgZmFpbGYoZGF0YSwgImZhaWxlZCBzZXR0aW5nIFNSUCBwYXNzd29yZCIpOwogICAgICAgcmV0dXJuIENVUkxFX0JBRF9GVU5DVElPTl9BUkdVTUVOVDsKICAgICB9CiAgICAgaWYoIVNTTF9DT05OX0NPTkZJRyhjaXBoZXJfbGlzdCkpIHsKICAgICAgIGluZm9mKGRhdGEsICJTZXR0aW5nIGNpcGhlciBsaXN0IFNSUFxuIik7CiAKLSAgICAgIGlmKCFTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdChjb25uc3NsLT5jdHgsICJTUlAiKSkgeworICAgICAgaWYoIVNTTF9DVFhfc2V0X2NpcGhlcl9saXN0KEJBQ0tFTkQtPmN0eCwgIlNSUCIpKSB7CiAgICAgICAgIGZhaWxmKGRhdGEsICJmYWlsZWQgc2V0dGluZyBTUlAgY2lwaGVyIGxpc3QiKTsKICAgICAgICAgcmV0dXJuIENVUkxFX1NTTF9DSVBIRVI7CiAgICAgICB9CkBAIC0yMTI1LDcgKzIzMzUsNyBAQAogICBpZihzc2xfY2FmaWxlIHx8IHNzbF9jYXBhdGgpIHsKICAgICAvKiB0ZWxsIFNTTCB3aGVyZSB0byBmaW5kIENBIGNlcnRpZmljYXRlcyB0aGF0IGFyZSB1c2VkIHRvIHZlcmlmeQogICAgICAgIHRoZSBzZXJ2ZXJzIGNlcnRpZmljYXRlLiAqLwotICAgIGlmKCFTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjb25uc3NsLT5jdHgsIHNzbF9jYWZpbGUsIHNzbF9jYXBhdGgpKSB7CisgICAgaWYoIVNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKEJBQ0tFTkQtPmN0eCwgc3NsX2NhZmlsZSwgc3NsX2NhcGF0aCkpIHsKICAgICAgIGlmKHZlcmlmeXBlZXIpIHsKICAgICAgICAgLyogRmFpbCBpZiB3ZSBpbnNpc3Qgb24gc3VjY2Vzc2Z1bGx5IHZlcmlmeWluZyB0aGUgc2VydmVyLiAqLwogICAgICAgICBmYWlsZihkYXRhLCAiZXJyb3Igc2V0dGluZyBjZXJ0aWZpY2F0ZSB2ZXJpZnkgbG9jYXRpb25zOlxuIgpAQCAtMjE1MywxNCArMjM2MywxNCBAQAogICBlbHNlIGlmKHZlcmlmeXBlZXIpIHsKICAgICAvKiB2ZXJmeWluZyB0aGUgcGVlciB3aXRob3V0IGFueSBDQSBjZXJ0aWZpY2F0ZXMgd29uJ3QKICAgICAgICB3b3JrIHNvIHVzZSBvcGVuc3NsJ3MgYnVpbHQgaW4gZGVmYXVsdCBhcyBmYWxsYmFjayAqLwotICAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKGNvbm5zc2wtPmN0eCk7CisgICAgU1NMX0NUWF9zZXRfZGVmYXVsdF92ZXJpZnlfcGF0aHMoQkFDS0VORC0+Y3R4KTsKICAgfQogI2VuZGlmCiAKICAgaWYoc3NsX2NybGZpbGUpIHsKICAgICAvKiB0ZWxsIFNTTCB3aGVyZSB0byBmaW5kIENSTCBmaWxlIHRoYXQgaXMgdXNlZCB0byBjaGVjayBjZXJ0aWZpY2F0ZQogICAgICAqIHJldm9jYXRpb24gKi8KLSAgICBsb29rdXA9WDUwOV9TVE9SRV9hZGRfbG9va3VwKFNTTF9DVFhfZ2V0X2NlcnRfc3RvcmUoY29ubnNzbC0+Y3R4KSwKKyAgICBsb29rdXAgPSBYNTA5X1NUT1JFX2FkZF9sb29rdXAoU1NMX0NUWF9nZXRfY2VydF9zdG9yZShCQUNLRU5ELT5jdHgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9MT09LVVBfZmlsZSgpKTsKICAgICBpZighbG9va3VwIHx8CiAgICAgICAgKCFYNTA5X2xvYWRfY3JsX2ZpbGUobG9va3VwLCBzc2xfY3JsZmlsZSwgWDUwOV9GSUxFVFlQRV9QRU0pKSApIHsKQEAgLTIxNjksNyArMjM3OSw3IEBACiAgICAgfQogICAgIC8qIEV2ZXJ5dGhpbmcgaXMgZmluZS4gKi8KICAgICBpbmZvZihkYXRhLCAic3VjY2Vzc2Z1bGx5IGxvYWQgQ1JMIGZpbGU6XG4iKTsKLSAgICBYNTA5X1NUT1JFX3NldF9mbGFncyhTU0xfQ1RYX2dldF9jZXJ0X3N0b3JlKGNvbm5zc2wtPmN0eCksCisgICAgWDUwOV9TVE9SRV9zZXRfZmxhZ3MoU1NMX0NUWF9nZXRfY2VydF9zdG9yZShCQUNLRU5ELT5jdHgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfVl9GTEFHX0NSTF9DSEVDS3xYNTA5X1ZfRkxBR19DUkxfQ0hFQ0tfQUxMKTsKIAogICAgIGluZm9mKGRhdGEsICIgIENSTGZpbGU6ICVzXG4iLCBzc2xfY3JsZmlsZSk7CkBAIC0yMTg0LDcgKzIzOTQsNyBAQAogICAqLwogI2lmIGRlZmluZWQoWDUwOV9WX0ZMQUdfVFJVU1RFRF9GSVJTVCkgJiYgIWRlZmluZWQoWDUwOV9WX0ZMQUdfTk9fQUxUX0NIQUlOUykKICAgaWYodmVyaWZ5cGVlcikgewotICAgIFg1MDlfU1RPUkVfc2V0X2ZsYWdzKFNTTF9DVFhfZ2V0X2NlcnRfc3RvcmUoY29ubnNzbC0+Y3R4KSwKKyAgICBYNTA5X1NUT1JFX3NldF9mbGFncyhTU0xfQ1RYX2dldF9jZXJ0X3N0b3JlKEJBQ0tFTkQtPmN0eCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9WX0ZMQUdfVFJVU1RFRF9GSVJTVCk7CiAgIH0KICNlbmRpZgpAQCAtMjE5MywxMiArMjQwMywxOSBAQAogICAgKiBmYWlsIHRvIGNvbm5lY3QgaWYgdGhlIHZlcmlmaWNhdGlvbiBmYWlscywgb3IgaWYgaXQgc2hvdWxkIGNvbnRpbnVlCiAgICAqIGFueXdheS4gSW4gdGhlIGxhdHRlciBjYXNlIHRoZSByZXN1bHQgb2YgdGhlIHZlcmlmaWNhdGlvbiBpcyBjaGVja2VkIHdpdGgKICAgICogU1NMX2dldF92ZXJpZnlfcmVzdWx0KCkgYmVsb3cuICovCi0gIFNTTF9DVFhfc2V0X3ZlcmlmeShjb25uc3NsLT5jdHgsCisgIFNTTF9DVFhfc2V0X3ZlcmlmeShCQUNLRU5ELT5jdHgsCiAgICAgICAgICAgICAgICAgICAgICB2ZXJpZnlwZWVyID8gU1NMX1ZFUklGWV9QRUVSIDogU1NMX1ZFUklGWV9OT05FLCBOVUxMKTsKIAorICAvKiBFbmFibGUgbG9nZ2luZyBvZiBzZWNyZXRzIHRvIHRoZSBmaWxlIHNwZWNpZmllZCBpbiBlbnYgU1NMS0VZTE9HRklMRS4gKi8KKyNpZiBkZWZpbmVkKEVOQUJMRV9TU0xLRVlMT0dGSUxFKSAmJiBkZWZpbmVkKEhBVkVfS0VZTE9HX0NBTExCQUNLKQorICBpZihrZXlsb2dfZmlsZSkgeworICAgIFNTTF9DVFhfc2V0X2tleWxvZ19jYWxsYmFjayhjb25uc3NsLT5jdHgsIG9zc2xfa2V5bG9nX2NhbGxiYWNrKTsKKyAgfQorI2VuZGlmCisKICAgLyogZ2l2ZSBhcHBsaWNhdGlvbiBhIGNoYW5jZSB0byBpbnRlcmZlcmUgd2l0aCBTU0wgc2V0IHVwLiAqLwogICBpZihkYXRhLT5zZXQuc3NsLmZzc2xjdHgpIHsKLSAgICByZXN1bHQgPSAoKmRhdGEtPnNldC5zc2wuZnNzbGN0eCkoZGF0YSwgY29ubnNzbC0+Y3R4LAorICAgIHJlc3VsdCA9ICgqZGF0YS0+c2V0LnNzbC5mc3NsY3R4KShkYXRhLCBCQUNLRU5ELT5jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnNldC5zc2wuZnNzbGN0eHApOwogICAgIGlmKHJlc3VsdCkgewogICAgICAgZmFpbGYoZGF0YSwgImVycm9yIHNpZ25hbGVkIGJ5IHNzbCBjdHggY2FsbGJhY2siKTsKQEAgLTIyMDcsMTAgKzI0MjQsMTAgQEAKICAgfQogCiAgIC8qIExldHMgbWFrZSBhbiBTU0wgc3RydWN0dXJlICovCi0gIGlmKGNvbm5zc2wtPmhhbmRsZSkKLSAgICBTU0xfZnJlZShjb25uc3NsLT5oYW5kbGUpOwotICBjb25uc3NsLT5oYW5kbGUgPSBTU0xfbmV3KGNvbm5zc2wtPmN0eCk7Ci0gIGlmKCFjb25uc3NsLT5oYW5kbGUpIHsKKyAgaWYoQkFDS0VORC0+aGFuZGxlKQorICAgIFNTTF9mcmVlKEJBQ0tFTkQtPmhhbmRsZSk7CisgIEJBQ0tFTkQtPmhhbmRsZSA9IFNTTF9uZXcoQkFDS0VORC0+Y3R4KTsKKyAgaWYoIUJBQ0tFTkQtPmhhbmRsZSkgewogICAgIGZhaWxmKGRhdGEsICJTU0w6IGNvdWxkbid0IGNyZWF0ZSBhIGNvbnRleHQgKGhhbmRsZSkhIik7CiAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CiAgIH0KQEAgLTIyMTgsMTkgKzI0MzUsMTkgQEAKICNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA4MDhmTCkgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19UTFNFWFQpICYmIFwKICAgICAhZGVmaW5lZChPUEVOU1NMX05PX09DU1ApCiAgIGlmKFNTTF9DT05OX0NPTkZJRyh2ZXJpZnlzdGF0dXMpKQotICAgIFNTTF9zZXRfdGxzZXh0X3N0YXR1c190eXBlKGNvbm5zc2wtPmhhbmRsZSwgVExTRVhUX1NUQVRVU1RZUEVfb2NzcCk7CisgICAgU1NMX3NldF90bHNleHRfc3RhdHVzX3R5cGUoQkFDS0VORC0+aGFuZGxlLCBUTFNFWFRfU1RBVFVTVFlQRV9vY3NwKTsKICNlbmRpZgogCi0gIFNTTF9zZXRfY29ubmVjdF9zdGF0ZShjb25uc3NsLT5oYW5kbGUpOworICBTU0xfc2V0X2Nvbm5lY3Rfc3RhdGUoQkFDS0VORC0+aGFuZGxlKTsKIAotICBjb25uc3NsLT5zZXJ2ZXJfY2VydCA9IDB4MDsKKyAgQkFDS0VORC0+c2VydmVyX2NlcnQgPSAweDA7CiAjaWZkZWYgU1NMX0NUUkxfU0VUX1RMU0VYVF9IT1NUTkFNRQogICBpZigoMCA9PSBDdXJsX2luZXRfcHRvbihBRl9JTkVULCBob3N0bmFtZSwgJmFkZHIpKSAmJgogI2lmZGVmIEVOQUJMRV9JUFY2CiAgICAgICgwID09IEN1cmxfaW5ldF9wdG9uKEFGX0lORVQ2LCBob3N0bmFtZSwgJmFkZHIpKSAmJgogI2VuZGlmCiAgICAgIHNuaSAmJgotICAgICAhU1NMX3NldF90bHNleHRfaG9zdF9uYW1lKGNvbm5zc2wtPmhhbmRsZSwgaG9zdG5hbWUpKQorICAgICAhU1NMX3NldF90bHNleHRfaG9zdF9uYW1lKEJBQ0tFTkQtPmhhbmRsZSwgaG9zdG5hbWUpKQogICAgIGluZm9mKGRhdGEsICJXQVJOSU5HOiBmYWlsZWQgdG8gY29uZmlndXJlIHNlcnZlciBuYW1lIGluZGljYXRpb24gKFNOSSkgIgogICAgICAgICAgICJUTFMgZXh0ZW5zaW9uXG4iKTsKICNlbmRpZgpAQCAtMjI0Miw3ICsyNDU5LDcgQEAKICAgICBDdXJsX3NzbF9zZXNzaW9uaWRfbG9jayhjb25uKTsKICAgICBpZighQ3VybF9zc2xfZ2V0c2Vzc2lvbmlkKGNvbm4sICZzc2xfc2Vzc2lvbmlkLCBOVUxMLCBzb2NraW5kZXgpKSB7CiAgICAgICAvKiB3ZSBnb3QgYSBzZXNzaW9uIGlkLCB1c2UgaXQhICovCi0gICAgICBpZighU1NMX3NldF9zZXNzaW9uKGNvbm5zc2wtPmhhbmRsZSwgc3NsX3Nlc3Npb25pZCkpIHsKKyAgICAgIGlmKCFTU0xfc2V0X3Nlc3Npb24oQkFDS0VORC0+aGFuZGxlLCBzc2xfc2Vzc2lvbmlkKSkgewogICAgICAgICBDdXJsX3NzbF9zZXNzaW9uaWRfdW5sb2NrKGNvbm4pOwogICAgICAgICBmYWlsZihkYXRhLCAiU1NMOiBTU0xfc2V0X3Nlc3Npb24gZmFpbGVkOiAlcyIsCiAgICAgICAgICAgICAgIG9zc2xfc3RyZXJyb3IoRVJSX2dldF9lcnJvcigpLCBlcnJvcl9idWZmZXIsCkBAIC0yMjU3LDEzICsyNDc0LDE0IEBACiAKICAgaWYoY29ubi0+cHJveHlfc3NsW3NvY2tpbmRleF0udXNlKSB7CiAgICAgQklPICpjb25zdCBiaW8gPSBCSU9fbmV3KEJJT19mX3NzbCgpKTsKKyAgICBTU0wgKmhhbmRsZSA9IGNvbm4tPnByb3h5X3NzbFtzb2NraW5kZXhdLmJhY2tlbmQtPmhhbmRsZTsKICAgICBERUJVR0FTU0VSVChzc2xfY29ubmVjdGlvbl9jb21wbGV0ZSA9PSBjb25uLT5wcm94eV9zc2xbc29ja2luZGV4XS5zdGF0ZSk7Ci0gICAgREVCVUdBU1NFUlQoY29ubi0+cHJveHlfc3NsW3NvY2tpbmRleF0uaGFuZGxlICE9IE5VTEwpOworICAgIERFQlVHQVNTRVJUKGhhbmRsZSAhPSBOVUxMKTsKICAgICBERUJVR0FTU0VSVChiaW8gIT0gTlVMTCk7Ci0gICAgQklPX3NldF9zc2woYmlvLCBjb25uLT5wcm94eV9zc2xbc29ja2luZGV4XS5oYW5kbGUsIEZBTFNFKTsKLSAgICBTU0xfc2V0X2Jpbyhjb25uc3NsLT5oYW5kbGUsIGJpbywgYmlvKTsKKyAgICBCSU9fc2V0X3NzbChiaW8sIGhhbmRsZSwgRkFMU0UpOworICAgIFNTTF9zZXRfYmlvKEJBQ0tFTkQtPmhhbmRsZSwgYmlvLCBiaW8pOwogICB9Ci0gIGVsc2UgaWYoIVNTTF9zZXRfZmQoY29ubnNzbC0+aGFuZGxlLCAoaW50KXNvY2tmZCkpIHsKKyAgZWxzZSBpZighU1NMX3NldF9mZChCQUNLRU5ELT5oYW5kbGUsIChpbnQpc29ja2ZkKSkgewogICAgIC8qIHBhc3MgdGhlIHJhdyBzb2NrZXQgaW50byB0aGUgU1NMIGxheWVycyAqLwogICAgIGZhaWxmKGRhdGEsICJTU0w6IFNTTF9zZXRfZmQgZmFpbGVkOiAlcyIsCiAgICAgICAgICAgb3NzbF9zdHJlcnJvcihFUlJfZ2V0X2Vycm9yKCksIGVycm9yX2J1ZmZlciwgc2l6ZW9mKGVycm9yX2J1ZmZlcikpKTsKQEAgLTIyODgsMTMgKzI1MDYsMTggQEAKIAogICBFUlJfY2xlYXJfZXJyb3IoKTsKIAotICBlcnIgPSBTU0xfY29ubmVjdChjb25uc3NsLT5oYW5kbGUpOworICBlcnIgPSBTU0xfY29ubmVjdChCQUNLRU5ELT5oYW5kbGUpOworICAvKiBJZiBrZXlsb2dnaW5nIGlzIGVuYWJsZWQgYnV0IHRoZSBrZXlsb2cgY2FsbGJhY2sgaXMgbm90IHN1cHBvcnRlZCB0aGVuIGxvZworICAgICBzZWNyZXRzIGhlcmUsIGltbWVkaWF0ZWx5IGFmdGVyIFNTTF9jb25uZWN0IGJ5IHVzaW5nIHRhcF9zc2xfa2V5LiAqLworI2lmIGRlZmluZWQoRU5BQkxFX1NTTEtFWUxPR0ZJTEUpICYmICFkZWZpbmVkKEhBVkVfS0VZTE9HX0NBTExCQUNLKQorICB0YXBfc3NsX2tleShCQUNLRU5ELT5oYW5kbGUsICZCQUNLRU5ELT50YXBfc3RhdGUpOworI2VuZGlmCiAKICAgLyogMSAgaXMgZmluZQogICAgICAwICBpcyAibm90IHN1Y2Nlc3NmdWwgYnV0IHdhcyBzaHV0IGRvd24gY29udHJvbGxlZCIKICAgICAgPDAgaXMgImhhbmRzaGFrZSB3YXMgbm90IHN1Y2Nlc3NmdWwsIGJlY2F1c2UgYSBmYXRhbCBlcnJvciBvY2N1cnJlZCIgKi8KICAgaWYoMSAhPSBlcnIpIHsKLSAgICBpbnQgZGV0YWlsID0gU1NMX2dldF9lcnJvcihjb25uc3NsLT5oYW5kbGUsIGVycik7CisgICAgaW50IGRldGFpbCA9IFNTTF9nZXRfZXJyb3IoQkFDS0VORC0+aGFuZGxlLCBlcnIpOwogCiAgICAgaWYoU1NMX0VSUk9SX1dBTlRfUkVBRCA9PSBkZXRhaWwpIHsKICAgICAgIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPSBzc2xfY29ubmVjdF8yX3JlYWRpbmc7CkBAIC0yMzI4LDcgKzI1NTEsNyBAQAogICAgICAgICAgKHJlYXNvbiA9PSBTU0xfUl9DRVJUSUZJQ0FURV9WRVJJRllfRkFJTEVEKSkgewogICAgICAgICByZXN1bHQgPSBDVVJMRV9TU0xfQ0FDRVJUOwogCi0gICAgICAgIGxlcnIgPSBTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoY29ubnNzbC0+aGFuZGxlKTsKKyAgICAgICAgbGVyciA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChCQUNLRU5ELT5oYW5kbGUpOwogICAgICAgICBpZihsZXJyICE9IFg1MDlfVl9PSykgewogICAgICAgICAgICpjZXJ0dmVyaWZ5cmVzdWx0ID0gbGVycjsKICAgICAgICAgICBzbnByaW50ZihlcnJvcl9idWZmZXIsIHNpemVvZihlcnJvcl9idWZmZXIpLApAQCAtMjM3Miw4ICsyNTk1LDggQEAKIAogICAgIC8qIEluZm9ybWF0aW9uYWwgbWVzc2FnZSAqLwogICAgIGluZm9mKGRhdGEsICJTU0wgY29ubmVjdGlvbiB1c2luZyAlcyAvICVzXG4iLAotICAgICAgICAgIGdldF9zc2xfdmVyc2lvbl90eHQoY29ubnNzbC0+aGFuZGxlKSwKLSAgICAgICAgICBTU0xfZ2V0X2NpcGhlcihjb25uc3NsLT5oYW5kbGUpKTsKKyAgICAgICAgICBnZXRfc3NsX3ZlcnNpb25fdHh0KEJBQ0tFTkQtPmhhbmRsZSksCisgICAgICAgICAgU1NMX2dldF9jaXBoZXIoQkFDS0VORC0+aGFuZGxlKSk7CiAKICNpZmRlZiBIQVNfQUxQTgogICAgIC8qIFNldHMgZGF0YSBhbmQgbGVuIHRvIG5lZ290aWF0ZWQgcHJvdG9jb2wsIGxlbiBpcyAwIGlmIG5vIHByb3RvY29sIHdhcwpAQCAtMjM4Miw3ICsyNjA1LDcgQEAKICAgICBpZihjb25uLT5iaXRzLnRsc19lbmFibGVfYWxwbikgewogICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbmVnX3Byb3RvY29sOwogICAgICAgdW5zaWduZWQgaW50IGxlbjsKLSAgICAgIFNTTF9nZXQwX2FscG5fc2VsZWN0ZWQoY29ubnNzbC0+aGFuZGxlLCAmbmVnX3Byb3RvY29sLCAmbGVuKTsKKyAgICAgIFNTTF9nZXQwX2FscG5fc2VsZWN0ZWQoQkFDS0VORC0+aGFuZGxlLCAmbmVnX3Byb3RvY29sLCAmbGVuKTsKICAgICAgIGlmKGxlbiAhPSAwKSB7CiAgICAgICAgIGluZm9mKGRhdGEsICJBTFBOLCBzZXJ2ZXIgYWNjZXB0ZWQgdG8gdXNlICUuKnNcbiIsIGxlbiwgbmVnX3Byb3RvY29sKTsKIApAQCAtMjQyNyw3ICsyNjUwLDcgQEAKIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIGxvbmcgaW5mb19sZW4gPSBCSU9fZ2V0X21lbV9kYXRhKG1lbSwgJnB0cik7IFwKICAgQ3VybF9zc2xfcHVzaF9jZXJ0aW5mb19sZW4oZGF0YSwgX251bSwgX2xhYmVsLCBwdHIsIGluZm9fbGVuKTsgXAotICBpZigxIT1CSU9fcmVzZXQobWVtKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmKDEgIT0gQklPX3Jlc2V0KG1lbSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfSBXSElMRV9GQUxTRQogCkBAIC0yNDc1LDEyICsyNjk4LDEyIEBACiAgICAgLyogbm8gZXh0ZW5zaW9ucywgYmFpbCBvdXQgKi8KICAgICByZXR1cm4gMTsKIAotICBmb3IoaT0wOyBpIDwgKGludClza19YNTA5X0VYVEVOU0lPTl9udW0oZXh0cyk7IGkrKykgeworICBmb3IoaSA9IDA7IGkgPCAoaW50KXNrX1g1MDlfRVhURU5TSU9OX251bShleHRzKTsgaSsrKSB7CiAgICAgQVNOMV9PQkpFQ1QgKm9iajsKICAgICBYNTA5X0VYVEVOU0lPTiAqZXh0ID0gc2tfWDUwOV9FWFRFTlNJT05fdmFsdWUoZXh0cywgaSk7CiAgICAgQlVGX01FTSAqYmlvbWVtOwogICAgIGNoYXIgYnVmWzUxMl07Ci0gICAgY2hhciAqcHRyPWJ1ZjsKKyAgICBjaGFyICpwdHIgPSBidWY7CiAgICAgY2hhciBuYW1lYnVmWzEyOF07CiAgICAgQklPICpiaW9fb3V0ID0gQklPX25ldyhCSU9fc19tZW0oKSk7CiAKQEAgLTI0OTcsMTYgKzI3MjAsMTYgQEAKICAgICBCSU9fZ2V0X21lbV9wdHIoYmlvX291dCwgJmJpb21lbSk7CiAKICAgICBmb3IoaiA9IDA7IGogPCAoc2l6ZV90KWJpb21lbS0+bGVuZ3RoOyBqKyspIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNlcD0iIjsKKyAgICAgIGNvbnN0IGNoYXIgKnNlcCA9ICIiOwogICAgICAgaWYoYmlvbWVtLT5kYXRhW2pdID09ICdcbicpIHsKLSAgICAgICAgc2VwPSIsICI7CisgICAgICAgIHNlcCA9ICIsICI7CiAgICAgICAgIGorKzsgLyogc2tpcCB0aGUgbmV3bGluZSAqLwogICAgICAgfTsKICAgICAgIHdoaWxlKChqPChzaXplX3QpYmlvbWVtLT5sZW5ndGgpICYmIChiaW9tZW0tPmRhdGFbal0gPT0gJyAnKSkKICAgICAgICAgaisrOwogICAgICAgaWYoajwoc2l6ZV90KWJpb21lbS0+bGVuZ3RoKQotICAgICAgICBwdHIrPXNucHJpbnRmKHB0ciwgc2l6ZW9mKGJ1ZiktKHB0ci1idWYpLCAiJXMlYyIsIHNlcCwKLSAgICAgICAgICAgICAgICAgICAgICBiaW9tZW0tPmRhdGFbal0pOworICAgICAgICBwdHIgKz0gc25wcmludGYocHRyLCBzaXplb2YoYnVmKS0ocHRyLWJ1ZiksICIlcyVjIiwgc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgYmlvbWVtLT5kYXRhW2pdKTsKICAgICB9CiAKICAgICBDdXJsX3NzbF9wdXNoX2NlcnRpbmZvKGRhdGEsIGNlcnRudW0sIG5hbWVidWYsIGJ1Zik7CkBAIC0yNTI4LDcgKzI3NTEsNyBAQAogICBpbnQgbnVtY2VydHM7CiAgIEJJTyAqbWVtOwogCi0gIHNrID0gU1NMX2dldF9wZWVyX2NlcnRfY2hhaW4oY29ubnNzbC0+aGFuZGxlKTsKKyAgc2sgPSBTU0xfZ2V0X3BlZXJfY2VydF9jaGFpbihCQUNLRU5ELT5oYW5kbGUpOwogICBpZighc2spIHsKICAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKICAgfQpAQCAtMjU0NSwxMCArMjc2OCwxMCBAQAogICBmb3IoaSA9IDA7IGkgPCBudW1jZXJ0czsgaSsrKSB7CiAgICAgQVNOMV9JTlRFR0VSICpudW07CiAgICAgWDUwOSAqeCA9IHNrX1g1MDlfdmFsdWUoc2ssIGkpOwotICAgIEVWUF9QS0VZICpwdWJrZXk9TlVMTDsKKyAgICBFVlBfUEtFWSAqcHVia2V5ID0gTlVMTDsKICAgICBpbnQgajsKICAgICBjaGFyICpwdHI7Ci0gICAgQ09OU1RfQVNOMV9CSVRfU1RSSU5HIEFTTjFfQklUX1NUUklORyAqcHNpZyA9IE5VTEw7CisgICAgY29uc3QgQVNOMV9CSVRfU1RSSU5HICpwc2lnID0gTlVMTDsKIAogICAgIFg1MDlfTkFNRV9wcmludF9leChtZW0sIFg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4KSwgMCwgWE5fRkxBR19PTkVMSU5FKTsKICAgICBwdXNoX2NlcnRpbmZvKCJTdWJqZWN0IiwgaSk7CkBAIC0yODE4LDggKzMwNDEsOCBAQAogICAgIC8qIHdlJ3ZlIGJlZW4gYXNrZWQgdG8gZ2F0aGVyIGNlcnRpZmljYXRlIGluZm8hICovCiAgICAgKHZvaWQpZ2V0X2NlcnRfY2hhaW4oY29ubiwgY29ubnNzbCk7CiAKLSAgY29ubnNzbC0+c2VydmVyX2NlcnQgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoY29ubnNzbC0+aGFuZGxlKTsKLSAgaWYoIWNvbm5zc2wtPnNlcnZlcl9jZXJ0KSB7CisgIEJBQ0tFTkQtPnNlcnZlcl9jZXJ0ID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKEJBQ0tFTkQtPmhhbmRsZSk7CisgIGlmKCFCQUNLRU5ELT5zZXJ2ZXJfY2VydCkgewogICAgIEJJT19mcmVlKG1lbSk7CiAgICAgaWYoIXN0cmljdCkKICAgICAgIHJldHVybiBDVVJMRV9PSzsKQEAgLTI4MzAsMTYgKzMwNTMsMTYgQEAKIAogICBpbmZvZihkYXRhLCAiJXMgY2VydGlmaWNhdGU6XG4iLCBTU0xfSVNfUFJPWFkoKSA/ICJQcm94eSIgOiAiU2VydmVyIik7CiAKLSAgcmMgPSB4NTA5X25hbWVfb25lbGluZShYNTA5X2dldF9zdWJqZWN0X25hbWUoY29ubnNzbC0+c2VydmVyX2NlcnQpLAorICByYyA9IHg1MDlfbmFtZV9vbmVsaW5lKFg1MDlfZ2V0X3N1YmplY3RfbmFtZShCQUNLRU5ELT5zZXJ2ZXJfY2VydCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CiAgIGluZm9mKGRhdGEsICIgc3ViamVjdDogJXNcbiIsIHJjPyJbTk9ORV0iOmJ1ZmZlcik7CiAKLSAgQVNOMV9USU1FX3ByaW50KG1lbSwgWDUwOV9nZXQwX25vdEJlZm9yZShjb25uc3NsLT5zZXJ2ZXJfY2VydCkpOworICBBU04xX1RJTUVfcHJpbnQobWVtLCBYNTA5X2dldDBfbm90QmVmb3JlKEJBQ0tFTkQtPnNlcnZlcl9jZXJ0KSk7CiAgIGxlbiA9IEJJT19nZXRfbWVtX2RhdGEobWVtLCAoY2hhciAqKikgJnB0cik7CiAgIGluZm9mKGRhdGEsICIgc3RhcnQgZGF0ZTogJS4qc1xuIiwgbGVuLCBwdHIpOwogICByYyA9IEJJT19yZXNldChtZW0pOwogCi0gIEFTTjFfVElNRV9wcmludChtZW0sIFg1MDlfZ2V0MF9ub3RBZnRlcihjb25uc3NsLT5zZXJ2ZXJfY2VydCkpOworICBBU04xX1RJTUVfcHJpbnQobWVtLCBYNTA5X2dldDBfbm90QWZ0ZXIoQkFDS0VORC0+c2VydmVyX2NlcnQpKTsKICAgbGVuID0gQklPX2dldF9tZW1fZGF0YShtZW0sIChjaGFyICoqKSAmcHRyKTsKICAgaW5mb2YoZGF0YSwgIiBleHBpcmUgZGF0ZTogJS4qc1xuIiwgbGVuLCBwdHIpOwogICByYyA9IEJJT19yZXNldChtZW0pOwpAQCAtMjg0NywxNSArMzA3MCwxNSBAQAogICBCSU9fZnJlZShtZW0pOwogCiAgIGlmKFNTTF9DT05OX0NPTkZJRyh2ZXJpZnlob3N0KSkgewotICAgIHJlc3VsdCA9IHZlcmlmeWhvc3QoY29ubiwgY29ubnNzbC0+c2VydmVyX2NlcnQpOworICAgIHJlc3VsdCA9IHZlcmlmeWhvc3QoY29ubiwgQkFDS0VORC0+c2VydmVyX2NlcnQpOwogICAgIGlmKHJlc3VsdCkgewotICAgICAgWDUwOV9mcmVlKGNvbm5zc2wtPnNlcnZlcl9jZXJ0KTsKLSAgICAgIGNvbm5zc2wtPnNlcnZlcl9jZXJ0ID0gTlVMTDsKKyAgICAgIFg1MDlfZnJlZShCQUNLRU5ELT5zZXJ2ZXJfY2VydCk7CisgICAgICBCQUNLRU5ELT5zZXJ2ZXJfY2VydCA9IE5VTEw7CiAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KICAgfQogCi0gIHJjID0geDUwOV9uYW1lX29uZWxpbmUoWDUwOV9nZXRfaXNzdWVyX25hbWUoY29ubnNzbC0+c2VydmVyX2NlcnQpLAorICByYyA9IHg1MDlfbmFtZV9vbmVsaW5lKFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKEJBQ0tFTkQtPnNlcnZlcl9jZXJ0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKICAgaWYocmMpIHsKICAgICBpZihzdHJpY3QpCkBAIC0yODc1LDggKzMwOTgsOCBAQAogICAgICAgICBpZihzdHJpY3QpCiAgICAgICAgICAgZmFpbGYoZGF0YSwgIlNTTDogVW5hYmxlIHRvIG9wZW4gaXNzdWVyIGNlcnQgKCVzKSIsCiAgICAgICAgICAgICAgICAgU1NMX1NFVF9PUFRJT04oaXNzdWVyY2VydCkpOwotICAgICAgICBYNTA5X2ZyZWUoY29ubnNzbC0+c2VydmVyX2NlcnQpOwotICAgICAgICBjb25uc3NsLT5zZXJ2ZXJfY2VydCA9IE5VTEw7CisgICAgICAgIFg1MDlfZnJlZShCQUNLRU5ELT5zZXJ2ZXJfY2VydCk7CisgICAgICAgIEJBQ0tFTkQtPnNlcnZlcl9jZXJ0ID0gTlVMTDsKICAgICAgICAgcmV0dXJuIENVUkxFX1NTTF9JU1NVRVJfRVJST1I7CiAgICAgICB9CiAKQEAgLTI4ODUsNyArMzEwOCw3IEBACiAgICAgICAgIGlmKHN0cmljdCkKICAgICAgICAgICBmYWlsZihkYXRhLCAiU1NMOiBVbmFibGUgdG8gcmVhZCBpc3N1ZXIgY2VydCAoJXMpIiwKICAgICAgICAgICAgICAgICBTU0xfU0VUX09QVElPTihpc3N1ZXJjZXJ0KSk7Ci0gICAgICAgIFg1MDlfZnJlZShjb25uc3NsLT5zZXJ2ZXJfY2VydCk7CisgICAgICAgIFg1MDlfZnJlZShCQUNLRU5ELT5zZXJ2ZXJfY2VydCk7CiAgICAgICAgIFg1MDlfZnJlZShpc3N1ZXIpOwogICAgICAgICBmY2xvc2UoZnApOwogICAgICAgICByZXR1cm4gQ1VSTEVfU1NMX0lTU1VFUl9FUlJPUjsKQEAgLTI4OTMsMTMgKzMxMTYsMTMgQEAKIAogICAgICAgZmNsb3NlKGZwKTsKIAotICAgICAgaWYoWDUwOV9jaGVja19pc3N1ZWQoaXNzdWVyLCBjb25uc3NsLT5zZXJ2ZXJfY2VydCkgIT0gWDUwOV9WX09LKSB7CisgICAgICBpZihYNTA5X2NoZWNrX2lzc3VlZChpc3N1ZXIsIEJBQ0tFTkQtPnNlcnZlcl9jZXJ0KSAhPSBYNTA5X1ZfT0spIHsKICAgICAgICAgaWYoc3RyaWN0KQogICAgICAgICAgIGZhaWxmKGRhdGEsICJTU0w6IENlcnRpZmljYXRlIGlzc3VlciBjaGVjayBmYWlsZWQgKCVzKSIsCiAgICAgICAgICAgICAgICAgU1NMX1NFVF9PUFRJT04oaXNzdWVyY2VydCkpOwotICAgICAgICBYNTA5X2ZyZWUoY29ubnNzbC0+c2VydmVyX2NlcnQpOworICAgICAgICBYNTA5X2ZyZWUoQkFDS0VORC0+c2VydmVyX2NlcnQpOwogICAgICAgICBYNTA5X2ZyZWUoaXNzdWVyKTsKLSAgICAgICAgY29ubnNzbC0+c2VydmVyX2NlcnQgPSBOVUxMOworICAgICAgICBCQUNLRU5ELT5zZXJ2ZXJfY2VydCA9IE5VTEw7CiAgICAgICAgIHJldHVybiBDVVJMRV9TU0xfSVNTVUVSX0VSUk9SOwogICAgICAgfQogCkBAIC0yOTA4LDcgKzMxMzEsNyBAQAogICAgICAgWDUwOV9mcmVlKGlzc3Vlcik7CiAgICAgfQogCi0gICAgbGVyciA9ICpjZXJ0dmVyaWZ5cmVzdWx0ID0gU1NMX2dldF92ZXJpZnlfcmVzdWx0KGNvbm5zc2wtPmhhbmRsZSk7CisgICAgbGVyciA9ICpjZXJ0dmVyaWZ5cmVzdWx0ID0gU1NMX2dldF92ZXJpZnlfcmVzdWx0KEJBQ0tFTkQtPmhhbmRsZSk7CiAKICAgICBpZigqY2VydHZlcmlmeXJlc3VsdCAhPSBYNTA5X1ZfT0spIHsKICAgICAgIGlmKFNTTF9DT05OX0NPTkZJRyh2ZXJpZnlwZWVyKSkgewpAQCAtMjkzMyw4ICszMTU2LDggQEAKICAgaWYoU1NMX0NPTk5fQ09ORklHKHZlcmlmeXN0YXR1cykpIHsKICAgICByZXN1bHQgPSB2ZXJpZnlzdGF0dXMoY29ubiwgY29ubnNzbCk7CiAgICAgaWYocmVzdWx0KSB7Ci0gICAgICBYNTA5X2ZyZWUoY29ubnNzbC0+c2VydmVyX2NlcnQpOwotICAgICAgY29ubnNzbC0+c2VydmVyX2NlcnQgPSBOVUxMOworICAgICAgWDUwOV9mcmVlKEJBQ0tFTkQtPnNlcnZlcl9jZXJ0KTsKKyAgICAgIEJBQ0tFTkQtPnNlcnZlcl9jZXJ0ID0gTlVMTDsKICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogICB9CkBAIC0yOTQ3LDEzICszMTcwLDEzIEBACiAgIHB0ciA9IFNTTF9JU19QUk9YWSgpID8gZGF0YS0+c2V0LnN0cltTVFJJTkdfU1NMX1BJTk5FRFBVQkxJQ0tFWV9QUk9YWV0gOgogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnNldC5zdHJbU1RSSU5HX1NTTF9QSU5ORURQVUJMSUNLRVlfT1JJR107CiAgIGlmKCFyZXN1bHQgJiYgcHRyKSB7Ci0gICAgcmVzdWx0ID0gcGtwX3Bpbl9wZWVyX3B1YmtleShkYXRhLCBjb25uc3NsLT5zZXJ2ZXJfY2VydCwgcHRyKTsKKyAgICByZXN1bHQgPSBwa3BfcGluX3BlZXJfcHVia2V5KGRhdGEsIEJBQ0tFTkQtPnNlcnZlcl9jZXJ0LCBwdHIpOwogICAgIGlmKHJlc3VsdCkKICAgICAgIGZhaWxmKGRhdGEsICJTU0w6IHB1YmxpYyBrZXkgZG9lcyBub3QgbWF0Y2ggcGlubmVkIHB1YmxpYyBrZXkhIik7CiAgIH0KIAotICBYNTA5X2ZyZWUoY29ubnNzbC0+c2VydmVyX2NlcnQpOwotICBjb25uc3NsLT5zZXJ2ZXJfY2VydCA9IE5VTEw7CisgIFg1MDlfZnJlZShCQUNLRU5ELT5zZXJ2ZXJfY2VydCk7CisgIEJBQ0tFTkQtPnNlcnZlcl9jZXJ0ID0gTlVMTDsKICAgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSA9IHNzbF9jb25uZWN0X2RvbmU7CiAKICAgcmV0dXJuIHJlc3VsdDsKQEAgLTI5NzIsNyArMzE5NSw3IEBACiAgICAgU1NMX1NFU1NJT04gKm91cl9zc2xfc2Vzc2lvbmlkOwogICAgIHZvaWQgKm9sZF9zc2xfc2Vzc2lvbmlkID0gTlVMTDsKIAotICAgIG91cl9zc2xfc2Vzc2lvbmlkID0gU1NMX2dldDFfc2Vzc2lvbihjb25uc3NsLT5oYW5kbGUpOworICAgIG91cl9zc2xfc2Vzc2lvbmlkID0gU1NMX2dldDFfc2Vzc2lvbihCQUNLRU5ELT5oYW5kbGUpOwogCiAgICAgLyogU1NMX2dldDFfc2Vzc2lvbigpIHdpbGwgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgYW5kIHRoZSBzZXNzaW9uCiAgICAgICAgIHdpbGwgc3RheSBpbiBtZW1vcnkgdW50aWwgZXhwbGljaXRseSBmcmVlZCB3aXRoIFNTTF9TRVNTSU9OX2ZyZWUoMyksCkBAIC0zMDc3LDkgKzMzMDAsOSBAQAogICAgIGlmKGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPT0gc3NsX2Nvbm5lY3RfMl9yZWFkaW5nIHx8CiAgICAgICAgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSA9PSBzc2xfY29ubmVjdF8yX3dyaXRpbmcpIHsKIAotICAgICAgY3VybF9zb2NrZXRfdCB3cml0ZWZkID0gc3NsX2Nvbm5lY3RfMl93cml0aW5nPT0KKyAgICAgIGN1cmxfc29ja2V0X3Qgd3JpdGVmZCA9IHNzbF9jb25uZWN0XzJfd3JpdGluZyA9PQogICAgICAgICBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlP3NvY2tmZDpDVVJMX1NPQ0tFVF9CQUQ7Ci0gICAgICBjdXJsX3NvY2tldF90IHJlYWRmZCA9IHNzbF9jb25uZWN0XzJfcmVhZGluZz09CisgICAgICBjdXJsX3NvY2tldF90IHJlYWRmZCA9IHNzbF9jb25uZWN0XzJfcmVhZGluZyA9PQogICAgICAgICBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlP3NvY2tmZDpDVVJMX1NPQ0tFVF9CQUQ7CiAKICAgICAgIHdoYXQgPSBDdXJsX3NvY2tldF9jaGVjayhyZWFkZmQsIENVUkxfU09DS0VUX0JBRCwgd3JpdGVmZCwKQEAgLTMxMzcsMTQgKzMzNjAsMTQgQEAKICAgcmV0dXJuIENVUkxFX09LOwogfQogCi1DVVJMY29kZSBDdXJsX29zc2xfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqZG9uZSkKK3N0YXRpYyBDVVJMY29kZSBDdXJsX29zc2xfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpkb25lKQogewogICByZXR1cm4gb3NzbF9jb25uZWN0X2NvbW1vbihjb25uLCBzb2NraW5kZXgsIFRSVUUsIGRvbmUpOwogfQogCi1DVVJMY29kZSBDdXJsX29zc2xfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCitzdGF0aWMgQ1VSTGNvZGUgQ3VybF9vc3NsX2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQogewogICBDVVJMY29kZSByZXN1bHQ7CiAgIGJvb2wgZG9uZSA9IEZBTFNFOwpAQCAtMzE1OCwxNyArMzM4MSwyMiBAQAogICByZXR1cm4gQ1VSTEVfT0s7CiB9CiAKLWJvb2wgQ3VybF9vc3NsX2RhdGFfcGVuZGluZyhjb25zdCBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBjb25uaW5kZXgpCitzdGF0aWMgYm9vbCBDdXJsX29zc2xfZGF0YV9wZW5kaW5nKGNvbnN0IHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbm5pbmRleCkKIHsKLSAgaWYoY29ubi0+c3NsW2Nvbm5pbmRleF0uaGFuZGxlKQorICBjb25zdCBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbY29ubmluZGV4XTsKKyAgY29uc3Qgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKnByb3h5c3NsID0gJmNvbm4tPnByb3h5X3NzbFtjb25uaW5kZXhdOworICBpZihCQUNLRU5ELT5oYW5kbGUpCiAgICAgLyogU1NMIGlzIGluIHVzZSAqLwotICAgIHJldHVybiAoMCAhPSBTU0xfcGVuZGluZyhjb25uLT5zc2xbY29ubmluZGV4XS5oYW5kbGUpIHx8Ci0gICAgICAgICAgIChjb25uLT5wcm94eV9zc2xbY29ubmluZGV4XS5oYW5kbGUgJiYKLSAgICAgICAgICAgIDAgIT0gU1NMX3BlbmRpbmcoY29ubi0+cHJveHlfc3NsW2Nvbm5pbmRleF0uaGFuZGxlKSkpID8KKyAgICByZXR1cm4gKDAgIT0gU1NMX3BlbmRpbmcoQkFDS0VORC0+aGFuZGxlKSB8fAorICAgICAgICAgICAocHJveHlzc2wtPmJhY2tlbmQtPmhhbmRsZSAmJgorICAgICAgICAgICAgMCAhPSBTU0xfcGVuZGluZyhwcm94eXNzbC0+YmFja2VuZC0+aGFuZGxlKSkpID8KICAgICAgICAgICAgVFJVRSA6IEZBTFNFOwogICByZXR1cm4gRkFMU0U7CiB9CiAKK3N0YXRpYyBzaXplX3QgQ3VybF9vc3NsX3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisKIHN0YXRpYyBzc2l6ZV90IG9zc2xfc2VuZChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICptZW0sCkBAIC0zMTgyLDE0ICszNDEwLDE1IEBACiAgIHVuc2lnbmVkIGxvbmcgc3NsZXJyb3I7CiAgIGludCBtZW1sZW47CiAgIGludCByYzsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CiAKICAgRVJSX2NsZWFyX2Vycm9yKCk7CiAKICAgbWVtbGVuID0gKGxlbiA+IChzaXplX3QpSU5UX01BWCkgPyBJTlRfTUFYIDogKGludClsZW47Ci0gIHJjID0gU1NMX3dyaXRlKGNvbm4tPnNzbFtzb2NraW5kZXhdLmhhbmRsZSwgbWVtLCBtZW1sZW4pOworICByYyA9IFNTTF93cml0ZShCQUNLRU5ELT5oYW5kbGUsIG1lbSwgbWVtbGVuKTsKIAogICBpZihyYyA8PSAwKSB7Ci0gICAgZXJyID0gU1NMX2dldF9lcnJvcihjb25uLT5zc2xbc29ja2luZGV4XS5oYW5kbGUsIHJjKTsKKyAgICBlcnIgPSBTU0xfZ2V0X2Vycm9yKEJBQ0tFTkQtPmhhbmRsZSwgcmMpOwogCiAgICAgc3dpdGNoKGVycikgewogICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKQEAgLTMyNDMsMTQgKzM0NzIsMTUgQEAKICAgdW5zaWduZWQgbG9uZyBzc2xlcnJvcjsKICAgc3NpemVfdCBucmVhZDsKICAgaW50IGJ1ZmZzaXplOworICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbbnVtXTsKIAogICBFUlJfY2xlYXJfZXJyb3IoKTsKIAogICBidWZmc2l6ZSA9IChidWZmZXJzaXplID4gKHNpemVfdClJTlRfTUFYKSA/IElOVF9NQVggOiAoaW50KWJ1ZmZlcnNpemU7Ci0gIG5yZWFkID0gKHNzaXplX3QpU1NMX3JlYWQoY29ubi0+c3NsW251bV0uaGFuZGxlLCBidWYsIGJ1ZmZzaXplKTsKKyAgbnJlYWQgPSAoc3NpemVfdClTU0xfcmVhZChCQUNLRU5ELT5oYW5kbGUsIGJ1ZiwgYnVmZnNpemUpOwogICBpZihucmVhZCA8PSAwKSB7CiAgICAgLyogZmFpbGVkIFNTTF9yZWFkICovCi0gICAgaW50IGVyciA9IFNTTF9nZXRfZXJyb3IoY29ubi0+c3NsW251bV0uaGFuZGxlLCAoaW50KW5yZWFkKTsKKyAgICBpbnQgZXJyID0gU1NMX2dldF9lcnJvcihCQUNLRU5ELT5oYW5kbGUsIChpbnQpbnJlYWQpOwogCiAgICAgc3dpdGNoKGVycikgewogICAgIGNhc2UgU1NMX0VSUk9SX05PTkU6IC8qIHRoaXMgaXMgbm90IGFuIGVycm9yICovCkBAIC0zMjgyLDcgKzM1MTIsNyBAQAogICByZXR1cm4gbnJlYWQ7CiB9CiAKLXNpemVfdCBDdXJsX29zc2xfdmVyc2lvbihjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQorc3RhdGljIHNpemVfdCBDdXJsX29zc2xfdmVyc2lvbihjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQogewogI2lmZGVmIE9QRU5TU0xfSVNfQk9SSU5HU1NMCiAgIHJldHVybiBzbnByaW50ZihidWZmZXIsIHNpemUsIE9TU0xfUEFDS0FHRSk7CkBAIC0zMjkxLDkgKzM1MjEsOSBAQAogICB1bnNpZ25lZCBsb25nIHNzbGVheV92YWx1ZTsKICAgc3ViWzJdPSdcMCc7CiAgIHN1YlsxXT0nXDAnOwotICBzc2xlYXlfdmFsdWU9T3BlblNTTF92ZXJzaW9uX251bSgpOworICBzc2xlYXlfdmFsdWUgPSBPcGVuU1NMX3ZlcnNpb25fbnVtKCk7CiAgIGlmKHNzbGVheV92YWx1ZSA8IDB4OTA2MDAwKSB7Ci0gICAgc3NsZWF5X3ZhbHVlPVNTTEVBWV9WRVJTSU9OX05VTUJFUjsKKyAgICBzc2xlYXlfdmFsdWUgPSBTU0xFQVlfVkVSU0lPTl9OVU1CRVI7CiAgICAgc3ViWzBdPSdcMCc7CiAgIH0KICAgZWxzZSB7CkBAIC0zMzIyLDggKzM1NTIsOCBAQAogfQogCiAvKiBjYW4gYmUgY2FsbGVkIHdpdGggZGF0YSA9PSBOVUxMICovCi1DVVJMY29kZSBDdXJsX29zc2xfcmFuZG9tKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsIHVuc2lnbmVkIGNoYXIgKmVudHJvcHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpCitzdGF0aWMgQ1VSTGNvZGUgQ3VybF9vc3NsX3JhbmRvbShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW50cm9weSwgc2l6ZV90IGxlbmd0aCkKIHsKICAgaW50IHJjOwogICBpZihkYXRhKSB7CkBAIC0zMzM5LDIzICszNTY5LDI0IEBACiAgIHJldHVybiAocmMgPT0gMSA/IENVUkxFX09LIDogQ1VSTEVfRkFJTEVEX0lOSVQpOwogfQogCi12b2lkIEN1cmxfb3NzbF9tZDVzdW0odW5zaWduZWQgY2hhciAqdG1wLCAvKiBpbnB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0bXBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbWQ1c3VtIC8qIG91dHB1dCAqLywKLSAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdW51c2VkKQorc3RhdGljIENVUkxjb2RlIEN1cmxfb3NzbF9tZDVzdW0odW5zaWduZWQgY2hhciAqdG1wLCAvKiBpbnB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRtcGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm1kNXN1bSAvKiBvdXRwdXQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdW51c2VkKQogewogICBNRDVfQ1RYIE1ENXB3OwogICAodm9pZCl1bnVzZWQ7CiAgIE1ENV9Jbml0KCZNRDVwdyk7CiAgIE1ENV9VcGRhdGUoJk1ENXB3LCB0bXAsIHRtcGxlbik7CiAgIE1ENV9GaW5hbChtZDVzdW0sICZNRDVwdyk7CisgIHJldHVybiBDVVJMRV9PSzsKIH0KIAogI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MDA5MDgwMGZMKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX1NIQTI1NikKLXZvaWQgQ3VybF9vc3NsX3NoYTI1NnN1bShjb25zdCB1bnNpZ25lZCBjaGFyICp0bXAsIC8qIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRtcGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzaGEyNTZzdW0gLyogb3V0cHV0ICovLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB1bnVzZWQpCitzdGF0aWMgdm9pZCBDdXJsX29zc2xfc2hhMjU2c3VtKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRtcCwgLyogaW5wdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRtcGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqc2hhMjU2c3VtIC8qIG91dHB1dCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHVudXNlZCkKIHsKICAgU0hBMjU2X0NUWCBTSEEyNTZwdzsKICAgKHZvaWQpdW51c2VkOwpAQCAtMzM2NSw3ICszNTk2LDcgQEAKIH0KICNlbmRpZgogCi1ib29sIEN1cmxfb3NzbF9jZXJ0X3N0YXR1c19yZXF1ZXN0KHZvaWQpCitzdGF0aWMgYm9vbCBDdXJsX29zc2xfY2VydF9zdGF0dXNfcmVxdWVzdCh2b2lkKQogewogI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MDA5MDgwOGZMKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX1RMU0VYVCkgJiYgXAogICAgICFkZWZpbmVkKE9QRU5TU0xfTk9fT0NTUCkKQEAgLTMzNzQsNCArMzYwNSw1MCBAQAogICByZXR1cm4gRkFMU0U7CiAjZW5kaWYKIH0KKworc3RhdGljIHZvaWQgKkN1cmxfb3NzbF9nZXRfaW50ZXJuYWxzKHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxJTkZPIGluZm8pCit7CisgIC8qIExlZ2FjeTogQ1VSTElORk9fVExTX1NFU1NJT04gbXVzdCByZXR1cm4gYW4gU1NMX0NUWCBwb2ludGVyLiAqLworICByZXR1cm4gaW5mbyA9PSBDVVJMSU5GT19UTFNfU0VTU0lPTiA/CisgICAgICAgICAodm9pZCAqKUJBQ0tFTkQtPmN0eCA6ICh2b2lkICopQkFDS0VORC0+aGFuZGxlOworfQorCitjb25zdCBzdHJ1Y3QgQ3VybF9zc2wgQ3VybF9zc2xfb3BlbnNzbCA9IHsKKyAgeyBDVVJMU1NMQkFDS0VORF9PUEVOU1NMLCAib3BlbnNzbCIgfSwgLyogaW5mbyAqLworCisgIDEsIC8qIGhhdmVfY2FfcGF0aCAqLworICAxLCAvKiBoYXZlX2NlcnRpbmZvICovCisgIDEsIC8qIGhhdmVfcGlubmVkcHVia2V5ICovCisgIDEsIC8qIGhhdmVfc3NsX2N0eCAqLworICAxLCAvKiBzdXBwb3J0X2h0dHBzX3Byb3h5ICovCisKKyAgc2l6ZW9mKHN0cnVjdCBzc2xfYmFja2VuZF9kYXRhKSwKKworICBDdXJsX29zc2xfaW5pdCwgICAgICAgICAgICAgICAgLyogaW5pdCAqLworICBDdXJsX29zc2xfY2xlYW51cCwgICAgICAgICAgICAgLyogY2xlYW51cCAqLworICBDdXJsX29zc2xfdmVyc2lvbiwgICAgICAgICAgICAgLyogdmVyc2lvbiAqLworICBDdXJsX29zc2xfY2hlY2tfY3huLCAgICAgICAgICAgLyogY2hlY2tfY3huICovCisgIEN1cmxfb3NzbF9zaHV0ZG93biwgICAgICAgICAgICAvKiBzaHV0ZG93biAqLworICBDdXJsX29zc2xfZGF0YV9wZW5kaW5nLCAgICAgICAgLyogZGF0YV9wZW5kaW5nICovCisgIEN1cmxfb3NzbF9yYW5kb20sICAgICAgICAgICAgICAvKiByYW5kb20gKi8KKyAgQ3VybF9vc3NsX2NlcnRfc3RhdHVzX3JlcXVlc3QsIC8qIGNlcnRfc3RhdHVzX3JlcXVlc3QgKi8KKyAgQ3VybF9vc3NsX2Nvbm5lY3QsICAgICAgICAgICAgIC8qIGNvbm5lY3QgKi8KKyAgQ3VybF9vc3NsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcsIC8qIGNvbm5lY3Rfbm9uYmxvY2tpbmcgKi8KKyAgQ3VybF9vc3NsX2dldF9pbnRlcm5hbHMsICAgICAgIC8qIGdldF9pbnRlcm5hbHMgKi8KKyAgQ3VybF9vc3NsX2Nsb3NlLCAgICAgICAgICAgICAgIC8qIGNsb3NlICovCisgIEN1cmxfb3NzbF9jbG9zZV9hbGwsICAgICAgICAgICAvKiBjbG9zZV9hbGwgKi8KKyAgQ3VybF9vc3NsX3Nlc3Npb25fZnJlZSwgICAgICAgIC8qIHNlc3Npb25fZnJlZSAqLworICBDdXJsX29zc2xfc2V0X2VuZ2luZSwgICAgICAgICAgLyogc2V0X2VuZ2luZSAqLworICBDdXJsX29zc2xfc2V0X2VuZ2luZV9kZWZhdWx0LCAgLyogc2V0X2VuZ2luZV9kZWZhdWx0ICovCisgIEN1cmxfb3NzbF9lbmdpbmVzX2xpc3QsICAgICAgICAvKiBlbmdpbmVzX2xpc3QgKi8KKyAgQ3VybF9ub25lX2ZhbHNlX3N0YXJ0LCAgICAgICAgIC8qIGZhbHNlX3N0YXJ0ICovCisgIEN1cmxfb3NzbF9tZDVzdW0sICAgICAgICAgICAgICAvKiBtZDVzdW0gKi8KKyNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA4MDBmTCkgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19TSEEyNTYpCisgIEN1cmxfb3NzbF9zaGEyNTZzdW0gICAgICAgICAgICAvKiBzaGEyNTZzdW0gKi8KKyNlbHNlCisgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGEyNTZzdW0gKi8KKyNlbmRpZgorfTsKKwogI2VuZGlmIC8qIFVTRV9PUEVOU1NMICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL29wZW5zc2wuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvb3BlbnNzbC5oCmluZGV4IGI5NjQ4ZDUuLjExNGRjNGIgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvb3BlbnNzbC5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvb3BlbnNzbC5oCkBAIC0zMSw5NiArMzEsNyBAQAogCiAjaW5jbHVkZSAidXJsZGF0YS5oIgogCi1DVVJMY29kZSBDdXJsX29zc2xfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOwotQ1VSTGNvZGUgQ3VybF9vc3NsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmRvbmUpOwotCi0vKiBjbG9zZSBhIFNTTCBjb25uZWN0aW9uICovCi12b2lkIEN1cmxfb3NzbF9jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOwotCi0vKiB0ZWxsIE9wZW5TU0wgdG8gY2xvc2UgZG93biBhbGwgb3BlbiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29ubmVjdGlvbnMgKGFuZAotICAgdGh1cyBzZXNzaW9uIElEIGNhY2hpbmcgZXRjKSAqLwotdm9pZCBDdXJsX29zc2xfY2xvc2VfYWxsKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpOwotCi0vKiBTZXRzIGFuIE9wZW5TU0wgZW5naW5lICovCi1DVVJMY29kZSBDdXJsX29zc2xfc2V0X2VuZ2luZShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLCBjb25zdCBjaGFyICplbmdpbmUpOwotCi0vKiBmdW5jdGlvbiBwcm92aWRlZCBmb3IgdGhlIGdlbmVyaWMgU1NMLWxheWVyLCBjYWxsZWQgd2hlbiBhIHNlc3Npb24gaWQKLSAgIHNob3VsZCBiZSBmcmVlZCAqLwotdm9pZCBDdXJsX29zc2xfc2Vzc2lvbl9mcmVlKHZvaWQgKnB0cik7Ci0KLS8qIFNldHMgZW5naW5lIGFzIGRlZmF1bHQgZm9yIGFsbCBTU0wgb3BlcmF0aW9ucyAqLwotQ1VSTGNvZGUgQ3VybF9vc3NsX3NldF9lbmdpbmVfZGVmYXVsdChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKTsKLQotLyogQnVpbGQgbGlzdCBvZiBPcGVuU1NMIGVuZ2luZXMgKi8KLXN0cnVjdCBjdXJsX3NsaXN0ICpDdXJsX29zc2xfZW5naW5lc19saXN0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpOwotCi1pbnQgQ3VybF9vc3NsX2luaXQodm9pZCk7Ci12b2lkIEN1cmxfb3NzbF9jbGVhbnVwKHZvaWQpOwotCi1zaXplX3QgQ3VybF9vc3NsX3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci1pbnQgQ3VybF9vc3NsX2NoZWNrX2N4bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmN4bik7Ci1pbnQgQ3VybF9vc3NsX3NodXRkb3duKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7Ci1ib29sIEN1cmxfb3NzbF9kYXRhX3BlbmRpbmcoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25uaW5kZXgpOwotCi0vKiByZXR1cm4gMCBpZiBhIGZpbmQgcmFuZG9tIGlzIGZpbGxlZCBpbiAqLwotQ1VSTGNvZGUgQ3VybF9vc3NsX3JhbmRvbShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLCB1bnNpZ25lZCBjaGFyICplbnRyb3B5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKTsKLXZvaWQgQ3VybF9vc3NsX21kNXN1bSh1bnNpZ25lZCBjaGFyICp0bXAsIC8qIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRtcGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICptZDVzdW0gLyogb3V0cHV0ICovLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB1bnVzZWQpOwotdm9pZCBDdXJsX29zc2xfc2hhMjU2c3VtKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRtcCwgLyogaW5wdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdG1wbGVuLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNoYTI1NnN1bSAvKiBvdXRwdXQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHVudXNlZCk7Ci0KLWJvb2wgQ3VybF9vc3NsX2NlcnRfc3RhdHVzX3JlcXVlc3Qodm9pZCk7Ci0KLS8qIFN1cHBvcnQgSFRUUFMtcHJveHkgKi8KLSNkZWZpbmUgSFRUUFNfUFJPWFlfU1VQUE9SVCAxCi0KLS8qIFNldCB0aGUgQVBJIGJhY2tlbmQgZGVmaW5pdGlvbiB0byBPcGVuU1NMICovCi0jZGVmaW5lIENVUkxfU1NMX0JBQ0tFTkQgQ1VSTFNTTEJBQ0tFTkRfT1BFTlNTTAotCi0vKiB0aGlzIGJhY2tlbmQgc3VwcG9ydHMgdGhlIENBUEFUSCBvcHRpb24gKi8KLSNkZWZpbmUgaGF2ZV9jdXJsc3NsX2NhX3BhdGggMQotCi0vKiB0aGlzIGJhY2tlbmQgc3VwcG9ydHMgQ1VSTE9QVF9DRVJUSU5GTyAqLwotI2RlZmluZSBoYXZlX2N1cmxzc2xfY2VydGluZm8gMQotCi0vKiB0aGlzIGJhY2tlbmQgc3VwcG9ydHMgQ1VSTE9QVF9TU0xfQ1RYXyogKi8KLSNkZWZpbmUgaGF2ZV9jdXJsc3NsX3NzbF9jdHggMQotCi0vKiB0aGlzIGJhY2tlbmQgc3VwcG9ydHMgQ1VSTE9QVF9QSU5ORURQVUJMSUNLRVkgKi8KLSNkZWZpbmUgaGF2ZV9jdXJsc3NsX3Bpbm5lZHB1YmtleSAxCi0KLS8qIEFQSSBzZXR1cCBmb3IgT3BlblNTTCAqLwotI2RlZmluZSBjdXJsc3NsX2luaXQgQ3VybF9vc3NsX2luaXQKLSNkZWZpbmUgY3VybHNzbF9jbGVhbnVwIEN1cmxfb3NzbF9jbGVhbnVwCi0jZGVmaW5lIGN1cmxzc2xfY29ubmVjdCBDdXJsX29zc2xfY29ubmVjdAotI2RlZmluZSBjdXJsc3NsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcgQ3VybF9vc3NsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcKLSNkZWZpbmUgY3VybHNzbF9zZXNzaW9uX2ZyZWUoeCkgQ3VybF9vc3NsX3Nlc3Npb25fZnJlZSh4KQotI2RlZmluZSBjdXJsc3NsX2Nsb3NlX2FsbCBDdXJsX29zc2xfY2xvc2VfYWxsCi0jZGVmaW5lIGN1cmxzc2xfY2xvc2UgQ3VybF9vc3NsX2Nsb3NlCi0jZGVmaW5lIGN1cmxzc2xfc2h1dGRvd24oeCx5KSBDdXJsX29zc2xfc2h1dGRvd24oeCx5KQotI2RlZmluZSBjdXJsc3NsX3NldF9lbmdpbmUoeCx5KSBDdXJsX29zc2xfc2V0X2VuZ2luZSh4LHkpCi0jZGVmaW5lIGN1cmxzc2xfc2V0X2VuZ2luZV9kZWZhdWx0KHgpIEN1cmxfb3NzbF9zZXRfZW5naW5lX2RlZmF1bHQoeCkKLSNkZWZpbmUgY3VybHNzbF9lbmdpbmVzX2xpc3QoeCkgQ3VybF9vc3NsX2VuZ2luZXNfbGlzdCh4KQotI2RlZmluZSBjdXJsc3NsX3ZlcnNpb24gQ3VybF9vc3NsX3ZlcnNpb24KLSNkZWZpbmUgY3VybHNzbF9jaGVja19jeG4gQ3VybF9vc3NsX2NoZWNrX2N4bgotI2RlZmluZSBjdXJsc3NsX2RhdGFfcGVuZGluZyh4LHkpIEN1cmxfb3NzbF9kYXRhX3BlbmRpbmcoeCx5KQotI2RlZmluZSBjdXJsc3NsX3JhbmRvbSh4LHkseikgQ3VybF9vc3NsX3JhbmRvbSh4LHkseikKLSNkZWZpbmUgY3VybHNzbF9tZDVzdW0oYSxiLGMsZCkgQ3VybF9vc3NsX21kNXN1bShhLGIsYyxkKQotI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MDA5MDgwMGZMKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX1NIQTI1NikKLSNkZWZpbmUgY3VybHNzbF9zaGEyNTZzdW0oYSxiLGMsZCkgQ3VybF9vc3NsX3NoYTI1NnN1bShhLGIsYyxkKQotI2VuZGlmCi0jZGVmaW5lIGN1cmxzc2xfY2VydF9zdGF0dXNfcmVxdWVzdCgpIEN1cmxfb3NzbF9jZXJ0X3N0YXR1c19yZXF1ZXN0KCkKLQotI2RlZmluZSBERUZBVUxUX0NJUEhFUl9TRUxFQ1RJT04gXAotICAiQUxMOiFFWFBPUlQ6IUVYUE9SVDQwOiFFWFBPUlQ1NjohYU5VTEw6IUxPVzohUkM0OkBTVFJFTkdUSCIKK2V4dGVybiBjb25zdCBzdHJ1Y3QgQ3VybF9zc2wgQ3VybF9zc2xfb3BlbnNzbDsKIAogI2VuZGlmIC8qIFVTRV9PUEVOU1NMICovCiAjZW5kaWYgLyogSEVBREVSX0NVUkxfU1NMVVNFX0ggKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvcG9sYXJzc2wuYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvcG9sYXJzc2wuYwppbmRleCA2NjkwOTFjLi5mYzA2NDRmIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3BvbGFyc3NsLmMKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9wb2xhcnNzbC5jCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMjAxMiAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICogQ29weXJpZ2h0IChDKSAyMDEwIC0gMjAxMSwgSG9pLUhvIENoYW4sIDxob2loby5jaGFuQGdtYWlsLmNvbT4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaApAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgImN1cmxfc2V0dXAuaCIKIAogI2lmZGVmIFVTRV9QT0xBUlNTTAotCiAjaW5jbHVkZSA8cG9sYXJzc2wvbmV0Lmg+CiAjaW5jbHVkZSA8cG9sYXJzc2wvc3NsLmg+CiAjaW5jbHVkZSA8cG9sYXJzc2wvY2VydHMuaD4KQEAgLTcwLDYgKzY5LDE5IEBACiAjZGVmaW5lIFBVQl9ERVJfTUFYX0JZVEVTICAgKFJTQV9QVUJfREVSX01BWF9CWVRFUyA+IEVDUF9QVUJfREVSX01BWF9CWVRFUyA/IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNBX1BVQl9ERVJfTUFYX0JZVEVTIDogRUNQX1BVQl9ERVJfTUFYX0JZVEVTKQogCitzdHJ1Y3Qgc3NsX2JhY2tlbmRfZGF0YSB7CisgIGN0cl9kcmJnX2NvbnRleHQgY3RyX2RyYmc7CisgIGVudHJvcHlfY29udGV4dCBlbnRyb3B5OworICBzc2xfY29udGV4dCBzc2w7CisgIGludCBzZXJ2ZXJfZmQ7CisgIHg1MDlfY3J0IGNhY2VydDsKKyAgeDUwOV9jcnQgY2xpY2VydDsKKyAgeDUwOV9jcmwgY3JsOworICByc2FfY29udGV4dCByc2E7Cit9OworCisjZGVmaW5lIEJBQ0tFTkQgY29ubnNzbC0+YmFja2VuZAorCiAvKiBhcHBseSB0aHJlYWRpbmc/ICovCiAjaWYgZGVmaW5lZChVU0VfVEhSRUFEU19QT1NJWCkgfHwgZGVmaW5lZChVU0VfVEhSRUFEU19XSU4zMikKICNkZWZpbmUgVEhSRUFESU5HX1NVUFBPUlQKQEAgLTE5Nyw4ICsyMDksOCBAQAogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KIAotICBzc2xfc2V0X21pbl92ZXJzaW9uKCZjb25uc3NsLT5zc2wsIFNTTF9NQUpPUl9WRVJTSU9OXzMsIHNzbF9taW5fdmVyKTsKLSAgc3NsX3NldF9tYXhfdmVyc2lvbigmY29ubnNzbC0+c3NsLCBTU0xfTUFKT1JfVkVSU0lPTl8zLCBzc2xfbWF4X3Zlcik7CisgIHNzbF9zZXRfbWluX3ZlcnNpb24oJkJBQ0tFTkQtPnNzbCwgU1NMX01BSk9SX1ZFUlNJT05fMywgc3NsX21pbl92ZXIpOworICBzc2xfc2V0X21heF92ZXJzaW9uKCZCQUNLRU5ELT5zc2wsIFNTTF9NQUpPUl9WRVJTSU9OXzMsIHNzbF9tYXhfdmVyKTsKIAogICByZXR1cm4gcmVzdWx0OwogfQpAQCAtMjE1LDcgKzIyNyw3IEBACiAgIGNvbnN0IGxvbmcgaW50IHBvcnQgPSBTU0xfSVNfUFJPWFkoKSA/IGNvbm4tPnBvcnQgOiBjb25uLT5yZW1vdGVfcG9ydDsKICAgaW50IHJldCA9IC0xOwogICBjaGFyIGVycm9yYnVmWzEyOF07Ci0gIGVycm9yYnVmWzBdPTA7CisgIGVycm9yYnVmWzBdID0gMDsKIAogICAvKiBQb2xhclNTTCBvbmx5IHN1cHBvcnRzIFNTTHYzIGFuZCBUTFN2MSAqLwogICBpZihTU0xfQ09OTl9DT05GSUcodmVyc2lvbikgPT0gQ1VSTF9TU0xWRVJTSU9OX1NTTHYyKSB7CkBAIC0yMjYsMTYgKzIzOCwxNiBAQAogI2lmZGVmIFRIUkVBRElOR19TVVBQT1JUCiAgIGVudHJvcHlfaW5pdF9tdXRleCgmZW50cm9weSk7CiAKLSAgaWYoKHJldCA9IGN0cl9kcmJnX2luaXQoJmNvbm5zc2wtPmN0cl9kcmJnLCBlbnRyb3B5X2Z1bmNfbXV0ZXgsICZlbnRyb3B5LAorICBpZigocmV0ID0gY3RyX2RyYmdfaW5pdCgmQkFDS0VORC0+Y3RyX2RyYmcsIGVudHJvcHlfZnVuY19tdXRleCwgJmVudHJvcHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDApKSAhPSAwKSB7CiAgICAgZXJyb3Jfc3RyZXJyb3IocmV0LCBlcnJvcmJ1Ziwgc2l6ZW9mKGVycm9yYnVmKSk7CiAgICAgZmFpbGYoZGF0YSwgIkZhaWxlZCAtIFBvbGFyU1NMOiBjdHJfZHJiZ19pbml0IHJldHVybmVkICgtMHglMDRYKSAlc1xuIiwKICAgICAgICAgICAtcmV0LCBlcnJvcmJ1Zik7CiAgIH0KICNlbHNlCi0gIGVudHJvcHlfaW5pdCgmY29ubnNzbC0+ZW50cm9weSk7CisgIGVudHJvcHlfaW5pdCgmQkFDS0VORC0+ZW50cm9weSk7CiAKLSAgaWYoKHJldCA9IGN0cl9kcmJnX2luaXQoJmNvbm5zc2wtPmN0cl9kcmJnLCBlbnRyb3B5X2Z1bmMsICZjb25uc3NsLT5lbnRyb3B5LAorICBpZigocmV0ID0gY3RyX2RyYmdfaW5pdCgmQkFDS0VORC0+Y3RyX2RyYmcsIGVudHJvcHlfZnVuYywgJkJBQ0tFTkQtPmVudHJvcHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDApKSAhPSAwKSB7CiAgICAgZXJyb3Jfc3RyZXJyb3IocmV0LCBlcnJvcmJ1Ziwgc2l6ZW9mKGVycm9yYnVmKSk7CiAgICAgZmFpbGYoZGF0YSwgIkZhaWxlZCAtIFBvbGFyU1NMOiBjdHJfZHJiZ19pbml0IHJldHVybmVkICgtMHglMDRYKSAlc1xuIiwKQEAgLTI0NCwxMCArMjU2LDEwIEBACiAjZW5kaWYgLyogVEhSRUFESU5HX1NVUFBPUlQgKi8KIAogICAvKiBMb2FkIHRoZSB0cnVzdGVkIENBICovCi0gIG1lbXNldCgmY29ubnNzbC0+Y2FjZXJ0LCAwLCBzaXplb2YoeDUwOV9jcnQpKTsKKyAgbWVtc2V0KCZCQUNLRU5ELT5jYWNlcnQsIDAsIHNpemVvZih4NTA5X2NydCkpOwogCiAgIGlmKFNTTF9DT05OX0NPTkZJRyhDQWZpbGUpKSB7Ci0gICAgcmV0ID0geDUwOV9jcnRfcGFyc2VfZmlsZSgmY29ubnNzbC0+Y2FjZXJ0LAorICAgIHJldCA9IHg1MDlfY3J0X3BhcnNlX2ZpbGUoJkJBQ0tFTkQtPmNhY2VydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9DT05OX0NPTkZJRyhDQWZpbGUpKTsKIAogICAgIGlmKHJldDwwKSB7CkBAIC0yNjEsNyArMjczLDcgQEAKICAgfQogCiAgIGlmKGNhcGF0aCkgewotICAgIHJldCA9IHg1MDlfY3J0X3BhcnNlX3BhdGgoJmNvbm5zc2wtPmNhY2VydCwgY2FwYXRoKTsKKyAgICByZXQgPSB4NTA5X2NydF9wYXJzZV9wYXRoKCZCQUNLRU5ELT5jYWNlcnQsIGNhcGF0aCk7CiAKICAgICBpZihyZXQ8MCkgewogICAgICAgZXJyb3Jfc3RyZXJyb3IocmV0LCBlcnJvcmJ1Ziwgc2l6ZW9mKGVycm9yYnVmKSk7CkBAIC0yNzQsMTAgKzI4NiwxMCBAQAogICB9CiAKICAgLyogTG9hZCB0aGUgY2xpZW50IGNlcnRpZmljYXRlICovCi0gIG1lbXNldCgmY29ubnNzbC0+Y2xpY2VydCwgMCwgc2l6ZW9mKHg1MDlfY3J0KSk7CisgIG1lbXNldCgmQkFDS0VORC0+Y2xpY2VydCwgMCwgc2l6ZW9mKHg1MDlfY3J0KSk7CiAKICAgaWYoU1NMX1NFVF9PUFRJT04oY2VydCkpIHsKLSAgICByZXQgPSB4NTA5X2NydF9wYXJzZV9maWxlKCZjb25uc3NsLT5jbGljZXJ0LAorICAgIHJldCA9IHg1MDlfY3J0X3BhcnNlX2ZpbGUoJkJBQ0tFTkQtPmNsaWNlcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfU0VUX09QVElPTihjZXJ0KSk7CiAKICAgICBpZihyZXQpIHsKQEAgLTI5OCw5ICszMTAsOSBAQAogICAgIGlmKHJldCA9PSAwICYmICFwa19jYW5fZG8oJnBrLCBQT0xBUlNTTF9QS19SU0EpKQogICAgICAgcmV0ID0gUE9MQVJTU0xfRVJSX1BLX1RZUEVfTUlTTUFUQ0g7CiAgICAgaWYocmV0ID09IDApCi0gICAgICByc2FfY29weSgmY29ubnNzbC0+cnNhLCBwa19yc2EocGspKTsKKyAgICAgIHJzYV9jb3B5KCZCQUNLRU5ELT5yc2EsIHBrX3JzYShwaykpOwogICAgIGVsc2UKLSAgICAgIHJzYV9mcmVlKCZjb25uc3NsLT5yc2EpOworICAgICAgcnNhX2ZyZWUoJkJBQ0tFTkQtPnJzYSk7CiAgICAgcGtfZnJlZSgmcGspOwogCiAgICAgaWYocmV0KSB7CkBAIC0zMTMsMTAgKzMyNSwxMCBAQAogICB9CiAKICAgLyogTG9hZCB0aGUgQ1JMICovCi0gIG1lbXNldCgmY29ubnNzbC0+Y3JsLCAwLCBzaXplb2YoeDUwOV9jcmwpKTsKKyAgbWVtc2V0KCZCQUNLRU5ELT5jcmwsIDAsIHNpemVvZih4NTA5X2NybCkpOwogCiAgIGlmKFNTTF9TRVRfT1BUSU9OKENSTGZpbGUpKSB7Ci0gICAgcmV0ID0geDUwOV9jcmxfcGFyc2VfZmlsZSgmY29ubnNzbC0+Y3JsLAorICAgIHJldCA9IHg1MDlfY3JsX3BhcnNlX2ZpbGUoJkJBQ0tFTkQtPmNybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9TRVRfT1BUSU9OKENSTGZpbGUpKTsKIAogICAgIGlmKHJldCkgewpAQCAtMzMwLDcgKzM0Miw3IEBACiAKICAgaW5mb2YoZGF0YSwgIlBvbGFyU1NMOiBDb25uZWN0aW5nIHRvICVzOiVkXG4iLCBob3N0bmFtZSwgcG9ydCk7CiAKLSAgaWYoc3NsX2luaXQoJmNvbm5zc2wtPnNzbCkpIHsKKyAgaWYoc3NsX2luaXQoJkJBQ0tFTkQtPnNzbCkpIHsKICAgICBmYWlsZihkYXRhLCAiUG9sYXJTU0w6IHNzbF9pbml0IGZhaWxlZCIpOwogICAgIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKICAgfQpAQCAtMzM4LDEzICszNTAsMTMgQEAKICAgc3dpdGNoKFNTTF9DT05OX0NPTkZJRyh2ZXJzaW9uKSkgewogICBjYXNlIENVUkxfU1NMVkVSU0lPTl9ERUZBVUxUOgogICBjYXNlIENVUkxfU1NMVkVSU0lPTl9UTFN2MToKLSAgICBzc2xfc2V0X21pbl92ZXJzaW9uKCZjb25uc3NsLT5zc2wsIFNTTF9NQUpPUl9WRVJTSU9OXzMsCisgICAgc3NsX3NldF9taW5fdmVyc2lvbigmQkFDS0VORC0+c3NsLCBTU0xfTUFKT1JfVkVSU0lPTl8zLAogICAgICAgICAgICAgICAgICAgICAgICAgU1NMX01JTk9SX1ZFUlNJT05fMSk7CiAgICAgYnJlYWs7CiAgIGNhc2UgQ1VSTF9TU0xWRVJTSU9OX1NTTHYzOgotICAgIHNzbF9zZXRfbWluX3ZlcnNpb24oJmNvbm5zc2wtPnNzbCwgU1NMX01BSk9SX1ZFUlNJT05fMywKKyAgICBzc2xfc2V0X21pbl92ZXJzaW9uKCZCQUNLRU5ELT5zc2wsIFNTTF9NQUpPUl9WRVJTSU9OXzMsCiAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfTUlOT1JfVkVSU0lPTl8wKTsKLSAgICBzc2xfc2V0X21heF92ZXJzaW9uKCZjb25uc3NsLT5zc2wsIFNTTF9NQUpPUl9WRVJTSU9OXzMsCisgICAgc3NsX3NldF9tYXhfdmVyc2lvbigmQkFDS0VORC0+c3NsLCBTU0xfTUFKT1JfVkVSU0lPTl8zLAogICAgICAgICAgICAgICAgICAgICAgICAgU1NMX01JTk9SX1ZFUlNJT05fMCk7CiAgICAgaW5mb2YoZGF0YSwgIlBvbGFyU1NMOiBGb3JjZWQgbWluLiBTU0wgVmVyc2lvbiB0byBiZSBTU0x2M1xuIik7CiAgICAgYnJlYWs7CkBAIC0zNjMsMTYgKzM3NSwxNiBAQAogICAgIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKICAgfQogCi0gIHNzbF9zZXRfZW5kcG9pbnQoJmNvbm5zc2wtPnNzbCwgU1NMX0lTX0NMSUVOVCk7Ci0gIHNzbF9zZXRfYXV0aG1vZGUoJmNvbm5zc2wtPnNzbCwgU1NMX1ZFUklGWV9PUFRJT05BTCk7CisgIHNzbF9zZXRfZW5kcG9pbnQoJkJBQ0tFTkQtPnNzbCwgU1NMX0lTX0NMSUVOVCk7CisgIHNzbF9zZXRfYXV0aG1vZGUoJkJBQ0tFTkQtPnNzbCwgU1NMX1ZFUklGWV9PUFRJT05BTCk7CiAKLSAgc3NsX3NldF9ybmcoJmNvbm5zc2wtPnNzbCwgY3RyX2RyYmdfcmFuZG9tLAotICAgICAgICAgICAgICAmY29ubnNzbC0+Y3RyX2RyYmcpOwotICBzc2xfc2V0X2JpbygmY29ubnNzbC0+c3NsLAorICBzc2xfc2V0X3JuZygmQkFDS0VORC0+c3NsLCBjdHJfZHJiZ19yYW5kb20sCisgICAgICAgICAgICAgICZCQUNLRU5ELT5jdHJfZHJiZyk7CisgIHNzbF9zZXRfYmlvKCZCQUNLRU5ELT5zc2wsCiAgICAgICAgICAgICAgIG5ldF9yZWN2LCAmY29ubi0+c29ja1tzb2NraW5kZXhdLAogICAgICAgICAgICAgICBuZXRfc2VuZCwgJmNvbm4tPnNvY2tbc29ja2luZGV4XSk7CiAKLSAgc3NsX3NldF9jaXBoZXJzdWl0ZXMoJmNvbm5zc2wtPnNzbCwgc3NsX2xpc3RfY2lwaGVyc3VpdGVzKCkpOworICBzc2xfc2V0X2NpcGhlcnN1aXRlcygmQkFDS0VORC0+c3NsLCBzc2xfbGlzdF9jaXBoZXJzdWl0ZXMoKSk7CiAKICAgLyogQ2hlY2sgaWYgdGhlcmUncyBhIGNhY2hlZCBJRCB3ZSBjYW4vc2hvdWxkIHVzZSBoZXJlISAqLwogICBpZihTU0xfU0VUX09QVElPTihwcmltYXJ5LnNlc3Npb25pZCkpIHsKQEAgLTM4MCw3ICszOTIsNyBAQAogCiAgICAgQ3VybF9zc2xfc2Vzc2lvbmlkX2xvY2soY29ubik7CiAgICAgaWYoIUN1cmxfc3NsX2dldHNlc3Npb25pZChjb25uLCAmb2xkX3Nlc3Npb24sIE5VTEwsIHNvY2tpbmRleCkpIHsKLSAgICAgIHJldCA9IHNzbF9zZXRfc2Vzc2lvbigmY29ubnNzbC0+c3NsLCBvbGRfc2Vzc2lvbik7CisgICAgICByZXQgPSBzc2xfc2V0X3Nlc3Npb24oJkJBQ0tFTkQtPnNzbCwgb2xkX3Nlc3Npb24pOwogICAgICAgaWYocmV0KSB7CiAgICAgICAgIEN1cmxfc3NsX3Nlc3Npb25pZF91bmxvY2soY29ubik7CiAgICAgICAgIGZhaWxmKGRhdGEsICJzc2xfc2V0X3Nlc3Npb24gcmV0dXJuZWQgLTB4JXgiLCAtcmV0KTsKQEAgLTM5MSwxNSArNDAzLDE1IEBACiAgICAgQ3VybF9zc2xfc2Vzc2lvbmlkX3VubG9jayhjb25uKTsKICAgfQogCi0gIHNzbF9zZXRfY2FfY2hhaW4oJmNvbm5zc2wtPnNzbCwKLSAgICAgICAgICAgICAgICAgICAmY29ubnNzbC0+Y2FjZXJ0LAotICAgICAgICAgICAgICAgICAgICZjb25uc3NsLT5jcmwsCisgIHNzbF9zZXRfY2FfY2hhaW4oJkJBQ0tFTkQtPnNzbCwKKyAgICAgICAgICAgICAgICAgICAmQkFDS0VORC0+Y2FjZXJ0LAorICAgICAgICAgICAgICAgICAgICZCQUNLRU5ELT5jcmwsCiAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWUpOwogCi0gIHNzbF9zZXRfb3duX2NlcnRfcnNhKCZjb25uc3NsLT5zc2wsCi0gICAgICAgICAgICAgICAgICAgICAgICZjb25uc3NsLT5jbGljZXJ0LCAmY29ubnNzbC0+cnNhKTsKKyAgc3NsX3NldF9vd25fY2VydF9yc2EoJkJBQ0tFTkQtPnNzbCwKKyAgICAgICAgICAgICAgICAgICAgICAgJkJBQ0tFTkQtPmNsaWNlcnQsICZCQUNLRU5ELT5yc2EpOwogCi0gIGlmKHNzbF9zZXRfaG9zdG5hbWUoJmNvbm5zc2wtPnNzbCwgaG9zdG5hbWUpKSB7CisgIGlmKHNzbF9zZXRfaG9zdG5hbWUoJkJBQ0tFTkQtPnNzbCwgaG9zdG5hbWUpKSB7CiAgICAgLyogc3NsX3NldF9ob3N0bmFtZSgpIHNldHMgdGhlIG5hbWUgdG8gdXNlIGluIENOL1NBTiBjaGVja3MgKmFuZCogdGhlIG5hbWUKICAgICAgICB0byBzZXQgaW4gdGhlIFNOSSBleHRlbnNpb24uIFNvIGV2ZW4gaWYgY3VybCBjb25uZWN0cyB0byBhIGhvc3QKICAgICAgICBzcGVjaWZpZWQgYXMgYW4gSVAgYWRkcmVzcywgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQuICovCkBAIC00MjQsMTIgKzQzNiwxMiBAQAogCiAgICAgcHJvdG9jb2xzW2N1cl0gPSBOVUxMOwogCi0gICAgc3NsX3NldF9hbHBuX3Byb3RvY29scygmY29ubnNzbC0+c3NsLCBwcm90b2NvbHMpOworICAgIHNzbF9zZXRfYWxwbl9wcm90b2NvbHMoJkJBQ0tFTkQtPnNzbCwgcHJvdG9jb2xzKTsKICAgfQogI2VuZGlmCiAKICNpZmRlZiBQT0xBUlNTTF9ERUJVRwotICBzc2xfc2V0X2RiZygmY29ubnNzbC0+c3NsLCBwb2xhcnNzbF9kZWJ1ZywgZGF0YSk7CisgIHNzbF9zZXRfZGJnKCZCQUNLRU5ELT5zc2wsIHBvbGFyc3NsX2RlYnVnLCBkYXRhKTsKICNlbmRpZgogCiAgIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPSBzc2xfY29ubmVjdF8yOwpAQCAtNDU2LDcgKzQ2OCw3IEBACiAgIGNvbm4tPnJlY3Zbc29ja2luZGV4XSA9IHBvbGFyc3NsX3JlY3Y7CiAgIGNvbm4tPnNlbmRbc29ja2luZGV4XSA9IHBvbGFyc3NsX3NlbmQ7CiAKLSAgcmV0ID0gc3NsX2hhbmRzaGFrZSgmY29ubnNzbC0+c3NsKTsKKyAgcmV0ID0gc3NsX2hhbmRzaGFrZSgmQkFDS0VORC0+c3NsKTsKIAogICBzd2l0Y2gocmV0KSB7CiAgIGNhc2UgMDoKQEAgLTQ3OCw5ICs0OTAsOSBAQAogICB9CiAKICAgaW5mb2YoZGF0YSwgIlBvbGFyU1NMOiBIYW5kc2hha2UgY29tcGxldGUsIGNpcGhlciBpcyAlc1xuIiwKLSAgICAgICAgc3NsX2dldF9jaXBoZXJzdWl0ZSgmY29ubi0+c3NsW3NvY2tpbmRleF0uc3NsKSApOworICAgICAgICBzc2xfZ2V0X2NpcGhlcnN1aXRlKCZCQUNLRU5ELT5zc2wpICk7CiAKLSAgcmV0ID0gc3NsX2dldF92ZXJpZnlfcmVzdWx0KCZjb25uLT5zc2xbc29ja2luZGV4XS5zc2wpOworICByZXQgPSBzc2xfZ2V0X3ZlcmlmeV9yZXN1bHQoJkJBQ0tFTkQtPnNzbCk7CiAKICAgaWYocmV0ICYmIFNTTF9DT05OX0NPTkZJRyh2ZXJpZnlwZWVyKSkgewogICAgIGlmKHJldCAmIEJBRENFUlRfRVhQSVJFRCkKQEAgLTUwMCwxMiArNTEyLDEyIEBACiAgICAgcmV0dXJuIENVUkxFX1BFRVJfRkFJTEVEX1ZFUklGSUNBVElPTjsKICAgfQogCi0gIGlmKHNzbF9nZXRfcGVlcl9jZXJ0KCYoY29ubnNzbC0+c3NsKSkpIHsKKyAgaWYoc3NsX2dldF9wZWVyX2NlcnQoJihCQUNLRU5ELT5zc2wpKSkgewogICAgIC8qIElmIHRoZSBzZXNzaW9uIHdhcyByZXN1bWVkLCB0aGVyZSB3aWxsIGJlIG5vIHBlZXIgY2VydHMgKi8KICAgICBtZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSk7CiAKICAgICBpZih4NTA5X2NydF9pbmZvKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIChjaGFyICopIiogIiwKLSAgICAgICAgICAgICAgICAgICAgIHNzbF9nZXRfcGVlcl9jZXJ0KCYoY29ubnNzbC0+c3NsKSkpICE9IC0xKQorICAgICAgICAgICAgICAgICAgICAgc3NsX2dldF9wZWVyX2NlcnQoJihCQUNLRU5ELT5zc2wpKSkgIT0gLTEpCiAgICAgICBpbmZvZihkYXRhLCAiRHVtcGluZyBjZXJ0IGluZm86XG4lc1xuIiwgYnVmZmVyKTsKICAgfQogCkBAIC01MTcsNyArNTI5LDcgQEAKICAgICB1bnNpZ25lZCBjaGFyIHB1YmtleVtQVUJfREVSX01BWF9CWVRFU107CiAgICAgY29uc3QgeDUwOV9jcnQgKnBlZXJjZXJ0OwogCi0gICAgcGVlcmNlcnQgPSBzc2xfZ2V0X3BlZXJfY2VydCgmY29ubnNzbC0+c3NsKTsKKyAgICBwZWVyY2VydCA9IHNzbF9nZXRfcGVlcl9jZXJ0KCZCQUNLRU5ELT5zc2wpOwogCiAgICAgaWYoIXBlZXJjZXJ0IHx8ICFwZWVyY2VydC0+cmF3LnAgfHwgIXBlZXJjZXJ0LT5yYXcubGVuKSB7CiAgICAgICBmYWlsZihkYXRhLCAiRmFpbGVkIGR1ZSB0byBtaXNzaW5nIHBlZXIgY2VydGlmaWNhdGUiKTsKQEAgLTU2Niw3ICs1NzgsNyBAQAogCiAjaWZkZWYgSEFTX0FMUE4KICAgaWYoY29ubi0+Yml0cy50bHNfZW5hYmxlX2FscG4pIHsKLSAgICBjb25zdCBjaGFyICpuZXh0X3Byb3RvY29sID0gc3NsX2dldF9hbHBuX3Byb3RvY29sKCZjb25uc3NsLT5zc2wpOworICAgIGNvbnN0IGNoYXIgKm5leHRfcHJvdG9jb2wgPSBzc2xfZ2V0X2FscG5fcHJvdG9jb2woJkJBQ0tFTkQtPnNzbCk7CiAKICAgICBpZihuZXh0X3Byb3RvY29sICE9IE5VTEwpIHsKICAgICAgIGluZm9mKGRhdGEsICJBTFBOLCBzZXJ2ZXIgYWNjZXB0ZWQgdG8gdXNlICVzXG4iLCBuZXh0X3Byb3RvY29sKTsKQEAgLTYxNCw3ICs2MjYsNyBAQAogCiAgICAgbWVtc2V0KG91cl9zc2xfc2Vzc2lvbmlkLCAwLCBzaXplb2Yoc3NsX3Nlc3Npb24pKTsKIAotICAgIHJldCA9IHNzbF9nZXRfc2Vzc2lvbigmY29ubnNzbC0+c3NsLCBvdXJfc3NsX3Nlc3Npb25pZCk7CisgICAgcmV0ID0gc3NsX2dldF9zZXNzaW9uKCZCQUNLRU5ELT5zc2wsIG91cl9zc2xfc2Vzc2lvbmlkKTsKICAgICBpZihyZXQpIHsKICAgICAgIGZhaWxmKGRhdGEsICJzc2xfZ2V0X3Nlc3Npb24gcmV0dXJuZWQgLTB4JXgiLCAtcmV0KTsKICAgICAgIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKQEAgLTY0NSw5ICs2NTcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTGNvZGUgKmN1cmxjb2RlKQogeworICBzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCA9ICZjb25uLT5zc2xbc29ja2luZGV4XTsKICAgaW50IHJldCA9IC0xOwogCi0gIHJldCA9IHNzbF93cml0ZSgmY29ubi0+c3NsW3NvY2tpbmRleF0uc3NsLAorICByZXQgPSBzc2xfd3JpdGUoJkJBQ0tFTkQtPnNzbCwKICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopbWVtLCBsZW4pOwogCiAgIGlmKHJldCA8IDApIHsKQEAgLTY1OSwxMyArNjcyLDE0IEBACiAgIHJldHVybiByZXQ7CiB9CiAKLXZvaWQgQ3VybF9wb2xhcnNzbF9jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCitzdGF0aWMgdm9pZCBDdXJsX3BvbGFyc3NsX2Nsb3NlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKLSAgcnNhX2ZyZWUoJmNvbm4tPnNzbFtzb2NraW5kZXhdLnJzYSk7Ci0gIHg1MDlfY3J0X2ZyZWUoJmNvbm4tPnNzbFtzb2NraW5kZXhdLmNsaWNlcnQpOwotICB4NTA5X2NydF9mcmVlKCZjb25uLT5zc2xbc29ja2luZGV4XS5jYWNlcnQpOwotICB4NTA5X2NybF9mcmVlKCZjb25uLT5zc2xbc29ja2luZGV4XS5jcmwpOwotICBzc2xfZnJlZSgmY29ubi0+c3NsW3NvY2tpbmRleF0uc3NsKTsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CisgIHJzYV9mcmVlKCZCQUNLRU5ELT5yc2EpOworICB4NTA5X2NydF9mcmVlKCZCQUNLRU5ELT5jbGljZXJ0KTsKKyAgeDUwOV9jcnRfZnJlZSgmQkFDS0VORC0+Y2FjZXJ0KTsKKyAgeDUwOV9jcmxfZnJlZSgmQkFDS0VORC0+Y3JsKTsKKyAgc3NsX2ZyZWUoJkJBQ0tFTkQtPnNzbCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHBvbGFyc3NsX3JlY3Yoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLApAQCAtNjc0LDExICs2ODgsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlcnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxjb2RlICpjdXJsY29kZSkKIHsKKyAgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW251bV07CiAgIGludCByZXQgPSAtMTsKICAgc3NpemVfdCBsZW4gPSAtMTsKIAogICBtZW1zZXQoYnVmLCAwLCBidWZmZXJzaXplKTsKLSAgcmV0ID0gc3NsX3JlYWQoJmNvbm4tPnNzbFtudW1dLnNzbCwgKHVuc2lnbmVkIGNoYXIgKilidWYsIGJ1ZmZlcnNpemUpOworICByZXQgPSBzc2xfcmVhZCgmQkFDS0VORC0+c3NsLCAodW5zaWduZWQgY2hhciAqKWJ1ZiwgYnVmZmVyc2l6ZSk7CiAKICAgaWYocmV0IDw9IDApIHsKICAgICBpZihyZXQgPT0gUE9MQVJTU0xfRVJSX1NTTF9QRUVSX0NMT1NFX05PVElGWSkKQEAgLTY5NCw3ICs3MDksNyBAQAogICByZXR1cm4gbGVuOwogfQogCi12b2lkIEN1cmxfcG9sYXJzc2xfc2Vzc2lvbl9mcmVlKHZvaWQgKnB0cikKK3N0YXRpYyB2b2lkIEN1cmxfcG9sYXJzc2xfc2Vzc2lvbl9mcmVlKHZvaWQgKnB0cikKIHsKICAgc3NsX3Nlc3Npb25fZnJlZShwdHIpOwogICBmcmVlKHB0cik7CkBAIC03MDMsNyArNzE4LDcgQEAKIC8qIDEuMy4xMCB3YXMgdGhlIGZpcnN0IHJlYnJhbmRlZCB2ZXJzaW9uLiBBbGwgbmV3IHJlbGVhc2VzIChpbiAxLjMgYnJhbmNoIGFuZAogICAgaGlnaGVyKSB3aWxsIGJlIG1iZWQgVExTIGJyYW5kZWQuLiAqLwogCi1zaXplX3QgQ3VybF9wb2xhcnNzbF92ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCitzdGF0aWMgc2l6ZV90IEN1cmxfcG9sYXJzc2xfdmVyc2lvbihjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQogewogICB1bnNpZ25lZCBpbnQgdmVyc2lvbiA9IHZlcnNpb25fZ2V0X251bWJlcigpOwogICByZXR1cm4gc25wcmludGYoYnVmZmVyLCBzaXplLCAiJXMvJWQuJWQuJWQiLApAQCAtNzYyLDkgKzc3Nyw5IEBACiAgICAgaWYoY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSA9PSBzc2xfY29ubmVjdF8yX3JlYWRpbmcgfHwKICAgICAgICBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlID09IHNzbF9jb25uZWN0XzJfd3JpdGluZykgewogCi0gICAgICBjdXJsX3NvY2tldF90IHdyaXRlZmQgPSBzc2xfY29ubmVjdF8yX3dyaXRpbmc9PQorICAgICAgY3VybF9zb2NrZXRfdCB3cml0ZWZkID0gc3NsX2Nvbm5lY3RfMl93cml0aW5nID09CiAgICAgICAgIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGU/c29ja2ZkOkNVUkxfU09DS0VUX0JBRDsKLSAgICAgIGN1cmxfc29ja2V0X3QgcmVhZGZkID0gc3NsX2Nvbm5lY3RfMl9yZWFkaW5nPT0KKyAgICAgIGN1cmxfc29ja2V0X3QgcmVhZGZkID0gc3NsX2Nvbm5lY3RfMl9yZWFkaW5nID09CiAgICAgICAgIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGU/c29ja2ZkOkNVUkxfU09DS0VUX0JBRDsKIAogICAgICAgd2hhdCA9IEN1cmxfc29ja2V0X2NoZWNrKHJlYWRmZCwgQ1VSTF9TT0NLRVRfQkFELCB3cml0ZWZkLApAQCAtODI1LDE4ICs4NDAsMTQgQEAKICAgcmV0dXJuIENVUkxFX09LOwogfQogCi1DVVJMY29kZQotQ3VybF9wb2xhcnNzbF9jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmRvbmUpCitzdGF0aWMgQ1VSTGNvZGUgQ3VybF9wb2xhcnNzbF9jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCwgYm9vbCAqZG9uZSkKIHsKICAgcmV0dXJuIHBvbGFyc3NsX2Nvbm5lY3RfY29tbW9uKGNvbm4sIHNvY2tpbmRleCwgVFJVRSwgZG9uZSk7CiB9CiAKIAotQ1VSTGNvZGUKLUN1cmxfcG9sYXJzc2xfY29ubmVjdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCkKK3N0YXRpYyBDVVJMY29kZSBDdXJsX3BvbGFyc3NsX2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQogewogICBDVVJMY29kZSByZXN1bHQ7CiAgIGJvb2wgZG9uZSA9IEZBTFNFOwpAQCAtODU0LDIwICs4NjUsNzMgQEAKICAqIHJldHVybiAwIGVycm9yIGluaXRpYWxpemluZyBTU0wKICAqIHJldHVybiAxIFNTTCBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkKICAqLwotaW50IEN1cmxfcG9sYXJzc2xfaW5pdCh2b2lkKQorc3RhdGljIGludCBDdXJsX3BvbGFyc3NsX2luaXQodm9pZCkKIHsKICAgcmV0dXJuIEN1cmxfcG9sYXJzc2x0aHJlYWRsb2NrX3RocmVhZF9zZXR1cCgpOwogfQogCi12b2lkIEN1cmxfcG9sYXJzc2xfY2xlYW51cCh2b2lkKQorc3RhdGljIHZvaWQgQ3VybF9wb2xhcnNzbF9jbGVhbnVwKHZvaWQpCiB7CiAgICh2b2lkKUN1cmxfcG9sYXJzc2x0aHJlYWRsb2NrX3RocmVhZF9jbGVhbnVwKCk7CiB9CiAKLQotaW50IEN1cmxfcG9sYXJzc2xfZGF0YV9wZW5kaW5nKGNvbnN0IHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKK3N0YXRpYyBib29sIEN1cmxfcG9sYXJzc2xfZGF0YV9wZW5kaW5nKGNvbnN0IHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgpCiB7Ci0gIHJldHVybiBzc2xfZ2V0X2J5dGVzX2F2YWlsKCZjb25uLT5zc2xbc29ja2luZGV4XS5zc2wpICE9IDA7CisgIGNvbnN0IHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsID0gJmNvbm4tPnNzbFtzb2NraW5kZXhdOworICByZXR1cm4gc3NsX2dldF9ieXRlc19hdmFpbCgmQkFDS0VORC0+c3NsKSAhPSAwOwogfQogCitzdGF0aWMgdm9pZCBDdXJsX3BvbGFyc3NsX3NoYTI1NnN1bShjb25zdCB1bnNpZ25lZCBjaGFyICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbnB1dGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNoYTI1NnN1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaGEyNTZsZW4gVU5VU0VEX1BBUkFNKQoreworICAodm9pZClzaGEyNTZsZW47CisgIHNoYTI1NihpbnB1dCwgaW5wdXRsZW4sIHNoYTI1NnN1bSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkICpDdXJsX3BvbGFyc3NsX2dldF9pbnRlcm5hbHMoc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxJTkZPIGluZm8gVU5VU0VEX1BBUkFNKQoreworICAodm9pZClpbmZvOworICByZXR1cm4gJkJBQ0tFTkQtPnNzbDsKK30KKworY29uc3Qgc3RydWN0IEN1cmxfc3NsIEN1cmxfc3NsX3BvbGFyc3NsID0geworICB7IENVUkxTU0xCQUNLRU5EX1BPTEFSU1NMLCAicG9sYXJzc2wiIH0sIC8qIGluZm8gKi8KKworICAxLCAvKiBoYXZlX2NhX3BhdGggKi8KKyAgMCwgLyogaGF2ZV9jZXJ0aW5mbyAqLworICAxLCAvKiBoYXZlX3Bpbm5lZHB1YmtleSAqLworICAwLCAvKiBoYXZlX3NzbF9jdHggKi8KKyAgMCwgLyogc3VwcG9ydF9odHRwc19wcm94eSAqLworCisgIHNpemVvZihzdHJ1Y3Qgc3NsX2JhY2tlbmRfZGF0YSksCisKKyAgQ3VybF9wb2xhcnNzbF9pbml0LCAgICAgICAgICAgICAgICAvKiBpbml0ICovCisgIEN1cmxfcG9sYXJzc2xfY2xlYW51cCwgICAgICAgICAgICAgLyogY2xlYW51cCAqLworICBDdXJsX3BvbGFyc3NsX3ZlcnNpb24sICAgICAgICAgICAgIC8qIHZlcnNpb24gKi8KKyAgQ3VybF9ub25lX2NoZWNrX2N4biwgICAgICAgICAgICAgICAvKiBjaGVja19jeG4gKi8KKyAgQ3VybF9ub25lX3NodXRkb3duLCAgICAgICAgICAgICAgICAvKiBzaHV0ZG93biAqLworICBDdXJsX3BvbGFyc3NsX2RhdGFfcGVuZGluZywgICAgICAgIC8qIGRhdGFfcGVuZGluZyAqLworICAvKiBUaGlzIG1pZ2h0IGNhdXNlIGxpYmN1cmwgdG8gdXNlIGEgd2Vla2VyIHJhbmRvbSEKKyAgICogVE9ETzogdXNlIFBvbGFyc3NsJ3MgQ1RSLURSQkcgb3IgSE1BQy1EUkJHCisgICovCisgIEN1cmxfbm9uZV9yYW5kb20sICAgICAgICAgICAgICAgICAgLyogcmFuZG9tICovCisgIEN1cmxfbm9uZV9jZXJ0X3N0YXR1c19yZXF1ZXN0LCAgICAgLyogY2VydF9zdGF0dXNfcmVxdWVzdCAqLworICBDdXJsX3BvbGFyc3NsX2Nvbm5lY3QsICAgICAgICAgICAgIC8qIGNvbm5lY3QgKi8KKyAgQ3VybF9wb2xhcnNzbF9jb25uZWN0X25vbmJsb2NraW5nLCAvKiBjb25uZWN0X25vbmJsb2NraW5nICovCisgIEN1cmxfcG9sYXJzc2xfZ2V0X2ludGVybmFscywgICAgICAgLyogZ2V0X2ludGVybmFscyAqLworICBDdXJsX3BvbGFyc3NsX2Nsb3NlLCAgICAgICAgICAgICAgIC8qIGNsb3NlICovCisgIEN1cmxfbm9uZV9jbG9zZV9hbGwsICAgICAgICAgICAgICAgLyogY2xvc2VfYWxsICovCisgIEN1cmxfcG9sYXJzc2xfc2Vzc2lvbl9mcmVlLCAgICAgICAgLyogc2Vzc2lvbl9mcmVlICovCisgIEN1cmxfbm9uZV9zZXRfZW5naW5lLCAgICAgICAgICAgICAgLyogc2V0X2VuZ2luZSAqLworICBDdXJsX25vbmVfc2V0X2VuZ2luZV9kZWZhdWx0LCAgICAgIC8qIHNldF9lbmdpbmVfZGVmYXVsdCAqLworICBDdXJsX25vbmVfZW5naW5lc19saXN0LCAgICAgICAgICAgIC8qIGVuZ2luZXNfbGlzdCAqLworICBDdXJsX25vbmVfZmFsc2Vfc3RhcnQsICAgICAgICAgICAgIC8qIGZhbHNlX3N0YXJ0ICovCisgIEN1cmxfbm9uZV9tZDVzdW0sICAgICAgICAgICAgICAgICAgLyogbWQ1c3VtICovCisgIEN1cmxfcG9sYXJzc2xfc2hhMjU2c3VtICAgICAgICAgICAgLyogc2hhMjU2c3VtICovCit9OworCiAjZW5kaWYgLyogVVNFX1BPTEFSU1NMICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3BvbGFyc3NsLmggYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3BvbGFyc3NsLmgKaW5kZXggNDdhZjdiNC4uMjNjMzYzNiAxMDA2NDQKLS0tIGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9wb2xhcnNzbC5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvcG9sYXJzc2wuaApAQCAtMjYsNTcgKzI2LDcgQEAKIAogI2lmZGVmIFVTRV9QT0xBUlNTTAogCi0jaW5jbHVkZSA8cG9sYXJzc2wvc2hhMjU2Lmg+Ci0KLS8qIENhbGxlZCBvbiBmaXJzdCB1c2UgUG9sYXJTU0wsIHNldHVwIHRocmVhZGluZyBpZiBzdXBwb3J0ZWQgKi8KLWludCAgQ3VybF9wb2xhcnNzbF9pbml0KHZvaWQpOwotdm9pZCBDdXJsX3BvbGFyc3NsX2NsZWFudXAodm9pZCk7Ci1pbnQgQ3VybF9wb2xhcnNzbF9kYXRhX3BlbmRpbmcoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLQotCi1DVVJMY29kZSBDdXJsX3BvbGFyc3NsX2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLQotQ1VSTGNvZGUgQ3VybF9wb2xhcnNzbF9jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmRvbmUpOwotCi0gLyogY2xvc2UgYSBTU0wgY29ubmVjdGlvbiAqLwotdm9pZCBDdXJsX3BvbGFyc3NsX2Nsb3NlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7Ci0KLXZvaWQgQ3VybF9wb2xhcnNzbF9zZXNzaW9uX2ZyZWUodm9pZCAqcHRyKTsKLXNpemVfdCBDdXJsX3BvbGFyc3NsX3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci1pbnQgQ3VybF9wb2xhcnNzbF9zaHV0ZG93bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOwotCi0vKiBTZXQgdGhlIEFQSSBiYWNrZW5kIGRlZmluaXRpb24gdG8gUG9sYXJTU0wgKi8KLSNkZWZpbmUgQ1VSTF9TU0xfQkFDS0VORCBDVVJMU1NMQkFDS0VORF9QT0xBUlNTTAotCi0vKiB0aGlzIGJhY2tlbmQgc3VwcG9ydHMgdGhlIENBUEFUSCBvcHRpb24gKi8KLSNkZWZpbmUgaGF2ZV9jdXJsc3NsX2NhX3BhdGggMQotCi0vKiB0aGlzIGJhY2tlbmRzIHN1cHBvcnRzIENVUkxPUFRfUElOTkVEUFVCTElDS0VZICovCi0jZGVmaW5lIGhhdmVfY3VybHNzbF9waW5uZWRwdWJrZXkgMQotCi0vKiBBUEkgc2V0dXAgZm9yIFBvbGFyU1NMICovCi0jZGVmaW5lIGN1cmxzc2xfaW5pdCgpIEN1cmxfcG9sYXJzc2xfaW5pdCgpCi0jZGVmaW5lIGN1cmxzc2xfY2xlYW51cCgpIEN1cmxfcG9sYXJzc2xfY2xlYW51cCgpCi0jZGVmaW5lIGN1cmxzc2xfY29ubmVjdCBDdXJsX3BvbGFyc3NsX2Nvbm5lY3QKLSNkZWZpbmUgY3VybHNzbF9jb25uZWN0X25vbmJsb2NraW5nIEN1cmxfcG9sYXJzc2xfY29ubmVjdF9ub25ibG9ja2luZwotI2RlZmluZSBjdXJsc3NsX3Nlc3Npb25fZnJlZSh4KSAgQ3VybF9wb2xhcnNzbF9zZXNzaW9uX2ZyZWUoeCkKLSNkZWZpbmUgY3VybHNzbF9jbG9zZV9hbGwoeCkgKCh2b2lkKXgpCi0jZGVmaW5lIGN1cmxzc2xfY2xvc2UgQ3VybF9wb2xhcnNzbF9jbG9zZQotI2RlZmluZSBjdXJsc3NsX3NodXRkb3duKHgseSkgMAotI2RlZmluZSBjdXJsc3NsX3NldF9lbmdpbmUoeCx5KSAoKHZvaWQpeCwgKHZvaWQpeSwgQ1VSTEVfTk9UX0JVSUxUX0lOKQotI2RlZmluZSBjdXJsc3NsX3NldF9lbmdpbmVfZGVmYXVsdCh4KSAoKHZvaWQpeCwgQ1VSTEVfTk9UX0JVSUxUX0lOKQotI2RlZmluZSBjdXJsc3NsX2VuZ2luZXNfbGlzdCh4KSAoKHZvaWQpeCwgKHN0cnVjdCBjdXJsX3NsaXN0ICopTlVMTCkKLSNkZWZpbmUgY3VybHNzbF92ZXJzaW9uIEN1cmxfcG9sYXJzc2xfdmVyc2lvbgotI2RlZmluZSBjdXJsc3NsX2NoZWNrX2N4bih4KSAoKHZvaWQpeCwgLTEpCi0jZGVmaW5lIGN1cmxzc2xfZGF0YV9wZW5kaW5nKHgseSkgQ3VybF9wb2xhcnNzbF9kYXRhX3BlbmRpbmcoeCwgeSkKLSNkZWZpbmUgY3VybHNzbF9zaGEyNTZzdW0oYSxiLGMsZCkgc2hhMjU2KGEsYixjLDApCi0KLS8qIFRoaXMgbWlnaHQgY2F1c2UgbGliY3VybCB0byB1c2UgYSB3ZWVrZXIgcmFuZG9tIQotICAgVE9ETzogaW1wbGVtZW50IHByb3BlciB1c2Ugb2YgUG9sYXJzc2wncyBDVFItRFJCRyBvciBITUFDLURSQkcgYW5kIHVzZSB0aGF0Ci0qLwotI2RlZmluZSBjdXJsc3NsX3JhbmRvbSh4LHkseikgKCh2b2lkKXgsICh2b2lkKXksICh2b2lkKXosIENVUkxFX05PVF9CVUlMVF9JTikKK2V4dGVybiBjb25zdCBzdHJ1Y3QgQ3VybF9zc2wgQ3VybF9zc2xfcG9sYXJzc2w7CiAKICNlbmRpZiAvKiBVU0VfUE9MQVJTU0wgKi8KICNlbmRpZiAvKiBIRUFERVJfQ1VSTF9QT0xBUlNTTF9IICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3BvbGFyc3NsX3RocmVhZGxvY2suYyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvcG9sYXJzc2xfdGhyZWFkbG9jay5jCmluZGV4IGIxZWI3YjcuLmRkNWZiZDcgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvcG9sYXJzc2xfdGhyZWFkbG9jay5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvcG9sYXJzc2xfdGhyZWFkbG9jay5jCkBAIC01LDcgKzUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEsIEhvaS1IbyBDaGFuLCA8aG9paG8uY2hhbkBnbWFpbC5jb20+CiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKQEAgLTExNCw3ICsxMTQsNyBAQAogICB9CiAjZWxpZiBkZWZpbmVkKEhBVkVfUFJPQ0VTU19IKQogICBpZihuIDwgTlVNVCkgewotICAgIHJldCA9IChXYWl0Rm9yU2luZ2xlT2JqZWN0KG11dGV4X2J1ZltuXSwgSU5GSU5JVEUpPT1XQUlUX0ZBSUxFRD8xOjApOworICAgIHJldCA9IChXYWl0Rm9yU2luZ2xlT2JqZWN0KG11dGV4X2J1ZltuXSwgSU5GSU5JVEUpID09IFdBSVRfRkFJTEVEPzE6MCk7CiAgICAgaWYocmV0KSB7CiAgICAgICBERUJVR0YoZnByaW50ZihzdGRlcnIsCiAgICAgICAgICAgICAgICAgICAgICAiRXJyb3I6IHBvbGFyc3NsdGhyZWFkbG9ja19sb2NrX2Z1bmN0aW9uIGZhaWxlZFxuIikpOwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9zY2hhbm5lbC5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9zY2hhbm5lbC5jCmluZGV4IDk0NjAzMDEuLjljYTE0MzEgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvc2NoYW5uZWwuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3NjaGFubmVsLmMKQEAgLTQ2LDYgKzQ2LDggQEAKICMgIGVycm9yICJDYW4ndCBjb21waWxlIFNDSEFOTkVMIHN1cHBvcnQgd2l0aG91dCBTU1BJLiIKICNlbmRpZgogCisjaW5jbHVkZSA8c2NobmxzcC5oPgorI2luY2x1ZGUgPHNjaGFubmVsLmg+CiAjaW5jbHVkZSAiY3VybF9zc3BpLmgiCiAjaW5jbHVkZSAic2NoYW5uZWwuaCIKICNpbmNsdWRlICJ2dGxzLmgiCkBAIC03NCwxMSArNzYsOTIgQEAKICMgIGRlZmluZSBIQVNfQUxQTiAxCiAjZW5kaWYKIAorI2lmbmRlZiBVTklTUF9OQU1FX0EKKyNkZWZpbmUgVU5JU1BfTkFNRV9BICJNaWNyb3NvZnQgVW5pZmllZCBTZWN1cml0eSBQcm90b2NvbCBQcm92aWRlciIKKyNlbmRpZgorCisjaWZuZGVmIFVOSVNQX05BTUVfVworI2RlZmluZSBVTklTUF9OQU1FX1cgTCJNaWNyb3NvZnQgVW5pZmllZCBTZWN1cml0eSBQcm90b2NvbCBQcm92aWRlciIKKyNlbmRpZgorCisjaWZuZGVmIFVOSVNQX05BTUUKKyNpZmRlZiBVTklDT0RFCisjZGVmaW5lIFVOSVNQX05BTUUgIFVOSVNQX05BTUVfVworI2Vsc2UKKyNkZWZpbmUgVU5JU1BfTkFNRSAgVU5JU1BfTkFNRV9BCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNQX1BST1RfU1NMMl9DTElFTlQKKyNkZWZpbmUgU1BfUFJPVF9TU0wyX0NMSUVOVCAgICAgICAgICAgICAweDAwMDAwMDA4CisjZW5kaWYKKworI2lmbmRlZiBTUF9QUk9UX1NTTDNfQ0xJRU5UCisjZGVmaW5lIFNQX1BST1RfU1NMM19DTElFTlQgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2VuZGlmCisKKyNpZm5kZWYgU1BfUFJPVF9UTFMxX0NMSUVOVAorI2RlZmluZSBTUF9QUk9UX1RMUzFfQ0xJRU5UICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNlbmRpZgorCisjaWZuZGVmIFNQX1BST1RfVExTMV8wX0NMSUVOVAorI2RlZmluZSBTUF9QUk9UX1RMUzFfMF9DTElFTlQgICAgICAgICAgIFNQX1BST1RfVExTMV9DTElFTlQKKyNlbmRpZgorCisjaWZuZGVmIFNQX1BST1RfVExTMV8xX0NMSUVOVAorI2RlZmluZSBTUF9QUk9UX1RMUzFfMV9DTElFTlQgICAgICAgICAgIDB4MDAwMDAyMDAKKyNlbmRpZgorCisjaWZuZGVmIFNQX1BST1RfVExTMV8yX0NMSUVOVAorI2RlZmluZSBTUF9QUk9UX1RMUzFfMl9DTElFTlQgICAgICAgICAgIDB4MDAwMDA4MDAKKyNlbmRpZgorCisjaWZuZGVmIFNFQ0JVRkZFUl9BTEVSVAorI2RlZmluZSBTRUNCVUZGRVJfQUxFUlQgICAgICAgICAgICAgICAgIDE3CisjZW5kaWYKKworLyogQm90aCBzY2hhbm5lbCBidWZmZXIgc2l6ZXMgbXVzdCBiZSA+IDAgKi8KKyNkZWZpbmUgQ1VSTF9TQ0hBTk5FTF9CVUZGRVJfSU5JVF9TSVpFICAgNDA5NgorI2RlZmluZSBDVVJMX1NDSEFOTkVMX0JVRkZFUl9GUkVFX1NJWkUgICAxMDI0CisKIC8qIFVuY29tbWVudCB0byBmb3JjZSB2ZXJib3NlIG91dHB1dAogICogI2RlZmluZSBpbmZvZih4LCB5LCAuLi4pIHByaW50Zih5LCBfX1ZBX0FSR1NfXykKICAqICNkZWZpbmUgZmFpbGYoeCwgeSwgLi4uKSBwcmludGYoeSwgX19WQV9BUkdTX18pCiAgKi8KIAorLyogU3RydWN0cyB0byBzdG9yZSBTY2hhbm5lbCBoYW5kbGVzICovCitzdHJ1Y3QgY3VybF9zY2hhbm5lbF9jcmVkIHsKKyAgQ3JlZEhhbmRsZSBjcmVkX2hhbmRsZTsKKyAgVGltZVN0YW1wIHRpbWVfc3RhbXA7CisgIGludCByZWZjb3VudDsKK307CisKK3N0cnVjdCBjdXJsX3NjaGFubmVsX2N0eHQgeworICBDdHh0SGFuZGxlIGN0eHRfaGFuZGxlOworICBUaW1lU3RhbXAgdGltZV9zdGFtcDsKK307CisKK3N0cnVjdCBzc2xfYmFja2VuZF9kYXRhIHsKKyAgc3RydWN0IGN1cmxfc2NoYW5uZWxfY3JlZCAqY3JlZDsKKyAgc3RydWN0IGN1cmxfc2NoYW5uZWxfY3R4dCAqY3R4dDsKKyAgU2VjUGtnQ29udGV4dF9TdHJlYW1TaXplcyBzdHJlYW1fc2l6ZXM7CisgIHNpemVfdCBlbmNkYXRhX2xlbmd0aCwgZGVjZGF0YV9sZW5ndGg7CisgIHNpemVfdCBlbmNkYXRhX29mZnNldCwgZGVjZGF0YV9vZmZzZXQ7CisgIHVuc2lnbmVkIGNoYXIgKmVuY2RhdGFfYnVmZmVyLCAqZGVjZGF0YV9idWZmZXI7CisgIC8qIGVuY2RhdGFfaXNfaW5jb21wbGV0ZTogaWYgZW5jZGF0YSBjb250YWlucyBvbmx5IGEgcGFydGlhbCByZWNvcmQgdGhhdAorICAgICBjYW4ndCBiZSBkZWNyeXB0ZWQgd2l0aG91dCBhbm90aGVyIEN1cmxfcmVhZF9wbGFpbiAodGhhdCBpcywgc3RhdHVzIGlzCisgICAgIFNFQ19FX0lOQ09NUExFVEVfTUVTU0FHRSkgdGhlbiBzZXQgdGhpcyB0cnVlLiBhZnRlciBDdXJsX3JlYWRfcGxhaW4gd3JpdGVzCisgICAgIG1vcmUgYnl0ZXMgaW50byBlbmNkYXRhIHRoZW4gc2V0IHRoaXMgYmFjayB0byBmYWxzZS4gKi8KKyAgYm9vbCBlbmNkYXRhX2lzX2luY29tcGxldGU7CisgIHVuc2lnbmVkIGxvbmcgcmVxX2ZsYWdzLCByZXRfZmxhZ3M7CisgIENVUkxjb2RlIHJlY3ZfdW5yZWNvdmVyYWJsZV9lcnI7IC8qIHNjaGFubmVsX3JlY3YgaGFkIGFuIHVucmVjb3ZlcmFibGUgZXJyICovCisgIGJvb2wgcmVjdl9zc3BpX2Nsb3NlX25vdGlmeTsgLyogdHJ1ZSBpZiBjb25uZWN0aW9uIGNsb3NlZCBieSBjbG9zZV9ub3RpZnkgKi8KKyAgYm9vbCByZWN2X2Nvbm5lY3Rpb25fY2xvc2VkOyAvKiB0cnVlIGlmIGNvbm5lY3Rpb24gY2xvc2VkLCByZWdhcmRsZXNzIGhvdyAqLworICBib29sIHVzZV9hbHBuOyAvKiB0cnVlIGlmIEFMUE4gaXMgdXNlZCBmb3IgdGhpcyBjb25uZWN0aW9uICovCit9OworCisjZGVmaW5lIEJBQ0tFTkQgY29ubnNzbC0+YmFja2VuZAorCiBzdGF0aWMgQ3VybF9yZWN2IHNjaGFubmVsX3JlY3Y7CiBzdGF0aWMgQ3VybF9zZW5kIHNjaGFubmVsX3NlbmQ7CiAKQEAgLTE3NiwzMyArMjU5LDMzIEBACiAjaWZkZWYgSEFTX0FMUE4KICAgLyogQUxQTiBpcyBvbmx5IHN1cHBvcnRlZCBvbiBXaW5kb3dzIDguMSAvIFNlcnZlciAyMDEyIFIyIGFuZCBhYm92ZS4KICAgICAgQWxzbyBpdCBkb2Vzbid0IHNlZW0gdG8gYmUgc3VwcG9ydGVkIGZvciBXaW5lLCBzZWUgY3VybCBidWcgIzk4My4gKi8KLSAgY29ubnNzbC0+dXNlX2FscG4gPSBjb25uLT5iaXRzLnRsc19lbmFibGVfYWxwbiAmJgorICBCQUNLRU5ELT51c2VfYWxwbiA9IGNvbm4tPmJpdHMudGxzX2VuYWJsZV9hbHBuICYmCiAgICAgICAgICAgICAgICAgICAgICAgIUdldFByb2NBZGRyZXNzKEdldE1vZHVsZUhhbmRsZUEoIm50ZGxsIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aW5lX2dldF92ZXJzaW9uIikgJiYKICAgICAgICAgICAgICAgICAgICAgICBDdXJsX3ZlcmlmeV93aW5kb3dzX3ZlcnNpb24oNiwgMywgUExBVEZPUk1fV0lOTlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUlNJT05fR1JFQVRFUl9USEFOX0VRVUFMKTsKICNlbHNlCi0gIGNvbm5zc2wtPnVzZV9hbHBuID0gZmFsc2U7CisgIEJBQ0tFTkQtPnVzZV9hbHBuID0gZmFsc2U7CiAjZW5kaWYKIAotICBjb25uc3NsLT5jcmVkID0gTlVMTDsKKyAgQkFDS0VORC0+Y3JlZCA9IE5VTEw7CiAKICAgLyogY2hlY2sgZm9yIGFuIGV4aXN0aW5nIHJlLXVzYWJsZSBjcmVkZW50aWFsIGhhbmRsZSAqLwogICBpZihTU0xfU0VUX09QVElPTihwcmltYXJ5LnNlc3Npb25pZCkpIHsKICAgICBDdXJsX3NzbF9zZXNzaW9uaWRfbG9jayhjb25uKTsKICAgICBpZighQ3VybF9zc2xfZ2V0c2Vzc2lvbmlkKGNvbm4sICh2b2lkICoqKSZvbGRfY3JlZCwgTlVMTCwgc29ja2luZGV4KSkgewotICAgICAgY29ubnNzbC0+Y3JlZCA9IG9sZF9jcmVkOworICAgICAgQkFDS0VORC0+Y3JlZCA9IG9sZF9jcmVkOwogICAgICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiByZS11c2luZyBleGlzdGluZyBjcmVkZW50aWFsIGhhbmRsZVxuIik7CiAKICAgICAgIC8qIGluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50ZXIgb2YgdGhlIGNyZWRlbnRpYWwvc2Vzc2lvbiBoYW5kbGUgKi8KLSAgICAgIGNvbm5zc2wtPmNyZWQtPnJlZmNvdW50Kys7CisgICAgICBCQUNLRU5ELT5jcmVkLT5yZWZjb3VudCsrOwogICAgICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBpbmNyZW1lbnRlZCBjcmVkZW50aWFsIGhhbmRsZSByZWZjb3VudCA9ICVkXG4iLAotICAgICAgICAgICAgY29ubnNzbC0+Y3JlZC0+cmVmY291bnQpOworICAgICAgICAgICAgQkFDS0VORC0+Y3JlZC0+cmVmY291bnQpOwogICAgIH0KICAgICBDdXJsX3NzbF9zZXNzaW9uaWRfdW5sb2NrKGNvbm4pOwogICB9CiAKLSAgaWYoIWNvbm5zc2wtPmNyZWQpIHsKKyAgaWYoIUJBQ0tFTkQtPmNyZWQpIHsKICAgICAvKiBzZXR1cCBTY2hhbm5lbCBBUEkgb3B0aW9ucyAqLwogICAgIG1lbXNldCgmc2NoYW5uZWxfY3JlZCwgMCwgc2l6ZW9mKHNjaGFubmVsX2NyZWQpKTsKICAgICBzY2hhbm5lbF9jcmVkLmR3VmVyc2lvbiA9IFNDSEFOTkVMX0NSRURfVkVSU0lPTjsKQEAgLTI3MiwxNCArMzU1LDE0IEBACiAgICAgfQogCiAgICAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcmUtdXNhYmxlIGNyZWRlbnRpYWwgaGFuZGxlICovCi0gICAgY29ubnNzbC0+Y3JlZCA9IChzdHJ1Y3QgY3VybF9zY2hhbm5lbF9jcmVkICopCisgICAgQkFDS0VORC0+Y3JlZCA9IChzdHJ1Y3QgY3VybF9zY2hhbm5lbF9jcmVkICopCiAgICAgICBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBjdXJsX3NjaGFubmVsX2NyZWQpKTsKLSAgICBpZighY29ubnNzbC0+Y3JlZCkgeworICAgIGlmKCFCQUNLRU5ELT5jcmVkKSB7CiAgICAgICBmYWlsZihkYXRhLCAic2NoYW5uZWw6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiKTsKICAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogICAgIH0KLSAgICBtZW1zZXQoY29ubnNzbC0+Y3JlZCwgMCwgc2l6ZW9mKHN0cnVjdCBjdXJsX3NjaGFubmVsX2NyZWQpKTsKLSAgICBjb25uc3NsLT5jcmVkLT5yZWZjb3VudCA9IDE7CisgICAgbWVtc2V0KEJBQ0tFTkQtPmNyZWQsIDAsIHNpemVvZihzdHJ1Y3QgY3VybF9zY2hhbm5lbF9jcmVkKSk7CisgICAgQkFDS0VORC0+Y3JlZC0+cmVmY291bnQgPSAxOwogCiAgICAgLyogaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvYWEzNzQ3MTYuYXNweAogICAgICAgICovCkBAIC0yODcsOCArMzcwLDggQEAKICAgICAgIHNfcFNlY0ZuLT5BY3F1aXJlQ3JlZGVudGlhbHNIYW5kbGUoTlVMTCwgKFRDSEFSICopVU5JU1BfTkFNRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDUEtHX0NSRURfT1VUQk9VTkQsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY2hhbm5lbF9jcmVkLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ubnNzbC0+Y3JlZC0+Y3JlZF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25uc3NsLT5jcmVkLT50aW1lX3N0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJBQ0tFTkQtPmNyZWQtPmNyZWRfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQkFDS0VORC0+Y3JlZC0+dGltZV9zdGFtcCk7CiAKICAgICBpZihzc3BpX3N0YXR1cyAhPSBTRUNfRV9PSykgewogICAgICAgaWYoc3NwaV9zdGF0dXMgPT0gU0VDX0VfV1JPTkdfUFJJTkNJUEFMKQpAQCAtMjk3LDcgKzM4MCw3IEBACiAgICAgICBlbHNlCiAgICAgICAgIGZhaWxmKGRhdGEsICJzY2hhbm5lbDogQWNxdWlyZUNyZWRlbnRpYWxzSGFuZGxlIGZhaWxlZDogJXMiLAogICAgICAgICAgICAgICBDdXJsX3NzcGlfc3RyZXJyb3IoY29ubiwgc3NwaV9zdGF0dXMpKTsKLSAgICAgIEN1cmxfc2FmZWZyZWUoY29ubnNzbC0+Y3JlZCk7CisgICAgICBDdXJsX3NhZmVmcmVlKEJBQ0tFTkQtPmNyZWQpOwogICAgICAgcmV0dXJuIENVUkxFX1NTTF9DT05ORUNUX0VSUk9SOwogICAgIH0KICAgfQpAQCAtMzEyLDcgKzM5NSw3IEBACiAgIH0KIAogI2lmZGVmIEhBU19BTFBOCi0gIGlmKGNvbm5zc2wtPnVzZV9hbHBuKSB7CisgIGlmKEJBQ0tFTkQtPnVzZV9hbHBuKSB7CiAgICAgaW50IGN1ciA9IDA7CiAgICAgaW50IGxpc3Rfc3RhcnRfaW5kZXggPSAwOwogICAgIHVuc2lnbmVkIGludCAqZXh0ZW5zaW9uX2xlbiA9IE5VTEw7CkBAIC0zNzAsMTggKzQ1MywxOCBAQAogICBJbml0U2VjQnVmZmVyRGVzYygmb3V0YnVmX2Rlc2MsICZvdXRidWYsIDEpOwogCiAgIC8qIHNldHVwIHJlcXVlc3QgZmxhZ3MgKi8KLSAgY29ubnNzbC0+cmVxX2ZsYWdzID0gSVNDX1JFUV9TRVFVRU5DRV9ERVRFQ1QgfCBJU0NfUkVRX1JFUExBWV9ERVRFQ1QgfAorICBCQUNLRU5ELT5yZXFfZmxhZ3MgPSBJU0NfUkVRX1NFUVVFTkNFX0RFVEVDVCB8IElTQ19SRVFfUkVQTEFZX0RFVEVDVCB8CiAgICAgSVNDX1JFUV9DT05GSURFTlRJQUxJVFkgfCBJU0NfUkVRX0FMTE9DQVRFX01FTU9SWSB8CiAgICAgSVNDX1JFUV9TVFJFQU07CiAKICAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdXJpdHkgY29udGV4dCBoYW5kbGUgKi8KLSAgY29ubnNzbC0+Y3R4dCA9IChzdHJ1Y3QgY3VybF9zY2hhbm5lbF9jdHh0ICopCisgIEJBQ0tFTkQtPmN0eHQgPSAoc3RydWN0IGN1cmxfc2NoYW5uZWxfY3R4dCAqKQogICAgIG1hbGxvYyhzaXplb2Yoc3RydWN0IGN1cmxfc2NoYW5uZWxfY3R4dCkpOwotICBpZighY29ubnNzbC0+Y3R4dCkgeworICBpZighQkFDS0VORC0+Y3R4dCkgewogICAgIGZhaWxmKGRhdGEsICJzY2hhbm5lbDogdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSIpOwogICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogICB9Ci0gIG1lbXNldChjb25uc3NsLT5jdHh0LCAwLCBzaXplb2Yoc3RydWN0IGN1cmxfc2NoYW5uZWxfY3R4dCkpOworICBtZW1zZXQoQkFDS0VORC0+Y3R4dCwgMCwgc2l6ZW9mKHN0cnVjdCBjdXJsX3NjaGFubmVsX2N0eHQpKTsKIAogICBob3N0X25hbWUgPSBDdXJsX2NvbnZlcnRfVVRGOF90b190Y2hhcihob3N0bmFtZSk7CiAgIGlmKCFob3N0X25hbWUpCkBAIC0zOTUsMTAgKzQ3OCwxMCBAQAogICAgICB1cyBwcm9ibGVtcyB3aXRoIGluYnVmIHJlZ2FyZGxlc3MuIGh0dHBzOi8vZ2l0aHViLmNvbS9jdXJsL2N1cmwvaXNzdWVzLzk4MwogICAqLwogICBzc3BpX3N0YXR1cyA9IHNfcFNlY0ZuLT5Jbml0aWFsaXplU2VjdXJpdHlDb250ZXh0KAotICAgICZjb25uc3NsLT5jcmVkLT5jcmVkX2hhbmRsZSwgTlVMTCwgaG9zdF9uYW1lLCBjb25uc3NsLT5yZXFfZmxhZ3MsIDAsIDAsCi0gICAgKGNvbm5zc2wtPnVzZV9hbHBuID8gJmluYnVmX2Rlc2MgOiBOVUxMKSwKLSAgICAwLCAmY29ubnNzbC0+Y3R4dC0+Y3R4dF9oYW5kbGUsCi0gICAgJm91dGJ1Zl9kZXNjLCAmY29ubnNzbC0+cmV0X2ZsYWdzLCAmY29ubnNzbC0+Y3R4dC0+dGltZV9zdGFtcCk7CisgICAgJkJBQ0tFTkQtPmNyZWQtPmNyZWRfaGFuZGxlLCBOVUxMLCBob3N0X25hbWUsIEJBQ0tFTkQtPnJlcV9mbGFncywgMCwgMCwKKyAgICAoQkFDS0VORC0+dXNlX2FscG4gPyAmaW5idWZfZGVzYyA6IE5VTEwpLAorICAgIDAsICZCQUNLRU5ELT5jdHh0LT5jdHh0X2hhbmRsZSwKKyAgICAmb3V0YnVmX2Rlc2MsICZCQUNLRU5ELT5yZXRfZmxhZ3MsICZCQUNLRU5ELT5jdHh0LT50aW1lX3N0YW1wKTsKIAogICBDdXJsX3VuaWNvZGVmcmVlKGhvc3RfbmFtZSk7CiAKQEAgLTQwOSw3ICs0OTIsNyBAQAogICAgIGVsc2UKICAgICAgIGZhaWxmKGRhdGEsICJzY2hhbm5lbDogaW5pdGlhbCBJbml0aWFsaXplU2VjdXJpdHlDb250ZXh0IGZhaWxlZDogJXMiLAogICAgICAgICAgICAgQ3VybF9zc3BpX3N0cmVycm9yKGNvbm4sIHNzcGlfc3RhdHVzKSk7Ci0gICAgQ3VybF9zYWZlZnJlZShjb25uc3NsLT5jdHh0KTsKKyAgICBDdXJsX3NhZmVmcmVlKEJBQ0tFTkQtPmN0eHQpOwogICAgIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKICAgfQogCkBAIC00MjksMTAgKzUxMiwxMCBAQAogICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IHNlbnQgaW5pdGlhbCBoYW5kc2hha2UgZGF0YTogIgogICAgICAgICAic2VudCAlemQgYnl0ZXNcbiIsIHdyaXR0ZW4pOwogCi0gIGNvbm5zc2wtPnJlY3ZfdW5yZWNvdmVyYWJsZV9lcnIgPSBDVVJMRV9PSzsKLSAgY29ubnNzbC0+cmVjdl9zc3BpX2Nsb3NlX25vdGlmeSA9IGZhbHNlOwotICBjb25uc3NsLT5yZWN2X2Nvbm5lY3Rpb25fY2xvc2VkID0gZmFsc2U7Ci0gIGNvbm5zc2wtPmVuY2RhdGFfaXNfaW5jb21wbGV0ZSA9IGZhbHNlOworICBCQUNLRU5ELT5yZWN2X3VucmVjb3ZlcmFibGVfZXJyID0gQ1VSTEVfT0s7CisgIEJBQ0tFTkQtPnJlY3Zfc3NwaV9jbG9zZV9ub3RpZnkgPSBmYWxzZTsKKyAgQkFDS0VORC0+cmVjdl9jb25uZWN0aW9uX2Nsb3NlZCA9IGZhbHNlOworICBCQUNLRU5ELT5lbmNkYXRhX2lzX2luY29tcGxldGUgPSBmYWxzZTsKIAogICAvKiBjb250aW51ZSB0byBzZWNvbmQgaGFuZHNoYWtlIHN0ZXAgKi8KICAgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSA9IHNzbF9jb25uZWN0XzI7CkBAIC00NjUsMzkgKzU0OCwzOSBAQAogICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IFNTTC9UTFMgY29ubmVjdGlvbiB3aXRoICVzIHBvcnQgJWh1IChzdGVwIDIvMylcbiIsCiAgICAgICAgIGhvc3RuYW1lLCBjb25uLT5yZW1vdGVfcG9ydCk7CiAKLSAgaWYoIWNvbm5zc2wtPmNyZWQgfHwgIWNvbm5zc2wtPmN0eHQpCisgIGlmKCFCQUNLRU5ELT5jcmVkIHx8ICFCQUNLRU5ELT5jdHh0KQogICAgIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKIAogICAvKiBidWZmZXIgdG8gc3RvcmUgcHJldmlvdXNseSByZWNlaXZlZCBhbmQgZGVjcnlwdGVkIGRhdGEgKi8KLSAgaWYoY29ubnNzbC0+ZGVjZGF0YV9idWZmZXIgPT0gTlVMTCkgewotICAgIGNvbm5zc2wtPmRlY2RhdGFfb2Zmc2V0ID0gMDsKLSAgICBjb25uc3NsLT5kZWNkYXRhX2xlbmd0aCA9IENVUkxfU0NIQU5ORUxfQlVGRkVSX0lOSVRfU0laRTsKLSAgICBjb25uc3NsLT5kZWNkYXRhX2J1ZmZlciA9IG1hbGxvYyhjb25uc3NsLT5kZWNkYXRhX2xlbmd0aCk7Ci0gICAgaWYoY29ubnNzbC0+ZGVjZGF0YV9idWZmZXIgPT0gTlVMTCkgeworICBpZihCQUNLRU5ELT5kZWNkYXRhX2J1ZmZlciA9PSBOVUxMKSB7CisgICAgQkFDS0VORC0+ZGVjZGF0YV9vZmZzZXQgPSAwOworICAgIEJBQ0tFTkQtPmRlY2RhdGFfbGVuZ3RoID0gQ1VSTF9TQ0hBTk5FTF9CVUZGRVJfSU5JVF9TSVpFOworICAgIEJBQ0tFTkQtPmRlY2RhdGFfYnVmZmVyID0gbWFsbG9jKEJBQ0tFTkQtPmRlY2RhdGFfbGVuZ3RoKTsKKyAgICBpZihCQUNLRU5ELT5kZWNkYXRhX2J1ZmZlciA9PSBOVUxMKSB7CiAgICAgICBmYWlsZihkYXRhLCAic2NoYW5uZWw6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiKTsKICAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogICAgIH0KICAgfQogCiAgIC8qIGJ1ZmZlciB0byBzdG9yZSBwcmV2aW91c2x5IHJlY2VpdmVkIGFuZCBlbmNyeXB0ZWQgZGF0YSAqLwotICBpZihjb25uc3NsLT5lbmNkYXRhX2J1ZmZlciA9PSBOVUxMKSB7Ci0gICAgY29ubnNzbC0+ZW5jZGF0YV9pc19pbmNvbXBsZXRlID0gZmFsc2U7Ci0gICAgY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQgPSAwOwotICAgIGNvbm5zc2wtPmVuY2RhdGFfbGVuZ3RoID0gQ1VSTF9TQ0hBTk5FTF9CVUZGRVJfSU5JVF9TSVpFOwotICAgIGNvbm5zc2wtPmVuY2RhdGFfYnVmZmVyID0gbWFsbG9jKGNvbm5zc2wtPmVuY2RhdGFfbGVuZ3RoKTsKLSAgICBpZihjb25uc3NsLT5lbmNkYXRhX2J1ZmZlciA9PSBOVUxMKSB7CisgIGlmKEJBQ0tFTkQtPmVuY2RhdGFfYnVmZmVyID09IE5VTEwpIHsKKyAgICBCQUNLRU5ELT5lbmNkYXRhX2lzX2luY29tcGxldGUgPSBmYWxzZTsKKyAgICBCQUNLRU5ELT5lbmNkYXRhX29mZnNldCA9IDA7CisgICAgQkFDS0VORC0+ZW5jZGF0YV9sZW5ndGggPSBDVVJMX1NDSEFOTkVMX0JVRkZFUl9JTklUX1NJWkU7CisgICAgQkFDS0VORC0+ZW5jZGF0YV9idWZmZXIgPSBtYWxsb2MoQkFDS0VORC0+ZW5jZGF0YV9sZW5ndGgpOworICAgIGlmKEJBQ0tFTkQtPmVuY2RhdGFfYnVmZmVyID09IE5VTEwpIHsKICAgICAgIGZhaWxmKGRhdGEsICJzY2hhbm5lbDogdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSIpOwogICAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7CiAgICAgfQogICB9CiAKICAgLyogaWYgd2UgbmVlZCBhIGJpZ2dlciBidWZmZXIgdG8gcmVhZCBhIGZ1bGwgbWVzc2FnZSwgaW5jcmVhc2UgYnVmZmVyIG5vdyAqLwotICBpZihjb25uc3NsLT5lbmNkYXRhX2xlbmd0aCAtIGNvbm5zc2wtPmVuY2RhdGFfb2Zmc2V0IDwKKyAgaWYoQkFDS0VORC0+ZW5jZGF0YV9sZW5ndGggLSBCQUNLRU5ELT5lbmNkYXRhX29mZnNldCA8CiAgICAgIENVUkxfU0NIQU5ORUxfQlVGRkVSX0ZSRUVfU0laRSkgewogICAgIC8qIGluY3JlYXNlIGludGVybmFsIGVuY3J5cHRlZCBkYXRhIGJ1ZmZlciAqLwotICAgIHJlYWxsb2NhdGVkX2xlbmd0aCA9IGNvbm5zc2wtPmVuY2RhdGFfb2Zmc2V0ICsKKyAgICByZWFsbG9jYXRlZF9sZW5ndGggPSBCQUNLRU5ELT5lbmNkYXRhX29mZnNldCArCiAgICAgICBDVVJMX1NDSEFOTkVMX0JVRkZFUl9GUkVFX1NJWkU7Ci0gICAgcmVhbGxvY2F0ZWRfYnVmZmVyID0gcmVhbGxvYyhjb25uc3NsLT5lbmNkYXRhX2J1ZmZlciwKKyAgICByZWFsbG9jYXRlZF9idWZmZXIgPSByZWFsbG9jKEJBQ0tFTkQtPmVuY2RhdGFfYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGxvY2F0ZWRfbGVuZ3RoKTsKIAogICAgIGlmKHJlYWxsb2NhdGVkX2J1ZmZlciA9PSBOVUxMKSB7CkBAIC01MDUsOCArNTg4LDggQEAKICAgICAgIHJldHVybiBDVVJMRV9PVVRfT0ZfTUVNT1JZOwogICAgIH0KICAgICBlbHNlIHsKLSAgICAgIGNvbm5zc2wtPmVuY2RhdGFfYnVmZmVyID0gcmVhbGxvY2F0ZWRfYnVmZmVyOwotICAgICAgY29ubnNzbC0+ZW5jZGF0YV9sZW5ndGggPSByZWFsbG9jYXRlZF9sZW5ndGg7CisgICAgICBCQUNLRU5ELT5lbmNkYXRhX2J1ZmZlciA9IHJlYWxsb2NhdGVkX2J1ZmZlcjsKKyAgICAgIEJBQ0tFTkQtPmVuY2RhdGFfbGVuZ3RoID0gcmVhbGxvY2F0ZWRfbGVuZ3RoOwogICAgIH0KICAgfQogCkBAIC01MTQsMTAgKzU5NywxMCBAQAogICAgIGlmKGRvcmVhZCkgewogICAgICAgLyogcmVhZCBlbmNyeXB0ZWQgaGFuZHNoYWtlIGRhdGEgZnJvbSBzb2NrZXQgKi8KICAgICAgIHJlc3VsdCA9IEN1cmxfcmVhZF9wbGFpbihjb25uLT5zb2NrW3NvY2tpbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgKGNvbm5zc2wtPmVuY2RhdGFfYnVmZmVyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5zc2wtPmVuY2RhdGFfbGVuZ3RoIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uc3NsLT5lbmNkYXRhX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSAoQkFDS0VORC0+ZW5jZGF0YV9idWZmZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQUNLRU5ELT5lbmNkYXRhX29mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFDS0VORC0+ZW5jZGF0YV9sZW5ndGggLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBQ0tFTkQtPmVuY2RhdGFfb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZucmVhZCk7CiAgICAgICBpZihyZXN1bHQgPT0gQ1VSTEVfQUdBSU4pIHsKICAgICAgICAgaWYoY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSAhPSBzc2xfY29ubmVjdF8yX3dyaXRpbmcpCkBAIC01MzMsMTcgKzYxNiwxNyBAQAogICAgICAgfQogCiAgICAgICAvKiBpbmNyZWFzZSBlbmNyeXB0ZWQgZGF0YSBidWZmZXIgb2Zmc2V0ICovCi0gICAgICBjb25uc3NsLT5lbmNkYXRhX29mZnNldCArPSBucmVhZDsKLSAgICAgIGNvbm5zc2wtPmVuY2RhdGFfaXNfaW5jb21wbGV0ZSA9IGZhbHNlOworICAgICAgQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQgKz0gbnJlYWQ7CisgICAgICBCQUNLRU5ELT5lbmNkYXRhX2lzX2luY29tcGxldGUgPSBmYWxzZTsKICAgICAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogZW5jcnlwdGVkIGRhdGEgZ290ICV6ZFxuIiwgbnJlYWQpOwogICAgIH0KIAogICAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogZW5jcnlwdGVkIGRhdGEgYnVmZmVyOiBvZmZzZXQgJXp1IGxlbmd0aCAlenVcbiIsCi0gICAgICAgICAgY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQsIGNvbm5zc2wtPmVuY2RhdGFfbGVuZ3RoKTsKKyAgICAgICAgICBCQUNLRU5ELT5lbmNkYXRhX29mZnNldCwgQkFDS0VORC0+ZW5jZGF0YV9sZW5ndGgpOwogCiAgICAgLyogc2V0dXAgaW5wdXQgYnVmZmVycyAqLwotICAgIEluaXRTZWNCdWZmZXIoJmluYnVmWzBdLCBTRUNCVUZGRVJfVE9LRU4sIG1hbGxvYyhjb25uc3NsLT5lbmNkYXRhX29mZnNldCksCi0gICAgICAgICAgICAgICAgICBjdXJseF91enRvdWwoY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQpKTsKKyAgICBJbml0U2VjQnVmZmVyKCZpbmJ1ZlswXSwgU0VDQlVGRkVSX1RPS0VOLCBtYWxsb2MoQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQpLAorICAgICAgICAgICAgICAgICAgY3VybHhfdXp0b3VsKEJBQ0tFTkQtPmVuY2RhdGFfb2Zmc2V0KSk7CiAgICAgSW5pdFNlY0J1ZmZlcigmaW5idWZbMV0sIFNFQ0JVRkZFUl9FTVBUWSwgTlVMTCwgMCk7CiAgICAgSW5pdFNlY0J1ZmZlckRlc2MoJmluYnVmX2Rlc2MsIGluYnVmLCAyKTsKIApAQCAtNTU5LDggKzY0Miw4IEBACiAgICAgfQogCiAgICAgLyogY29weSByZWNlaXZlZCBoYW5kc2hha2UgZGF0YSBpbnRvIGlucHV0IGJ1ZmZlciAqLwotICAgIG1lbWNweShpbmJ1ZlswXS5wdkJ1ZmZlciwgY29ubnNzbC0+ZW5jZGF0YV9idWZmZXIsCi0gICAgICAgICAgIGNvbm5zc2wtPmVuY2RhdGFfb2Zmc2V0KTsKKyAgICBtZW1jcHkoaW5idWZbMF0ucHZCdWZmZXIsIEJBQ0tFTkQtPmVuY2RhdGFfYnVmZmVyLAorICAgICAgICAgICBCQUNLRU5ELT5lbmNkYXRhX29mZnNldCk7CiAKICAgICBob3N0X25hbWUgPSBDdXJsX2NvbnZlcnRfVVRGOF90b190Y2hhcihob3N0bmFtZSk7CiAgICAgaWYoIWhvc3RfbmFtZSkKQEAgLTU2OSw5ICs2NTIsOSBAQAogICAgIC8qIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9kZXNrdG9wL2FhMzc1OTI0LmFzcHgKICAgICAgICAqLwogICAgIHNzcGlfc3RhdHVzID0gc19wU2VjRm4tPkluaXRpYWxpemVTZWN1cml0eUNvbnRleHQoCi0gICAgICAmY29ubnNzbC0+Y3JlZC0+Y3JlZF9oYW5kbGUsICZjb25uc3NsLT5jdHh0LT5jdHh0X2hhbmRsZSwKLSAgICAgIGhvc3RfbmFtZSwgY29ubnNzbC0+cmVxX2ZsYWdzLCAwLCAwLCAmaW5idWZfZGVzYywgMCwgTlVMTCwKLSAgICAgICZvdXRidWZfZGVzYywgJmNvbm5zc2wtPnJldF9mbGFncywgJmNvbm5zc2wtPmN0eHQtPnRpbWVfc3RhbXApOworICAgICAgJkJBQ0tFTkQtPmNyZWQtPmNyZWRfaGFuZGxlLCAmQkFDS0VORC0+Y3R4dC0+Y3R4dF9oYW5kbGUsCisgICAgICBob3N0X25hbWUsIEJBQ0tFTkQtPnJlcV9mbGFncywgMCwgMCwgJmluYnVmX2Rlc2MsIDAsIE5VTEwsCisgICAgICAmb3V0YnVmX2Rlc2MsICZCQUNLRU5ELT5yZXRfZmxhZ3MsICZCQUNLRU5ELT5jdHh0LT50aW1lX3N0YW1wKTsKIAogICAgIEN1cmxfdW5pY29kZWZyZWUoaG9zdF9uYW1lKTsKIApAQCAtNTgwLDcgKzY2Myw3IEBACiAKICAgICAvKiBjaGVjayBpZiB0aGUgaGFuZHNoYWtlIHdhcyBpbmNvbXBsZXRlICovCiAgICAgaWYoc3NwaV9zdGF0dXMgPT0gU0VDX0VfSU5DT01QTEVURV9NRVNTQUdFKSB7Ci0gICAgICBjb25uc3NsLT5lbmNkYXRhX2lzX2luY29tcGxldGUgPSB0cnVlOworICAgICAgQkFDS0VORC0+ZW5jZGF0YV9pc19pbmNvbXBsZXRlID0gdHJ1ZTsKICAgICAgIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUgPSBzc2xfY29ubmVjdF8yX3JlYWRpbmc7CiAgICAgICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IHJlY2VpdmVkIGluY29tcGxldGUgbWVzc2FnZSwgbmVlZCBtb3JlIGRhdGFcbiIpOwogICAgICAgcmV0dXJuIENVUkxFX09LOwpAQCAtNTkwLDggKzY3Myw4IEBACiAgICAgICAgdGhlIGhhbmRzaGFrZSB3aXRob3V0IG9uZS4gVGhpcyB3aWxsIGFsbG93IGNvbm5lY3Rpb25zIHRvIHNlcnZlcnMgd2hpY2gKICAgICAgICByZXF1ZXN0IGEgY2xpZW50IGNlcnRpZmljYXRlIGJ1dCBkbyBub3QgcmVxdWlyZSBpdC4gKi8KICAgICBpZihzc3BpX3N0YXR1cyA9PSBTRUNfSV9JTkNPTVBMRVRFX0NSRURFTlRJQUxTICYmCi0gICAgICAgIShjb25uc3NsLT5yZXFfZmxhZ3MgJiBJU0NfUkVRX1VTRV9TVVBQTElFRF9DUkVEUykpIHsKLSAgICAgIGNvbm5zc2wtPnJlcV9mbGFncyB8PSBJU0NfUkVRX1VTRV9TVVBQTElFRF9DUkVEUzsKKyAgICAgICAhKEJBQ0tFTkQtPnJlcV9mbGFncyAmIElTQ19SRVFfVVNFX1NVUFBMSUVEX0NSRURTKSkgeworICAgICAgQkFDS0VORC0+cmVxX2ZsYWdzIHw9IElTQ19SRVFfVVNFX1NVUFBMSUVEX0NSRURTOwogICAgICAgY29ubnNzbC0+Y29ubmVjdGluZ19zdGF0ZSA9IHNzbF9jb25uZWN0XzJfd3JpdGluZzsKICAgICAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogYSBjbGllbnQgY2VydGlmaWNhdGUgaGFzIGJlZW4gcmVxdWVzdGVkXG4iKTsKICAgICAgIHJldHVybiBDVVJMRV9PSzsKQEAgLTYzMSw3ICs3MTQsNyBAQAogICAgICAgICBmYWlsZihkYXRhLCAic2NoYW5uZWw6IG5leHQgSW5pdGlhbGl6ZVNlY3VyaXR5Q29udGV4dCBmYWlsZWQ6ICVzIiwKICAgICAgICAgICAgICAgQ3VybF9zc3BpX3N0cmVycm9yKGNvbm4sIHNzcGlfc3RhdHVzKSk7CiAgICAgICByZXR1cm4gc3NwaV9zdGF0dXMgPT0gU0VDX0VfVU5UUlVTVEVEX1JPT1QgPwotICAgICAgICAgIENVUkxFX1NTTF9DQUNFUlRfQkFERklMRSA6IENVUkxFX1NTTF9DT05ORUNUX0VSUk9SOworICAgICAgICAgIENVUkxFX1NTTF9DQUNFUlQgOiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKICAgICB9CiAKICAgICAvKiBjaGVjayBpZiB0aGVyZSB3YXMgYWRkaXRpb25hbCByZW1haW5pbmcgZW5jcnlwdGVkIGRhdGEgKi8KQEAgLTY0OSwxMSArNzMyLDExIEBACiAgICAgICAqLwogICAgICAgLyogY2hlY2sgaWYgdGhlIHJlbWFpbmluZyBkYXRhIGlzIGxlc3MgdGhhbiB0aGUgdG90YWwgYW1vdW50CiAgICAgICAgICBhbmQgdGhlcmVmb3JlIGJlZ2lucyBhZnRlciB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgZGF0YSAqLwotICAgICAgaWYoY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQgPiBpbmJ1ZlsxXS5jYkJ1ZmZlcikgewotICAgICAgICBtZW1tb3ZlKGNvbm5zc2wtPmVuY2RhdGFfYnVmZmVyLAotICAgICAgICAgICAgICAgIChjb25uc3NsLT5lbmNkYXRhX2J1ZmZlciArIGNvbm5zc2wtPmVuY2RhdGFfb2Zmc2V0KSAtCisgICAgICBpZihCQUNLRU5ELT5lbmNkYXRhX29mZnNldCA+IGluYnVmWzFdLmNiQnVmZmVyKSB7CisgICAgICAgIG1lbW1vdmUoQkFDS0VORC0+ZW5jZGF0YV9idWZmZXIsCisgICAgICAgICAgICAgICAgKEJBQ0tFTkQtPmVuY2RhdGFfYnVmZmVyICsgQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQpIC0KICAgICAgICAgICAgICAgICBpbmJ1ZlsxXS5jYkJ1ZmZlciwgaW5idWZbMV0uY2JCdWZmZXIpOwotICAgICAgICBjb25uc3NsLT5lbmNkYXRhX29mZnNldCA9IGluYnVmWzFdLmNiQnVmZmVyOworICAgICAgICBCQUNLRU5ELT5lbmNkYXRhX29mZnNldCA9IGluYnVmWzFdLmNiQnVmZmVyOwogICAgICAgICBpZihzc3BpX3N0YXR1cyA9PSBTRUNfSV9DT05USU5VRV9ORUVERUQpIHsKICAgICAgICAgICBkb3JlYWQgPSBGQUxTRTsKICAgICAgICAgICBjb250aW51ZTsKQEAgLTY2MSw3ICs3NDQsNyBAQAogICAgICAgfQogICAgIH0KICAgICBlbHNlIHsKLSAgICAgIGNvbm5zc2wtPmVuY2RhdGFfb2Zmc2V0ID0gMDsKKyAgICAgIEJBQ0tFTkQtPmVuY2RhdGFfb2Zmc2V0ID0gMDsKICAgICB9CiAgICAgYnJlYWs7CiAgIH0KQEAgLTcwOSwyNyArNzkyLDI3IEBACiAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogU1NML1RMUyBjb25uZWN0aW9uIHdpdGggJXMgcG9ydCAlaHUgKHN0ZXAgMy8zKVxuIiwKICAgICAgICAgaG9zdG5hbWUsIGNvbm4tPnJlbW90ZV9wb3J0KTsKIAotICBpZighY29ubnNzbC0+Y3JlZCkKKyAgaWYoIUJBQ0tFTkQtPmNyZWQpCiAgICAgcmV0dXJuIENVUkxFX1NTTF9DT05ORUNUX0VSUk9SOwogCiAgIC8qIGNoZWNrIGlmIHRoZSByZXF1aXJlZCBjb250ZXh0IGF0dHJpYnV0ZXMgYXJlIG1ldCAqLwotICBpZihjb25uc3NsLT5yZXRfZmxhZ3MgIT0gY29ubnNzbC0+cmVxX2ZsYWdzKSB7Ci0gICAgaWYoIShjb25uc3NsLT5yZXRfZmxhZ3MgJiBJU0NfUkVUX1NFUVVFTkNFX0RFVEVDVCkpCisgIGlmKEJBQ0tFTkQtPnJldF9mbGFncyAhPSBCQUNLRU5ELT5yZXFfZmxhZ3MpIHsKKyAgICBpZighKEJBQ0tFTkQtPnJldF9mbGFncyAmIElTQ19SRVRfU0VRVUVOQ0VfREVURUNUKSkKICAgICAgIGZhaWxmKGRhdGEsICJzY2hhbm5lbDogZmFpbGVkIHRvIHNldHVwIHNlcXVlbmNlIGRldGVjdGlvbiIpOwotICAgIGlmKCEoY29ubnNzbC0+cmV0X2ZsYWdzICYgSVNDX1JFVF9SRVBMQVlfREVURUNUKSkKKyAgICBpZighKEJBQ0tFTkQtPnJldF9mbGFncyAmIElTQ19SRVRfUkVQTEFZX0RFVEVDVCkpCiAgICAgICBmYWlsZihkYXRhLCAic2NoYW5uZWw6IGZhaWxlZCB0byBzZXR1cCByZXBsYXkgZGV0ZWN0aW9uIik7Ci0gICAgaWYoIShjb25uc3NsLT5yZXRfZmxhZ3MgJiBJU0NfUkVUX0NPTkZJREVOVElBTElUWSkpCisgICAgaWYoIShCQUNLRU5ELT5yZXRfZmxhZ3MgJiBJU0NfUkVUX0NPTkZJREVOVElBTElUWSkpCiAgICAgICBmYWlsZihkYXRhLCAic2NoYW5uZWw6IGZhaWxlZCB0byBzZXR1cCBjb25maWRlbnRpYWxpdHkiKTsKLSAgICBpZighKGNvbm5zc2wtPnJldF9mbGFncyAmIElTQ19SRVRfQUxMT0NBVEVEX01FTU9SWSkpCisgICAgaWYoIShCQUNLRU5ELT5yZXRfZmxhZ3MgJiBJU0NfUkVUX0FMTE9DQVRFRF9NRU1PUlkpKQogICAgICAgZmFpbGYoZGF0YSwgInNjaGFubmVsOiBmYWlsZWQgdG8gc2V0dXAgbWVtb3J5IGFsbG9jYXRpb24iKTsKLSAgICBpZighKGNvbm5zc2wtPnJldF9mbGFncyAmIElTQ19SRVRfU1RSRUFNKSkKKyAgICBpZighKEJBQ0tFTkQtPnJldF9mbGFncyAmIElTQ19SRVRfU1RSRUFNKSkKICAgICAgIGZhaWxmKGRhdGEsICJzY2hhbm5lbDogZmFpbGVkIHRvIHNldHVwIHN0cmVhbSBvcmllbnRhdGlvbiIpOwogICAgIHJldHVybiBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUjsKICAgfQogCiAjaWZkZWYgSEFTX0FMUE4KLSAgaWYoY29ubnNzbC0+dXNlX2FscG4pIHsKLSAgICBzc3BpX3N0YXR1cyA9IHNfcFNlY0ZuLT5RdWVyeUNvbnRleHRBdHRyaWJ1dGVzKCZjb25uc3NsLT5jdHh0LT5jdHh0X2hhbmRsZSwKKyAgaWYoQkFDS0VORC0+dXNlX2FscG4pIHsKKyAgICBzc3BpX3N0YXR1cyA9IHNfcFNlY0ZuLT5RdWVyeUNvbnRleHRBdHRyaWJ1dGVzKCZCQUNLRU5ELT5jdHh0LT5jdHh0X2hhbmRsZSwKICAgICAgIFNFQ1BLR19BVFRSX0FQUExJQ0FUSU9OX1BST1RPQ09MLCAmYWxwbl9yZXN1bHQpOwogCiAgICAgaWYoc3NwaV9zdGF0dXMgIT0gU0VDX0VfT0spIHsKQEAgLTc3MSw3ICs4NTQsNyBAQAogICAgIGluY2FjaGUgPSAhKEN1cmxfc3NsX2dldHNlc3Npb25pZChjb25uLCAodm9pZCAqKikmb2xkX2NyZWQsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tpbmRleCkpOwogICAgIGlmKGluY2FjaGUpIHsKLSAgICAgIGlmKG9sZF9jcmVkICE9IGNvbm5zc2wtPmNyZWQpIHsKKyAgICAgIGlmKG9sZF9jcmVkICE9IEJBQ0tFTkQtPmNyZWQpIHsKICAgICAgICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBvbGQgY3JlZGVudGlhbCBoYW5kbGUgaXMgc3RhbGUsIHJlbW92aW5nXG4iKTsKICAgICAgICAgLyogd2UncmUgbm90IHRha2luZyBvbGRfY3JlZCBvd25lcnNoaXAgaGVyZSwgbm8gcmVmY291bnQrKyBpcyBuZWVkZWQgKi8KICAgICAgICAgQ3VybF9zc2xfZGVsc2Vzc2lvbmlkKGNvbm4sICh2b2lkICopb2xkX2NyZWQpOwpAQCAtNzc5LDcgKzg2Miw3IEBACiAgICAgICB9CiAgICAgfQogICAgIGlmKCFpbmNhY2hlKSB7Ci0gICAgICByZXN1bHQgPSBDdXJsX3NzbF9hZGRzZXNzaW9uaWQoY29ubiwgKHZvaWQgKiljb25uc3NsLT5jcmVkLAorICAgICAgcmVzdWx0ID0gQ3VybF9zc2xfYWRkc2Vzc2lvbmlkKGNvbm4sICh2b2lkICopQkFDS0VORC0+Y3JlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGN1cmxfc2NoYW5uZWxfY3JlZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2luZGV4KTsKICAgICAgIGlmKHJlc3VsdCkgewpAQCAtNzg5LDcgKzg3Miw3IEBACiAgICAgICB9CiAgICAgICBlbHNlIHsKICAgICAgICAgLyogdGhpcyBjcmVkIHNlc3Npb24gaXMgbm93IGFsc28gcmVmZXJlbmNlZCBieSBzZXNzaW9uaWQgY2FjaGUgKi8KLSAgICAgICAgY29ubnNzbC0+Y3JlZC0+cmVmY291bnQrKzsKKyAgICAgICAgQkFDS0VORC0+Y3JlZC0+cmVmY291bnQrKzsKICAgICAgICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBzdG9yZWQgY3JlZGVudGlhbCBoYW5kbGUgaW4gc2Vzc2lvbiBjYWNoZVxuIik7CiAgICAgICB9CiAgICAgfQpAQCAtNzk3LDcgKzg4MCw3IEBACiAgIH0KIAogICBpZihkYXRhLT5zZXQuc3NsLmNlcnRpbmZvKSB7Ci0gICAgc3NwaV9zdGF0dXMgPSBzX3BTZWNGbi0+UXVlcnlDb250ZXh0QXR0cmlidXRlcygmY29ubnNzbC0+Y3R4dC0+Y3R4dF9oYW5kbGUsCisgICAgc3NwaV9zdGF0dXMgPSBzX3BTZWNGbi0+UXVlcnlDb250ZXh0QXR0cmlidXRlcygmQkFDS0VORC0+Y3R4dC0+Y3R4dF9oYW5kbGUsCiAgICAgICBTRUNQS0dfQVRUUl9SRU1PVEVfQ0VSVF9DT05URVhULCAmY2NlcnRfY29udGV4dCk7CiAKICAgICBpZigoc3NwaV9zdGF0dXMgIT0gU0VDX0VfT0spIHx8IChjY2VydF9jb250ZXh0ID09IE5VTEwpKSB7CkBAIC05NTEsMTEgKzEwMzQsMTEgQEAKICAgQ1VSTGNvZGUgcmVzdWx0OwogCiAgIC8qIGNoZWNrIGlmIHRoZSBtYXhpbXVtIHN0cmVhbSBzaXplcyB3ZXJlIHF1ZXJpZWQgKi8KLSAgaWYoY29ubnNzbC0+c3RyZWFtX3NpemVzLmNiTWF4aW11bU1lc3NhZ2UgPT0gMCkgeworICBpZihCQUNLRU5ELT5zdHJlYW1fc2l6ZXMuY2JNYXhpbXVtTWVzc2FnZSA9PSAwKSB7CiAgICAgc3NwaV9zdGF0dXMgPSBzX3BTZWNGbi0+UXVlcnlDb250ZXh0QXR0cmlidXRlcygKLSAgICAgICZjb25uc3NsLT5jdHh0LT5jdHh0X2hhbmRsZSwKKyAgICAgICZCQUNLRU5ELT5jdHh0LT5jdHh0X2hhbmRsZSwKICAgICAgIFNFQ1BLR19BVFRSX1NUUkVBTV9TSVpFUywKLSAgICAgICZjb25uc3NsLT5zdHJlYW1fc2l6ZXMpOworICAgICAgJkJBQ0tFTkQtPnN0cmVhbV9zaXplcyk7CiAgICAgaWYoc3NwaV9zdGF0dXMgIT0gU0VDX0VfT0spIHsKICAgICAgICplcnIgPSBDVVJMRV9TRU5EX0VSUk9SOwogICAgICAgcmV0dXJuIC0xOwpAQCAtOTYzLDE0ICsxMDQ2LDEzIEBACiAgIH0KIAogICAvKiBjaGVjayBpZiB0aGUgYnVmZmVyIGlzIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIG1lc3NhZ2UgbGVuZ3RoICovCi0gIGlmKGxlbiA+IGNvbm5zc2wtPnN0cmVhbV9zaXplcy5jYk1heGltdW1NZXNzYWdlKSB7Ci0gICAgKmVyciA9IENVUkxFX1NFTkRfRVJST1I7Ci0gICAgcmV0dXJuIC0xOworICBpZihsZW4gPiBCQUNLRU5ELT5zdHJlYW1fc2l6ZXMuY2JNYXhpbXVtTWVzc2FnZSkgeworICAgIGxlbiA9IEJBQ0tFTkQtPnN0cmVhbV9zaXplcy5jYk1heGltdW1NZXNzYWdlOwogICB9CiAKICAgLyogY2FsY3VsYXRlIHRoZSBjb21wbGV0ZSBtZXNzYWdlIGxlbmd0aCBhbmQgYWxsb2NhdGUgYSBidWZmZXIgZm9yIGl0ICovCi0gIGRhdGFfbGVuID0gY29ubnNzbC0+c3RyZWFtX3NpemVzLmNiSGVhZGVyICsgbGVuICsKLSAgICBjb25uc3NsLT5zdHJlYW1fc2l6ZXMuY2JUcmFpbGVyOworICBkYXRhX2xlbiA9IEJBQ0tFTkQtPnN0cmVhbV9zaXplcy5jYkhlYWRlciArIGxlbiArCisgICAgQkFDS0VORC0+c3RyZWFtX3NpemVzLmNiVHJhaWxlcjsKICAgZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIG1hbGxvYyhkYXRhX2xlbik7CiAgIGlmKGRhdGEgPT0gTlVMTCkgewogICAgICplcnIgPSBDVVJMRV9PVVRfT0ZfTUVNT1JZOwpAQCAtOTc5LDEyICsxMDYxLDEyIEBACiAKICAgLyogc2V0dXAgb3V0cHV0IGJ1ZmZlcnMgKGhlYWRlciwgZGF0YSwgdHJhaWxlciwgZW1wdHkpICovCiAgIEluaXRTZWNCdWZmZXIoJm91dGJ1ZlswXSwgU0VDQlVGRkVSX1NUUkVBTV9IRUFERVIsCi0gICAgICAgICAgICAgICAgZGF0YSwgY29ubnNzbC0+c3RyZWFtX3NpemVzLmNiSGVhZGVyKTsKKyAgICAgICAgICAgICAgICBkYXRhLCBCQUNLRU5ELT5zdHJlYW1fc2l6ZXMuY2JIZWFkZXIpOwogICBJbml0U2VjQnVmZmVyKCZvdXRidWZbMV0sIFNFQ0JVRkZFUl9EQVRBLAotICAgICAgICAgICAgICAgIGRhdGEgKyBjb25uc3NsLT5zdHJlYW1fc2l6ZXMuY2JIZWFkZXIsIGN1cmx4X3V6dG91bChsZW4pKTsKKyAgICAgICAgICAgICAgICBkYXRhICsgQkFDS0VORC0+c3RyZWFtX3NpemVzLmNiSGVhZGVyLCBjdXJseF91enRvdWwobGVuKSk7CiAgIEluaXRTZWNCdWZmZXIoJm91dGJ1ZlsyXSwgU0VDQlVGRkVSX1NUUkVBTV9UUkFJTEVSLAotICAgICAgICAgICAgICAgIGRhdGEgKyBjb25uc3NsLT5zdHJlYW1fc2l6ZXMuY2JIZWFkZXIgKyBsZW4sCi0gICAgICAgICAgICAgICAgY29ubnNzbC0+c3RyZWFtX3NpemVzLmNiVHJhaWxlcik7CisgICAgICAgICAgICAgICAgZGF0YSArIEJBQ0tFTkQtPnN0cmVhbV9zaXplcy5jYkhlYWRlciArIGxlbiwKKyAgICAgICAgICAgICAgICBCQUNLRU5ELT5zdHJlYW1fc2l6ZXMuY2JUcmFpbGVyKTsKICAgSW5pdFNlY0J1ZmZlcigmb3V0YnVmWzNdLCBTRUNCVUZGRVJfRU1QVFksIE5VTEwsIDApOwogICBJbml0U2VjQnVmZmVyRGVzYygmb3V0YnVmX2Rlc2MsIG91dGJ1ZiwgNCk7CiAKQEAgLTk5Miw3ICsxMDc0LDcgQEAKICAgbWVtY3B5KG91dGJ1ZlsxXS5wdkJ1ZmZlciwgYnVmLCBsZW4pOwogCiAgIC8qIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9kZXNrdG9wL2FhMzc1MzkwLmFzcHggKi8KLSAgc3NwaV9zdGF0dXMgPSBzX3BTZWNGbi0+RW5jcnlwdE1lc3NhZ2UoJmNvbm5zc2wtPmN0eHQtPmN0eHRfaGFuZGxlLCAwLAorICBzc3BpX3N0YXR1cyA9IHNfcFNlY0ZuLT5FbmNyeXB0TWVzc2FnZSgmQkFDS0VORC0+Y3R4dC0+Y3R4dF9oYW5kbGUsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRidWZfZGVzYywgMCk7CiAKICAgLyogY2hlY2sgaWYgdGhlIG1lc3NhZ2Ugd2FzIGVuY3J5cHRlZCAqLwpAQCAtMTEwMiw3ICsxMTg0LDcgQEAKICAgc2l6ZV90IG1pbl9lbmNkYXRhX2xlbmd0aCA9IGxlbiArIENVUkxfU0NIQU5ORUxfQlVGRkVSX0ZSRUVfU0laRTsKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBEb24ndCByZXR1cm4gb3Igc2V0IGNvbm5zc2wtPnJlY3ZfdW5yZWNvdmVyYWJsZV9lcnIgdW5sZXNzIGluIHRoZSBjbGVhbnVwLgorICAgKiBEb24ndCByZXR1cm4gb3Igc2V0IEJBQ0tFTkQtPnJlY3ZfdW5yZWNvdmVyYWJsZV9lcnIgdW5sZXNzIGluIHRoZSBjbGVhbnVwLgogICAgKiBUaGUgcGF0dGVybiBmb3IgcmV0dXJuIGVycm9yIGlzIHNldCAqZXJyLCBvcHRpb25hbCBpbmZvZiwgZ290byBjbGVhbnVwLgogICAgKgogICAgKiBPdXIgcHJpb3JpdHkgaXMgdG8gYWx3YXlzIHJldHVybiBhcyBtdWNoIGRlY3J5cHRlZCBkYXRhIHRvIHRoZSBjYWxsZXIgYXMKQEAgLTExMTQsMTYgKzExOTYsMTYgQEAKICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBjbGllbnQgd2FudHMgdG8gcmVhZCAlenUgYnl0ZXNcbiIsIGxlbik7CiAgICplcnIgPSBDVVJMRV9PSzsKIAotICBpZihsZW4gJiYgbGVuIDw9IGNvbm5zc2wtPmRlY2RhdGFfb2Zmc2V0KSB7CisgIGlmKGxlbiAmJiBsZW4gPD0gQkFDS0VORC0+ZGVjZGF0YV9vZmZzZXQpIHsKICAgICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IGVub3VnaCBkZWNyeXB0ZWQgZGF0YSBpcyBhbHJlYWR5IGF2YWlsYWJsZVxuIik7CiAgICAgZ290byBjbGVhbnVwOwogICB9Ci0gIGVsc2UgaWYoY29ubnNzbC0+cmVjdl91bnJlY292ZXJhYmxlX2VycikgewotICAgICplcnIgPSBjb25uc3NsLT5yZWN2X3VucmVjb3ZlcmFibGVfZXJyOworICBlbHNlIGlmKEJBQ0tFTkQtPnJlY3ZfdW5yZWNvdmVyYWJsZV9lcnIpIHsKKyAgICAqZXJyID0gQkFDS0VORC0+cmVjdl91bnJlY292ZXJhYmxlX2VycjsKICAgICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IGFuIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJyZWQgaW4gYSBwcmlvciBjYWxsXG4iKTsKICAgICBnb3RvIGNsZWFudXA7CiAgIH0KLSAgZWxzZSBpZihjb25uc3NsLT5yZWN2X3NzcGlfY2xvc2Vfbm90aWZ5KSB7CisgIGVsc2UgaWYoQkFDS0VORC0+cmVjdl9zc3BpX2Nsb3NlX25vdGlmeSkgewogICAgIC8qIG9uY2UgYSBzZXJ2ZXIgaGFzIGluZGljYXRlZCBzaHV0ZG93biB0aGVyZSBpcyBubyBtb3JlIGVuY3J5cHRlZCBkYXRhICovCiAgICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBzZXJ2ZXIgaW5kaWNhdGVkIHNodXRkb3duIGluIGEgcHJpb3IgY2FsbFxuIik7CiAgICAgZ290byBjbGVhbnVwOwpAQCAtMTEzNSwxNyArMTIxNywxNyBAQAogICAgICovCiAgICAgOyAvKiBkbyBub3RoaW5nICovCiAgIH0KLSAgZWxzZSBpZighY29ubnNzbC0+cmVjdl9jb25uZWN0aW9uX2Nsb3NlZCkgeworICBlbHNlIGlmKCFCQUNLRU5ELT5yZWN2X2Nvbm5lY3Rpb25fY2xvc2VkKSB7CiAgICAgLyogaW5jcmVhc2UgZW5jIGJ1ZmZlciBpbiBvcmRlciB0byBmaXQgdGhlIHJlcXVlc3RlZCBhbW91bnQgb2YgZGF0YSAqLwotICAgIHNpemUgPSBjb25uc3NsLT5lbmNkYXRhX2xlbmd0aCAtIGNvbm5zc2wtPmVuY2RhdGFfb2Zmc2V0OworICAgIHNpemUgPSBCQUNLRU5ELT5lbmNkYXRhX2xlbmd0aCAtIEJBQ0tFTkQtPmVuY2RhdGFfb2Zmc2V0OwogICAgIGlmKHNpemUgPCBDVVJMX1NDSEFOTkVMX0JVRkZFUl9GUkVFX1NJWkUgfHwKLSAgICAgICBjb25uc3NsLT5lbmNkYXRhX2xlbmd0aCA8IG1pbl9lbmNkYXRhX2xlbmd0aCkgewotICAgICAgcmVhbGxvY2F0ZWRfbGVuZ3RoID0gY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQgKworICAgICAgIEJBQ0tFTkQtPmVuY2RhdGFfbGVuZ3RoIDwgbWluX2VuY2RhdGFfbGVuZ3RoKSB7CisgICAgICByZWFsbG9jYXRlZF9sZW5ndGggPSBCQUNLRU5ELT5lbmNkYXRhX29mZnNldCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMX1NDSEFOTkVMX0JVRkZFUl9GUkVFX1NJWkU7CiAgICAgICBpZihyZWFsbG9jYXRlZF9sZW5ndGggPCBtaW5fZW5jZGF0YV9sZW5ndGgpIHsKICAgICAgICAgcmVhbGxvY2F0ZWRfbGVuZ3RoID0gbWluX2VuY2RhdGFfbGVuZ3RoOwogICAgICAgfQotICAgICAgcmVhbGxvY2F0ZWRfYnVmZmVyID0gcmVhbGxvYyhjb25uc3NsLT5lbmNkYXRhX2J1ZmZlciwKKyAgICAgIHJlYWxsb2NhdGVkX2J1ZmZlciA9IHJlYWxsb2MoQkFDS0VORC0+ZW5jZGF0YV9idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxsb2NhdGVkX2xlbmd0aCk7CiAgICAgICBpZihyZWFsbG9jYXRlZF9idWZmZXIgPT0gTlVMTCkgewogICAgICAgICAqZXJyID0gQ1VSTEVfT1VUX09GX01FTU9SWTsKQEAgLTExNTMsMjAgKzEyMzUsMjAgQEAKICAgICAgICAgZ290byBjbGVhbnVwOwogICAgICAgfQogCi0gICAgICBjb25uc3NsLT5lbmNkYXRhX2J1ZmZlciA9IHJlYWxsb2NhdGVkX2J1ZmZlcjsKLSAgICAgIGNvbm5zc2wtPmVuY2RhdGFfbGVuZ3RoID0gcmVhbGxvY2F0ZWRfbGVuZ3RoOwotICAgICAgc2l6ZSA9IGNvbm5zc2wtPmVuY2RhdGFfbGVuZ3RoIC0gY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQ7CisgICAgICBCQUNLRU5ELT5lbmNkYXRhX2J1ZmZlciA9IHJlYWxsb2NhdGVkX2J1ZmZlcjsKKyAgICAgIEJBQ0tFTkQtPmVuY2RhdGFfbGVuZ3RoID0gcmVhbGxvY2F0ZWRfbGVuZ3RoOworICAgICAgc2l6ZSA9IEJBQ0tFTkQtPmVuY2RhdGFfbGVuZ3RoIC0gQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQ7CiAgICAgICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IGVuY2RhdGFfYnVmZmVyIHJlc2l6ZWQgJXp1XG4iLAotICAgICAgICAgICAgY29ubnNzbC0+ZW5jZGF0YV9sZW5ndGgpOworICAgICAgICAgICAgQkFDS0VORC0+ZW5jZGF0YV9sZW5ndGgpOwogICAgIH0KIAogICAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogZW5jcnlwdGVkIGRhdGEgYnVmZmVyOiBvZmZzZXQgJXp1IGxlbmd0aCAlenVcbiIsCi0gICAgICAgICAgY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQsIGNvbm5zc2wtPmVuY2RhdGFfbGVuZ3RoKTsKKyAgICAgICAgICBCQUNLRU5ELT5lbmNkYXRhX29mZnNldCwgQkFDS0VORC0+ZW5jZGF0YV9sZW5ndGgpOwogCiAgICAgLyogcmVhZCBlbmNyeXB0ZWQgZGF0YSBmcm9tIHNvY2tldCAqLwogICAgICplcnIgPSBDdXJsX3JlYWRfcGxhaW4oY29ubi0+c29ja1tzb2NraW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikoY29ubnNzbC0+ZW5jZGF0YV9idWZmZXIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikoQkFDS0VORC0+ZW5jZGF0YV9idWZmZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgJm5yZWFkKTsKICAgICBpZigqZXJyKSB7CiAgICAgICBucmVhZCA9IC0xOwpAQCAtMTE3OCwyNiArMTI2MCwyNiBAQAogICAgICAgICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IEN1cmxfcmVhZF9wbGFpbiByZXR1cm5lZCBlcnJvciAlZFxuIiwgKmVycik7CiAgICAgfQogICAgIGVsc2UgaWYobnJlYWQgPT0gMCkgewotICAgICAgY29ubnNzbC0+cmVjdl9jb25uZWN0aW9uX2Nsb3NlZCA9IHRydWU7CisgICAgICBCQUNLRU5ELT5yZWN2X2Nvbm5lY3Rpb25fY2xvc2VkID0gdHJ1ZTsKICAgICAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvblxuIik7CiAgICAgfQogICAgIGVsc2UgaWYobnJlYWQgPiAwKSB7Ci0gICAgICBjb25uc3NsLT5lbmNkYXRhX29mZnNldCArPSAoc2l6ZV90KW5yZWFkOwotICAgICAgY29ubnNzbC0+ZW5jZGF0YV9pc19pbmNvbXBsZXRlID0gZmFsc2U7CisgICAgICBCQUNLRU5ELT5lbmNkYXRhX29mZnNldCArPSAoc2l6ZV90KW5yZWFkOworICAgICAgQkFDS0VORC0+ZW5jZGF0YV9pc19pbmNvbXBsZXRlID0gZmFsc2U7CiAgICAgICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IGVuY3J5cHRlZCBkYXRhIGdvdCAlemRcbiIsIG5yZWFkKTsKICAgICB9CiAgIH0KIAogICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IGVuY3J5cHRlZCBkYXRhIGJ1ZmZlcjogb2Zmc2V0ICV6dSBsZW5ndGggJXp1XG4iLAotICAgICAgICBjb25uc3NsLT5lbmNkYXRhX29mZnNldCwgY29ubnNzbC0+ZW5jZGF0YV9sZW5ndGgpOworICAgICAgICBCQUNLRU5ELT5lbmNkYXRhX29mZnNldCwgQkFDS0VORC0+ZW5jZGF0YV9sZW5ndGgpOwogCiAgIC8qIGRlY3J5cHQgbG9vcCAqLwotICB3aGlsZShjb25uc3NsLT5lbmNkYXRhX29mZnNldCA+IDAgJiYgc3NwaV9zdGF0dXMgPT0gU0VDX0VfT0sgJiYKLSAgICAgICAgKCFsZW4gfHwgY29ubnNzbC0+ZGVjZGF0YV9vZmZzZXQgPCBsZW4gfHwKLSAgICAgICAgIGNvbm5zc2wtPnJlY3ZfY29ubmVjdGlvbl9jbG9zZWQpKSB7CisgIHdoaWxlKEJBQ0tFTkQtPmVuY2RhdGFfb2Zmc2V0ID4gMCAmJiBzc3BpX3N0YXR1cyA9PSBTRUNfRV9PSyAmJgorICAgICAgICAoIWxlbiB8fCBCQUNLRU5ELT5kZWNkYXRhX29mZnNldCA8IGxlbiB8fAorICAgICAgICAgQkFDS0VORC0+cmVjdl9jb25uZWN0aW9uX2Nsb3NlZCkpIHsKICAgICAvKiBwcmVwYXJlIGRhdGEgYnVmZmVyIGZvciBEZWNyeXB0TWVzc2FnZSBjYWxsICovCi0gICAgSW5pdFNlY0J1ZmZlcigmaW5idWZbMF0sIFNFQ0JVRkZFUl9EQVRBLCBjb25uc3NsLT5lbmNkYXRhX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgIGN1cmx4X3V6dG91bChjb25uc3NsLT5lbmNkYXRhX29mZnNldCkpOworICAgIEluaXRTZWNCdWZmZXIoJmluYnVmWzBdLCBTRUNCVUZGRVJfREFUQSwgQkFDS0VORC0+ZW5jZGF0YV9idWZmZXIsCisgICAgICAgICAgICAgICAgICBjdXJseF91enRvdWwoQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQpKTsKIAogICAgIC8qIHdlIG5lZWQgMyBtb3JlIGVtcHR5IGlucHV0IGJ1ZmZlcnMgZm9yIHBvc3NpYmxlIG91dHB1dCAqLwogICAgIEluaXRTZWNCdWZmZXIoJmluYnVmWzFdLCBTRUNCVUZGRVJfRU1QVFksIE5VTEwsIDApOwpAQCAtMTIwNyw3ICsxMjg5LDcgQEAKIAogICAgIC8qIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9kZXNrdG9wL2FhMzc1MzQ4LmFzcHgKICAgICAgICAqLwotICAgIHNzcGlfc3RhdHVzID0gc19wU2VjRm4tPkRlY3J5cHRNZXNzYWdlKCZjb25uc3NsLT5jdHh0LT5jdHh0X2hhbmRsZSwKKyAgICBzc3BpX3N0YXR1cyA9IHNfcFNlY0ZuLT5EZWNyeXB0TWVzc2FnZSgmQkFDS0VORC0+Y3R4dC0+Y3R4dF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluYnVmX2Rlc2MsIDAsIE5VTEwpOwogCiAgICAgLyogY2hlY2sgaWYgZXZlcnl0aGluZyB3ZW50IGZpbmUgKHNlcnZlciBtYXkgd2FudCB0byByZW5lZ290aWF0ZQpAQCAtMTIyMywzNiArMTMwNSwzNiBAQAogICAgICAgICAvKiBpbmNyZWFzZSBidWZmZXIgaW4gb3JkZXIgdG8gZml0IHRoZSByZWNlaXZlZCBhbW91bnQgb2YgZGF0YSAqLwogICAgICAgICBzaXplID0gaW5idWZbMV0uY2JCdWZmZXIgPiBDVVJMX1NDSEFOTkVMX0JVRkZFUl9GUkVFX1NJWkUgPwogICAgICAgICAgICAgICAgaW5idWZbMV0uY2JCdWZmZXIgOiBDVVJMX1NDSEFOTkVMX0JVRkZFUl9GUkVFX1NJWkU7Ci0gICAgICAgIGlmKGNvbm5zc2wtPmRlY2RhdGFfbGVuZ3RoIC0gY29ubnNzbC0+ZGVjZGF0YV9vZmZzZXQgPCBzaXplIHx8Ci0gICAgICAgICAgIGNvbm5zc2wtPmRlY2RhdGFfbGVuZ3RoIDwgbGVuKSB7CisgICAgICAgIGlmKEJBQ0tFTkQtPmRlY2RhdGFfbGVuZ3RoIC0gQkFDS0VORC0+ZGVjZGF0YV9vZmZzZXQgPCBzaXplIHx8CisgICAgICAgICAgIEJBQ0tFTkQtPmRlY2RhdGFfbGVuZ3RoIDwgbGVuKSB7CiAgICAgICAgICAgLyogaW5jcmVhc2UgaW50ZXJuYWwgZGVjcnlwdGVkIGRhdGEgYnVmZmVyICovCi0gICAgICAgICAgcmVhbGxvY2F0ZWRfbGVuZ3RoID0gY29ubnNzbC0+ZGVjZGF0YV9vZmZzZXQgKyBzaXplOworICAgICAgICAgIHJlYWxsb2NhdGVkX2xlbmd0aCA9IEJBQ0tFTkQtPmRlY2RhdGFfb2Zmc2V0ICsgc2l6ZTsKICAgICAgICAgICAvKiBtYWtlIHN1cmUgdGhhdCB0aGUgcmVxdWVzdGVkIGFtb3VudCBvZiBkYXRhIGZpdHMgKi8KICAgICAgICAgICBpZihyZWFsbG9jYXRlZF9sZW5ndGggPCBsZW4pIHsKICAgICAgICAgICAgIHJlYWxsb2NhdGVkX2xlbmd0aCA9IGxlbjsKICAgICAgICAgICB9Ci0gICAgICAgICAgcmVhbGxvY2F0ZWRfYnVmZmVyID0gcmVhbGxvYyhjb25uc3NsLT5kZWNkYXRhX2J1ZmZlciwKKyAgICAgICAgICByZWFsbG9jYXRlZF9idWZmZXIgPSByZWFsbG9jKEJBQ0tFTkQtPmRlY2RhdGFfYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGxvY2F0ZWRfbGVuZ3RoKTsKICAgICAgICAgICBpZihyZWFsbG9jYXRlZF9idWZmZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgKmVyciA9IENVUkxFX09VVF9PRl9NRU1PUlk7CiAgICAgICAgICAgICBmYWlsZihkYXRhLCAic2NoYW5uZWw6IHVuYWJsZSB0byByZS1hbGxvY2F0ZSBtZW1vcnkiKTsKICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKICAgICAgICAgICB9Ci0gICAgICAgICAgY29ubnNzbC0+ZGVjZGF0YV9idWZmZXIgPSByZWFsbG9jYXRlZF9idWZmZXI7Ci0gICAgICAgICAgY29ubnNzbC0+ZGVjZGF0YV9sZW5ndGggPSByZWFsbG9jYXRlZF9sZW5ndGg7CisgICAgICAgICAgQkFDS0VORC0+ZGVjZGF0YV9idWZmZXIgPSByZWFsbG9jYXRlZF9idWZmZXI7CisgICAgICAgICAgQkFDS0VORC0+ZGVjZGF0YV9sZW5ndGggPSByZWFsbG9jYXRlZF9sZW5ndGg7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBjb3B5IGRlY3J5cHRlZCBkYXRhIHRvIGludGVybmFsIGJ1ZmZlciAqLwogICAgICAgICBzaXplID0gaW5idWZbMV0uY2JCdWZmZXI7CiAgICAgICAgIGlmKHNpemUpIHsKLSAgICAgICAgICBtZW1jcHkoY29ubnNzbC0+ZGVjZGF0YV9idWZmZXIgKyBjb25uc3NsLT5kZWNkYXRhX29mZnNldCwKKyAgICAgICAgICBtZW1jcHkoQkFDS0VORC0+ZGVjZGF0YV9idWZmZXIgKyBCQUNLRU5ELT5kZWNkYXRhX29mZnNldCwKICAgICAgICAgICAgICAgICAgaW5idWZbMV0ucHZCdWZmZXIsIHNpemUpOwotICAgICAgICAgIGNvbm5zc2wtPmRlY2RhdGFfb2Zmc2V0ICs9IHNpemU7CisgICAgICAgICAgQkFDS0VORC0+ZGVjZGF0YV9vZmZzZXQgKz0gc2l6ZTsKICAgICAgICAgfQogCiAgICAgICAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogZGVjcnlwdGVkIGRhdGEgYWRkZWQ6ICV6dVxuIiwgc2l6ZSk7CiAgICAgICAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogZGVjcnlwdGVkIGRhdGEgY2FjaGVkOiBvZmZzZXQgJXp1IGxlbmd0aCAlenVcbiIsCi0gICAgICAgICAgICAgIGNvbm5zc2wtPmRlY2RhdGFfb2Zmc2V0LCBjb25uc3NsLT5kZWNkYXRhX2xlbmd0aCk7CisgICAgICAgICAgICAgIEJBQ0tFTkQtPmRlY2RhdGFfb2Zmc2V0LCBCQUNLRU5ELT5kZWNkYXRhX2xlbmd0aCk7CiAgICAgICB9CiAKICAgICAgIC8qIGNoZWNrIGZvciByZW1haW5pbmcgZW5jcnlwdGVkIGRhdGEgKi8KQEAgLTEyNjMsMjEgKzEzNDUsMjEgQEAKICAgICAgICAgLyogY2hlY2sgaWYgdGhlIHJlbWFpbmluZyBkYXRhIGlzIGxlc3MgdGhhbiB0aGUgdG90YWwgYW1vdW50CiAgICAgICAgICAqIGFuZCB0aGVyZWZvcmUgYmVnaW5zIGFmdGVyIHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBkYXRhCiAgICAgICAgICAqLwotICAgICAgICBpZihjb25uc3NsLT5lbmNkYXRhX29mZnNldCA+IGluYnVmWzNdLmNiQnVmZmVyKSB7CisgICAgICAgIGlmKEJBQ0tFTkQtPmVuY2RhdGFfb2Zmc2V0ID4gaW5idWZbM10uY2JCdWZmZXIpIHsKICAgICAgICAgICAvKiBtb3ZlIHJlbWFpbmluZyBlbmNyeXB0ZWQgZGF0YSBmb3J3YXJkIHRvIHRoZSBiZWdpbm5pbmcgb2YKICAgICAgICAgICAgICBidWZmZXIgKi8KLSAgICAgICAgICBtZW1tb3ZlKGNvbm5zc2wtPmVuY2RhdGFfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgKGNvbm5zc2wtPmVuY2RhdGFfYnVmZmVyICsgY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQpIC0KKyAgICAgICAgICBtZW1tb3ZlKEJBQ0tFTkQtPmVuY2RhdGFfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgKEJBQ0tFTkQtPmVuY2RhdGFfYnVmZmVyICsgQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQpIC0KICAgICAgICAgICAgICAgICAgIGluYnVmWzNdLmNiQnVmZmVyLCBpbmJ1ZlszXS5jYkJ1ZmZlcik7Ci0gICAgICAgICAgY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQgPSBpbmJ1ZlszXS5jYkJ1ZmZlcjsKKyAgICAgICAgICBCQUNLRU5ELT5lbmNkYXRhX29mZnNldCA9IGluYnVmWzNdLmNiQnVmZmVyOwogICAgICAgICB9CiAKICAgICAgICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBlbmNyeXB0ZWQgZGF0YSBjYWNoZWQ6IG9mZnNldCAlenUgbGVuZ3RoICV6dVxuIiwKLSAgICAgICAgICAgICAgY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQsIGNvbm5zc2wtPmVuY2RhdGFfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQsIEJBQ0tFTkQtPmVuY2RhdGFfbGVuZ3RoKTsKICAgICAgIH0KICAgICAgIGVsc2UgewogICAgICAgICAvKiByZXNldCBlbmNyeXB0ZWQgYnVmZmVyIG9mZnNldCwgYmVjYXVzZSB0aGVyZSBpcyBubyBkYXRhIHJlbWFpbmluZyAqLwotICAgICAgICBjb25uc3NsLT5lbmNkYXRhX29mZnNldCA9IDA7CisgICAgICAgIEJBQ0tFTkQtPmVuY2RhdGFfb2Zmc2V0ID0gMDsKICAgICAgIH0KIAogICAgICAgLyogY2hlY2sgaWYgc2VydmVyIHdhbnRzIHRvIHJlbmVnb3RpYXRlIHRoZSBjb25uZWN0aW9uIGNvbnRleHQgKi8KQEAgLTEyODcsNyArMTM2OSw3IEBACiAgICAgICAgICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBjYW4ndCByZW5vZ290aWF0ZSwgYW4gZXJyb3IgaXMgcGVuZGluZ1xuIik7CiAgICAgICAgICAgZ290byBjbGVhbnVwOwogICAgICAgICB9Ci0gICAgICAgIGlmKGNvbm5zc2wtPmVuY2RhdGFfb2Zmc2V0KSB7CisgICAgICAgIGlmKEJBQ0tFTkQtPmVuY2RhdGFfb2Zmc2V0KSB7CiAgICAgICAgICAgKmVyciA9IENVUkxFX1JFQ1ZfRVJST1I7CiAgICAgICAgICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBjYW4ndCByZW5vZ290aWF0ZSwgIgogICAgICAgICAgICAgICAgICAgICAgICJlbmNyeXB0ZWQgZGF0YSBhdmFpbGFibGVcbiIpOwpAQCAtMTMxMSwxNiArMTM5MywxNiBAQAogICAgICAgZWxzZSBpZihzc3BpX3N0YXR1cyA9PSBTRUNfSV9DT05URVhUX0VYUElSRUQpIHsKICAgICAgICAgLyogSW4gV2luZG93cyAyMDAwIFNFQ19JX0NPTlRFWFRfRVhQSVJFRCAoY2xvc2Vfbm90aWZ5KSBpcyBub3QKICAgICAgICAgICAgcmV0dXJuZWQgc28gd2UgaGF2ZSB0byB3b3JrIGFyb3VuZCB0aGF0IGluIGNsZWFudXAuICovCi0gICAgICAgIGNvbm5zc2wtPnJlY3Zfc3NwaV9jbG9zZV9ub3RpZnkgPSB0cnVlOwotICAgICAgICBpZighY29ubnNzbC0+cmVjdl9jb25uZWN0aW9uX2Nsb3NlZCkgewotICAgICAgICAgIGNvbm5zc2wtPnJlY3ZfY29ubmVjdGlvbl9jbG9zZWQgPSB0cnVlOworICAgICAgICBCQUNLRU5ELT5yZWN2X3NzcGlfY2xvc2Vfbm90aWZ5ID0gdHJ1ZTsKKyAgICAgICAgaWYoIUJBQ0tFTkQtPnJlY3ZfY29ubmVjdGlvbl9jbG9zZWQpIHsKKyAgICAgICAgICBCQUNLRU5ELT5yZWN2X2Nvbm5lY3Rpb25fY2xvc2VkID0gdHJ1ZTsKICAgICAgICAgICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb25cbiIpOwogICAgICAgICB9CiAgICAgICAgIGdvdG8gY2xlYW51cDsKICAgICAgIH0KICAgICB9CiAgICAgZWxzZSBpZihzc3BpX3N0YXR1cyA9PSBTRUNfRV9JTkNPTVBMRVRFX01FU1NBR0UpIHsKLSAgICAgIGNvbm5zc2wtPmVuY2RhdGFfaXNfaW5jb21wbGV0ZSA9IHRydWU7CisgICAgICBCQUNLRU5ELT5lbmNkYXRhX2lzX2luY29tcGxldGUgPSB0cnVlOwogICAgICAgaWYoISplcnIpCiAgICAgICAgICplcnIgPSBDVVJMRV9BR0FJTjsKICAgICAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogZmFpbGVkIHRvIGRlY3J5cHQgZGF0YSwgbmVlZCBtb3JlIGRhdGFcbiIpOwpAQCAtMTMzNSwxMCArMTQxNywxMCBAQAogICB9CiAKICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBlbmNyeXB0ZWQgZGF0YSBidWZmZXI6IG9mZnNldCAlenUgbGVuZ3RoICV6dVxuIiwKLSAgICAgICAgY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQsIGNvbm5zc2wtPmVuY2RhdGFfbGVuZ3RoKTsKKyAgICAgICAgQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQsIEJBQ0tFTkQtPmVuY2RhdGFfbGVuZ3RoKTsKIAogICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IGRlY3J5cHRlZCBkYXRhIGJ1ZmZlcjogb2Zmc2V0ICV6dSBsZW5ndGggJXp1XG4iLAotICAgICAgICBjb25uc3NsLT5kZWNkYXRhX29mZnNldCwgY29ubnNzbC0+ZGVjZGF0YV9sZW5ndGgpOworICAgICAgICBCQUNLRU5ELT5kZWNkYXRhX29mZnNldCwgQkFDS0VORC0+ZGVjZGF0YV9sZW5ndGgpOwogCiBjbGVhbnVwOgogICAvKiBXYXJuaW5nLSB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhlIGVuY2RhdGEgc3RhdGUgaXMgdmFsaWQgYXQgdGhpcyBwb2ludCAqLwpAQCAtMTM1MiwxMyArMTQzNCwxMyBAQAogICByZXR1cm4gY2xvc2Vfbm90aWZ5LiBJbiB0aGF0IGNhc2UgaWYgdGhlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCB3ZSBhc3N1bWUgaXQKICAgd2FzIGdyYWNlZnVsIChjbG9zZV9ub3RpZnkpIHNpbmNlIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIHdheSB0byB0ZWxsLgogICAqLwotICBpZihsZW4gJiYgIWNvbm5zc2wtPmRlY2RhdGFfb2Zmc2V0ICYmIGNvbm5zc2wtPnJlY3ZfY29ubmVjdGlvbl9jbG9zZWQgJiYKLSAgICAgIWNvbm5zc2wtPnJlY3Zfc3NwaV9jbG9zZV9ub3RpZnkpIHsKKyAgaWYobGVuICYmICFCQUNLRU5ELT5kZWNkYXRhX29mZnNldCAmJiBCQUNLRU5ELT5yZWN2X2Nvbm5lY3Rpb25fY2xvc2VkICYmCisgICAgICFCQUNLRU5ELT5yZWN2X3NzcGlfY2xvc2Vfbm90aWZ5KSB7CiAgICAgYm9vbCBpc1dpbjJrID0gQ3VybF92ZXJpZnlfd2luZG93c192ZXJzaW9uKDUsIDAsIFBMQVRGT1JNX1dJTk5ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJTSU9OX0VRVUFMKTsKIAogICAgIGlmKGlzV2luMmsgJiYgc3NwaV9zdGF0dXMgPT0gU0VDX0VfT0spCi0gICAgICBjb25uc3NsLT5yZWN2X3NzcGlfY2xvc2Vfbm90aWZ5ID0gdHJ1ZTsKKyAgICAgIEJBQ0tFTkQtPnJlY3Zfc3NwaV9jbG9zZV9ub3RpZnkgPSB0cnVlOwogICAgIGVsc2UgewogICAgICAgKmVyciA9IENVUkxFX1JFQ1ZfRVJST1I7CiAgICAgICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IHNlcnZlciBjbG9zZWQgYWJydXB0bHkgKG1pc3NpbmcgY2xvc2Vfbm90aWZ5KVxuIik7CkBAIC0xMzY3LDIzICsxNDQ5LDIzIEBACiAKICAgLyogQW55IGVycm9yIG90aGVyIHRoYW4gQ1VSTEVfQUdBSU4gaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4gKi8KICAgaWYoKmVyciAmJiAqZXJyICE9IENVUkxFX0FHQUlOKQotICAgICAgY29ubnNzbC0+cmVjdl91bnJlY292ZXJhYmxlX2VyciA9ICplcnI7CisgICAgICBCQUNLRU5ELT5yZWN2X3VucmVjb3ZlcmFibGVfZXJyID0gKmVycjsKIAotICBzaXplID0gbGVuIDwgY29ubnNzbC0+ZGVjZGF0YV9vZmZzZXQgPyBsZW4gOiBjb25uc3NsLT5kZWNkYXRhX29mZnNldDsKKyAgc2l6ZSA9IGxlbiA8IEJBQ0tFTkQtPmRlY2RhdGFfb2Zmc2V0ID8gbGVuIDogQkFDS0VORC0+ZGVjZGF0YV9vZmZzZXQ7CiAgIGlmKHNpemUpIHsKLSAgICBtZW1jcHkoYnVmLCBjb25uc3NsLT5kZWNkYXRhX2J1ZmZlciwgc2l6ZSk7Ci0gICAgbWVtbW92ZShjb25uc3NsLT5kZWNkYXRhX2J1ZmZlciwgY29ubnNzbC0+ZGVjZGF0YV9idWZmZXIgKyBzaXplLAotICAgICAgICAgICAgY29ubnNzbC0+ZGVjZGF0YV9vZmZzZXQgLSBzaXplKTsKLSAgICBjb25uc3NsLT5kZWNkYXRhX29mZnNldCAtPSBzaXplOworICAgIG1lbWNweShidWYsIEJBQ0tFTkQtPmRlY2RhdGFfYnVmZmVyLCBzaXplKTsKKyAgICBtZW1tb3ZlKEJBQ0tFTkQtPmRlY2RhdGFfYnVmZmVyLCBCQUNLRU5ELT5kZWNkYXRhX2J1ZmZlciArIHNpemUsCisgICAgICAgICAgICBCQUNLRU5ELT5kZWNkYXRhX29mZnNldCAtIHNpemUpOworICAgIEJBQ0tFTkQtPmRlY2RhdGFfb2Zmc2V0IC09IHNpemU7CiAKICAgICBpbmZvZihkYXRhLCAic2NoYW5uZWw6IGRlY3J5cHRlZCBkYXRhIHJldHVybmVkICV6dVxuIiwgc2l6ZSk7CiAgICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBkZWNyeXB0ZWQgZGF0YSBidWZmZXI6IG9mZnNldCAlenUgbGVuZ3RoICV6dVxuIiwKLSAgICAgICAgICBjb25uc3NsLT5kZWNkYXRhX29mZnNldCwgY29ubnNzbC0+ZGVjZGF0YV9sZW5ndGgpOworICAgICAgICAgIEJBQ0tFTkQtPmRlY2RhdGFfb2Zmc2V0LCBCQUNLRU5ELT5kZWNkYXRhX2xlbmd0aCk7CiAgICAgKmVyciA9IENVUkxFX09LOwogICAgIHJldHVybiAoc3NpemVfdClzaXplOwogICB9CiAKLSAgaWYoISplcnIgJiYgIWNvbm5zc2wtPnJlY3ZfY29ubmVjdGlvbl9jbG9zZWQpCisgIGlmKCEqZXJyICYmICFCQUNLRU5ELT5yZWN2X2Nvbm5lY3Rpb25fY2xvc2VkKQogICAgICAgKmVyciA9IENVUkxFX0FHQUlOOwogCiAgIC8qIEl0J3MgZGViYXRhYmxlIHdoYXQgdG8gcmV0dXJuIHdoZW4gIWxlbi4gV2UgY291bGQgcmV0dXJuIHdoYXRldmVyIGVycm9yIHdlCkBAIC0xMzk1LDE1ICsxNDc3LDEzIEBACiAgIHJldHVybiAqZXJyID8gLTEgOiAwOwogfQogCi1DVVJMY29kZQotQ3VybF9zY2hhbm5lbF9jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpkb25lKQorc3RhdGljIENVUkxjb2RlIEN1cmxfc2NoYW5uZWxfY29ubmVjdF9ub25ibG9ja2luZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXgsIGJvb2wgKmRvbmUpCiB7CiAgIHJldHVybiBzY2hhbm5lbF9jb25uZWN0X2NvbW1vbihjb25uLCBzb2NraW5kZXgsIFRSVUUsIGRvbmUpOwogfQogCi1DVVJMY29kZQotQ3VybF9zY2hhbm5lbF9jb25uZWN0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKK3N0YXRpYyBDVVJMY29kZSBDdXJsX3NjaGFubmVsX2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQogewogICBDVVJMY29kZSByZXN1bHQ7CiAgIGJvb2wgZG9uZSA9IEZBTFNFOwpAQCAtMTQxNywyNSArMTQ5NywzOCBAQAogICByZXR1cm4gQ1VSTEVfT0s7CiB9CiAKLWJvb2wgQ3VybF9zY2hhbm5lbF9kYXRhX3BlbmRpbmcoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQorc3RhdGljIGJvb2wgQ3VybF9zY2hhbm5lbF9kYXRhX3BlbmRpbmcoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCkKIHsKICAgY29uc3Qgc3RydWN0IHNzbF9jb25uZWN0X2RhdGEgKmNvbm5zc2wgPSAmY29ubi0+c3NsW3NvY2tpbmRleF07CiAKICAgaWYoY29ubnNzbC0+dXNlKSAvKiBTU0wvVExTIGlzIGluIHVzZSAqLwotICAgIHJldHVybiAoY29ubnNzbC0+ZGVjZGF0YV9vZmZzZXQgPiAwIHx8Ci0gICAgICAgICAgICAoY29ubnNzbC0+ZW5jZGF0YV9vZmZzZXQgPiAwICYmICFjb25uc3NsLT5lbmNkYXRhX2lzX2luY29tcGxldGUpKTsKKyAgICByZXR1cm4gKEJBQ0tFTkQtPmRlY2RhdGFfb2Zmc2V0ID4gMCB8fAorICAgICAgICAgICAgKEJBQ0tFTkQtPmVuY2RhdGFfb2Zmc2V0ID4gMCAmJiAhQkFDS0VORC0+ZW5jZGF0YV9pc19pbmNvbXBsZXRlKSk7CiAgIGVsc2UKICAgICByZXR1cm4gRkFMU0U7CiB9CiAKLXZvaWQgQ3VybF9zY2hhbm5lbF9jbG9zZShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpCitzdGF0aWMgdm9pZCBDdXJsX3NjaGFubmVsX2Nsb3NlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKIHsKICAgaWYoY29ubi0+c3NsW3NvY2tpbmRleF0udXNlKQogICAgIC8qIGlmIHRoZSBTU0wvVExTIGNoYW5uZWwgaGFzbid0IGJlZW4gc2h1dCBkb3duIHlldCwgZG8gdGhhdCBub3cuICovCiAgICAgQ3VybF9zc2xfc2h1dGRvd24oY29ubiwgc29ja2luZGV4KTsKIH0KIAotaW50IEN1cmxfc2NoYW5uZWxfc2h1dGRvd24oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQorc3RhdGljIHZvaWQgQ3VybF9zY2hhbm5lbF9zZXNzaW9uX2ZyZWUodm9pZCAqcHRyKQoreworICAvKiB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCB1bmRlciBzZXNzaW9uaWQgbG9jayAqLworICBzdHJ1Y3QgY3VybF9zY2hhbm5lbF9jcmVkICpjcmVkID0gcHRyOworCisgIGNyZWQtPnJlZmNvdW50LS07CisgIGlmKGNyZWQtPnJlZmNvdW50ID09IDApIHsKKyAgICBzX3BTZWNGbi0+RnJlZUNyZWRlbnRpYWxzSGFuZGxlKCZjcmVkLT5jcmVkX2hhbmRsZSk7CisgICAgQ3VybF9zYWZlZnJlZShjcmVkKTsKKyAgfQorfQorCitzdGF0aWMgaW50IEN1cmxfc2NoYW5uZWxfc2h1dGRvd24oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQogewogICAvKiBTZWUgaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvYWEzODAxMzguYXNweAogICAgKiBTaHV0dGluZyBEb3duIGFuIFNjaGFubmVsIENvbm5lY3Rpb24KQEAgLTE0NDgsNyArMTU0MSw3IEBACiAgIGluZm9mKGRhdGEsICJzY2hhbm5lbDogc2h1dHRpbmcgZG93biBTU0wvVExTIGNvbm5lY3Rpb24gd2l0aCAlcyBwb3J0ICVodVxuIiwKICAgICAgICAgaG9zdG5hbWUsIGNvbm4tPnJlbW90ZV9wb3J0KTsKIAotICBpZihjb25uc3NsLT5jcmVkICYmIGNvbm5zc2wtPmN0eHQpIHsKKyAgaWYoQkFDS0VORC0+Y3JlZCAmJiBCQUNLRU5ELT5jdHh0KSB7CiAgICAgU2VjQnVmZmVyRGVzYyBCdWZmRGVzYzsKICAgICBTZWNCdWZmZXIgQnVmZmVyOwogICAgIFNFQ1VSSVRZX1NUQVRVUyBzc3BpX3N0YXR1czsKQEAgLTE0NjEsNyArMTU1NCw3IEBACiAgICAgSW5pdFNlY0J1ZmZlcigmQnVmZmVyLCBTRUNCVUZGRVJfVE9LRU4sICZkd3NodXQsIHNpemVvZihkd3NodXQpKTsKICAgICBJbml0U2VjQnVmZmVyRGVzYygmQnVmZkRlc2MsICZCdWZmZXIsIDEpOwogCi0gICAgc3NwaV9zdGF0dXMgPSBzX3BTZWNGbi0+QXBwbHlDb250cm9sVG9rZW4oJmNvbm5zc2wtPmN0eHQtPmN0eHRfaGFuZGxlLAorICAgIHNzcGlfc3RhdHVzID0gc19wU2VjRm4tPkFwcGx5Q29udHJvbFRva2VuKCZCQUNLRU5ELT5jdHh0LT5jdHh0X2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQnVmZkRlc2MpOwogCiAgICAgaWYoc3NwaV9zdGF0dXMgIT0gU0VDX0VfT0spCkBAIC0xNDc3LDE4ICsxNTcwLDE4IEBACiAgICAgSW5pdFNlY0J1ZmZlckRlc2MoJm91dGJ1Zl9kZXNjLCAmb3V0YnVmLCAxKTsKIAogICAgIHNzcGlfc3RhdHVzID0gc19wU2VjRm4tPkluaXRpYWxpemVTZWN1cml0eUNvbnRleHQoCi0gICAgICAmY29ubnNzbC0+Y3JlZC0+Y3JlZF9oYW5kbGUsCi0gICAgICAmY29ubnNzbC0+Y3R4dC0+Y3R4dF9oYW5kbGUsCisgICAgICAmQkFDS0VORC0+Y3JlZC0+Y3JlZF9oYW5kbGUsCisgICAgICAmQkFDS0VORC0+Y3R4dC0+Y3R4dF9oYW5kbGUsCiAgICAgICBob3N0X25hbWUsCi0gICAgICBjb25uc3NsLT5yZXFfZmxhZ3MsCisgICAgICBCQUNLRU5ELT5yZXFfZmxhZ3MsCiAgICAgICAwLAogICAgICAgMCwKICAgICAgIE5VTEwsCiAgICAgICAwLAotICAgICAgJmNvbm5zc2wtPmN0eHQtPmN0eHRfaGFuZGxlLAorICAgICAgJkJBQ0tFTkQtPmN0eHQtPmN0eHRfaGFuZGxlLAogICAgICAgJm91dGJ1Zl9kZXNjLAotICAgICAgJmNvbm5zc2wtPnJldF9mbGFncywKLSAgICAgICZjb25uc3NsLT5jdHh0LT50aW1lX3N0YW1wKTsKKyAgICAgICZCQUNLRU5ELT5yZXRfZmxhZ3MsCisgICAgICAmQkFDS0VORC0+Y3R4dC0+dGltZV9zdGFtcCk7CiAKICAgICBDdXJsX3VuaWNvZGVmcmVlKGhvc3RfbmFtZSk7CiAKQEAgLTE1MDcsNzEgKzE2MDAsNjIgQEAKICAgfQogCiAgIC8qIGZyZWUgU1NQSSBTY2hhbm5lbCBBUEkgc2VjdXJpdHkgY29udGV4dCBoYW5kbGUgKi8KLSAgaWYoY29ubnNzbC0+Y3R4dCkgeworICBpZihCQUNLRU5ELT5jdHh0KSB7CiAgICAgaW5mb2YoZGF0YSwgInNjaGFubmVsOiBjbGVhciBzZWN1cml0eSBjb250ZXh0IGhhbmRsZVxuIik7Ci0gICAgc19wU2VjRm4tPkRlbGV0ZVNlY3VyaXR5Q29udGV4dCgmY29ubnNzbC0+Y3R4dC0+Y3R4dF9oYW5kbGUpOwotICAgIEN1cmxfc2FmZWZyZWUoY29ubnNzbC0+Y3R4dCk7CisgICAgc19wU2VjRm4tPkRlbGV0ZVNlY3VyaXR5Q29udGV4dCgmQkFDS0VORC0+Y3R4dC0+Y3R4dF9oYW5kbGUpOworICAgIEN1cmxfc2FmZWZyZWUoQkFDS0VORC0+Y3R4dCk7CiAgIH0KIAogICAvKiBmcmVlIFNTUEkgU2NoYW5uZWwgQVBJIGNyZWRlbnRpYWwgaGFuZGxlICovCi0gIGlmKGNvbm5zc2wtPmNyZWQpIHsKKyAgaWYoQkFDS0VORC0+Y3JlZCkgewogICAgIEN1cmxfc3NsX3Nlc3Npb25pZF9sb2NrKGNvbm4pOwotICAgIEN1cmxfc2NoYW5uZWxfc2Vzc2lvbl9mcmVlKGNvbm5zc2wtPmNyZWQpOworICAgIEN1cmxfc2NoYW5uZWxfc2Vzc2lvbl9mcmVlKEJBQ0tFTkQtPmNyZWQpOwogICAgIEN1cmxfc3NsX3Nlc3Npb25pZF91bmxvY2soY29ubik7Ci0gICAgY29ubnNzbC0+Y3JlZCA9IE5VTEw7CisgICAgQkFDS0VORC0+Y3JlZCA9IE5VTEw7CiAgIH0KIAogICAvKiBmcmVlIGludGVybmFsIGJ1ZmZlciBmb3IgcmVjZWl2ZWQgZW5jcnlwdGVkIGRhdGEgKi8KLSAgaWYoY29ubnNzbC0+ZW5jZGF0YV9idWZmZXIgIT0gTlVMTCkgewotICAgIEN1cmxfc2FmZWZyZWUoY29ubnNzbC0+ZW5jZGF0YV9idWZmZXIpOwotICAgIGNvbm5zc2wtPmVuY2RhdGFfbGVuZ3RoID0gMDsKLSAgICBjb25uc3NsLT5lbmNkYXRhX29mZnNldCA9IDA7Ci0gICAgY29ubnNzbC0+ZW5jZGF0YV9pc19pbmNvbXBsZXRlID0gZmFsc2U7CisgIGlmKEJBQ0tFTkQtPmVuY2RhdGFfYnVmZmVyICE9IE5VTEwpIHsKKyAgICBDdXJsX3NhZmVmcmVlKEJBQ0tFTkQtPmVuY2RhdGFfYnVmZmVyKTsKKyAgICBCQUNLRU5ELT5lbmNkYXRhX2xlbmd0aCA9IDA7CisgICAgQkFDS0VORC0+ZW5jZGF0YV9vZmZzZXQgPSAwOworICAgIEJBQ0tFTkQtPmVuY2RhdGFfaXNfaW5jb21wbGV0ZSA9IGZhbHNlOwogICB9CiAKICAgLyogZnJlZSBpbnRlcm5hbCBidWZmZXIgZm9yIHJlY2VpdmVkIGRlY3J5cHRlZCBkYXRhICovCi0gIGlmKGNvbm5zc2wtPmRlY2RhdGFfYnVmZmVyICE9IE5VTEwpIHsKLSAgICBDdXJsX3NhZmVmcmVlKGNvbm5zc2wtPmRlY2RhdGFfYnVmZmVyKTsKLSAgICBjb25uc3NsLT5kZWNkYXRhX2xlbmd0aCA9IDA7Ci0gICAgY29ubnNzbC0+ZGVjZGF0YV9vZmZzZXQgPSAwOworICBpZihCQUNLRU5ELT5kZWNkYXRhX2J1ZmZlciAhPSBOVUxMKSB7CisgICAgQ3VybF9zYWZlZnJlZShCQUNLRU5ELT5kZWNkYXRhX2J1ZmZlcik7CisgICAgQkFDS0VORC0+ZGVjZGF0YV9sZW5ndGggPSAwOworICAgIEJBQ0tFTkQtPmRlY2RhdGFfb2Zmc2V0ID0gMDsKICAgfQogCiAgIHJldHVybiBDVVJMRV9PSzsKIH0KIAotdm9pZCBDdXJsX3NjaGFubmVsX3Nlc3Npb25fZnJlZSh2b2lkICpwdHIpCi17Ci0gIC8qIHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIHVuZGVyIHNlc3Npb25pZCBsb2NrICovCi0gIHN0cnVjdCBjdXJsX3NjaGFubmVsX2NyZWQgKmNyZWQgPSBwdHI7Ci0KLSAgY3JlZC0+cmVmY291bnQtLTsKLSAgaWYoY3JlZC0+cmVmY291bnQgPT0gMCkgewotICAgIHNfcFNlY0ZuLT5GcmVlQ3JlZGVudGlhbHNIYW5kbGUoJmNyZWQtPmNyZWRfaGFuZGxlKTsKLSAgICBDdXJsX3NhZmVmcmVlKGNyZWQpOwotICB9Ci19Ci0KLWludCBDdXJsX3NjaGFubmVsX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgQ3VybF9zY2hhbm5lbF9pbml0KHZvaWQpCiB7CiAgIHJldHVybiAoQ3VybF9zc3BpX2dsb2JhbF9pbml0KCkgPT0gQ1VSTEVfT0sgPyAxIDogMCk7CiB9CiAKLXZvaWQgQ3VybF9zY2hhbm5lbF9jbGVhbnVwKHZvaWQpCitzdGF0aWMgdm9pZCBDdXJsX3NjaGFubmVsX2NsZWFudXAodm9pZCkKIHsKICAgQ3VybF9zc3BpX2dsb2JhbF9jbGVhbnVwKCk7CiB9CiAKLXNpemVfdCBDdXJsX3NjaGFubmVsX3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyBzaXplX3QgQ3VybF9zY2hhbm5lbF92ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7CiAgIHNpemUgPSBzbnByaW50ZihidWZmZXIsIHNpemUsICJXaW5TU0wiKTsKIAogICByZXR1cm4gc2l6ZTsKIH0KIAotQ1VSTGNvZGUgQ3VybF9zY2hhbm5lbF9yYW5kb20odW5zaWduZWQgY2hhciAqZW50cm9weSwgc2l6ZV90IGxlbmd0aCkKK3N0YXRpYyBDVVJMY29kZSBDdXJsX3NjaGFubmVsX3JhbmRvbShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhIFVOVVNFRF9QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplbnRyb3B5LCBzaXplX3QgbGVuZ3RoKQogewogICBIQ1JZUFRQUk9WIGhDcnlwdFByb3YgPSAwOwogCisgICh2b2lkKWRhdGE7CisKICAgaWYoIUNyeXB0QWNxdWlyZUNvbnRleHQoJmhDcnlwdFByb3YsIE5VTEwsIE5VTEwsIFBST1ZfUlNBX0ZVTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBUX1ZFUklGWUNPTlRFWFQgfCBDUllQVF9TSUxFTlQpKQogICAgIHJldHVybiBDVVJMRV9GQUlMRURfSU5JVDsKQEAgLTE1OTgsNyArMTY4Miw3IEBACiAgICAgY29ubi0+aHR0cF9wcm94eS5ob3N0Lm5hbWUgOgogICAgIGNvbm4tPmhvc3QubmFtZTsKIAotICBzdGF0dXMgPSBzX3BTZWNGbi0+UXVlcnlDb250ZXh0QXR0cmlidXRlcygmY29ubnNzbC0+Y3R4dC0+Y3R4dF9oYW5kbGUsCisgIHN0YXR1cyA9IHNfcFNlY0ZuLT5RdWVyeUNvbnRleHRBdHRyaWJ1dGVzKCZCQUNLRU5ELT5jdHh0LT5jdHh0X2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDUEtHX0FUVFJfUkVNT1RFX0NFUlRfQ09OVEVYVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDZXJ0Q29udGV4dFNlcnZlcik7CiAKQEAgLTE3MjUsNCArMTgwOSw0NCBAQAogfQogI2VuZGlmIC8qIF9XSU4zMl9XQ0UgKi8KIAorc3RhdGljIHZvaWQgKkN1cmxfc2NoYW5uZWxfZ2V0X2ludGVybmFscyhzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTElORk8gaW5mbyBVTlVTRURfUEFSQU0pCit7CisgICh2b2lkKWluZm87CisgIHJldHVybiAmQkFDS0VORC0+Y3R4dC0+Y3R4dF9oYW5kbGU7Cit9CisKK2NvbnN0IHN0cnVjdCBDdXJsX3NzbCBDdXJsX3NzbF9zY2hhbm5lbCA9IHsKKyAgeyBDVVJMU1NMQkFDS0VORF9TQ0hBTk5FTCwgInNjaGFubmVsIiB9LCAvKiBpbmZvICovCisKKyAgMCwgLyogaGF2ZV9jYV9wYXRoICovCisgIDEsIC8qIGhhdmVfY2VydGluZm8gKi8KKyAgMCwgLyogaGF2ZV9waW5uZWRwdWJrZXkgKi8KKyAgMCwgLyogaGF2ZV9zc2xfY3R4ICovCisgIDAsIC8qIHN1cHBvcnRfaHR0cHNfcHJveHkgKi8KKworICBzaXplb2Yoc3RydWN0IHNzbF9iYWNrZW5kX2RhdGEpLAorCisgIEN1cmxfc2NoYW5uZWxfaW5pdCwgICAgICAgICAgICAgICAgLyogaW5pdCAqLworICBDdXJsX3NjaGFubmVsX2NsZWFudXAsICAgICAgICAgICAgIC8qIGNsZWFudXAgKi8KKyAgQ3VybF9zY2hhbm5lbF92ZXJzaW9uLCAgICAgICAgICAgICAvKiB2ZXJzaW9uICovCisgIEN1cmxfbm9uZV9jaGVja19jeG4sICAgICAgICAgICAgICAgLyogY2hlY2tfY3huICovCisgIEN1cmxfc2NoYW5uZWxfc2h1dGRvd24sICAgICAgICAgICAgLyogc2h1dGRvd24gKi8KKyAgQ3VybF9zY2hhbm5lbF9kYXRhX3BlbmRpbmcsICAgICAgICAvKiBkYXRhX3BlbmRpbmcgKi8KKyAgQ3VybF9zY2hhbm5lbF9yYW5kb20sICAgICAgICAgICAgICAvKiByYW5kb20gKi8KKyAgQ3VybF9ub25lX2NlcnRfc3RhdHVzX3JlcXVlc3QsICAgICAvKiBjZXJ0X3N0YXR1c19yZXF1ZXN0ICovCisgIEN1cmxfc2NoYW5uZWxfY29ubmVjdCwgICAgICAgICAgICAgLyogY29ubmVjdCAqLworICBDdXJsX3NjaGFubmVsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcsIC8qIGNvbm5lY3Rfbm9uYmxvY2tpbmcgKi8KKyAgQ3VybF9zY2hhbm5lbF9nZXRfaW50ZXJuYWxzLCAgICAgICAvKiBnZXRfaW50ZXJuYWxzICovCisgIEN1cmxfc2NoYW5uZWxfY2xvc2UsICAgICAgICAgICAgICAgLyogY2xvc2UgKi8KKyAgQ3VybF9ub25lX2Nsb3NlX2FsbCwgICAgICAgICAgICAgICAvKiBjbG9zZV9hbGwgKi8KKyAgQ3VybF9zY2hhbm5lbF9zZXNzaW9uX2ZyZWUsICAgICAgICAvKiBzZXNzaW9uX2ZyZWUgKi8KKyAgQ3VybF9ub25lX3NldF9lbmdpbmUsICAgICAgICAgICAgICAvKiBzZXRfZW5naW5lICovCisgIEN1cmxfbm9uZV9zZXRfZW5naW5lX2RlZmF1bHQsICAgICAgLyogc2V0X2VuZ2luZV9kZWZhdWx0ICovCisgIEN1cmxfbm9uZV9lbmdpbmVzX2xpc3QsICAgICAgICAgICAgLyogZW5naW5lc19saXN0ICovCisgIEN1cmxfbm9uZV9mYWxzZV9zdGFydCwgICAgICAgICAgICAgLyogZmFsc2Vfc3RhcnQgKi8KKyAgQ3VybF9ub25lX21kNXN1bSwgICAgICAgICAgICAgICAgICAvKiBtZDVzdW0gKi8KKyAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGEyNTZzdW0gKi8KK307CisKICNlbmRpZiAvKiBVU0VfU0NIQU5ORUwgKi8KZGlmZiAtLWdpdCBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvc2NoYW5uZWwuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvc2NoYW5uZWwuaAppbmRleCA4NjI3YzYzLi45MzIxMDNkIDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3NjaGFubmVsLmgKKysrIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy9zY2hhbm5lbC5oCkBAIC0yOCw5NCArMjgsNyBAQAogCiAjaW5jbHVkZSAidXJsZGF0YS5oIgogCi0jaWZuZGVmIFVOSVNQX05BTUVfQQotI2RlZmluZSBVTklTUF9OQU1FX0EgIk1pY3Jvc29mdCBVbmlmaWVkIFNlY3VyaXR5IFByb3RvY29sIFByb3ZpZGVyIgotI2VuZGlmCi0KLSNpZm5kZWYgVU5JU1BfTkFNRV9XCi0jZGVmaW5lIFVOSVNQX05BTUVfVyBMIk1pY3Jvc29mdCBVbmlmaWVkIFNlY3VyaXR5IFByb3RvY29sIFByb3ZpZGVyIgotI2VuZGlmCi0KLSNpZm5kZWYgVU5JU1BfTkFNRQotI2lmZGVmIFVOSUNPREUKLSNkZWZpbmUgVU5JU1BfTkFNRSAgVU5JU1BfTkFNRV9XCi0jZWxzZQotI2RlZmluZSBVTklTUF9OQU1FICBVTklTUF9OQU1FX0EKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgU1BfUFJPVF9TU0wyX0NMSUVOVAotI2RlZmluZSBTUF9QUk9UX1NTTDJfQ0xJRU5UICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNlbmRpZgotCi0jaWZuZGVmIFNQX1BST1RfU1NMM19DTElFTlQKLSNkZWZpbmUgU1BfUFJPVF9TU0wzX0NMSUVOVCAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZW5kaWYKLQotI2lmbmRlZiBTUF9QUk9UX1RMUzFfQ0xJRU5UCi0jZGVmaW5lIFNQX1BST1RfVExTMV9DTElFTlQgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2VuZGlmCi0KLSNpZm5kZWYgU1BfUFJPVF9UTFMxXzBfQ0xJRU5UCi0jZGVmaW5lIFNQX1BST1RfVExTMV8wX0NMSUVOVCAgICAgICAgICAgU1BfUFJPVF9UTFMxX0NMSUVOVAotI2VuZGlmCi0KLSNpZm5kZWYgU1BfUFJPVF9UTFMxXzFfQ0xJRU5UCi0jZGVmaW5lIFNQX1BST1RfVExTMV8xX0NMSUVOVCAgICAgICAgICAgMHgwMDAwMDIwMAotI2VuZGlmCi0KLSNpZm5kZWYgU1BfUFJPVF9UTFMxXzJfQ0xJRU5UCi0jZGVmaW5lIFNQX1BST1RfVExTMV8yX0NMSUVOVCAgICAgICAgICAgMHgwMDAwMDgwMAotI2VuZGlmCi0KLSNpZm5kZWYgU0VDQlVGRkVSX0FMRVJUCi0jZGVmaW5lIFNFQ0JVRkZFUl9BTEVSVCAgICAgICAgICAgICAgICAgMTcKLSNlbmRpZgotCi0vKiBCb3RoIHNjaGFubmVsIGJ1ZmZlciBzaXplcyBtdXN0IGJlID4gMCAqLwotI2RlZmluZSBDVVJMX1NDSEFOTkVMX0JVRkZFUl9JTklUX1NJWkUgICA0MDk2Ci0jZGVmaW5lIENVUkxfU0NIQU5ORUxfQlVGRkVSX0ZSRUVfU0laRSAgIDEwMjQKLQotCi1DVVJMY29kZSBDdXJsX3NjaGFubmVsX2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLQotQ1VSTGNvZGUgQ3VybF9zY2hhbm5lbF9jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmRvbmUpOwotCi1ib29sIEN1cmxfc2NoYW5uZWxfZGF0YV9wZW5kaW5nKGNvbnN0IHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7Ci12b2lkIEN1cmxfc2NoYW5uZWxfY2xvc2Uoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKLWludCBDdXJsX3NjaGFubmVsX3NodXRkb3duKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCk7Ci12b2lkIEN1cmxfc2NoYW5uZWxfc2Vzc2lvbl9mcmVlKHZvaWQgKnB0cik7Ci0KLWludCBDdXJsX3NjaGFubmVsX2luaXQodm9pZCk7Ci12b2lkIEN1cmxfc2NoYW5uZWxfY2xlYW51cCh2b2lkKTsKLXNpemVfdCBDdXJsX3NjaGFubmVsX3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci0KLUNVUkxjb2RlIEN1cmxfc2NoYW5uZWxfcmFuZG9tKHVuc2lnbmVkIGNoYXIgKmVudHJvcHksIHNpemVfdCBsZW5ndGgpOwotCi0vKiBTZXQgdGhlIEFQSSBiYWNrZW5kIGRlZmluaXRpb24gdG8gU2NoYW5uZWwgKi8KLSNkZWZpbmUgQ1VSTF9TU0xfQkFDS0VORCBDVVJMU1NMQkFDS0VORF9TQ0hBTk5FTAotCi0vKiB0aGlzIGJhY2tlbmQgc3VwcG9ydHMgQ1VSTE9QVF9DRVJUSU5GTyAqLwotI2RlZmluZSBoYXZlX2N1cmxzc2xfY2VydGluZm8gMQotCi0vKiBBUEkgc2V0dXAgZm9yIFNjaGFubmVsICovCi0jZGVmaW5lIGN1cmxzc2xfaW5pdCBDdXJsX3NjaGFubmVsX2luaXQKLSNkZWZpbmUgY3VybHNzbF9jbGVhbnVwIEN1cmxfc2NoYW5uZWxfY2xlYW51cAotI2RlZmluZSBjdXJsc3NsX2Nvbm5lY3QgQ3VybF9zY2hhbm5lbF9jb25uZWN0Ci0jZGVmaW5lIGN1cmxzc2xfY29ubmVjdF9ub25ibG9ja2luZyBDdXJsX3NjaGFubmVsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcKLSNkZWZpbmUgY3VybHNzbF9zZXNzaW9uX2ZyZWUgQ3VybF9zY2hhbm5lbF9zZXNzaW9uX2ZyZWUKLSNkZWZpbmUgY3VybHNzbF9jbG9zZV9hbGwoeCkgKCh2b2lkKXgpCi0jZGVmaW5lIGN1cmxzc2xfY2xvc2UgQ3VybF9zY2hhbm5lbF9jbG9zZQotI2RlZmluZSBjdXJsc3NsX3NodXRkb3duIEN1cmxfc2NoYW5uZWxfc2h1dGRvd24KLSNkZWZpbmUgY3VybHNzbF9zZXRfZW5naW5lKHgseSkgKCh2b2lkKXgsICh2b2lkKXksIENVUkxFX05PVF9CVUlMVF9JTikKLSNkZWZpbmUgY3VybHNzbF9zZXRfZW5naW5lX2RlZmF1bHQoeCkgKCh2b2lkKXgsIENVUkxFX05PVF9CVUlMVF9JTikKLSNkZWZpbmUgY3VybHNzbF9lbmdpbmVzX2xpc3QoeCkgKCh2b2lkKXgsIChzdHJ1Y3QgY3VybF9zbGlzdCAqKU5VTEwpCi0jZGVmaW5lIGN1cmxzc2xfdmVyc2lvbiBDdXJsX3NjaGFubmVsX3ZlcnNpb24KLSNkZWZpbmUgY3VybHNzbF9jaGVja19jeG4oeCkgKCh2b2lkKXgsIC0xKQotI2RlZmluZSBjdXJsc3NsX2RhdGFfcGVuZGluZyBDdXJsX3NjaGFubmVsX2RhdGFfcGVuZGluZwotI2RlZmluZSBjdXJsc3NsX3JhbmRvbSh4LHkseikgKCh2b2lkKXgsIEN1cmxfc2NoYW5uZWxfcmFuZG9tKHkseikpCitleHRlcm4gY29uc3Qgc3RydWN0IEN1cmxfc3NsIEN1cmxfc3NsX3NjaGFubmVsOwogCiAjZW5kaWYgLyogVVNFX1NDSEFOTkVMICovCiAjZW5kaWYgLyogSEVBREVSX0NVUkxfU0NIQU5ORUxfSCAqLwpkaWZmIC0tZ2l0IGEvVXRpbGl0aWVzL2NtY3VybC9saWIvdnRscy92dGxzLmMgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3Z0bHMuYwppbmRleCBkNWQwOTcxLi5iYjhmZGE0IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3Z0bHMuYworKysgYi9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3Z0bHMuYwpAQCAtMjgsMTcgKzI4LDkgQEAKICAgIHRvIGFueSBzcGVjaWZpYyBTU0wtbGF5ZXIuCiAKICAgIEN1cmxfc3NsXyAtIHByZWZpeCBmb3IgZ2VuZXJpYyBvbmVzCi0gICBDdXJsX29zc2xfIC0gcHJlZml4IGZvciBPcGVuU1NMIG9uZXMKLSAgIEN1cmxfZ3Rsc18gLSBwcmVmaXggZm9yIEdudVRMUyBvbmVzCi0gICBDdXJsX25zc18gLSBwcmVmaXggZm9yIE5TUyBvbmVzCi0gICBDdXJsX2dza2l0XyAtIHByZWZpeCBmb3IgR1NLaXQgb25lcwotICAgQ3VybF9wb2xhcnNzbF8gLSBwcmVmaXggZm9yIFBvbGFyU1NMIG9uZXMKLSAgIEN1cmxfY3lhc3NsXyAtIHByZWZpeCBmb3IgQ3lhU1NMIG9uZXMKLSAgIEN1cmxfc2NoYW5uZWxfIC0gcHJlZml4IGZvciBTY2hhbm5lbCBTU1BJIG9uZXMKLSAgIEN1cmxfZGFyd2luc3NsXyAtIHByZWZpeCBmb3IgU2VjdXJlVHJhbnNwb3J0IChEYXJ3aW4pIG9uZXMKIAotICAgTm90ZSB0aGF0IHRoaXMgc291cmNlIGNvZGUgdXNlcyBjdXJsc3NsXyogZnVuY3Rpb25zLCBhbmQgdGhleSBhcmUgYWxsCi0gICBkZWZpbmVzL21hY3JvcyAjZGVmaW5lZCBieSB0aGUgbGliLXNwZWNpZmljIGhlYWRlciBmaWxlcy4KKyAgIE5vdGUgdGhhdCB0aGlzIHNvdXJjZSBjb2RlIHVzZXMgdGhlIGZ1bmN0aW9ucyBvZiB0aGUgY29uZmlndXJlZCBTU0wKKyAgIGJhY2tlbmQgdmlhIHRoZSBnbG9iYWwgQ3VybF9zc2wgaW5zdGFuY2UuCiAKICAgICJTU0wvVExTIFN0cm9uZyBFbmNyeXB0aW9uOiBBbiBJbnRyb2R1Y3Rpb24iCiAgICBodHRwczovL2h0dHBkLmFwYWNoZS5vcmcvZG9jcy8yLjAvc3NsL3NzbF9pbnRyby5odG1sCkBAIC05OCw5ICs5MCwxMiBAQAogICAgICAoZGF0YS0+dmVyc2lvbl9tYXggPT0gbmVlZGxlLT52ZXJzaW9uX21heCkgJiYKICAgICAgKGRhdGEtPnZlcmlmeXBlZXIgPT0gbmVlZGxlLT52ZXJpZnlwZWVyKSAmJgogICAgICAoZGF0YS0+dmVyaWZ5aG9zdCA9PSBuZWVkbGUtPnZlcmlmeWhvc3QpICYmCisgICAgIChkYXRhLT52ZXJpZnlzdGF0dXMgPT0gbmVlZGxlLT52ZXJpZnlzdGF0dXMpICYmCiAgICAgIEN1cmxfc2FmZV9zdHJjYXNlY29tcGFyZShkYXRhLT5DQXBhdGgsIG5lZWRsZS0+Q0FwYXRoKSAmJgogICAgICBDdXJsX3NhZmVfc3RyY2FzZWNvbXBhcmUoZGF0YS0+Q0FmaWxlLCBuZWVkbGUtPkNBZmlsZSkgJiYKICAgICAgQ3VybF9zYWZlX3N0cmNhc2Vjb21wYXJlKGRhdGEtPmNsaWVudGNlcnQsIG5lZWRsZS0+Y2xpZW50Y2VydCkgJiYKKyAgICAgQ3VybF9zYWZlX3N0cmNhc2Vjb21wYXJlKGRhdGEtPnJhbmRvbV9maWxlLCBuZWVkbGUtPnJhbmRvbV9maWxlKSAmJgorICAgICBDdXJsX3NhZmVfc3RyY2FzZWNvbXBhcmUoZGF0YS0+ZWdkc29ja2V0LCBuZWVkbGUtPmVnZHNvY2tldCkgJiYKICAgICAgQ3VybF9zYWZlX3N0cmNhc2Vjb21wYXJlKGRhdGEtPmNpcGhlcl9saXN0LCBuZWVkbGUtPmNpcGhlcl9saXN0KSkKICAgICByZXR1cm4gVFJVRTsKIApAQCAtMTExLDQyICsxMDYsNTEgQEAKIEN1cmxfY2xvbmVfcHJpbWFyeV9zc2xfY29uZmlnKHN0cnVjdCBzc2xfcHJpbWFyeV9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzc2xfcHJpbWFyeV9jb25maWcgKmRlc3QpCiB7Ci0gIGRlc3QtPnZlcmlmeWhvc3QgPSBzb3VyY2UtPnZlcmlmeWhvc3Q7Ci0gIGRlc3QtPnZlcmlmeXBlZXIgPSBzb3VyY2UtPnZlcmlmeXBlZXI7CiAgIGRlc3QtPnZlcnNpb24gPSBzb3VyY2UtPnZlcnNpb247CiAgIGRlc3QtPnZlcnNpb25fbWF4ID0gc291cmNlLT52ZXJzaW9uX21heDsKKyAgZGVzdC0+dmVyaWZ5cGVlciA9IHNvdXJjZS0+dmVyaWZ5cGVlcjsKKyAgZGVzdC0+dmVyaWZ5aG9zdCA9IHNvdXJjZS0+dmVyaWZ5aG9zdDsKKyAgZGVzdC0+dmVyaWZ5c3RhdHVzID0gc291cmNlLT52ZXJpZnlzdGF0dXM7CisgIGRlc3QtPnNlc3Npb25pZCA9IHNvdXJjZS0+c2Vzc2lvbmlkOwogCi0gIENMT05FX1NUUklORyhDQWZpbGUpOwogICBDTE9ORV9TVFJJTkcoQ0FwYXRoKTsKLSAgQ0xPTkVfU1RSSU5HKGNpcGhlcl9saXN0KTsKLSAgQ0xPTkVfU1RSSU5HKGVnZHNvY2tldCk7Ci0gIENMT05FX1NUUklORyhyYW5kb21fZmlsZSk7CisgIENMT05FX1NUUklORyhDQWZpbGUpOwogICBDTE9ORV9TVFJJTkcoY2xpZW50Y2VydCk7CisgIENMT05FX1NUUklORyhyYW5kb21fZmlsZSk7CisgIENMT05FX1NUUklORyhlZ2Rzb2NrZXQpOworICBDTE9ORV9TVFJJTkcoY2lwaGVyX2xpc3QpOwogCi0gIC8qIERpc2FibGUgZGVzdCBzZXNzaW9uaWQgY2FjaGUgaWYgYSBjbGllbnQgY2VydCBpcyB1c2VkLCBDVkUtMjAxNi01NDE5LiAqLwotICBkZXN0LT5zZXNzaW9uaWQgPSAoZGVzdC0+Y2xpZW50Y2VydCA/IGZhbHNlIDogc291cmNlLT5zZXNzaW9uaWQpOwogICByZXR1cm4gVFJVRTsKIH0KIAogdm9pZCBDdXJsX2ZyZWVfcHJpbWFyeV9zc2xfY29uZmlnKHN0cnVjdCBzc2xfcHJpbWFyeV9jb25maWcqIHNzbGMpCiB7Ci0gIEN1cmxfc2FmZWZyZWUoc3NsYy0+Q0FmaWxlKTsKICAgQ3VybF9zYWZlZnJlZShzc2xjLT5DQXBhdGgpOwotICBDdXJsX3NhZmVmcmVlKHNzbGMtPmNpcGhlcl9saXN0KTsKLSAgQ3VybF9zYWZlZnJlZShzc2xjLT5lZ2Rzb2NrZXQpOwotICBDdXJsX3NhZmVmcmVlKHNzbGMtPnJhbmRvbV9maWxlKTsKKyAgQ3VybF9zYWZlZnJlZShzc2xjLT5DQWZpbGUpOwogICBDdXJsX3NhZmVmcmVlKHNzbGMtPmNsaWVudGNlcnQpOworICBDdXJsX3NhZmVmcmVlKHNzbGMtPnJhbmRvbV9maWxlKTsKKyAgQ3VybF9zYWZlZnJlZShzc2xjLT5lZ2Rzb2NrZXQpOworICBDdXJsX3NhZmVmcmVlKHNzbGMtPmNpcGhlcl9saXN0KTsKIH0KIAorI2lmZGVmIFVTRV9TU0wKK3N0YXRpYyBpbnQgbXVsdGlzc2xfaW5pdChjb25zdCBzdHJ1Y3QgQ3VybF9zc2wgKmJhY2tlbmQpOworI2VuZGlmCisKIGludCBDdXJsX3NzbF9iYWNrZW5kKHZvaWQpCiB7Ci0gIHJldHVybiAoaW50KUNVUkxfU1NMX0JBQ0tFTkQ7CisjaWZkZWYgVVNFX1NTTAorICBtdWx0aXNzbF9pbml0KE5VTEwpOworICByZXR1cm4gQ3VybF9zc2wtPmluZm8uaWQ7CisjZWxzZQorICByZXR1cm4gKGludClDVVJMU1NMQkFDS0VORF9OT05FOworI2VuZGlmCiB9CiAKICNpZmRlZiBVU0VfU1NMCiAKIC8qICJnbG9iYWwiIGluaXQgZG9uZT8gKi8KLXN0YXRpYyBib29sIGluaXRfc3NsPUZBTFNFOworc3RhdGljIGJvb2wgaW5pdF9zc2wgPSBGQUxTRTsKIAogLyoqCiAgKiBHbG9iYWwgU1NMIGluaXQKQEAgLTE2MSw3ICsxNjUsNyBAQAogICAgIHJldHVybiAxOwogICBpbml0X3NzbCA9IFRSVUU7IC8qIG5ldmVyIGFnYWluICovCiAKLSAgcmV0dXJuIGN1cmxzc2xfaW5pdCgpOworICByZXR1cm4gQ3VybF9zc2wtPmluaXQoKTsKIH0KIAogCkBAIC0xNzAsNyArMTc0LDcgQEAKIHsKICAgaWYoaW5pdF9zc2wpIHsKICAgICAvKiBvbmx5IGNsZWFudXAgaWYgd2UgZGlkIGEgcHJldmlvdXMgaW5pdCAqLwotICAgIGN1cmxzc2xfY2xlYW51cCgpOworICAgIEN1cmxfc3NsLT5jbGVhbnVwKCk7CiAgICAgaW5pdF9zc2wgPSBGQUxTRTsKICAgfQogfQpAQCAtMjA1LDEyICsyMDksMjAgQEAKICAgREVCVUdBU1NFUlQoY29ubi0+Yml0cy5wcm94eV9zc2xfY29ubmVjdGVkW3NvY2tpbmRleF0pOwogICBpZihzc2xfY29ubmVjdGlvbl9jb21wbGV0ZSA9PSBjb25uLT5zc2xbc29ja2luZGV4XS5zdGF0ZSAmJgogICAgICAhY29ubi0+cHJveHlfc3NsW3NvY2tpbmRleF0udXNlKSB7Ci0jaWYgZGVmaW5lZChIVFRQU19QUk9YWV9TVVBQT1JUKQorICAgIHN0cnVjdCBzc2xfYmFja2VuZF9kYXRhICpwYmRhdGE7CisKKyAgICBpZighQ3VybF9zc2wtPnN1cHBvcnRfaHR0cHNfcHJveHkpCisgICAgICByZXR1cm4gQ1VSTEVfTk9UX0JVSUxUX0lOOworCisgICAgLyogVGhlIHBvaW50ZXJzIHRvIHRoZSBzc2wgYmFja2VuZCBkYXRhLCB3aGljaCBpcyBvcGFxdWUgaGVyZSwgYXJlIHN3YXBwZWQKKyAgICAgICByYXRoZXIgdGhhbiBtb3ZlIHRoZSBjb250ZW50cy4gKi8KKyAgICBwYmRhdGEgPSBjb25uLT5wcm94eV9zc2xbc29ja2luZGV4XS5iYWNrZW5kOwogICAgIGNvbm4tPnByb3h5X3NzbFtzb2NraW5kZXhdID0gY29ubi0+c3NsW3NvY2tpbmRleF07CisKICAgICBtZW1zZXQoJmNvbm4tPnNzbFtzb2NraW5kZXhdLCAwLCBzaXplb2YoY29ubi0+c3NsW3NvY2tpbmRleF0pKTsKLSNlbHNlCi0gICAgcmV0dXJuIENVUkxFX05PVF9CVUlMVF9JTjsKLSNlbmRpZgorICAgIG1lbXNldChwYmRhdGEsIDAsIEN1cmxfc3NsLT5zaXplb2Zfc3NsX2JhY2tlbmRfZGF0YSk7CisKKyAgICBjb25uLT5zc2xbc29ja2luZGV4XS5iYWNrZW5kID0gcGJkYXRhOwogICB9CiAgIHJldHVybiBDVVJMRV9PSzsKIH0KQEAgLTIzMyw3ICsyNDUsNyBAQAogICBjb25uLT5zc2xbc29ja2luZGV4XS51c2UgPSBUUlVFOwogICBjb25uLT5zc2xbc29ja2luZGV4XS5zdGF0ZSA9IHNzbF9jb25uZWN0aW9uX25lZ290aWF0aW5nOwogCi0gIHJlc3VsdCA9IGN1cmxzc2xfY29ubmVjdChjb25uLCBzb2NraW5kZXgpOworICByZXN1bHQgPSBDdXJsX3NzbC0+Y29ubmVjdChjb25uLCBzb2NraW5kZXgpOwogCiAgIGlmKCFyZXN1bHQpCiAgICAgQ3VybF9wZ3JzVGltZShjb25uLT5kYXRhLCBUSU1FUl9BUFBDT05ORUNUKTsgLyogU1NMIGlzIGNvbm5lY3RlZCAqLwpAQCAtMjU3LDEyICsyNjksNyBAQAogCiAgIC8qIG1hcmsgdGhpcyBpcyBiZWluZyBzc2wgcmVxdWVzdGVkIGZyb20gaGVyZSBvbi4gKi8KICAgY29ubi0+c3NsW3NvY2tpbmRleF0udXNlID0gVFJVRTsKLSNpZmRlZiBjdXJsc3NsX2Nvbm5lY3Rfbm9uYmxvY2tpbmcKLSAgcmVzdWx0ID0gY3VybHNzbF9jb25uZWN0X25vbmJsb2NraW5nKGNvbm4sIHNvY2tpbmRleCwgZG9uZSk7Ci0jZWxzZQotICAqZG9uZSA9IFRSVUU7IC8qIGZhbGxiYWNrIHRvIEJMT0NLSU5HICovCi0gIHJlc3VsdCA9IGN1cmxzc2xfY29ubmVjdChjb25uLCBzb2NraW5kZXgpOwotI2VuZGlmIC8qIG5vbi1ibG9ja2luZyBjb25uZWN0IHN1cHBvcnQgKi8KKyAgcmVzdWx0ID0gQ3VybF9zc2wtPmNvbm5lY3Rfbm9uYmxvY2tpbmcoY29ubiwgc29ja2luZGV4LCBkb25lKTsKICAgaWYoIXJlc3VsdCAmJiAqZG9uZSkKICAgICBDdXJsX3BncnNUaW1lKGNvbm4tPmRhdGEsIFRJTUVSX0FQUENPTk5FQ1QpOyAvKiBTU0wgaXMgY29ubmVjdGVkICovCiAgIHJldHVybiByZXN1bHQ7CkBAIC0zNjEsNyArMzY4LDcgQEAKICAgICAvKiBkZWZlbnNpdmUgY2hlY2sgKi8KIAogICAgIC8qIGZyZWUgdGhlIElEIHRoZSBTU0wtbGF5ZXIgc3BlY2lmaWMgd2F5ICovCi0gICAgY3VybHNzbF9zZXNzaW9uX2ZyZWUoc2Vzc2lvbi0+c2Vzc2lvbmlkKTsKKyAgICBDdXJsX3NzbC0+c2Vzc2lvbl9mcmVlKHNlc3Npb24tPnNlc3Npb25pZCk7CiAKICAgICBzZXNzaW9uLT5zZXNzaW9uaWQgPSBOVUxMOwogICAgIHNlc3Npb24tPmFnZSA9IDA7IC8qIGZyZXNoICovCkBAIC0zNzksNyArMzg2LDcgQEAKIHZvaWQgQ3VybF9zc2xfZGVsc2Vzc2lvbmlkKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgdm9pZCAqc3NsX3Nlc3Npb25pZCkKIHsKICAgc2l6ZV90IGk7Ci0gIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGE9Y29ubi0+ZGF0YTsKKyAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAKICAgZm9yKGkgPSAwOyBpIDwgZGF0YS0+c2V0LmdlbmVyYWxfc3NsLm1heF9zc2xfc2Vzc2lvbnM7IGkrKykgewogICAgIHN0cnVjdCBjdXJsX3NzbF9zZXNzaW9uICpjaGVjayA9ICZkYXRhLT5zdGF0ZS5zZXNzaW9uW2ldOwpAQCAtNDAzLDkgKzQxMCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCkKIHsKICAgc2l6ZV90IGk7Ci0gIHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGE9Y29ubi0+ZGF0YTsgLyogdGhlIG1vdGhlciBvZiBhbGwgc3RydWN0cyAqLworICBzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhID0gY29ubi0+ZGF0YTsgLyogdGhlIG1vdGhlciBvZiBhbGwgc3RydWN0cyAqLwogICBzdHJ1Y3QgY3VybF9zc2xfc2Vzc2lvbiAqc3RvcmUgPSAmZGF0YS0+c3RhdGUuc2Vzc2lvblswXTsKLSAgbG9uZyBvbGRlc3RfYWdlPWRhdGEtPnN0YXRlLnNlc3Npb25bMF0uYWdlOyAvKiB6ZXJvIGlmIHVudXNlZCAqLworICBsb25nIG9sZGVzdF9hZ2UgPSBkYXRhLT5zdGF0ZS5zZXNzaW9uWzBdLmFnZTsgLyogemVybyBpZiB1bnVzZWQgKi8KICAgY2hhciAqY2xvbmVfaG9zdDsKICAgY2hhciAqY2xvbmVfY29ubl90b19ob3N0OwogICBpbnQgY29ubl90b19wb3J0OwpAQCAtNDk5LDcgKzUwNiw3IEBACiAgICAgQ3VybF9zYWZlZnJlZShkYXRhLT5zdGF0ZS5zZXNzaW9uKTsKICAgfQogCi0gIGN1cmxzc2xfY2xvc2VfYWxsKGRhdGEpOworICBDdXJsX3NzbC0+Y2xvc2VfYWxsKGRhdGEpOwogfQogCiAjaWYgZGVmaW5lZChVU0VfT1BFTlNTTCkgfHwgZGVmaW5lZChVU0VfR05VVExTKSB8fCBkZWZpbmVkKFVTRV9TQ0hBTk5FTCkgfHwgXApAQCAtNTQyLDEyICs1NDksMTIgQEAKIHZvaWQgQ3VybF9zc2xfY2xvc2Uoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQogewogICBERUJVR0FTU0VSVCgoc29ja2luZGV4IDw9IDEpICYmIChzb2NraW5kZXggPj0gLTEpKTsKLSAgY3VybHNzbF9jbG9zZShjb25uLCBzb2NraW5kZXgpOworICBDdXJsX3NzbC0+Y2xvc2UoY29ubiwgc29ja2luZGV4KTsKIH0KIAogQ1VSTGNvZGUgQ3VybF9zc2xfc2h1dGRvd24oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQogewotICBpZihjdXJsc3NsX3NodXRkb3duKGNvbm4sIHNvY2tpbmRleCkpCisgIGlmKEN1cmxfc3NsLT5zaHV0ZG93bihjb25uLCBzb2NraW5kZXgpKQogICAgIHJldHVybiBDVVJMRV9TU0xfU0hVVERPV05fRkFJTEVEOwogCiAgIGNvbm4tPnNzbFtzb2NraW5kZXhdLnVzZSA9IEZBTFNFOyAvKiBnZXQgYmFjayB0byBvcmRpbmFyeSBzb2NrZXQgdXNhZ2UgKi8KQEAgLTU2MywyMCArNTcwLDIwIEBACiAgKi8KIENVUkxjb2RlIEN1cmxfc3NsX3NldF9lbmdpbmUoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwgY29uc3QgY2hhciAqZW5naW5lKQogewotICByZXR1cm4gY3VybHNzbF9zZXRfZW5naW5lKGRhdGEsIGVuZ2luZSk7CisgIHJldHVybiBDdXJsX3NzbC0+c2V0X2VuZ2luZShkYXRhLCBlbmdpbmUpOwogfQogCiAvKiBTZWxlY3RzIHRoZSBkZWZhdWx0IFNTTCBjcnlwdG8gZW5naW5lCiAgKi8KIENVUkxjb2RlIEN1cmxfc3NsX3NldF9lbmdpbmVfZGVmYXVsdChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKQogewotICByZXR1cm4gY3VybHNzbF9zZXRfZW5naW5lX2RlZmF1bHQoZGF0YSk7CisgIHJldHVybiBDdXJsX3NzbC0+c2V0X2VuZ2luZV9kZWZhdWx0KGRhdGEpOwogfQogCiAvKiBSZXR1cm4gbGlzdCBvZiBPcGVuU1NMIGNyeXB0byBlbmdpbmUgbmFtZXMuICovCiBzdHJ1Y3QgY3VybF9zbGlzdCAqQ3VybF9zc2xfZW5naW5lc19saXN0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCiB7Ci0gIHJldHVybiBjdXJsc3NsX2VuZ2luZXNfbGlzdChkYXRhKTsKKyAgcmV0dXJuIEN1cmxfc3NsLT5lbmdpbmVzX2xpc3QoZGF0YSk7CiB9CiAKIC8qCkBAIC02MDIsOSArNjA5LDE1IEBACiAgIHJldHVybiBDVVJMRV9PSzsKIH0KIAorc3RhdGljIHNpemVfdCBDdXJsX211bHRpc3NsX3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisKIHNpemVfdCBDdXJsX3NzbF92ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7Ci0gIHJldHVybiBjdXJsc3NsX3ZlcnNpb24oYnVmZmVyLCBzaXplKTsKKyNpZmRlZiBDVVJMX1dJVEhfTVVMVElfU1NMCisgIHJldHVybiBDdXJsX211bHRpc3NsX3ZlcnNpb24oYnVmZmVyLCBzaXplKTsKKyNlbHNlCisgIHJldHVybiBDdXJsX3NzbC0+dmVyc2lvbihidWZmZXIsIHNpemUpOworI2VuZGlmCiB9CiAKIC8qCkBAIC02MTcsMTMgKzYzMCwxMyBAQAogICovCiBpbnQgQ3VybF9zc2xfY2hlY2tfY3huKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubikKIHsKLSAgcmV0dXJuIGN1cmxzc2xfY2hlY2tfY3huKGNvbm4pOworICByZXR1cm4gQ3VybF9zc2wtPmNoZWNrX2N4bihjb25uKTsKIH0KIAogYm9vbCBDdXJsX3NzbF9kYXRhX3BlbmRpbmcoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbm5pbmRleCkKIHsKLSAgcmV0dXJuIGN1cmxzc2xfZGF0YV9wZW5kaW5nKGNvbm4sIGNvbm5pbmRleCk7CisgIHJldHVybiBDdXJsX3NzbC0+ZGF0YV9wZW5kaW5nKGNvbm4sIGNvbm5pbmRleCk7CiB9CiAKIHZvaWQgQ3VybF9zc2xfZnJlZV9jZXJ0aW5mbyhzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKQpAQCAtNjMzLDcgKzY0Niw3IEBACiAKICAgaWYoY2ktPm51bV9vZl9jZXJ0cykgewogICAgIC8qIGZyZWUgYWxsIGluZGl2aWR1YWwgbGlzdHMgdXNlZCAqLwotICAgIGZvcihpPTA7IGk8Y2ktPm51bV9vZl9jZXJ0czsgaSsrKSB7CisgICAgZm9yKGkgPSAwOyBpPGNpLT5udW1fb2ZfY2VydHM7IGkrKykgewogICAgICAgY3VybF9zbGlzdF9mcmVlX2FsbChjaS0+Y2VydGluZm9baV0pOwogICAgICAgY2ktPmNlcnRpbmZvW2ldID0gTlVMTDsKICAgICB9CkBAIC02ODcsNyArNzAwLDcgQEAKICAgc25wcmludGYob3V0cHV0LCBvdXRsZW4sICIlczoiLCBsYWJlbCk7CiAKICAgLyogbWVtY3B5IHRoZSB2YWx1ZSAoaXQgbWlnaHQgbm90IGJlIHplcm8gdGVybWluYXRlZCkgKi8KLSAgbWVtY3B5KCZvdXRwdXRbbGFiZWxsZW4rMV0sIHZhbHVlLCB2YWx1ZWxlbik7CisgIG1lbWNweSgmb3V0cHV0W2xhYmVsbGVuICsgMV0sIHZhbHVlLCB2YWx1ZWxlbik7CiAKICAgLyogemVybyB0ZXJtaW5hdGUgdGhlIG91dHB1dCAqLwogICBvdXRwdXRbbGFiZWxsZW4gKyAxICsgdmFsdWVsZW5dID0gMDsKQEAgLTcyMSw3ICs3MzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmVudHJvcHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkKIHsKLSAgcmV0dXJuIGN1cmxzc2xfcmFuZG9tKGRhdGEsIGVudHJvcHksIGxlbmd0aCk7CisgIHJldHVybiBDdXJsX3NzbC0+cmFuZG9tKGRhdGEsIGVudHJvcHksIGxlbmd0aCk7CiB9CiAKIC8qCkBAIC03OTYsMTIgKzgwOSwxMCBAQAogICBzaXplX3Qgc2l6ZSwgcGVtX2xlbjsKICAgQ1VSTGNvZGUgcGVtX3JlYWQ7CiAgIENVUkxjb2RlIHJlc3VsdCA9IENVUkxFX1NTTF9QSU5ORURQVUJLRVlOT1RNQVRDSDsKLSNpZmRlZiBjdXJsc3NsX3NoYTI1NnN1bQogICBDVVJMY29kZSBlbmNvZGU7CiAgIHNpemVfdCBlbmNvZGVkbGVuLCBwaW5rZXlsZW47CiAgIGNoYXIgKmVuY29kZWQsICpwaW5rZXljb3B5LCAqYmVnaW5fcG9zLCAqZW5kX3BvczsKICAgdW5zaWduZWQgY2hhciAqc2hhMjU2c3VtZGlnZXN0ID0gTlVMTDsKLSNlbmRpZgogCiAgIC8qIGlmIGEgcGF0aCB3YXNuJ3Qgc3BlY2lmaWVkLCBkb24ndCBwaW4gKi8KICAgaWYoIXBpbm5lZHB1YmtleSkKQEAgLTgxMSwxNSArODIyLDIwIEBACiAKICAgLyogb25seSBkbyB0aGlzIGlmIHBpbm5lZHB1YmtleSBzdGFydHMgd2l0aCAic2hhMjU2Ly8iLCBsZW5ndGggOCAqLwogICBpZihzdHJuY21wKHBpbm5lZHB1YmtleSwgInNoYTI1Ni8vIiwgOCkgPT0gMCkgewotI2lmZGVmIGN1cmxzc2xfc2hhMjU2c3VtCisgICAgaWYoIUN1cmxfc3NsLT5zaGEyNTZzdW0pIHsKKyAgICAgIC8qIHdpdGhvdXQgc2hhMjU2IHN1cHBvcnQsIHRoaXMgY2Fubm90IG1hdGNoICovCisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKwogICAgIC8qIGNvbXB1dGUgc2hhMjU2c3VtIG9mIHB1YmxpYyBrZXkgKi8KLSAgICBzaGEyNTZzdW1kaWdlc3QgPSBtYWxsb2MoU0hBMjU2X0RJR0VTVF9MRU5HVEgpOworICAgIHNoYTI1NnN1bWRpZ2VzdCA9IG1hbGxvYyhDVVJMX1NIQTI1Nl9ESUdFU1RfTEVOR1RIKTsKICAgICBpZighc2hhMjU2c3VtZGlnZXN0KQogICAgICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7Ci0gICAgY3VybHNzbF9zaGEyNTZzdW0ocHVia2V5LCBwdWJrZXlsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgc2hhMjU2c3VtZGlnZXN0LCBTSEEyNTZfRElHRVNUX0xFTkdUSCk7CisgICAgQ3VybF9zc2wtPnNoYTI1NnN1bShwdWJrZXksIHB1YmtleWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoYTI1NnN1bWRpZ2VzdCwgQ1VSTF9TSEEyNTZfRElHRVNUX0xFTkdUSCk7CiAgICAgZW5jb2RlID0gQ3VybF9iYXNlNjRfZW5jb2RlKGRhdGEsIChjaGFyICopc2hhMjU2c3VtZGlnZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEEyNTZfRElHRVNUX0xFTkdUSCwgJmVuY29kZWQsICZlbmNvZGVkbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTF9TSEEyNTZfRElHRVNUX0xFTkdUSCwgJmVuY29kZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGVkbGVuKTsKICAgICBDdXJsX3NhZmVmcmVlKHNoYTI1NnN1bWRpZ2VzdCk7CiAKICAgICBpZihlbmNvZGUpCkBAIC04NjQsMTAgKzg4MCw2IEBACiAgICAgfSB3aGlsZShlbmRfcG9zICYmIGJlZ2luX3Bvcyk7CiAgICAgQ3VybF9zYWZlZnJlZShlbmNvZGVkKTsKICAgICBDdXJsX3NhZmVmcmVlKHBpbmtleWNvcHkpOwotI2Vsc2UKLSAgICAvKiB3aXRob3V0IHNoYTI1NiBzdXBwb3J0LCB0aGlzIGNhbm5vdCBtYXRjaCAqLwotICAgICh2b2lkKWRhdGE7Ci0jZW5kaWYKICAgICByZXR1cm4gcmVzdWx0OwogICB9CiAKQEAgLTk0MywyMCArOTU1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICptZDVzdW0sIC8qIG91dHB1dCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtZDVsZW4pCiB7Ci0jaWZkZWYgY3VybHNzbF9tZDVzdW0KLSAgY3VybHNzbF9tZDVzdW0odG1wLCB0bXBsZW4sIG1kNXN1bSwgbWQ1bGVuKTsKLSNlbHNlCi0gIE1ENV9jb250ZXh0ICpNRDVwdzsKLQotICAodm9pZCkgbWQ1bGVuOwotCi0gIE1ENXB3ID0gQ3VybF9NRDVfaW5pdChDdXJsX0RJR0VTVF9NRDUpOwotICBpZighTUQ1cHcpCi0gICAgcmV0dXJuIENVUkxFX09VVF9PRl9NRU1PUlk7Ci0gIEN1cmxfTUQ1X3VwZGF0ZShNRDVwdywgdG1wLCBjdXJseF91enRvdWkodG1wbGVuKSk7Ci0gIEN1cmxfTUQ1X2ZpbmFsKE1ENXB3LCBtZDVzdW0pOwotI2VuZGlmCi0gIHJldHVybiBDVVJMRV9PSzsKKyAgcmV0dXJuIEN1cmxfc3NsLT5tZDVzdW0odG1wLCB0bXBsZW4sIG1kNXN1bSwgbWQ1bGVuKTsKIH0KICNlbmRpZgogCkBAIC05NjUsMTEgKzk2NCw3IEBACiAgKi8KIGJvb2wgQ3VybF9zc2xfY2VydF9zdGF0dXNfcmVxdWVzdCh2b2lkKQogewotI2lmZGVmIGN1cmxzc2xfY2VydF9zdGF0dXNfcmVxdWVzdAotICByZXR1cm4gY3VybHNzbF9jZXJ0X3N0YXR1c19yZXF1ZXN0KCk7Ci0jZWxzZQotICByZXR1cm4gRkFMU0U7Ci0jZW5kaWYKKyAgcmV0dXJuIEN1cmxfc3NsLT5jZXJ0X3N0YXR1c19yZXF1ZXN0KCk7CiB9CiAKIC8qCkBAIC05NzcsMTEgKzk3MiwzNDEgQEAKICAqLwogYm9vbCBDdXJsX3NzbF9mYWxzZV9zdGFydCh2b2lkKQogewotI2lmZGVmIGN1cmxzc2xfZmFsc2Vfc3RhcnQKLSAgcmV0dXJuIGN1cmxzc2xfZmFsc2Vfc3RhcnQoKTsKLSNlbHNlCi0gIHJldHVybiBGQUxTRTsKLSNlbmRpZgorICByZXR1cm4gQ3VybF9zc2wtPmZhbHNlX3N0YXJ0KCk7CiB9CiAKLSNlbmRpZiAvKiBVU0VfU1NMICovCisvKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgZm9yIHVuc3VwcG9ydGVkIGZ1bmN0aW9ucy4KKyAqLworCitpbnQgQ3VybF9ub25lX2luaXQodm9pZCkKK3sKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgQ3VybF9ub25lX2NsZWFudXAodm9pZCkKK3sgfQorCitpbnQgQ3VybF9ub25lX3NodXRkb3duKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiBVTlVTRURfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NraW5kZXggVU5VU0VEX1BBUkFNKQoreworICAodm9pZCljb25uOworICAodm9pZClzb2NraW5kZXg7CisgIHJldHVybiAwOworfQorCitpbnQgQ3VybF9ub25lX2NoZWNrX2N4bihzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4gVU5VU0VEX1BBUkFNKQoreworICAodm9pZCljb25uOworICByZXR1cm4gLTE7Cit9CisKK0NVUkxjb2RlIEN1cmxfbm9uZV9yYW5kb20oc3RydWN0IEN1cmxfZWFzeSAqZGF0YSBVTlVTRURfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmVudHJvcHkgVU5VU0VEX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoIFVOVVNFRF9QQVJBTSkKK3sKKyAgKHZvaWQpZGF0YTsKKyAgKHZvaWQpZW50cm9weTsKKyAgKHZvaWQpbGVuZ3RoOworICByZXR1cm4gQ1VSTEVfTk9UX0JVSUxUX0lOOworfQorCit2b2lkIEN1cmxfbm9uZV9jbG9zZV9hbGwoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSBVTlVTRURfUEFSQU0pCit7CisgICh2b2lkKWRhdGE7Cit9CisKK3ZvaWQgQ3VybF9ub25lX3Nlc3Npb25fZnJlZSh2b2lkICpwdHIgVU5VU0VEX1BBUkFNKQoreworICAodm9pZClwdHI7Cit9CisKK2Jvb2wgQ3VybF9ub25lX2RhdGFfcGVuZGluZyhjb25zdCBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4gVU5VU0VEX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25uaW5kZXggVU5VU0VEX1BBUkFNKQoreworICAodm9pZCljb25uOworICAodm9pZCljb25uaW5kZXg7CisgIHJldHVybiAwOworfQorCitib29sIEN1cmxfbm9uZV9jZXJ0X3N0YXR1c19yZXF1ZXN0KHZvaWQpCit7CisgIHJldHVybiBGQUxTRTsKK30KKworQ1VSTGNvZGUgQ3VybF9ub25lX3NldF9lbmdpbmUoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSBVTlVTRURfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmdpbmUgVU5VU0VEX1BBUkFNKQoreworICAodm9pZClkYXRhOworICAodm9pZCllbmdpbmU7CisgIHJldHVybiBDVVJMRV9OT1RfQlVJTFRfSU47Cit9CisKK0NVUkxjb2RlIEN1cmxfbm9uZV9zZXRfZW5naW5lX2RlZmF1bHQoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSBVTlVTRURfUEFSQU0pCit7CisgICh2b2lkKWRhdGE7CisgIHJldHVybiBDVVJMRV9OT1RfQlVJTFRfSU47Cit9CisKK3N0cnVjdCBjdXJsX3NsaXN0ICpDdXJsX25vbmVfZW5naW5lc19saXN0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEgVU5VU0VEX1BBUkFNKQoreworICAodm9pZClkYXRhOworICByZXR1cm4gKHN0cnVjdCBjdXJsX3NsaXN0ICopTlVMTDsKK30KKworYm9vbCBDdXJsX25vbmVfZmFsc2Vfc3RhcnQodm9pZCkKK3sKKyAgcmV0dXJuIEZBTFNFOworfQorCitDVVJMY29kZSBDdXJsX25vbmVfbWQ1c3VtKHVuc2lnbmVkIGNoYXIgKmlucHV0LCBzaXplX3QgaW5wdXRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm1kNXN1bSwgc2l6ZV90IG1kNWxlbiBVTlVTRURfUEFSQU0pCit7CisgIE1ENV9jb250ZXh0ICpNRDVwdzsKKworICAodm9pZCltZDVsZW47CisKKyAgTUQ1cHcgPSBDdXJsX01ENV9pbml0KEN1cmxfRElHRVNUX01ENSk7CisgIGlmKCFNRDVwdykKKyAgICByZXR1cm4gQ1VSTEVfT1VUX09GX01FTU9SWTsKKyAgQ3VybF9NRDVfdXBkYXRlKE1ENXB3LCBpbnB1dCwgY3VybHhfdXp0b3VpKGlucHV0bGVuKSk7CisgIEN1cmxfTUQ1X2ZpbmFsKE1ENXB3LCBtZDVzdW0pOworICByZXR1cm4gQ1VSTEVfT0s7Cit9CisKK3N0YXRpYyBpbnQgQ3VybF9tdWx0aXNzbF9pbml0KHZvaWQpCit7CisgIGlmKG11bHRpc3NsX2luaXQoTlVMTCkpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiBDdXJsX3NzbC0+aW5pdCgpOworfQorCitzdGF0aWMgQ1VSTGNvZGUgQ3VybF9tdWx0aXNzbF9jb25uZWN0KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCkKK3sKKyAgaWYobXVsdGlzc2xfaW5pdChOVUxMKSkKKyAgICByZXR1cm4gQ1VSTEVfRkFJTEVEX0lOSVQ7CisgIHJldHVybiBDdXJsX3NzbC0+Y29ubmVjdChjb25uLCBzb2NraW5kZXgpOworfQorCitzdGF0aWMgQ1VSTGNvZGUgQ3VybF9tdWx0aXNzbF9jb25uZWN0X25vbmJsb2NraW5nKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvY2tpbmRleCwgYm9vbCAqZG9uZSkKK3sKKyAgaWYobXVsdGlzc2xfaW5pdChOVUxMKSkKKyAgICByZXR1cm4gQ1VSTEVfRkFJTEVEX0lOSVQ7CisgIHJldHVybiBDdXJsX3NzbC0+Y29ubmVjdF9ub25ibG9ja2luZyhjb25uLCBzb2NraW5kZXgsIGRvbmUpOworfQorCitzdGF0aWMgdm9pZCAqQ3VybF9tdWx0aXNzbF9nZXRfaW50ZXJuYWxzKHN0cnVjdCBzc2xfY29ubmVjdF9kYXRhICpjb25uc3NsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMSU5GTyBpbmZvKQoreworICBpZihtdWx0aXNzbF9pbml0KE5VTEwpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gQ3VybF9zc2wtPmdldF9pbnRlcm5hbHMoY29ubnNzbCwgaW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkIEN1cmxfbXVsdGlzc2xfY2xvc2Uoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KQoreworICBpZihtdWx0aXNzbF9pbml0KE5VTEwpKQorICAgIHJldHVybjsKKyAgQ3VybF9zc2wtPmNsb3NlKGNvbm4sIHNvY2tpbmRleCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgQ3VybF9zc2wgQ3VybF9zc2xfbXVsdGkgPSB7CisgIHsgQ1VSTFNTTEJBQ0tFTkRfTk9ORSwgIm11bHRpIiB9LCAgLyogaW5mbyAqLworCisgIDAsIC8qIGhhdmVfY2FfcGF0aCAqLworICAwLCAvKiBoYXZlX2NlcnRpbmZvICovCisgIDAsIC8qIGhhdmVfcGlubmVkcHVia2V5ICovCisgIDAsIC8qIGhhdmVfc3NsX2N0eCAqLworICAwLCAvKiBzdXBwb3J0X2h0dHBzX3Byb3h5ICovCisKKyAgKHNpemVfdCktMSwgLyogc29tZXRoaW5nIGluc2FuZWx5IGxhcmdlIHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUgKi8KKworICBDdXJsX211bHRpc3NsX2luaXQsICAgICAgICAgICAgICAgIC8qIGluaXQgKi8KKyAgQ3VybF9ub25lX2NsZWFudXAsICAgICAgICAgICAgICAgICAvKiBjbGVhbnVwICovCisgIEN1cmxfbXVsdGlzc2xfdmVyc2lvbiwgICAgICAgICAgICAgLyogdmVyc2lvbiAqLworICBDdXJsX25vbmVfY2hlY2tfY3huLCAgICAgICAgICAgICAgIC8qIGNoZWNrX2N4biAqLworICBDdXJsX25vbmVfc2h1dGRvd24sICAgICAgICAgICAgICAgIC8qIHNodXRkb3duICovCisgIEN1cmxfbm9uZV9kYXRhX3BlbmRpbmcsICAgICAgICAgICAgLyogZGF0YV9wZW5kaW5nICovCisgIEN1cmxfbm9uZV9yYW5kb20sICAgICAgICAgICAgICAgICAgLyogcmFuZG9tICovCisgIEN1cmxfbm9uZV9jZXJ0X3N0YXR1c19yZXF1ZXN0LCAgICAgLyogY2VydF9zdGF0dXNfcmVxdWVzdCAqLworICBDdXJsX211bHRpc3NsX2Nvbm5lY3QsICAgICAgICAgICAgIC8qIGNvbm5lY3QgKi8KKyAgQ3VybF9tdWx0aXNzbF9jb25uZWN0X25vbmJsb2NraW5nLCAvKiBjb25uZWN0X25vbmJsb2NraW5nICovCisgIEN1cmxfbXVsdGlzc2xfZ2V0X2ludGVybmFscywgICAgICAgLyogZ2V0X2ludGVybmFscyAqLworICBDdXJsX211bHRpc3NsX2Nsb3NlLCAgICAgICAgICAgICAgIC8qIGNsb3NlICovCisgIEN1cmxfbm9uZV9jbG9zZV9hbGwsICAgICAgICAgICAgICAgLyogY2xvc2VfYWxsICovCisgIEN1cmxfbm9uZV9zZXNzaW9uX2ZyZWUsICAgICAgICAgICAgLyogc2Vzc2lvbl9mcmVlICovCisgIEN1cmxfbm9uZV9zZXRfZW5naW5lLCAgICAgICAgICAgICAgLyogc2V0X2VuZ2luZSAqLworICBDdXJsX25vbmVfc2V0X2VuZ2luZV9kZWZhdWx0LCAgICAgIC8qIHNldF9lbmdpbmVfZGVmYXVsdCAqLworICBDdXJsX25vbmVfZW5naW5lc19saXN0LCAgICAgICAgICAgIC8qIGVuZ2luZXNfbGlzdCAqLworICBDdXJsX25vbmVfZmFsc2Vfc3RhcnQsICAgICAgICAgICAgIC8qIGZhbHNlX3N0YXJ0ICovCisgIEN1cmxfbm9uZV9tZDVzdW0sICAgICAgICAgICAgICAgICAgLyogbWQ1c3VtICovCisgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hhMjU2c3VtICovCit9OworCitjb25zdCBzdHJ1Y3QgQ3VybF9zc2wgKkN1cmxfc3NsID0KKyNpZiBkZWZpbmVkKENVUkxfV0lUSF9NVUxUSV9TU0wpCisgICZDdXJsX3NzbF9tdWx0aTsKKyNlbGlmIGRlZmluZWQoVVNFX0FYVExTKQorICAmQ3VybF9zc2xfYXh0bHM7CisjZWxpZiBkZWZpbmVkKFVTRV9DWUFTU0wpCisgICZDdXJsX3NzbF9jeWFzc2w7CisjZWxpZiBkZWZpbmVkKFVTRV9EQVJXSU5TU0wpCisgICZDdXJsX3NzbF9kYXJ3aW5zc2w7CisjZWxpZiBkZWZpbmVkKFVTRV9HTlVUTFMpCisgICZDdXJsX3NzbF9nbnV0bHM7CisjZWxpZiBkZWZpbmVkKFVTRV9HU0tJVCkKKyAgJkN1cmxfc3NsX2dza2l0OworI2VsaWYgZGVmaW5lZChVU0VfTUJFRFRMUykKKyAgJkN1cmxfc3NsX21iZWR0bHM7CisjZWxpZiBkZWZpbmVkKFVTRV9OU1MpCisgICZDdXJsX3NzbF9uc3M7CisjZWxpZiBkZWZpbmVkKFVTRV9PUEVOU1NMKQorICAmQ3VybF9zc2xfb3BlbnNzbDsKKyNlbGlmIGRlZmluZWQoVVNFX1BPTEFSU1NMKQorICAmQ3VybF9zc2xfcG9sYXJzc2w7CisjZWxpZiBkZWZpbmVkKFVTRV9TQ0hBTk5FTCkKKyAgJkN1cmxfc3NsX3NjaGFubmVsOworI2Vsc2UKKyNlcnJvciAiTWlzc2luZyBzdHJ1Y3QgQ3VybF9zc2wgZm9yIHNlbGVjdGVkIFNTTCBiYWNrZW5kIgorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgQ3VybF9zc2wgKmF2YWlsYWJsZV9iYWNrZW5kc1tdID0geworI2lmIGRlZmluZWQoVVNFX0FYVExTKQorICAmQ3VybF9zc2xfYXh0bHMsCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVTRV9DWUFTU0wpCisgICZDdXJsX3NzbF9jeWFzc2wsCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVTRV9EQVJXSU5TU0wpCisgICZDdXJsX3NzbF9kYXJ3aW5zc2wsCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVTRV9HTlVUTFMpCisgICZDdXJsX3NzbF9nbnV0bHMsCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVTRV9HU0tJVCkKKyAgJkN1cmxfc3NsX2dza2l0LAorI2VuZGlmCisjaWYgZGVmaW5lZChVU0VfTUJFRFRMUykKKyAgJkN1cmxfc3NsX21iZWR0bHMsCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVTRV9OU1MpCisgICZDdXJsX3NzbF9uc3MsCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVTRV9PUEVOU1NMKQorICAmQ3VybF9zc2xfb3BlbnNzbCwKKyNlbmRpZgorI2lmIGRlZmluZWQoVVNFX1BPTEFSU1NMKQorICAmQ3VybF9zc2xfcG9sYXJzc2wsCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVTRV9TQ0hBTk5FTCkKKyAgJkN1cmxfc3NsX3NjaGFubmVsLAorI2VuZGlmCisgIE5VTEwKK307CisKK3N0YXRpYyBzaXplX3QgQ3VybF9tdWx0aXNzbF92ZXJzaW9uKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgQ3VybF9zc2wgKnNlbGVjdGVkOworICBzdGF0aWMgY2hhciBiYWNrZW5kc1syMDBdOworICBzdGF0aWMgc2l6ZV90IHRvdGFsOworICBjb25zdCBzdHJ1Y3QgQ3VybF9zc2wgKmN1cnJlbnQ7CisKKyAgY3VycmVudCA9IEN1cmxfc3NsID09ICZDdXJsX3NzbF9tdWx0aSA/IGF2YWlsYWJsZV9iYWNrZW5kc1swXSA6IEN1cmxfc3NsOworCisgIGlmKGN1cnJlbnQgIT0gc2VsZWN0ZWQpIHsKKyAgICBjaGFyICpwID0gYmFja2VuZHM7CisgICAgaW50IGk7CisKKyAgICBzZWxlY3RlZCA9IGN1cnJlbnQ7CisKKyAgICBmb3IoaSA9IDA7IGF2YWlsYWJsZV9iYWNrZW5kc1tpXTsgaSsrKSB7CisgICAgICBpZihpKQorICAgICAgICAqKHArKykgPSAnICc7CisgICAgICBpZihzZWxlY3RlZCAhPSBhdmFpbGFibGVfYmFja2VuZHNbaV0pCisgICAgICAgICoocCsrKSA9ICcoJzsKKyAgICAgIHAgKz0gYXZhaWxhYmxlX2JhY2tlbmRzW2ldLT52ZXJzaW9uKHAsIGJhY2tlbmRzICsgc2l6ZW9mKGJhY2tlbmRzKSAtIHApOworICAgICAgaWYoc2VsZWN0ZWQgIT0gYXZhaWxhYmxlX2JhY2tlbmRzW2ldKQorICAgICAgICAqKHArKykgPSAnKSc7CisgICAgfQorICAgICpwID0gJ1wwJzsKKyAgICB0b3RhbCA9IHAgLSBiYWNrZW5kczsKKyAgfQorCisgIGlmKHNpemUgPCB0b3RhbCkKKyAgICBtZW1jcHkoYnVmZmVyLCBiYWNrZW5kcywgdG90YWwgKyAxKTsKKyAgZWxzZSB7CisgICAgbWVtY3B5KGJ1ZmZlciwgYmFja2VuZHMsIHNpemUgLSAxKTsKKyAgICBidWZmZXJbc2l6ZSAtIDFdID0gJ1wwJzsKKyAgfQorCisgIHJldHVybiB0b3RhbDsKK30KKworc3RhdGljIGludCBtdWx0aXNzbF9pbml0KGNvbnN0IHN0cnVjdCBDdXJsX3NzbCAqYmFja2VuZCkKK3sKKyAgY29uc3QgY2hhciAqZW52OworICBpbnQgaTsKKworICBpZihDdXJsX3NzbCAhPSAmQ3VybF9zc2xfbXVsdGkpCisgICAgcmV0dXJuIDE7CisKKyAgaWYoYmFja2VuZCkgeworICAgIEN1cmxfc3NsID0gYmFja2VuZDsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmKCFhdmFpbGFibGVfYmFja2VuZHNbMF0pCisgICAgcmV0dXJuIDE7CisKKyAgZW52ID0gZ2V0ZW52KCJDVVJMX1NTTF9CQUNLRU5EIik7CisjaWZkZWYgQ1VSTF9ERUZBVUxUX1NTTF9CQUNLRU5ECisgIGlmKCFlbnYpCisgICAgZW52ID0gQ1VSTF9ERUZBVUxUX1NTTF9CQUNLRU5EOworI2VuZGlmCisgIGlmKGVudikgeworICAgIGZvcihpID0gMDsgYXZhaWxhYmxlX2JhY2tlbmRzW2ldOyBpKyspIHsKKyAgICAgIGlmKHN0cmNhc2Vjb21wYXJlKGVudiwgYXZhaWxhYmxlX2JhY2tlbmRzW2ldLT5pbmZvLm5hbWUpKSB7CisgICAgICAgIEN1cmxfc3NsID0gYXZhaWxhYmxlX2JhY2tlbmRzW2ldOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBGYWxsIGJhY2sgdG8gZmlyc3QgYXZhaWxhYmxlIGJhY2tlbmQgKi8KKyAgQ3VybF9zc2wgPSBhdmFpbGFibGVfYmFja2VuZHNbMF07CisgIHJldHVybiAwOworfQorCitDVVJMc3Nsc2V0IGN1cmxfZ2xvYmFsX3NzbHNldChjdXJsX3NzbGJhY2tlbmQgaWQsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJsX3NzbF9iYWNrZW5kICoqKmF2YWlsKQoreworICBpbnQgaTsKKworICBpZihDdXJsX3NzbCAhPSAmQ3VybF9zc2xfbXVsdGkpCisgICAgcmV0dXJuIGlkID09IEN1cmxfc3NsLT5pbmZvLmlkID8gQ1VSTFNTTFNFVF9PSyA6IENVUkxTU0xTRVRfVE9PX0xBVEU7CisKKyAgZm9yKGkgPSAwOyBhdmFpbGFibGVfYmFja2VuZHNbaV07IGkrKykgeworICAgIGlmKGF2YWlsYWJsZV9iYWNrZW5kc1tpXS0+aW5mby5pZCA9PSBpZCB8fAorICAgICAgIChuYW1lICYmIHN0cmNhc2Vjb21wYXJlKGF2YWlsYWJsZV9iYWNrZW5kc1tpXS0+aW5mby5uYW1lLCBuYW1lKSkpIHsKKyAgICAgIG11bHRpc3NsX2luaXQoYXZhaWxhYmxlX2JhY2tlbmRzW2ldKTsKKyAgICAgIHJldHVybiBDVVJMU1NMU0VUX09LOworICAgIH0KKyAgfQorCisgIGlmKGF2YWlsKQorICAgICphdmFpbCA9IChjb25zdCBjdXJsX3NzbF9iYWNrZW5kICoqKSZhdmFpbGFibGVfYmFja2VuZHM7CisgIHJldHVybiBDVVJMU1NMU0VUX1VOS05PV05fQkFDS0VORDsKK30KKworI2Vsc2UgLyogVVNFX1NTTCAqLworQ1VSTHNzbHNldCBjdXJsX2dsb2JhbF9zc2xzZXQoY3VybF9zc2xiYWNrZW5kIGlkLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VybF9zc2xfYmFja2VuZCAqKiphdmFpbCkKK3sKKyAgKHZvaWQpaWQ7CisgICh2b2lkKW5hbWU7CisgICh2b2lkKWF2YWlsOworICByZXR1cm4gQ1VSTFNTTFNFVF9OT19CQUNLRU5EUzsKK30KKworI2VuZGlmIC8qICFVU0VfU1NMICovCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi92dGxzL3Z0bHMuaCBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvdnRscy5oCmluZGV4IDJhYWJlZGEuLmYxYTExZWEgMTAwNjQ0Ci0tLSBhL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvdnRscy5oCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3Z0bHMvdnRscy5oCkBAIC03LDcgKzcsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCkBAIC0yMyw2ICsyMyw4MCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpbmNsdWRlICJjdXJsX3NldHVwLmgiCiAKK3N0cnVjdCBjb25uZWN0ZGF0YTsKK3N0cnVjdCBzc2xfY29ubmVjdF9kYXRhOworCitzdHJ1Y3QgQ3VybF9zc2wgeworICAvKgorICAgKiBUaGlzICptdXN0KiBiZSB0aGUgZmlyc3QgZW50cnkgdG8gYWxsb3cgcmV0dXJuaW5nIHRoZSBsaXN0IG9mIGF2YWlsYWJsZQorICAgKiBiYWNrZW5kcyBpbiBjdXJsX2dsb2JhbF9zc2xzZXQoKS4KKyAgICovCisgIGN1cmxfc3NsX2JhY2tlbmQgaW5mbzsKKworICB1bnNpZ25lZCBoYXZlX2NhX3BhdGg6MTsgICAgICAvKiBzdXBwb3J0cyBDQVBBVEggKi8KKyAgdW5zaWduZWQgaGF2ZV9jZXJ0aW5mbzoxOyAgICAgLyogc3VwcG9ydHMgQ1VSTE9QVF9DRVJUSU5GTyAqLworICB1bnNpZ25lZCBoYXZlX3Bpbm5lZHB1YmtleToxOyAvKiBzdXBwb3J0cyBDVVJMT1BUX1BJTk5FRFBVQkxJQ0tFWSAqLworICB1bnNpZ25lZCBoYXZlX3NzbF9jdHg6MTsgICAgICAvKiBzdXBwb3J0cyBDVVJMT1BUX1NTTF9DVFhfKiAqLworCisgIHVuc2lnbmVkIHN1cHBvcnRfaHR0cHNfcHJveHk6MTsgLyogc3VwcG9ydHMgYWNjZXNzIHZpYSBIVFRQUyBwcm94aWVzICovCisKKyAgc2l6ZV90IHNpemVvZl9zc2xfYmFja2VuZF9kYXRhOworCisgIGludCAoKmluaXQpKHZvaWQpOworICB2b2lkICgqY2xlYW51cCkodm9pZCk7CisKKyAgc2l6ZV90ICgqdmVyc2lvbikoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisgIGludCAoKmNoZWNrX2N4bikoc3RydWN0IGNvbm5lY3RkYXRhICpjeG4pOworICBpbnQgKCpzaHV0ZG93bikoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKKyAgYm9vbCAoKmRhdGFfcGVuZGluZykoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29ubmluZGV4KTsKKworICAvKiByZXR1cm4gMCBpZiBhIGZpbmQgcmFuZG9tIGlzIGZpbGxlZCBpbiAqLworICBDVVJMY29kZSAoKnJhbmRvbSkoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwgdW5zaWduZWQgY2hhciAqZW50cm9weSwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpOworICBib29sICgqY2VydF9zdGF0dXNfcmVxdWVzdCkodm9pZCk7CisKKyAgQ1VSTGNvZGUgKCpjb25uZWN0KShzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBzb2NraW5kZXgpOworICBDVVJMY29kZSAoKmNvbm5lY3Rfbm9uYmxvY2tpbmcpKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IHNvY2tpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpkb25lKTsKKyAgdm9pZCAqKCpnZXRfaW50ZXJuYWxzKShzdHJ1Y3Qgc3NsX2Nvbm5lY3RfZGF0YSAqY29ubnNzbCwgQ1VSTElORk8gaW5mbyk7CisgIHZvaWQgKCpjbG9zZSkoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKKyAgdm9pZCAoKmNsb3NlX2FsbCkoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSk7CisgIHZvaWQgKCpzZXNzaW9uX2ZyZWUpKHZvaWQgKnB0cik7CisKKyAgQ1VSTGNvZGUgKCpzZXRfZW5naW5lKShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLCBjb25zdCBjaGFyICplbmdpbmUpOworICBDVVJMY29kZSAoKnNldF9lbmdpbmVfZGVmYXVsdCkoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSk7CisgIHN0cnVjdCBjdXJsX3NsaXN0ICooKmVuZ2luZXNfbGlzdCkoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSk7CisKKyAgYm9vbCAoKmZhbHNlX3N0YXJ0KSh2b2lkKTsKKworICBDVVJMY29kZSAoKm1kNXN1bSkodW5zaWduZWQgY2hhciAqaW5wdXQsIHNpemVfdCBpbnB1dGxlbiwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm1kNXN1bSwgc2l6ZV90IG1kNXN1bWxlbik7CisgIHZvaWQgKCpzaGEyNTZzdW0pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlucHV0LCBzaXplX3QgaW5wdXRsZW4sCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNoYTI1NnN1bSwgc2l6ZV90IHNoYTI1NnN1bWxlbik7Cit9OworCisjaWZkZWYgVVNFX1NTTAorZXh0ZXJuIGNvbnN0IHN0cnVjdCBDdXJsX3NzbCAqQ3VybF9zc2w7CisjZW5kaWYKKworaW50IEN1cmxfbm9uZV9pbml0KHZvaWQpOwordm9pZCBDdXJsX25vbmVfY2xlYW51cCh2b2lkKTsKK2ludCBDdXJsX25vbmVfc2h1dGRvd24oc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgc29ja2luZGV4KTsKK2ludCBDdXJsX25vbmVfY2hlY2tfY3huKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubik7CitDVVJMY29kZSBDdXJsX25vbmVfcmFuZG9tKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsIHVuc2lnbmVkIGNoYXIgKmVudHJvcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpOwordm9pZCBDdXJsX25vbmVfY2xvc2VfYWxsKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpOwordm9pZCBDdXJsX25vbmVfc2Vzc2lvbl9mcmVlKHZvaWQgKnB0cik7Citib29sIEN1cmxfbm9uZV9kYXRhX3BlbmRpbmcoY29uc3Qgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgY29ubmluZGV4KTsKK2Jvb2wgQ3VybF9ub25lX2NlcnRfc3RhdHVzX3JlcXVlc3Qodm9pZCk7CitDVVJMY29kZSBDdXJsX25vbmVfc2V0X2VuZ2luZShzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLCBjb25zdCBjaGFyICplbmdpbmUpOworQ1VSTGNvZGUgQ3VybF9ub25lX3NldF9lbmdpbmVfZGVmYXVsdChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhKTsKK3N0cnVjdCBjdXJsX3NsaXN0ICpDdXJsX25vbmVfZW5naW5lc19saXN0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpOworYm9vbCBDdXJsX25vbmVfZmFsc2Vfc3RhcnQodm9pZCk7CitDVVJMY29kZSBDdXJsX25vbmVfbWQ1c3VtKHVuc2lnbmVkIGNoYXIgKmlucHV0LCBzaXplX3QgaW5wdXRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm1kNXN1bSwgc2l6ZV90IG1kNWxlbik7CisKICNpbmNsdWRlICJvcGVuc3NsLmgiICAgICAgICAvKiBPcGVuU1NMIHZlcnNpb25zICovCiAjaW5jbHVkZSAiZ3Rscy5oIiAgICAgICAgICAgLyogR251VExTIHZlcnNpb25zICovCiAjaW5jbHVkZSAibnNzZy5oIiAgICAgICAgICAgLyogTlNTIHZlcnNpb25zICovCkBAIC00Miw4ICsxMTYsOCBAQAogI2RlZmluZSBNRDVfRElHRVNUX0xFTkdUSCAxNiAvKiBmaXhlZCBzaXplICovCiAjZW5kaWYKIAotI2lmbmRlZiBTSEEyNTZfRElHRVNUX0xFTkdUSAotI2RlZmluZSBTSEEyNTZfRElHRVNUX0xFTkdUSCAzMiAvKiBmaXhlZCBzaXplICovCisjaWZuZGVmIENVUkxfU0hBMjU2X0RJR0VTVF9MRU5HVEgKKyNkZWZpbmUgQ1VSTF9TSEEyNTZfRElHRVNUX0xFTkdUSCAzMiAvKiBmaXhlZCBzaXplICovCiAjZW5kaWYKIAogLyogc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1pZXRmLXRscy1hcHBsYXllcnByb3RvbmVnLTA0ICovCkBAIC0xNzIsOCArMjQ2LDYgQEAKICNkZWZpbmUgU1NMX1NIVVRET1dOX1RJTUVPVVQgMTAwMDAgLyogbXMgKi8KIAogI2Vsc2UKLS8qIFNldCB0aGUgQVBJIGJhY2tlbmQgZGVmaW5pdGlvbiB0byBub25lICovCi0jZGVmaW5lIENVUkxfU1NMX0JBQ0tFTkQgQ1VSTFNTTEJBQ0tFTkRfTk9ORQogCiAvKiBXaGVuIFNTTCBzdXBwb3J0IGlzIG5vdCBwcmVzZW50LCBqdXN0IGRlZmluZSBhd2F5IHRoZXNlIGZ1bmN0aW9uIGNhbGxzICovCiAjZGVmaW5lIEN1cmxfc3NsX2luaXQoKSAxCmRpZmYgLS1naXQgYS9VdGlsaXRpZXMvY21jdXJsL2xpYi93YXJubGVzcy5jIGIvVXRpbGl0aWVzL2NtY3VybC9saWIvd2Fybmxlc3MuYwppbmRleCBmYjA4NWM4Li4wNWQ5MDM4IDEwMDY0NAotLS0gYS9VdGlsaXRpZXMvY21jdXJsL2xpYi93YXJubGVzcy5jCisrKyBiL1V0aWxpdGllcy9jbWN1cmwvbGliL3dhcm5sZXNzLmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxNiwgRGFuaWVsIFN0ZW5iZXJnLCA8ZGFuaWVsQGhheHguc2U+LCBldCBhbC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTcsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgQ09QWUlORywgd2hpY2gKICAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKQEAgLTY5LDM2ICs2OSwzNiBAQAogIyAgZXJyb3IgIlNJWkVPRl9JTlQgbm90IGRlZmluZWQiCiAjZW5kaWYKIAotI2lmIChDVVJMX1NJWkVPRl9MT05HID09IDIpCisjaWYgKFNJWkVPRl9MT05HID09IDIpCiAjICBkZWZpbmUgQ1VSTF9NQVNLX1NMT05HICAweDdGRkZMCiAjICBkZWZpbmUgQ1VSTF9NQVNLX1VMT05HICAweEZGRkZVTAotI2VsaWYgKENVUkxfU0laRU9GX0xPTkcgPT0gNCkKKyNlbGlmIChTSVpFT0ZfTE9ORyA9PSA0KQogIyAgZGVmaW5lIENVUkxfTUFTS19TTE9ORyAgMHg3RkZGRkZGRkwKICMgIGRlZmluZSBDVVJMX01BU0tfVUxPTkcgIDB4RkZGRkZGRkZVTAotI2VsaWYgKENVUkxfU0laRU9GX0xPTkcgPT0gOCkKKyNlbGlmIChTSVpFT0ZfTE9ORyA9PSA4KQogIyAgZGVmaW5lIENVUkxfTUFTS19TTE9ORyAgMHg3RkZGRkZGRkZGRkZGRkZGTAogIyAgZGVmaW5lIENVUkxfTUFTS19VTE9ORyAgMHhGRkZGRkZGRkZGRkZGRkZGVUwKLSNlbGlmIChDVVJMX1NJWkVPRl9MT05HID09IDE2KQorI2VsaWYgKFNJWkVPRl9MT05HID09IDE2KQogIyAgZGVmaW5lIENVUkxfTUFTS19TTE9ORyAgMHg3RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkwKICMgIGRlZmluZSBDVVJMX01BU0tfVUxPTkcgIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZVTAogI2Vsc2UKLSMgIGVycm9yICJDVVJMX1NJWkVPRl9MT05HIG5vdCBkZWZpbmVkIgorIyAgZXJyb3IgIlNJWkVPRl9MT05HIG5vdCBkZWZpbmVkIgogI2VuZGlmCiAKLSNpZiAoQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCA9PSAyKQorI2lmIChTSVpFT0ZfQ1VSTF9PRkZfVCA9PSAyKQogIyAgZGVmaW5lIENVUkxfTUFTS19TQ09GRlQgIENVUkxfT0ZGX1RfQygweDdGRkYpCiAjICBkZWZpbmUgQ1VSTF9NQVNLX1VDT0ZGVCAgQ1VSTF9PRkZfVFVfQygweEZGRkYpCi0jZWxpZiAoQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCA9PSA0KQorI2VsaWYgKFNJWkVPRl9DVVJMX09GRl9UID09IDQpCiAjICBkZWZpbmUgQ1VSTF9NQVNLX1NDT0ZGVCAgQ1VSTF9PRkZfVF9DKDB4N0ZGRkZGRkYpCiAjICBkZWZpbmUgQ1VSTF9NQVNLX1VDT0ZGVCAgQ1VSTF9PRkZfVFVfQygweEZGRkZGRkZGKQotI2VsaWYgKENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgPT0gOCkKKyNlbGlmIChTSVpFT0ZfQ1VSTF9PRkZfVCA9PSA4KQogIyAgZGVmaW5lIENVUkxfTUFTS19TQ09GRlQgIENVUkxfT0ZGX1RfQygweDdGRkZGRkZGRkZGRkZGRkYpCiAjICBkZWZpbmUgQ1VSTF9NQVNLX1VDT0ZGVCAgQ1VSTF9PRkZfVFVfQygweEZGRkZGRkZGRkZGRkZGRkYpCi0jZWxpZiAoQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCA9PSAxNikKKyNlbGlmIChTSVpFT0ZfQ1VSTF9PRkZfVCA9PSAxNikKICMgIGRlZmluZSBDVVJMX01BU0tfU0NPRkZUICBDVVJMX09GRl9UX0MoMHg3RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRikKICMgIGRlZmluZSBDVVJMX01BU0tfVUNPRkZUICBDVVJMX09GRl9UVV9DKDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYpCiAjZWxzZQotIyAgZXJyb3IgIkNVUkxfU0laRU9GX0NVUkxfT0ZGX1Qgbm90IGRlZmluZWQiCisjICBlcnJvciAiU0laRU9GX0NVUkxfT0ZGX1Qgbm90IGRlZmluZWQiCiAjZW5kaWYKIAogI2lmIChTSVpFT0ZfU0laRV9UID09IFNJWkVPRl9TSE9SVCkKQEAgLTEwNywxMCArMTA3LDEwIEBACiAjZWxpZiAoU0laRU9GX1NJWkVfVCA9PSBTSVpFT0ZfSU5UKQogIyAgZGVmaW5lIENVUkxfTUFTS19TU0laRV9UICBDVVJMX01BU0tfU0lOVAogIyAgZGVmaW5lIENVUkxfTUFTS19VU0laRV9UICBDVVJMX01BU0tfVUlOVAotI2VsaWYgKFNJWkVPRl9TSVpFX1QgPT0gQ1VSTF9TSVpFT0ZfTE9ORykKKyNlbGlmIChTSVpFT0ZfU0laRV9UID09IFNJWkVPRl9MT05HKQogIyAgZGVmaW5lIENVUkxfTUFTS19TU0laRV9UICBDVVJMX01BU0tfU0xPTkcKICMgIGRlZmluZSBDVVJMX01BU0tfVVNJWkVfVCAgQ1VSTF9NQVNLX1VMT05HCi0jZWxpZiAoU0laRU9GX1NJWkVfVCA9PSBDVVJMX1NJWkVPRl9DVVJMX09GRl9UKQorI2VsaWYgKFNJWkVPRl9TSVpFX1QgPT0gU0laRU9GX0NVUkxfT0ZGX1QpCiAjICBkZWZpbmUgQ1VSTF9NQVNLX1NTSVpFX1QgIENVUkxfTUFTS19TQ09GRlQKICMgIGRlZmluZSBDVVJMX01BU0tfVVNJWkVfVCAgQ1VSTF9NQVNLX1VDT0ZGVAogI2Vsc2UKQEAgLTIyNiw3ICsyMjYsNyBAQAogIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjgxMCkgLyogY29udmVyc2lvbiBtYXkgbG9zZSBzaWduaWZpY2FudCBiaXRzICovCiAjZW5kaWYKIAotI2lmIChDVVJMX1NJWkVPRl9MT05HIDwgU0laRU9GX1NJWkVfVCkKKyNpZiAoU0laRU9GX0xPTkcgPCBTSVpFT0ZfU0laRV9UKQogICBERUJVR0FTU0VSVCh1em51bSA8PSAoc2l6ZV90KSBDVVJMX01BU0tfVUxPTkcpOwogI2VuZGlmCiAgIHJldHVybiAodW5zaWduZWQgbG9uZykodXpudW0gJiAoc2l6ZV90KSBDVVJMX01BU0tfVUxPTkcpOwpAQCAtMjY5LDcgKzI2OSw3IEBACiAjZW5kaWYKIAogICBERUJVR0FTU0VSVChzbG51bSA+PSAwKTsKLSNpZiAoU0laRU9GX0lOVCA8IENVUkxfU0laRU9GX0xPTkcpCisjaWYgKFNJWkVPRl9JTlQgPCBTSVpFT0ZfTE9ORykKICAgREVCVUdBU1NFUlQoKHVuc2lnbmVkIGxvbmcpIHNsbnVtIDw9ICh1bnNpZ25lZCBsb25nKSBDVVJMX01BU0tfU0lOVCk7CiAjZW5kaWYKICAgcmV0dXJuIChpbnQpKHNsbnVtICYgKGxvbmcpIENVUkxfTUFTS19TSU5UKTsKQEAgLTI5MSw3ICsyOTEsNyBAQAogI2VuZGlmCiAKICAgREVCVUdBU1NFUlQoc2xudW0gPj0gMCk7Ci0jaWYgKFNJWkVPRl9JTlQgPCBDVVJMX1NJWkVPRl9MT05HKQorI2lmIChTSVpFT0ZfSU5UIDwgU0laRU9GX0xPTkcpCiAgIERFQlVHQVNTRVJUKCh1bnNpZ25lZCBsb25nKSBzbG51bSA8PSAodW5zaWduZWQgbG9uZykgQ1VSTF9NQVNLX1VJTlQpOwogI2VuZGlmCiAgIHJldHVybiAodW5zaWduZWQgaW50KShzbG51bSAmIChsb25nKSBDVVJMX01BU0tfVUlOVCk7Cg==