ZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvQ29udmVydFVURi5oIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9Db252ZXJ0VVRGLmgKaW5kZXggZWM2Yjk3My4uN2ZiNTg3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9Db252ZXJ0VVRGLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9Db252ZXJ0VVRGLmgKQEAgLTE1MSw5ICsxNTEsOSBAQAogQ29udmVyc2lvblJlc3VsdCBDb252ZXJ0VVRGMzJ0b1VURjE2ICgKICAgY29uc3QgVVRGMzIqKiBzb3VyY2VTdGFydCwgY29uc3QgVVRGMzIqIHNvdXJjZUVuZCwKICAgVVRGMTYqKiB0YXJnZXRTdGFydCwgVVRGMTYqIHRhcmdldEVuZCwgQ29udmVyc2lvbkZsYWdzIGZsYWdzKTsKKyNlbmRpZgogCiBCb29sZWFuIGlzTGVnYWxVVEY4U2VxdWVuY2UoY29uc3QgVVRGOCAqc291cmNlLCBjb25zdCBVVEY4ICpzb3VyY2VFbmQpOwotI2VuZGlmCiAKIEJvb2xlYW4gaXNMZWdhbFVURjhTdHJpbmcoY29uc3QgVVRGOCAqc291cmNlLCBjb25zdCBVVEY4ICpzb3VyY2VFbmQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL1RleHREaWFnbm9zdGljLmggYi9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL1RleHREaWFnbm9zdGljLmgKaW5kZXggNTE5ZDNiNi4uMzE0MDAzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9UZXh0RGlhZ25vc3RpYy5oCisrKyBiL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvVGV4dERpYWdub3N0aWMuaApAQCAtMTgsNiArMTgsOCBAQAogCiAjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvRGlhZ25vc3RpY1JlbmRlcmVyLmgiCiAKK3N0cnVjdCBTb3VyY2VDb2x1bW5NYXA7CisKIG5hbWVzcGFjZSBjbGFuZyB7CiAKIC8vLyBcYnJpZWYgQ2xhc3MgdG8gZW5jYXBzdWxhdGUgdGhlIGxvZ2ljIGZvciBmb3JtYXR0aW5nIGFuZCBwcmludGluZyBhIHRleHR1YWwKQEAgLTEwMywxNSArMTA1LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Q2hhclNvdXJjZVJhbmdlPiYgUmFuZ2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Rml4SXRIaW50PiBIaW50cyk7CiAKKyAgdm9pZCBlbWl0U25pcHBldChTdHJpbmdSZWYgU291cmNlTGluZSk7CisKICAgdm9pZCBoaWdobGlnaHRSYW5nZShjb25zdCBDaGFyU291cmNlUmFuZ2UgJlIsCiAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGluZU5vLCBGaWxlSUQgRklELAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZTb3VyY2VMaW5lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZUNvbHVtbk1hcCAmbWFwLAogICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZDYXJldExpbmUpOworCiAgIHN0ZDo6c3RyaW5nIGJ1aWxkRml4SXRJbnNlcnRpb25MaW5lKHVuc2lnbmVkIExpbmVObywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGluZVN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5lRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VDb2x1bW5NYXAgJm1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Rml4SXRIaW50PiBIaW50cyk7Ci0gIHZvaWQgZXhwYW5kVGFicyhzdGQ6OnN0cmluZyAmU291cmNlTGluZSwgc3RkOjpzdHJpbmcgJkNhcmV0TGluZSk7CiAgIHZvaWQgZW1pdFBhcnNlYWJsZUZpeGl0cyhBcnJheVJlZjxGaXhJdEhpbnQ+IEhpbnRzKTsKIH07CiAKZGlmZiAtLWdpdCBhL2xpYi9Gcm9udGVuZC9UZXh0RGlhZ25vc3RpYy5jcHAgYi9saWIvRnJvbnRlbmQvVGV4dERpYWdub3N0aWMuY3BwCmluZGV4IDlmNWRjYjQuLjU0YjJmMzcgMTAwNjQ0Ci0tLSBhL2xpYi9Gcm9udGVuZC9UZXh0RGlhZ25vc3RpYy5jcHAKKysrIGIvbGliL0Zyb250ZW5kL1RleHREaWFnbm9zdGljLmNwcApAQCAtMTAsMTMgKzEwLDE3IEBACiAjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvVGV4dERpYWdub3N0aWMuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9GaWxlTWFuYWdlci5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Db252ZXJ0VVRGLmgiCiAjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvRGlhZ25vc3RpY09wdGlvbnMuaCIKICNpbmNsdWRlICJjbGFuZy9MZXgvTGV4ZXIuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTG9jYWxlLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKICNpbmNsdWRlIDxhbGdvcml0aG0+CisKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIAogc3RhdGljIGNvbnN0IGVudW0gcmF3X29zdHJlYW06OkNvbG9ycyBub3RlQ29sb3IgPQpAQCAtMzYsMjMgKzQwLDI2OCBAQAogLy8vIFxicmllZiBOdW1iZXIgb2Ygc3BhY2VzIHRvIGluZGVudCB3aGVuIHdvcmQtd3JhcHBpbmcuCiBjb25zdCB1bnNpZ25lZCBXb3JkV3JhcEluZGVudGF0aW9uID0gNjsKIAoraW50IGJ5dGVzU2luY2VQcmV2aW91c1RhYk9yTGluZUJlZ2luKFN0cmluZ1JlZiBTb3VyY2VMaW5lLCBzaXplX3QgaSkgeworICBpbnQgYnl0ZXMgPSAwOworICB3aGlsZSAoMDxpKSB7CisgICAgaWYgKFNvdXJjZUxpbmVbLS1pXT09J1x0JykKKyAgICAgIGJyZWFrOworICAgICsrYnl0ZXM7CisgIH0KKyAgcmV0dXJuIGJ5dGVzOworfQorCisvLy8gXGJyaWVmIHJldHVybnMgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgZmlyc3QgaXRlbSBmcm9tIGlucHV0IHJhbmdlCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIG5leHQgaXRlbSBpbiBhIGxpbmUKKy8vLyAgb2Ygc291cmNlLiBJZiB0aGUgbmV4dCBieXRlIGJlZ2lucyBhIHZhbGlkIGFuZCBwcmludGFibGUgY2hhcmFjdGVyLCB0aGF0CisvLy8gIGNoYXJhY3RlciBpcyByZXR1cm5lZCBhbG9uZyB3aXRoICd0cnVlJy4KKy8vLworLy8vIE90aGVyd2lzZSwgaWYgdGhlIG5leHQgYnl0ZSBiZWdpbnMgYSB2YWxpZCwgYnV0IHVucHJpbnRhYmxlIGNoYXJhY3RlciwgYQorLy8vICBwcmludGFibGUsIGVzY2FwZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNoYXJhY3RlciBpcyByZXR1cm5lZCwgYWxvbmcgd2l0aAorLy8vICAnZmFsc2UnLiBPdGhlcndpc2UgYSBwcmludGFibGUsIGVzY2FwZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIG5leHQgYnl0ZQorLy8vICBpcyByZXR1cm5lZCBhbG9uZyB3aXRoICdmYWxzZScuCisvLy8KKy8vLyBcbm90ZSBUaGUgaW5kZXggaXMgdXBkYXRlZCB0byBiZSB1c2VkIHdpdGggYSBzdWJzZXF1ZW50IGNhbGwgdG8KKy8vLyAgICAgICAgcHJpbnRhYmxlVGV4dEZvck5leHRDaGFyYWN0ZXIuCisvLy8KKy8vLyBccGFyYW0gU291cmNlTGluZSBUaGUgbGluZSBvZiBzb3VyY2UKKy8vLyBccGFyYW0gaSBQb2ludGVyIHRvIGJ5dGUgaW5kZXgsCisvLy8gXHBhcmFtIFRhYlN0b3AgdXNlZCB0byBleHBhbmQgdGFicworLy8vIFxyZXR1cm4gcGFpcihwcmludGFibGUgdGV4dCwgJ3RydWUnIGlmZiBvcmlnaW5hbCB0ZXh0IHdhcyBwcmludGFibGUpCisvLy8KK3N0ZDo6cGFpcjxTbWFsbFN0cmluZzwxNj4sYm9vbD4KK3ByaW50YWJsZVRleHRGb3JOZXh0Q2hhcmFjdGVyKFN0cmluZ1JlZiBTb3VyY2VMaW5lLCBzaXplX3QgKmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUYWJTdG9wKSB7CisgIGFzc2VydChpICYmICJpIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgYXNzZXJ0KCppPFNvdXJjZUxpbmUuc2l6ZSgpICYmICJtdXN0IHBvaW50IHRvIGEgdmFsaWQgaW5kZXgiKTsKKyAgCisgIGlmIChTb3VyY2VMaW5lWyppXT09J1x0JykgeworICAgIGFzc2VydCgwIDwgVGFiU3RvcCAmJiBUYWJTdG9wIDw9IERpYWdub3N0aWNPcHRpb25zOjpNYXhUYWJTdG9wICYmCisgICAgICAgICAgICJJbnZhbGlkIC1mdGFic3RvcCB2YWx1ZSIpOworICAgIHVuc2lnbmVkIGNvbCA9IGJ5dGVzU2luY2VQcmV2aW91c1RhYk9yTGluZUJlZ2luKFNvdXJjZUxpbmUsICppKTsKKyAgICB1bnNpZ25lZCBOdW1TcGFjZXMgPSBUYWJTdG9wIC0gY29sJVRhYlN0b3A7CisgICAgYXNzZXJ0KDAgPCBOdW1TcGFjZXMgJiYgTnVtU3BhY2VzIDw9IFRhYlN0b3AKKyAgICAgICAgICAgJiYgIkludmFsaWQgY29tcHV0YXRpb24gb2Ygc3BhY2UgYW10Iik7CisgICAgKysoKmkpOworCisgICAgU21hbGxTdHJpbmc8MTY+IGV4cGFuZGVkVGFiOworICAgIGV4cGFuZGVkVGFiLmFzc2lnbihOdW1TcGFjZXMsICcgJyk7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGV4cGFuZGVkVGFiLCB0cnVlKTsKKyAgfQorCisgIC8vIEZJWE1FOiB0aGlzIGRhdGEgaXMgY29waWVkIGZyb20gdGhlIHByaXZhdGUgaW1wbGVtZW50YXRpb24gb2YgQ29udmVydFVURi5oCisgIHN0YXRpYyBjb25zdCBjaGFyIHRyYWlsaW5nQnl0ZXNGb3JVVEY4WzI1Nl0gPSB7CisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwgMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKKyAgICAyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLCAzLDMsMywzLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1CisgIH07CisKKyAgdW5zaWduZWQgY2hhciBjb25zdCAqYmVnaW4sICplbmQ7CisgIGJlZ2luID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyIGNvbnN0ICo+KCYqKFNvdXJjZUxpbmUuYmVnaW4oKSArICppKSk7CisgIGVuZCA9IGJlZ2luICsgU291cmNlTGluZS5zaXplKCk7CisgIAorICBpZiAoaXNMZWdhbFVURjhTZXF1ZW5jZShiZWdpbiwgZW5kKSkgeworICAgIFVURjMyIGM7CisgICAgVVRGMzIgKmNwdHIgPSAmYzsKKyAgICB1bnNpZ25lZCBjaGFyIGNvbnN0ICpvcmlnaW5hbF9iZWdpbiA9IGJlZ2luOworICAgIGNoYXIgdHJhaWxpbmdCeXRlcyA9IHRyYWlsaW5nQnl0ZXNGb3JVVEY4Wyh1bnNpZ25lZCBjaGFyKVNvdXJjZUxpbmVbKmldXTsKKyAgICB1bnNpZ25lZCBjaGFyIGNvbnN0ICpjcF9lbmQgPSBiZWdpbit0cmFpbGluZ0J5dGVzKzE7CisKKyAgICBDb252ZXJzaW9uUmVzdWx0IHJlcyA9IENvbnZlcnRVVEY4dG9VVEYzMigmYmVnaW4sIGNwX2VuZCwgJmNwdHIsIGNwdHIrMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3RDb252ZXJzaW9uKTsKKyAgICBhc3NlcnQoY29udmVyc2lvbk9LPT1yZXMpOworICAgIGFzc2VydCgwIDwgYmVnaW4tb3JpZ2luYWxfYmVnaW4KKyAgICAgICAgICAgJiYgIndlIG11c3QgYmUgZnVydGhlciBhbG9uZyBpbiB0aGUgc3RyaW5nIG5vdyIpOworICAgICppICs9IGJlZ2luLW9yaWdpbmFsX2JlZ2luOworCisgICAgaWYgKCFsbHZtOjpzeXM6OmxvY2FsZTo6aXNQcmludChjKSkgeworICAgICAgLy8gSWYgbmV4dCBjaGFyYWN0ZXIgaXMgdmFsaWQgVVRGLTgsIGJ1dCBub3QgcHJpbnRhYmxlCisgICAgICBTbWFsbFN0cmluZzwxNj4gZXhwYW5kZWRDUCgiPFUrPiIpOworICAgICAgd2hpbGUgKGMpIHsKKyAgICAgICAgZXhwYW5kZWRDUC5pbnNlcnQoZXhwYW5kZWRDUC5iZWdpbigpKzMsIGxsdm06OmhleGRpZ2l0KGMlMTYpKTsKKyAgICAgICAgYy89MTY7CisgICAgICB9CisgICAgICB3aGlsZSAoZXhwYW5kZWRDUC5zaXplKCkgPCA4KQorICAgICAgICBleHBhbmRlZENQLmluc2VydChleHBhbmRlZENQLmJlZ2luKCkrMywgbGx2bTo6aGV4ZGlnaXQoMCkpOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGV4cGFuZGVkQ1AsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvLyBJZiBuZXh0IGNoYXJhY3RlciBpcyB2YWxpZCBVVEYtOCwgYW5kIHByaW50YWJsZQorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihTbWFsbFN0cmluZzwxNj4ob3JpZ2luYWxfYmVnaW4sIGNwX2VuZCksIHRydWUpOworCisgIH0KKworICAvLyBJZiBuZXh0IGJ5dGUgaXMgbm90IHZhbGlkIFVURi04IChhbmQgdGhlcmVmb3JlIG5vdCBwcmludGFibGUpCisgIFNtYWxsU3RyaW5nPDE2PiBleHBhbmRlZEJ5dGUoIjxYWD4iKTsKKyAgdW5zaWduZWQgY2hhciBieXRlID0gU291cmNlTGluZVsqaV07CisgIGV4cGFuZGVkQnl0ZVsxXSA9IGxsdm06OmhleGRpZ2l0KGJ5dGUgLyAxNik7CisgIGV4cGFuZGVkQnl0ZVsyXSA9IGxsdm06OmhleGRpZ2l0KGJ5dGUgJSAxNik7CisgICsrKCppKTsKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGV4cGFuZGVkQnl0ZSwgZmFsc2UpOworfQorCit2b2lkIGV4cGFuZFRhYnMoc3RkOjpzdHJpbmcgJlNvdXJjZUxpbmUsIHVuc2lnbmVkIFRhYlN0b3ApIHsKKyAgc2l6ZV90IGkgPSBTb3VyY2VMaW5lLnNpemUoKTsKKyAgd2hpbGUgKGk+MCkgeworICAgIGktLTsKKyAgICBpZiAoU291cmNlTGluZVtpXSE9J1x0JykKKyAgICAgIGNvbnRpbnVlOworICAgIHNpemVfdCB0bXBfaSA9IGk7CisgICAgc3RkOjpwYWlyPFNtYWxsU3RyaW5nPDE2Pixib29sPiByZXMKKyAgICAgID0gcHJpbnRhYmxlVGV4dEZvck5leHRDaGFyYWN0ZXIoU291cmNlTGluZSwgJnRtcF9pLCBUYWJTdG9wKTsKKyAgICBTb3VyY2VMaW5lLnJlcGxhY2UoaSwgMSwgcmVzLmZpcnN0LmNfc3RyKCkpOworICB9Cit9CisKKy8vLyBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgcmF3IHNvdXJjZSBsaW5lIGFuZCBwcm9kdWNlcyBhIG1hcHBpbmcgZnJvbSB0aGUgYnl0ZXMKKy8vLyAgb2YgdGhlIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGluZSB0byB0aGUgY29sdW1ucyB0aG9zZSBwcmludGFibGUKKy8vLyAgY2hhcmFjdGVycyB3aWxsIGFwcGVhciBhdCAobnVtYmVyaW5nIHRoZSBmaXJzdCBjb2x1bW4gYXMgMCkuCisvLy8KKy8vLyBJZiBhIGJ5dGUgJ2knIGNvcnJlc3BvbmRzIHRvIG11bGlwbGUgY29sdW1ucyAoZS5nLiB0aGUgYnl0ZSBjb250YWlucyBhIHRhYgorLy8vICBjaGFyYWN0ZXIpIHRoZW4gdGhlIHRoZSBhcnJheSB3aWxsIG1hcCB0aGF0IGJ5dGUgdG8gdGhlIGZpcnN0IGNvbHVtbiB0aGUKKy8vLyAgdGFiIGFwcGVhcnMgYXQgYW5kIHRoZSBuZXh0IHZhbHVlIGluIHRoZSBtYXAgd2lsbCBoYXZlIGJlZW4gaW5jcmVtZW50ZWQKKy8vLyAgbW9yZSB0aGFuIG9uY2UuCisvLy8KKy8vLyBJZiBhIGJ5dGUgaXMgdGhlIGZpcnN0IGluIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgdGhhdCB0b2dldGhlciBtYXAgdG8gYSBzaW5nbGUKKy8vLyAgZW50aXR5IGluIHRoZSBvdXRwdXQsIHRoZW4gdGhlIGFycmF5IHdpbGwgbWFwIHRoYXQgYnl0ZSB0byB0aGUgYXBwcm9wcmlhdGUKKy8vLyAgY29sdW1uIHdoaWxlIHRoZSBzdWJzZXF1ZW50IGJ5dGVzIHdpbGwgYmUgLTEuCisvLy8KKy8vLyBUaGUgbGFzdCBlbGVtZW50IGluIHRoZSBhcnJheSBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFueSBieXRlIGluIHRoZSBpbnB1dAorLy8vICBhbmQgaW5zdGVhZCBpcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgbmVlZGVkIHRvIGRpc3BsYXkgdGhlIHNvdXJjZQorLy8vCisvLy8gZXhhbXBsZTogKGdpdmVuIGEgdGFic3RvcCBvZiA4KQorLy8vCisvLy8gICAgImEgXHQgXHUzMDQyIiAtPiB7MCwxLDIsOCw5LC0xLC0xLDExfQorLy8vCisvLy8gIChcdTMwNDIgaXMgcmVwcmVzZW50ZWQgaW4gVVRGLTggYnkgdGhyZWUgYnl0ZXMgYW5kIHRha2VzIHR3byBjb2x1bW5zIHRvCisvLy8gICBkaXNwbGF5KQordm9pZCBieXRlVG9Db2x1bW4oU3RyaW5nUmVmIFNvdXJjZUxpbmUsIHVuc2lnbmVkIFRhYlN0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGludD4gJm91dCkgeworICBvdXQuY2xlYXIoKTsKKworICBpZiAoU291cmNlTGluZS5lbXB0eSgpKSB7CisgICAgb3V0LnJlc2l6ZSgxdSwwKTsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIG91dC5yZXNpemUoU291cmNlTGluZS5zaXplKCkrMSwgLTEpOworCisgIGludCBjb2x1bW5zID0gMDsKKyAgc2l6ZV90IGkgPSAwOworICB3aGlsZSAoaTxTb3VyY2VMaW5lLnNpemUoKSkgeworICAgIG91dFtpXSA9IGNvbHVtbnM7CisgICAgc3RkOjpwYWlyPFNtYWxsU3RyaW5nPDE2Pixib29sPiByZXMKKyAgICAgID0gcHJpbnRhYmxlVGV4dEZvck5leHRDaGFyYWN0ZXIoU291cmNlTGluZSwgJmksIFRhYlN0b3ApOworICAgIGNvbHVtbnMgKz0gbGx2bTo6c3lzOjpsb2NhbGU6OmNvbHVtbldpZHRoKHJlcy5maXJzdCk7CisgIH0KKyAgb3V0LmJhY2soKSA9IGNvbHVtbnM7Cit9CisKKy8vLyBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgcmF3IHNvdXJjZSBsaW5lIGFuZCBwcm9kdWNlcyBhIG1hcHBpbmcgZnJvbSBjb2x1bW5zCisvLy8gIHRvIHRoZSBieXRlIG9mIHRoZSBzb3VyY2UgbGluZSB0aGF0IHByb2R1Y2VkIHRoZSBjaGFyYWN0ZXIgZGlzcGxheWluZyBhdAorLy8vICB0aGF0IGNvbHVtbi4gVGhpcyBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgbWFwcGluZyBwcm9kdWNlZCBieSBieXRlVG9Db2x1bW4oKQorLy8vCisvLy8gVGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgaXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgc291cmNlIHN0cmluZworLy8vCisvLy8gZXhhbXBsZTogKGdpdmVuIGEgdGFic3RvcCBvZiA4KQorLy8vCisvLy8gICAgImEgXHQgXHUzMDQyIiAtPiB7MCwxLDIsLTEsLTEsLTEsLTEsLTEsMyw0LC0xLDd9CisvLy8KKy8vLyAgKFx1MzA0MiBpcyByZXByZXNlbnRlZCBpbiBVVEYtOCBieSB0aHJlZSBieXRlcyBhbmQgdGFrZXMgdHdvIGNvbHVtbnMgdG8KKy8vLyAgIGRpc3BsYXkpCit2b2lkIGNvbHVtblRvQnl0ZShTdHJpbmdSZWYgU291cmNlTGluZSwgdW5zaWduZWQgVGFiU3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8aW50PiAmb3V0KSB7CisgIG91dC5jbGVhcigpOworCisgIGlmIChTb3VyY2VMaW5lLmVtcHR5KCkpIHsKKyAgICBvdXQucmVzaXplKDF1LCAwKTsKKyAgICByZXR1cm47CisgIH0KKworICBpbnQgY29sdW1ucyA9IDA7CisgIHNpemVfdCBpID0gMDsKKyAgd2hpbGUgKGk8U291cmNlTGluZS5zaXplKCkpIHsKKyAgICBvdXQucmVzaXplKGNvbHVtbnMrMSwgLTEpOworICAgIG91dC5iYWNrKCkgPSBpOworICAgIHN0ZDo6cGFpcjxTbWFsbFN0cmluZzwxNj4sYm9vbD4gcmVzCisgICAgICA9IHByaW50YWJsZVRleHRGb3JOZXh0Q2hhcmFjdGVyKFNvdXJjZUxpbmUsICZpLCBUYWJTdG9wKTsKKyAgICBjb2x1bW5zICs9IGxsdm06OnN5czo6bG9jYWxlOjpjb2x1bW5XaWR0aChyZXMuZmlyc3QpOworICB9CisgIG91dC5yZXNpemUoY29sdW1ucysxLCAtMSk7CisgIG91dC5iYWNrKCkgPSBpOworfQorCitzdHJ1Y3QgU291cmNlQ29sdW1uTWFwIHsKKyAgU291cmNlQ29sdW1uTWFwKFN0cmluZ1JlZiBTb3VyY2VMaW5lLCB1bnNpZ25lZCBUYWJTdG9wKQorICA6IG1fU291cmNlTGluZShTb3VyY2VMaW5lKSB7CisgICAgCisgICAgOjpieXRlVG9Db2x1bW4oU291cmNlTGluZSwgVGFiU3RvcCwgbV9ieXRlVG9Db2x1bW4pOworICAgIDo6Y29sdW1uVG9CeXRlKFNvdXJjZUxpbmUsIFRhYlN0b3AsIG1fY29sdW1uVG9CeXRlKTsKKyAgICAKKyAgICBhc3NlcnQobV9ieXRlVG9Db2x1bW4uc2l6ZSgpPT1Tb3VyY2VMaW5lLnNpemUoKSsxKTsKKyAgICBhc3NlcnQoMCA8IG1fYnl0ZVRvQ29sdW1uLnNpemUoKSAmJiAwIDwgbV9jb2x1bW5Ub0J5dGUuc2l6ZSgpKTsKKyAgICBhc3NlcnQobV9ieXRlVG9Db2x1bW4uc2l6ZSgpCisgICAgICAgICAgID09IHN0YXRpY19jYXN0PHVuc2lnbmVkPihtX2NvbHVtblRvQnl0ZS5iYWNrKCkrMSkpOworICAgIGFzc2VydChzdGF0aWNfY2FzdDx1bnNpZ25lZD4obV9ieXRlVG9Db2x1bW4uYmFjaygpKzEpCisgICAgICAgICAgID09IG1fY29sdW1uVG9CeXRlLnNpemUoKSk7CisgIH0KKyAgaW50IGNvbHVtbnMoKSBjb25zdCB7IHJldHVybiBtX2J5dGVUb0NvbHVtbi5iYWNrKCk7IH0KKyAgaW50IGJ5dGVzKCkgY29uc3QgeyByZXR1cm4gbV9jb2x1bW5Ub0J5dGUuYmFjaygpOyB9CisgIGludCBieXRlVG9Db2x1bW4oaW50IG4pIGNvbnN0IHsKKyAgICBhc3NlcnQoMDw9biAmJiBuPHN0YXRpY19jYXN0PGludD4obV9ieXRlVG9Db2x1bW4uc2l6ZSgpKSk7CisgICAgcmV0dXJuIG1fYnl0ZVRvQ29sdW1uW25dOworICB9CisgIGludCBjb2x1bW5Ub0J5dGUoaW50IG4pIGNvbnN0IHsKKyAgICBhc3NlcnQoMDw9biAmJiBuPHN0YXRpY19jYXN0PGludD4obV9jb2x1bW5Ub0J5dGUuc2l6ZSgpKSk7CisgICAgcmV0dXJuIG1fY29sdW1uVG9CeXRlW25dOworICB9CisgIFN0cmluZ1JlZiBnZXRTb3VyY2VMaW5lKCkgY29uc3QgeworICAgIHJldHVybiBtX1NvdXJjZUxpbmU7CisgIH0KKyAgCitwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyBtX1NvdXJjZUxpbmU7CisgIFNtYWxsVmVjdG9yPGludCwyMDA+IG1fYnl0ZVRvQ29sdW1uOworICBTbWFsbFZlY3RvcjxpbnQsMjAwPiBtX2NvbHVtblRvQnl0ZTsKK307CisKKy8vIHVzZWQgaW4gYXNzZXJ0IGluIHNlbGVjdEludGVyZXN0aW5nU291cmNlUmVnaW9uKCkKK25hbWVzcGFjZSB7CitzdHJ1Y3QgY2hhcl9vdXRfb2ZfcmFuZ2UgeworICBjb25zdCBjaGFyIGxvd2VyLHVwcGVyOworICBjaGFyX291dF9vZl9yYW5nZShjaGFyIGxvd2VyLCBjaGFyIHVwcGVyKSA6CisgICAgbG93ZXIobG93ZXIpLCB1cHBlcih1cHBlcikge30KKyAgYm9vbCBvcGVyYXRvcigpKGNoYXIgYykgeyByZXR1cm4gYyA8IGxvd2VyIHx8IHVwcGVyIDwgYzsgfQorfTsKK30KKwogLy8vIFxicmllZiBXaGVuIHRoZSBzb3VyY2UgY29kZSBsaW5lIHdlIHdhbnQgdG8gcHJpbnQgaXMgdG9vIGxvbmcgZm9yCiAvLy8gdGhlIHRlcm1pbmFsLCBzZWxlY3QgdGhlICJpbnRlcmVzdGluZyIgcmVnaW9uLgogc3RhdGljIHZvaWQgc2VsZWN0SW50ZXJlc3RpbmdTb3VyY2VSZWdpb24oc3RkOjpzdHJpbmcgJlNvdXJjZUxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmQ2FyZXRMaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJkZpeEl0SW5zZXJ0aW9uTGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEVuZE9mQ2FyZXRUb2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbHVtbnMpIHsKLSAgdW5zaWduZWQgTWF4U2l6ZSA9IHN0ZDo6bWF4KFNvdXJjZUxpbmUuc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoQ2FyZXRMaW5lLnNpemUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXhJdEluc2VydGlvbkxpbmUuc2l6ZSgpKSk7Ci0gIGlmIChNYXhTaXplID4gU291cmNlTGluZS5zaXplKCkpCi0gICAgU291cmNlTGluZS5yZXNpemUoTWF4U2l6ZSwgJyAnKTsKLSAgaWYgKE1heFNpemUgPiBDYXJldExpbmUuc2l6ZSgpKQotICAgIENhcmV0TGluZS5yZXNpemUoTWF4U2l6ZSwgJyAnKTsKLSAgaWYgKCFGaXhJdEluc2VydGlvbkxpbmUuZW1wdHkoKSAmJiBNYXhTaXplID4gRml4SXRJbnNlcnRpb25MaW5lLnNpemUoKSkKLSAgICBGaXhJdEluc2VydGlvbkxpbmUucmVzaXplKE1heFNpemUsICcgJyk7Ci0gICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlQ29sdW1uTWFwICZtYXApIHsKKyAgdW5zaWduZWQgTWF4Q29sdW1ucyA9IHN0ZDo6bWF4PHVuc2lnbmVkPihtYXAuY29sdW1ucygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWF4KENhcmV0TGluZS5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4SXRJbnNlcnRpb25MaW5lLnNpemUoKSkpOworICAvLyBpZiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaXMgbGVzcyB0aGFuIHRoZSBkZXNpcmVkIG51bWJlciB3ZSdyZSBkb25lCisgIGlmIChNYXhDb2x1bW5zIDw9IENvbHVtbnMpCisgICAgcmV0dXJuOworCisgIC8vIG5vIHNwZWNpYWwgY2hhcmFjdGVycyBhbGxvd2VkIGluIENhcmV0TGluZSBvciBGaXhJdEluc2VydGlvbkxpbmUKKyAgYXNzZXJ0KENhcmV0TGluZS5lbmQoKSA9PQorICAgICAgICAgc3RkOjpmaW5kX2lmKENhcmV0TGluZS5iZWdpbigpLCBDYXJldExpbmUuZW5kKCksCisgICAgICAgICBjaGFyX291dF9vZl9yYW5nZSgnICcsJ34nKSkpOworICBhc3NlcnQoRml4SXRJbnNlcnRpb25MaW5lLmVuZCgpID09CisgICAgICAgICBzdGQ6OmZpbmRfaWYoRml4SXRJbnNlcnRpb25MaW5lLmJlZ2luKCksIEZpeEl0SW5zZXJ0aW9uTGluZS5lbmQoKSwKKyAgICAgICAgIGNoYXJfb3V0X29mX3JhbmdlKCcgJywnficpKSk7CisKICAgLy8gRmluZCB0aGUgc2xpY2UgdGhhdCB3ZSBuZWVkIHRvIGRpc3BsYXkgdGhlIGZ1bGwgY2FyZXQgbGluZQogICAvLyBjb3JyZWN0bHkuCiAgIHVuc2lnbmVkIENhcmV0U3RhcnQgPSAwLCBDYXJldEVuZCA9IENhcmV0TGluZS5zaXplKCk7CkBAIC02NCwxMCArMzEzLDggQEAKICAgICBpZiAoIWlzc3BhY2UoQ2FyZXRMaW5lW0NhcmV0RW5kIC0gMV0pKQogICAgICAgYnJlYWs7CiAKLSAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IGNob3AgdGhlIHN0cmluZyBzaG9ydGVyIHRoYW4gdGhlIGNhcmV0IHRva2VuCi0gIC8vIGl0c2VsZi4KLSAgaWYgKENhcmV0RW5kIDwgRW5kT2ZDYXJldFRva2VuKQotICAgIENhcmV0RW5kID0gRW5kT2ZDYXJldFRva2VuOworICAvLyBjYXJldCBoYXMgYWxyZWFkeSBiZWVuIGluc2VydGVkIGludG8gQ2FyZXRMaW5lIHNvIHRoZSBhYm92ZSB3aGl0ZXNwYWNlCisgIC8vIGNoZWNrIGlzIGd1YXJhbnRlZWQgdG8gaW5jbHVkZSB0aGUgY2FyZXQKIAogICAvLyBJZiB3ZSBoYXZlIGEgZml4LWl0IGxpbmUsIG1ha2Ugc3VyZSB0aGUgc2xpY2UgaW5jbHVkZXMgYWxsIG9mIHRoZQogICAvLyBmaXgtaXQgaW5mb3JtYXRpb24uCkBAIC04MSwxMCArMzI4LDggQEAKICAgICAgIGlmICghaXNzcGFjZShGaXhJdEluc2VydGlvbkxpbmVbRml4SXRFbmQgLSAxXSkpCiAgICAgICAgIGJyZWFrOwogCi0gICAgaWYgKEZpeEl0U3RhcnQgPCBDYXJldFN0YXJ0KQotICAgICAgQ2FyZXRTdGFydCA9IEZpeEl0U3RhcnQ7Ci0gICAgaWYgKEZpeEl0RW5kID4gQ2FyZXRFbmQpCi0gICAgICBDYXJldEVuZCA9IEZpeEl0RW5kOworICAgIENhcmV0U3RhcnQgPSBzdGQ6Om1pbihGaXhJdFN0YXJ0LCBDYXJldFN0YXJ0KTsKKyAgICBDYXJldEVuZCA9IHN0ZDo6bWF4KEZpeEl0RW5kLCBDYXJldEVuZCk7CiAgIH0KIAogICAvLyBDYXJldExpbmVbQ2FyZXRTdGFydCwgQ2FyZXRFbmQpIGNvbnRhaW5zIGFsbCBvZiB0aGUgaW50ZXJlc3RpbmcKQEAgLTkyLDYyICszMzcsNzIgQEAKICAgLy8gbnVtYmVyIG9mIGNvbHVtbnMgd2UgaGF2ZSwgdHJ5IHRvIGdyb3cgdGhlIHNsaWNlIHRvIGVuY29tcGFzcwogICAvLyBtb3JlIGNvbnRleHQuCiAKLSAgLy8gSWYgdGhlIGVuZCBvZiB0aGUgaW50ZXJlc3RpbmcgcmVnaW9uIGNvbWVzIGJlZm9yZSB3ZSBydW4gb3V0IG9mCi0gIC8vIHNwYWNlIGluIHRoZSB0ZXJtaW5hbCwgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS4KLSAgaWYgKENvbHVtbnMgPiAzICYmIENhcmV0RW5kIDwgQ29sdW1ucyAtIDMpCi0gICAgQ2FyZXRTdGFydCA9IDA7CisgIHVuc2lnbmVkIFNvdXJjZVN0YXJ0ID0gbWFwLmNvbHVtblRvQnl0ZShzdGQ6Om1pbjx1bnNpZ25lZD4oQ2FyZXRTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuY29sdW1ucygpKSk7CisgIHVuc2lnbmVkIFNvdXJjZUVuZCA9IG1hcC5jb2x1bW5Ub0J5dGUoc3RkOjptaW48dW5zaWduZWQ+KENhcmV0RW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuY29sdW1ucygpKSk7CisKKyAgdW5zaWduZWQgQ2FyZXRDb2x1bW5zT3V0c2lkZVNvdXJjZSA9IENhcmV0RW5kLUNhcmV0U3RhcnQKKyAgICAtIChtYXAuYnl0ZVRvQ29sdW1uKFNvdXJjZUVuZCktbWFwLmJ5dGVUb0NvbHVtbihTb3VyY2VTdGFydCkpOworCisgIGNoYXIgY29uc3QgKmZyb250X2VsbGlwc2UgPSAiICAuLi4iOworICBjaGFyIGNvbnN0ICpmcm9udF9zcGFjZSAgID0gIiAgICAgIjsKKyAgY2hhciBjb25zdCAqYmFja19lbGxpcHNlID0gIi4uLiI7CisgIHVuc2lnbmVkIGVsbGlwc2VzX3NwYWNlID0gc3RybGVuKGZyb250X2VsbGlwc2UpICsgc3RybGVuKGJhY2tfZWxsaXBzZSk7CiAKICAgdW5zaWduZWQgVGFyZ2V0Q29sdW1ucyA9IENvbHVtbnM7Ci0gIGlmIChUYXJnZXRDb2x1bW5zID4gOCkKLSAgICBUYXJnZXRDb2x1bW5zIC09IDg7IC8vIEdpdmUgdXMgZXh0cmEgcm9vbSBmb3IgdGhlIGVsbGlwc2VzLgotICB1bnNpZ25lZCBTb3VyY2VMZW5ndGggPSBTb3VyY2VMaW5lLnNpemUoKTsKLSAgd2hpbGUgKChDYXJldEVuZCAtIENhcmV0U3RhcnQpIDwgVGFyZ2V0Q29sdW1ucykgeworICAvLyBHaXZlIHVzIGV4dHJhIHJvb20gZm9yIHRoZSBlbGxpcHNlcworICAvLyAgYW5kIGFueSBvZiB0aGUgY2FyZXQgbGluZSB0aGF0IGV4dGVuZHMgcGFzdCB0aGUgc291cmNlCisgIGlmIChUYXJnZXRDb2x1bW5zID4gZWxsaXBzZXNfc3BhY2UrQ2FyZXRDb2x1bW5zT3V0c2lkZVNvdXJjZSkKKyAgICBUYXJnZXRDb2x1bW5zIC09IGVsbGlwc2VzX3NwYWNlK0NhcmV0Q29sdW1uc091dHNpZGVTb3VyY2U7CisKKyAgd2hpbGUgKFNvdXJjZVN0YXJ0PjAgfHwgU291cmNlRW5kPFNvdXJjZUxpbmUuc2l6ZSgpKSB7CiAgICAgYm9vbCBFeHBhbmRlZFJlZ2lvbiA9IGZhbHNlOwotICAgIC8vIE1vdmUgdGhlIHN0YXJ0IG9mIHRoZSBpbnRlcmVzdGluZyByZWdpb24gbGVmdCB1bnRpbCB3ZSd2ZQotICAgIC8vIHB1bGxlZCBpbiBzb21ldGhpbmcgZWxzZSBpbnRlcmVzdGluZy4KLSAgICBpZiAoQ2FyZXRTdGFydCA9PSAxKQotICAgICAgQ2FyZXRTdGFydCA9IDA7Ci0gICAgZWxzZSBpZiAoQ2FyZXRTdGFydCA+IDEpIHsKLSAgICAgIHVuc2lnbmVkIE5ld1N0YXJ0ID0gQ2FyZXRTdGFydCAtIDE7CisKKyAgICBpZiAoU291cmNlU3RhcnQ+MCkgeworICAgICAgdW5zaWduZWQgTmV3U3RhcnQgPSBTb3VyY2VTdGFydC0xOwogCiAgICAgICAvLyBTa2lwIG92ZXIgYW55IHdoaXRlc3BhY2Ugd2Ugc2VlIGhlcmU7IHdlJ3JlIGxvb2tpbmcgZm9yCiAgICAgICAvLyBhbm90aGVyIGJpdCBvZiBpbnRlcmVzdGluZyB0ZXh0LgotICAgICAgd2hpbGUgKE5ld1N0YXJ0ICYmIGlzc3BhY2UoU291cmNlTGluZVtOZXdTdGFydF0pKQorICAgICAgd2hpbGUgKE5ld1N0YXJ0ICYmCisgICAgICAgICAgICAgKG1hcC5ieXRlVG9Db2x1bW4oTmV3U3RhcnQpPT0tMSB8fCBpc3NwYWNlKFNvdXJjZUxpbmVbTmV3U3RhcnRdKSkpCiAgICAgICAgIC0tTmV3U3RhcnQ7CiAKICAgICAgIC8vIFNraXAgb3ZlciB0aGlzIGJpdCBvZiAiaW50ZXJlc3RpbmciIHRleHQuCi0gICAgICB3aGlsZSAoTmV3U3RhcnQgJiYgIWlzc3BhY2UoU291cmNlTGluZVtOZXdTdGFydF0pKQorICAgICAgd2hpbGUgKE5ld1N0YXJ0ICYmCisgICAgICAgICAgICAgKG1hcC5ieXRlVG9Db2x1bW4oTmV3U3RhcnQpIT0tMSAmJiAhaXNzcGFjZShTb3VyY2VMaW5lW05ld1N0YXJ0XSkpKQogICAgICAgICAtLU5ld1N0YXJ0OwogCiAgICAgICAvLyBNb3ZlIHVwIHRvIHRoZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgd2UganVzdCBzYXcuCiAgICAgICBpZiAoTmV3U3RhcnQpCiAgICAgICAgICsrTmV3U3RhcnQ7CiAKLSAgICAgIC8vIElmIHdlJ3JlIHN0aWxsIHdpdGhpbiBvdXIgbGltaXQsIHVwZGF0ZSB0aGUgc3RhcnRpbmcKLSAgICAgIC8vIHBvc2l0aW9uIHdpdGhpbiB0aGUgc291cmNlL2NhcmV0IGxpbmUuCi0gICAgICBpZiAoQ2FyZXRFbmQgLSBOZXdTdGFydCA8PSBUYXJnZXRDb2x1bW5zKSB7Ci0gICAgICAgIENhcmV0U3RhcnQgPSBOZXdTdGFydDsKKyAgICAgIHVuc2lnbmVkIE5ld0NvbHVtbnMgPSBtYXAuYnl0ZVRvQ29sdW1uKFNvdXJjZUVuZCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLmJ5dGVUb0NvbHVtbihOZXdTdGFydCk7CisgICAgICBpZiAoTmV3Q29sdW1ucyA8PSBUYXJnZXRDb2x1bW5zKSB7CisgICAgICAgIFNvdXJjZVN0YXJ0ID0gTmV3U3RhcnQ7CiAgICAgICAgIEV4cGFuZGVkUmVnaW9uID0gdHJ1ZTsKICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBNb3ZlIHRoZSBlbmQgb2YgdGhlIGludGVyZXN0aW5nIHJlZ2lvbiByaWdodCB1bnRpbCB3ZSd2ZQotICAgIC8vIHB1bGxlZCBpbiBzb21ldGhpbmcgZWxzZSBpbnRlcmVzdGluZy4KLSAgICBpZiAoQ2FyZXRFbmQgIT0gU291cmNlTGVuZ3RoKSB7Ci0gICAgICBhc3NlcnQoQ2FyZXRFbmQgPCBTb3VyY2VMZW5ndGggJiYgIlVuZXhwZWN0ZWQgY2FyZXQgcG9zaXRpb24hIik7Ci0gICAgICB1bnNpZ25lZCBOZXdFbmQgPSBDYXJldEVuZDsKKyAgICBpZiAoU291cmNlRW5kPFNvdXJjZUxpbmUuc2l6ZSgpKSB7CisgICAgICB1bnNpZ25lZCBOZXdFbmQgPSBTb3VyY2VFbmQrMTsKIAogICAgICAgLy8gU2tpcCBvdmVyIGFueSB3aGl0ZXNwYWNlIHdlIHNlZSBoZXJlOyB3ZSdyZSBsb29raW5nIGZvcgogICAgICAgLy8gYW5vdGhlciBiaXQgb2YgaW50ZXJlc3RpbmcgdGV4dC4KLSAgICAgIHdoaWxlIChOZXdFbmQgIT0gU291cmNlTGVuZ3RoICYmIGlzc3BhY2UoU291cmNlTGluZVtOZXdFbmQgLSAxXSkpCisgICAgICB3aGlsZSAoTmV3RW5kPFNvdXJjZUxpbmUuc2l6ZSgpICYmCisgICAgICAgICAgICAgKG1hcC5ieXRlVG9Db2x1bW4oTmV3RW5kKT09LTEgfHwgaXNzcGFjZShTb3VyY2VMaW5lW05ld0VuZF0pKSkKICAgICAgICAgKytOZXdFbmQ7CiAKICAgICAgIC8vIFNraXAgb3ZlciB0aGlzIGJpdCBvZiAiaW50ZXJlc3RpbmciIHRleHQuCi0gICAgICB3aGlsZSAoTmV3RW5kICE9IFNvdXJjZUxlbmd0aCAmJiAhaXNzcGFjZShTb3VyY2VMaW5lW05ld0VuZCAtIDFdKSkKKyAgICAgIHdoaWxlIChOZXdFbmQ8U291cmNlTGluZS5zaXplKCkgJiYKKyAgICAgICAgICAgICAobWFwLmJ5dGVUb0NvbHVtbihOZXdFbmQpIT0tMSAmJiAhaXNzcGFjZShTb3VyY2VMaW5lW05ld0VuZF0pKSkKICAgICAgICAgKytOZXdFbmQ7CiAKLSAgICAgIGlmIChOZXdFbmQgLSBDYXJldFN0YXJ0IDw9IFRhcmdldENvbHVtbnMpIHsKLSAgICAgICAgQ2FyZXRFbmQgPSBOZXdFbmQ7CisgICAgICB1bnNpZ25lZCBOZXdDb2x1bW5zID0gbWFwLmJ5dGVUb0NvbHVtbihOZXdFbmQpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5ieXRlVG9Db2x1bW4oU291cmNlU3RhcnQpOworICAgICAgaWYgKE5ld0NvbHVtbnMgPD0gVGFyZ2V0Q29sdW1ucykgeworICAgICAgICBTb3VyY2VFbmQgPSBOZXdFbmQ7CiAgICAgICAgIEV4cGFuZGVkUmVnaW9uID0gdHJ1ZTsKICAgICAgIH0KICAgICB9CkBAIC0xNTYsMjEgKzQxMSw0MSBAQAogICAgICAgYnJlYWs7CiAgIH0KIAorICBDYXJldFN0YXJ0ID0gbWFwLmJ5dGVUb0NvbHVtbihTb3VyY2VTdGFydCk7CisgIENhcmV0RW5kID0gbWFwLmJ5dGVUb0NvbHVtbihTb3VyY2VFbmQpICsgQ2FyZXRDb2x1bW5zT3V0c2lkZVNvdXJjZTsKKwogICAvLyBbQ2FyZXRTdGFydCwgQ2FyZXRFbmQpIGlzIHRoZSBzbGljZSB3ZSB3YW50LiBVcGRhdGUgdGhlIHZhcmlvdXMKICAgLy8gb3V0cHV0IGxpbmVzIHRvIHNob3cgb25seSB0aGlzIHNsaWNlLCB3aXRoIHR3by1zcGFjZSBwYWRkaW5nCiAgIC8vIGJlZm9yZSB0aGUgbGluZXMgc28gdGhhdCBpdCBsb29rcyBuaWNlci4KLSAgaWYgKENhcmV0RW5kIDwgU291cmNlTGluZS5zaXplKCkpCi0gICAgU291cmNlTGluZS5yZXBsYWNlKENhcmV0RW5kLCBzdGQ6OnN0cmluZzo6bnBvcywgIi4uLiIpOwotICBpZiAoQ2FyZXRFbmQgPCBDYXJldExpbmUuc2l6ZSgpKQotICAgIENhcmV0TGluZS5lcmFzZShDYXJldEVuZCwgc3RkOjpzdHJpbmc6Om5wb3MpOwotICBpZiAoRml4SXRJbnNlcnRpb25MaW5lLnNpemUoKSA+IENhcmV0RW5kKQotICAgIEZpeEl0SW5zZXJ0aW9uTGluZS5lcmFzZShDYXJldEVuZCwgc3RkOjpzdHJpbmc6Om5wb3MpOwogCi0gIGlmIChDYXJldFN0YXJ0ID4gMikgewotICAgIFNvdXJjZUxpbmUucmVwbGFjZSgwLCBDYXJldFN0YXJ0LCAiICAuLi4iKTsKLSAgICBDYXJldExpbmUucmVwbGFjZSgwLCBDYXJldFN0YXJ0LCAiICAgICAiKTsKLSAgICBpZiAoRml4SXRJbnNlcnRpb25MaW5lLnNpemUoKSA+PSBDYXJldFN0YXJ0KQotICAgICAgRml4SXRJbnNlcnRpb25MaW5lLnJlcGxhY2UoMCwgQ2FyZXRTdGFydCwgIiAgICAgIik7CisgIGFzc2VydChDYXJldFN0YXJ0IT0odW5zaWduZWQpLTEgJiYgQ2FyZXRFbmQhPSh1bnNpZ25lZCktMSAmJgorICAgICAgICAgU291cmNlU3RhcnQhPSh1bnNpZ25lZCktMSAmJiBTb3VyY2VFbmQhPSh1bnNpZ25lZCktMSk7CisgIGFzc2VydChTb3VyY2VTdGFydCA8PSBTb3VyY2VFbmQpOworICBhc3NlcnQoQ2FyZXRTdGFydCA8PSBDYXJldEVuZCk7CisKKyAgdW5zaWduZWQgQmFja0NvbHVtbnNSZW1vdmVkCisgICAgPSBtYXAuYnl0ZVRvQ29sdW1uKFNvdXJjZUxpbmUuc2l6ZSgpKS1tYXAuYnl0ZVRvQ29sdW1uKFNvdXJjZUVuZCk7CisgIHVuc2lnbmVkIEZyb250Q29sdW1uc1JlbW92ZWQgPSBDYXJldFN0YXJ0OworICB1bnNpZ25lZCBDb2x1bW5zS2VwdCA9IENhcmV0RW5kLUNhcmV0U3RhcnQ7CisKKyAgLy8gV2UgY2hlY2tlZCB1cCBmcm9udCB0aGF0IHRoZSBsaW5lIG5lZWRlZCB0cnVuY2F0aW9uCisgIGFzc2VydChGcm9udENvbHVtbnNSZW1vdmVkK0NvbHVtbnNLZXB0K0JhY2tDb2x1bW5zUmVtb3ZlZCA+IENvbHVtbnMpOworCisgIC8vIFRoZSBsaW5lIG5lZWRzIHNvbWUgdHJ1bmN0aW9uYSwgYW5kIHdlJ2QgcHJlZmVyIHRvIGtlZXAgdGhlIGZyb250CisgIC8vICBpZiBwb3NzaWJsZSwgc28gcmVtb3ZlIHRoZSBiYWNrCisgIGlmIChCYWNrQ29sdW1uc1JlbW92ZWQpCisgICAgU291cmNlTGluZS5yZXBsYWNlKFNvdXJjZUVuZCwgc3RkOjpzdHJpbmc6Om5wb3MsIGJhY2tfZWxsaXBzZSk7CisKKyAgLy8gSWYgdGhhdCdzIGVub3VnaCB0aGVuIHdlJ3JlIGRvbmUKKyAgaWYgKEZyb250Q29sdW1uc1JlbW92ZWQrQ29sdW1uc0tlcHQgPD0gQ29sdW1ucykKKyAgICByZXR1cm47CisKKyAgLy8gT3RoZXJ3aXNlIHJlbW92ZSB0aGUgZnJvbnQgYXMgd2VsbAorICBpZiAoRnJvbnRDb2x1bW5zUmVtb3ZlZCkgeworICAgIFNvdXJjZUxpbmUucmVwbGFjZSgwLCBTb3VyY2VTdGFydCwgZnJvbnRfZWxsaXBzZSk7CisgICAgQ2FyZXRMaW5lLnJlcGxhY2UoMCwgQ2FyZXRTdGFydCwgZnJvbnRfc3BhY2UpOworICAgIGlmICghRml4SXRJbnNlcnRpb25MaW5lLmVtcHR5KCkpCisgICAgICBGaXhJdEluc2VydGlvbkxpbmUucmVwbGFjZSgwLCBDYXJldFN0YXJ0LCBmcm9udF9zcGFjZSk7CiAgIH0KIH0KIApAQCAtNTk2LDE5ICs4NzEsMzAgQEAKICAgLy8gbGVuZ3RoIGFzIHRoZSBsaW5lIG9mIHNvdXJjZSBjb2RlLgogICBzdGQ6OnN0cmluZyBDYXJldExpbmUoTGluZUVuZC1MaW5lU3RhcnQsICcgJyk7CiAKKyAgY29uc3QgU291cmNlQ29sdW1uTWFwIHNvdXJjZUNvbE1hcChTb3VyY2VMaW5lLCBEaWFnT3B0cy5UYWJTdG9wKTsKKwogICAvLyBIaWdobGlnaHQgYWxsIG9mIHRoZSBjaGFyYWN0ZXJzIGNvdmVyZWQgYnkgUmFuZ2VzIHdpdGggfiBjaGFyYWN0ZXJzLgogICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxDaGFyU291cmNlUmFuZ2U+OjppdGVyYXRvciBJID0gUmFuZ2VzLmJlZ2luKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBSYW5nZXMuZW5kKCk7CiAgICAgICAgSSAhPSBFOyArK0kpCi0gICAgaGlnaGxpZ2h0UmFuZ2UoKkksIExpbmVObywgRklELCBTb3VyY2VMaW5lLCBDYXJldExpbmUpOworICAgIGhpZ2hsaWdodFJhbmdlKCpJLCBMaW5lTm8sIEZJRCwgc291cmNlQ29sTWFwLCBDYXJldExpbmUpOwogCiAgIC8vIE5leHQsIGluc2VydCB0aGUgY2FyZXQgaXRzZWxmLgotICBpZiAoQ29sTm8tMSA8IENhcmV0TGluZS5zaXplKCkpCi0gICAgQ2FyZXRMaW5lW0NvbE5vLTFdID0gJ14nOwotICBlbHNlCi0gICAgQ2FyZXRMaW5lLnB1c2hfYmFjaygnXicpOworICBDb2xObyA9IHNvdXJjZUNvbE1hcC5ieXRlVG9Db2x1bW4oQ29sTm8tMSk7CisgIGlmIChDYXJldExpbmUuc2l6ZSgpPENvbE5vKzEpCisgICAgQ2FyZXRMaW5lLnJlc2l6ZShDb2xObysxLCAnICcpOworICBDYXJldExpbmVbQ29sTm9dID0gJ14nOwogCi0gIGV4cGFuZFRhYnMoU291cmNlTGluZSwgQ2FyZXRMaW5lKTsKKyAgc3RkOjpzdHJpbmcgRml4SXRJbnNlcnRpb25MaW5lID0gYnVpbGRGaXhJdEluc2VydGlvbkxpbmUoTGluZU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VDb2xNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpbnRzKTsKKworICAvLyBJZiB0aGUgc291cmNlIGxpbmUgaXMgdG9vIGxvbmcgZm9yIG91ciB0ZXJtaW5hbCwgc2VsZWN0IG9ubHkgdGhlCisgIC8vICJpbnRlcmVzdGluZyIgc291cmNlIHJlZ2lvbiB3aXRoaW4gdGhhdCBsaW5lLgorICB1bnNpZ25lZCBDb2x1bW5zID0gRGlhZ09wdHMuTWVzc2FnZUxlbmd0aDsKKyAgaWYgKENvbHVtbnMpCisgICAgc2VsZWN0SW50ZXJlc3RpbmdTb3VyY2VSZWdpb24oU291cmNlTGluZSwgQ2FyZXRMaW5lLCBGaXhJdEluc2VydGlvbkxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1ucywgc291cmNlQ29sTWFwKTsKIAogICAvLyBJZiB3ZSBhcmUgaW4gLWZkaWFnbm9zdGljcy1wcmludC1zb3VyY2UtcmFuZ2UtaW5mbyBtb2RlLCB3ZSBhcmUgdHJ5aW5nCiAgIC8vIHRvIHByb2R1Y2UgZWFzaWx5IG1hY2hpbmUgcGFyc2FibGUgb3V0cHV0LiAgQWRkIGEgc3BhY2UgYmVmb3JlIHRoZQpAQCAtNjE5LDIzICs5MDUsMTIgQEAKICAgICBDYXJldExpbmUgPSAnICcgKyBDYXJldExpbmU7CiAgIH0KIAotICBzdGQ6OnN0cmluZyBGaXhJdEluc2VydGlvbkxpbmUgPSBidWlsZEZpeEl0SW5zZXJ0aW9uTGluZShMaW5lTm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVTdGFydCwgTGluZUVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGludHMpOwotCi0gIC8vIElmIHRoZSBzb3VyY2UgbGluZSBpcyB0b28gbG9uZyBmb3Igb3VyIHRlcm1pbmFsLCBzZWxlY3Qgb25seSB0aGUKLSAgLy8gImludGVyZXN0aW5nIiBzb3VyY2UgcmVnaW9uIHdpdGhpbiB0aGF0IGxpbmUuCi0gIHVuc2lnbmVkIENvbHVtbnMgPSBEaWFnT3B0cy5NZXNzYWdlTGVuZ3RoOwotICBpZiAoQ29sdW1ucyAmJiBTb3VyY2VMaW5lLnNpemUoKSA+IENvbHVtbnMpCi0gICAgc2VsZWN0SW50ZXJlc3RpbmdTb3VyY2VSZWdpb24oU291cmNlTGluZSwgQ2FyZXRMaW5lLCBGaXhJdEluc2VydGlvbkxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FyZXRFbmRDb2xObywgQ29sdW1ucyk7Ci0KICAgLy8gRmluYWxseSwgcmVtb3ZlIGFueSBibGFuayBzcGFjZXMgZnJvbSB0aGUgZW5kIG9mIENhcmV0TGluZS4KICAgd2hpbGUgKENhcmV0TGluZVtDYXJldExpbmUuc2l6ZSgpLTFdID09ICcgJykKICAgICBDYXJldExpbmUuZXJhc2UoQ2FyZXRMaW5lLmVuZCgpLTEpOwogCiAgIC8vIEVtaXQgd2hhdCB3ZSBoYXZlIGNvbXB1dGVkLgotICBPUyA8PCBTb3VyY2VMaW5lIDw8ICdcbic7CisgIGVtaXRTbmlwcGV0KFNvdXJjZUxpbmUpOwogCiAgIGlmIChEaWFnT3B0cy5TaG93Q29sb3JzKQogICAgIE9TLmNoYW5nZUNvbG9yKGNhcmV0Q29sb3IsIHRydWUpOwpAQCAtNjU4LDEzICs5MzMsNDkgQEAKICAgZW1pdFBhcnNlYWJsZUZpeGl0cyhIaW50cyk7CiB9CiAKK3ZvaWQgVGV4dERpYWdub3N0aWM6OmVtaXRTbmlwcGV0KFN0cmluZ1JlZiBsaW5lKQoreworICBpZiAobGluZS5lbXB0eSgpKQorICAgIHJldHVybjsKKworICBzaXplX3QgaSA9IDA7CisgIAorICBzdGQ6OnN0cmluZyB0b19wcmludDsKKyAgYm9vbCBwcmludF9yZXZlcnNlZCA9IGZhbHNlOworICAKKyAgd2hpbGUgKGk8bGluZS5zaXplKCkpIHsKKyAgICBzdGQ6OnBhaXI8U21hbGxTdHJpbmc8MTY+LGJvb2w+IHJlcworICAgICAgICA9IHByaW50YWJsZVRleHRGb3JOZXh0Q2hhcmFjdGVyKGxpbmUsICZpLCBEaWFnT3B0cy5UYWJTdG9wKTsKKyAgICBib29sIHdhc19wcmludGFibGUgPSByZXMuc2Vjb25kOworICAgIAorICAgIGlmIChEaWFnT3B0cy5TaG93Q29sb3JzCisgICAgICAgICYmIHdhc19wcmludGFibGU9PXByaW50X3JldmVyc2VkKSB7CisgICAgICBpZiAocHJpbnRfcmV2ZXJzZWQpCisgICAgICAgIE9TLnJldmVyc2VDb2xvcigpOworICAgICAgT1MgPDwgdG9fcHJpbnQ7CisgICAgICB0b19wcmludC5jbGVhcigpOworICAgICAgaWYgKERpYWdPcHRzLlNob3dDb2xvcnMpCisgICAgICAgIE9TLnJlc2V0Q29sb3IoKTsKKyAgICB9CisgICAgCisgICAgcHJpbnRfcmV2ZXJzZWQgPSAhd2FzX3ByaW50YWJsZTsKKyAgICB0b19wcmludCArPSByZXMuZmlyc3Quc3RyKCk7CisgIH0KKyAgCisgIGlmIChwcmludF9yZXZlcnNlZCAmJiBEaWFnT3B0cy5TaG93Q29sb3JzKQorICAgIE9TLnJldmVyc2VDb2xvcigpOworICBPUyA8PCB0b19wcmludDsKKyAgaWYgKHByaW50X3JldmVyc2VkICYmIERpYWdPcHRzLlNob3dDb2xvcnMpCisgICAgT1MucmVzZXRDb2xvcigpOworICAKKyAgT1MgPDwgJ1xuJzsKK30KKwogLy8vIFxicmllZiBIaWdobGlnaHQgYSBTb3VyY2VSYW5nZSAod2l0aCB+J3MpIGZvciBhbnkgY2hhcmFjdGVycyBvbiBMaW5lTm8uCiB2b2lkIFRleHREaWFnbm9zdGljOjpoaWdobGlnaHRSYW5nZShjb25zdCBDaGFyU291cmNlUmFuZ2UgJlIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lTm8sIEZpbGVJRCBGSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmU291cmNlTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZUNvbHVtbk1hcCAmbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJkNhcmV0TGluZSkgewotICBhc3NlcnQoQ2FyZXRMaW5lLnNpemUoKSA9PSBTb3VyY2VMaW5lLnNpemUoKSAmJgotICAgICAgICAgIkV4cGVjdCBhIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gc291cmNlIGFuZCBjYXJldCBsaW5lISIpOwogICBpZiAoIVIuaXNWYWxpZCgpKSByZXR1cm47CiAKICAgU291cmNlTG9jYXRpb24gQmVnaW4gPSBTTS5nZXRFeHBhbnNpb25Mb2MoUi5nZXRCZWdpbigpKTsKQEAgLTcxNCwxNSArMTAyNSwxNyBAQAogICAvLyBDaGVjayB0aGF0IGEgdG9rZW4gcmFuZ2UgZG9lcyBub3QgaGlnaGxpZ2h0IG9ubHkgd2hpdGVzcGFjZS4KICAgaWYgKFIuaXNUb2tlblJhbmdlKCkpIHsKICAgICAvLyBQaWNrIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjb2x1bW4uCi0gICAgd2hpbGUgKFN0YXJ0Q29sTm8gPCBTb3VyY2VMaW5lLnNpemUoKSAmJgotICAgICAgICAgICAoU291cmNlTGluZVtTdGFydENvbE5vXSA9PSAnICcgfHwgU291cmNlTGluZVtTdGFydENvbE5vXSA9PSAnXHQnKSkKKyAgICB3aGlsZSAoU3RhcnRDb2xObyA8IG1hcC5nZXRTb3VyY2VMaW5lKCkuc2l6ZSgpICYmCisgICAgICAgICAgIChtYXAuZ2V0U291cmNlTGluZSgpW1N0YXJ0Q29sTm9dID09ICcgJyB8fAorICAgICAgICAgICAgbWFwLmdldFNvdXJjZUxpbmUoKVtTdGFydENvbE5vXSA9PSAnXHQnKSkKICAgICAgICsrU3RhcnRDb2xObzsKIAogICAgIC8vIFBpY2sgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2UgY29sdW1uLgotICAgIGlmIChFbmRDb2xObyA+IFNvdXJjZUxpbmUuc2l6ZSgpKQotICAgICAgRW5kQ29sTm8gPSBTb3VyY2VMaW5lLnNpemUoKTsKKyAgICBpZiAoRW5kQ29sTm8gPiBtYXAuZ2V0U291cmNlTGluZSgpLnNpemUoKSkKKyAgICAgIEVuZENvbE5vID0gbWFwLmdldFNvdXJjZUxpbmUoKS5zaXplKCk7CiAgICAgd2hpbGUgKEVuZENvbE5vLTEgJiYKLSAgICAgICAgICAgKFNvdXJjZUxpbmVbRW5kQ29sTm8tMV0gPT0gJyAnIHx8IFNvdXJjZUxpbmVbRW5kQ29sTm8tMV0gPT0gJ1x0JykpCisgICAgICAgICAgIChtYXAuZ2V0U291cmNlTGluZSgpW0VuZENvbE5vLTFdID09ICcgJyB8fAorICAgICAgICAgICAgbWFwLmdldFNvdXJjZUxpbmUoKVtFbmRDb2xOby0xXSA9PSAnXHQnKSkKICAgICAgIC0tRW5kQ29sTm87CiAKICAgICAvLyBJZiB0aGUgc3RhcnQvZW5kIHBhc3NlZCBlYWNoIG90aGVyLCB0aGVuIHdlIGFyZSB0cnlpbmcgdG8gaGlnaGxpZ2h0IGEKQEAgLTczMiwxNCArMTA0NSwyMCBAQAogICB9CiAKICAgLy8gRmlsbCB0aGUgcmFuZ2Ugd2l0aCB+J3MuCi0gIGZvciAodW5zaWduZWQgaSA9IFN0YXJ0Q29sTm87IGkgPCBFbmRDb2xObzsgKytpKQotICAgIENhcmV0TGluZVtpXSA9ICd+JzsKKyAgU3RhcnRDb2xObyA9IG1hcC5ieXRlVG9Db2x1bW4oU3RhcnRDb2xObyk7CisgIEVuZENvbE5vID0gbWFwLmJ5dGVUb0NvbHVtbihFbmRDb2xObyk7CisKKyAgYXNzZXJ0KFN0YXJ0Q29sTm8gPD0gRW5kQ29sTm8gJiYgIkludmFsaWQgcmFuZ2UhIik7CisgIGlmIChDYXJldExpbmUuc2l6ZSgpIDwgRW5kQ29sTm8pCisgICAgQ2FyZXRMaW5lLnJlc2l6ZShFbmRDb2xObywnICcpOworICBzdGQ6OmZpbGwoQ2FyZXRMaW5lLmJlZ2luKCkrU3RhcnRDb2xObyxDYXJldExpbmUuYmVnaW4oKStFbmRDb2xObywnficpOwogfQogCi1zdGQ6OnN0cmluZyBUZXh0RGlhZ25vc3RpYzo6YnVpbGRGaXhJdEluc2VydGlvbkxpbmUodW5zaWduZWQgTGluZU5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmVTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5lRW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEZpeEl0SGludD4gSGludHMpIHsKK3N0ZDo6c3RyaW5nIFRleHREaWFnbm9zdGljOjpidWlsZEZpeEl0SW5zZXJ0aW9uTGluZSgKKyAgdW5zaWduZWQgTGluZU5vLAorICBjb25zdCBTb3VyY2VDb2x1bW5NYXAgJm1hcCwKKyAgQXJyYXlSZWY8Rml4SXRIaW50PiBIaW50cykgeworCiAgIHN0ZDo6c3RyaW5nIEZpeEl0SW5zZXJ0aW9uTGluZTsKICAgaWYgKEhpbnRzLmVtcHR5KCkgfHwgIURpYWdPcHRzLlNob3dGaXhpdHMpCiAgICAgcmV0dXJuIEZpeEl0SW5zZXJ0aW9uTGluZTsKQEAgLTc1NSwxMyArMTA3NCwzMiBAQAogICAgICAgICAvLyBJbnNlcnQgdGhlIG5ldyBjb2RlIGludG8gdGhlIGxpbmUganVzdCBiZWxvdyB0aGUgY29kZQogICAgICAgICAvLyB0aGF0IHRoZSB1c2VyIHdyb3RlLgogICAgICAgICB1bnNpZ25lZCBIaW50Q29sTm8KLSAgICAgICAgICA9IFNNLmdldENvbHVtbk51bWJlcihIaW50TG9jSW5mby5maXJzdCwgSGludExvY0luZm8uc2Vjb25kKTsKKyAgICAgICAgICA9IFNNLmdldENvbHVtbk51bWJlcihIaW50TG9jSW5mby5maXJzdCwgSGludExvY0luZm8uc2Vjb25kKSAtIDE7CisgICAgICAgIC8vIGhpbnQgbXVzdCBzdGFydCBpbnNpZGUgdGhlIHNvdXJjZSBvciByaWdodCBhdCB0aGUgZW5kCisgICAgICAgIGFzc2VydChIaW50Q29sTm88c3RhdGljX2Nhc3Q8dW5zaWduZWQ+KG1hcC5ieXRlcygpKSsxKTsKKyAgICAgICAgSGludENvbE5vID0gbWFwLmJ5dGVUb0NvbHVtbihIaW50Q29sTm8pOworCisgICAgICAgIC8vIEZJWE1FOiBpZiB0aGUgZml4aXQgaW5jbHVkZXMgdGFicyBvciBvdGhlciBjaGFyYWN0ZXJzIHRoYXQgZG8gbm90CisgICAgICAgIC8vICB0YWtlIHVwIGEgc2luZ2xlIGNvbHVtbiBwZXIgYnl0ZSB3aGVuIGRpc3BsYXllZCB0aGVuCisgICAgICAgIC8vICBJLT5Db2RlVG9JbnNlcnQuc2l6ZSgpIGlzIG5vdCBhIGNvbHVtbiBudW1iZXIgYW5kIHdlJ3JlIG1peGluZworICAgICAgICAvLyAgdW5pdHMgKGNvbHVtbnMgKyBieXRlcykuIFdlIHNob3VsZCBnZXQgcHJpbnRhYmxlIHZlcnNpb25zCisgICAgICAgIC8vICBvZiBlYWNoIGZpeGl0IGJlZm9yZSB1c2luZyB0aGVtLgogICAgICAgICB1bnNpZ25lZCBMYXN0Q29sdW1uTW9kaWZpZWQKLSAgICAgICAgICA9IEhpbnRDb2xObyAtIDEgKyBJLT5Db2RlVG9JbnNlcnQuc2l6ZSgpOworICAgICAgICAgID0gSGludENvbE5vICsgSS0+Q29kZVRvSW5zZXJ0LnNpemUoKTsKKworICAgICAgICBpZiAoTGFzdENvbHVtbk1vZGlmaWVkID4gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KG1hcC5ieXRlcygpKSkgeworICAgICAgICAgIHVuc2lnbmVkIExhc3RFeGlzdGluZ0NvbHVtbiA9IG1hcC5ieXRlVG9Db2x1bW4obWFwLmJ5dGVzKCkpOworICAgICAgICAgIHVuc2lnbmVkIEFkZGVkQ29sdW1ucyA9IExhc3RDb2x1bW5Nb2RpZmllZC1MYXN0RXhpc3RpbmdDb2x1bW47CisgICAgICAgICAgTGFzdENvbHVtbk1vZGlmaWVkID0gTGFzdEV4aXN0aW5nQ29sdW1uICsgQWRkZWRDb2x1bW5zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIExhc3RDb2x1bW5Nb2RpZmllZCA9IG1hcC5ieXRlVG9Db2x1bW4oTGFzdENvbHVtbk1vZGlmaWVkKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChMYXN0Q29sdW1uTW9kaWZpZWQgPiBGaXhJdEluc2VydGlvbkxpbmUuc2l6ZSgpKQogICAgICAgICAgIEZpeEl0SW5zZXJ0aW9uTGluZS5yZXNpemUoTGFzdENvbHVtbk1vZGlmaWVkLCAnICcpOworICAgICAgICBhc3NlcnQoSGludENvbE5vK0ktPkNvZGVUb0luc2VydC5zaXplKCkgPD0gRml4SXRJbnNlcnRpb25MaW5lLnNpemUoKSk7CiAgICAgICAgIHN0ZDo6Y29weShJLT5Db2RlVG9JbnNlcnQuYmVnaW4oKSwgSS0+Q29kZVRvSW5zZXJ0LmVuZCgpLAotICAgICAgICAgICAgICAgICAgRml4SXRJbnNlcnRpb25MaW5lLmJlZ2luKCkgKyBIaW50Q29sTm8gLSAxKTsKKyAgICAgICAgICAgICAgICAgIEZpeEl0SW5zZXJ0aW9uTGluZS5iZWdpbigpICsgSGludENvbE5vKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIEZpeEl0SW5zZXJ0aW9uTGluZS5jbGVhcigpOwogICAgICAgICBicmVhazsKQEAgLTc2OSw3MiArMTEwNywxMSBAQAogICAgIH0KICAgfQogCi0gIGlmIChGaXhJdEluc2VydGlvbkxpbmUuZW1wdHkoKSkKLSAgICByZXR1cm4gRml4SXRJbnNlcnRpb25MaW5lOwotCi0gIC8vIE5vdyB0aGF0IHdlIGhhdmUgdGhlIGVudGlyZSBmaXhpdCBsaW5lLCBleHBhbmQgdGhlIHRhYnMgaW4gaXQuCi0gIC8vIFNpbmNlIHdlIGRvbid0IHdhbnQgdG8gaW5zZXJ0IHNwYWNlcyBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZCwKLSAgLy8gZmluZCBlYWNoIHdvcmQgYW5kIHRoZSBjb2x1bW4gaXQgc2hvdWxkIGxpbmUgdXAgd2l0aCBhbmQgaW5zZXJ0Ci0gIC8vIHNwYWNlcyB1bnRpbCB0aGV5IG1hdGNoLgotICB1bnNpZ25lZCBGaXhJdFBvcyA9IDA7Ci0gIHVuc2lnbmVkIExpbmVQb3MgPSAwOwotICB1bnNpZ25lZCBUYWJFeHBhbmRlZENvbCA9IDA7Ci0gIHVuc2lnbmVkIExpbmVMZW5ndGggPSBMaW5lRW5kIC0gTGluZVN0YXJ0OwotCi0gIHdoaWxlIChGaXhJdFBvcyA8IEZpeEl0SW5zZXJ0aW9uTGluZS5zaXplKCkgJiYgTGluZVBvcyA8IExpbmVMZW5ndGgpIHsKLSAgICAvLyBGaW5kIHRoZSBuZXh0IHdvcmQgaW4gdGhlIEZpeEl0IGxpbmUuCi0gICAgd2hpbGUgKEZpeEl0UG9zIDwgRml4SXRJbnNlcnRpb25MaW5lLnNpemUoKSAmJgotICAgICAgICAgICBGaXhJdEluc2VydGlvbkxpbmVbRml4SXRQb3NdID09ICcgJykKLSAgICAgICsrRml4SXRQb3M7Ci0gICAgdW5zaWduZWQgQ2hhckRpc3RhbmNlID0gRml4SXRQb3MgLSBUYWJFeHBhbmRlZENvbDsKLQotICAgIC8vIFdhbGsgZm9yd2FyZCBpbiB0aGUgc291cmNlIGxpbmUsIGtlZXBpbmcgdHJhY2sgb2YKLSAgICAvLyB0aGUgdGFiLWV4cGFuZGVkIGNvbHVtbi4KLSAgICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJIDwgQ2hhckRpc3RhbmNlOyArK0ksICsrTGluZVBvcykKLSAgICAgIGlmIChMaW5lUG9zID49IExpbmVMZW5ndGggfHwgTGluZVN0YXJ0W0xpbmVQb3NdICE9ICdcdCcpCi0gICAgICAgICsrVGFiRXhwYW5kZWRDb2w7Ci0gICAgICBlbHNlCi0gICAgICAgIFRhYkV4cGFuZGVkQ29sID0KLSAgICAgICAgICAoVGFiRXhwYW5kZWRDb2wvRGlhZ09wdHMuVGFiU3RvcCArIDEpICogRGlhZ09wdHMuVGFiU3RvcDsKLQotICAgIC8vIEFkanVzdCB0aGUgZml4aXQgbGluZSB0byBtYXRjaCB0aGlzIGNvbHVtbi4KLSAgICBGaXhJdEluc2VydGlvbkxpbmUuaW5zZXJ0KEZpeEl0UG9zLCBUYWJFeHBhbmRlZENvbC1GaXhJdFBvcywgJyAnKTsKLSAgICBGaXhJdFBvcyA9IFRhYkV4cGFuZGVkQ29sOwotCi0gICAgLy8gV2FsayB0byB0aGUgZW5kIG9mIHRoZSB3b3JkLgotICAgIHdoaWxlIChGaXhJdFBvcyA8IEZpeEl0SW5zZXJ0aW9uTGluZS5zaXplKCkgJiYKLSAgICAgICAgICAgRml4SXRJbnNlcnRpb25MaW5lW0ZpeEl0UG9zXSAhPSAnICcpCi0gICAgICArK0ZpeEl0UG9zOwotICB9CisgIGV4cGFuZFRhYnMoRml4SXRJbnNlcnRpb25MaW5lLCBEaWFnT3B0cy5UYWJTdG9wKTsKIAogICByZXR1cm4gRml4SXRJbnNlcnRpb25MaW5lOwogfQogCi12b2lkIFRleHREaWFnbm9zdGljOjpleHBhbmRUYWJzKHN0ZDo6c3RyaW5nICZTb3VyY2VMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmQ2FyZXRMaW5lKSB7Ci0gIC8vIFNjYW4gdGhlIHNvdXJjZSBsaW5lLCBsb29raW5nIGZvciB0YWJzLiAgSWYgd2UgZmluZCBhbnksIG1hbnVhbGx5IGV4cGFuZAotICAvLyB0aGVtIHRvIHNwYWNlcyBhbmQgdXBkYXRlIHRoZSBDYXJldExpbmUgdG8gbWF0Y2guCi0gIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gU291cmNlTGluZS5zaXplKCk7ICsraSkgewotICAgIGlmIChTb3VyY2VMaW5lW2ldICE9ICdcdCcpIGNvbnRpbnVlOwotCi0gICAgLy8gUmVwbGFjZSB0aGlzIHRhYiB3aXRoIGF0IGxlYXN0IG9uZSBzcGFjZS4KLSAgICBTb3VyY2VMaW5lW2ldID0gJyAnOwotCi0gICAgLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHNwYWNlcyB3ZSBuZWVkIHRvIGluc2VydC4KLSAgICB1bnNpZ25lZCBUYWJTdG9wID0gRGlhZ09wdHMuVGFiU3RvcDsKLSAgICBhc3NlcnQoMCA8IFRhYlN0b3AgJiYgVGFiU3RvcCA8PSBEaWFnbm9zdGljT3B0aW9uczo6TWF4VGFiU3RvcCAmJgotICAgICAgICAgICAiSW52YWxpZCAtZnRhYnN0b3AgdmFsdWUiKTsKLSAgICB1bnNpZ25lZCBOdW1TcGFjZXMgPSAoKGkrVGFiU3RvcCkvVGFiU3RvcCAqIFRhYlN0b3ApIC0gKGkrMSk7Ci0gICAgYXNzZXJ0KE51bVNwYWNlcyA8IFRhYlN0b3AgJiYgIkludmFsaWQgY29tcHV0YXRpb24gb2Ygc3BhY2UgYW10Iik7Ci0KLSAgICAvLyBJbnNlcnQgc3BhY2VzIGludG8gdGhlIFNvdXJjZUxpbmUuCi0gICAgU291cmNlTGluZS5pbnNlcnQoaSsxLCBOdW1TcGFjZXMsICcgJyk7Ci0KLSAgICAvLyBJbnNlcnQgc3BhY2VzIG9yIH4ncyBpbnRvIENhcmV0TGluZS4KLSAgICBDYXJldExpbmUuaW5zZXJ0KGkrMSwgTnVtU3BhY2VzLCBDYXJldExpbmVbaV0gPT0gJ34nID8gJ34nIDogJyAnKTsKLSAgfQotfQotCiB2b2lkIFRleHREaWFnbm9zdGljOjplbWl0UGFyc2VhYmxlRml4aXRzKEFycmF5UmVmPEZpeEl0SGludD4gSGludHMpIHsKICAgaWYgKCFEaWFnT3B0cy5TaG93UGFyc2VhYmxlRml4aXRzKQogICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL3Rlc3QvTWlzYy9tZXNzYWdlLWxlbmd0aC5jIGIvdGVzdC9NaXNjL21lc3NhZ2UtbGVuZ3RoLmMKaW5kZXggM2U2OWI2YS4uYTZmNGY0NCAxMDA2NDQKLS0tIGEvdGVzdC9NaXNjL21lc3NhZ2UtbGVuZ3RoLmMKKysrIGIvdGVzdC9NaXNjL21lc3NhZ2UtbGVuZ3RoLmMKQEAgLTI3LDkgKzI3LDggQEAKIAogI3ByYWdtYSBTVERDIENYX0xJTUlURURfUkFOR0UgICAgLy8gc29tZSBsb25nIGNvbW1lbnQgdGV4dCBhbmQgYSBicmFjZSwgZWgge30KIAotCiAvLyBDSEVDSzogRklMRToyMzo3OAotLy8gQ0hFQ0s6IHt7XiAgLi4uLy8gc29tZSBsb25nIGNvbW1lbnQgdGV4dCBhbmQgYSBicmFjZSwgZWgge30gfX0KKy8vIENIRUNLOiB7e14gIC4uLi8vIHNvbWUgbG9uZyBjb21tZW50IHRleHQgYW5kIGEgYnJhY2UsIGVoIHt9fX0KIAogc3RydWN0IEEgeyBpbnQgeDsgfTsKIHZvaWQgaChzdHJ1Y3QgQSAqYSkgewpkaWZmIC0tZ2l0IGEvdGVzdC9NaXNjL3VucHJpbnRhYmxlLmMgYi90ZXN0L01pc2MvdW5wcmludGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjA1MDNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9NaXNjL3VucHJpbnRhYmxlLmMKQEAgLTAsMCArMSwxNiBAQAorLy8gUlVOOiAlY2xhbmdfY2MxICVzIDI+JjEgfCBGaWxlQ2hlY2sgLXN0cmljdC13aGl0ZXNwYWNlICVzCisKK2ludCBtYWluKCkgeworICAgIGludCBpOworICAgIGlmKChpPT0vKvCfkb8qLzEpKTsKKworLy8gQ0hFQ0s6IHt7XiAgICBpZlwoXChpPT0vXCo8VVwrMUY0N0Y+XCovMVwpXCk7fX0KKworLy8gQ0hFQ0s6IHt7XiAgICAgICAgflxefn5+fn5+fn5+fn5+fn5+fX0KKy8vIENIRUNLOiB7e14gICAgICAgfiBcXiAgICAgICAgICAgICAgIH59fQorCisgICAgLyog8J+RvyAqLyAi8J+Rv2Jlcmh1bmQiOworCisvLyBDSEVDSzoge3teICAgIC9cKiA8VVwrMUY0N0Y+IFwqLyAiPFVcKzFGNDdGPmJlcmh1bmQiO319CisvLyBDSEVDSzoge3teICAgICAgICAgICAgICAgICAgICBcXn5+fn5+fn5+fn5+fn5+fn5+fX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L01pc2Mvd3JvbmctZW5jb2RpbmcuYyBiL3Rlc3QvTWlzYy93cm9uZy1lbmNvZGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMWNmM2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01pc2Mvd3JvbmctZW5jb2RpbmcuYwpAQCAtMCwwICsxLDE2IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAlcyAyPiYxIHwgRmlsZUNoZWNrIC1zdHJpY3Qtd2hpdGVzcGFjZSAlcworCit2b2lkIGZvbygpIHsKKworICAip8MiOyAvLyD4CisvLyBDSEVDSzoge3teICAiPEE3PjxDMz4iOyAvLyA8Rjg+fX0KKy8vIENIRUNLOiB7e14gIFxefX0KKworICAvKiD+qyAqLyBjb25zdCBjaGFyICpkID0gIqUiOworCisvLyBDSEVDSzoge3teICAvXCogPEZFPjxBQj4gXCovIGNvbnN0IGNoYXIgXCpkID0gIjxBNT4iO319CisvLyBDSEVDSzoge3teICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF59fQorCisvLyBDSEVDSzoge3teICAiPEE3PjxDMz4iOyAvLyA8Rjg+fX0KKy8vIENIRUNLOiB7e14gIFxefn5+fn5+fn5+fX0KK30K