ZGlmZiAtLWdpdCBhL3NyYy9ndWlfbW90aWYuYyBiL3NyYy9ndWlfbW90aWYuYwppbmRleCA0ZmUyNmVjLi5kMzQ1YWY1IDEwMDY0NAotLS0gYS9zcmMvZ3VpX21vdGlmLmMKKysrIGIvc3JjL2d1aV9tb3RpZi5jCkBAIC05Myw5ICs5Myw2IEBACiAKIHN0YXRpYyB2b2lkIGd1aV9tb3RpZl9tZW51X2NvbG9ycyBfX0FSR1MoKFdpZGdldCBpZCkpOwogc3RhdGljIHZvaWQgZ3VpX21vdGlmX3Njcm9sbF9jb2xvcnMgX19BUkdTKChXaWRnZXQgaWQpKTsKLSNpZmRlZiBGRUFUX01FTlUKLXN0YXRpYyB2b2lkIGd1aV9tb3RpZl9tZW51X2ZvbnRsaXN0IF9fQVJHUygoV2lkZ2V0IGlkKSk7Ci0jZW5kaWYKIAogI2lmIChYbVZlcnNpb24gPj0gMTAwMikKICMgZGVmaW5lIFNUUklOR19UQUcgIFhtRk9OVExJU1RfREVGQVVMVF9UQUcKQEAgLTEyNSwxNyArMTIyLDEyMiBAQAogICAgIGd1aV9kcmFnX3Njcm9sbGJhcihzYiwgdmFsdWUsIGRyYWdnaW5nKTsKIH0KIAotCiAvKgogICogRW5kIG9mIGNhbGwtYmFjayByb3V0aW5lcwogICovCiAKKyNpZm5kZWYgTEVTU1RJRl9WRVJTSU9OCisvKgorICogSW1wbGVtZW50IHRocmVlIGRpbWVuc2lvbmFsIHNoYWRpbmcgb2YgaW5zZW5zaXRpdmUgbGFiZWxzLgorICogQnkgTWFydGluIERhbGVja2kuCisgKi8KKworI2luY2x1ZGUgPFhtL1htUC5oPgorI2luY2x1ZGUgPFhtL0xhYmVsUC5oPgorCitzdGF0aWMgWHRFeHBvc2VQcm9jIG9sZF9sYWJlbF9leHBvc2UgPSBOVUxMOworCitzdGF0aWMgdm9pZCBsYWJlbF9leHBvc2UgX19BUkdTKChXaWRnZXQgX3csIFhFdmVudCAqX2V2ZW50LCBSZWdpb24gX3JlZ2lvbikpOworCisgICAgc3RhdGljIHZvaWQKK2xhYmVsX2V4cG9zZShfdywgX2V2ZW50LCBfcmVnaW9uKQorICAgIFdpZGdldAlfdzsKKyAgICBYRXZlbnQJKl9ldmVudDsKKyAgICBSZWdpb24JX3JlZ2lvbjsKK3sKKyAgICBHQwkJICAgIGluc2Vuc2l0aXZlR0M7CisgICAgWG1MYWJlbFdpZGdldCAgIGx3ID0gKFhtTGFiZWxXaWRnZXQpX3c7CisgICAgdW5zaWduZWQgY2hhciAgIGxhYmVsX3R5cGUgPSBYbVNUUklORzsKKworICAgIFh0VmFHZXRWYWx1ZXMoX3csIFhtTmxhYmVsVHlwZSwgJmxhYmVsX3R5cGUsIChYdFBvaW50ZXIpMCk7CisKKyAgICBpZiAoWHRJc1NlbnNpdGl2ZShfdykgfHwgbGFiZWxfdHlwZSAhPSBYbVNUUklORykKKwkoKm9sZF9sYWJlbF9leHBvc2UpKF93LCBfZXZlbnQsIF9yZWdpb24pOworICAgIGVsc2UKKyAgICB7CisJWEdDVmFsdWVzICAgdmFsdWVzOworCVh0R0NNYXNrICAgIG1hc2s7CisJWHRHQ01hc2sgICAgZHluYW1pYzsKKwlYRm9udFN0cnVjdCAqZnM7CisKKwlfWG1Gb250TGlzdEdldERlZmF1bHRGb250KGx3LT5sYWJlbC5mb250LCAmZnMpOworCisJLyogRklYTUU6IHdlIHNob3VsZCBiZSBkb2luZyB0aGUgd2hvbGUgZHJhd2luZyBvdXJzZWxmIGhlcmUuICovCisJaW5zZW5zaXRpdmVHQyA9IGx3LT5sYWJlbC5pbnNlbnNpdGl2ZV9HQzsKKworCW1hc2sgPSBHQ0ZvcmVncm91bmQgfCBHQ0JhY2tncm91bmQgfCBHQ0dyYXBoaWNzRXhwb3N1cmVzOworCWR5bmFtaWMgPSBHQ0NsaXBNYXNrIHwgR0NDbGlwWE9yaWdpbiB8IEdDQ2xpcFlPcmlnaW47CisJdmFsdWVzLmdyYXBoaWNzX2V4cG9zdXJlcyA9IEZhbHNlOworCisJaWYgKGZzICE9IDApCisJeworCSAgICBtYXNrIHw9IEdDRm9udDsKKwkgICAgdmFsdWVzLmZvbnQgPSBmcy0+ZmlkOworCX0KKworCWlmIChsdy0+cHJpbWl0aXZlLnRvcF9zaGFkb3dfcGl4bWFwICE9IE5vbmUKKwkJJiYgbHctPnByaW1pdGl2ZS50b3Bfc2hhZG93X3BpeG1hcCAhPSBYbVVOU1BFQ0lGSUVEX1BJWE1BUCkKKwl7CisJICAgIG1hc2sgfD0gR0NGaWxsU3R5bGUgfCBHQ1RpbGU7CisJICAgIHZhbHVlcy5maWxsX3N0eWxlID0gRmlsbFRpbGVkOworCSAgICB2YWx1ZXMudGlsZSA9IGx3LT5wcmltaXRpdmUudG9wX3NoYWRvd19waXhtYXA7CisJfQorCisJbHctPmxhYmVsLlRleHRSZWN0LnggKz0gMTsKKwlsdy0+bGFiZWwuVGV4dFJlY3QueSArPSAxOworCWlmIChsdy0+bGFiZWwuX2FjY190ZXh0ICE9IDApCisJeworCSAgICBsdy0+bGFiZWwuYWNjX1RleHRSZWN0LnggKz0gMTsKKwkgICAgbHctPmxhYmVsLmFjY19UZXh0UmVjdC55ICs9IDE7CisJfQorCisJdmFsdWVzLmZvcmVncm91bmQgPSBsdy0+cHJpbWl0aXZlLnRvcF9zaGFkb3dfY29sb3I7CisJdmFsdWVzLmJhY2tncm91bmQgPSBsdy0+Y29yZS5iYWNrZ3JvdW5kX3BpeGVsOworCisJbHctPmxhYmVsLmluc2Vuc2l0aXZlX0dDID0KKwkJICAgICAgWHRBbGxvY2F0ZUdDKChXaWRnZXQpIGx3LCAwLCBtYXNrLCAmdmFsdWVzLCBkeW5hbWljLCAwKTsKKwkoKm9sZF9sYWJlbF9leHBvc2UpKF93LCBfZXZlbnQsIF9yZWdpb24pOworCVh0UmVsZWFzZUdDKF93LCBsdy0+bGFiZWwuaW5zZW5zaXRpdmVfR0MpOworCisJbHctPmxhYmVsLlRleHRSZWN0LnggLT0gMTsKKwlsdy0+bGFiZWwuVGV4dFJlY3QueSAtPSAxOworCWlmIChsdy0+bGFiZWwuX2FjY190ZXh0ICE9IDApCisJeworCSAgICBsdy0+bGFiZWwuYWNjX1RleHRSZWN0LnggLT0gMTsKKwkgICAgbHctPmxhYmVsLmFjY19UZXh0UmVjdC55IC09IDE7CisJfQorCisJdmFsdWVzLmZvcmVncm91bmQgPSBsdy0+cHJpbWl0aXZlLmJvdHRvbV9zaGFkb3dfY29sb3I7CisJdmFsdWVzLmJhY2tncm91bmQgPSBsdy0+Y29yZS5iYWNrZ3JvdW5kX3BpeGVsOworCisJbHctPmxhYmVsLmluc2Vuc2l0aXZlX0dDID0KKwkJICAgICAgWHRBbGxvY2F0ZUdDKChXaWRnZXQpIGx3LCAwLCBtYXNrLCAmdmFsdWVzLCBkeW5hbWljLCAwKTsKKwkoKm9sZF9sYWJlbF9leHBvc2UpKF93LCBfZXZlbnQsIF9yZWdpb24pOworCVh0UmVsZWFzZUdDKF93LCBsdy0+bGFiZWwuaW5zZW5zaXRpdmVfR0MpOworCisJbHctPmxhYmVsLmluc2Vuc2l0aXZlX0dDID0gaW5zZW5zaXRpdmVHQzsKKyAgICB9Cit9CisjZW5kaWYKKworCiAvKgogICogQ3JlYXRlIGFsbCB0aGUgbW90aWYgd2lkZ2V0cyBuZWNlc3NhcnkuCiAgKi8KICAgICB2b2lkCiBndWlfeDExX2NyZWF0ZV93aWRnZXRzKCkKIHsKKyNpZm5kZWYgTEVTU1RJRl9WRVJTSU9OCisgICAgLyoKKyAgICAgKiBJbnN0YWxsIHRoZSAzRCBzaGFkZSBlZmZlY3QgZHJhd2luZyByb3V0aW5lcy4KKyAgICAgKi8KKyAgICBpZiAob2xkX2xhYmVsX2V4cG9zZSA9PSBOVUxMKQorICAgIHsKKwlvbGRfbGFiZWxfZXhwb3NlID0geG1MYWJlbFdpZGdldENsYXNzLT5jb3JlX2NsYXNzLmV4cG9zZTsKKwl4bUxhYmVsV2lkZ2V0Q2xhc3MtPmNvcmVfY2xhc3MuZXhwb3NlID0gbGFiZWxfZXhwb3NlOworICAgIH0KKyNlbmRpZgorCiAgICAgLyoKICAgICAgKiBTdGFydCBvdXQgYnkgYWRkaW5nIHRoZSBjb25maWd1cmVkIGJvcmRlciB3aWR0aCBpbnRvIHRoZSBib3JkZXIgb2Zmc2V0CiAgICAgICovCkBAIC0zMjksOSArNDMxLDcgQEAKICAqIE1hbmFnZSBkaWFsb2cgY2VudGVyZWQgb24gcG9pbnRlci4gVGhpcyBjb3VsZCBiZSB1c2VkIGJ5IHRoZSBBdGhlbmEgY29kZSBhcwogICogd2VsbC4KICAqLwotc3RhdGljIHZvaWQgbWFuYWdlX2NlbnRlcmVkIF9fQVJHUygoV2lkZ2V0IGRpYWxvZ19jaGlsZCkpOwotCi1zdGF0aWMgdm9pZAorICAgIHZvaWQKIG1hbmFnZV9jZW50ZXJlZChkaWFsb2dfY2hpbGQpCiAgICAgV2lkZ2V0IGRpYWxvZ19jaGlsZDsKIHsKQEAgLTg1NSwxNiArOTU1LDE1IEBACiAJICAgIHhtcyA9IFhtU3RyaW5nQ3JlYXRlKChjaGFyICopbWVudS0+ZG5hbWUsIFNUUklOR19UQUcpOwogCSAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5sYWJlbFN0cmluZywgeG1zKTsgbisrOwogCi0jaWZuZGVmIEZFQVRfU1VOX1dPUktTSE9QCi0KIAkgICAgLyogV2l0aG91dCBzaGFkb3dzIG9uZSBjYW4ndCBzZW5zZSB3aGF0ZXZlciB0aGUgYnV0dG9uIGhhcyBiZWVuCiAJICAgICAqIHByZXNzZWQgb3Igbm90ISBIb3dldmVyIHdlIHdhbid0IHRvIHNhdmUgYSBiaXQgb2Ygc3BhY2UuLi4KKwkgICAgICogTmVlZCB0aGUgaGlnaGxpZ2h0VGhpY2tuZXNzIHRvIHNlZSB0aGUgZm9jdXMuCiAJICAgICAqLwotCSAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5oaWdobGlnaHRUaGlja25lc3MsIDApOyBuKys7CisJICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmhpZ2hsaWdodFRoaWNrbmVzcywgMSk7IG4rKzsKIAkgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1OaGlnaGxpZ2h0T25FbnRlciwgVHJ1ZSk7IG4rKzsKIAkgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1ObWFyZ2luV2lkdGgsIDApOyBuKys7CiAJICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTm1hcmdpbkhlaWdodCwgMCk7IG4rKzsKLSNlbmRpZgorCiAJICAgIGlmIChtZW51LT5pbWFnZSA9PSAwKQogCSAgICB7CiAJCVh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmxhYmVsVHlwZSwgWG1TVFJJTkcpOyBuKys7CkBAIC0xMzg0LDcgKzE0ODMsNiBAQAogICAgIGludAkJbjsKIAogICAgIG4gPSAwOwotICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTnNoYWRvd1RoaWNrbmVzcywgMSk7IG4rKzsKICAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5taW5pbXVtLCAwKTsgbisrOwogICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTm9yaWVudGF0aW9uLAogCSAgICAob3JpZW50ID09IFNCQVJfVkVSVCkgPyBYbVZFUlRJQ0FMIDogWG1IT1JJWk9OVEFMKTsgbisrOwpAQCAtMTQ4NCw2ICsxNTgyLDIxOSBAQAogICAgIHJldHVybihYdFdpbmRvdyh0ZXh0QXJlYSkpOwogfQogCisvKgorICogTG9vayBmb3IgYSB3aWRnZXQgaW4gdGhlIHdpZGdldCB0cmVlIHcsIHdpdGggYSBtbmVtb25pYyBtYXRjaGluZyBrZXljb2RlLgorICogV2hlbiBvbmUgaXMgZm91bmQsIHNpbXVsYXRlIGEgYnV0dG9uIHByZXNzIG9uIHRoYXQgd2lkZ2V0IGFuZCBnaXZlIGl0IHRoZQorICoga2V5Ym9hcmQgZm9jdXMuICBJZiB0aGUgbW5lbW9uaWMgaXMgb24gYSBsYWJlbCwgbG9vayBpbiB0aGUgdXNlckRhdGEgZmllbGQKKyAqIG9mIHRoZSBsYWJlbCB0byBzZWUgaWYgaXQgcG9pbnRzIHRvIGFub3RoZXIgd2lkZ2V0LCBhbmQgZ2l2ZSB0aGF0IHRoZSBmb2N1cy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitkb19tbmVtb25pYyhXaWRnZXQgdywgdW5zaWduZWQgaW50IGtleWNvZGUpCit7CisgICAgV2lkZ2V0TGlzdAkgICAgY2hpbGRyZW47CisgICAgaW50CQkgICAgbnVtQ2hpbGRyZW4sIGk7CisgICAgQm9vbGVhbgkgICAgaXNNZW51OworICAgIEtleVN5bQkgICAgbW5lbW9uaWMgPSAnXDAnOworICAgIGNoYXIJICAgIG1uZVN0cmluZ1syXTsKKyAgICBXaWRnZXQJICAgIHVzZXJEYXRhOworICAgIHVuc2lnbmVkIGNoYXIgICByb3dDb2xUeXBlOworCisgICAgaWYgKFh0SXNDb21wb3NpdGUodykpCisgICAgeworCWlmIChYdENsYXNzKHcpID09IHhtUm93Q29sdW1uV2lkZ2V0Q2xhc3MpCisJeworCSAgICBYdFZhR2V0VmFsdWVzKHcsIFhtTnJvd0NvbHVtblR5cGUsICZyb3dDb2xUeXBlLCAwKTsKKwkgICAgaXNNZW51ID0gKHJvd0NvbFR5cGUgIT0gKHVuc2lnbmVkIGNoYXIpWG1XT1JLX0FSRUEpOworCX0KKwllbHNlCisJICAgIGlzTWVudSA9IEZhbHNlOworCWlmICghaXNNZW51KQorCXsKKwkgICAgWHRWYUdldFZhbHVlcyh3LCBYbU5jaGlsZHJlbiwgJmNoaWxkcmVuLCBYbU5udW1DaGlsZHJlbiwKKwkJCSAgJm51bUNoaWxkcmVuLCAwKTsKKwkgICAgZm9yIChpID0gMDsgaSA8IG51bUNoaWxkcmVuOyBpKyspCisJCWRvX21uZW1vbmljKGNoaWxkcmVuW2ldLCBrZXljb2RlKTsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJWHRWYUdldFZhbHVlcyh3LCBYbU5tbmVtb25pYywgJm1uZW1vbmljLCAwKTsKKwlpZiAobW5lbW9uaWMgIT0gJ1wwJykKKwl7CisJICAgIG1uZVN0cmluZ1swXSA9IG1uZW1vbmljOworCSAgICBtbmVTdHJpbmdbMV0gPSAnXDAnOworCSAgICBpZiAoWEtleXN5bVRvS2V5Y29kZShYdERpc3BsYXkoWHRQYXJlbnQodykpLAorCQkJCSAgICAgICBYU3RyaW5nVG9LZXlzeW0obW5lU3RyaW5nKSkgPT0ga2V5Y29kZSkKKwkgICAgeworCQlpZiAoWHRDbGFzcyh3KSA9PSB4bUxhYmVsV2lkZ2V0Q2xhc3MKKwkJCXx8IFh0Q2xhc3ModykgPT0geG1MYWJlbEdhZGdldENsYXNzKQorCQl7CisJCSAgICBYdFZhR2V0VmFsdWVzKHcsIFhtTnVzZXJEYXRhLCAmdXNlckRhdGEsIDApOworCQkgICAgaWYgKHVzZXJEYXRhICE9IE5VTEwgJiYgWHRJc1dpZGdldCh1c2VyRGF0YSkpCisJCQlYbVByb2Nlc3NUcmF2ZXJzYWwodXNlckRhdGEsIFhtVFJBVkVSU0VfQ1VSUkVOVCk7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBYS2V5UHJlc3NlZEV2ZW50IGtleUV2ZW50OworCisJCSAgICBYbVByb2Nlc3NUcmF2ZXJzYWwodywgWG1UUkFWRVJTRV9DVVJSRU5UKTsKKworCQkgICAgbWVtc2V0KChjaGFyICopICZrZXlFdmVudCwgMCwgc2l6ZW9mKFhLZXlQcmVzc2VkRXZlbnQpKTsKKwkJICAgIGtleUV2ZW50LnR5cGUgPSBLZXlQcmVzczsKKwkJICAgIGtleUV2ZW50LnNlcmlhbCA9IDE7CisJCSAgICBrZXlFdmVudC5zZW5kX2V2ZW50ID0gVHJ1ZTsKKwkJICAgIGtleUV2ZW50LmRpc3BsYXkgPSBYdERpc3BsYXkodyk7CisJCSAgICBrZXlFdmVudC53aW5kb3cgPSBYdFdpbmRvdyh3KTsKKwkJICAgIFh0Q2FsbEFjdGlvblByb2ModywgIkFjdGl2YXRlIiwgKFhFdmVudCAqKSAmIGtleUV2ZW50LAorCQkJCQkJCQkgICAgIE5VTEwsIDApOworCQl9CisJICAgIH0KKwl9CisgICAgfQorfQorCisvKgorICogQ2FsbGJhY2sgcm91dGluZSBmb3IgZGlhbG9nIG1uZW1vbmljIHByb2Nlc3NpbmcuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCittbmVtb25pY19ldmVudChXaWRnZXQgdywgWHRQb2ludGVyIGNhbGxfZGF0YSwgWEtleUV2ZW50ICpldmVudCkKK3sKKyAgICBkb19tbmVtb25pYyh3LCBldmVudC0+a2V5Y29kZSk7Cit9CisKKworLyoKKyAqIFNlYXJjaCB0aGUgd2lkZ2V0IHRyZWUgdW5kZXIgdyBmb3Igd2lkZ2V0cyB3aXRoIG1uZW1vbmljcy4gIFdoZW4gZm91bmQsIGFkZAorICogYSBwYXNzaXZlIGdyYWIgdG8gdGhlIGRpYWxvZyB3aWRnZXQgZm9yIHRoZSBtbmVtb25pYyBjaGFyYWN0ZXIsIHRodXMKKyAqIGRpcmVjdGluZyBtbmVtb25pYyBldmVudHMgdG8gdGhlIGRpYWxvZyB3aWRnZXQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorYWRkX21uZW1vbmljX2dyYWJzKFdpZGdldCBkaWFsb2csIFdpZGdldCB3KQoreworICAgIGNoYXIJICAgIG1uZVN0cmluZ1syXTsKKyAgICBXaWRnZXRMaXN0CSAgICBjaGlsZHJlbjsKKyAgICBpbnQJCSAgICBudW1DaGlsZHJlbiwgaTsKKyAgICBCb29sZWFuCSAgICBpc01lbnU7CisgICAgS2V5U3ltCSAgICBtbmVtb25pYyA9ICdcMCc7CisgICAgdW5zaWduZWQgY2hhciAgIHJvd0NvbFR5cGU7CisKKyAgICBpZiAoWHRJc0NvbXBvc2l0ZSh3KSkKKyAgICB7CisJaWYgKFh0Q2xhc3ModykgPT0geG1Sb3dDb2x1bW5XaWRnZXRDbGFzcykKKwl7CisJICAgIFh0VmFHZXRWYWx1ZXModywgWG1Ocm93Q29sdW1uVHlwZSwgJnJvd0NvbFR5cGUsIDApOworCSAgICBpc01lbnUgPSAocm93Q29sVHlwZSAhPSAodW5zaWduZWQgY2hhcilYbVdPUktfQVJFQSk7CisJfQorCWVsc2UKKwkgICAgaXNNZW51ID0gRmFsc2U7CisJaWYgKCFpc01lbnUpCisJeworCSAgICBYdFZhR2V0VmFsdWVzKHcsIFhtTmNoaWxkcmVuLCAmY2hpbGRyZW4sIFhtTm51bUNoaWxkcmVuLAorCQkJCQkJCSAgICAgJm51bUNoaWxkcmVuLCAwKTsKKwkgICAgZm9yIChpID0gMDsgaSA8IG51bUNoaWxkcmVuOyBpKyspCisJCWFkZF9tbmVtb25pY19ncmFicyhkaWFsb2csIGNoaWxkcmVuW2ldKTsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJWHRWYUdldFZhbHVlcyh3LCBYbU5tbmVtb25pYywgJm1uZW1vbmljLCAwKTsKKwlpZiAobW5lbW9uaWMgIT0gJ1wwJykKKwl7CisJICAgIG1uZVN0cmluZ1swXSA9IG1uZW1vbmljOworCSAgICBtbmVTdHJpbmdbMV0gPSAnXDAnOworCSAgICBYdEdyYWJLZXkoZGlhbG9nLCBYS2V5c3ltVG9LZXljb2RlKFh0RGlzcGxheShkaWFsb2cpLAorCQkJCQkJICBYU3RyaW5nVG9LZXlzeW0obW5lU3RyaW5nKSksCisJCSAgICBNb2QxTWFzaywgVHJ1ZSwgR3JhYk1vZGVBc3luYywgR3JhYk1vZGVBc3luYyk7CisJfQorICAgIH0KK30KKworLyoKKyAqIEFkZCBhIGhhbmRsZXIgZm9yIG1uZW1vbmljcyBpbiBhIGRpYWxvZy4gIE1vdGlmIGl0c2VsZiBvbmx5IGhhbmRsZXMKKyAqIG1uZW1vbmljcyBpbiBtZW51cy4gTW5lbW9uaWNzIGFkZGVkIG9yIGNoYW5nZWQgYWZ0ZXIgdGhpcyBjYWxsIHdpbGwgYmUKKyAqIGlnbm9yZWQuCisgKgorICogVG8gYWRkIGEgbW5lbW9uaWMgdG8gYSB0ZXh0IGZpZWxkIG9yIGxpc3QsIHNldCB0aGUgWG1ObW5lbW9uaWMgcmVzb3VyY2Ugb24KKyAqIHRoZSBhcHByb3ByaWF0ZSBsYWJlbCBhbmQgc2V0IHRoZSBYbU51c2VyRGF0YSByZXNvdXJjZSBvZiB0aGUgbGFiZWwgdG8gdGhlCisgKiB3aWRnZXQgdG8gZ2V0IHRoZSBmb2N1cyB3aGVuIHRoZSBtbmVtb25pYyBpcyB0eXBlZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCithY3RpdmF0ZV9kaWFsb2dfbW5lbW9uaWNzKFdpZGdldCBkaWFsb2cpCit7CisgICAgaWYgKCFkaWFsb2cpCisJcmV0dXJuOworCisgICAgWHRBZGRFdmVudEhhbmRsZXIoZGlhbG9nLCBLZXlQcmVzc01hc2ssIEZhbHNlLAorCQkJICAgKFh0RXZlbnRIYW5kbGVyKSBtbmVtb25pY19ldmVudCwgKFh0UG9pbnRlcikgTlVMTCk7CisgICAgYWRkX21uZW1vbmljX2dyYWJzKGRpYWxvZywgZGlhbG9nKTsKK30KKworLyoKKyAqIFJlbW92ZXMgdGhlIGV2ZW50IGhhbmRsZXIgYW5kIGtleS1ncmFicyBmb3IgZGlhbG9nIG1uZW1vbmljIGhhbmRsaW5nLgorICovCisgICAgc3RhdGljIHZvaWQKK3N1cHByZXNzX2RpYWxvZ19tbmVtb25pY3MoV2lkZ2V0IGRpYWxvZykKK3sKKyAgICBpZiAoIWRpYWxvZykKKwlyZXR1cm47CisKKyAgICBYdFVuZ3JhYktleShkaWFsb2csIEFueUtleSwgTW9kMU1hc2spOworICAgIFh0UmVtb3ZlRXZlbnRIYW5kbGVyKGRpYWxvZywgS2V5UHJlc3NNYXNrLCBGYWxzZSwKKwkJCSAgIChYdEV2ZW50SGFuZGxlcikgbW5lbW9uaWNfZXZlbnQsIChYdFBvaW50ZXIpIE5VTEwpOworfQorCisjaWYgZGVmaW5lZChGRUFUX0JST1dTRSkgfHwgZGVmaW5lZChGRUFUX0dVSV9ESUFMT0cpCitzdGF0aWMgdm9pZCBzZXRfZm9udGxpc3QgX19BUkdTKChXaWRnZXQgd2cpKTsKKworLyoKKyAqIFVzZSB0aGUgJ2d1aWZvbnQnIG9yICdndWlmb250c2V0JyBhcyBhIGZvbnRsaXN0IGZvciBhIGRpYWxvZyB3aWRnZXQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc2V0X2ZvbnRsaXN0KGlkKQorICAgIFdpZGdldCBpZDsKK3sKKyAgICBYbUZvbnRMaXN0IGZsOworCisjaWZkZWYgRk9OVFNFVF9BTFdBWVMKKyAgICBpZiAoZ3VpLmZvbnRzZXQgIT0gTk9GT05UU0VUKSB7CisJZmwgPSBndWlfbW90aWZfZm9udHNldDJmb250bGlzdCgoWEZvbnRTZXQgKikmZ3VpLmZvbnRzZXQpOworCWlmIChmbCAhPSBOVUxMKQorCXsKKwkgICAgaWYgKFh0SXNNYW5hZ2VkKGlkKSkKKwkgICAgeworCQlYdFVubWFuYWdlQ2hpbGQoaWQpOworCQlYdFZhU2V0VmFsdWVzKGlkLCBYbU5mb250TGlzdCwgZmwsIE5VTEwpOworCQkvKiBXZSBzaG91bGQgZm9yY2UgdGhlIHdpZGdldCB0byByZWNhbGN1bGF0ZSBpdCdzCisJCSAqIGdlb21ldHJ5IG5vdy4gKi8KKwkJWHRNYW5hZ2VDaGlsZChpZCk7CisJICAgIH0KKwkgICAgZWxzZQorCQlYdFZhU2V0VmFsdWVzKGlkLCBYbU5mb250TGlzdCwgZmwsIE5VTEwpOworCSAgICBYbUZvbnRMaXN0RnJlZShmbCk7CisJfQorICAgIH0KKyNlbHNlCisgICAgaWYgKGd1aS5ub3JtX2ZvbnQgIT0gTk9GT05UKSB7CisJZmwgPSBndWlfbW90aWZfY3JlYXRlX2ZvbnRsaXN0KChYRm9udFN0cnVjdCAqKWd1aS5ub3JtX2ZvbnQpOworCWlmIChmbCAhPSBOVUxMKQorCXsKKwkgICAgaWYgKFh0SXNNYW5hZ2VkKGlkKSkKKwkgICAgeworCQlYdFVubWFuYWdlQ2hpbGQoaWQpOworCQlYdFZhU2V0VmFsdWVzKGlkLCBYbU5mb250TGlzdCwgZmwsIE5VTEwpOworCQkvKiBXZSBzaG91bGQgZm9yY2UgdGhlIHdpZGdldCB0byByZWNhbGN1bGF0ZSBpdCdzCisJCSAqIGdlb21ldHJ5IG5vdy4gKi8KKwkJWHRNYW5hZ2VDaGlsZChpZCk7CisJICAgIH0KKwkgICAgZWxzZQorCQlYdFZhU2V0VmFsdWVzKGlkLCBYbU5mb250TGlzdCwgZmwsIE5VTEwpOworCSAgICBYbUZvbnRMaXN0RnJlZShmbCk7CisJfQorICAgIH0KKyNlbmRpZgorfQorI2VuZGlmCiAKICNpZiBkZWZpbmVkKEZFQVRfQlJPV1NFKSB8fCBkZWZpbmVkKFBST1RPKQogCkBAIC0xNTE3LDI5ICsxODI4LDY3IEBACiAgKiAtIGVxdWFsaXplIHRoZSBtZXNzYWdlcyBiZXR3ZWVuIGRpZmZlcmVudCBHVUkgaW1wbGVtZW50YXRpb25zIGFzIGZhciBhcwogICogcG9zc2libGUuCiAgKi8KLXN0YXRpYyB2b2lkIHNldF9wcmVkZWZpbmVkX2xhYmVsIF9fQVJHUygoV2lkZ2V0IHBhcmVudCwgU3RyaW5nIG5hbWUsIGNoYXIgKiBuZXdfbGFiZWwpKTsKK3N0YXRpYyB2b2lkIHNldF9wcmVkZWZpbmVkX2xhYmVsIF9fQVJHUygoV2lkZ2V0IHBhcmVudCwgU3RyaW5nIG5hbWUsIGNoYXIgKm5ld19sYWJlbCkpOwogCiBzdGF0aWMgdm9pZAogc2V0X3ByZWRlZmluZWRfbGFiZWwocGFyZW50LCBuYW1lLCBuZXdfbGFiZWwpCi0gICAgV2lkZ2V0IHBhcmVudDsKLSAgICBTdHJpbmcgbmFtZTsKLSAgICBjaGFyICogbmV3X2xhYmVsOworICAgIFdpZGdldCAgcGFyZW50OworICAgIFN0cmluZyAgbmFtZTsKKyAgICBjaGFyICAgICpuZXdfbGFiZWw7CiB7Ci0gICAgWG1TdHJpbmcgc3RyOwotICAgIFdpZGdldCB3OworICAgIFhtU3RyaW5nCXN0cjsKKyAgICBXaWRnZXQJdzsKKyAgICBjaGFyX3UJKnAsICpuZXh0OworICAgIEtleVN5bQltbmVtb25pYyA9IE5VTDsKIAogICAgIHcgPSBYdE5hbWVUb1dpZGdldChwYXJlbnQsIG5hbWUpOwogCiAgICAgaWYgKCF3KQogCXJldHVybjsKIAotICAgIHN0ciA9IFhtU3RyaW5nQ3JlYXRlKG5ld19sYWJlbCwgU1RSSU5HX1RBRyk7Ci0KLSAgICBpZiAoc3RyKQorICAgIHAgPSB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopbmV3X2xhYmVsKTsKKyAgICBpZiAocCA9PSBOVUxMKQorCXJldHVybjsKKyAgICBmb3IgKG5leHQgPSBwOyAqbmV4dDsgKytuZXh0KQogICAgIHsKLQlYdFZhU2V0VmFsdWVzKHcsIFhtTmxhYmVsU3RyaW5nLCBzdHIsIE5VTEwpOworCWlmICgqbmV4dCA9PSBETEdfSE9US0VZX0NIQVIpCisJeworCSAgICBpbnQgbGVuID0gU1RSTEVOKG5leHQpOworCisJICAgIGlmIChsZW4gPiAwKQorCSAgICB7CisJCW1jaF9tZW1tb3ZlKG5leHQsIG5leHQgKyAxLCBsZW4pOworCQltbmVtb25pYyA9IG5leHRbMF07CisJICAgIH0KKwl9CisgICAgfQorCisgICAgc3RyID0gWG1TdHJpbmdDcmVhdGUoKGNoYXIgKilwLCBTVFJJTkdfVEFHKTsKKyAgICB2aW1fZnJlZShwKTsKKworICAgIGlmIChzdHIgIT0gTlVMTCkKKyAgICB7CisJWHRWYVNldFZhbHVlcyh3LAorCQlYbU5sYWJlbFN0cmluZywgc3RyLAorCQlYbU5tbmVtb25pYywgbW5lbW9uaWMsCisJCU5VTEwpOwogCVhtU3RyaW5nRnJlZShzdHIpOwogICAgIH0KKyAgICBndWlfbW90aWZfbWVudV9mb250bGlzdCh3KTsKK30KKworc3RhdGljIHZvaWQKK3NldF9wcmVkZWZpbmVkX2ZvbnRsaXN0KHBhcmVudCwgbmFtZSkKKyAgICBXaWRnZXQgcGFyZW50OworICAgIFN0cmluZyBuYW1lOworeworICAgIFdpZGdldCB3OworICAgIHcgPSBYdE5hbWVUb1dpZGdldChwYXJlbnQsIG5hbWUpOworCisgICAgaWYgKCF3KQorCXJldHVybjsKKworICAgIHNldF9mb250bGlzdCh3KTsKIH0KIAogLyoKQEAgLTE1NjEsNyArMTkxMCwxMiBAQAogICAgIGNoYXJfdQkqcGF0dGVybjsKICAgICBjaGFyX3UJKnRvZnJlZSA9IE5VTEw7CiAKLSAgICBkaWFsb2dfd2d0ID0gWG1DcmVhdGVGaWxlU2VsZWN0aW9uRGlhbG9nKHZpbVNoZWxsLCAoY2hhciAqKXRpdGxlLCBOVUxMLCAwKTsKKyAgICAvKiBUaGVyZSBhIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcmVzb3VyY2UgbmFtZSBhbmQgdmFsdWUsIFRoZXJlZm9yZSwgd2UKKyAgICAgKiBhdm9pZCB0byAoYWItKXVzZSB0aGUgKG1heWJlIGludGVybmF0aW9uYWxpemVkISkgZGlhbG9nIHRpdGxlIGFzIGEKKyAgICAgKiBkaWFsb2cgbmFtZS4KKyAgICAgKi8KKworICAgIGRpYWxvZ193Z3QgPSBYbUNyZWF0ZUZpbGVTZWxlY3Rpb25EaWFsb2codmltU2hlbGwsICJicm93c2VEaWFsb2ciLCBOVUxMLCAwKTsKIAogICAgIGlmIChpbml0ZGlyID09IE5VTEwgfHwgKmluaXRkaXIgPT0gTlVMKQogICAgIHsKQEAgLTE2MTQsMTUgKzE5NjgsMjEgQEAKIAkgICAgWG1OZGlhbG9nVGl0bGUsIFhtUlN0cmluZywgKGNoYXIgKil0aXRsZSwgU1RSTEVOKHRpdGxlKSArIDEsCiAJTlVMTCk7CiAKLSAgICBzZXRfcHJlZGVmaW5lZF9sYWJlbChkaWFsb2dfd2d0LCAiQXBwbHkiLCBfKCJGaWx0ZXIiKSk7Ci0gICAgc2V0X3ByZWRlZmluZWRfbGFiZWwoZGlhbG9nX3dndCwgIkNhbmNlbCIsIF8oIkNhbmNlbCIpKTsKKyAgICBzZXRfcHJlZGVmaW5lZF9sYWJlbChkaWFsb2dfd2d0LCAiQXBwbHkiLCBfKCImRmlsdGVyIikpOworICAgIHNldF9wcmVkZWZpbmVkX2xhYmVsKGRpYWxvZ193Z3QsICJDYW5jZWwiLCBfKCImQ2FuY2VsIikpOwogICAgIHNldF9wcmVkZWZpbmVkX2xhYmVsKGRpYWxvZ193Z3QsICJEaXIiLCBfKCJEaXJlY3RvcmllcyIpKTsKICAgICBzZXRfcHJlZGVmaW5lZF9sYWJlbChkaWFsb2dfd2d0LCAiRmlsdGVyTGFiZWwiLCBfKCJGaWx0ZXIiKSk7Ci0gICAgc2V0X3ByZWRlZmluZWRfbGFiZWwoZGlhbG9nX3dndCwgIkhlbHAiLCBfKCJIZWxwIikpOworICAgIHNldF9wcmVkZWZpbmVkX2xhYmVsKGRpYWxvZ193Z3QsICJIZWxwIiwgXygiJkhlbHAiKSk7CiAgICAgc2V0X3ByZWRlZmluZWRfbGFiZWwoZGlhbG9nX3dndCwgIkl0ZW1zIiwgXygiRmlsZXMiKSk7Ci0gICAgc2V0X3ByZWRlZmluZWRfbGFiZWwoZGlhbG9nX3dndCwgIk9LIiwgXygiT0siKSk7CisgICAgc2V0X3ByZWRlZmluZWRfbGFiZWwoZGlhbG9nX3dndCwgIk9LIiwgXygiJk9LIikpOwogICAgIHNldF9wcmVkZWZpbmVkX2xhYmVsKGRpYWxvZ193Z3QsICJTZWxlY3Rpb24iLCBfKCJTZWxlY3Rpb24iKSk7CiAKKyAgICAvKiBUaGlzIGlzIHRvIHNhdmUgdXMgZnJvbSBzaWxseSBleHRlcm5hbCBzZXR0aW5ncyB1c2luZyBub3QgZml4ZWQgd2l0aAorICAgICAqIGZvbnRzIGZvciBmaWxlIHNlbGVjdGlvbi4KKyAgICAgKi8KKyAgICBzZXRfcHJlZGVmaW5lZF9mb250bGlzdChkaWFsb2dfd2d0LCAiRGlyTGlzdFNXLkRpckxpc3QiKTsKKyAgICBzZXRfcHJlZGVmaW5lZF9mb250bGlzdChkaWFsb2dfd2d0LCAiSXRlbXNMaXN0U1cuSXRlbXNMaXN0Iik7CisKICAgICBndWlfbW90aWZfbWVudV9jb2xvcnMoZGlhbG9nX3dndCk7CiAgICAgaWYgKGd1aS5zY3JvbGxfYmdfcGl4ZWwgIT0gSU5WQUxDT0xPUikKIAlYdFZhU2V0VmFsdWVzKGRpYWxvZ193Z3QsIFhtTnRyb3VnaENvbG9yLCBndWkuc2Nyb2xsX2JnX3BpeGVsLCBOVUxMKTsKQEAgLTE2MzQsNiArMTk5NCw3IEBACiAJCQkJCSh1bnNpZ25lZCBjaGFyKVhtRElBTE9HX0hFTFBfQlVUVE9OKSk7CiAKICAgICBtYW5hZ2VfY2VudGVyZWQoZGlhbG9nX3dndCk7CisgICAgYWN0aXZhdGVfZGlhbG9nX21uZW1vbmljcyhkaWFsb2dfd2d0KTsKIAogICAgIC8qIHNpdCBpbiBhIGxvb3AgdW50aWwgdGhlIGRpYWxvZyBib3ggaGFzIGdvbmUgYXdheSAqLwogICAgIGRvCkBAIC0xNjQyLDYgKzIwMDMsNyBAQAogCSAgICAoWHRJbnB1dE1hc2spWHRJTUFsbCk7CiAgICAgfSB3aGlsZSAoWHRJc01hbmFnZWQoZGlhbG9nX3dndCkpOwogCisgICAgc3VwcHJlc3NfZGlhbG9nX21uZW1vbmljcyhkaWFsb2dfd2d0KTsKICAgICBYdERlc3Ryb3lXaWRnZXQoZGlhbG9nX3dndCk7CiAgICAgdmltX2ZyZWUodG9mcmVlKTsKIApAQCAtMTc0NiwzMSArMjEwOCw2IEBACiAgICAgZGlhbG9nU3RhdHVzID0gKGludCkobG9uZyljbGllbnRfZGF0YSArIDE7CiB9CiAKLXN0YXRpYyB2b2lkIGd1aV9tb3RpZl9zZXRfZm9udGxpc3QgX19BUkdTKChXaWRnZXQgd2cpKTsKLQotLyoKLSAqIFVzZSB0aGUgJ2d1aWZvbnQnIG9yICdndWlmb250c2V0JyBhcyBhIGZvbnRsaXN0IGZvciBhIGRpYWxvZyB3aWRnZXQuCi0gKi8KLSAgICBzdGF0aWMgdm9pZAotZ3VpX21vdGlmX3NldF9mb250bGlzdCh3ZykKLSAgICBXaWRnZXQgd2c7Ci17Ci0gICAgWG1Gb250TGlzdCBmbDsKLQotICAgIGZsID0KLSNpZmRlZiBGRUFUX1hGT05UU0VUCi0JICAgIGd1aS5mb250c2V0ICE9IE5PRk9OVFNFVCA/Ci0JCSAgICBndWlfbW90aWZfZm9udHNldDJmb250bGlzdCgoWEZvbnRTZXQgKikmZ3VpLmZvbnRzZXQpCi0JCQkJICAgICA6Ci0jZW5kaWYKLQkJICAgIGd1aV9tb3RpZl9jcmVhdGVfZm9udGxpc3QoKFhGb250U3RydWN0ICopZ3VpLm5vcm1fZm9udCk7Ci0gICAgaWYgKGZsICE9IE5VTEwpCi0gICAgewotCVh0VmFTZXRWYWx1ZXMod2csIFhtTmZvbnRMaXN0LCBmbCwgTlVMTCk7Ci0JWG1Gb250TGlzdEZyZWUoZmwpOwotICAgIH0KLX0KLQogI2lmZGVmIEhBVkVfWFBNCiAKIHN0YXRpYyBXaWRnZXQgY3JlYXRlX3BpeG1hcF9sYWJlbChXaWRnZXQgcGFyZW50LCBTdHJpbmcgbmFtZSwgY2hhciAqKmRhdGEsIEFyZ0xpc3QgYXJncywgQ2FyZGluYWwgYXJnKTsKQEAgLTE4NTMsNiArMjE5MCw3IEBACiAgICAgWHRBcHBDb250ZXh0CWFwcDsKICAgICBYbVN0cmluZwkJbGFiZWw7CiAgICAgaW50CQkJYnV0Y291bnQ7CisgICAgV2lkZ2V0CQl3OwogICAgIFdpZGdldAkJZGlhbG9nZm9ybSA9IE5VTEw7CiAgICAgV2lkZ2V0CQlmb3JtID0gTlVMTDsKICAgICBXaWRnZXQJCWRpYWxvZ3RleHRmaWVsZCA9IE5VTEw7CkBAIC0xOTEzLDEwICsyMjUxLDIwIEBACiAgICAgcCA9IGJ1dHM7CiAgICAgZm9yIChidXRjb3VudCA9IDA7ICpwOyArK2J1dGNvdW50KQogICAgIHsKKwlLZXlTeW0gbW5lbW9uaWMgPSBOVUw7CisKIAlmb3IgKG5leHQgPSBwOyAqbmV4dDsgKytuZXh0KQogCXsKIAkgICAgaWYgKCpuZXh0ID09IERMR19IT1RLRVlfQ0hBUikKLQkJbWNoX21lbW1vdmUobmV4dCwgbmV4dCArIDEsIFNUUkxFTihuZXh0KSk7CisJICAgIHsKKwkJaW50IGxlbiA9IFNUUkxFTihuZXh0KTsKKworCQlpZiAobGVuID4gMCkKKwkJeworCQkgICAgbWNoX21lbW1vdmUobmV4dCwgbmV4dCArIDEsIGxlbik7CisJCSAgICBtbmVtb25pYyA9IG5leHRbMF07CisJCX0KKwkgICAgfQogCSAgICBpZiAoKm5leHQgPT0gRExHX0JVVFRPTl9TRVApCiAJICAgIHsKIAkJKm5leHQrKyA9IE5VTDsKQEAgLTE5MzAsMTIgKzIyNzgsMTQgQEAKIAlidXR0b25zW2J1dGNvdW50XSA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJidXR0b24iLAogCQl4bVB1c2hCdXR0b25XaWRnZXRDbGFzcywgZGlhbG9nZm9ybSwKIAkJWG1ObGFiZWxTdHJpbmcsIGxhYmVsLAorCQlYbU5tbmVtb25pYywgbW5lbW9uaWMsCiAJCVhtTmJvdHRvbUF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCiAJCVhtTmJvdHRvbU9mZnNldCwgNCwKIAkJWG1Oc2hvd0FzRGVmYXVsdCwgYnV0Y291bnQgPT0gZGZsdGJ1dHRvbiAtIDEsCiAJCVhtTmRlZmF1bHRCdXR0b25TaGFkb3dUaGlja25lc3MsIDEsCiAJCU5VTEwpOwogCVhtU3RyaW5nRnJlZShsYWJlbCk7CisJZ3VpX21vdGlmX21lbnVfZm9udGxpc3QoYnV0dG9uc1tidXRjb3VudF0pOwogCiAJLyogTGF5b3V0IHByb3Blcmx5LiAqLwogCkBAIC0yMDQxLDcgKzIzOTEsNyBAQAogCQkgICAgWG1OYm90dG9tQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKIAkJICAgIE5VTEwpOwogCi0JZ3VpX21vdGlmX3NldF9mb250bGlzdChkaWFsb2d0ZXh0ZmllbGQpOworCXNldF9mb250bGlzdChkaWFsb2d0ZXh0ZmllbGQpOwogCVhtVGV4dEZpZWxkU2V0U3RyaW5nKGRpYWxvZ3RleHRmaWVsZCwgKGNoYXIgKil0ZXh0ZmllbGQpOwogCVh0TWFuYWdlQ2hpbGQoZGlhbG9ndGV4dGZpZWxkKTsKIAlYdEFkZEV2ZW50SGFuZGxlcihkaWFsb2d0ZXh0ZmllbGQsIEtleVByZXNzTWFzaywgRmFsc2UsCkBAIC0yMDkzLDEzICsyNDQzLDE5IEBACiAgICAgWHRNYW5hZ2VDaGlsZChkaWFsb2dwaXhtYXApOwogI2VuZGlmCiAKLSAgICAvKiBDcmVhdGUgdGhlIGRpYWxvZyBtZXNzYWdlLiAqLwotICAgIGxhYmVsID0gWG1TdHJpbmdMdG9SQ3JlYXRlKChjaGFyICopbWVzc2FnZSwgU1RSSU5HX1RBRyk7CisgICAgLyogQ3JlYXRlIHRoZSBkaWFsb2cgbWVzc2FnZS4KKyAgICAgKiBTaW5jZSBMZXNzVGlmIGlzIGFwcGFyZW50bHkgaGF2aW5nIHByb2JsZW1zIHdpdGggdGhlIGNyZWF0aW9uIG9mCisgICAgICogcHJvcGVybHkgbG9jYWxpemVkIHN0cmluZywgd2UgdXNlIEx0b1IgaGVyZS4gVGhlIHN5bXB0b20gaXMgdGhhdCB0aGUKKyAgICAgKiBzdHJpbmcgc2lsbCBub3Qgc2hvdyBwcm9wZXJseSBpbiBtdWx0aXBsZSBsaW5lcyBhcyBpdCBkb2VzIGluIG5hdGl2ZQorICAgICAqIE1vdGlmLgorICAgICAqLworICAgIGxhYmVsID0gWG1TdHJpbmdDcmVhdGVMdG9SKChjaGFyICopbWVzc2FnZSwgU1RSSU5HX1RBRyk7CiAgICAgaWYgKGxhYmVsID09IE5VTEwpCiAJcmV0dXJuIC0xOwotICAgICh2b2lkKVh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJkaWFsb2dNZXNzYWdlIiwKKyAgICB3ID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImRpYWxvZ01lc3NhZ2UiLAogCQkJCXhtTGFiZWxHYWRnZXRDbGFzcywgZm9ybSwKIAkJCQlYbU5sYWJlbFN0cmluZywgbGFiZWwsCisJCQkJWG1OYWxpZ25tZW50LCBYbUFMSUdOTUVOVF9CRUdJTk5JTkcsCiAJCQkJWG1OdG9wQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKIAkJCQlYbU50b3BPZmZzZXQsIDgsCiAjaWZkZWYgSEFWRV9YUE0KQEAgLTIxMTUsNiArMjQ3MSw3IEBACiAJCQkJWG1OYm90dG9tT2Zmc2V0LCA4LAogCQkJCU5VTEwpOwogICAgIFhtU3RyaW5nRnJlZShsYWJlbCk7CisgICAgc2V0X2ZvbnRsaXN0KHcpOwogCiAgICAgaWYgKHRleHRmaWVsZCAhPSBOVUxMKQogICAgIHsKQEAgLTIxNDksNiArMjUwNiw3IEBACiAJCQkJCQkJCQlOVUxMKTsKIAogICAgIG1hbmFnZV9jZW50ZXJlZChkaWFsb2dmb3JtKTsKKyAgICBhY3RpdmF0ZV9kaWFsb2dfbW5lbW9uaWNzKGRpYWxvZ2Zvcm0pOwogCiAgICAgaWYgKHRleHRmaWVsZCAhPSBOVUxMICYmICp0ZXh0ZmllbGQgIT0gTlVMKQogICAgIHsKQEAgLTIxODUsNiArMjU0Myw3IEBACiAJfQogICAgIH0KIAorICAgIHN1cHByZXNzX2RpYWxvZ19tbmVtb25pY3MoZGlhbG9nZm9ybSk7CiAgICAgWHREZXN0cm95V2lkZ2V0KGRpYWxvZ2Zvcm0pOwogCiAgICAgcmV0dXJuIGRpYWxvZ1N0YXR1czsKQEAgLTIyNDYsOCArMjYwNSwxMSBAQAogICAgIFhtU3RyaW5nCXhtczsKIAogICAgIHhtcyA9IFhtU3RyaW5nQ3JlYXRlKChjaGFyICopcywgU1RSSU5HX1RBRyk7Ci0gICAgWHRWYVNldFZhbHVlcyhmb290ZXIsIFhtTmxhYmVsU3RyaW5nLCB4bXMsIE5VTEwpOwotICAgIFhtU3RyaW5nRnJlZSh4bXMpOworICAgIGlmICh4bXMgIT0gTlVMTCkKKyAgICB7CisJWHRWYVNldFZhbHVlcyhmb290ZXIsIFhtTmxhYmVsU3RyaW5nLCB4bXMsIE5VTEwpOworCVhtU3RyaW5nRnJlZSh4bXMpOworICAgIH0KIH0KIAogI2VuZGlmCkBAIC0yNTIyLDE0ICsyODg0LDE1IEBACiAJWHRWYVNldFZhbHVlcyhpZCwgWG1OZm9yZWdyb3VuZCwgZ3VpLnNjcm9sbF9mZ19waXhlbCwgTlVMTCk7CiB9CiAKLSNpZmRlZiBGRUFUX01FTlUKIC8qCiAgKiBTZXQgdGhlIGZvbnRsaXN0IGZvciBXaWRnZXQgImlkIiB0byB1c2UgZ3VpLm1lbnVfZm9udHNldCBvciBndWkubWVudV9mb250LgogICovCi0gICAgc3RhdGljIHZvaWQKKy8qQVJHU1VTRUQqLworICAgIHZvaWQKIGd1aV9tb3RpZl9tZW51X2ZvbnRsaXN0KGlkKQogICAgIFdpZGdldCAgaWQ7CiB7CisjaWZkZWYgRkVBVF9NRU5VCiAjaWZkZWYgRk9OVFNFVF9BTFdBWVMKICAgICBpZiAoZ3VpLm1lbnVfZm9udHNldCAhPSBOT0ZPTlRTRVQpCiAgICAgewpAQCAtMjU3Myw5ICsyOTM2LDkgQEAKIAl9CiAgICAgfQogI2VuZGlmCisjZW5kaWYKIH0KIAotI2VuZGlmCiAKIC8qCiAgKiBXZSBkb24ndCBjcmVhdGUgaXQgdHdpY2UgZm9yIHRoZSBzYWtlIG9mIHNwZWVkLgpAQCAtMjYxNyw4ICsyOTgwLDEwIEBACiB7CiAgICAgU2hhcmVkRmluZFJlcGxhY2UgKmNkID0gKFNoYXJlZEZpbmRSZXBsYWNlICopY2xpZW50X2RhdGE7CiAKLSAgICBpZiAoY2QgIT0gTlVMTCkKKyAgICBpZiAoY2QgIT0gTlVMTCkgeworICAgICAgIC8qIHN1cHByZXNzX2RpYWxvZ19tbmVtb25pY3MoY2QtPmRpYWxvZyk7ICovCiAJY2QtPmRpYWxvZyA9IChXaWRnZXQpMDsKKyAgICB9CiB9CiAKIC8qQVJHU1VTRUQqLwpAQCAtMjcxOSw2ICszMDg0LDQ4IEBACiB9CiAKICAgICBzdGF0aWMgdm9pZAorc2V0X2xhYmVsKHcsIGxhYmVsKQorICAgIFdpZGdldCB3OworICAgIGNoYXJfdSAqbGFiZWw7Cit7CisgICAgWG1TdHJpbmcJc3RyOworICAgIGNoYXJfdQkqcCwgKm5leHQ7CisgICAgS2V5U3ltCW1uZW1vbmljID0gTlVMOworCisgICAgaWYgKCF3KQorCXJldHVybjsKKworICAgIHAgPSB2aW1fc3Ryc2F2ZShsYWJlbCk7CisgICAgaWYgKHAgPT0gTlVMTCkKKwlyZXR1cm47CisgICAgZm9yIChuZXh0ID0gcDsgKm5leHQ7ICsrbmV4dCkKKyAgICB7CisJaWYgKCpuZXh0ID09IERMR19IT1RLRVlfQ0hBUikKKwl7CisJICAgIGludCBsZW4gPSBTVFJMRU4obmV4dCk7CisKKwkgICAgaWYgKGxlbiA+IDApCisJICAgIHsKKwkJbWNoX21lbW1vdmUobmV4dCwgbmV4dCArIDEsIGxlbik7CisJCW1uZW1vbmljID0gbmV4dFswXTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBzdHIgPSBYbVN0cmluZ0NyZWF0ZVNpbXBsZSgoY2hhciAqKXApOworICAgIHZpbV9mcmVlKHApOworICAgIGlmIChzdHIpCisgICAgeworCVh0VmFTZXRWYWx1ZXModywKKwkJWG1ObGFiZWxTdHJpbmcsIHN0ciwKKwkJWG1ObW5lbW9uaWMsIG1uZW1vbmljLAorCQlOVUxMKTsKKwlYbVN0cmluZ0ZyZWUoc3RyKTsKKyAgICB9CisgICAgZ3VpX21vdGlmX21lbnVfZm9udGxpc3Qodyk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAogZmluZF9yZXBsYWNlX2RpYWxvZ19jcmVhdGUoYXJnLCBkb19yZXBsYWNlKQogICAgIGNoYXJfdQkqYXJnOwogICAgIGludAkJZG9fcmVwbGFjZTsKQEAgLTI3NDYsNiArMzE1Myw4IEBACiAgICAgLyogSWYgdGhlIGRpYWxvZyBhbHJlYWR5IGV4aXN0cywganVzdCByYWlzZSBpdC4gKi8KICAgICBpZiAoZnJkcC0+ZGlhbG9nKQogICAgIHsKKwlndWlfbW90aWZfc3luY2hfZm9udHMoKTsKKwogCS8qIElmIHRoZSB3aW5kb3cgaXMgYWxyZWFkeSB1cCwganVzdCBwb3AgaXQgdG8gdGhlIHRvcCAqLwogCWlmIChYdElzTWFuYWdlZChmcmRwLT5kaWFsb2cpKQogCSAgICBYTWFwUmFpc2VkKFh0RGlzcGxheShmcmRwLT5kaWFsb2cpLApAQCAtMjc4OSwxNiArMzE5OCwxNCBAQAogCSAgICBYbU5ib3R0b21PZmZzZXQsIDQsCiAJICAgIE5VTEwpOwogCi0gICAgc3RyID0gWG1TdHJpbmdDcmVhdGVTaW1wbGUoXygiRmluZCBOZXh0IikpOwogICAgIGZyZHAtPmZpbmQgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgiZmluZEJ1dHRvbiIsCiAJICAgIHhtUHVzaEJ1dHRvbldpZGdldENsYXNzLCBidXR0b25fZm9ybSwKLQkgICAgWG1ObGFiZWxTdHJpbmcsIHN0ciwKIAkgICAgWG1Oc2Vuc2l0aXZlLCBUcnVlLAogCSAgICBYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAogCSAgICBYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKIAkgICAgWG1OcmlnaHRBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAogCSAgICBOVUxMKTsKLSAgICBYbVN0cmluZ0ZyZWUoc3RyKTsKKyAgICBzZXRfbGFiZWwoZnJkcC0+ZmluZCwgXygiRmluZCAmTmV4dCIpKTsKIAogICAgIFh0QWRkQ2FsbGJhY2soZnJkcC0+ZmluZCwgWG1OYWN0aXZhdGVDYWxsYmFjaywKIAkgICAgZmluZF9yZXBsYWNlX2NhbGxiYWNrLApAQCAtMjgwNiw1NyArMzIxMyw1MCBAQAogCiAgICAgaWYgKGRvX3JlcGxhY2UpCiAgICAgewotCXN0ciA9IFhtU3RyaW5nQ3JlYXRlU2ltcGxlKF8oIlJlcGxhY2UiKSk7CiAJZnJkcC0+cmVwbGFjZSA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJyZXBsYWNlQnV0dG9uIiwKIAkJeG1QdXNoQnV0dG9uV2lkZ2V0Q2xhc3MsIGJ1dHRvbl9mb3JtLAotCQlYbU5sYWJlbFN0cmluZywgc3RyLAogCQlYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9XSURHRVQsCiAJCVhtTnRvcFdpZGdldCwgZnJkcC0+ZmluZCwKIAkJWG1ObGVmdEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCiAJCVhtTnJpZ2h0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKIAkJTlVMTCk7Ci0JWG1TdHJpbmdGcmVlKHN0cik7CisJc2V0X2xhYmVsKGZyZHAtPnJlcGxhY2UsIF8oIiZSZXBsYWNlIikpOwogCVh0QWRkQ2FsbGJhY2soZnJkcC0+cmVwbGFjZSwgWG1OYWN0aXZhdGVDYWxsYmFjaywKIAkJZmluZF9yZXBsYWNlX2NhbGxiYWNrLCAoWHRQb2ludGVyKUZSRF9SRVBMQUNFKTsKIAotCXN0ciA9IFhtU3RyaW5nQ3JlYXRlU2ltcGxlKF8oIlJlcGxhY2UgQWxsIikpOwogCWZyZHAtPmFsbCA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJyZXBsYWNlQWxsQnV0dG9uIiwKIAkJeG1QdXNoQnV0dG9uV2lkZ2V0Q2xhc3MsIGJ1dHRvbl9mb3JtLAotCQlYbU5sYWJlbFN0cmluZywgc3RyLAogCQlYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9XSURHRVQsCiAJCVhtTnRvcFdpZGdldCwgZnJkcC0+cmVwbGFjZSwKIAkJWG1ObGVmdEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCiAJCVhtTnJpZ2h0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKIAkJTlVMTCk7Ci0JWG1TdHJpbmdGcmVlKHN0cik7CisJc2V0X2xhYmVsKGZyZHAtPmFsbCwgXygiUmVwbGFjZSAmQWxsIikpOwogCVh0QWRkQ2FsbGJhY2soZnJkcC0+YWxsLCBYbU5hY3RpdmF0ZUNhbGxiYWNrLAogCQlmaW5kX3JlcGxhY2VfY2FsbGJhY2ssIChYdFBvaW50ZXIpRlJEX1JFUExBQ0VBTEwpOwogCi0Jc3RyID0gWG1TdHJpbmdDcmVhdGVTaW1wbGUoXygiVW5kbyIpKTsKIAlmcmRwLT51bmRvID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoInVuZG9CdXR0b24iLAogCQl4bVB1c2hCdXR0b25XaWRnZXRDbGFzcywgYnV0dG9uX2Zvcm0sCi0JCVhtTmxhYmVsU3RyaW5nLCBzdHIsCiAJCVhtTnRvcEF0dGFjaG1lbnQsIFhtQVRUQUNIX1dJREdFVCwKIAkJWG1OdG9wV2lkZ2V0LCBmcmRwLT5hbGwsCiAJCVhtTmxlZnRBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAogCQlYbU5yaWdodEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCiAJCU5VTEwpOwotCVhtU3RyaW5nRnJlZShzdHIpOworCXNldF9sYWJlbChmcmRwLT51bmRvLCBfKCImVW5kbyIpKTsKIAlYdEFkZENhbGxiYWNrKGZyZHAtPnVuZG8sIFhtTmFjdGl2YXRlQ2FsbGJhY2ssCiAJCWZpbmRfcmVwbGFjZV9jYWxsYmFjaywgKFh0UG9pbnRlcilGUkRfVU5ETyk7CiAgICAgfQogCi0gICAgc3RyID0gWG1TdHJpbmdDcmVhdGVTaW1wbGUoXygiQ2FuY2VsIikpOwogICAgIGZyZHAtPmNhbmNlbCA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJjbG9zZUJ1dHRvbiIsCiAJICAgIHhtUHVzaEJ1dHRvbldpZGdldENsYXNzLCBidXR0b25fZm9ybSwKLQkgICAgWG1ObGFiZWxTdHJpbmcsIHN0ciwKIAkgICAgWG1ObGVmdEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCiAJICAgIFhtTnJpZ2h0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKIAkgICAgWG1OYm90dG9tQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKIAkgICAgTlVMTCk7Ci0gICAgWG1TdHJpbmdGcmVlKHN0cik7CisgICAgc2V0X2xhYmVsKGZyZHAtPmNhbmNlbCwgXygiJkNhbmNlbCIpKTsKICAgICBYdEFkZENhbGxiYWNrKGZyZHAtPmNhbmNlbCwgWG1OYWN0aXZhdGVDYWxsYmFjaywKIAkgICAgZmluZF9yZXBsYWNlX2Rpc21pc3NfY2FsbGJhY2ssIGZyZHApOworICAgIGd1aV9tb3RpZl9tZW51X2ZvbnRsaXN0KGZyZHAtPmNhbmNlbCk7CiAKICAgICBYdE1hbmFnZUNoaWxkKGJ1dHRvbl9mb3JtKTsKIApAQCAtMjg5NCw2ICszMjk0LDcgQEAKIAkJWG1OdG9wT2Zmc2V0LCA0LAogCQlOVUxMKTsKIAlYbVN0cmluZ0ZyZWUoc3RyKTsKKwlndWlfbW90aWZfbWVudV9mb250bGlzdChsYWJlbF93aGF0KTsKIAogCWZyZHAtPndoYXQgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgid2hhdFRleHQiLAogCQl4bVRleHRGaWVsZFdpZGdldENsYXNzLCBpbnB1dF9mb3JtLApAQCAtMjkyOCw2ICszMzI5LDcgQEAKIAkJICAgIFhtTmJvdHRvbUF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCiAJCSAgICBOVUxMKTsKIAkgICAgWG1TdHJpbmdGcmVlKHN0cik7CisJICAgIGd1aV9tb3RpZl9tZW51X2ZvbnRsaXN0KGxhYmVsX3dpdGgpOwogCiAJICAgIC8qCiAJICAgICAqIE1ha2UgdGhlIGVudHJ5IGFjdGl2YXRpb24gb25seSBjaGFuZ2UgdGhlIGlucHV0IGZvY3VzIG9udG8gdGhlCkBAIC0yOTc1LDYgKzMzNzcsNyBAQAogCiAgICAgewogCVdpZGdldCByYWRpb19ib3g7CisJV2lkZ2V0IHc7CiAKIAlmcmFtZSA9IFh0VmFDcmVhdGVXaWRnZXQoImRpcmVjdGlvbkZyYW1lIiwKIAkJeG1GcmFtZVdpZGdldENsYXNzLCBmcmRwLT5kaWFsb2csCkBAIC0yOTg4LDEzICszMzkxLDE0IEBACiAJCU5VTEwpOwogCiAJc3RyID0gWG1TdHJpbmdDcmVhdGVTaW1wbGUoXygiRGlyZWN0aW9uIikpOwotCSh2b2lkKVh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJkaXJlY3Rpb25GcmFtZUxhYmVsIiwKKwl3ID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImRpcmVjdGlvbkZyYW1lTGFiZWwiLAogCQl4bUxhYmVsR2FkZ2V0Q2xhc3MsIGZyYW1lLAogCQlYbU5sYWJlbFN0cmluZywgc3RyLAogCQlYbU5jaGlsZEhvcml6b250YWxBbGlnbm1lbnQsIFhtQUxJR05NRU5UX0JFR0lOTklORywKIAkJWG1OY2hpbGRUeXBlLCBYbUZSQU1FX1RJVExFX0NISUxELAogCQlOVUxMKTsKIAlYbVN0cmluZ0ZyZWUoc3RyKTsKKwlndWlfbW90aWZfbWVudV9mb250bGlzdCh3KTsKIAogCXJhZGlvX2JveCA9IFhtQ3JlYXRlUmFkaW9Cb3goZnJhbWUsICJyYWRpb0JveCIsCiAJCShBcmdMaXN0KU5VTEwsIDApOwpAQCAtMzAwNiw2ICszNDEwLDcgQEAKIAkJWG1Oc2V0LCBGYWxzZSwKIAkJTlVMTCk7CiAJWG1TdHJpbmdGcmVlKHN0cik7CisJZ3VpX21vdGlmX21lbnVfZm9udGxpc3QoZnJkcC0+dXApOwogCiAJc3RyID0gWG1TdHJpbmdDcmVhdGVTaW1wbGUoXygiRG93biIpKTsKIAlmcmRwLT5kb3duID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImRvd25SYWRpb0J1dHRvbiIsCkBAIC0zMDE0LDYgKzM0MTksNyBAQAogCQlYbU5zZXQsIFRydWUsCiAJCU5VTEwpOwogCVhtU3RyaW5nRnJlZShzdHIpOworCWd1aV9tb3RpZl9tZW51X2ZvbnRsaXN0KGZyZHAtPmRvd24pOwogCiAJWHRNYW5hZ2VDaGlsZChyYWRpb19ib3gpOwogCVh0TWFuYWdlQ2hpbGQoZnJhbWUpOwpAQCAtMzA1Nyw2ICszNDYzLDggQEAKIAkgICAgWG1Oc2V0LCBtY2FzZSwKIAkgICAgTlVMTCk7CiAgICAgWG1TdHJpbmdGcmVlKHN0cik7CisgICAgZ3VpX21vdGlmX21lbnVfZm9udGxpc3QoZnJkcC0+d3dvcmQpOworICAgIGd1aV9tb3RpZl9tZW51X2ZvbnRsaXN0KGZyZHAtPm1jYXNlKTsKIAogICAgIFh0TWFuYWdlQ2hpbGQodG9nZ2xlX2Zvcm0pOwogCkBAIC0zMDY0LDcgKzM0NzIsMTAgQEAKIAlYbVRleHRGaWVsZFNldFN0cmluZyhmcmRwLT53aGF0LCAoY2hhciAqKWVudHJ5X3RleHQpOwogICAgIHZpbV9mcmVlKGVudHJ5X3RleHQpOwogCi0gICAgWHRNYW5hZ2VDaGlsZChmcmRwLT5kaWFsb2cpOworICAgIGd1aV9tb3RpZl9zeW5jaF9mb250cygpOworCisgICAgbWFuYWdlX2NlbnRlcmVkKGZyZHAtPmRpYWxvZyk7CisgICAgYWN0aXZhdGVfZGlhbG9nX21uZW1vbmljcyhmcmRwLT5kaWFsb2cpOwogICAgIFhtUHJvY2Vzc1RyYXZlcnNhbChmcmRwLT53aGF0LCBYbVRSQVZFUlNFX0NVUlJFTlQpOwogfQogCkBAIC0zMDg4LDMgKzM0OTksNDAgQEAKIAogICAgIGZpbmRfcmVwbGFjZV9kaWFsb2dfY3JlYXRlKGVhcC0+YXJnLCBUUlVFKTsKIH0KKworLyoKKyAqIFN5bmNocm9uaXplIGFsbCBndWkgZWxlbWVudHMsIHdoaWNoIGFyZSBkZXBlbmRhbnQgdXBvbiB0aGUKKyAqIG1haW4gdGV4dCBmb250IHVzZWQuIFRob3NlIGFyZSBpbiBlc3AuIHRoZSBmaW5kL3JlcGxhY2UgZGlhbG9ncy4KKyAqIElmIHlvdSBkb24ndCB1bmRlcnN0YW5kIHdoeSB0aGlzIHNob3VsZCBiZSBuZWVkZWQsIHBsZWFzZSB0cnkgdG8KKyAqIHNlYXJjaCBmb3IgInBp6rbmIiBpbiBpc284ODU5LTIuCisgKi8KKyAgICB2b2lkCitndWlfbW90aWZfc3luY2hfZm9udHModm9pZCkKK3sKKyAgICBTaGFyZWRGaW5kUmVwbGFjZSAqZnJkcDsKKyAgICBpbnQJCSAgICBkb19yZXBsYWNlOworICAgIFhGb250U3RydWN0CSAgICAqZm9udDsKKyAgICBYbUZvbnRMaXN0CSAgICBmb250X2xpc3Q7CisKKyAgICAvKiBGSVhNRTogVW5sZXNzIHdlIGZpbmQgb3V0IGhvdyB0byBjcmVhdGUgYSBYbUZvbnRMaXN0IGZyb20gYSBYRm9udFNldCwKKyAgICAgKiB3ZSBqdXN0IGdpdmUgdXAgaGVyZSBvbiBmb250IHN5bmNocm9uaXphdGlvbi4gKi8KKyAgICBmb250ID0gKFhGb250U3RydWN0ICopZ3VpLm5vcm1fZm9udDsKKyAgICBpZiAoZm9udCA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGZvbnRfbGlzdCA9IGd1aV9tb3RpZl9jcmVhdGVfZm9udGxpc3QoZm9udCk7CisKKyAgICAvKiBPSyB0aGlzIGxvb3AgaXMgYSBiaXQgdHJpY2t5Li4uICovCisgICAgZm9yIChkb19yZXBsYWNlID0gMDsgZG9fcmVwbGFjZSA8PSAxOyArK2RvX3JlcGxhY2UpCisgICAgeworCWZyZHAgPSAoZG9fcmVwbGFjZSkgPyAoJnJlcGxfd2lkZ2V0cykgOiAoJmZpbmRfd2lkZ2V0cyk7CisJaWYgKGZyZHAtPmRpYWxvZykKKwl7CisJICAgIFh0VmFTZXRWYWx1ZXMoZnJkcC0+d2hhdCwgWG1OZm9udExpc3QsIGZvbnRfbGlzdCwgTlVMTCk7CisJICAgIGlmIChkb19yZXBsYWNlKQorCQlYdFZhU2V0VmFsdWVzKGZyZHAtPndpdGgsIFhtTmZvbnRMaXN0LCBmb250X2xpc3QsIE5VTEwpOworCX0KKyAgICB9CisKKyAgICBYbUZvbnRMaXN0RnJlZShmb250X2xpc3QpOworfQo=