ZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvZGJhcGkucHkgYi9MaWIvc3FsaXRlMy90ZXN0L2RiYXBpLnB5CmluZGV4IGIwOGRhOWMuLmIyNzQ4NmQgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvZGJhcGkucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9kYmFwaS5weQpAQCAtMSw3ICsxLDcgQEAKICMtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQogIyBweXNxbGl0ZTIvdGVzdC9kYmFwaS5weTogdGVzdHMgZm9yIERCLUFQSSBjb21wbGlhbmNlCiAjCi0jIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KICMKQEAgLTIyLDYgKzIyLDcgQEAKICMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KIAogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCiBpbXBvcnQgdGhyZWFkaW5nCiBpbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKIApAQCAtMjIzLDEyICsyMjQsNDUgQEAKICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgogICAgICAgICAgICAgcGFzcwogCisgICAgZGVmIENoZWNrRXhlY3V0ZVBhcmFtTGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT0/IiwgWyJmb28iXSkKKyAgICAgICAgcm93ID0gc2VsZi5jdS5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgImZvbyIpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlUGFyYW1TZXF1ZW5jZShzZWxmKToKKyAgICAgICAgY2xhc3MgTChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICBhc3NlcnQgeCA9PSAwCisgICAgICAgICAgICAgICAgcmV0dXJuICJmb28iCisKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT0/IiwgTCgpKQorICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCAiZm9vIikKKwogICAgIGRlZiBDaGVja0V4ZWN1dGVEaWN0TWFwcGluZyhzZWxmKToKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT06bmFtZSIsIHsibmFtZSI6ICJmb28ifSkKICAgICAgICAgcm93ID0gc2VsZi5jdS5mZXRjaG9uZSgpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgImZvbyIpCiAKKyAgICBkZWYgQ2hlY2tFeGVjdXRlRGljdE1hcHBpbmdfTWFwcGluZyhzZWxmKToKKyAgICAgICAgIyBUZXN0IG9ubHkgd29ya3Mgd2l0aCBQeXRob24gMi41IG9yIGxhdGVyCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNSwgMCk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBjbGFzcyBEKGRpY3QpOgorICAgICAgICAgICAgZGVmIF9fbWlzc2luZ19fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgcmV0dXJuICJmb28iCisKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT06bmFtZSIsIEQoKSkKKyAgICAgICAgcm93ID0gc2VsZi5jdS5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgImZvbyIpCisKICAgICBkZWYgQ2hlY2tFeGVjdXRlRGljdE1hcHBpbmdUb29MaXR0bGVBcmdzKHNlbGYpOgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgICB0cnk6CkBAIC0zNzgsNiArNDEyLDEyIEBACiAgICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2htYW55KDEwMCkKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzLCBbXSkKIAorICAgIGRlZiBDaGVja0ZldGNobWFueUt3QXJnKHNlbGYpOgorICAgICAgICAiIiJDaGVja3MgaWYgZmV0Y2htYW55IHdvcmtzIHdpdGgga2V5d29yZCBhcmd1bWVudHMiIiIKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1LmZldGNobWFueShzaXplPTEwMCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHJlcyksIDEpCisKICAgICBkZWYgQ2hlY2tGZXRjaGFsbChzZWxmKToKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQogICAgICAgICByZXMgPSBzZWxmLmN1LmZldGNoYWxsKCkKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvaG9va3MucHkgYi9MaWIvc3FsaXRlMy90ZXN0L2hvb2tzLnB5CmluZGV4IGNiMGE2MjEuLjU0N2RjNjUgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvaG9va3MucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9ob29rcy5weQpAQCAtMSw3ICsxLDcgQEAKICMtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQogIyBweXNxbGl0ZTIvdGVzdC9ob29rcy5weTogdGVzdHMgZm9yIHZhcmlvdXMgU1FMaXRlLXNwZWNpZmljIGhvb2tzCiAjCi0jIENvcHlyaWdodCAoQykgMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisjIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiAjCkBAIC0yMSw3ICsyMSw3IEBACiAjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KICMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KIAotaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MsIHVuaXR0ZXN0CiBpbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKIAogY2xhc3MgQ29sbGF0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtMTA1LDkgKzEwNSw4MCBAQAogICAgICAgICAgICAgaWYgbm90IGUuYXJnc1swXS5zdGFydHN3aXRoKCJubyBzdWNoIGNvbGxhdGlvbiBzZXF1ZW5jZSIpOgogICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgT3BlcmF0aW9uYWxFcnJvciByYWlzZWQiKQogCitjbGFzcyBQcm9ncmVzc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgQ2hlY2tQcm9ncmVzc0hhbmRsZXJVc2VkKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGVzdCB0aGF0IHRoZSBwcm9ncmVzcyBoYW5kbGVyIGlzIGludm9rZWQgb25jZSBpdCBpcyBzZXQuCisgICAgICAgICIiIgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBwcm9ncmVzc19jYWxscyA9IFtdCisgICAgICAgIGRlZiBwcm9ncmVzcygpOgorICAgICAgICAgICAgcHJvZ3Jlc3NfY2FsbHMuYXBwZW5kKE5vbmUpCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBjb24uc2V0X3Byb2dyZXNzX2hhbmRsZXIocHJvZ3Jlc3MsIDEpCisgICAgICAgIGNvbi5leGVjdXRlKCIiIgorICAgICAgICAgICAgY3JlYXRlIHRhYmxlIGZvbyhhLCBiKQorICAgICAgICAgICAgIiIiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MocHJvZ3Jlc3NfY2FsbHMpCisKKworICAgIGRlZiBDaGVja09wY29kZUNvdW50KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGVzdCB0aGF0IHRoZSBvcGNvZGUgYXJndW1lbnQgaXMgcmVzcGVjdGVkLgorICAgICAgICAiIiIKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgcHJvZ3Jlc3NfY2FsbHMgPSBbXQorICAgICAgICBkZWYgcHJvZ3Jlc3MoKToKKyAgICAgICAgICAgIHByb2dyZXNzX2NhbGxzLmFwcGVuZChOb25lKQorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAxKQorICAgICAgICBjdXJzID0gY29uLmN1cnNvcigpCisgICAgICAgIGN1cnMuZXhlY3V0ZSgiIiIKKyAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSBmb28gKGEsIGIpCisgICAgICAgICAgICAiIiIpCisgICAgICAgIGZpcnN0X2NvdW50ID0gbGVuKHByb2dyZXNzX2NhbGxzKQorICAgICAgICBwcm9ncmVzc19jYWxscyA9IFtdCisgICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihwcm9ncmVzcywgMikKKyAgICAgICAgY3Vycy5leGVjdXRlKCIiIgorICAgICAgICAgICAgY3JlYXRlIHRhYmxlIGJhciAoYSwgYikKKyAgICAgICAgICAgICIiIikKKyAgICAgICAgc2Vjb25kX2NvdW50ID0gbGVuKHByb2dyZXNzX2NhbGxzKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZmlyc3RfY291bnQgPiBzZWNvbmRfY291bnQpCisKKyAgICBkZWYgQ2hlY2tDYW5jZWxPcGVyYXRpb24oc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUZXN0IHRoYXQgcmV0dXJuaW5nIGEgbm9uLXplcm8gdmFsdWUgc3RvcHMgdGhlIG9wZXJhdGlvbiBpbiBwcm9ncmVzcy4KKyAgICAgICAgIiIiCisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIHByb2dyZXNzX2NhbGxzID0gW10KKyAgICAgICAgZGVmIHByb2dyZXNzKCk6CisgICAgICAgICAgICBwcm9ncmVzc19jYWxscy5hcHBlbmQoTm9uZSkKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihwcm9ncmVzcywgMSkKKyAgICAgICAgY3VycyA9IGNvbi5jdXJzb3IoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLAorICAgICAgICAgICAgY3Vycy5leGVjdXRlLAorICAgICAgICAgICAgImNyZWF0ZSB0YWJsZSBiYXIgKGEsIGIpIikKKworICAgIGRlZiBDaGVja0NsZWFySGFuZGxlcihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFRlc3QgdGhhdCBzZXR0aW5nIHRoZSBwcm9ncmVzcyBoYW5kbGVyIHRvIE5vbmUgY2xlYXJzIHRoZSBwcmV2aW91c2x5IHNldCBoYW5kbGVyLgorICAgICAgICAiIiIKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgYWN0aW9uID0gMAorICAgICAgICBkZWYgcHJvZ3Jlc3MoKToKKyAgICAgICAgICAgIGFjdGlvbiA9IDEKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihwcm9ncmVzcywgMSkKKyAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKE5vbmUsIDEpCisgICAgICAgIGNvbi5leGVjdXRlKCJzZWxlY3QgMSB1bmlvbiBzZWxlY3QgMiB1bmlvbiBzZWxlY3QgMyIpLmZldGNoYWxsKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYWN0aW9uLCAwLCAicHJvZ3Jlc3MgaGFuZGxlciB3YXMgbm90IGNsZWFyZWQiKQorCiBkZWYgc3VpdGUoKToKICAgICBjb2xsYXRpb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ29sbGF0aW9uVGVzdHMsICJDaGVjayIpCi0gICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoY29sbGF0aW9uX3N1aXRlLCkpCisgICAgcHJvZ3Jlc3Nfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoUHJvZ3Jlc3NUZXN0cywgIkNoZWNrIikKKyAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChjb2xsYXRpb25fc3VpdGUsIHByb2dyZXNzX3N1aXRlKSkKIAogZGVmIHRlc3QoKToKICAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L3B5MjV0ZXN0cy5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvcHkyNXRlc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZTI2YjkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc3FsaXRlMy90ZXN0L3B5MjV0ZXN0cy5weQpAQCAtMCwwICsxLDgwIEBACisjLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KKyMgcHlzcWxpdGUyL3Rlc3QvcmVncmVzc2lvbi5weTogcHlzcWxpdGUgcmVncmVzc2lvbiB0ZXN0cworIworIyBDb3B5cmlnaHQgKEMpIDIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorIworIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisjCisjIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisjICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisjICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisjIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCisKK2RpZF9yb2xsYmFjayA9IEZhbHNlCisKK2NsYXNzIE15Q29ubmVjdGlvbihzcWxpdGUuQ29ubmVjdGlvbik6CisgICAgZGVmIHJvbGxiYWNrKHNlbGYpOgorICAgICAgICBnbG9iYWwgZGlkX3JvbGxiYWNrCisgICAgICAgIGRpZF9yb2xsYmFjayA9IFRydWUKKyAgICAgICAgc3FsaXRlLkNvbm5lY3Rpb24ucm9sbGJhY2soc2VsZikKKworY2xhc3MgQ29udGV4dFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGdsb2JhbCBkaWRfcm9sbGJhY2sKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLCBmYWN0b3J5PU15Q29ubmVjdGlvbikKKyAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoYyB1bmlxdWUpIikKKyAgICAgICAgZGlkX3JvbGxiYWNrID0gRmFsc2UKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrQ29udGV4dE1hbmFnZXIoc2VsZik6CisgICAgICAgICIiIkNhbiB0aGUgY29ubmVjdGlvbiBiZSB1c2VkIGFzIGEgY29udGV4dCBtYW5hZ2VyIGF0IGFsbD8iIiIKKyAgICAgICAgd2l0aCBzZWxmLmNvbjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0NvbnRleHRNYW5hZ2VyQ29tbWl0KHNlbGYpOgorICAgICAgICAiIiJJcyBhIGNvbW1pdCBjYWxsZWQgaW4gdGhlIGNvbnRleHQgbWFuYWdlcj8iIiIKKyAgICAgICAgd2l0aCBzZWxmLmNvbjoKKyAgICAgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYykgdmFsdWVzICgnZm9vJykiKQorICAgICAgICBzZWxmLmNvbi5yb2xsYmFjaygpCisgICAgICAgIGNvdW50ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IGNvdW50KCopIGZyb20gdGVzdCIpLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY291bnQsIDEpCisKKyAgICBkZWYgQ2hlY2tDb250ZXh0TWFuYWdlclJvbGxiYWNrKHNlbGYpOgorICAgICAgICAiIiJJcyBhIHJvbGxiYWNrIGNhbGxlZCBpbiB0aGUgY29udGV4dCBtYW5hZ2VyPyIiIgorICAgICAgICBnbG9iYWwgZGlkX3JvbGxiYWNrCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGRpZF9yb2xsYmFjaywgRmFsc2UpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggc2VsZi5jb246CisgICAgICAgICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChjKSB2YWx1ZXMgKDQpIikKKyAgICAgICAgICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGMpIHZhbHVlcyAoNCkiKQorICAgICAgICBleGNlcHQgc3FsaXRlLkludGVncml0eUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChkaWRfcm9sbGJhY2ssIFRydWUpCisKK2RlZiBzdWl0ZSgpOgorICAgIGN0eF9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb250ZXh0VGVzdHMsICJDaGVjayIpCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoY3R4X3N1aXRlLCkpCisKK2RlZiB0ZXN0KCk6CisgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQorICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weQppbmRleCBhZGRlZGIxLi40NWVhZTkwIDEwMDY0NAotLS0gYS9MaWIvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9yZWdyZXNzaW9uLnB5CkBAIC0xLDcgKzEsNyBAQAogIy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCiAjIHB5c3FsaXRlMi90ZXN0L3JlZ3Jlc3Npb24ucHk6IHB5c3FsaXRlIHJlZ3Jlc3Npb24gdGVzdHMKICMKLSMgQ29weXJpZ2h0IChDKSAyMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KICMKQEAgLTIxLDYgKzIxLDcgQEAKICMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgogIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgogCitpbXBvcnQgZGF0ZXRpbWUKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCiAKQEAgLTc5LDYgKzgwLDc5IEBACiAgICAgICAgIGN1ci5mZXRjaG9uZSgpCiAgICAgICAgIGN1ci5mZXRjaG9uZSgpCiAKKyAgICBkZWYgQ2hlY2tTdGF0ZW1lbnRGaW5hbGl6YXRpb25PbkNsb3NlRGIoc2VsZik6CisgICAgICAgICMgcHlzcWxpdGUgdmVyc2lvbnMgPD0gMi4zLjMgb25seSBmaW5hbGl6ZWQgc3RhdGVtZW50cyBpbiB0aGUgc3RhdGVtZW50CisgICAgICAgICMgY2FjaGUgd2hlbiBjbG9zaW5nIHRoZSBkYXRhYmFzZS4gc3RhdGVtZW50cyB0aGF0IHdlcmUgc3RpbGwKKyAgICAgICAgIyByZWZlcmVuY2VkIGluIGN1cnNvcnMgd2VyZW4ndCBjbG9zZWQgYW4gY291bGQgcHJvdm9rZSAiCisgICAgICAgICMgIk9wZXJhdGlvbmFsRXJyb3I6IFVuYWJsZSB0byBjbG9zZSBkdWUgdG8gdW5maW5hbGlzZWQgc3RhdGVtZW50cyIuCisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGN1cnNvcnMgPSBbXQorICAgICAgICAjIGRlZmF1bHQgc3RhdGVtZW50IGNhY2hlIHNpemUgaXMgMTAwCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwNSk6CisgICAgICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgICAgIGN1cnNvcnMuYXBwZW5kKGN1cikKKyAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgMSB4IHVuaW9uIHNlbGVjdCAiICsgc3RyKGkpKQorICAgICAgICBjb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrT25Db25mbGljdFJvbGxiYWNrKHNlbGYpOgorICAgICAgICBpZiBzcWxpdGUuc3FsaXRlX3ZlcnNpb25faW5mbyA8ICgzLCAyLCAyKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGZvbyh4LCB1bmlxdWUoeCkgb24gY29uZmxpY3Qgcm9sbGJhY2spIikKKyAgICAgICAgY29uLmV4ZWN1dGUoImluc2VydCBpbnRvIGZvbyh4KSB2YWx1ZXMgKDEpIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29uLmV4ZWN1dGUoImluc2VydCBpbnRvIGZvbyh4KSB2YWx1ZXMgKDEpIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5EYXRhYmFzZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gZm9vKHgpIHZhbHVlcyAoMikiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb24uY29tbWl0KCkKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJweXNxbGl0ZSBrbmV3IG5vdGhpbmcgYWJvdXQgdGhlIGltcGxpY2l0IFJPTExCQUNLIikKKworICAgIGRlZiBDaGVja1dvcmthcm91bmRGb3JCdWdneVNxbGl0ZVRyYW5zZmVyQmluZGluZ3Moc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBweXNxbGl0ZSB3b3VsZCBjcmFzaCB3aXRoIG9sZGVyIFNRTGl0ZSB2ZXJzaW9ucyB1bmxlc3MKKyAgICAgICAgYSB3b3JrYXJvdW5kIGlzIGltcGxlbWVudGVkLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGlmIG5vdCBleGlzdHMgZm9vKGJhcikiKQorICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJjcmVhdGUgdGFibGUgaWYgbm90IGV4aXN0cyBmb28oYmFyKSIpCisKKyAgICBkZWYgQ2hlY2tFbXB0eVN0YXRlbWVudChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIHB5c3FsaXRlIHVzZWQgdG8gc2VnZmF1bHQgd2l0aCBTUUxpdGUgdmVyc2lvbnMgMy41LnguIFRoZXNlIHJldHVybiBOVUxMCisgICAgICAgIGZvciAibm8tb3BlcmF0aW9uIiBzdGF0ZW1lbnRzCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCIiKQorCisgICAgZGVmIENoZWNrVW5pY29kZUNvbm5lY3Qoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBXaXRoIHB5c3FsaXRlIDIuNC4wIHlvdSBuZWVkZWQgdG8gdXNlIGEgc3RyaW5nIG9yIGEgQVBTVyBjb25uZWN0aW9uCisgICAgICAgIG9iamVjdCBmb3Igb3BlbmluZyBkYXRhYmFzZSBjb25uZWN0aW9ucy4KKworICAgICAgICBGb3JtZXJseSwgYm90aCBieXRlc3RyaW5ncyBhbmQgdW5pY29kZSBzdHJpbmdzIHVzZWQgdG8gd29yay4KKworICAgICAgICBMZXQncyBtYWtlIHN1cmUgdW5pY29kZSBzdHJpbmdzIHdvcmsgaW4gdGhlIGZ1dHVyZS4KKyAgICAgICAgIiIiCisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KHUiOm1lbW9yeToiKQorICAgICAgICBjb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrVHlwZU1hcFVzYWdlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgcHlzcWxpdGUgdW50aWwgMi40LjEgZGlkIG5vdCByZWJ1aWxkIHRoZSByb3dfY2FzdF9tYXAgd2hlbiByZWNvbXBpbGluZworICAgICAgICBhIHN0YXRlbWVudC4gVGhpcyB0ZXN0IGV4aGliaXRzIHRoZSBwcm9ibGVtLgorICAgICAgICAiIiIKKyAgICAgICAgU0VMRUNUID0gInNlbGVjdCAqIGZyb20gZm9vIgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLGRldGVjdF90eXBlcz1zcWxpdGUuUEFSU0VfREVDTFRZUEVTKQorICAgICAgICBjb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGZvbyhiYXIgdGltZXN0YW1wKSIpCisgICAgICAgIGNvbi5leGVjdXRlKCJpbnNlcnQgaW50byBmb28oYmFyKSB2YWx1ZXMgKD8pIiwgKGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpLCkpCisgICAgICAgIGNvbi5leGVjdXRlKFNFTEVDVCkKKyAgICAgICAgY29uLmV4ZWN1dGUoImRyb3AgdGFibGUgZm9vIikKKyAgICAgICAgY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBmb28oYmFyIGludGVnZXIpIikKKyAgICAgICAgY29uLmV4ZWN1dGUoImluc2VydCBpbnRvIGZvbyhiYXIpIHZhbHVlcyAoNSkiKQorICAgICAgICBjb24uZXhlY3V0ZShTRUxFQ1QpCisKKwogZGVmIHN1aXRlKCk6CiAgICAgcmVncmVzc2lvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShSZWdyZXNzaW9uVGVzdHMsICJDaGVjayIpCiAgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgocmVncmVzc2lvbl9zdWl0ZSwpKQpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC90cmFuc2FjdGlvbnMucHkgYi9MaWIvc3FsaXRlMy90ZXN0L3RyYW5zYWN0aW9ucy5weQppbmRleCAxZjBiMTlhLi4xNGNhZTI1IDEwMDY0NAotLS0gYS9MaWIvc3FsaXRlMy90ZXN0L3RyYW5zYWN0aW9ucy5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L3RyYW5zYWN0aW9ucy5weQpAQCAtMSw3ICsxLDcgQEAKICMtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQogIyBweXNxbGl0ZTIvdGVzdC90cmFuc2FjdGlvbnMucHk6IHRlc3RzIHRyYW5zYWN0aW9ucwogIwotIyBDb3B5cmlnaHQgKEMpIDIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorIyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogIwpAQCAtMjEsNiArMjEsNyBAQAogIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAjIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCiAKK2ltcG9ydCBzeXMKIGltcG9ydCBvcywgdW5pdHRlc3QKIGltcG9ydCBzcWxpdGUzIGFzIHNxbGl0ZQogCkBAIC0xMTksNiArMTIwLDIzIEBACiAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQogCisgICAgZGVmIENoZWNrTG9ja2luZyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFRoaXMgdGVzdHMgdGhlIGltcHJvdmVkIGNvbmN1cnJlbmN5IHdpdGggcHlzcWxpdGUgMi4zLjQuIFlvdSBuZWVkZWQKKyAgICAgICAgdG8gcm9sbCBiYWNrIGNvbjIgYmVmb3JlIHlvdSBjb3VsZCBjb21taXQgY29uMS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1cjIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorICAgICAgICAjIE5PIHNlbGYuY29uMi5yb2xsYmFjaygpIEhFUkUhISEKKyAgICAgICAgc2VsZi5jb24xLmNvbW1pdCgpCisKIGNsYXNzIFNwZWNpYWxDb21tYW5kVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC90eXBlcy5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvdHlwZXMucHkKaW5kZXggM2NjOWFmZi4uMTk3MDQwMSAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC90eXBlcy5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L3R5cGVzLnB5CkBAIC0xLDcgKzEsNyBAQAogIy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCiAjIHB5c3FsaXRlMi90ZXN0L3R5cGVzLnB5OiB0ZXN0cyBmb3IgdHlwZSBjb252ZXJzaW9uIGFuZCBkZXRlY3Rpb24KICMKLSMgQ29weXJpZ2h0IChDKSAyMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KICMKQEAgLTIxLDcgKzIxLDcgQEAKICMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgogIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgogCi1pbXBvcnQgYnoyLCBkYXRldGltZQoraW1wb3J0IHpsaWIsIGRhdGV0aW1lCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBzcWxpdGUzIGFzIHNxbGl0ZQogCkBAIC0yODcsNyArMjg3LDcgQEAKIAogY2xhc3MgQmluYXJ5Q29udmVydGVyVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBjb252ZXJ0KHMpOgotICAgICAgICByZXR1cm4gYnoyLmRlY29tcHJlc3MocykKKyAgICAgICAgcmV0dXJuIHpsaWIuZGVjb21wcmVzcyhzKQogICAgIGNvbnZlcnQgPSBzdGF0aWNtZXRob2QoY29udmVydCkKIAogICAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTI5OSw3ICsyOTksNyBAQAogCiAgICAgZGVmIENoZWNrQmluYXJ5SW5wdXRGb3JDb252ZXJ0ZXIoc2VsZik6CiAgICAgICAgIHRlc3RkYXRhID0gImFiY2RlZmciICogMTAKLSAgICAgICAgcmVzdWx0ID0gc2VsZi5jb24uZXhlY3V0ZSgnc2VsZWN0ID8gYXMgInggW2Jpbl0iJywgKGJ1ZmZlcihiejIuY29tcHJlc3ModGVzdGRhdGEpKSwpKS5mZXRjaG9uZSgpWzBdCisgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uLmV4ZWN1dGUoJ3NlbGVjdCA/IGFzICJ4IFtiaW5dIicsIChidWZmZXIoemxpYi5jb21wcmVzcyh0ZXN0ZGF0YSkpLCkpLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodGVzdGRhdGEsIHJlc3VsdCkKIAogY2xhc3MgRGF0ZVRpbWVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC0zMzEsNyArMzMxLDggQEAKICAgICAgICAgaWYgc3FsaXRlLnNxbGl0ZV92ZXJzaW9uX2luZm8gPCAoMywgMSk6CiAgICAgICAgICAgICByZXR1cm4KIAotICAgICAgICBub3cgPSBkYXRldGltZS5kYXRldGltZS51dGNub3coKQorICAgICAgICAjIFNRTGl0ZSdzIGN1cnJlbnRfdGltZXN0YW1wIHVzZXMgVVRDIHRpbWUsIHdoaWxlIGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpIHVzZXMgbG9jYWwgdGltZS4KKyAgICAgICAgbm93ID0gZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh0cykgdmFsdWVzIChjdXJyZW50X3RpbWVzdGFtcCkiKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgdHMgZnJvbSB0ZXN0IikKICAgICAgICAgdHMgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NxbGl0ZS5weSBiL0xpYi90ZXN0L3Rlc3Rfc3FsaXRlLnB5CmluZGV4IGMxNTIzZTEuLjM1NjZmMzEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3FsaXRlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3FsaXRlLnB5CkBAIC00LDEzICs0LDEzIEBACiAgICAgaW1wb3J0IF9zcWxpdGUzCiBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgcmFpc2UgVGVzdFNraXBwZWQoJ25vIHNxbGl0ZSBhdmFpbGFibGUnKQotZnJvbSBzcWxpdGUzLnRlc3QgaW1wb3J0IChkYmFwaSwgdHlwZXMsIHVzZXJmdW5jdGlvbnMsCitmcm9tIHNxbGl0ZTMudGVzdCBpbXBvcnQgKGRiYXBpLCB0eXBlcywgdXNlcmZ1bmN0aW9ucywgcHkyNXRlc3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LCB0cmFuc2FjdGlvbnMsIGhvb2tzLCByZWdyZXNzaW9uKQogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgcnVuX3VuaXR0ZXN0KGRiYXBpLnN1aXRlKCksIHR5cGVzLnN1aXRlKCksIHVzZXJmdW5jdGlvbnMuc3VpdGUoKSwKLSAgICAgICAgICAgICAgICAgZmFjdG9yeS5zdWl0ZSgpLCB0cmFuc2FjdGlvbnMuc3VpdGUoKSwgaG9va3Muc3VpdGUoKSwKLSAgICAgICAgICAgICAgICAgcmVncmVzc2lvbi5zdWl0ZSgpKQorICAgICAgICAgICAgICAgICBweTI1dGVzdHMuc3VpdGUoKSwgZmFjdG9yeS5zdWl0ZSgpLCB0cmFuc2FjdGlvbnMuc3VpdGUoKSwKKyAgICAgICAgICAgICAgICAgaG9va3Muc3VpdGUoKSwgcmVncmVzc2lvbi5zdWl0ZSgpKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5jIGIvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYwppbmRleCBmNjU3NDhhLi4xY2UyNzVjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5jCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMKQEAgLTEsNiArMSw2IEBACiAvKiBjb25uZWN0aW9uLmMgLSB0aGUgY29ubmVjdGlvbiB0eXBlCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogICogCkBAIC0zMiw2ICszMiw5IEBACiAKICNpbmNsdWRlICJweXRocmVhZC5oIgogCisjZGVmaW5lIEFDVElPTl9GSU5BTElaRSAxCisjZGVmaW5lIEFDVElPTl9SRVNFVCAyCisKIHN0YXRpYyBpbnQgcHlzcWxpdGVfY29ubmVjdGlvbl9zZXRfaXNvbGF0aW9uX2xldmVsKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBpc29sYXRpb25fbGV2ZWwpOwogCiAKQEAgLTUxLDcgKzU0LDcgQEAKIHsKICAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImRhdGFiYXNlIiwgInRpbWVvdXQiLCAiZGV0ZWN0X3R5cGVzIiwgImlzb2xhdGlvbl9sZXZlbCIsICJjaGVja19zYW1lX3RocmVhZCIsICJmYWN0b3J5IiwgImNhY2hlZF9zdGF0ZW1lbnRzIiwgTlVMTCwgTlVMTH07CiAKLSAgICBjaGFyKiBkYXRhYmFzZTsKKyAgICBQeU9iamVjdCogZGF0YWJhc2U7CiAgICAgaW50IGRldGVjdF90eXBlcyA9IDA7CiAgICAgUHlPYmplY3QqIGlzb2xhdGlvbl9sZXZlbCA9IE5VTEw7CiAgICAgUHlPYmplY3QqIGZhY3RvcnkgPSBOVUxMOwpAQCAtNTksMTEgKzYyLDE1IEBACiAgICAgaW50IGNhY2hlZF9zdGF0ZW1lbnRzID0gMTAwOwogICAgIGRvdWJsZSB0aW1lb3V0ID0gNS4wOwogICAgIGludCByYzsKKyAgICBQeU9iamVjdCogY2xhc3NfYXR0ciA9IE5VTEw7CisgICAgUHlPYmplY3QqIGNsYXNzX2F0dHJfc3RyID0gTlVMTDsKKyAgICBpbnQgaXNfYXBzd19jb25uZWN0aW9uID0gMDsKKyAgICBQeU9iamVjdCogZGF0YWJhc2VfdXRmODsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInN8ZGlPaU9pIiwga3dsaXN0LAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98ZGlPaU9pIiwga3dsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhYmFzZSwgJnRpbWVvdXQsICZkZXRlY3RfdHlwZXMsICZpc29sYXRpb25fbGV2ZWwsICZjaGVja19zYW1lX3RocmVhZCwgJmZhY3RvcnksICZjYWNoZWRfc3RhdGVtZW50cykpCiAgICAgewotICAgICAgICByZXR1cm4gLTE7IAorICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCiAgICAgc2VsZi0+YmVnaW5fc3RhdGVtZW50ID0gTlVMTDsKQEAgLTc3LDEzICs4NCw1MyBAQAogICAgIFB5X0lOQ1JFRigmUHlVbmljb2RlX1R5cGUpOwogICAgIHNlbGYtPnRleHRfZmFjdG9yeSA9IChQeU9iamVjdCopJlB5VW5pY29kZV9UeXBlOwogCi0gICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgIHJjID0gc3FsaXRlM19vcGVuKGRhdGFiYXNlLCAmc2VsZi0+ZGIpOwotICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGRhdGFiYXNlKSB8fCBQeVVuaWNvZGVfQ2hlY2soZGF0YWJhc2UpKSB7CisgICAgICAgIGlmIChQeVN0cmluZ19DaGVjayhkYXRhYmFzZSkpIHsKKyAgICAgICAgICAgIGRhdGFiYXNlX3V0ZjggPSBkYXRhYmFzZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihkYXRhYmFzZV91dGY4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGFiYXNlX3V0ZjggPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKGRhdGFiYXNlKTsKKyAgICAgICAgICAgIGlmICghZGF0YWJhc2VfdXRmOCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0gICAgaWYgKHJjICE9IFNRTElURV9PSykgewotICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIpOwotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmMgPSBzcWxpdGUzX29wZW4oUHlTdHJpbmdfQXNTdHJpbmcoZGF0YWJhc2VfdXRmOCksICZzZWxmLT5kYik7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyAgICAgICAgUHlfREVDUkVGKGRhdGFiYXNlX3V0ZjgpOworCisgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgTlVMTCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBDcmVhdGUgYSBweXNxbGl0ZSBjb25uZWN0aW9uIGZyb20gYSBBUFNXIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgY2xhc3NfYXR0ciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZGF0YWJhc2UsICJfX2NsYXNzX18iKTsKKyAgICAgICAgaWYgKGNsYXNzX2F0dHIpIHsKKyAgICAgICAgICAgIGNsYXNzX2F0dHJfc3RyID0gUHlPYmplY3RfU3RyKGNsYXNzX2F0dHIpOworICAgICAgICAgICAgaWYgKGNsYXNzX2F0dHJfc3RyKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChQeVN0cmluZ19Bc1N0cmluZyhjbGFzc19hdHRyX3N0ciksICI8dHlwZSAnYXBzdy5Db25uZWN0aW9uJz4iKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIEluIHRoZSBBUFNXIENvbm5lY3Rpb24gb2JqZWN0LCB0aGUgZmlyc3QgZW50cnkgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICogUHlPYmplY3RfSEVBRCBpcyB0aGUgc3FsaXRlMyogd2Ugd2FudCB0byBnZXQgaG9sZCBvZi4KKyAgICAgICAgICAgICAgICAgICAgICogTHVja2lseSwgdGhpcyBpcyB0aGUgc2FtZSBsYXlvdXQgYXMgd2UgaGF2ZSBpbiBvdXIKKyAgICAgICAgICAgICAgICAgICAgICogcHlzcWxpdGVfQ29ubmVjdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBzZWxmLT5kYiA9ICgocHlzcWxpdGVfQ29ubmVjdGlvbiopZGF0YWJhc2UpLT5kYjsKKworICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZGF0YWJhc2UpOworICAgICAgICAgICAgICAgICAgICBzZWxmLT5hcHN3X2Nvbm5lY3Rpb24gPSBkYXRhYmFzZTsKKyAgICAgICAgICAgICAgICAgICAgaXNfYXBzd19jb25uZWN0aW9uID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUHlfWERFQ1JFRihjbGFzc19hdHRyX3N0cik7CisgICAgICAgIFB5X1hERUNSRUYoY2xhc3NfYXR0cik7CisKKyAgICAgICAgaWYgKCFpc19hcHN3X2Nvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZGF0YWJhc2UgcGFyYW1ldGVyIG11c3QgYmUgc3RyaW5nIG9yIEFQU1cgQ29ubmVjdGlvbiBvYmplY3QiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmICghaXNvbGF0aW9uX2xldmVsKSB7CkBAIC0xNjksNyArMjE2LDggQEAKICAgICBzZWxmLT5zdGF0ZW1lbnRfY2FjaGUtPmRlY3JlZl9mYWN0b3J5ID0gMDsKIH0KIAotdm9pZCBweXNxbGl0ZV9yZXNldF9hbGxfc3RhdGVtZW50cyhweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmKQorLyogYWN0aW9uIGluIChBQ1RJT05fUkVTRVQsIEFDVElPTl9GSU5BTElaRSkgKi8KK3ZvaWQgcHlzcWxpdGVfZG9fYWxsX3N0YXRlbWVudHMocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgaW50IGFjdGlvbikKIHsKICAgICBpbnQgaTsKICAgICBQeU9iamVjdCogd2Vha3JlZjsKQEAgLTE3OSwxMyArMjI3LDE5IEBACiAgICAgICAgIHdlYWtyZWYgPSBQeUxpc3RfR2V0SXRlbShzZWxmLT5zdGF0ZW1lbnRzLCBpKTsKICAgICAgICAgc3RhdGVtZW50ID0gUHlXZWFrcmVmX0dldE9iamVjdCh3ZWFrcmVmKTsKICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBQeV9Ob25lKSB7Ci0gICAgICAgICAgICAodm9pZClweXNxbGl0ZV9zdGF0ZW1lbnRfcmVzZXQoKHB5c3FsaXRlX1N0YXRlbWVudCopc3RhdGVtZW50KTsKKyAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gQUNUSU9OX1JFU0VUKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpcHlzcWxpdGVfc3RhdGVtZW50X3Jlc2V0KChweXNxbGl0ZV9TdGF0ZW1lbnQqKXN0YXRlbWVudCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICh2b2lkKXB5c3FsaXRlX3N0YXRlbWVudF9maW5hbGl6ZSgocHlzcWxpdGVfU3RhdGVtZW50KilzdGF0ZW1lbnQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCiB2b2lkIHB5c3FsaXRlX2Nvbm5lY3Rpb25fZGVhbGxvYyhweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmKQogeworICAgIFB5T2JqZWN0KiByZXQgPSBOVUxMOworCiAgICAgUHlfWERFQ1JFRihzZWxmLT5zdGF0ZW1lbnRfY2FjaGUpOwogCiAgICAgLyogQ2xlYW4gdXAgaWYgdXNlciBoYXMgbm90IGNhbGxlZCAuY2xvc2UoKSBleHBsaWNpdGx5LiAqLwpAQCAtMTkzLDYgKzI0NywxMCBAQAogICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgIHNxbGl0ZTNfY2xvc2Uoc2VsZi0+ZGIpOwogICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0gZWxzZSBpZiAoc2VsZi0+YXBzd19jb25uZWN0aW9uKSB7CisgICAgICAgIHJldCA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VsZi0+YXBzd19jb25uZWN0aW9uLCAiY2xvc2UiLCAiIik7CisgICAgICAgIFB5X1hERUNSRUYocmV0KTsKKyAgICAgICAgUHlfWERFQ1JFRihzZWxmLT5hcHN3X2Nvbm5lY3Rpb24pOwogICAgIH0KIAogICAgIGlmIChzZWxmLT5iZWdpbl9zdGF0ZW1lbnQpIHsKQEAgLTIwNSw3ICsyNjMsNyBAQAogICAgIFB5X1hERUNSRUYoc2VsZi0+Y29sbGF0aW9ucyk7CiAgICAgUHlfWERFQ1JFRihzZWxmLT5zdGF0ZW1lbnRzKTsKIAotICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7CiB9CiAKIFB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2N1cnNvcihweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKQEAgLTI0MSwyNCArMjk5LDMzIEBACiAKIFB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2Nsb3NlKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogeworICAgIFB5T2JqZWN0KiByZXQ7CiAgICAgaW50IHJjOwogCiAgICAgaWYgKCFweXNxbGl0ZV9jaGVja190aHJlYWQoc2VsZikpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgcHlzcWxpdGVfZmx1c2hfc3RhdGVtZW50X2NhY2hlKHNlbGYpOworICAgIHB5c3FsaXRlX2RvX2FsbF9zdGF0ZW1lbnRzKHNlbGYsIEFDVElPTl9GSU5BTElaRSk7CiAKICAgICBpZiAoc2VsZi0+ZGIpIHsKLSAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgICAgICByYyA9IHNxbGl0ZTNfY2xvc2Uoc2VsZi0+ZGIpOwotICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwotCi0gICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKLSAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNlbGYtPmFwc3dfY29ubmVjdGlvbikgeworICAgICAgICAgICAgcmV0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzZWxmLT5hcHN3X2Nvbm5lY3Rpb24sICJjbG9zZSIsICIiKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYocmV0KTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+YXBzd19jb25uZWN0aW9uKTsKKyAgICAgICAgICAgIHNlbGYtPmFwc3dfY29ubmVjdGlvbiA9IE5VTEw7CiAgICAgICAgICAgICBzZWxmLT5kYiA9IE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgICAgICByYyA9IHNxbGl0ZTNfY2xvc2Uoc2VsZi0+ZGIpOworICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworICAgICAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbGYtPmRiID0gTlVMTDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMjkyLDcgKzM1OSw3IEBACiAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAogICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKLSAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiKTsKKyAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBzdGF0ZW1lbnQpOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIApAQCAtMzAwLDcgKzM2Nyw3IEBACiAgICAgaWYgKHJjID09IFNRTElURV9ET05FKSB7CiAgICAgICAgIHNlbGYtPmluVHJhbnNhY3Rpb24gPSAxOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgc3RhdGVtZW50KTsKICAgICB9CiAKICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCkBAIC0zMDgsNyArMzc1LDcgQEAKICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCiAgICAgaWYgKHJjICE9IFNRTElURV9PSyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIE5VTEwpOwogICAgIH0KIAogZXJyb3I6CkBAIC0zMzUsNyArNDAyLDcgQEAKICAgICAgICAgcmMgPSBzcWxpdGUzX3ByZXBhcmUoc2VsZi0+ZGIsICJDT01NSVQiLCAtMSwgJnN0YXRlbWVudCwgJnRhaWwpOwogICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7Ci0gICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBOVUxMKTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KIApAQCAtMzQzLDE0ICs0MTAsMTQgQEAKICAgICAgICAgaWYgKHJjID09IFNRTElURV9ET05FKSB7CiAgICAgICAgICAgICBzZWxmLT5pblRyYW5zYWN0aW9uID0gMDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIHN0YXRlbWVudCk7CiAgICAgICAgIH0KIAogICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgIHJjID0gc3FsaXRlM19maW5hbGl6ZShzdGF0ZW1lbnQpOwogICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LICYmICFQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBOVUxMKTsKICAgICAgICAgfQogCiAgICAgfQpAQCAtMzc1LDEzICs0NDIsMTMgQEAKICAgICB9CiAKICAgICBpZiAoc2VsZi0+aW5UcmFuc2FjdGlvbikgewotICAgICAgICBweXNxbGl0ZV9yZXNldF9hbGxfc3RhdGVtZW50cyhzZWxmKTsKKyAgICAgICAgcHlzcWxpdGVfZG9fYWxsX3N0YXRlbWVudHMoc2VsZiwgQUNUSU9OX1JFU0VUKTsKIAogICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgIHJjID0gc3FsaXRlM19wcmVwYXJlKHNlbGYtPmRiLCAiUk9MTEJBQ0siLCAtMSwgJnN0YXRlbWVudCwgJnRhaWwpOwogICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7Ci0gICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBOVUxMKTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KIApAQCAtMzg5LDE0ICs0NTYsMTQgQEAKICAgICAgICAgaWYgKHJjID09IFNRTElURV9ET05FKSB7CiAgICAgICAgICAgICBzZWxmLT5pblRyYW5zYWN0aW9uID0gMDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIHN0YXRlbWVudCk7CiAgICAgICAgIH0KIAogICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgIHJjID0gc3FsaXRlM19maW5hbGl6ZShzdGF0ZW1lbnQpOwogICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LICYmICFQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBOVUxMKTsKICAgICAgICAgfQogCiAgICAgfQpAQCAtNzYyLDYgKzgyOSwzMyBAQAogICAgIHJldHVybiByYzsKIH0KIAorc3RhdGljIGludCBfcHJvZ3Jlc3NfaGFuZGxlcih2b2lkKiB1c2VyX2FyZykKK3sKKyAgICBpbnQgcmM7CisgICAgUHlPYmplY3QgKnJldDsKKyAgICBQeUdJTFN0YXRlX1NUQVRFIGdpbHN0YXRlOworCisgICAgZ2lsc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOworICAgIHJldCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QqKXVzZXJfYXJnLCAiIik7CisKKyAgICBpZiAoIXJldCkgeworICAgICAgICBpZiAoX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKSB7CisgICAgICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGFib3J0IHF1ZXJ5IGlmIGVycm9yIG9jY3VyZWQgKi8KKyAgICAgICAgcmMgPSAxOyAKKyAgICB9IGVsc2UgeworICAgICAgICByYyA9IChpbnQpUHlPYmplY3RfSXNUcnVlKHJldCk7CisgICAgfQorCisgICAgUHlfREVDUkVGKHJldCk7CisgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbHN0YXRlKTsKKyAgICByZXR1cm4gcmM7Cit9CisKIFB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX3NldF9hdXRob3JpemVyKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQogewogICAgIFB5T2JqZWN0KiBhdXRob3JpemVyX2NiOwpAQCAtNzg3LDYgKzg4MSwzMCBAQAogICAgIH0KIH0KIAorUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0X3Byb2dyZXNzX2hhbmRsZXIocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgUHlPYmplY3QqIHByb2dyZXNzX2hhbmRsZXI7CisgICAgaW50IG47CisKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ICJwcm9ncmVzc19oYW5kbGVyIiwgIm4iLCBOVUxMIH07CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPaTpzZXRfcHJvZ3Jlc3NfaGFuZGxlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJnByb2dyZXNzX2hhbmRsZXIsICZuKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAocHJvZ3Jlc3NfaGFuZGxlciA9PSBQeV9Ob25lKSB7CisgICAgICAgIC8qIE5vbmUgY2xlYXJzIHRoZSBwcm9ncmVzcyBoYW5kbGVyIHByZXZpb3VzbHkgc2V0ICovCisgICAgICAgIHNxbGl0ZTNfcHJvZ3Jlc3NfaGFuZGxlcihzZWxmLT5kYiwgMCwgMCwgKHZvaWQqKTApOworICAgIH0gZWxzZSB7CisgICAgICAgIHNxbGl0ZTNfcHJvZ3Jlc3NfaGFuZGxlcihzZWxmLT5kYiwgbiwgX3Byb2dyZXNzX2hhbmRsZXIsIHByb2dyZXNzX2hhbmRsZXIpOworICAgICAgICBQeURpY3RfU2V0SXRlbShzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCwgcHJvZ3Jlc3NfaGFuZGxlciwgUHlfTm9uZSk7CisgICAgfQorCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCiBpbnQgcHlzcWxpdGVfY2hlY2tfdGhyZWFkKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYpCiB7CiAgICAgaWYgKHNlbGYtPmNoZWNrX3NhbWVfdGhyZWFkKSB7CkBAIC04OTIsNyArMTAxMCw4IEBACiAgICAgICAgIH0gZWxzZSBpZiAocmMgPT0gUFlTUUxJVEVfU1FMX1dST05HX1RZUEUpIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9XYXJuaW5nLCAiU1FMIGlzIG9mIHdyb25nIHR5cGUuIE11c3QgYmUgc3RyaW5nIG9yIHVuaWNvZGUuIik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgICAgICAgICAgKHZvaWQpcHlzcWxpdGVfc3RhdGVtZW50X3Jlc2V0KHN0YXRlbWVudCk7CisgICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIE5VTEwpOwogICAgICAgICB9CiAKICAgICAgICAgUHlfREVDUkVGKHN0YXRlbWVudCk7CkBAIC0xMTM0LDcgKzEyNTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYWxsYWJsZSAhPSBQeV9Ob25lKSA/IHB5c3FsaXRlX2NvbGxhdGlvbl9jYWxsYmFjayA6IE5VTEwpOwogICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKICAgICAgICAgUHlEaWN0X0RlbEl0ZW0oc2VsZi0+Y29sbGF0aW9ucywgdXBwZXJjYXNlX25hbWUpOwotICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIE5VTEwpOwogICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICAgfQogCkBAIC0xMTUxLDYgKzEyNzAsNDQgQEAKICAgICByZXR1cm4gcmV0dmFsOwogfQogCisvKiBDYWxsZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyB1c2VkIGFzIGEgY29udGV4dCBtYW5hZ2VyLiBSZXR1cm5zIGl0c2VsZiBhcyBhCisgKiBjb252ZW5pZW5jZSB0byB0aGUgY2FsbGVyLiAqLworc3RhdGljIFB5T2JqZWN0ICoKK3B5c3FsaXRlX2Nvbm5lY3Rpb25fZW50ZXIocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHJldHVybiAoUHlPYmplY3QqKXNlbGY7Cit9CisKKy8qKiBDYWxsZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyB1c2VkIGFzIGEgY29udGV4dCBtYW5hZ2VyLiBJZiB0aGVyZSB3YXMgYW55CisgKiBleGNlcHRpb24sIGEgcm9sbGJhY2sgdGFrZXMgcGxhY2U7IG90aGVyd2lzZSB3ZSBjb21taXQuICovCitzdGF0aWMgUHlPYmplY3QgKgorcHlzcWxpdGVfY29ubmVjdGlvbl9leGl0KHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQoreworICAgIFB5T2JqZWN0KiBleGNfdHlwZSwgKmV4Y192YWx1ZSwgKmV4Y190YjsKKyAgICBjaGFyKiBtZXRob2RfbmFtZTsKKyAgICBQeU9iamVjdCogcmVzdWx0OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT08iLCAmZXhjX3R5cGUsICZleGNfdmFsdWUsICZleGNfdGIpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChleGNfdHlwZSA9PSBQeV9Ob25lICYmIGV4Y192YWx1ZSA9PSBQeV9Ob25lICYmIGV4Y190YiA9PSBQeV9Ob25lKSB7CisgICAgICAgIG1ldGhvZF9uYW1lID0gImNvbW1pdCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWV0aG9kX25hbWUgPSAicm9sbGJhY2siOworICAgIH0KKworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0KilzZWxmLCBtZXRob2RfbmFtZSwgIiIpOworICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKworICAgIFB5X0lOQ1JFRihQeV9GYWxzZSk7CisgICAgcmV0dXJuIFB5X0ZhbHNlOworfQorCiBzdGF0aWMgY2hhciBjb25uZWN0aW9uX2RvY1tdID0KIFB5RG9jX1NUUigiU1FMaXRlIGRhdGFiYXNlIGNvbm5lY3Rpb24gb2JqZWN0LiIpOwogCkBAIC0xMTc1LDYgKzEzMzIsOCBAQAogICAgICAgICBQeURvY19TVFIoIkNyZWF0ZXMgYSBuZXcgYWdncmVnYXRlLiBOb24tc3RhbmRhcmQuIil9LAogICAgIHsic2V0X2F1dGhvcml6ZXIiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9zZXRfYXV0aG9yaXplciwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCiAgICAgICAgIFB5RG9jX1NUUigiU2V0cyBhdXRob3JpemVyIGNhbGxiYWNrLiBOb24tc3RhbmRhcmQuIil9LAorICAgIHsic2V0X3Byb2dyZXNzX2hhbmRsZXIiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9zZXRfcHJvZ3Jlc3NfaGFuZGxlciwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCisgICAgICAgIFB5RG9jX1NUUigiU2V0cyBwcm9ncmVzcyBoYW5kbGVyIGNhbGxiYWNrLiBOb24tc3RhbmRhcmQuIil9LAogICAgIHsiZXhlY3V0ZSIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX2V4ZWN1dGUsIE1FVEhfVkFSQVJHUywKICAgICAgICAgUHlEb2NfU1RSKCJFeGVjdXRlcyBhIFNRTCBzdGF0ZW1lbnQuIE5vbi1zdGFuZGFyZC4iKX0sCiAgICAgeyJleGVjdXRlbWFueSIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX2V4ZWN1dGVtYW55LCBNRVRIX1ZBUkFSR1MsCkBAIC0xMTg1LDYgKzEzNDQsMTAgQEAKICAgICAgICAgUHlEb2NfU1RSKCJDcmVhdGVzIGEgY29sbGF0aW9uIGZ1bmN0aW9uLiBOb24tc3RhbmRhcmQuIil9LAogICAgIHsiaW50ZXJydXB0IiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25faW50ZXJydXB0LCBNRVRIX05PQVJHUywKICAgICAgICAgUHlEb2NfU1RSKCJBYm9ydCBhbnkgcGVuZGluZyBkYXRhYmFzZSBvcGVyYXRpb24uIE5vbi1zdGFuZGFyZC4iKX0sCisgICAgeyJfX2VudGVyX18iLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9lbnRlciwgTUVUSF9OT0FSR1MsCisgICAgICAgIFB5RG9jX1NUUigiRm9yIGNvbnRleHQgbWFuYWdlci4gTm9uLXN0YW5kYXJkLiIpfSwKKyAgICB7Il9fZXhpdF9fIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fZXhpdCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoIkZvciBjb250ZXh0IG1hbmFnZXIuIE5vbi1zdGFuZGFyZC4iKX0sCiAgICAge05VTEwsIE5VTEx9CiB9OwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5oIGIvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uaAppbmRleCAyMWZjZDJhLi4zYjFjNjMyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5oCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmgKQEAgLTEsNiArMSw2IEBACiAvKiBjb25uZWN0aW9uLmggLSBkZWZpbml0aW9ucyBmb3IgdGhlIGNvbm5lY3Rpb24gdHlwZQogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KICAqCkBAIC05NSw2ICs5NSwxMSBAQAogICAgIC8qIGEgZGljdGlvbmFyeSBvZiByZWdpc3RlcmVkIGNvbGxhdGlvbiBuYW1lID0+IGNvbGxhdGlvbiBjYWxsYWJsZSBtYXBwaW5ncyAqLwogICAgIFB5T2JqZWN0KiBjb2xsYXRpb25zOwogCisgICAgLyogaWYgb3VyIGNvbm5lY3Rpb24gd2FzIGNyZWF0ZWQgZnJvbSBhIEFQU1cgY29ubmVjdGlvbiwgd2Uga2VlcCBhCisgICAgICogcmVmZXJlbmNlIHRvIHRoZSBBUFNXIGNvbm5lY3Rpb24gYXJvdW5kIGFuZCBnZXQgcmlkIG9mIGl0IGluIG91cgorICAgICAqIGRlc3RydWN0b3IgKi8KKyAgICBQeU9iamVjdCogYXBzd19jb25uZWN0aW9uOworCiAgICAgLyogRXhjZXB0aW9uIG9iamVjdHMgKi8KICAgICBQeU9iamVjdCogV2FybmluZzsKICAgICBQeU9iamVjdCogRXJyb3I7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMgYi9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMKaW5kZXggODc1ZDU1Yi4uNTY2ZTRmZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuYwpAQCAtMSw2ICsxLDYgQEAKIC8qIGN1cnNvci5jIC0gdGhlIGN1cnNvciB0eXBlCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogICoKQEAgLTgwLDcgKzgwLDcgQEAKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmcHlzcWxpdGVfQ29ubmVjdGlvblR5cGUsICZjb25uZWN0aW9uKSkKICAgICB7Ci0gICAgICAgIHJldHVybiAtMTsgCisgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICBQeV9JTkNSRUYoY29ubmVjdGlvbik7CkBAIC00MzUsNyArNDM1LDcgQEAKICAgICBpZiAobXVsdGlwbGUpIHsKICAgICAgICAgLyogZXhlY3V0ZW1hbnkoKSAqLwogICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PIiwgJm9wZXJhdGlvbiwgJnNlY29uZF9hcmd1bWVudCkpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOyAKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhvcGVyYXRpb24pICYmICFQeVVuaWNvZGVfQ2hlY2sob3BlcmF0aW9uKSkgewpAQCAtNDU3LDcgKzQ1Nyw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogZXhlY3V0ZSgpICovCiAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPIiwgJm9wZXJhdGlvbiwgJnNlY29uZF9hcmd1bWVudCkpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOyAKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhvcGVyYXRpb24pICYmICFQeVVuaWNvZGVfQ2hlY2sob3BlcmF0aW9uKSkgewpAQCAtNTA2LDUzICs1MDYsMTEgQEAKICAgICAgICAgb3BlcmF0aW9uX2NzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhvcGVyYXRpb25fYnl0ZXN0cik7CiAgICAgfQogCi0gICAgLyogcmVzZXQgZGVzY3JpcHRpb24gYW5kIHJvd2NvdW50ICovCisgICAgLyogcmVzZXQgZGVzY3JpcHRpb24gKi8KICAgICBQeV9ERUNSRUYoc2VsZi0+ZGVzY3JpcHRpb24pOwogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICBzZWxmLT5kZXNjcmlwdGlvbiA9IFB5X05vbmU7CiAKLSAgICBQeV9ERUNSRUYoc2VsZi0+cm93Y291bnQpOwotICAgIHNlbGYtPnJvd2NvdW50ID0gUHlJbnRfRnJvbUxvbmcoLTFMKTsKLSAgICBpZiAoIXNlbGYtPnJvd2NvdW50KSB7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgc3RhdGVtZW50X3R5cGUgPSBkZXRlY3Rfc3RhdGVtZW50X3R5cGUob3BlcmF0aW9uX2NzdHIpOwotICAgIGlmIChzZWxmLT5jb25uZWN0aW9uLT5iZWdpbl9zdGF0ZW1lbnQpIHsKLSAgICAgICAgc3dpdGNoIChzdGF0ZW1lbnRfdHlwZSkgewotICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfVVBEQVRFOgotICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfREVMRVRFOgotICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfSU5TRVJUOgotICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfUkVQTEFDRToKLSAgICAgICAgICAgICAgICBpZiAoIXNlbGYtPmNvbm5lY3Rpb24tPmluVHJhbnNhY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX3B5c3FsaXRlX2Nvbm5lY3Rpb25fYmVnaW4oc2VsZi0+Y29ubmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVNRU5UX09USEVSOgotICAgICAgICAgICAgICAgIC8qIGl0J3MgYSBEREwgc3RhdGVtZW50IG9yIHNvbWV0aGluZyBzaW1pbGFyCi0gICAgICAgICAgICAgICAgICAgLSB3ZSBiZXR0ZXIgQ09NTUlUIGZpcnN0IHNvIGl0IHdvcmtzIGZvciBhbGwgY2FzZXMgKi8KLSAgICAgICAgICAgICAgICBpZiAoc2VsZi0+Y29ubmVjdGlvbi0+aW5UcmFuc2FjdGlvbikgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBweXNxbGl0ZV9jb25uZWN0aW9uX2NvbW1pdChzZWxmLT5jb25uZWN0aW9uLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfU0VMRUNUOgotICAgICAgICAgICAgICAgIGlmIChtdWx0aXBsZSkgewotICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfUHJvZ3JhbW1pbmdFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBjYW5ub3QgZXhlY3V0ZSBTRUxFQ1Qgc3RhdGVtZW50cyBpbiBleGVjdXRlbWFueSgpLiIpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQogICAgIGZ1bmNfYXJncyA9IFB5VHVwbGVfTmV3KDEpOwogICAgIGlmICghZnVuY19hcmdzKSB7CiAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC01OTAsNiArNTQ4LDQyIEBACiAgICAgcHlzcWxpdGVfc3RhdGVtZW50X3Jlc2V0KHNlbGYtPnN0YXRlbWVudCk7CiAgICAgcHlzcWxpdGVfc3RhdGVtZW50X21hcmtfZGlydHkoc2VsZi0+c3RhdGVtZW50KTsKIAorICAgIHN0YXRlbWVudF90eXBlID0gZGV0ZWN0X3N0YXRlbWVudF90eXBlKG9wZXJhdGlvbl9jc3RyKTsKKyAgICBpZiAoc2VsZi0+Y29ubmVjdGlvbi0+YmVnaW5fc3RhdGVtZW50KSB7CisgICAgICAgIHN3aXRjaCAoc3RhdGVtZW50X3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVNRU5UX1VQREFURToKKyAgICAgICAgICAgIGNhc2UgU1RBVEVNRU5UX0RFTEVURToKKyAgICAgICAgICAgIGNhc2UgU1RBVEVNRU5UX0lOU0VSVDoKKyAgICAgICAgICAgIGNhc2UgU1RBVEVNRU5UX1JFUExBQ0U6CisgICAgICAgICAgICAgICAgaWYgKCFzZWxmLT5jb25uZWN0aW9uLT5pblRyYW5zYWN0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9weXNxbGl0ZV9jb25uZWN0aW9uX2JlZ2luKHNlbGYtPmNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNUQVRFTUVOVF9PVEhFUjoKKyAgICAgICAgICAgICAgICAvKiBpdCdzIGEgRERMIHN0YXRlbWVudCBvciBzb21ldGhpbmcgc2ltaWxhcgorICAgICAgICAgICAgICAgICAgIC0gd2UgYmV0dGVyIENPTU1JVCBmaXJzdCBzbyBpdCB3b3JrcyBmb3IgYWxsIGNhc2VzICovCisgICAgICAgICAgICAgICAgaWYgKHNlbGYtPmNvbm5lY3Rpb24tPmluVHJhbnNhY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcHlzcWxpdGVfY29ubmVjdGlvbl9jb21taXQoc2VsZi0+Y29ubmVjdGlvbiwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVNRU5UX1NFTEVDVDoKKyAgICAgICAgICAgICAgICBpZiAobXVsdGlwbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX1Byb2dyYW1taW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3UgY2Fubm90IGV4ZWN1dGUgU0VMRUNUIHN0YXRlbWVudHMgaW4gZXhlY3V0ZW1hbnkoKS4iKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKICAgICB3aGlsZSAoMSkgewogICAgICAgICBwYXJhbWV0ZXJzID0gUHlJdGVyX05leHQocGFyYW1ldGVyc19pdGVyKTsKICAgICAgICAgaWYgKCFwYXJhbWV0ZXJzKSB7CkBAIC02MDMsMTEgKzU5Nyw2IEBACiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHB5c3FsaXRlX2J1aWxkX3Jvd19jYXN0X21hcChzZWxmKSAhPSAwKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciwgIkVycm9yIHdoaWxlIGJ1aWxkaW5nIHJvd19jYXN0X21hcCIpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotCiAgICAgICAgIC8qIEtlZXAgdHJ5aW5nIHRoZSBTUUwgc3RhdGVtZW50IHVudGlsIHRoZSBzY2hlbWEgc3RvcHMgY2hhbmdpbmcuICovCiAgICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgICAvKiBBY3R1YWxseSBleGVjdXRlIHRoZSBTUUwgc3RhdGVtZW50LiAqLwpAQCAtNjI2LDcgKzYxNSw4IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBkYXRhYmFzZSBnYXZlIHVzIGFuIGVycm9yLCBwcm9tb3RlIGl0IHRvIFB5dGhvbi4gKi8KLSAgICAgICAgICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmNvbm5lY3Rpb24tPmRiKTsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpcHlzcWxpdGVfc3RhdGVtZW50X3Jlc2V0KHNlbGYtPnN0YXRlbWVudCk7CisgICAgICAgICAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5jb25uZWN0aW9uLT5kYiwgTlVMTCk7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTYzOCwxNyArNjI4LDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5jb25uZWN0aW9uLT5kYik7CisgICAgICAgICAgICAgICAgKHZvaWQpcHlzcWxpdGVfc3RhdGVtZW50X3Jlc2V0KHNlbGYtPnN0YXRlbWVudCk7CisgICAgICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmNvbm5lY3Rpb24tPmRiLCBOVUxMKTsKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHJjID09IFNRTElURV9ST1cgfHwgKHJjID09IFNRTElURV9ET05FICYmIHN0YXRlbWVudF90eXBlID09IFNUQVRFTUVOVF9TRUxFQ1QpKSB7Ci0gICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCi0gICAgICAgICAgICBudW1jb2xzID0gc3FsaXRlM19jb2x1bW5fY291bnQoc2VsZi0+c3RhdGVtZW50LT5zdCk7Ci0gICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZiAocHlzcWxpdGVfYnVpbGRfcm93X2Nhc3RfbWFwKHNlbGYpICE9IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yLCAiRXJyb3Igd2hpbGUgYnVpbGRpbmcgcm93X2Nhc3RfbWFwIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CiAKKyAgICAgICAgaWYgKHJjID09IFNRTElURV9ST1cgfHwgKHJjID09IFNRTElURV9ET05FICYmIHN0YXRlbWVudF90eXBlID09IFNUQVRFTUVOVF9TRUxFQ1QpKSB7CiAgICAgICAgICAgICBpZiAoc2VsZi0+ZGVzY3JpcHRpb24gPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgICAgICBudW1jb2xzID0gc3FsaXRlM19jb2x1bW5fY291bnQoc2VsZi0+c3RhdGVtZW50LT5zdCk7CisgICAgICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKwogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5kZXNjcmlwdGlvbik7CiAgICAgICAgICAgICAgICAgc2VsZi0+ZGVzY3JpcHRpb24gPSBQeVR1cGxlX05ldyhudW1jb2xzKTsKICAgICAgICAgICAgICAgICBpZiAoIXNlbGYtPmRlc2NyaXB0aW9uKSB7CkBAIC02ODksMTUgKzY4NSwxMSBAQAogICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfREVMRVRFOgogICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfSU5TRVJUOgogICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfUkVQTEFDRToKLSAgICAgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgICAgICAgICAgcm93Y291bnQgKz0gKGxvbmcpc3FsaXRlM19jaGFuZ2VzKHNlbGYtPmNvbm5lY3Rpb24tPmRiKTsKLSAgICAgICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5yb3djb3VudCk7Ci0gICAgICAgICAgICAgICAgc2VsZi0+cm93Y291bnQgPSBQeUludF9Gcm9tTG9uZyhyb3djb3VudCk7CiAgICAgICAgIH0KIAogICAgICAgICBQeV9ERUNSRUYoc2VsZi0+bGFzdHJvd2lkKTsKLSAgICAgICAgaWYgKHN0YXRlbWVudF90eXBlID09IFNUQVRFTUVOVF9JTlNFUlQpIHsKKyAgICAgICAgaWYgKCFtdWx0aXBsZSAmJiBzdGF0ZW1lbnRfdHlwZSA9PSBTVEFURU1FTlRfSU5TRVJUKSB7CiAgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgICAgICBsYXN0cm93aWQgPSBzcWxpdGUzX2xhc3RfaW5zZXJ0X3Jvd2lkKHNlbGYtPmNvbm5lY3Rpb24tPmRiKTsKICAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCkBAIC03MTQsMTQgKzcwNiwyNyBAQAogICAgIH0KIAogZXJyb3I6CisgICAgLyoganVzdCB0byBiZSBzdXJlIChpbXBsaWNpdCBST0xMQkFDS3Mgd2l0aCBPTiBDT05GTElDVCBST0xMQkFDSy9PUgorICAgICAqIFJPTExCQUNLIGNvdWxkIGhhdmUgaGFwcGVuZWQgKi8KKyAgICAjaWZkZWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSCisgICAgI2lmIFNRTElURV9WRVJTSU9OX05VTUJFUiA+PSAzMDAyMDAyCisgICAgc2VsZi0+Y29ubmVjdGlvbi0+aW5UcmFuc2FjdGlvbiA9ICFzcWxpdGUzX2dldF9hdXRvY29tbWl0KHNlbGYtPmNvbm5lY3Rpb24tPmRiKTsKKyAgICAjZW5kaWYKKyAgICAjZW5kaWYKKwogICAgIFB5X1hERUNSRUYob3BlcmF0aW9uX2J5dGVzdHIpOwogICAgIFB5X1hERUNSRUYocGFyYW1ldGVycyk7CiAgICAgUHlfWERFQ1JFRihwYXJhbWV0ZXJzX2l0ZXIpOwogICAgIFB5X1hERUNSRUYocGFyYW1ldGVyc19saXN0KTsKIAogICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5yb3djb3VudCk7CisgICAgICAgIHNlbGYtPnJvd2NvdW50ID0gUHlJbnRfRnJvbUxvbmcoLTFMKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYtPnJvd2NvdW50KTsKKyAgICAgICAgc2VsZi0+cm93Y291bnQgPSBQeUludF9Gcm9tTG9uZyhyb3djb3VudCk7CisKICAgICAgICAgUHlfSU5DUkVGKHNlbGYpOwogICAgICAgICByZXR1cm4gKFB5T2JqZWN0KilzZWxmOwogICAgIH0KQEAgLTc0OCw3ICs3NTMsNyBAQAogICAgIGludCBzdGF0ZW1lbnRfY29tcGxldGVkID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyIsICZzY3JpcHRfb2JqKSkgewotICAgICAgICByZXR1cm4gTlVMTDsgCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIGlmICghcHlzcWxpdGVfY2hlY2tfdGhyZWFkKHNlbGYtPmNvbm5lY3Rpb24pIHx8ICFweXNxbGl0ZV9jaGVja19jb25uZWN0aW9uKHNlbGYtPmNvbm5lY3Rpb24pKSB7CkBAIC03ODgsNyArNzkzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdF9jc3RyKTsKICAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgewotICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmNvbm5lY3Rpb24tPmRiKTsKKyAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5jb25uZWN0aW9uLT5kYiwgTlVMTCk7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAKQEAgLTc5NiwxNyArODAxLDE4IEBACiAgICAgICAgIHJjID0gU1FMSVRFX1JPVzsKICAgICAgICAgd2hpbGUgKHJjID09IFNRTElURV9ST1cpIHsKICAgICAgICAgICAgIHJjID0gX3NxbGl0ZV9zdGVwX3dpdGhfYnVzeWhhbmRsZXIoc3RhdGVtZW50LCBzZWxmLT5jb25uZWN0aW9uKTsKKyAgICAgICAgICAgIC8qIFRPRE86IHdlIHByb2JhYmx5IG5lZWQgbW9yZSBlcnJvciBoYW5kbGluZyBoZXJlICovCiAgICAgICAgIH0KIAogICAgICAgICBpZiAocmMgIT0gU1FMSVRFX0RPTkUpIHsKICAgICAgICAgICAgICh2b2lkKXNxbGl0ZTNfZmluYWxpemUoc3RhdGVtZW50KTsKLSAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5jb25uZWN0aW9uLT5kYik7CisgICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+Y29ubmVjdGlvbi0+ZGIsIE5VTEwpOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogCiAgICAgICAgIHJjID0gc3FsaXRlM19maW5hbGl6ZShzdGF0ZW1lbnQpOwogICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7Ci0gICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+Y29ubmVjdGlvbi0+ZGIpOworICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmNvbm5lY3Rpb24tPmRiLCBOVUxMKTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KICAgICB9CkBAIC04NjQsOCArODcwLDkgQEAKICAgICBpZiAoc2VsZi0+c3RhdGVtZW50KSB7CiAgICAgICAgIHJjID0gX3NxbGl0ZV9zdGVwX3dpdGhfYnVzeWhhbmRsZXIoc2VsZi0+c3RhdGVtZW50LT5zdCwgc2VsZi0+Y29ubmVjdGlvbik7CiAgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfRE9ORSAmJiByYyAhPSBTUUxJVEVfUk9XKSB7CisgICAgICAgICAgICAodm9pZClweXNxbGl0ZV9zdGF0ZW1lbnRfcmVzZXQoc2VsZi0+c3RhdGVtZW50KTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXh0X3Jvdyk7Ci0gICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+Y29ubmVjdGlvbi0+ZGIpOworICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmNvbm5lY3Rpb24tPmRiLCBOVUxMKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKQEAgLTg5MCwxNSArODk3LDE3IEBACiAgICAgcmV0dXJuIHJvdzsKIH0KIAotUHlPYmplY3QqIHB5c3FsaXRlX2N1cnNvcl9mZXRjaG1hbnkocHlzcWxpdGVfQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncykKK1B5T2JqZWN0KiBweXNxbGl0ZV9jdXJzb3JfZmV0Y2htYW55KHB5c3FsaXRlX0N1cnNvciogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCiB7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzaXplIiwgTlVMTCwgTlVMTH07CisKICAgICBQeU9iamVjdCogcm93OwogICAgIFB5T2JqZWN0KiBsaXN0OwogICAgIGludCBtYXhyb3dzID0gc2VsZi0+YXJyYXlzaXplOwogICAgIGludCBjb3VudGVyID0gMDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGkiLCAmbWF4cm93cykpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7IAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxpOmZldGNobWFueSIsIGt3bGlzdCwgJm1heHJvd3MpKSB7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIGxpc3QgPSBQeUxpc3RfTmV3KDApOwpAQCAtOTkyLDcgKzEwMDEsNyBAQAogICAgICAgICBQeURvY19TVFIoIkV4ZWN1dGVzIGEgbXVsdGlwbGUgU1FMIHN0YXRlbWVudHMgYXQgb25jZS4gTm9uLXN0YW5kYXJkLiIpfSwKICAgICB7ImZldGNob25lIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2N1cnNvcl9mZXRjaG9uZSwgTUVUSF9OT0FSR1MsCiAgICAgICAgIFB5RG9jX1NUUigiRmV0Y2hlcyBvbmUgcm93IGZyb20gdGhlIHJlc3VsdHNldC4iKX0sCi0gICAgeyJmZXRjaG1hbnkiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY3Vyc29yX2ZldGNobWFueSwgTUVUSF9WQVJBUkdTLAorICAgIHsiZmV0Y2htYW55IiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2N1cnNvcl9mZXRjaG1hbnksIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAogICAgICAgICBQeURvY19TVFIoIkZldGNoZXMgc2V2ZXJhbCByb3dzIGZyb20gdGhlIHJlc3VsdHNldC4iKX0sCiAgICAgeyJmZXRjaGFsbCIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jdXJzb3JfZmV0Y2hhbGwsIE1FVEhfTk9BUkdTLAogICAgICAgICBQeURvY19TVFIoIkZldGNoZXMgYWxsIHJvd3MgZnJvbSB0aGUgcmVzdWx0c2V0LiIpfSwKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuaCBiL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuaAppbmRleCA1ZmNlNjRhLi5kOTE2Y2E1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmgKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5oCkBAIC0xLDYgKzEsNiBAQAogLyogY3Vyc29yLmggLSBkZWZpbml0aW9ucyBmb3IgdGhlIGN1cnNvciB0eXBlCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogICoKQEAgLTYwLDcgKzYwLDcgQEAKIFB5T2JqZWN0KiBweXNxbGl0ZV9jdXJzb3JfZ2V0aXRlcihweXNxbGl0ZV9DdXJzb3IgKnNlbGYpOwogUHlPYmplY3QqIHB5c3FsaXRlX2N1cnNvcl9pdGVybmV4dChweXNxbGl0ZV9DdXJzb3IgKnNlbGYpOwogUHlPYmplY3QqIHB5c3FsaXRlX2N1cnNvcl9mZXRjaG9uZShweXNxbGl0ZV9DdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKLVB5T2JqZWN0KiBweXNxbGl0ZV9jdXJzb3JfZmV0Y2htYW55KHB5c3FsaXRlX0N1cnNvciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworUHlPYmplY3QqIHB5c3FsaXRlX2N1cnNvcl9mZXRjaG1hbnkocHlzcWxpdGVfQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncyk7CiBQeU9iamVjdCogcHlzcWxpdGVfY3Vyc29yX2ZldGNoYWxsKHB5c3FsaXRlX0N1cnNvciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOwogUHlPYmplY3QqIHB5c3FsaXRlX25vb3AocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOwogUHlPYmplY3QqIHB5c3FsaXRlX2N1cnNvcl9jbG9zZShweXNxbGl0ZV9DdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9taWNyb3Byb3RvY29scy5oIGIvTW9kdWxlcy9fc3FsaXRlL21pY3JvcHJvdG9jb2xzLmgKaW5kZXggZDg0ZWM5My4uYzkxMWM4MSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL21pY3JvcHJvdG9jb2xzLmgKKysrIGIvTW9kdWxlcy9fc3FsaXRlL21pY3JvcHJvdG9jb2xzLmgKQEAgLTI4LDEwICsyOCw2IEBACiAKICNpbmNsdWRlIDxQeXRob24uaD4KIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCiAvKiogYWRhcHRlcnMgcmVnaXN0cnkgKiovCiAKIGV4dGVybiBQeU9iamVjdCAqcHN5Y29fYWRhcHRlcnM7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmMgYi9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmMKaW5kZXggODg0NGQ4MS4uYWY3ZWFjZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5jCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuYwpAQCAtMSwyNSArMSwyNSBAQAotICAgIC8qIG1vZHVsZS5jIC0gdGhlIG1vZHVsZSBpdHNlbGYKLSAgICAgKgotICAgICAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KLSAgICAgKgotICAgICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgotICAgICAqCi0gICAgICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgICAgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gICAgICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLSAgICAgKgotICAgICAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICAgICAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgICAgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0gICAgICoKLSAgICAgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICAgICAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCi0gICAgICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgICAgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLSAgICAgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotICAgICAqLworLyogbW9kdWxlLmMgLSB0aGUgbW9kdWxlIGl0c2VsZgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCiAKICNpbmNsdWRlICJjb25uZWN0aW9uLmgiCiAjaW5jbHVkZSAic3RhdGVtZW50LmgiCkBAIC00MSw2ICs0MSw3IEBACiAKIFB5T2JqZWN0KiBjb252ZXJ0ZXJzOwogaW50IF9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrczsKK2ludCBweXNxbGl0ZV9CYXNlVHlwZUFkYXB0ZWQ7CiAKIHN0YXRpYyBQeU9iamVjdCogbW9kdWxlX2Nvbm5lY3QoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoKICAgICAgICAga3dhcmdzKQpAQCAtNTAsNyArNTEsNyBAQAogICAgICAqIGNvbm5lY3Rpb24uYyBhbmQgbXVzdCBhbHdheXMgYmUgY29waWVkIGZyb20gdGhlcmUgLi4uICovCiAKICAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImRhdGFiYXNlIiwgInRpbWVvdXQiLCAiZGV0ZWN0X3R5cGVzIiwgImlzb2xhdGlvbl9sZXZlbCIsICJjaGVja19zYW1lX3RocmVhZCIsICJmYWN0b3J5IiwgImNhY2hlZF9zdGF0ZW1lbnRzIiwgTlVMTCwgTlVMTH07Ci0gICAgY2hhciogZGF0YWJhc2U7CisgICAgUHlPYmplY3QqIGRhdGFiYXNlOwogICAgIGludCBkZXRlY3RfdHlwZXMgPSAwOwogICAgIFB5T2JqZWN0KiBpc29sYXRpb25fbGV2ZWw7CiAgICAgUHlPYmplY3QqIGZhY3RvcnkgPSBOVUxMOwpAQCAtNjAsNyArNjEsNyBAQAogCiAgICAgUHlPYmplY3QqIHJlc3VsdDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInN8ZGlPaU9pIiwga3dsaXN0LAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98ZGlPaU9pIiwga3dsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhYmFzZSwgJnRpbWVvdXQsICZkZXRlY3RfdHlwZXMsICZpc29sYXRpb25fbGV2ZWwsICZjaGVja19zYW1lX3RocmVhZCwgJmZhY3RvcnksICZjYWNoZWRfc3RhdGVtZW50cykpCiAgICAgewogICAgICAgICByZXR1cm4gTlVMTDsgCkBAIC0xMzMsNiArMTM0LDEzIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAorICAgIC8qIGEgYmFzaWMgdHlwZSBpcyBhZGFwdGVkOyB0aGVyZSdzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIGlmIHRoYXQncyBub3QgdGhlIGNhc2UKKyAgICAgKiAoOTkgJSBvZiBhbGwgdXNhZ2VzKSAqLworICAgIGlmICh0eXBlID09ICZQeUludF9UeXBlIHx8IHR5cGUgPT0gJlB5TG9uZ19UeXBlIHx8IHR5cGUgPT0gJlB5RmxvYXRfVHlwZQorICAgICAgICAgICAgfHwgdHlwZSA9PSAmUHlTdHJpbmdfVHlwZSB8fCB0eXBlID09ICZQeVVuaWNvZGVfVHlwZSB8fCB0eXBlID09ICZQeUJ1ZmZlcl9UeXBlKSB7CisgICAgICAgIHB5c3FsaXRlX0Jhc2VUeXBlQWRhcHRlZCA9IDE7CisgICAgfQorCiAgICAgbWljcm9wcm90b2NvbHNfYWRkKHR5cGUsIChQeU9iamVjdCopJnB5c3FsaXRlX1ByZXBhcmVQcm90b2NvbFR5cGUsIGNhc3Rlcik7CiAKICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CkBAIC0zNzksNiArMzg3LDggQEAKIAogICAgIF9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcyA9IDA7CiAKKyAgICBweXNxbGl0ZV9CYXNlVHlwZUFkYXB0ZWQgPSAwOworCiAgICAgLyogT3JpZ2luYWwgY29tbWVudCBmb3JtIF9ic2RkYi5jIGluIHRoZSBQeXRob24gY29yZS4gVGhpcyBpcyBhbHNvIHN0aWxsCiAgICAgICogbmVlZGVkIG5vd2FkYXlzIGZvciBQeXRob24gMi4zLzIuNC4KICAgICAgKiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuaCBiL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuaAppbmRleCBhZGE2YjRjLi5iMTRiZTJhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmgKKysrIGIvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5oCkBAIC0xLDYgKzEsNiBAQAogLyogbW9kdWxlLmggLSBkZWZpbml0aW9ucyBmb3IgdGhlIG1vZHVsZQogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KICAqCkBAIC0yNSw3ICsyNSw3IEBACiAjZGVmaW5lIFBZU1FMSVRFX01PRFVMRV9ICiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKLSNkZWZpbmUgUFlTUUxJVEVfVkVSU0lPTiAiMi4zLjMiCisjZGVmaW5lIFBZU1FMSVRFX1ZFUlNJT04gIjIuNC4xIgogCiBleHRlcm4gUHlPYmplY3QqIHB5c3FsaXRlX0Vycm9yOwogZXh0ZXJuIFB5T2JqZWN0KiBweXNxbGl0ZV9XYXJuaW5nOwpAQCAtNTEsNiArNTEsNyBAQAogZXh0ZXJuIFB5T2JqZWN0KiBjb252ZXJ0ZXJzOwogCiBleHRlcm4gaW50IF9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrczsKK2V4dGVybiBpbnQgcHlzcWxpdGVfQmFzZVR5cGVBZGFwdGVkOwogCiAjZGVmaW5lIFBBUlNFX0RFQ0xUWVBFUyAxCiAjZGVmaW5lIFBBUlNFX0NPTE5BTUVTIDIKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9zdGF0ZW1lbnQuYyBiL01vZHVsZXMvX3NxbGl0ZS9zdGF0ZW1lbnQuYwppbmRleCA4M2MwNzkwLi41NTZlYTAxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvc3RhdGVtZW50LmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3N0YXRlbWVudC5jCkBAIC0xLDYgKzEsNiBAQAogLyogc3RhdGVtZW50LmMgLSB0aGUgc3RhdGVtZW50IHR5cGUKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiAgKgpAQCAtNDAsNiArNDAsMTYgQEAKICAgICBOT1JNQUwKIH0gcGFyc2VfcmVtYWluaW5nX3NxbF9zdGF0ZTsKIAordHlwZWRlZiBlbnVtIHsKKyAgICBUWVBFX0lOVCwKKyAgICBUWVBFX0xPTkcsCisgICAgVFlQRV9GTE9BVCwKKyAgICBUWVBFX1NUUklORywKKyAgICBUWVBFX1VOSUNPREUsCisgICAgVFlQRV9CVUZGRVIsCisgICAgVFlQRV9VTktOT1dOCit9IHBhcmFtZXRlcl90eXBlOworCiBpbnQgcHlzcWxpdGVfc3RhdGVtZW50X2NyZWF0ZShweXNxbGl0ZV9TdGF0ZW1lbnQqIHNlbGYsIHB5c3FsaXRlX0Nvbm5lY3Rpb24qIGNvbm5lY3Rpb24sIFB5T2JqZWN0KiBzcWwpCiB7CiAgICAgY29uc3QgY2hhciogdGFpbDsKQEAgLTk3LDQyICsxMDcsOTYgQEAKICAgICBjaGFyKiBzdHJpbmc7CiAgICAgUHlfc3NpemVfdCBidWZsZW47CiAgICAgUHlPYmplY3QqIHN0cmluZ3ZhbDsKKyAgICBwYXJhbWV0ZXJfdHlwZSBwYXJhbXR5cGU7CiAKICAgICBpZiAocGFyYW1ldGVyID09IFB5X05vbmUpIHsKICAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfbnVsbChzZWxmLT5zdCwgcG9zKTsKLSAgICB9IGVsc2UgaWYgKFB5SW50X0NoZWNrKHBhcmFtZXRlcikpIHsKLSAgICAgICAgbG9uZ3ZhbCA9IFB5SW50X0FzTG9uZyhwYXJhbWV0ZXIpOwotICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF9pbnQ2NChzZWxmLT5zdCwgcG9zLCAoc3FsaXRlX2ludDY0KWxvbmd2YWwpOwotI2lmZGVmIEhBVkVfTE9OR19MT05HCi0gICAgfSBlbHNlIGlmIChQeUxvbmdfQ2hlY2socGFyYW1ldGVyKSkgewotICAgICAgICBsb25nbG9uZ3ZhbCA9IFB5TG9uZ19Bc0xvbmdMb25nKHBhcmFtZXRlcik7Ci0gICAgICAgIC8qIGluIHRoZSBvdmVyZmxvdyBlcnJvciBjYXNlLCBsb25nbG9uZ3ZhbCBpcyAtMSwgYW5kIGFuIGV4Y2VwdGlvbiBpcyBzZXQgKi8KLSAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfaW50NjQoc2VsZi0+c3QsIHBvcywgKHNxbGl0ZV9pbnQ2NClsb25nbG9uZ3ZhbCk7Ci0jZW5kaWYKLSAgICB9IGVsc2UgaWYgKFB5RmxvYXRfQ2hlY2socGFyYW1ldGVyKSkgewotICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF9kb3VibGUoc2VsZi0+c3QsIHBvcywgUHlGbG9hdF9Bc0RvdWJsZShwYXJhbWV0ZXIpKTsKLSAgICB9IGVsc2UgaWYgKFB5QnVmZmVyX0NoZWNrKHBhcmFtZXRlcikpIHsKLSAgICAgICAgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihwYXJhbWV0ZXIsICZidWZmZXIsICZidWZsZW4pID09IDApIHsKLSAgICAgICAgICAgIHJjID0gc3FsaXRlM19iaW5kX2Jsb2Ioc2VsZi0+c3QsIHBvcywgYnVmZmVyLCBidWZsZW4sIFNRTElURV9UUkFOU0lFTlQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJjb3VsZCBub3QgY29udmVydCBCTE9CIHRvIGJ1ZmZlciIpOwotICAgICAgICAgICAgcmMgPSAtMTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiBQeVN0cmluZ19DaGVjayhwYXJhbWV0ZXIpIHsKLSAgICAgICAgc3RyaW5nID0gUHlTdHJpbmdfQXNTdHJpbmcocGFyYW1ldGVyKTsKLSAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfdGV4dChzZWxmLT5zdCwgcG9zLCBzdHJpbmcsIC0xLCBTUUxJVEVfVFJBTlNJRU5UKTsKLSAgICB9IGVsc2UgaWYgUHlVbmljb2RlX0NoZWNrKHBhcmFtZXRlcikgewotICAgICAgICBzdHJpbmd2YWwgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHBhcmFtZXRlcik7Ci0gICAgICAgIHN0cmluZyA9IFB5U3RyaW5nX0FzU3RyaW5nKHN0cmluZ3ZhbCk7Ci0gICAgICAgIHJjID0gc3FsaXRlM19iaW5kX3RleHQoc2VsZi0+c3QsIHBvcywgc3RyaW5nLCAtMSwgU1FMSVRFX1RSQU5TSUVOVCk7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHJpbmd2YWwpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJjID0gLTE7CisgICAgICAgIGdvdG8gZmluYWw7CiAgICAgfQogCisgICAgaWYgKFB5SW50X0NoZWNrRXhhY3QocGFyYW1ldGVyKSkgeworICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX0lOVDsKKyAgICB9IGVsc2UgaWYgKFB5TG9uZ19DaGVja0V4YWN0KHBhcmFtZXRlcikpIHsKKyAgICAgICAgcGFyYW10eXBlID0gVFlQRV9MT05HOworICAgIH0gZWxzZSBpZiAoUHlGbG9hdF9DaGVja0V4YWN0KHBhcmFtZXRlcikpIHsKKyAgICAgICAgcGFyYW10eXBlID0gVFlQRV9GTE9BVDsKKyAgICB9IGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QocGFyYW1ldGVyKSkgeworICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX1NUUklORzsKKyAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KHBhcmFtZXRlcikpIHsKKyAgICAgICAgcGFyYW10eXBlID0gVFlQRV9VTklDT0RFOworICAgIH0gZWxzZSBpZiAoUHlCdWZmZXJfQ2hlY2socGFyYW1ldGVyKSkgeworICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX0JVRkZFUjsKKyAgICB9IGVsc2UgaWYgKFB5SW50X0NoZWNrKHBhcmFtZXRlcikpIHsKKyAgICAgICAgcGFyYW10eXBlID0gVFlQRV9JTlQ7CisgICAgfSBlbHNlIGlmIChQeUxvbmdfQ2hlY2socGFyYW1ldGVyKSkgeworICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX0xPTkc7CisgICAgfSBlbHNlIGlmIChQeUZsb2F0X0NoZWNrKHBhcmFtZXRlcikpIHsKKyAgICAgICAgcGFyYW10eXBlID0gVFlQRV9GTE9BVDsKKyAgICB9IGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKHBhcmFtZXRlcikpIHsKKyAgICAgICAgcGFyYW10eXBlID0gVFlQRV9TVFJJTkc7CisgICAgfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2socGFyYW1ldGVyKSkgeworICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX1VOSUNPREU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyYW10eXBlID0gVFlQRV9VTktOT1dOOworICAgIH0KKworICAgIHN3aXRjaCAocGFyYW10eXBlKSB7CisgICAgICAgIGNhc2UgVFlQRV9JTlQ6CisgICAgICAgICAgICBsb25ndmFsID0gUHlJbnRfQXNMb25nKHBhcmFtZXRlcik7CisgICAgICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF9pbnQ2NChzZWxmLT5zdCwgcG9zLCAoc3FsaXRlX2ludDY0KWxvbmd2YWwpOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKyAgICAgICAgY2FzZSBUWVBFX0xPTkc6CisgICAgICAgICAgICBsb25nbG9uZ3ZhbCA9IFB5TG9uZ19Bc0xvbmdMb25nKHBhcmFtZXRlcik7CisgICAgICAgICAgICAvKiBpbiB0aGUgb3ZlcmZsb3cgZXJyb3IgY2FzZSwgbG9uZ2xvbmd2YWwgaXMgLTEsIGFuZCBhbiBleGNlcHRpb24gaXMgc2V0ICovCisgICAgICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF9pbnQ2NChzZWxmLT5zdCwgcG9zLCAoc3FsaXRlX2ludDY0KWxvbmdsb25ndmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIGNhc2UgVFlQRV9GTE9BVDoKKyAgICAgICAgICAgIHJjID0gc3FsaXRlM19iaW5kX2RvdWJsZShzZWxmLT5zdCwgcG9zLCBQeUZsb2F0X0FzRG91YmxlKHBhcmFtZXRlcikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFlQRV9TVFJJTkc6CisgICAgICAgICAgICBzdHJpbmcgPSBQeVN0cmluZ19BU19TVFJJTkcocGFyYW1ldGVyKTsKKyAgICAgICAgICAgIHJjID0gc3FsaXRlM19iaW5kX3RleHQoc2VsZi0+c3QsIHBvcywgc3RyaW5nLCAtMSwgU1FMSVRFX1RSQU5TSUVOVCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUWVBFX1VOSUNPREU6CisgICAgICAgICAgICBzdHJpbmd2YWwgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHBhcmFtZXRlcik7CisgICAgICAgICAgICBzdHJpbmcgPSBQeVN0cmluZ19Bc1N0cmluZyhzdHJpbmd2YWwpOworICAgICAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfdGV4dChzZWxmLT5zdCwgcG9zLCBzdHJpbmcsIC0xLCBTUUxJVEVfVFJBTlNJRU5UKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzdHJpbmd2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFlQRV9CVUZGRVI6CisgICAgICAgICAgICBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHBhcmFtZXRlciwgJmJ1ZmZlciwgJmJ1ZmxlbikgPT0gMCkgeworICAgICAgICAgICAgICAgIHJjID0gc3FsaXRlM19iaW5kX2Jsb2Ioc2VsZi0+c3QsIHBvcywgYnVmZmVyLCBidWZsZW4sIFNRTElURV9UUkFOU0lFTlQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImNvdWxkIG5vdCBjb252ZXJ0IEJMT0IgdG8gYnVmZmVyIik7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRZUEVfVU5LTk9XTjoKKyAgICAgICAgICAgIHJjID0gLTE7CisgICAgfQorCitmaW5hbDoKICAgICByZXR1cm4gcmM7CiB9CiAKKy8qIHJldHVybnMgMCBpZiB0aGUgb2JqZWN0IGlzIG9uZSBvZiBQeXRob24ncyBpbnRlcm5hbCBvbmVzIHRoYXQgZG9uJ3QgbmVlZCB0byBiZSBhZGFwdGVkICovCitzdGF0aWMgaW50IF9uZWVkX2FkYXB0KFB5T2JqZWN0KiBvYmopCit7CisgICAgaWYgKHB5c3FsaXRlX0Jhc2VUeXBlQWRhcHRlZCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoUHlJbnRfQ2hlY2tFeGFjdChvYmopIHx8IFB5TG9uZ19DaGVja0V4YWN0KG9iaikgCisgICAgICAgICAgICB8fCBQeUZsb2F0X0NoZWNrRXhhY3Qob2JqKSB8fCBQeVN0cmluZ19DaGVja0V4YWN0KG9iaikKKyAgICAgICAgICAgIHx8IFB5VW5pY29kZV9DaGVja0V4YWN0KG9iaikgfHwgUHlCdWZmZXJfQ2hlY2sob2JqKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKIHZvaWQgcHlzcWxpdGVfc3RhdGVtZW50X2JpbmRfcGFyYW1ldGVycyhweXNxbGl0ZV9TdGF0ZW1lbnQqIHNlbGYsIFB5T2JqZWN0KiBwYXJhbWV0ZXJzKQogewogICAgIFB5T2JqZWN0KiBjdXJyZW50X3BhcmFtOwpAQCAtMTQ3LDcgKzIxMSw1NSBAQAogICAgIG51bV9wYXJhbXNfbmVlZGVkID0gc3FsaXRlM19iaW5kX3BhcmFtZXRlcl9jb3VudChzZWxmLT5zdCk7CiAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotICAgIGlmIChQeURpY3RfQ2hlY2socGFyYW1ldGVycykpIHsKKyAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHBhcmFtZXRlcnMpIHx8IFB5TGlzdF9DaGVja0V4YWN0KHBhcmFtZXRlcnMpIHx8ICghUHlEaWN0X0NoZWNrKHBhcmFtZXRlcnMpICYmIFB5U2VxdWVuY2VfQ2hlY2socGFyYW1ldGVycykpKSB7CisgICAgICAgIC8qIHBhcmFtZXRlcnMgcGFzc2VkIGFzIHNlcXVlbmNlICovCisgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrRXhhY3QocGFyYW1ldGVycykpIHsKKyAgICAgICAgICAgIG51bV9wYXJhbXMgPSBQeVR1cGxlX0dFVF9TSVpFKHBhcmFtZXRlcnMpOworICAgICAgICB9IGVsc2UgaWYgKFB5TGlzdF9DaGVja0V4YWN0KHBhcmFtZXRlcnMpKSB7CisgICAgICAgICAgICBudW1fcGFyYW1zID0gUHlMaXN0X0dFVF9TSVpFKHBhcmFtZXRlcnMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtX3BhcmFtcyA9IFB5U2VxdWVuY2VfU2l6ZShwYXJhbWV0ZXJzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVtX3BhcmFtcyAhPSBudW1fcGFyYW1zX25lZWRlZCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KHB5c3FsaXRlX1Byb2dyYW1taW5nRXJyb3IsICJJbmNvcnJlY3QgbnVtYmVyIG9mIGJpbmRpbmdzIHN1cHBsaWVkLiBUaGUgY3VycmVudCBzdGF0ZW1lbnQgdXNlcyAlZCwgYW5kIHRoZXJlIGFyZSAlZCBzdXBwbGllZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wYXJhbXNfbmVlZGVkLCBudW1fcGFyYW1zKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhcmFtczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHBhcmFtZXRlcnMpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudF9wYXJhbSA9IFB5VHVwbGVfR0VUX0lURU0ocGFyYW1ldGVycywgaSk7CisgICAgICAgICAgICAgICAgUHlfWElOQ1JFRihjdXJyZW50X3BhcmFtKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoUHlMaXN0X0NoZWNrRXhhY3QocGFyYW1ldGVycykpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3BhcmFtID0gUHlMaXN0X0dFVF9JVEVNKHBhcmFtZXRlcnMsIGkpOworICAgICAgICAgICAgICAgIFB5X1hJTkNSRUYoY3VycmVudF9wYXJhbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGN1cnJlbnRfcGFyYW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0ocGFyYW1ldGVycywgaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWN1cnJlbnRfcGFyYW0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghX25lZWRfYWRhcHQoY3VycmVudF9wYXJhbSkpIHsKKyAgICAgICAgICAgICAgICBhZGFwdGVkID0gY3VycmVudF9wYXJhbTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWRhcHRlZCA9IG1pY3JvcHJvdG9jb2xzX2FkYXB0KGN1cnJlbnRfcGFyYW0sIChQeU9iamVjdCopJnB5c3FsaXRlX1ByZXBhcmVQcm90b2NvbFR5cGUsIE5VTEwpOworICAgICAgICAgICAgICAgIGlmIChhZGFwdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjdXJyZW50X3BhcmFtKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgICAgICBhZGFwdGVkID0gY3VycmVudF9wYXJhbTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJjID0gcHlzcWxpdGVfc3RhdGVtZW50X2JpbmRfcGFyYW1ldGVyKHNlbGYsIGkgKyAxLCBhZGFwdGVkKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhZGFwdGVkKTsKKworICAgICAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChweXNxbGl0ZV9JbnRlcmZhY2VFcnJvciwgIkVycm9yIGJpbmRpbmcgcGFyYW1ldGVyICVkIC0gcHJvYmFibHkgdW5zdXBwb3J0ZWQgdHlwZS4iLCBpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKFB5RGljdF9DaGVjayhwYXJhbWV0ZXJzKSkgewogICAgICAgICAvKiBwYXJhbWV0ZXJzIHBhc3NlZCBhcyBkaWN0aW9uYXJ5ICovCiAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbnVtX3BhcmFtc19uZWVkZWQ7IGkrKykgewogICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwpAQCAtMTU5LDE5ICsyNzEsMjcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYmluZGluZ19uYW1lKys7IC8qIHNraXAgZmlyc3QgY2hhciAodGhlIGNvbG9uKSAqLwotICAgICAgICAgICAgY3VycmVudF9wYXJhbSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHBhcmFtZXRlcnMsIGJpbmRpbmdfbmFtZSk7CisgICAgICAgICAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3QocGFyYW1ldGVycykpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3BhcmFtID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcocGFyYW1ldGVycywgYmluZGluZ19uYW1lKTsKKyAgICAgICAgICAgICAgICBQeV9YSU5DUkVGKGN1cnJlbnRfcGFyYW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3BhcmFtID0gUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmcocGFyYW1ldGVycywgKGNoYXIqKWJpbmRpbmdfbmFtZSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIWN1cnJlbnRfcGFyYW0pIHsKICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQocHlzcWxpdGVfUHJvZ3JhbW1pbmdFcnJvciwgIllvdSBkaWQgbm90IHN1cHBseSBhIHZhbHVlIGZvciBiaW5kaW5nICVkLiIsIGkpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgUHlfSU5DUkVGKGN1cnJlbnRfcGFyYW0pOwotICAgICAgICAgICAgYWRhcHRlZCA9IG1pY3JvcHJvdG9jb2xzX2FkYXB0KGN1cnJlbnRfcGFyYW0sIChQeU9iamVjdCopJnB5c3FsaXRlX1ByZXBhcmVQcm90b2NvbFR5cGUsIE5VTEwpOwotICAgICAgICAgICAgaWYgKGFkYXB0ZWQpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY3VycmVudF9wYXJhbSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBpZiAoIV9uZWVkX2FkYXB0KGN1cnJlbnRfcGFyYW0pKSB7CiAgICAgICAgICAgICAgICAgYWRhcHRlZCA9IGN1cnJlbnRfcGFyYW07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFkYXB0ZWQgPSBtaWNyb3Byb3RvY29sc19hZGFwdChjdXJyZW50X3BhcmFtLCAoUHlPYmplY3QqKSZweXNxbGl0ZV9QcmVwYXJlUHJvdG9jb2xUeXBlLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBpZiAoYWRhcHRlZCkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY3VycmVudF9wYXJhbSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgYWRhcHRlZCA9IGN1cnJlbnRfcGFyYW07CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByYyA9IHB5c3FsaXRlX3N0YXRlbWVudF9iaW5kX3BhcmFtZXRlcihzZWxmLCBpLCBhZGFwdGVkKTsKQEAgLTE4MywzNSArMzAzLDcgQEAKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogcGFyYW1ldGVycyBwYXNzZWQgYXMgc2VxdWVuY2UgKi8KLSAgICAgICAgbnVtX3BhcmFtcyA9IFB5U2VxdWVuY2VfTGVuZ3RoKHBhcmFtZXRlcnMpOwotICAgICAgICBpZiAobnVtX3BhcmFtcyAhPSBudW1fcGFyYW1zX25lZWRlZCkgewotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KHB5c3FsaXRlX1Byb2dyYW1taW5nRXJyb3IsICJJbmNvcnJlY3QgbnVtYmVyIG9mIGJpbmRpbmdzIHN1cHBsaWVkLiBUaGUgY3VycmVudCBzdGF0ZW1lbnQgdXNlcyAlZCwgYW5kIHRoZXJlIGFyZSAlZCBzdXBwbGllZC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wYXJhbXNfbmVlZGVkLCBudW1fcGFyYW1zKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhcmFtczsgaSsrKSB7Ci0gICAgICAgICAgICBjdXJyZW50X3BhcmFtID0gUHlTZXF1ZW5jZV9HZXRJdGVtKHBhcmFtZXRlcnMsIGkpOwotICAgICAgICAgICAgaWYgKCFjdXJyZW50X3BhcmFtKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRhcHRlZCA9IG1pY3JvcHJvdG9jb2xzX2FkYXB0KGN1cnJlbnRfcGFyYW0sIChQeU9iamVjdCopJnB5c3FsaXRlX1ByZXBhcmVQcm90b2NvbFR5cGUsIE5VTEwpOwotCi0gICAgICAgICAgICBpZiAoYWRhcHRlZCkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjdXJyZW50X3BhcmFtKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgICAgICAgICBhZGFwdGVkID0gY3VycmVudF9wYXJhbTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmMgPSBweXNxbGl0ZV9zdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXIoc2VsZiwgaSArIDEsIGFkYXB0ZWQpOwotICAgICAgICAgICAgUHlfREVDUkVGKGFkYXB0ZWQpOwotCi0gICAgICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KHB5c3FsaXRlX0ludGVyZmFjZUVycm9yLCAiRXJyb3IgYmluZGluZyBwYXJhbWV0ZXIgJWQgLSBwcm9iYWJseSB1bnN1cHBvcnRlZCB0eXBlLiIsIGkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInBhcmFtZXRlcnMgYXJlIG9mIHVuc3VwcG9ydGVkIHR5cGUiKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS91dGlsLmMgYi9Nb2R1bGVzL19zcWxpdGUvdXRpbC5jCmluZGV4IDVlNzhkNTguLmUwNmMyOTkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS91dGlsLmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3V0aWwuYwpAQCAtMSw2ICsxLDYgQEAKIC8qIHV0aWwuYyAtIHZhcmlvdXMgdXRpbGl0eSBmdW5jdGlvbnMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiAgKgpAQCAtNDUsMTAgKzQ1LDE1IEBACiAgKiBDaGVja3MgdGhlIFNRTGl0ZSBlcnJvciBjb2RlIGFuZCBzZXRzIHRoZSBhcHByb3ByaWF0ZSBEQi1BUEkgZXhjZXB0aW9uLgogICogUmV0dXJucyB0aGUgZXJyb3IgY29kZSAoMCBtZWFucyBubyBlcnJvciBvY2N1cnJlZCkuCiAgKi8KLWludCBfcHlzcWxpdGVfc2V0ZXJyb3Ioc3FsaXRlMyogZGIpCitpbnQgX3B5c3FsaXRlX3NldGVycm9yKHNxbGl0ZTMqIGRiLCBzcWxpdGUzX3N0bXQqIHN0KQogewogICAgIGludCBlcnJvcmNvZGU7CiAKKyAgICAvKiBTUUxpdGUgb2Z0ZW4gZG9lc24ndCByZXBvcnQgYW55dGhpbmcgdXNlZnVsLCB1bmxlc3MgeW91IHJlc2V0IHRoZSBzdGF0ZW1lbnQgZmlyc3QgKi8KKyAgICBpZiAoc3QgIT0gTlVMTCkgeworICAgICAgICAodm9pZClzcWxpdGUzX3Jlc2V0KHN0KTsKKyAgICB9CisKICAgICBlcnJvcmNvZGUgPSBzcWxpdGUzX2VycmNvZGUoZGIpOwogCiAgICAgc3dpdGNoIChlcnJvcmNvZGUpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvdXRpbC5oIGIvTW9kdWxlcy9fc3FsaXRlL3V0aWwuaAppbmRleCA5NjljNWU1Li42YzM0MzI5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvdXRpbC5oCisrKyBiL01vZHVsZXMvX3NxbGl0ZS91dGlsLmgKQEAgLTM0LDUgKzM0LDUgQEAKICAqIENoZWNrcyB0aGUgU1FMaXRlIGVycm9yIGNvZGUgYW5kIHNldHMgdGhlIGFwcHJvcHJpYXRlIERCLUFQSSBleGNlcHRpb24uCiAgKiBSZXR1cm5zIHRoZSBlcnJvciBjb2RlICgwIG1lYW5zIG5vIGVycm9yIG9jY3VycmVkKS4KICAqLwotaW50IF9weXNxbGl0ZV9zZXRlcnJvcihzcWxpdGUzKiBkYik7CitpbnQgX3B5c3FsaXRlX3NldGVycm9yKHNxbGl0ZTMqIGRiLCBzcWxpdGUzX3N0bXQqIHN0KTsKICNlbmRpZgo=