ZGlmZiAtLWdpdCBhL2lzaXNkL2RpY3QuYyBiL2lzaXNkL2RpY3QuYwppbmRleCA0Yzc4N2FjLi44NjIwNmEzIDEwMDY0NAotLS0gYS9pc2lzZC9kaWN0LmMKKysrIGIvaXNpc2QvZGljdC5jCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBpbnRvIHByb3ByaWV0YXJ5IHNvZnR3YXJlOyB0aGVyZSBpcyBubyByZXF1aXJlbWVudCBmb3Igc3VjaCBzb2Z0d2FyZSB0bwogICogY29udGFpbiBhIGNvcHlyaWdodCBub3RpY2UgcmVsYXRlZCB0byB0aGlzIHNvdXJjZS4KICAqCi0gKiAkSWQ6IGRpY3QuYyx2IDEuMSAyMDAzLzEyLzIzIDA4OjA5OjQ3IGphcmRpbiBFeHAgJAorICogJElkOiBkaWN0LmMsdiAxLjIgMjAwNC8wOS8xMCAyMDo0ODoyMSBoYXNzbyBFeHAgJAogICogJE5hbWU6ICAkCiAgKi8KIApAQCAtMjUsNyArMjUsOCBAQAogI2luY2x1ZGUgImRpY3QuaCIKIAogI2lmZGVmIEtBWkxJQl9SQ1NJRAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSA9ICIkSWQ6IGRpY3QuYyx2IDEuMSAyMDAzLzEyLzIzIDA4OjA5OjQ3IGphcmRpbiBFeHAgJCI7CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdID0KKyAgIiRJZDogZGljdC5jLHYgMS4yIDIwMDQvMDkvMTAgMjA6NDg6MjEgaGFzc28gRXhwICQiOwogI2VuZGlmCiAKIC8qCkBAIC02Miw4ICs2Myw4IEBACiAjZGVmaW5lIGRpY3RfbmlsKEQpICgmKEQpLT5uaWxub2RlKQogI2RlZmluZSBESUNUX0RFUFRIX01BWCA2NAogCi1zdGF0aWMgZG5vZGVfdCAqZG5vZGVfYWxsb2Modm9pZCAqY29udGV4dCk7Ci1zdGF0aWMgdm9pZCBkbm9kZV9mcmVlKGRub2RlX3QgKm5vZGUsIHZvaWQgKmNvbnRleHQpOworc3RhdGljIGRub2RlX3QgKmRub2RlX2FsbG9jICh2b2lkICpjb250ZXh0KTsKK3N0YXRpYyB2b2lkIGRub2RlX2ZyZWUgKGRub2RlX3QgKiBub2RlLCB2b2lkICpjb250ZXh0KTsKIAogLyoKICAqIFBlcmZvcm0gYSBgYGxlZnQgcm90YXRpb24nJyBhZGp1c3RtZW50IG9uIHRoZSB0cmVlLiAgVGhlIGdpdmVuIG5vZGUgUCBhbmQKQEAgLTcyLDI4ICs3MywzMiBAQAogICogZm9yIFAuICBUaGUgb3JkZXJpbmcgb2YgdGhlIGtleXMgd2l0aGluIHRoZSB0cmVlIGlzIHRodXMgcHJlc2VydmVkLgogICovCiAKLXN0YXRpYyB2b2lkIHJvdGF0ZV9sZWZ0KGRub2RlX3QgKnVwcGVyKQorc3RhdGljIHZvaWQKK3JvdGF0ZV9sZWZ0IChkbm9kZV90ICogdXBwZXIpCiB7Ci0gICAgZG5vZGVfdCAqbG93ZXIsICpsb3dsZWZ0LCAqdXBwYXJlbnQ7CisgIGRub2RlX3QgKmxvd2VyLCAqbG93bGVmdCwgKnVwcGFyZW50OwogCi0gICAgbG93ZXIgPSB1cHBlci0+cmlnaHQ7Ci0gICAgdXBwZXItPnJpZ2h0ID0gbG93bGVmdCA9IGxvd2VyLT5sZWZ0OwotICAgIGxvd2xlZnQtPnBhcmVudCA9IHVwcGVyOworICBsb3dlciA9IHVwcGVyLT5yaWdodDsKKyAgdXBwZXItPnJpZ2h0ID0gbG93bGVmdCA9IGxvd2VyLT5sZWZ0OworICBsb3dsZWZ0LT5wYXJlbnQgPSB1cHBlcjsKIAotICAgIGxvd2VyLT5wYXJlbnQgPSB1cHBhcmVudCA9IHVwcGVyLT5wYXJlbnQ7CisgIGxvd2VyLT5wYXJlbnQgPSB1cHBhcmVudCA9IHVwcGVyLT5wYXJlbnQ7CiAKLSAgICAvKiBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciByb290IG5vZGUgaGVyZSBiZWNhdXNlIHJvb3QtPnBhcmVudCBpcwotICAgICAgIHRoZSBzZW50aW5lbCBuaWwgbm9kZSwgYW5kIHJvb3QtPnBhcmVudC0+bGVmdCBwb2ludHMgYmFjayB0byByb290ICovCisgIC8qIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIHJvb3Qgbm9kZSBoZXJlIGJlY2F1c2Ugcm9vdC0+cGFyZW50IGlzCisgICAgIHRoZSBzZW50aW5lbCBuaWwgbm9kZSwgYW5kIHJvb3QtPnBhcmVudC0+bGVmdCBwb2ludHMgYmFjayB0byByb290ICovCiAKLSAgICBpZiAodXBwZXIgPT0gdXBwYXJlbnQtPmxlZnQpIHsKLQl1cHBhcmVudC0+bGVmdCA9IGxvd2VyOwotICAgIH0gZWxzZSB7Ci0JYXNzZXJ0ICh1cHBlciA9PSB1cHBhcmVudC0+cmlnaHQpOwotCXVwcGFyZW50LT5yaWdodCA9IGxvd2VyOworICBpZiAodXBwZXIgPT0gdXBwYXJlbnQtPmxlZnQpCisgICAgeworICAgICAgdXBwYXJlbnQtPmxlZnQgPSBsb3dlcjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBhc3NlcnQgKHVwcGVyID09IHVwcGFyZW50LT5yaWdodCk7CisgICAgICB1cHBhcmVudC0+cmlnaHQgPSBsb3dlcjsKICAgICB9CiAKLSAgICBsb3dlci0+bGVmdCA9IHVwcGVyOwotICAgIHVwcGVyLT5wYXJlbnQgPSBsb3dlcjsKKyAgbG93ZXItPmxlZnQgPSB1cHBlcjsKKyAgdXBwZXItPnBhcmVudCA9IGxvd2VyOwogfQogCiAvKgpAQCAtMTAxLDI1ICsxMDYsMjkgQEAKICAqIHRoZSBzYW1lIHByb2NlZHVyZSwgYnV0IHdpdGggbGVmdCBhbmQgcmlnaHQgaW50ZXJjaGFuZ2VkLgogICovCiAKLXN0YXRpYyB2b2lkIHJvdGF0ZV9yaWdodChkbm9kZV90ICp1cHBlcikKK3N0YXRpYyB2b2lkCityb3RhdGVfcmlnaHQgKGRub2RlX3QgKiB1cHBlcikKIHsKLSAgICBkbm9kZV90ICpsb3dlciwgKmxvd3JpZ2h0LCAqdXBwYXJlbnQ7CisgIGRub2RlX3QgKmxvd2VyLCAqbG93cmlnaHQsICp1cHBhcmVudDsKIAotICAgIGxvd2VyID0gdXBwZXItPmxlZnQ7Ci0gICAgdXBwZXItPmxlZnQgPSBsb3dyaWdodCA9IGxvd2VyLT5yaWdodDsKLSAgICBsb3dyaWdodC0+cGFyZW50ID0gdXBwZXI7CisgIGxvd2VyID0gdXBwZXItPmxlZnQ7CisgIHVwcGVyLT5sZWZ0ID0gbG93cmlnaHQgPSBsb3dlci0+cmlnaHQ7CisgIGxvd3JpZ2h0LT5wYXJlbnQgPSB1cHBlcjsKIAotICAgIGxvd2VyLT5wYXJlbnQgPSB1cHBhcmVudCA9IHVwcGVyLT5wYXJlbnQ7CisgIGxvd2VyLT5wYXJlbnQgPSB1cHBhcmVudCA9IHVwcGVyLT5wYXJlbnQ7CiAKLSAgICBpZiAodXBwZXIgPT0gdXBwYXJlbnQtPnJpZ2h0KSB7Ci0JdXBwYXJlbnQtPnJpZ2h0ID0gbG93ZXI7Ci0gICAgfSBlbHNlIHsKLQlhc3NlcnQgKHVwcGVyID09IHVwcGFyZW50LT5sZWZ0KTsKLQl1cHBhcmVudC0+bGVmdCA9IGxvd2VyOworICBpZiAodXBwZXIgPT0gdXBwYXJlbnQtPnJpZ2h0KQorICAgIHsKKyAgICAgIHVwcGFyZW50LT5yaWdodCA9IGxvd2VyOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGFzc2VydCAodXBwZXIgPT0gdXBwYXJlbnQtPmxlZnQpOworICAgICAgdXBwYXJlbnQtPmxlZnQgPSBsb3dlcjsKICAgICB9CiAKLSAgICBsb3dlci0+cmlnaHQgPSB1cHBlcjsKLSAgICB1cHBlci0+cGFyZW50ID0gbG93ZXI7CisgIGxvd2VyLT5yaWdodCA9IHVwcGVyOworICB1cHBlci0+cGFyZW50ID0gbG93ZXI7CiB9CiAKIC8qCkBAIC0xMjcsMTMgKzEzNiwxNCBAQAogICogbm9kZSBhbmQgZnJlZSBldmVyeXRoaW5nIHVuZGVyIGl0LiAgVXNlZCBieSBkaWN0X2ZyZWUoKS4KICAqLwogCi1zdGF0aWMgdm9pZCBmcmVlX25vZGVzKGRpY3RfdCAqZGljdCwgZG5vZGVfdCAqbm9kZSwgZG5vZGVfdCAqbmlsKQorc3RhdGljIHZvaWQKK2ZyZWVfbm9kZXMgKGRpY3RfdCAqIGRpY3QsIGRub2RlX3QgKiBub2RlLCBkbm9kZV90ICogbmlsKQogewotICAgIGlmIChub2RlID09IG5pbCkKLQlyZXR1cm47Ci0gICAgZnJlZV9ub2RlcyhkaWN0LCBub2RlLT5sZWZ0LCBuaWwpOwotICAgIGZyZWVfbm9kZXMoZGljdCwgbm9kZS0+cmlnaHQsIG5pbCk7Ci0gICAgZGljdC0+ZnJlZW5vZGUobm9kZSwgZGljdC0+Y29udGV4dCk7CisgIGlmIChub2RlID09IG5pbCkKKyAgICByZXR1cm47CisgIGZyZWVfbm9kZXMgKGRpY3QsIG5vZGUtPmxlZnQsIG5pbCk7CisgIGZyZWVfbm9kZXMgKGRpY3QsIG5vZGUtPnJpZ2h0LCBuaWwpOworICBkaWN0LT5mcmVlbm9kZSAobm9kZSwgZGljdC0+Y29udGV4dCk7CiB9CiAKIC8qCkBAIC0xNDUsMjYgKzE1NSwzMiBAQAogICogZGVidWdnaW5nIHB1cnBvc2VzLiAKICAqLwogCi1zdGF0aWMgaW50IHZlcmlmeV9iaW50cmVlKGRpY3RfdCAqZGljdCkKK3N0YXRpYyBpbnQKK3ZlcmlmeV9iaW50cmVlIChkaWN0X3QgKiBkaWN0KQogewotICAgIGRub2RlX3QgKmZpcnN0LCAqbmV4dDsKKyAgZG5vZGVfdCAqZmlyc3QsICpuZXh0OwogCi0gICAgZmlyc3QgPSBkaWN0X2ZpcnN0KGRpY3QpOworICBmaXJzdCA9IGRpY3RfZmlyc3QgKGRpY3QpOwogCi0gICAgaWYgKGRpY3QtPmR1cGVzKSB7Ci0Jd2hpbGUgKGZpcnN0ICYmIChuZXh0ID0gZGljdF9uZXh0KGRpY3QsIGZpcnN0KSkpIHsKLQkgICAgaWYgKGRpY3QtPmNvbXBhcmUoZmlyc3QtPmtleSwgbmV4dC0+a2V5KSA+IDApCi0JCXJldHVybiAwOwotCSAgICBmaXJzdCA9IG5leHQ7Ci0JfQotICAgIH0gZWxzZSB7Ci0Jd2hpbGUgKGZpcnN0ICYmIChuZXh0ID0gZGljdF9uZXh0KGRpY3QsIGZpcnN0KSkpIHsKLQkgICAgaWYgKGRpY3QtPmNvbXBhcmUoZmlyc3QtPmtleSwgbmV4dC0+a2V5KSA+PSAwKQotCQlyZXR1cm4gMDsKLQkgICAgZmlyc3QgPSBuZXh0OworICBpZiAoZGljdC0+ZHVwZXMpCisgICAgeworICAgICAgd2hpbGUgKGZpcnN0ICYmIChuZXh0ID0gZGljdF9uZXh0IChkaWN0LCBmaXJzdCkpKQorCXsKKwkgIGlmIChkaWN0LT5jb21wYXJlIChmaXJzdC0+a2V5LCBuZXh0LT5rZXkpID4gMCkKKwkgICAgcmV0dXJuIDA7CisJICBmaXJzdCA9IG5leHQ7CiAJfQogICAgIH0KLSAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHdoaWxlIChmaXJzdCAmJiAobmV4dCA9IGRpY3RfbmV4dCAoZGljdCwgZmlyc3QpKSkKKwl7CisJICBpZiAoZGljdC0+Y29tcGFyZSAoZmlyc3QtPmtleSwgbmV4dC0+a2V5KSA+PSAwKQorCSAgICByZXR1cm4gMDsKKwkgIGZpcnN0ID0gbmV4dDsKKwl9CisgICAgfQorICByZXR1cm4gMTsKIH0KIAogCkBAIC0xODEsMjkgKzE5NywzMiBAQAogICogc3VidHJlZSBpcyBub3QgcmVkLWJsYWNrLgogICovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdmVyaWZ5X3JlZGJsYWNrKGRub2RlX3QgKm5pbCwgZG5vZGVfdCAqcm9vdCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3ZlcmlmeV9yZWRibGFjayAoZG5vZGVfdCAqIG5pbCwgZG5vZGVfdCAqIHJvb3QpCiB7Ci0gICAgdW5zaWduZWQgaGVpZ2h0X2xlZnQsIGhlaWdodF9yaWdodDsKKyAgdW5zaWduZWQgaGVpZ2h0X2xlZnQsIGhlaWdodF9yaWdodDsKIAotICAgIGlmIChyb290ICE9IG5pbCkgewotCWhlaWdodF9sZWZ0ID0gdmVyaWZ5X3JlZGJsYWNrKG5pbCwgcm9vdC0+bGVmdCk7Ci0JaGVpZ2h0X3JpZ2h0ID0gdmVyaWZ5X3JlZGJsYWNrKG5pbCwgcm9vdC0+cmlnaHQpOwotCWlmIChoZWlnaHRfbGVmdCA9PSAwIHx8IGhlaWdodF9yaWdodCA9PSAwKQorICBpZiAocm9vdCAhPSBuaWwpCisgICAgeworICAgICAgaGVpZ2h0X2xlZnQgPSB2ZXJpZnlfcmVkYmxhY2sgKG5pbCwgcm9vdC0+bGVmdCk7CisgICAgICBoZWlnaHRfcmlnaHQgPSB2ZXJpZnlfcmVkYmxhY2sgKG5pbCwgcm9vdC0+cmlnaHQpOworICAgICAgaWYgKGhlaWdodF9sZWZ0ID09IDAgfHwgaGVpZ2h0X3JpZ2h0ID09IDApCisJcmV0dXJuIDA7CisgICAgICBpZiAoaGVpZ2h0X2xlZnQgIT0gaGVpZ2h0X3JpZ2h0KQorCXJldHVybiAwOworICAgICAgaWYgKHJvb3QtPmNvbG9yID09IGRub2RlX3JlZCkKKwl7CisJICBpZiAocm9vdC0+bGVmdC0+Y29sb3IgIT0gZG5vZGVfYmxhY2spCiAJICAgIHJldHVybiAwOwotCWlmIChoZWlnaHRfbGVmdCAhPSBoZWlnaHRfcmlnaHQpCisJICBpZiAocm9vdC0+cmlnaHQtPmNvbG9yICE9IGRub2RlX2JsYWNrKQogCSAgICByZXR1cm4gMDsKLQlpZiAocm9vdC0+Y29sb3IgPT0gZG5vZGVfcmVkKSB7Ci0JICAgIGlmIChyb290LT5sZWZ0LT5jb2xvciAhPSBkbm9kZV9ibGFjaykKLQkJcmV0dXJuIDA7Ci0JICAgIGlmIChyb290LT5yaWdodC0+Y29sb3IgIT0gZG5vZGVfYmxhY2spCi0JCXJldHVybiAwOwotCSAgICByZXR1cm4gaGVpZ2h0X2xlZnQ7CisJICByZXR1cm4gaGVpZ2h0X2xlZnQ7CiAJfQotCWlmIChyb290LT5jb2xvciAhPSBkbm9kZV9ibGFjaykKLQkgICAgcmV0dXJuIDA7Ci0JcmV0dXJuIGhlaWdodF9sZWZ0ICsgMTsKLSAgICB9IAotICAgIHJldHVybiAxOworICAgICAgaWYgKHJvb3QtPmNvbG9yICE9IGRub2RlX2JsYWNrKQorCXJldHVybiAwOworICAgICAgcmV0dXJuIGhlaWdodF9sZWZ0ICsgMTsKKyAgICB9CisgIHJldHVybiAxOwogfQogCiAvKgpAQCAtMjEyLDEzICsyMzEsMTQgQEAKICAqIGRldGVjdCBhIG1pc21hdGNoLgogICovCiAKLXN0YXRpYyBkaWN0Y291bnRfdCB2ZXJpZnlfbm9kZV9jb3VudChkbm9kZV90ICpuaWwsIGRub2RlX3QgKnJvb3QpCitzdGF0aWMgZGljdGNvdW50X3QKK3ZlcmlmeV9ub2RlX2NvdW50IChkbm9kZV90ICogbmlsLCBkbm9kZV90ICogcm9vdCkKIHsKLSAgICBpZiAocm9vdCA9PSBuaWwpCi0JcmV0dXJuIDA7Ci0gICAgZWxzZQotCXJldHVybiAxICsgdmVyaWZ5X25vZGVfY291bnQobmlsLCByb290LT5sZWZ0KQotCSAgICArIHZlcmlmeV9ub2RlX2NvdW50KG5pbCwgcm9vdC0+cmlnaHQpOworICBpZiAocm9vdCA9PSBuaWwpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgICByZXR1cm4gMSArIHZlcmlmeV9ub2RlX2NvdW50IChuaWwsIHJvb3QtPmxlZnQpCisgICAgICArIHZlcmlmeV9ub2RlX2NvdW50IChuaWwsIHJvb3QtPnJpZ2h0KTsKIH0KIAogLyoKQEAgLTIyOCw1NCArMjQ4LDU4IEBACiAgKiByZXR1cm5zIHplcm8uIEl0IGlzIGludGVuZGVkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCiAgKi8KIAotc3RhdGljIGludCB2ZXJpZnlfZGljdF9oYXNfbm9kZShkbm9kZV90ICpuaWwsIGRub2RlX3QgKnJvb3QsIGRub2RlX3QgKm5vZGUpCitzdGF0aWMgaW50Cit2ZXJpZnlfZGljdF9oYXNfbm9kZSAoZG5vZGVfdCAqIG5pbCwgZG5vZGVfdCAqIHJvb3QsIGRub2RlX3QgKiBub2RlKQogewotICAgIGlmIChyb290ICE9IG5pbCkgewotCXJldHVybiByb290ID09IG5vZGUKLQkJfHwgdmVyaWZ5X2RpY3RfaGFzX25vZGUobmlsLCByb290LT5sZWZ0LCBub2RlKQotCQl8fCB2ZXJpZnlfZGljdF9oYXNfbm9kZShuaWwsIHJvb3QtPnJpZ2h0LCBub2RlKTsKKyAgaWYgKHJvb3QgIT0gbmlsKQorICAgIHsKKyAgICAgIHJldHVybiByb290ID09IG5vZGUKKwl8fCB2ZXJpZnlfZGljdF9oYXNfbm9kZSAobmlsLCByb290LT5sZWZ0LCBub2RlKQorCXx8IHZlcmlmeV9kaWN0X2hhc19ub2RlIChuaWwsIHJvb3QtPnJpZ2h0LCBub2RlKTsKICAgICB9Ci0gICAgcmV0dXJuIDA7CisgIHJldHVybiAwOwogfQogCi0KIC8qCiAgKiBEeW5hbWljYWxseSBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIGRpY3Rpb25hcnkgb2JqZWN0LgogICovCiAKLWRpY3RfdCAqZGljdF9jcmVhdGUoZGljdGNvdW50X3QgbWF4Y291bnQsIGRpY3RfY29tcF90IGNvbXApCitkaWN0X3QgKgorZGljdF9jcmVhdGUgKGRpY3Rjb3VudF90IG1heGNvdW50LCBkaWN0X2NvbXBfdCBjb21wKQogewotICAgIGRpY3RfdCAqbmV3ID0gbWFsbG9jKHNpemVvZiAqbmV3KTsKKyAgZGljdF90ICpuZXcgPSBtYWxsb2MgKHNpemVvZiAqbmV3KTsKIAotICAgIGlmIChuZXcpIHsKLQluZXctPmNvbXBhcmUgPSBjb21wOwotCW5ldy0+YWxsb2Nub2RlID0gZG5vZGVfYWxsb2M7Ci0JbmV3LT5mcmVlbm9kZSA9IGRub2RlX2ZyZWU7Ci0JbmV3LT5jb250ZXh0ID0gTlVMTDsKLQluZXctPm5vZGVjb3VudCA9IDA7Ci0JbmV3LT5tYXhjb3VudCA9IG1heGNvdW50OwotCW5ldy0+bmlsbm9kZS5sZWZ0ID0gJm5ldy0+bmlsbm9kZTsKLQluZXctPm5pbG5vZGUucmlnaHQgPSAmbmV3LT5uaWxub2RlOwotCW5ldy0+bmlsbm9kZS5wYXJlbnQgPSAmbmV3LT5uaWxub2RlOwotCW5ldy0+bmlsbm9kZS5jb2xvciA9IGRub2RlX2JsYWNrOwotCW5ldy0+ZHVwZXMgPSAwOworICBpZiAobmV3KQorICAgIHsKKyAgICAgIG5ldy0+Y29tcGFyZSA9IGNvbXA7CisgICAgICBuZXctPmFsbG9jbm9kZSA9IGRub2RlX2FsbG9jOworICAgICAgbmV3LT5mcmVlbm9kZSA9IGRub2RlX2ZyZWU7CisgICAgICBuZXctPmNvbnRleHQgPSBOVUxMOworICAgICAgbmV3LT5ub2RlY291bnQgPSAwOworICAgICAgbmV3LT5tYXhjb3VudCA9IG1heGNvdW50OworICAgICAgbmV3LT5uaWxub2RlLmxlZnQgPSAmbmV3LT5uaWxub2RlOworICAgICAgbmV3LT5uaWxub2RlLnJpZ2h0ID0gJm5ldy0+bmlsbm9kZTsKKyAgICAgIG5ldy0+bmlsbm9kZS5wYXJlbnQgPSAmbmV3LT5uaWxub2RlOworICAgICAgbmV3LT5uaWxub2RlLmNvbG9yID0gZG5vZGVfYmxhY2s7CisgICAgICBuZXctPmR1cGVzID0gMDsKICAgICB9Ci0gICAgcmV0dXJuIG5ldzsKKyAgcmV0dXJuIG5ldzsKIH0KIAogLyoKICAqIFNlbGVjdCBhIGRpZmZlcmVudCBzZXQgb2Ygbm9kZSBhbGxvY2F0b3Igcm91dGluZXMuCiAgKi8KIAotdm9pZCBkaWN0X3NldF9hbGxvY2F0b3IoZGljdF90ICpkaWN0LCBkbm9kZV9hbGxvY190IGFsLAotCWRub2RlX2ZyZWVfdCBmciwgdm9pZCAqY29udGV4dCkKK3ZvaWQKK2RpY3Rfc2V0X2FsbG9jYXRvciAoZGljdF90ICogZGljdCwgZG5vZGVfYWxsb2NfdCBhbCwKKwkJICAgIGRub2RlX2ZyZWVfdCBmciwgdm9pZCAqY29udGV4dCkKIHsKLSAgICBhc3NlcnQgKGRpY3RfY291bnQoZGljdCkgPT0gMCk7Ci0gICAgYXNzZXJ0ICgoYWwgPT0gTlVMTCAmJiBmciA9PSBOVUxMKSB8fCAoYWwgIT0gTlVMTCAmJiBmciAhPSBOVUxMKSk7CisgIGFzc2VydCAoZGljdF9jb3VudCAoZGljdCkgPT0gMCk7CisgIGFzc2VydCAoKGFsID09IE5VTEwgJiYgZnIgPT0gTlVMTCkgfHwgKGFsICE9IE5VTEwgJiYgZnIgIT0gTlVMTCkpOwogCi0gICAgZGljdC0+YWxsb2Nub2RlID0gYWwgPyBhbCA6IGRub2RlX2FsbG9jOwotICAgIGRpY3QtPmZyZWVub2RlID0gZnIgPyBmciA6IGRub2RlX2ZyZWU7Ci0gICAgZGljdC0+Y29udGV4dCA9IGNvbnRleHQ7CisgIGRpY3QtPmFsbG9jbm9kZSA9IGFsID8gYWwgOiBkbm9kZV9hbGxvYzsKKyAgZGljdC0+ZnJlZW5vZGUgPSBmciA/IGZyIDogZG5vZGVfZnJlZTsKKyAgZGljdC0+Y29udGV4dCA9IGNvbnRleHQ7CiB9CiAKIC8qCkBAIC0yODMsMTAgKzMwNywxMSBAQAogICogZnJvbSB0aGUgdHJlZSBiZWZvcmUgZGVsZXRpbmcgaXQgaXMgcmVxdWlyZWQuCiAgKi8KIAotdm9pZCBkaWN0X2Rlc3Ryb3koZGljdF90ICpkaWN0KQordm9pZAorZGljdF9kZXN0cm95IChkaWN0X3QgKiBkaWN0KQogewotICAgIGFzc2VydCAoZGljdF9pc2VtcHR5KGRpY3QpKTsKLSAgICBmcmVlKGRpY3QpOworICBhc3NlcnQgKGRpY3RfaXNlbXB0eSAoZGljdCkpOworICBmcmVlIChkaWN0KTsKIH0KIAogLyoKQEAgLTI5NCwxMTIgKzMxOSwxMTcgQEAKICAqIGluc3RhbGxlZCBmcmVlIHJvdXRpbmUuIFRoZSBkaWN0aW9uYXJ5IGlzIGVtcHRpZWQuCiAgKi8KIAotdm9pZCBkaWN0X2ZyZWVfbm9kZXMoZGljdF90ICpkaWN0KQordm9pZAorZGljdF9mcmVlX25vZGVzIChkaWN0X3QgKiBkaWN0KQogewotICAgIGRub2RlX3QgKm5pbCA9IGRpY3RfbmlsKGRpY3QpLCAqcm9vdCA9IGRpY3Rfcm9vdChkaWN0KTsKLSAgICBmcmVlX25vZGVzKGRpY3QsIHJvb3QsIG5pbCk7Ci0gICAgZGljdC0+bm9kZWNvdW50ID0gMDsKLSAgICBkaWN0LT5uaWxub2RlLmxlZnQgPSAmZGljdC0+bmlsbm9kZTsKLSAgICBkaWN0LT5uaWxub2RlLnJpZ2h0ID0gJmRpY3QtPm5pbG5vZGU7CisgIGRub2RlX3QgKm5pbCA9IGRpY3RfbmlsIChkaWN0KSwgKnJvb3QgPSBkaWN0X3Jvb3QgKGRpY3QpOworICBmcmVlX25vZGVzIChkaWN0LCByb290LCBuaWwpOworICBkaWN0LT5ub2RlY291bnQgPSAwOworICBkaWN0LT5uaWxub2RlLmxlZnQgPSAmZGljdC0+bmlsbm9kZTsKKyAgZGljdC0+bmlsbm9kZS5yaWdodCA9ICZkaWN0LT5uaWxub2RlOwogfQogCiAvKgogICogT2Jzb2xlc2NlbnQgZnVuY3Rpb24sIGVxdWl2YWxlbnQgdG8gZGljdF9mcmVlX25vZGVzCiAgKi8KIAotdm9pZCBkaWN0X2ZyZWUoZGljdF90ICpkaWN0KQordm9pZAorZGljdF9mcmVlIChkaWN0X3QgKiBkaWN0KQogewogI2lmZGVmIEtBWkxJQl9PQlNPTEVTQ0VOVF9ERUJVRwotICAgIGFzc2VydCAoImNhbGwgdG8gb2Jzb2xlc2NlbnQgZnVuY3Rpb24gZGljdF9mcmVlKCkiICYmIDApOworICBhc3NlcnQgKCJjYWxsIHRvIG9ic29sZXNjZW50IGZ1bmN0aW9uIGRpY3RfZnJlZSgpIiAmJiAwKTsKICNlbmRpZgotICAgIGRpY3RfZnJlZV9ub2RlcyhkaWN0KTsKKyAgZGljdF9mcmVlX25vZGVzIChkaWN0KTsKIH0KIAogLyoKICAqIEluaXRpYWxpemUgYSB1c2VyLXN1cHBsaWVkIGRpY3Rpb25hcnkgb2JqZWN0LgogICovCiAKLWRpY3RfdCAqZGljdF9pbml0KGRpY3RfdCAqZGljdCwgZGljdGNvdW50X3QgbWF4Y291bnQsIGRpY3RfY29tcF90IGNvbXApCitkaWN0X3QgKgorZGljdF9pbml0IChkaWN0X3QgKiBkaWN0LCBkaWN0Y291bnRfdCBtYXhjb3VudCwgZGljdF9jb21wX3QgY29tcCkKIHsKLSAgICBkaWN0LT5jb21wYXJlID0gY29tcDsKLSAgICBkaWN0LT5hbGxvY25vZGUgPSBkbm9kZV9hbGxvYzsKLSAgICBkaWN0LT5mcmVlbm9kZSA9IGRub2RlX2ZyZWU7Ci0gICAgZGljdC0+Y29udGV4dCA9IE5VTEw7Ci0gICAgZGljdC0+bm9kZWNvdW50ID0gMDsKLSAgICBkaWN0LT5tYXhjb3VudCA9IG1heGNvdW50OwotICAgIGRpY3QtPm5pbG5vZGUubGVmdCA9ICZkaWN0LT5uaWxub2RlOwotICAgIGRpY3QtPm5pbG5vZGUucmlnaHQgPSAmZGljdC0+bmlsbm9kZTsKLSAgICBkaWN0LT5uaWxub2RlLnBhcmVudCA9ICZkaWN0LT5uaWxub2RlOwotICAgIGRpY3QtPm5pbG5vZGUuY29sb3IgPSBkbm9kZV9ibGFjazsKLSAgICBkaWN0LT5kdXBlcyA9IDA7Ci0gICAgcmV0dXJuIGRpY3Q7CisgIGRpY3QtPmNvbXBhcmUgPSBjb21wOworICBkaWN0LT5hbGxvY25vZGUgPSBkbm9kZV9hbGxvYzsKKyAgZGljdC0+ZnJlZW5vZGUgPSBkbm9kZV9mcmVlOworICBkaWN0LT5jb250ZXh0ID0gTlVMTDsKKyAgZGljdC0+bm9kZWNvdW50ID0gMDsKKyAgZGljdC0+bWF4Y291bnQgPSBtYXhjb3VudDsKKyAgZGljdC0+bmlsbm9kZS5sZWZ0ID0gJmRpY3QtPm5pbG5vZGU7CisgIGRpY3QtPm5pbG5vZGUucmlnaHQgPSAmZGljdC0+bmlsbm9kZTsKKyAgZGljdC0+bmlsbm9kZS5wYXJlbnQgPSAmZGljdC0+bmlsbm9kZTsKKyAgZGljdC0+bmlsbm9kZS5jb2xvciA9IGRub2RlX2JsYWNrOworICBkaWN0LT5kdXBlcyA9IDA7CisgIHJldHVybiBkaWN0OwogfQogCiAvKiAKICAqIEluaXRpYWxpemUgYSBkaWN0aW9uYXJ5IGluIHRoZSBsaWtlbmVzcyBvZiBhbm90aGVyIGRpY3Rpb25hcnkKICAqLwogCi12b2lkIGRpY3RfaW5pdF9saWtlKGRpY3RfdCAqZGljdCwgY29uc3QgZGljdF90ICp0ZW1wbGF0ZSkKK3ZvaWQKK2RpY3RfaW5pdF9saWtlIChkaWN0X3QgKiBkaWN0LCBjb25zdCBkaWN0X3QgKiB0ZW1wbGF0ZSkKIHsKLSAgICBkaWN0LT5jb21wYXJlID0gdGVtcGxhdGUtPmNvbXBhcmU7Ci0gICAgZGljdC0+YWxsb2Nub2RlID0gdGVtcGxhdGUtPmFsbG9jbm9kZTsKLSAgICBkaWN0LT5mcmVlbm9kZSA9IHRlbXBsYXRlLT5mcmVlbm9kZTsKLSAgICBkaWN0LT5jb250ZXh0ID0gdGVtcGxhdGUtPmNvbnRleHQ7Ci0gICAgZGljdC0+bm9kZWNvdW50ID0gMDsKLSAgICBkaWN0LT5tYXhjb3VudCA9IHRlbXBsYXRlLT5tYXhjb3VudDsKLSAgICBkaWN0LT5uaWxub2RlLmxlZnQgPSAmZGljdC0+bmlsbm9kZTsKLSAgICBkaWN0LT5uaWxub2RlLnJpZ2h0ID0gJmRpY3QtPm5pbG5vZGU7Ci0gICAgZGljdC0+bmlsbm9kZS5wYXJlbnQgPSAmZGljdC0+bmlsbm9kZTsKLSAgICBkaWN0LT5uaWxub2RlLmNvbG9yID0gZG5vZGVfYmxhY2s7Ci0gICAgZGljdC0+ZHVwZXMgPSB0ZW1wbGF0ZS0+ZHVwZXM7CisgIGRpY3QtPmNvbXBhcmUgPSB0ZW1wbGF0ZS0+Y29tcGFyZTsKKyAgZGljdC0+YWxsb2Nub2RlID0gdGVtcGxhdGUtPmFsbG9jbm9kZTsKKyAgZGljdC0+ZnJlZW5vZGUgPSB0ZW1wbGF0ZS0+ZnJlZW5vZGU7CisgIGRpY3QtPmNvbnRleHQgPSB0ZW1wbGF0ZS0+Y29udGV4dDsKKyAgZGljdC0+bm9kZWNvdW50ID0gMDsKKyAgZGljdC0+bWF4Y291bnQgPSB0ZW1wbGF0ZS0+bWF4Y291bnQ7CisgIGRpY3QtPm5pbG5vZGUubGVmdCA9ICZkaWN0LT5uaWxub2RlOworICBkaWN0LT5uaWxub2RlLnJpZ2h0ID0gJmRpY3QtPm5pbG5vZGU7CisgIGRpY3QtPm5pbG5vZGUucGFyZW50ID0gJmRpY3QtPm5pbG5vZGU7CisgIGRpY3QtPm5pbG5vZGUuY29sb3IgPSBkbm9kZV9ibGFjazsKKyAgZGljdC0+ZHVwZXMgPSB0ZW1wbGF0ZS0+ZHVwZXM7CiAKLSAgICBhc3NlcnQgKGRpY3Rfc2ltaWxhcihkaWN0LCB0ZW1wbGF0ZSkpOworICBhc3NlcnQgKGRpY3Rfc2ltaWxhciAoZGljdCwgdGVtcGxhdGUpKTsKIH0KIAogLyoKICAqIFJlbW92ZSBhbGwgbm9kZXMgZnJvbSB0aGUgZGljdGlvbmFyeSAod2l0aG91dCBmcmVlaW5nIHRoZW0gaW4gYW55IHdheSkuCiAgKi8KIAotc3RhdGljIHZvaWQgZGljdF9jbGVhcihkaWN0X3QgKmRpY3QpCitzdGF0aWMgdm9pZAorZGljdF9jbGVhciAoZGljdF90ICogZGljdCkKIHsKLSAgICBkaWN0LT5ub2RlY291bnQgPSAwOwotICAgIGRpY3QtPm5pbG5vZGUubGVmdCA9ICZkaWN0LT5uaWxub2RlOwotICAgIGRpY3QtPm5pbG5vZGUucmlnaHQgPSAmZGljdC0+bmlsbm9kZTsKLSAgICBkaWN0LT5uaWxub2RlLnBhcmVudCA9ICZkaWN0LT5uaWxub2RlOwotICAgIGFzc2VydCAoZGljdC0+bmlsbm9kZS5jb2xvciA9PSBkbm9kZV9ibGFjayk7CisgIGRpY3QtPm5vZGVjb3VudCA9IDA7CisgIGRpY3QtPm5pbG5vZGUubGVmdCA9ICZkaWN0LT5uaWxub2RlOworICBkaWN0LT5uaWxub2RlLnJpZ2h0ID0gJmRpY3QtPm5pbG5vZGU7CisgIGRpY3QtPm5pbG5vZGUucGFyZW50ID0gJmRpY3QtPm5pbG5vZGU7CisgIGFzc2VydCAoZGljdC0+bmlsbm9kZS5jb2xvciA9PSBkbm9kZV9ibGFjayk7CiB9CiAKLQogLyoKICAqIFZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoZSBkaWN0aW9uYXJ5IHN0cnVjdHVyZS4gIFRoaXMgaXMgcHJvdmlkZWQgZm9yCiAgKiBkZWJ1Z2dpbmcgcHVycG9zZXMsIGFuZCBzaG91bGQgYmUgcGxhY2VkIGluIGFzc2VydCBzdGF0ZW1lbnRzLiAgIEp1c3QgYmVjYXVzZQogICogdGhpcyBmdW5jdGlvbiBzdWNjZWVkcyBkb2Vzbid0IG1lYW4gdGhhdCB0aGUgdHJlZSBpcyBub3QgY29ycnVwdC4gQ2VydGFpbgogICogY29ycnVwdGlvbnMgaW4gdGhlIHRyZWUgbWF5IHNpbXBseSBjYXVzZSB1bmRlZmluZWQgYmVoYXZpb3IuCi0gKi8gCisgKi8KIAotaW50IGRpY3RfdmVyaWZ5KGRpY3RfdCAqZGljdCkKK2ludAorZGljdF92ZXJpZnkgKGRpY3RfdCAqIGRpY3QpCiB7Ci0gICAgZG5vZGVfdCAqbmlsID0gZGljdF9uaWwoZGljdCksICpyb290ID0gZGljdF9yb290KGRpY3QpOworICBkbm9kZV90ICpuaWwgPSBkaWN0X25pbCAoZGljdCksICpyb290ID0gZGljdF9yb290IChkaWN0KTsKIAotICAgIC8qIGNoZWNrIHRoYXQgdGhlIHNlbnRpbmVsIG5vZGUgYW5kIHJvb3Qgbm9kZSBhcmUgYmxhY2sgKi8KLSAgICBpZiAocm9vdC0+Y29sb3IgIT0gZG5vZGVfYmxhY2spCi0JcmV0dXJuIDA7Ci0gICAgaWYgKG5pbC0+Y29sb3IgIT0gZG5vZGVfYmxhY2spCi0JcmV0dXJuIDA7Ci0gICAgaWYgKG5pbC0+cmlnaHQgIT0gbmlsKQotCXJldHVybiAwOwotICAgIC8qIG5pbC0+bGVmdCBpcyB0aGUgcm9vdCBub2RlOyBjaGVjayB0aGF0IGl0cyBwYXJlbnQgcG9pbnRlciBpcyBuaWwgKi8KLSAgICBpZiAobmlsLT5sZWZ0LT5wYXJlbnQgIT0gbmlsKQotCXJldHVybiAwOwotICAgIC8qIHBlcmZvcm0gYSB3ZWFrIHRlc3QgdGhhdCB0aGUgdHJlZSBpcyBhIGJpbmFyeSBzZWFyY2ggdHJlZSAqLwotICAgIGlmICghdmVyaWZ5X2JpbnRyZWUoZGljdCkpCi0JcmV0dXJuIDA7Ci0gICAgLyogdmVyaWZ5IHRoYXQgdGhlIHRyZWUgaXMgYSByZWQtYmxhY2sgdHJlZSAqLwotICAgIGlmICghdmVyaWZ5X3JlZGJsYWNrKG5pbCwgcm9vdCkpCi0JcmV0dXJuIDA7Ci0gICAgaWYgKHZlcmlmeV9ub2RlX2NvdW50KG5pbCwgcm9vdCkgIT0gZGljdF9jb3VudChkaWN0KSkKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gMTsKKyAgLyogY2hlY2sgdGhhdCB0aGUgc2VudGluZWwgbm9kZSBhbmQgcm9vdCBub2RlIGFyZSBibGFjayAqLworICBpZiAocm9vdC0+Y29sb3IgIT0gZG5vZGVfYmxhY2spCisgICAgcmV0dXJuIDA7CisgIGlmIChuaWwtPmNvbG9yICE9IGRub2RlX2JsYWNrKQorICAgIHJldHVybiAwOworICBpZiAobmlsLT5yaWdodCAhPSBuaWwpCisgICAgcmV0dXJuIDA7CisgIC8qIG5pbC0+bGVmdCBpcyB0aGUgcm9vdCBub2RlOyBjaGVjayB0aGF0IGl0cyBwYXJlbnQgcG9pbnRlciBpcyBuaWwgKi8KKyAgaWYgKG5pbC0+bGVmdC0+cGFyZW50ICE9IG5pbCkKKyAgICByZXR1cm4gMDsKKyAgLyogcGVyZm9ybSBhIHdlYWsgdGVzdCB0aGF0IHRoZSB0cmVlIGlzIGEgYmluYXJ5IHNlYXJjaCB0cmVlICovCisgIGlmICghdmVyaWZ5X2JpbnRyZWUgKGRpY3QpKQorICAgIHJldHVybiAwOworICAvKiB2ZXJpZnkgdGhhdCB0aGUgdHJlZSBpcyBhIHJlZC1ibGFjayB0cmVlICovCisgIGlmICghdmVyaWZ5X3JlZGJsYWNrIChuaWwsIHJvb3QpKQorICAgIHJldHVybiAwOworICBpZiAodmVyaWZ5X25vZGVfY291bnQgKG5pbCwgcm9vdCkgIT0gZGljdF9jb3VudCAoZGljdCkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAxOwogfQogCiAvKgpAQCAtNDA3LDI0ICs0MzcsMjUgQEAKICAqIGFsbG9jYXRvciBmdW5jdGlvbnMsIGFuZCBzYW1lIHN0YXR1cyBhcyB0byB3aGV0aGVyIGR1cGxpY2F0ZXMgYXJlIGFsbG93ZWQuCiAgKi8KIAotaW50IGRpY3Rfc2ltaWxhcihjb25zdCBkaWN0X3QgKmxlZnQsIGNvbnN0IGRpY3RfdCAqcmlnaHQpCitpbnQKK2RpY3Rfc2ltaWxhciAoY29uc3QgZGljdF90ICogbGVmdCwgY29uc3QgZGljdF90ICogcmlnaHQpCiB7Ci0gICAgaWYgKGxlZnQtPmNvbXBhcmUgIT0gcmlnaHQtPmNvbXBhcmUpCi0JcmV0dXJuIDA7CisgIGlmIChsZWZ0LT5jb21wYXJlICE9IHJpZ2h0LT5jb21wYXJlKQorICAgIHJldHVybiAwOwogCi0gICAgaWYgKGxlZnQtPmFsbG9jbm9kZSAhPSByaWdodC0+YWxsb2Nub2RlKQotCXJldHVybiAwOworICBpZiAobGVmdC0+YWxsb2Nub2RlICE9IHJpZ2h0LT5hbGxvY25vZGUpCisgICAgcmV0dXJuIDA7CiAKLSAgICBpZiAobGVmdC0+ZnJlZW5vZGUgIT0gcmlnaHQtPmZyZWVub2RlKQotCXJldHVybiAwOworICBpZiAobGVmdC0+ZnJlZW5vZGUgIT0gcmlnaHQtPmZyZWVub2RlKQorICAgIHJldHVybiAwOwogCi0gICAgaWYgKGxlZnQtPmNvbnRleHQgIT0gcmlnaHQtPmNvbnRleHQpCi0JcmV0dXJuIDA7CisgIGlmIChsZWZ0LT5jb250ZXh0ICE9IHJpZ2h0LT5jb250ZXh0KQorICAgIHJldHVybiAwOwogCi0gICAgaWYgKGxlZnQtPmR1cGVzICE9IHJpZ2h0LT5kdXBlcykKLQlyZXR1cm4gMDsKKyAgaWYgKGxlZnQtPmR1cGVzICE9IHJpZ2h0LT5kdXBlcykKKyAgICByZXR1cm4gMDsKIAotICAgIHJldHVybiAxOworICByZXR1cm4gMTsKIH0KIAogLyoKQEAgLTQzNCwzNyArNDY1LDQ1IEBACiAgKiBsb2NhdGVkIG5vZGUgaXMgcmV0dXJuZWQuCiAgKi8KIAotZG5vZGVfdCAqZGljdF9sb29rdXAoZGljdF90ICpkaWN0LCBjb25zdCB2b2lkICprZXkpCitkbm9kZV90ICoKK2RpY3RfbG9va3VwIChkaWN0X3QgKiBkaWN0LCBjb25zdCB2b2lkICprZXkpCiB7Ci0gICAgZG5vZGVfdCAqcm9vdCA9IGRpY3Rfcm9vdChkaWN0KTsKLSAgICBkbm9kZV90ICpuaWwgPSBkaWN0X25pbChkaWN0KTsKLSAgICBkbm9kZV90ICpzYXZlZDsKLSAgICBpbnQgcmVzdWx0OworICBkbm9kZV90ICpyb290ID0gZGljdF9yb290IChkaWN0KTsKKyAgZG5vZGVfdCAqbmlsID0gZGljdF9uaWwgKGRpY3QpOworICBkbm9kZV90ICpzYXZlZDsKKyAgaW50IHJlc3VsdDsKIAotICAgIC8qIHNpbXBsZSBiaW5hcnkgc2VhcmNoIGFkYXB0ZWQgZm9yIHRyZWVzIHRoYXQgY29udGFpbiBkdXBsaWNhdGUga2V5cyAqLworICAvKiBzaW1wbGUgYmluYXJ5IHNlYXJjaCBhZGFwdGVkIGZvciB0cmVlcyB0aGF0IGNvbnRhaW4gZHVwbGljYXRlIGtleXMgKi8KIAotICAgIHdoaWxlIChyb290ICE9IG5pbCkgewotCXJlc3VsdCA9IGRpY3QtPmNvbXBhcmUoa2V5LCByb290LT5rZXkpOwotCWlmIChyZXN1bHQgPCAwKQotCSAgICByb290ID0gcm9vdC0+bGVmdDsKLQllbHNlIGlmIChyZXN1bHQgPiAwKQotCSAgICByb290ID0gcm9vdC0+cmlnaHQ7Ci0JZWxzZSB7Ci0JICAgIGlmICghZGljdC0+ZHVwZXMpIHsJLyogbm8gZHVwbGljYXRlcywgcmV0dXJuIG1hdGNoCQkqLwotCQlyZXR1cm4gcm9vdDsKLQkgICAgfSBlbHNlIHsJCS8qIGNvdWxkIGJlIGR1cGVzLCBmaW5kIGxlZnRtb3N0IG9uZQkqLwotCQlkbyB7Ci0JCSAgICBzYXZlZCA9IHJvb3Q7Ci0JCSAgICByb290ID0gcm9vdC0+bGVmdDsKLQkJICAgIHdoaWxlIChyb290ICE9IG5pbCAmJiBkaWN0LT5jb21wYXJlKGtleSwgcm9vdC0+a2V5KSkKLQkJCXJvb3QgPSByb290LT5yaWdodDsKLQkJfSB3aGlsZSAocm9vdCAhPSBuaWwpOwotCQlyZXR1cm4gc2F2ZWQ7CisgIHdoaWxlIChyb290ICE9IG5pbCkKKyAgICB7CisgICAgICByZXN1bHQgPSBkaWN0LT5jb21wYXJlIChrZXksIHJvb3QtPmtleSk7CisgICAgICBpZiAocmVzdWx0IDwgMCkKKwlyb290ID0gcm9vdC0+bGVmdDsKKyAgICAgIGVsc2UgaWYgKHJlc3VsdCA+IDApCisJcm9vdCA9IHJvb3QtPnJpZ2h0OworICAgICAgZWxzZQorCXsKKwkgIGlmICghZGljdC0+ZHVwZXMpCisJICAgIHsJCQkvKiBubyBkdXBsaWNhdGVzLCByZXR1cm4gbWF0Y2ggICAgICAgICAgKi8KKwkgICAgICByZXR1cm4gcm9vdDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CQkJLyogY291bGQgYmUgZHVwZXMsIGZpbmQgbGVmdG1vc3Qgb25lICAgICovCisJICAgICAgZG8KKwkJeworCQkgIHNhdmVkID0gcm9vdDsKKwkJICByb290ID0gcm9vdC0+bGVmdDsKKwkJICB3aGlsZSAocm9vdCAhPSBuaWwgJiYgZGljdC0+Y29tcGFyZSAoa2V5LCByb290LT5rZXkpKQorCQkgICAgcm9vdCA9IHJvb3QtPnJpZ2h0OworCQl9CisJICAgICAgd2hpbGUgKHJvb3QgIT0gbmlsKTsKKwkgICAgICByZXR1cm4gc2F2ZWQ7CiAJICAgIH0KIAl9CiAgICAgfQogCi0gICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBOVUxMOwogfQogCiAvKgpAQCAtNDcyLDMxICs1MTEsNDEgQEAKICAqIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4ga2V5LiAgSWYgdGhlcmUgaXMgbm8gc3VjaCBub2RlLCByZXR1cm4gbnVsbC4KICAqLwogCi1kbm9kZV90ICpkaWN0X2xvd2VyX2JvdW5kKGRpY3RfdCAqZGljdCwgY29uc3Qgdm9pZCAqa2V5KQorZG5vZGVfdCAqCitkaWN0X2xvd2VyX2JvdW5kIChkaWN0X3QgKiBkaWN0LCBjb25zdCB2b2lkICprZXkpCiB7Ci0gICAgZG5vZGVfdCAqcm9vdCA9IGRpY3Rfcm9vdChkaWN0KTsKLSAgICBkbm9kZV90ICpuaWwgPSBkaWN0X25pbChkaWN0KTsKLSAgICBkbm9kZV90ICp0ZW50YXRpdmUgPSAwOworICBkbm9kZV90ICpyb290ID0gZGljdF9yb290IChkaWN0KTsKKyAgZG5vZGVfdCAqbmlsID0gZGljdF9uaWwgKGRpY3QpOworICBkbm9kZV90ICp0ZW50YXRpdmUgPSAwOwogCi0gICAgd2hpbGUgKHJvb3QgIT0gbmlsKSB7Ci0JaW50IHJlc3VsdCA9IGRpY3QtPmNvbXBhcmUoa2V5LCByb290LT5rZXkpOworICB3aGlsZSAocm9vdCAhPSBuaWwpCisgICAgeworICAgICAgaW50IHJlc3VsdCA9IGRpY3QtPmNvbXBhcmUgKGtleSwgcm9vdC0+a2V5KTsKIAotCWlmIChyZXN1bHQgPiAwKSB7Ci0JICAgIHJvb3QgPSByb290LT5yaWdodDsKLQl9IGVsc2UgaWYgKHJlc3VsdCA8IDApIHsKLQkgICAgdGVudGF0aXZlID0gcm9vdDsKLQkgICAgcm9vdCA9IHJvb3QtPmxlZnQ7Ci0JfSBlbHNlIHsKLQkgICAgaWYgKCFkaWN0LT5kdXBlcykgewotCSAgICAJcmV0dXJuIHJvb3Q7Ci0JICAgIH0gZWxzZSB7Ci0JCXRlbnRhdGl2ZSA9IHJvb3Q7Ci0JCXJvb3QgPSByb290LT5sZWZ0OworICAgICAgaWYgKHJlc3VsdCA+IDApCisJeworCSAgcm9vdCA9IHJvb3QtPnJpZ2h0OworCX0KKyAgICAgIGVsc2UgaWYgKHJlc3VsdCA8IDApCisJeworCSAgdGVudGF0aXZlID0gcm9vdDsKKwkgIHJvb3QgPSByb290LT5sZWZ0OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoIWRpY3QtPmR1cGVzKQorCSAgICB7CisJICAgICAgcmV0dXJuIHJvb3Q7CiAJICAgIH0KLQl9IAorCSAgZWxzZQorCSAgICB7CisJICAgICAgdGVudGF0aXZlID0gcm9vdDsKKwkgICAgICByb290ID0gcm9vdC0+bGVmdDsKKwkgICAgfQorCX0KICAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHRlbnRhdGl2ZTsKKworICByZXR1cm4gdGVudGF0aXZlOwogfQogCiAvKgpAQCAtNTA0LDMxICs1NTMsNDEgQEAKICAqIGxvd2VyIHRoYW4gdGhlIGdpdmVuIGtleS4gIElmIHRoZXJlIGlzIG5vIHN1Y2ggbm9kZSwgcmV0dXJuIG51bGwuCiAgKi8KIAotZG5vZGVfdCAqZGljdF91cHBlcl9ib3VuZChkaWN0X3QgKmRpY3QsIGNvbnN0IHZvaWQgKmtleSkKK2Rub2RlX3QgKgorZGljdF91cHBlcl9ib3VuZCAoZGljdF90ICogZGljdCwgY29uc3Qgdm9pZCAqa2V5KQogewotICAgIGRub2RlX3QgKnJvb3QgPSBkaWN0X3Jvb3QoZGljdCk7Ci0gICAgZG5vZGVfdCAqbmlsID0gZGljdF9uaWwoZGljdCk7Ci0gICAgZG5vZGVfdCAqdGVudGF0aXZlID0gMDsKKyAgZG5vZGVfdCAqcm9vdCA9IGRpY3Rfcm9vdCAoZGljdCk7CisgIGRub2RlX3QgKm5pbCA9IGRpY3RfbmlsIChkaWN0KTsKKyAgZG5vZGVfdCAqdGVudGF0aXZlID0gMDsKIAotICAgIHdoaWxlIChyb290ICE9IG5pbCkgewotCWludCByZXN1bHQgPSBkaWN0LT5jb21wYXJlKGtleSwgcm9vdC0+a2V5KTsKKyAgd2hpbGUgKHJvb3QgIT0gbmlsKQorICAgIHsKKyAgICAgIGludCByZXN1bHQgPSBkaWN0LT5jb21wYXJlIChrZXksIHJvb3QtPmtleSk7CiAKLQlpZiAocmVzdWx0IDwgMCkgewotCSAgICByb290ID0gcm9vdC0+bGVmdDsKLQl9IGVsc2UgaWYgKHJlc3VsdCA+IDApIHsKLQkgICAgdGVudGF0aXZlID0gcm9vdDsKLQkgICAgcm9vdCA9IHJvb3QtPnJpZ2h0OwotCX0gZWxzZSB7Ci0JICAgIGlmICghZGljdC0+ZHVwZXMpIHsKLQkgICAgCXJldHVybiByb290OwotCSAgICB9IGVsc2UgewotCQl0ZW50YXRpdmUgPSByb290OwotCQlyb290ID0gcm9vdC0+cmlnaHQ7CisgICAgICBpZiAocmVzdWx0IDwgMCkKKwl7CisJICByb290ID0gcm9vdC0+bGVmdDsKKwl9CisgICAgICBlbHNlIGlmIChyZXN1bHQgPiAwKQorCXsKKwkgIHRlbnRhdGl2ZSA9IHJvb3Q7CisJICByb290ID0gcm9vdC0+cmlnaHQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmICghZGljdC0+ZHVwZXMpCisJICAgIHsKKwkgICAgICByZXR1cm4gcm9vdDsKIAkgICAgfQotCX0gCisJICBlbHNlCisJICAgIHsKKwkgICAgICB0ZW50YXRpdmUgPSByb290OworCSAgICAgIHJvb3QgPSByb290LT5yaWdodDsKKwkgICAgfQorCX0KICAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHRlbnRhdGl2ZTsKKworICByZXR1cm4gdGVudGF0aXZlOwogfQogCiAvKgpAQCAtNTM5LDk1ICs1OTgsMTA5IEBACiAgKiBmdW5jdGlvbiByZXR1cm5zIHRydWUpLgogICovCiAKLXZvaWQgZGljdF9pbnNlcnQoZGljdF90ICpkaWN0LCBkbm9kZV90ICpub2RlLCBjb25zdCB2b2lkICprZXkpCit2b2lkCitkaWN0X2luc2VydCAoZGljdF90ICogZGljdCwgZG5vZGVfdCAqIG5vZGUsIGNvbnN0IHZvaWQgKmtleSkKIHsKLSAgICBkbm9kZV90ICp3aGVyZSA9IGRpY3Rfcm9vdChkaWN0KSwgKm5pbCA9IGRpY3RfbmlsKGRpY3QpOwotICAgIGRub2RlX3QgKnBhcmVudCA9IG5pbCwgKnVuY2xlLCAqZ3JhbmRwYTsKLSAgICBpbnQgcmVzdWx0ID0gLTE7CisgIGRub2RlX3QgKndoZXJlID0gZGljdF9yb290IChkaWN0KSwgKm5pbCA9IGRpY3RfbmlsIChkaWN0KTsKKyAgZG5vZGVfdCAqcGFyZW50ID0gbmlsLCAqdW5jbGUsICpncmFuZHBhOworICBpbnQgcmVzdWx0ID0gLTE7CiAKLSAgICBub2RlLT5rZXkgPSBrZXk7CisgIG5vZGUtPmtleSA9IGtleTsKIAotICAgIGFzc2VydCAoIWRpY3RfaXNmdWxsKGRpY3QpKTsKLSAgICBhc3NlcnQgKCFkaWN0X2NvbnRhaW5zKGRpY3QsIG5vZGUpKTsKLSAgICBhc3NlcnQgKCFkbm9kZV9pc19pbl9hX2RpY3Qobm9kZSkpOworICBhc3NlcnQgKCFkaWN0X2lzZnVsbCAoZGljdCkpOworICBhc3NlcnQgKCFkaWN0X2NvbnRhaW5zIChkaWN0LCBub2RlKSk7CisgIGFzc2VydCAoIWRub2RlX2lzX2luX2FfZGljdCAobm9kZSkpOwogCi0gICAgLyogYmFzaWMgYmluYXJ5IHRyZWUgaW5zZXJ0ICovCisgIC8qIGJhc2ljIGJpbmFyeSB0cmVlIGluc2VydCAqLwogCi0gICAgd2hpbGUgKHdoZXJlICE9IG5pbCkgewotCXBhcmVudCA9IHdoZXJlOwotCXJlc3VsdCA9IGRpY3QtPmNvbXBhcmUoa2V5LCB3aGVyZS0+a2V5KTsKLQkvKiB0cmFwIGF0dGVtcHRzIGF0IGR1cGxpY2F0ZSBrZXkgaW5zZXJ0aW9uIHVubGVzcyBpdCdzIGV4cGxpY2l0bHkgYWxsb3dlZCAqLwotCWFzc2VydCAoZGljdC0+ZHVwZXMgfHwgcmVzdWx0ICE9IDApOwotCWlmIChyZXN1bHQgPCAwKQotCSAgICB3aGVyZSA9IHdoZXJlLT5sZWZ0OwotCWVsc2UKLQkgICAgd2hlcmUgPSB3aGVyZS0+cmlnaHQ7CisgIHdoaWxlICh3aGVyZSAhPSBuaWwpCisgICAgeworICAgICAgcGFyZW50ID0gd2hlcmU7CisgICAgICByZXN1bHQgPSBkaWN0LT5jb21wYXJlIChrZXksIHdoZXJlLT5rZXkpOworICAgICAgLyogdHJhcCBhdHRlbXB0cyBhdCBkdXBsaWNhdGUga2V5IGluc2VydGlvbiB1bmxlc3MgaXQncyBleHBsaWNpdGx5IGFsbG93ZWQgKi8KKyAgICAgIGFzc2VydCAoZGljdC0+ZHVwZXMgfHwgcmVzdWx0ICE9IDApOworICAgICAgaWYgKHJlc3VsdCA8IDApCisJd2hlcmUgPSB3aGVyZS0+bGVmdDsKKyAgICAgIGVsc2UKKwl3aGVyZSA9IHdoZXJlLT5yaWdodDsKICAgICB9CiAKLSAgICBhc3NlcnQgKHdoZXJlID09IG5pbCk7CisgIGFzc2VydCAod2hlcmUgPT0gbmlsKTsKIAotICAgIGlmIChyZXN1bHQgPCAwKQotCXBhcmVudC0+bGVmdCA9IG5vZGU7Ci0gICAgZWxzZQotCXBhcmVudC0+cmlnaHQgPSBub2RlOworICBpZiAocmVzdWx0IDwgMCkKKyAgICBwYXJlbnQtPmxlZnQgPSBub2RlOworICBlbHNlCisgICAgcGFyZW50LT5yaWdodCA9IG5vZGU7CiAKLSAgICBub2RlLT5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgbm9kZS0+bGVmdCA9IG5pbDsKLSAgICBub2RlLT5yaWdodCA9IG5pbDsKKyAgbm9kZS0+cGFyZW50ID0gcGFyZW50OworICBub2RlLT5sZWZ0ID0gbmlsOworICBub2RlLT5yaWdodCA9IG5pbDsKIAotICAgIGRpY3QtPm5vZGVjb3VudCsrOworICBkaWN0LT5ub2RlY291bnQrKzsKIAotICAgIC8qIHJlZCBibGFjayBhZGp1c3RtZW50cyAqLworICAvKiByZWQgYmxhY2sgYWRqdXN0bWVudHMgKi8KIAotICAgIG5vZGUtPmNvbG9yID0gZG5vZGVfcmVkOworICBub2RlLT5jb2xvciA9IGRub2RlX3JlZDsKIAotICAgIHdoaWxlIChwYXJlbnQtPmNvbG9yID09IGRub2RlX3JlZCkgewotCWdyYW5kcGEgPSBwYXJlbnQtPnBhcmVudDsKLQlpZiAocGFyZW50ID09IGdyYW5kcGEtPmxlZnQpIHsKLQkgICAgdW5jbGUgPSBncmFuZHBhLT5yaWdodDsKLQkgICAgaWYgKHVuY2xlLT5jb2xvciA9PSBkbm9kZV9yZWQpIHsJLyogcmVkIHBhcmVudCwgcmVkIHVuY2xlICovCi0JCXBhcmVudC0+Y29sb3IgPSBkbm9kZV9ibGFjazsKLQkJdW5jbGUtPmNvbG9yID0gZG5vZGVfYmxhY2s7Ci0JCWdyYW5kcGEtPmNvbG9yID0gZG5vZGVfcmVkOwotCQlub2RlID0gZ3JhbmRwYTsKLQkJcGFyZW50ID0gZ3JhbmRwYS0+cGFyZW50OwotCSAgICB9IGVsc2UgewkJCQkvKiByZWQgcGFyZW50LCBibGFjayB1bmNsZSAqLwotCSAgICAJaWYgKG5vZGUgPT0gcGFyZW50LT5yaWdodCkgewotCQkgICAgcm90YXRlX2xlZnQocGFyZW50KTsKLQkJICAgIHBhcmVudCA9IG5vZGU7Ci0JCSAgICBhc3NlcnQgKGdyYW5kcGEgPT0gcGFyZW50LT5wYXJlbnQpOwotCQkgICAgLyogcm90YXRpb24gYmV0d2VlbiBwYXJlbnQgYW5kIGNoaWxkIHByZXNlcnZlcyBncmFuZHBhICovCi0JCX0KLQkJcGFyZW50LT5jb2xvciA9IGRub2RlX2JsYWNrOwotCQlncmFuZHBhLT5jb2xvciA9IGRub2RlX3JlZDsKLQkJcm90YXRlX3JpZ2h0KGdyYW5kcGEpOwotCQlicmVhazsKKyAgd2hpbGUgKHBhcmVudC0+Y29sb3IgPT0gZG5vZGVfcmVkKQorICAgIHsKKyAgICAgIGdyYW5kcGEgPSBwYXJlbnQtPnBhcmVudDsKKyAgICAgIGlmIChwYXJlbnQgPT0gZ3JhbmRwYS0+bGVmdCkKKwl7CisJICB1bmNsZSA9IGdyYW5kcGEtPnJpZ2h0OworCSAgaWYgKHVuY2xlLT5jb2xvciA9PSBkbm9kZV9yZWQpCisJICAgIHsJCQkvKiByZWQgcGFyZW50LCByZWQgdW5jbGUgKi8KKwkgICAgICBwYXJlbnQtPmNvbG9yID0gZG5vZGVfYmxhY2s7CisJICAgICAgdW5jbGUtPmNvbG9yID0gZG5vZGVfYmxhY2s7CisJICAgICAgZ3JhbmRwYS0+Y29sb3IgPSBkbm9kZV9yZWQ7CisJICAgICAgbm9kZSA9IGdyYW5kcGE7CisJICAgICAgcGFyZW50ID0gZ3JhbmRwYS0+cGFyZW50OwogCSAgICB9Ci0JfSBlbHNlIHsgCS8qIHN5bW1ldHJpYyBjYXNlczogcGFyZW50ID09IHBhcmVudC0+cGFyZW50LT5yaWdodCAqLwotCSAgICB1bmNsZSA9IGdyYW5kcGEtPmxlZnQ7Ci0JICAgIGlmICh1bmNsZS0+Y29sb3IgPT0gZG5vZGVfcmVkKSB7Ci0JCXBhcmVudC0+Y29sb3IgPSBkbm9kZV9ibGFjazsKLQkJdW5jbGUtPmNvbG9yID0gZG5vZGVfYmxhY2s7Ci0JCWdyYW5kcGEtPmNvbG9yID0gZG5vZGVfcmVkOwotCQlub2RlID0gZ3JhbmRwYTsKLQkJcGFyZW50ID0gZ3JhbmRwYS0+cGFyZW50OwotCSAgICB9IGVsc2UgewotCSAgICAJaWYgKG5vZGUgPT0gcGFyZW50LT5sZWZ0KSB7Ci0JCSAgICByb3RhdGVfcmlnaHQocGFyZW50KTsKLQkJICAgIHBhcmVudCA9IG5vZGU7Ci0JCSAgICBhc3NlcnQgKGdyYW5kcGEgPT0gcGFyZW50LT5wYXJlbnQpOworCSAgZWxzZQorCSAgICB7CQkJLyogcmVkIHBhcmVudCwgYmxhY2sgdW5jbGUgKi8KKwkgICAgICBpZiAobm9kZSA9PSBwYXJlbnQtPnJpZ2h0KQorCQl7CisJCSAgcm90YXRlX2xlZnQgKHBhcmVudCk7CisJCSAgcGFyZW50ID0gbm9kZTsKKwkJICBhc3NlcnQgKGdyYW5kcGEgPT0gcGFyZW50LT5wYXJlbnQpOworCQkgIC8qIHJvdGF0aW9uIGJldHdlZW4gcGFyZW50IGFuZCBjaGlsZCBwcmVzZXJ2ZXMgZ3JhbmRwYSAqLwogCQl9Ci0JCXBhcmVudC0+Y29sb3IgPSBkbm9kZV9ibGFjazsKLQkJZ3JhbmRwYS0+Y29sb3IgPSBkbm9kZV9yZWQ7Ci0JCXJvdGF0ZV9sZWZ0KGdyYW5kcGEpOwotCQlicmVhazsKKwkgICAgICBwYXJlbnQtPmNvbG9yID0gZG5vZGVfYmxhY2s7CisJICAgICAgZ3JhbmRwYS0+Y29sb3IgPSBkbm9kZV9yZWQ7CisJICAgICAgcm90YXRlX3JpZ2h0IChncmFuZHBhKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CQkJLyogc3ltbWV0cmljIGNhc2VzOiBwYXJlbnQgPT0gcGFyZW50LT5wYXJlbnQtPnJpZ2h0ICovCisJICB1bmNsZSA9IGdyYW5kcGEtPmxlZnQ7CisJICBpZiAodW5jbGUtPmNvbG9yID09IGRub2RlX3JlZCkKKwkgICAgeworCSAgICAgIHBhcmVudC0+Y29sb3IgPSBkbm9kZV9ibGFjazsKKwkgICAgICB1bmNsZS0+Y29sb3IgPSBkbm9kZV9ibGFjazsKKwkgICAgICBncmFuZHBhLT5jb2xvciA9IGRub2RlX3JlZDsKKwkgICAgICBub2RlID0gZ3JhbmRwYTsKKwkgICAgICBwYXJlbnQgPSBncmFuZHBhLT5wYXJlbnQ7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChub2RlID09IHBhcmVudC0+bGVmdCkKKwkJeworCQkgIHJvdGF0ZV9yaWdodCAocGFyZW50KTsKKwkJICBwYXJlbnQgPSBub2RlOworCQkgIGFzc2VydCAoZ3JhbmRwYSA9PSBwYXJlbnQtPnBhcmVudCk7CisJCX0KKwkgICAgICBwYXJlbnQtPmNvbG9yID0gZG5vZGVfYmxhY2s7CisJICAgICAgZ3JhbmRwYS0+Y29sb3IgPSBkbm9kZV9yZWQ7CisJICAgICAgcm90YXRlX2xlZnQgKGdyYW5kcGEpOworCSAgICAgIGJyZWFrOwogCSAgICB9CiAJfQogICAgIH0KIAotICAgIGRpY3Rfcm9vdChkaWN0KS0+Y29sb3IgPSBkbm9kZV9ibGFjazsKKyAgZGljdF9yb290IChkaWN0KS0+Y29sb3IgPSBkbm9kZV9ibGFjazsKIAotICAgIGFzc2VydCAoZGljdF92ZXJpZnkoZGljdCkpOworICBhc3NlcnQgKGRpY3RfdmVyaWZ5IChkaWN0KSk7CiB9CiAKIC8qCkBAIC02MzYsMTczICs3MDksMjAxIEBACiAgKiBkZWxldGVkIG5vZGUgaXMgcmV0dXJuZWQuCiAgKi8KIAotZG5vZGVfdCAqZGljdF9kZWxldGUoZGljdF90ICpkaWN0LCBkbm9kZV90ICpkZWxldGUpCitkbm9kZV90ICoKK2RpY3RfZGVsZXRlIChkaWN0X3QgKiBkaWN0LCBkbm9kZV90ICogZGVsZXRlKQogewotICAgIGRub2RlX3QgKm5pbCA9IGRpY3RfbmlsKGRpY3QpLCAqY2hpbGQsICpkZWxwYXJlbnQgPSBkZWxldGUtPnBhcmVudDsKKyAgZG5vZGVfdCAqbmlsID0gZGljdF9uaWwgKGRpY3QpLCAqY2hpbGQsICpkZWxwYXJlbnQgPSBkZWxldGUtPnBhcmVudDsKIAotICAgIC8qIGJhc2ljIGRlbGV0aW9uICovCisgIC8qIGJhc2ljIGRlbGV0aW9uICovCiAKLSAgICBhc3NlcnQgKCFkaWN0X2lzZW1wdHkoZGljdCkpOwotICAgIGFzc2VydCAoZGljdF9jb250YWlucyhkaWN0LCBkZWxldGUpKTsKKyAgYXNzZXJ0ICghZGljdF9pc2VtcHR5IChkaWN0KSk7CisgIGFzc2VydCAoZGljdF9jb250YWlucyAoZGljdCwgZGVsZXRlKSk7CiAKLSAgICAvKgotICAgICAqIElmIHRoZSBub2RlIGJlaW5nIGRlbGV0ZWQgaGFzIHR3byBjaGlsZHJlbiwgdGhlbiB3ZSByZXBsYWNlIGl0IHdpdGggaXRzCi0gICAgICogc3VjY2Vzc29yIChpLmUuIHRoZSBsZWZ0bW9zdCBub2RlIGluIHRoZSByaWdodCBzdWJ0cmVlLikgQnkgZG9pbmcgdGhpcywKLSAgICAgKiB3ZSBhdm9pZCB0aGUgdHJhZGl0aW9uYWwgYWxnb3JpdGhtIHVuZGVyIHdoaWNoIHRoZSBzdWNjZXNzb3IncyBrZXkgYW5kCi0gICAgICogdmFsdWUgKm9ubHkqIG1vdmUgdG8gdGhlIGRlbGV0ZWQgbm9kZSBhbmQgdGhlIHN1Y2Nlc3NvciBpcyBzcGxpY2VkIG91dAotICAgICAqIGZyb20gdGhlIHRyZWUuIFdlIGNhbm5vdCB1c2UgdGhpcyBhcHByb2FjaCBiZWNhdXNlIHRoZSB1c2VyIG1heSBob2xkCi0gICAgICogcG9pbnRlcnMgdG8gdGhlIHN1Y2Nlc3Nvciwgb3Igbm9kZXMgbWF5IGJlIGluZXh0cmljYWJseSB0aWVkIHRvIHNvbWUKLSAgICAgKiBvdGhlciBzdHJ1Y3R1cmVzIGJ5IHdheSBvZiBlbWJlZGRpbmcsIGV0Yy4gU28gd2UgbXVzdCBzcGxpY2Ugb3V0IHRoZQotICAgICAqIG5vZGUgd2UgYXJlIGdpdmVuLCBub3Qgc29tZSBvdGhlciBub2RlLCBhbmQgbXVzdCBub3QgbW92ZSBjb250ZW50cyBmcm9tCi0gICAgICogb25lIG5vZGUgdG8gYW5vdGhlciBiZWhpbmQgdGhlIHVzZXIncyBiYWNrLgotICAgICAqLworICAvKgorICAgKiBJZiB0aGUgbm9kZSBiZWluZyBkZWxldGVkIGhhcyB0d28gY2hpbGRyZW4sIHRoZW4gd2UgcmVwbGFjZSBpdCB3aXRoIGl0cworICAgKiBzdWNjZXNzb3IgKGkuZS4gdGhlIGxlZnRtb3N0IG5vZGUgaW4gdGhlIHJpZ2h0IHN1YnRyZWUuKSBCeSBkb2luZyB0aGlzLAorICAgKiB3ZSBhdm9pZCB0aGUgdHJhZGl0aW9uYWwgYWxnb3JpdGhtIHVuZGVyIHdoaWNoIHRoZSBzdWNjZXNzb3IncyBrZXkgYW5kCisgICAqIHZhbHVlICpvbmx5KiBtb3ZlIHRvIHRoZSBkZWxldGVkIG5vZGUgYW5kIHRoZSBzdWNjZXNzb3IgaXMgc3BsaWNlZCBvdXQKKyAgICogZnJvbSB0aGUgdHJlZS4gV2UgY2Fubm90IHVzZSB0aGlzIGFwcHJvYWNoIGJlY2F1c2UgdGhlIHVzZXIgbWF5IGhvbGQKKyAgICogcG9pbnRlcnMgdG8gdGhlIHN1Y2Nlc3Nvciwgb3Igbm9kZXMgbWF5IGJlIGluZXh0cmljYWJseSB0aWVkIHRvIHNvbWUKKyAgICogb3RoZXIgc3RydWN0dXJlcyBieSB3YXkgb2YgZW1iZWRkaW5nLCBldGMuIFNvIHdlIG11c3Qgc3BsaWNlIG91dCB0aGUKKyAgICogbm9kZSB3ZSBhcmUgZ2l2ZW4sIG5vdCBzb21lIG90aGVyIG5vZGUsIGFuZCBtdXN0IG5vdCBtb3ZlIGNvbnRlbnRzIGZyb20KKyAgICogb25lIG5vZGUgdG8gYW5vdGhlciBiZWhpbmQgdGhlIHVzZXIncyBiYWNrLgorICAgKi8KIAotICAgIGlmIChkZWxldGUtPmxlZnQgIT0gbmlsICYmIGRlbGV0ZS0+cmlnaHQgIT0gbmlsKSB7Ci0JZG5vZGVfdCAqbmV4dCA9IGRpY3RfbmV4dChkaWN0LCBkZWxldGUpOwotCWRub2RlX3QgKm5leHRwYXJlbnQgPSBuZXh0LT5wYXJlbnQ7Ci0JZG5vZGVfY29sb3JfdCBuZXh0Y29sb3IgPSBuZXh0LT5jb2xvcjsKKyAgaWYgKGRlbGV0ZS0+bGVmdCAhPSBuaWwgJiYgZGVsZXRlLT5yaWdodCAhPSBuaWwpCisgICAgeworICAgICAgZG5vZGVfdCAqbmV4dCA9IGRpY3RfbmV4dCAoZGljdCwgZGVsZXRlKTsKKyAgICAgIGRub2RlX3QgKm5leHRwYXJlbnQgPSBuZXh0LT5wYXJlbnQ7CisgICAgICBkbm9kZV9jb2xvcl90IG5leHRjb2xvciA9IG5leHQtPmNvbG9yOwogCi0JYXNzZXJ0IChuZXh0ICE9IG5pbCk7Ci0JYXNzZXJ0IChuZXh0LT5wYXJlbnQgIT0gbmlsKTsKLQlhc3NlcnQgKG5leHQtPmxlZnQgPT0gbmlsKTsKKyAgICAgIGFzc2VydCAobmV4dCAhPSBuaWwpOworICAgICAgYXNzZXJ0IChuZXh0LT5wYXJlbnQgIT0gbmlsKTsKKyAgICAgIGFzc2VydCAobmV4dC0+bGVmdCA9PSBuaWwpOwogCi0JLyoKLQkgKiBGaXJzdCwgc3BsaWNlIG91dCB0aGUgc3VjY2Vzc29yIGZyb20gdGhlIHRyZWUgY29tcGxldGVseSwgYnkKLQkgKiBtb3ZpbmcgdXAgaXRzIHJpZ2h0IGNoaWxkIGludG8gaXRzIHBsYWNlLgotCSAqLworICAgICAgLyoKKyAgICAgICAqIEZpcnN0LCBzcGxpY2Ugb3V0IHRoZSBzdWNjZXNzb3IgZnJvbSB0aGUgdHJlZSBjb21wbGV0ZWx5LCBieQorICAgICAgICogbW92aW5nIHVwIGl0cyByaWdodCBjaGlsZCBpbnRvIGl0cyBwbGFjZS4KKyAgICAgICAqLwogCi0JY2hpbGQgPSBuZXh0LT5yaWdodDsKLQljaGlsZC0+cGFyZW50ID0gbmV4dHBhcmVudDsKKyAgICAgIGNoaWxkID0gbmV4dC0+cmlnaHQ7CisgICAgICBjaGlsZC0+cGFyZW50ID0gbmV4dHBhcmVudDsKIAotCWlmIChuZXh0cGFyZW50LT5sZWZ0ID09IG5leHQpIHsKLQkgICAgbmV4dHBhcmVudC0+bGVmdCA9IGNoaWxkOwotCX0gZWxzZSB7Ci0JICAgIGFzc2VydCAobmV4dHBhcmVudC0+cmlnaHQgPT0gbmV4dCk7Ci0JICAgIG5leHRwYXJlbnQtPnJpZ2h0ID0gY2hpbGQ7CisgICAgICBpZiAobmV4dHBhcmVudC0+bGVmdCA9PSBuZXh0KQorCXsKKwkgIG5leHRwYXJlbnQtPmxlZnQgPSBjaGlsZDsKKwl9CisgICAgICBlbHNlCisJeworCSAgYXNzZXJ0IChuZXh0cGFyZW50LT5yaWdodCA9PSBuZXh0KTsKKwkgIG5leHRwYXJlbnQtPnJpZ2h0ID0gY2hpbGQ7CiAJfQogCi0JLyoKLQkgKiBOb3cgdGhhdCB0aGUgc3VjY2Vzc29yIGhhcyBiZWVuIGV4dHJpY2F0ZWQgZnJvbSB0aGUgdHJlZSwgaW5zdGFsbCBpdAotCSAqIGluIHBsYWNlIG9mIHRoZSBub2RlIHRoYXQgd2Ugd2FudCBkZWxldGVkLgotCSAqLworICAgICAgLyoKKyAgICAgICAqIE5vdyB0aGF0IHRoZSBzdWNjZXNzb3IgaGFzIGJlZW4gZXh0cmljYXRlZCBmcm9tIHRoZSB0cmVlLCBpbnN0YWxsIGl0CisgICAgICAgKiBpbiBwbGFjZSBvZiB0aGUgbm9kZSB0aGF0IHdlIHdhbnQgZGVsZXRlZC4KKyAgICAgICAqLwogCi0JbmV4dC0+cGFyZW50ID0gZGVscGFyZW50OwotCW5leHQtPmxlZnQgPSBkZWxldGUtPmxlZnQ7Ci0JbmV4dC0+cmlnaHQgPSBkZWxldGUtPnJpZ2h0OwotCW5leHQtPmxlZnQtPnBhcmVudCA9IG5leHQ7Ci0JbmV4dC0+cmlnaHQtPnBhcmVudCA9IG5leHQ7Ci0JbmV4dC0+Y29sb3IgPSBkZWxldGUtPmNvbG9yOwotCWRlbGV0ZS0+Y29sb3IgPSBuZXh0Y29sb3I7CisgICAgICBuZXh0LT5wYXJlbnQgPSBkZWxwYXJlbnQ7CisgICAgICBuZXh0LT5sZWZ0ID0gZGVsZXRlLT5sZWZ0OworICAgICAgbmV4dC0+cmlnaHQgPSBkZWxldGUtPnJpZ2h0OworICAgICAgbmV4dC0+bGVmdC0+cGFyZW50ID0gbmV4dDsKKyAgICAgIG5leHQtPnJpZ2h0LT5wYXJlbnQgPSBuZXh0OworICAgICAgbmV4dC0+Y29sb3IgPSBkZWxldGUtPmNvbG9yOworICAgICAgZGVsZXRlLT5jb2xvciA9IG5leHRjb2xvcjsKIAotCWlmIChkZWxwYXJlbnQtPmxlZnQgPT0gZGVsZXRlKSB7Ci0JICAgIGRlbHBhcmVudC0+bGVmdCA9IG5leHQ7Ci0JfSBlbHNlIHsKLQkgICAgYXNzZXJ0IChkZWxwYXJlbnQtPnJpZ2h0ID09IGRlbGV0ZSk7Ci0JICAgIGRlbHBhcmVudC0+cmlnaHQgPSBuZXh0OworICAgICAgaWYgKGRlbHBhcmVudC0+bGVmdCA9PSBkZWxldGUpCisJeworCSAgZGVscGFyZW50LT5sZWZ0ID0gbmV4dDsKKwl9CisgICAgICBlbHNlCisJeworCSAgYXNzZXJ0IChkZWxwYXJlbnQtPnJpZ2h0ID09IGRlbGV0ZSk7CisJICBkZWxwYXJlbnQtPnJpZ2h0ID0gbmV4dDsKIAl9CiAKLSAgICB9IGVsc2UgewotCWFzc2VydCAoZGVsZXRlICE9IG5pbCk7Ci0JYXNzZXJ0IChkZWxldGUtPmxlZnQgPT0gbmlsIHx8IGRlbGV0ZS0+cmlnaHQgPT0gbmlsKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBhc3NlcnQgKGRlbGV0ZSAhPSBuaWwpOworICAgICAgYXNzZXJ0IChkZWxldGUtPmxlZnQgPT0gbmlsIHx8IGRlbGV0ZS0+cmlnaHQgPT0gbmlsKTsKIAotCWNoaWxkID0gKGRlbGV0ZS0+bGVmdCAhPSBuaWwpID8gZGVsZXRlLT5sZWZ0IDogZGVsZXRlLT5yaWdodDsKKyAgICAgIGNoaWxkID0gKGRlbGV0ZS0+bGVmdCAhPSBuaWwpID8gZGVsZXRlLT5sZWZ0IDogZGVsZXRlLT5yaWdodDsKIAotCWNoaWxkLT5wYXJlbnQgPSBkZWxwYXJlbnQgPSBkZWxldGUtPnBhcmVudDsJICAgIAorICAgICAgY2hpbGQtPnBhcmVudCA9IGRlbHBhcmVudCA9IGRlbGV0ZS0+cGFyZW50OwogCi0JaWYgKGRlbGV0ZSA9PSBkZWxwYXJlbnQtPmxlZnQpIHsKLQkgICAgZGVscGFyZW50LT5sZWZ0ID0gY2hpbGQ7ICAgIAotCX0gZWxzZSB7Ci0JICAgIGFzc2VydCAoZGVsZXRlID09IGRlbHBhcmVudC0+cmlnaHQpOwotCSAgICBkZWxwYXJlbnQtPnJpZ2h0ID0gY2hpbGQ7CisgICAgICBpZiAoZGVsZXRlID09IGRlbHBhcmVudC0+bGVmdCkKKwl7CisJICBkZWxwYXJlbnQtPmxlZnQgPSBjaGlsZDsKKwl9CisgICAgICBlbHNlCisJeworCSAgYXNzZXJ0IChkZWxldGUgPT0gZGVscGFyZW50LT5yaWdodCk7CisJICBkZWxwYXJlbnQtPnJpZ2h0ID0gY2hpbGQ7CiAJfQogICAgIH0KIAotICAgIGRlbGV0ZS0+cGFyZW50ID0gTlVMTDsKLSAgICBkZWxldGUtPnJpZ2h0ID0gTlVMTDsKLSAgICBkZWxldGUtPmxlZnQgPSBOVUxMOworICBkZWxldGUtPnBhcmVudCA9IE5VTEw7CisgIGRlbGV0ZS0+cmlnaHQgPSBOVUxMOworICBkZWxldGUtPmxlZnQgPSBOVUxMOwogCi0gICAgZGljdC0+bm9kZWNvdW50LS07CisgIGRpY3QtPm5vZGVjb3VudC0tOwogCi0gICAgYXNzZXJ0ICh2ZXJpZnlfYmludHJlZShkaWN0KSk7CisgIGFzc2VydCAodmVyaWZ5X2JpbnRyZWUgKGRpY3QpKTsKIAotICAgIC8qIHJlZC1ibGFjayBhZGp1c3RtZW50cyAqLworICAvKiByZWQtYmxhY2sgYWRqdXN0bWVudHMgKi8KIAotICAgIGlmIChkZWxldGUtPmNvbG9yID09IGRub2RlX2JsYWNrKSB7Ci0JZG5vZGVfdCAqcGFyZW50LCAqc2lzdGVyOworICBpZiAoZGVsZXRlLT5jb2xvciA9PSBkbm9kZV9ibGFjaykKKyAgICB7CisgICAgICBkbm9kZV90ICpwYXJlbnQsICpzaXN0ZXI7CiAKLQlkaWN0X3Jvb3QoZGljdCktPmNvbG9yID0gZG5vZGVfcmVkOworICAgICAgZGljdF9yb290IChkaWN0KS0+Y29sb3IgPSBkbm9kZV9yZWQ7CiAKLQl3aGlsZSAoY2hpbGQtPmNvbG9yID09IGRub2RlX2JsYWNrKSB7Ci0JICAgIHBhcmVudCA9IGNoaWxkLT5wYXJlbnQ7Ci0JICAgIGlmIChjaGlsZCA9PSBwYXJlbnQtPmxlZnQpIHsKLQkJc2lzdGVyID0gcGFyZW50LT5yaWdodDsKLQkJYXNzZXJ0IChzaXN0ZXIgIT0gbmlsKTsKLQkJaWYgKHNpc3Rlci0+Y29sb3IgPT0gZG5vZGVfcmVkKSB7Ci0JCSAgICBzaXN0ZXItPmNvbG9yID0gZG5vZGVfYmxhY2s7Ci0JCSAgICBwYXJlbnQtPmNvbG9yID0gZG5vZGVfcmVkOwotCQkgICAgcm90YXRlX2xlZnQocGFyZW50KTsKLQkJICAgIHNpc3RlciA9IHBhcmVudC0+cmlnaHQ7Ci0JCSAgICBhc3NlcnQgKHNpc3RlciAhPSBuaWwpOworICAgICAgd2hpbGUgKGNoaWxkLT5jb2xvciA9PSBkbm9kZV9ibGFjaykKKwl7CisJICBwYXJlbnQgPSBjaGlsZC0+cGFyZW50OworCSAgaWYgKGNoaWxkID09IHBhcmVudC0+bGVmdCkKKwkgICAgeworCSAgICAgIHNpc3RlciA9IHBhcmVudC0+cmlnaHQ7CisJICAgICAgYXNzZXJ0IChzaXN0ZXIgIT0gbmlsKTsKKwkgICAgICBpZiAoc2lzdGVyLT5jb2xvciA9PSBkbm9kZV9yZWQpCisJCXsKKwkJICBzaXN0ZXItPmNvbG9yID0gZG5vZGVfYmxhY2s7CisJCSAgcGFyZW50LT5jb2xvciA9IGRub2RlX3JlZDsKKwkJICByb3RhdGVfbGVmdCAocGFyZW50KTsKKwkJICBzaXN0ZXIgPSBwYXJlbnQtPnJpZ2h0OworCQkgIGFzc2VydCAoc2lzdGVyICE9IG5pbCk7CiAJCX0KLQkJaWYgKHNpc3Rlci0+bGVmdC0+Y29sb3IgPT0gZG5vZGVfYmxhY2sKLQkJCSYmIHNpc3Rlci0+cmlnaHQtPmNvbG9yID09IGRub2RlX2JsYWNrKSB7Ci0JCSAgICBzaXN0ZXItPmNvbG9yID0gZG5vZGVfcmVkOwotCQkgICAgY2hpbGQgPSBwYXJlbnQ7Ci0JCX0gZWxzZSB7Ci0JCSAgICBpZiAoc2lzdGVyLT5yaWdodC0+Y29sb3IgPT0gZG5vZGVfYmxhY2spIHsKLQkJCWFzc2VydCAoc2lzdGVyLT5sZWZ0LT5jb2xvciA9PSBkbm9kZV9yZWQpOwotCQkJc2lzdGVyLT5sZWZ0LT5jb2xvciA9IGRub2RlX2JsYWNrOwotCQkJc2lzdGVyLT5jb2xvciA9IGRub2RlX3JlZDsKLQkJCXJvdGF0ZV9yaWdodChzaXN0ZXIpOwotCQkJc2lzdGVyID0gcGFyZW50LT5yaWdodDsKLQkJCWFzc2VydCAoc2lzdGVyICE9IG5pbCk7CisJICAgICAgaWYgKHNpc3Rlci0+bGVmdC0+Y29sb3IgPT0gZG5vZGVfYmxhY2sKKwkJICAmJiBzaXN0ZXItPnJpZ2h0LT5jb2xvciA9PSBkbm9kZV9ibGFjaykKKwkJeworCQkgIHNpc3Rlci0+Y29sb3IgPSBkbm9kZV9yZWQ7CisJCSAgY2hpbGQgPSBwYXJlbnQ7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAoc2lzdGVyLT5yaWdodC0+Y29sb3IgPT0gZG5vZGVfYmxhY2spCisJCSAgICB7CisJCSAgICAgIGFzc2VydCAoc2lzdGVyLT5sZWZ0LT5jb2xvciA9PSBkbm9kZV9yZWQpOworCQkgICAgICBzaXN0ZXItPmxlZnQtPmNvbG9yID0gZG5vZGVfYmxhY2s7CisJCSAgICAgIHNpc3Rlci0+Y29sb3IgPSBkbm9kZV9yZWQ7CisJCSAgICAgIHJvdGF0ZV9yaWdodCAoc2lzdGVyKTsKKwkJICAgICAgc2lzdGVyID0gcGFyZW50LT5yaWdodDsKKwkJICAgICAgYXNzZXJ0IChzaXN0ZXIgIT0gbmlsKTsKIAkJICAgIH0KLQkJICAgIHNpc3Rlci0+Y29sb3IgPSBwYXJlbnQtPmNvbG9yOwotCQkgICAgc2lzdGVyLT5yaWdodC0+Y29sb3IgPSBkbm9kZV9ibGFjazsKLQkJICAgIHBhcmVudC0+Y29sb3IgPSBkbm9kZV9ibGFjazsKLQkJICAgIHJvdGF0ZV9sZWZ0KHBhcmVudCk7Ci0JCSAgICBicmVhazsKKwkJICBzaXN0ZXItPmNvbG9yID0gcGFyZW50LT5jb2xvcjsKKwkJICBzaXN0ZXItPnJpZ2h0LT5jb2xvciA9IGRub2RlX2JsYWNrOworCQkgIHBhcmVudC0+Y29sb3IgPSBkbm9kZV9ibGFjazsKKwkJICByb3RhdGVfbGVmdCAocGFyZW50KTsKKwkJICBicmVhazsKIAkJfQotCSAgICB9IGVsc2UgewkvKiBzeW1tZXRyaWMgY2FzZTogY2hpbGQgPT0gY2hpbGQtPnBhcmVudC0+cmlnaHQgKi8KLQkJYXNzZXJ0IChjaGlsZCA9PSBwYXJlbnQtPnJpZ2h0KTsKLQkJc2lzdGVyID0gcGFyZW50LT5sZWZ0OwotCQlhc3NlcnQgKHNpc3RlciAhPSBuaWwpOwotCQlpZiAoc2lzdGVyLT5jb2xvciA9PSBkbm9kZV9yZWQpIHsKLQkJICAgIHNpc3Rlci0+Y29sb3IgPSBkbm9kZV9ibGFjazsKLQkJICAgIHBhcmVudC0+Y29sb3IgPSBkbm9kZV9yZWQ7Ci0JCSAgICByb3RhdGVfcmlnaHQocGFyZW50KTsKLQkJICAgIHNpc3RlciA9IHBhcmVudC0+bGVmdDsKLQkJICAgIGFzc2VydCAoc2lzdGVyICE9IG5pbCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgewkJCS8qIHN5bW1ldHJpYyBjYXNlOiBjaGlsZCA9PSBjaGlsZC0+cGFyZW50LT5yaWdodCAqLworCSAgICAgIGFzc2VydCAoY2hpbGQgPT0gcGFyZW50LT5yaWdodCk7CisJICAgICAgc2lzdGVyID0gcGFyZW50LT5sZWZ0OworCSAgICAgIGFzc2VydCAoc2lzdGVyICE9IG5pbCk7CisJICAgICAgaWYgKHNpc3Rlci0+Y29sb3IgPT0gZG5vZGVfcmVkKQorCQl7CisJCSAgc2lzdGVyLT5jb2xvciA9IGRub2RlX2JsYWNrOworCQkgIHBhcmVudC0+Y29sb3IgPSBkbm9kZV9yZWQ7CisJCSAgcm90YXRlX3JpZ2h0IChwYXJlbnQpOworCQkgIHNpc3RlciA9IHBhcmVudC0+bGVmdDsKKwkJICBhc3NlcnQgKHNpc3RlciAhPSBuaWwpOwogCQl9Ci0JCWlmIChzaXN0ZXItPnJpZ2h0LT5jb2xvciA9PSBkbm9kZV9ibGFjawotCQkJJiYgc2lzdGVyLT5sZWZ0LT5jb2xvciA9PSBkbm9kZV9ibGFjaykgewotCQkgICAgc2lzdGVyLT5jb2xvciA9IGRub2RlX3JlZDsKLQkJICAgIGNoaWxkID0gcGFyZW50OwotCQl9IGVsc2UgewotCQkgICAgaWYgKHNpc3Rlci0+bGVmdC0+Y29sb3IgPT0gZG5vZGVfYmxhY2spIHsKLQkJCWFzc2VydCAoc2lzdGVyLT5yaWdodC0+Y29sb3IgPT0gZG5vZGVfcmVkKTsKLQkJCXNpc3Rlci0+cmlnaHQtPmNvbG9yID0gZG5vZGVfYmxhY2s7Ci0JCQlzaXN0ZXItPmNvbG9yID0gZG5vZGVfcmVkOwotCQkJcm90YXRlX2xlZnQoc2lzdGVyKTsKLQkJCXNpc3RlciA9IHBhcmVudC0+bGVmdDsKLQkJCWFzc2VydCAoc2lzdGVyICE9IG5pbCk7CisJICAgICAgaWYgKHNpc3Rlci0+cmlnaHQtPmNvbG9yID09IGRub2RlX2JsYWNrCisJCSAgJiYgc2lzdGVyLT5sZWZ0LT5jb2xvciA9PSBkbm9kZV9ibGFjaykKKwkJeworCQkgIHNpc3Rlci0+Y29sb3IgPSBkbm9kZV9yZWQ7CisJCSAgY2hpbGQgPSBwYXJlbnQ7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAoc2lzdGVyLT5sZWZ0LT5jb2xvciA9PSBkbm9kZV9ibGFjaykKKwkJICAgIHsKKwkJICAgICAgYXNzZXJ0IChzaXN0ZXItPnJpZ2h0LT5jb2xvciA9PSBkbm9kZV9yZWQpOworCQkgICAgICBzaXN0ZXItPnJpZ2h0LT5jb2xvciA9IGRub2RlX2JsYWNrOworCQkgICAgICBzaXN0ZXItPmNvbG9yID0gZG5vZGVfcmVkOworCQkgICAgICByb3RhdGVfbGVmdCAoc2lzdGVyKTsKKwkJICAgICAgc2lzdGVyID0gcGFyZW50LT5sZWZ0OworCQkgICAgICBhc3NlcnQgKHNpc3RlciAhPSBuaWwpOwogCQkgICAgfQotCQkgICAgc2lzdGVyLT5jb2xvciA9IHBhcmVudC0+Y29sb3I7Ci0JCSAgICBzaXN0ZXItPmxlZnQtPmNvbG9yID0gZG5vZGVfYmxhY2s7Ci0JCSAgICBwYXJlbnQtPmNvbG9yID0gZG5vZGVfYmxhY2s7Ci0JCSAgICByb3RhdGVfcmlnaHQocGFyZW50KTsKLQkJICAgIGJyZWFrOworCQkgIHNpc3Rlci0+Y29sb3IgPSBwYXJlbnQtPmNvbG9yOworCQkgIHNpc3Rlci0+bGVmdC0+Y29sb3IgPSBkbm9kZV9ibGFjazsKKwkJICBwYXJlbnQtPmNvbG9yID0gZG5vZGVfYmxhY2s7CisJCSAgcm90YXRlX3JpZ2h0IChwYXJlbnQpOworCQkgIGJyZWFrOwogCQl9CiAJICAgIH0KIAl9CiAKLQljaGlsZC0+Y29sb3IgPSBkbm9kZV9ibGFjazsKLQlkaWN0X3Jvb3QoZGljdCktPmNvbG9yID0gZG5vZGVfYmxhY2s7CisgICAgICBjaGlsZC0+Y29sb3IgPSBkbm9kZV9ibGFjazsKKyAgICAgIGRpY3Rfcm9vdCAoZGljdCktPmNvbG9yID0gZG5vZGVfYmxhY2s7CiAgICAgfQogCi0gICAgYXNzZXJ0IChkaWN0X3ZlcmlmeShkaWN0KSk7CisgIGFzc2VydCAoZGljdF92ZXJpZnkgKGRpY3QpKTsKIAotICAgIHJldHVybiBkZWxldGU7CisgIHJldHVybiBkZWxldGU7CiB9CiAKIC8qCkBAIC04MTAsMjIgKzkxMSwyNSBAQAogICogdGhlIGRhdGEgaXRlbS4KICAqLwogCi1pbnQgZGljdF9hbGxvY19pbnNlcnQoZGljdF90ICpkaWN0LCBjb25zdCB2b2lkICprZXksIHZvaWQgKmRhdGEpCitpbnQKK2RpY3RfYWxsb2NfaW5zZXJ0IChkaWN0X3QgKiBkaWN0LCBjb25zdCB2b2lkICprZXksIHZvaWQgKmRhdGEpCiB7Ci0gICAgZG5vZGVfdCAqbm9kZSA9IGRpY3QtPmFsbG9jbm9kZShkaWN0LT5jb250ZXh0KTsKKyAgZG5vZGVfdCAqbm9kZSA9IGRpY3QtPmFsbG9jbm9kZSAoZGljdC0+Y29udGV4dCk7CiAKLSAgICBpZiAobm9kZSkgewotCWRub2RlX2luaXQobm9kZSwgZGF0YSk7Ci0JZGljdF9pbnNlcnQoZGljdCwgbm9kZSwga2V5KTsKLQlyZXR1cm4gMTsKKyAgaWYgKG5vZGUpCisgICAgeworICAgICAgZG5vZGVfaW5pdCAobm9kZSwgZGF0YSk7CisgICAgICBkaWN0X2luc2VydCAoZGljdCwgbm9kZSwga2V5KTsKKyAgICAgIHJldHVybiAxOwogICAgIH0KLSAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgZGljdF9kZWxldGVfZnJlZShkaWN0X3QgKmRpY3QsIGRub2RlX3QgKm5vZGUpCit2b2lkCitkaWN0X2RlbGV0ZV9mcmVlIChkaWN0X3QgKiBkaWN0LCBkbm9kZV90ICogbm9kZSkKIHsKLSAgICBkaWN0X2RlbGV0ZShkaWN0LCBub2RlKTsKLSAgICBkaWN0LT5mcmVlbm9kZShub2RlLCBkaWN0LT5jb250ZXh0KTsKKyAgZGljdF9kZWxldGUgKGRpY3QsIG5vZGUpOworICBkaWN0LT5mcmVlbm9kZSAobm9kZSwgZGljdC0+Y29udGV4dCk7CiB9CiAKIC8qCkBAIC04MzMsMTUgKzkzNywxNiBAQAogICogKHRoYXQgaXMsIGRpY3RfaXNlbXB0eShkaWN0KSByZXR1cm5zIDEpIGEgbnVsbCBwb2ludGVyIGlzIHJldHVybmVkLgogICovCiAKLWRub2RlX3QgKmRpY3RfZmlyc3QoZGljdF90ICpkaWN0KQorZG5vZGVfdCAqCitkaWN0X2ZpcnN0IChkaWN0X3QgKiBkaWN0KQogewotICAgIGRub2RlX3QgKm5pbCA9IGRpY3RfbmlsKGRpY3QpLCAqcm9vdCA9IGRpY3Rfcm9vdChkaWN0KSwgKmxlZnQ7CisgIGRub2RlX3QgKm5pbCA9IGRpY3RfbmlsIChkaWN0KSwgKnJvb3QgPSBkaWN0X3Jvb3QgKGRpY3QpLCAqbGVmdDsKIAotICAgIGlmIChyb290ICE9IG5pbCkKLQl3aGlsZSAoKGxlZnQgPSByb290LT5sZWZ0KSAhPSBuaWwpCi0JICAgIHJvb3QgPSBsZWZ0OworICBpZiAocm9vdCAhPSBuaWwpCisgICAgd2hpbGUgKChsZWZ0ID0gcm9vdC0+bGVmdCkgIT0gbmlsKQorICAgICAgcm9vdCA9IGxlZnQ7CiAKLSAgICByZXR1cm4gKHJvb3QgPT0gbmlsKSA/IE5VTEwgOiByb290OworICByZXR1cm4gKHJvb3QgPT0gbmlsKSA/IE5VTEwgOiByb290OwogfQogCiAvKgpAQCAtODQ5LDE1ICs5NTQsMTYgQEAKICAqICh0aGF0IGlzLCBkaWN0X2lzZW1wdHkoZGljdCkgcmV0dXJucyAxKSBhIG51bGwgcG9pbnRlciBpcyByZXR1cm5lZC4KICAqLwogCi1kbm9kZV90ICpkaWN0X2xhc3QoZGljdF90ICpkaWN0KQorZG5vZGVfdCAqCitkaWN0X2xhc3QgKGRpY3RfdCAqIGRpY3QpCiB7Ci0gICAgZG5vZGVfdCAqbmlsID0gZGljdF9uaWwoZGljdCksICpyb290ID0gZGljdF9yb290KGRpY3QpLCAqcmlnaHQ7CisgIGRub2RlX3QgKm5pbCA9IGRpY3RfbmlsIChkaWN0KSwgKnJvb3QgPSBkaWN0X3Jvb3QgKGRpY3QpLCAqcmlnaHQ7CiAKLSAgICBpZiAocm9vdCAhPSBuaWwpCi0Jd2hpbGUgKChyaWdodCA9IHJvb3QtPnJpZ2h0KSAhPSBuaWwpCi0JICAgIHJvb3QgPSByaWdodDsKKyAgaWYgKHJvb3QgIT0gbmlsKQorICAgIHdoaWxlICgocmlnaHQgPSByb290LT5yaWdodCkgIT0gbmlsKQorICAgICAgcm9vdCA9IHJpZ2h0OwogCi0gICAgcmV0dXJuIChyb290ID09IG5pbCkgPyBOVUxMIDogcm9vdDsKKyAgcmV0dXJuIChyb290ID09IG5pbCkgPyBOVUxMIDogcm9vdDsKIH0KIAogLyoKQEAgLTg2NywyNSArOTczLDI4IEBACiAgKiB0aGUgbmlsIG5vZGUuCiAgKi8KIAotZG5vZGVfdCAqZGljdF9uZXh0KGRpY3RfdCAqZGljdCwgZG5vZGVfdCAqY3VycikKK2Rub2RlX3QgKgorZGljdF9uZXh0IChkaWN0X3QgKiBkaWN0LCBkbm9kZV90ICogY3VycikKIHsKLSAgICBkbm9kZV90ICpuaWwgPSBkaWN0X25pbChkaWN0KSwgKnBhcmVudCwgKmxlZnQ7CisgIGRub2RlX3QgKm5pbCA9IGRpY3RfbmlsIChkaWN0KSwgKnBhcmVudCwgKmxlZnQ7CiAKLSAgICBpZiAoY3Vyci0+cmlnaHQgIT0gbmlsKSB7Ci0JY3VyciA9IGN1cnItPnJpZ2h0OwotCXdoaWxlICgobGVmdCA9IGN1cnItPmxlZnQpICE9IG5pbCkKLQkgICAgY3VyciA9IGxlZnQ7Ci0JcmV0dXJuIGN1cnI7CisgIGlmIChjdXJyLT5yaWdodCAhPSBuaWwpCisgICAgeworICAgICAgY3VyciA9IGN1cnItPnJpZ2h0OworICAgICAgd2hpbGUgKChsZWZ0ID0gY3Vyci0+bGVmdCkgIT0gbmlsKQorCWN1cnIgPSBsZWZ0OworICAgICAgcmV0dXJuIGN1cnI7CiAgICAgfQogCi0gICAgcGFyZW50ID0gY3Vyci0+cGFyZW50OworICBwYXJlbnQgPSBjdXJyLT5wYXJlbnQ7CiAKLSAgICB3aGlsZSAocGFyZW50ICE9IG5pbCAmJiBjdXJyID09IHBhcmVudC0+cmlnaHQpIHsKLQljdXJyID0gcGFyZW50OwotCXBhcmVudCA9IGN1cnItPnBhcmVudDsKKyAgd2hpbGUgKHBhcmVudCAhPSBuaWwgJiYgY3VyciA9PSBwYXJlbnQtPnJpZ2h0KQorICAgIHsKKyAgICAgIGN1cnIgPSBwYXJlbnQ7CisgICAgICBwYXJlbnQgPSBjdXJyLT5wYXJlbnQ7CiAgICAgfQogCi0gICAgcmV0dXJuIChwYXJlbnQgPT0gbmlsKSA/IE5VTEwgOiBwYXJlbnQ7CisgIHJldHVybiAocGFyZW50ID09IG5pbCkgPyBOVUxMIDogcGFyZW50OwogfQogCiAvKgpAQCAtODkzLDMwICsxMDAyLDM0IEBACiAgKiBUaGUgbmlsIHNlbnRpbmVsIG5vZGUgaXMgcmV0dXJuZWQgaWYgdGhlcmUgaXMgbm8gcHJlZGVjZXNzb3IuCiAgKi8KIAotZG5vZGVfdCAqZGljdF9wcmV2KGRpY3RfdCAqZGljdCwgZG5vZGVfdCAqY3VycikKK2Rub2RlX3QgKgorZGljdF9wcmV2IChkaWN0X3QgKiBkaWN0LCBkbm9kZV90ICogY3VycikKIHsKLSAgICBkbm9kZV90ICpuaWwgPSBkaWN0X25pbChkaWN0KSwgKnBhcmVudCwgKnJpZ2h0OworICBkbm9kZV90ICpuaWwgPSBkaWN0X25pbCAoZGljdCksICpwYXJlbnQsICpyaWdodDsKIAotICAgIGlmIChjdXJyLT5sZWZ0ICE9IG5pbCkgewotCWN1cnIgPSBjdXJyLT5sZWZ0OwotCXdoaWxlICgocmlnaHQgPSBjdXJyLT5yaWdodCkgIT0gbmlsKQotCSAgICBjdXJyID0gcmlnaHQ7Ci0JcmV0dXJuIGN1cnI7CisgIGlmIChjdXJyLT5sZWZ0ICE9IG5pbCkKKyAgICB7CisgICAgICBjdXJyID0gY3Vyci0+bGVmdDsKKyAgICAgIHdoaWxlICgocmlnaHQgPSBjdXJyLT5yaWdodCkgIT0gbmlsKQorCWN1cnIgPSByaWdodDsKKyAgICAgIHJldHVybiBjdXJyOwogICAgIH0KIAotICAgIHBhcmVudCA9IGN1cnItPnBhcmVudDsKKyAgcGFyZW50ID0gY3Vyci0+cGFyZW50OwogCi0gICAgd2hpbGUgKHBhcmVudCAhPSBuaWwgJiYgY3VyciA9PSBwYXJlbnQtPmxlZnQpIHsKLQljdXJyID0gcGFyZW50OwotCXBhcmVudCA9IGN1cnItPnBhcmVudDsKKyAgd2hpbGUgKHBhcmVudCAhPSBuaWwgJiYgY3VyciA9PSBwYXJlbnQtPmxlZnQpCisgICAgeworICAgICAgY3VyciA9IHBhcmVudDsKKyAgICAgIHBhcmVudCA9IGN1cnItPnBhcmVudDsKICAgICB9CiAKLSAgICByZXR1cm4gKHBhcmVudCA9PSBuaWwpID8gTlVMTCA6IHBhcmVudDsKKyAgcmV0dXJuIChwYXJlbnQgPT0gbmlsKSA/IE5VTEwgOiBwYXJlbnQ7CiB9CiAKLXZvaWQgZGljdF9hbGxvd19kdXBlcyhkaWN0X3QgKmRpY3QpCit2b2lkCitkaWN0X2FsbG93X2R1cGVzIChkaWN0X3QgKiBkaWN0KQogewotICAgIGRpY3QtPmR1cGVzID0gMTsKKyAgZGljdC0+ZHVwZXMgPSAxOwogfQogCiAjdW5kZWYgZGljdF9jb3VudApAQCAtOTI2LDI2OCArMTAzOSwzMDggQEAKICN1bmRlZiBkbm9kZV9wdXQKICN1bmRlZiBkbm9kZV9nZXRrZXkKIAotZGljdGNvdW50X3QgZGljdF9jb3VudChkaWN0X3QgKmRpY3QpCitkaWN0Y291bnRfdAorZGljdF9jb3VudCAoZGljdF90ICogZGljdCkKIHsKLSAgICByZXR1cm4gZGljdC0+bm9kZWNvdW50OworICByZXR1cm4gZGljdC0+bm9kZWNvdW50OwogfQogCi1pbnQgZGljdF9pc2VtcHR5KGRpY3RfdCAqZGljdCkKK2ludAorZGljdF9pc2VtcHR5IChkaWN0X3QgKiBkaWN0KQogewotICAgIHJldHVybiBkaWN0LT5ub2RlY291bnQgPT0gMDsKKyAgcmV0dXJuIGRpY3QtPm5vZGVjb3VudCA9PSAwOwogfQogCi1pbnQgZGljdF9pc2Z1bGwoZGljdF90ICpkaWN0KQoraW50CitkaWN0X2lzZnVsbCAoZGljdF90ICogZGljdCkKIHsKLSAgICByZXR1cm4gZGljdC0+bm9kZWNvdW50ID09IGRpY3QtPm1heGNvdW50OworICByZXR1cm4gZGljdC0+bm9kZWNvdW50ID09IGRpY3QtPm1heGNvdW50OwogfQogCi1pbnQgZGljdF9jb250YWlucyhkaWN0X3QgKmRpY3QsIGRub2RlX3QgKm5vZGUpCitpbnQKK2RpY3RfY29udGFpbnMgKGRpY3RfdCAqIGRpY3QsIGRub2RlX3QgKiBub2RlKQogewotICAgIHJldHVybiB2ZXJpZnlfZGljdF9oYXNfbm9kZShkaWN0X25pbChkaWN0KSwgZGljdF9yb290KGRpY3QpLCBub2RlKTsKKyAgcmV0dXJuIHZlcmlmeV9kaWN0X2hhc19ub2RlIChkaWN0X25pbCAoZGljdCksIGRpY3Rfcm9vdCAoZGljdCksIG5vZGUpOwogfQogCi1zdGF0aWMgZG5vZGVfdCAqZG5vZGVfYWxsb2Modm9pZCAqY29udGV4dCkKK3N0YXRpYyBkbm9kZV90ICoKK2Rub2RlX2FsbG9jICh2b2lkICpjb250ZXh0KQogewotICAgIHJldHVybiBtYWxsb2Moc2l6ZW9mICpkbm9kZV9hbGxvYyhOVUxMKSk7CisgIHJldHVybiBtYWxsb2MgKHNpemVvZiAqZG5vZGVfYWxsb2MgKE5VTEwpKTsKIH0KIAotc3RhdGljIHZvaWQgZG5vZGVfZnJlZShkbm9kZV90ICpub2RlLCB2b2lkICpjb250ZXh0KQorc3RhdGljIHZvaWQKK2Rub2RlX2ZyZWUgKGRub2RlX3QgKiBub2RlLCB2b2lkICpjb250ZXh0KQogewotICAgIGZyZWUobm9kZSk7CisgIGZyZWUgKG5vZGUpOwogfQogCi1kbm9kZV90ICpkbm9kZV9jcmVhdGUodm9pZCAqZGF0YSkKK2Rub2RlX3QgKgorZG5vZGVfY3JlYXRlICh2b2lkICpkYXRhKQogewotICAgIGRub2RlX3QgKm5ldyA9IG1hbGxvYyhzaXplb2YgKm5ldyk7Ci0gICAgaWYgKG5ldykgewotCW5ldy0+ZGF0YSA9IGRhdGE7Ci0JbmV3LT5wYXJlbnQgPSBOVUxMOwotCW5ldy0+bGVmdCA9IE5VTEw7Ci0JbmV3LT5yaWdodCA9IE5VTEw7CisgIGRub2RlX3QgKm5ldyA9IG1hbGxvYyAoc2l6ZW9mICpuZXcpOworICBpZiAobmV3KQorICAgIHsKKyAgICAgIG5ldy0+ZGF0YSA9IGRhdGE7CisgICAgICBuZXctPnBhcmVudCA9IE5VTEw7CisgICAgICBuZXctPmxlZnQgPSBOVUxMOworICAgICAgbmV3LT5yaWdodCA9IE5VTEw7CiAgICAgfQotICAgIHJldHVybiBuZXc7CisgIHJldHVybiBuZXc7CiB9CiAKLWRub2RlX3QgKmRub2RlX2luaXQoZG5vZGVfdCAqZG5vZGUsIHZvaWQgKmRhdGEpCitkbm9kZV90ICoKK2Rub2RlX2luaXQgKGRub2RlX3QgKiBkbm9kZSwgdm9pZCAqZGF0YSkKIHsKLSAgICBkbm9kZS0+ZGF0YSA9IGRhdGE7Ci0gICAgZG5vZGUtPnBhcmVudCA9IE5VTEw7Ci0gICAgZG5vZGUtPmxlZnQgPSBOVUxMOwotICAgIGRub2RlLT5yaWdodCA9IE5VTEw7Ci0gICAgcmV0dXJuIGRub2RlOworICBkbm9kZS0+ZGF0YSA9IGRhdGE7CisgIGRub2RlLT5wYXJlbnQgPSBOVUxMOworICBkbm9kZS0+bGVmdCA9IE5VTEw7CisgIGRub2RlLT5yaWdodCA9IE5VTEw7CisgIHJldHVybiBkbm9kZTsKIH0KIAotdm9pZCBkbm9kZV9kZXN0cm95KGRub2RlX3QgKmRub2RlKQordm9pZAorZG5vZGVfZGVzdHJveSAoZG5vZGVfdCAqIGRub2RlKQogewotICAgIGFzc2VydCAoIWRub2RlX2lzX2luX2FfZGljdChkbm9kZSkpOwotICAgIGZyZWUoZG5vZGUpOworICBhc3NlcnQgKCFkbm9kZV9pc19pbl9hX2RpY3QgKGRub2RlKSk7CisgIGZyZWUgKGRub2RlKTsKIH0KIAotdm9pZCAqZG5vZGVfZ2V0KGRub2RlX3QgKmRub2RlKQordm9pZCAqCitkbm9kZV9nZXQgKGRub2RlX3QgKiBkbm9kZSkKIHsKLSAgICByZXR1cm4gZG5vZGUtPmRhdGE7CisgIHJldHVybiBkbm9kZS0+ZGF0YTsKIH0KIAotY29uc3Qgdm9pZCAqZG5vZGVfZ2V0a2V5KGRub2RlX3QgKmRub2RlKQorY29uc3Qgdm9pZCAqCitkbm9kZV9nZXRrZXkgKGRub2RlX3QgKiBkbm9kZSkKIHsKLSAgICByZXR1cm4gZG5vZGUtPmtleTsKKyAgcmV0dXJuIGRub2RlLT5rZXk7CiB9CiAKLXZvaWQgZG5vZGVfcHV0KGRub2RlX3QgKmRub2RlLCB2b2lkICpkYXRhKQordm9pZAorZG5vZGVfcHV0IChkbm9kZV90ICogZG5vZGUsIHZvaWQgKmRhdGEpCiB7Ci0gICAgZG5vZGUtPmRhdGEgPSBkYXRhOworICBkbm9kZS0+ZGF0YSA9IGRhdGE7CiB9CiAKLWludCBkbm9kZV9pc19pbl9hX2RpY3QoZG5vZGVfdCAqZG5vZGUpCitpbnQKK2Rub2RlX2lzX2luX2FfZGljdCAoZG5vZGVfdCAqIGRub2RlKQogewotICAgIHJldHVybiAoZG5vZGUtPnBhcmVudCAmJiBkbm9kZS0+bGVmdCAmJiBkbm9kZS0+cmlnaHQpOworICByZXR1cm4gKGRub2RlLT5wYXJlbnQgJiYgZG5vZGUtPmxlZnQgJiYgZG5vZGUtPnJpZ2h0KTsKIH0KIAotdm9pZCBkaWN0X3Byb2Nlc3MoZGljdF90ICpkaWN0LCB2b2lkICpjb250ZXh0LCBkbm9kZV9wcm9jZXNzX3QgZnVuY3Rpb24pCit2b2lkCitkaWN0X3Byb2Nlc3MgKGRpY3RfdCAqIGRpY3QsIHZvaWQgKmNvbnRleHQsIGRub2RlX3Byb2Nlc3NfdCBmdW5jdGlvbikKIHsKLSAgICBkbm9kZV90ICpub2RlID0gZGljdF9maXJzdChkaWN0KSwgKm5leHQ7CisgIGRub2RlX3QgKm5vZGUgPSBkaWN0X2ZpcnN0IChkaWN0KSwgKm5leHQ7CiAKLSAgICB3aGlsZSAobm9kZSAhPSBOVUxMKSB7Ci0JLyogY2hlY2sgZm9yIGNhbGxiYWNrIGZ1bmN0aW9uIGRlbGV0aW5nCSovCi0JLyogdGhlIG5leHQgbm9kZSBmcm9tIHVuZGVyIHVzCQkqLwotCWFzc2VydCAoZGljdF9jb250YWlucyhkaWN0LCBub2RlKSk7Ci0JbmV4dCA9IGRpY3RfbmV4dChkaWN0LCBub2RlKTsKLQlmdW5jdGlvbihkaWN0LCBub2RlLCBjb250ZXh0KTsKLQlub2RlID0gbmV4dDsKKyAgd2hpbGUgKG5vZGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBjaGVjayBmb3IgY2FsbGJhY2sgZnVuY3Rpb24gZGVsZXRpbmcgKi8KKyAgICAgIC8qIHRoZSBuZXh0IG5vZGUgZnJvbSB1bmRlciB1cyAgICAgICAgICAqLworICAgICAgYXNzZXJ0IChkaWN0X2NvbnRhaW5zIChkaWN0LCBub2RlKSk7CisgICAgICBuZXh0ID0gZGljdF9uZXh0IChkaWN0LCBub2RlKTsKKyAgICAgIGZ1bmN0aW9uIChkaWN0LCBub2RlLCBjb250ZXh0KTsKKyAgICAgIG5vZGUgPSBuZXh0OwogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgbG9hZF9iZWdpbl9pbnRlcm5hbChkaWN0X2xvYWRfdCAqbG9hZCwgZGljdF90ICpkaWN0KQorc3RhdGljIHZvaWQKK2xvYWRfYmVnaW5faW50ZXJuYWwgKGRpY3RfbG9hZF90ICogbG9hZCwgZGljdF90ICogZGljdCkKIHsKLSAgICBsb2FkLT5kaWN0cHRyID0gZGljdDsKLSAgICBsb2FkLT5uaWxub2RlLmxlZnQgPSAmbG9hZC0+bmlsbm9kZTsKLSAgICBsb2FkLT5uaWxub2RlLnJpZ2h0ID0gJmxvYWQtPm5pbG5vZGU7CisgIGxvYWQtPmRpY3RwdHIgPSBkaWN0OworICBsb2FkLT5uaWxub2RlLmxlZnQgPSAmbG9hZC0+bmlsbm9kZTsKKyAgbG9hZC0+bmlsbm9kZS5yaWdodCA9ICZsb2FkLT5uaWxub2RlOwogfQogCi12b2lkIGRpY3RfbG9hZF9iZWdpbihkaWN0X2xvYWRfdCAqbG9hZCwgZGljdF90ICpkaWN0KQordm9pZAorZGljdF9sb2FkX2JlZ2luIChkaWN0X2xvYWRfdCAqIGxvYWQsIGRpY3RfdCAqIGRpY3QpCiB7Ci0gICAgYXNzZXJ0IChkaWN0X2lzZW1wdHkoZGljdCkpOwotICAgIGxvYWRfYmVnaW5faW50ZXJuYWwobG9hZCwgZGljdCk7CisgIGFzc2VydCAoZGljdF9pc2VtcHR5IChkaWN0KSk7CisgIGxvYWRfYmVnaW5faW50ZXJuYWwgKGxvYWQsIGRpY3QpOwogfQogCi12b2lkIGRpY3RfbG9hZF9uZXh0KGRpY3RfbG9hZF90ICpsb2FkLCBkbm9kZV90ICpuZXdub2RlLCBjb25zdCB2b2lkICprZXkpCit2b2lkCitkaWN0X2xvYWRfbmV4dCAoZGljdF9sb2FkX3QgKiBsb2FkLCBkbm9kZV90ICogbmV3bm9kZSwgY29uc3Qgdm9pZCAqa2V5KQogewotICAgIGRpY3RfdCAqZGljdCA9IGxvYWQtPmRpY3RwdHI7Ci0gICAgZG5vZGVfdCAqbmlsID0gJmxvYWQtPm5pbG5vZGU7Ci0gICAKLSAgICBhc3NlcnQgKCFkbm9kZV9pc19pbl9hX2RpY3QobmV3bm9kZSkpOwotICAgIGFzc2VydCAoZGljdC0+bm9kZWNvdW50IDwgZGljdC0+bWF4Y291bnQpOworICBkaWN0X3QgKmRpY3QgPSBsb2FkLT5kaWN0cHRyOworICBkbm9kZV90ICpuaWwgPSAmbG9hZC0+bmlsbm9kZTsKIAotICAgICNpZm5kZWYgTkRFQlVHCi0gICAgaWYgKGRpY3QtPm5vZGVjb3VudCA+IDApIHsKLQlpZiAoZGljdC0+ZHVwZXMpCi0JICAgIGFzc2VydCAoZGljdC0+Y29tcGFyZShuaWwtPmxlZnQtPmtleSwga2V5KSA8PSAwKTsKLQllbHNlCi0JICAgIGFzc2VydCAoZGljdC0+Y29tcGFyZShuaWwtPmxlZnQtPmtleSwga2V5KSA8IDApOworICBhc3NlcnQgKCFkbm9kZV9pc19pbl9hX2RpY3QgKG5ld25vZGUpKTsKKyAgYXNzZXJ0IChkaWN0LT5ub2RlY291bnQgPCBkaWN0LT5tYXhjb3VudCk7CisKKyNpZm5kZWYgTkRFQlVHCisgIGlmIChkaWN0LT5ub2RlY291bnQgPiAwKQorICAgIHsKKyAgICAgIGlmIChkaWN0LT5kdXBlcykKKwlhc3NlcnQgKGRpY3QtPmNvbXBhcmUgKG5pbC0+bGVmdC0+a2V5LCBrZXkpIDw9IDApOworICAgICAgZWxzZQorCWFzc2VydCAoZGljdC0+Y29tcGFyZSAobmlsLT5sZWZ0LT5rZXksIGtleSkgPCAwKTsKICAgICB9Ci0gICAgI2VuZGlmCisjZW5kaWYKIAotICAgIG5ld25vZGUtPmtleSA9IGtleTsKLSAgICBuaWwtPnJpZ2h0LT5sZWZ0ID0gbmV3bm9kZTsKLSAgICBuaWwtPnJpZ2h0ID0gbmV3bm9kZTsKLSAgICBuZXdub2RlLT5sZWZ0ID0gbmlsOwotICAgIGRpY3QtPm5vZGVjb3VudCsrOworICBuZXdub2RlLT5rZXkgPSBrZXk7CisgIG5pbC0+cmlnaHQtPmxlZnQgPSBuZXdub2RlOworICBuaWwtPnJpZ2h0ID0gbmV3bm9kZTsKKyAgbmV3bm9kZS0+bGVmdCA9IG5pbDsKKyAgZGljdC0+bm9kZWNvdW50Kys7CiB9CiAKLXZvaWQgZGljdF9sb2FkX2VuZChkaWN0X2xvYWRfdCAqbG9hZCkKK3ZvaWQKK2RpY3RfbG9hZF9lbmQgKGRpY3RfbG9hZF90ICogbG9hZCkKIHsKLSAgICBkaWN0X3QgKmRpY3QgPSBsb2FkLT5kaWN0cHRyOwotICAgIGRub2RlX3QgKnRyZWVbRElDVF9ERVBUSF9NQVhdID0geyAwIH07Ci0gICAgZG5vZGVfdCAqY3VyciwgKmRpY3RuaWwgPSBkaWN0X25pbChkaWN0KSwgKmxvYWRuaWwgPSAmbG9hZC0+bmlsbm9kZSwgKm5leHQ7Ci0gICAgZG5vZGVfdCAqY29tcGxldGUgPSAwOwotICAgIGRpY3Rjb3VudF90IGZ1bGxjb3VudCA9IERJQ1RDT1VOVF9UX01BWCwgbm9kZWNvdW50ID0gZGljdC0+bm9kZWNvdW50OwotICAgIGRpY3Rjb3VudF90IGJvdHJvd2NvdW50OwotICAgIHVuc2lnbmVkIGJhc2VsZXZlbCA9IDAsIGxldmVsID0gMCwgaTsKKyAgZGljdF90ICpkaWN0ID0gbG9hZC0+ZGljdHB0cjsKKyAgZG5vZGVfdCAqdHJlZVtESUNUX0RFUFRIX01BWF0gPSB7IDAgfTsKKyAgZG5vZGVfdCAqY3VyciwgKmRpY3RuaWwgPSBkaWN0X25pbCAoZGljdCksICpsb2FkbmlsID0gJmxvYWQtPm5pbG5vZGUsICpuZXh0OworICBkbm9kZV90ICpjb21wbGV0ZSA9IDA7CisgIGRpY3Rjb3VudF90IGZ1bGxjb3VudCA9IERJQ1RDT1VOVF9UX01BWCwgbm9kZWNvdW50ID0gZGljdC0+bm9kZWNvdW50OworICBkaWN0Y291bnRfdCBib3Ryb3djb3VudDsKKyAgdW5zaWduZWQgYmFzZWxldmVsID0gMCwgbGV2ZWwgPSAwLCBpOwogCi0gICAgYXNzZXJ0IChkbm9kZV9yZWQgPT0gMCAmJiBkbm9kZV9ibGFjayA9PSAxKTsKKyAgYXNzZXJ0IChkbm9kZV9yZWQgPT0gMCAmJiBkbm9kZV9ibGFjayA9PSAxKTsKIAotICAgIHdoaWxlIChmdWxsY291bnQgPj0gbm9kZWNvdW50ICYmIGZ1bGxjb3VudCkKLQlmdWxsY291bnQgPj49IDE7CisgIHdoaWxlIChmdWxsY291bnQgPj0gbm9kZWNvdW50ICYmIGZ1bGxjb3VudCkKKyAgICBmdWxsY291bnQgPj49IDE7CiAKLSAgICBib3Ryb3djb3VudCA9IG5vZGVjb3VudCAtIGZ1bGxjb3VudDsKKyAgYm90cm93Y291bnQgPSBub2RlY291bnQgLSBmdWxsY291bnQ7CiAKLSAgICBmb3IgKGN1cnIgPSBsb2FkbmlsLT5sZWZ0OyBjdXJyICE9IGxvYWRuaWw7IGN1cnIgPSBuZXh0KSB7Ci0JbmV4dCA9IGN1cnItPmxlZnQ7CisgIGZvciAoY3VyciA9IGxvYWRuaWwtPmxlZnQ7IGN1cnIgIT0gbG9hZG5pbDsgY3VyciA9IG5leHQpCisgICAgeworICAgICAgbmV4dCA9IGN1cnItPmxlZnQ7CiAKLQlpZiAoY29tcGxldGUgPT0gTlVMTCAmJiBib3Ryb3djb3VudC0tID09IDApIHsKLQkgICAgYXNzZXJ0IChiYXNlbGV2ZWwgPT0gMCk7Ci0JICAgIGFzc2VydCAobGV2ZWwgPT0gMCk7Ci0JICAgIGJhc2VsZXZlbCA9IGxldmVsID0gMTsKLQkgICAgY29tcGxldGUgPSB0cmVlWzBdOworICAgICAgaWYgKGNvbXBsZXRlID09IE5VTEwgJiYgYm90cm93Y291bnQtLSA9PSAwKQorCXsKKwkgIGFzc2VydCAoYmFzZWxldmVsID09IDApOworCSAgYXNzZXJ0IChsZXZlbCA9PSAwKTsKKwkgIGJhc2VsZXZlbCA9IGxldmVsID0gMTsKKwkgIGNvbXBsZXRlID0gdHJlZVswXTsKIAotCSAgICBpZiAoY29tcGxldGUgIT0gMCkgewotCQl0cmVlWzBdID0gMDsKLQkJY29tcGxldGUtPnJpZ2h0ID0gZGljdG5pbDsKLQkJd2hpbGUgKHRyZWVbbGV2ZWxdICE9IDApIHsKLQkJICAgIHRyZWVbbGV2ZWxdLT5yaWdodCA9IGNvbXBsZXRlOwotCQkgICAgY29tcGxldGUtPnBhcmVudCA9IHRyZWVbbGV2ZWxdOwotCQkgICAgY29tcGxldGUgPSB0cmVlW2xldmVsXTsKLQkJICAgIHRyZWVbbGV2ZWwrK10gPSAwOworCSAgaWYgKGNvbXBsZXRlICE9IDApCisJICAgIHsKKwkgICAgICB0cmVlWzBdID0gMDsKKwkgICAgICBjb21wbGV0ZS0+cmlnaHQgPSBkaWN0bmlsOworCSAgICAgIHdoaWxlICh0cmVlW2xldmVsXSAhPSAwKQorCQl7CisJCSAgdHJlZVtsZXZlbF0tPnJpZ2h0ID0gY29tcGxldGU7CisJCSAgY29tcGxldGUtPnBhcmVudCA9IHRyZWVbbGV2ZWxdOworCQkgIGNvbXBsZXRlID0gdHJlZVtsZXZlbF07CisJCSAgdHJlZVtsZXZlbCsrXSA9IDA7CiAJCX0KIAkgICAgfQogCX0KIAotCWlmIChjb21wbGV0ZSA9PSBOVUxMKSB7Ci0JICAgIGN1cnItPmxlZnQgPSBkaWN0bmlsOwotCSAgICBjdXJyLT5yaWdodCA9IGRpY3RuaWw7Ci0JICAgIGN1cnItPmNvbG9yID0gbGV2ZWwgJSAyOwotCSAgICBjb21wbGV0ZSA9IGN1cnI7CisgICAgICBpZiAoY29tcGxldGUgPT0gTlVMTCkKKwl7CisJICBjdXJyLT5sZWZ0ID0gZGljdG5pbDsKKwkgIGN1cnItPnJpZ2h0ID0gZGljdG5pbDsKKwkgIGN1cnItPmNvbG9yID0gbGV2ZWwgJSAyOworCSAgY29tcGxldGUgPSBjdXJyOwogCi0JICAgIGFzc2VydCAobGV2ZWwgPT0gYmFzZWxldmVsKTsKLQkgICAgd2hpbGUgKHRyZWVbbGV2ZWxdICE9IDApIHsKLQkJdHJlZVtsZXZlbF0tPnJpZ2h0ID0gY29tcGxldGU7Ci0JCWNvbXBsZXRlLT5wYXJlbnQgPSB0cmVlW2xldmVsXTsKLQkJY29tcGxldGUgPSB0cmVlW2xldmVsXTsKLQkJdHJlZVtsZXZlbCsrXSA9IDA7CisJICBhc3NlcnQgKGxldmVsID09IGJhc2VsZXZlbCk7CisJICB3aGlsZSAodHJlZVtsZXZlbF0gIT0gMCkKKwkgICAgeworCSAgICAgIHRyZWVbbGV2ZWxdLT5yaWdodCA9IGNvbXBsZXRlOworCSAgICAgIGNvbXBsZXRlLT5wYXJlbnQgPSB0cmVlW2xldmVsXTsKKwkgICAgICBjb21wbGV0ZSA9IHRyZWVbbGV2ZWxdOworCSAgICAgIHRyZWVbbGV2ZWwrK10gPSAwOwogCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgY3Vyci0+bGVmdCA9IGNvbXBsZXRlOwotCSAgICBjdXJyLT5jb2xvciA9IChsZXZlbCArIDEpICUgMjsKLQkgICAgY29tcGxldGUtPnBhcmVudCA9IGN1cnI7Ci0JICAgIHRyZWVbbGV2ZWxdID0gY3VycjsKLQkgICAgY29tcGxldGUgPSAwOwotCSAgICBsZXZlbCA9IGJhc2VsZXZlbDsKKwl9CisgICAgICBlbHNlCisJeworCSAgY3Vyci0+bGVmdCA9IGNvbXBsZXRlOworCSAgY3Vyci0+Y29sb3IgPSAobGV2ZWwgKyAxKSAlIDI7CisJICBjb21wbGV0ZS0+cGFyZW50ID0gY3VycjsKKwkgIHRyZWVbbGV2ZWxdID0gY3VycjsKKwkgIGNvbXBsZXRlID0gMDsKKwkgIGxldmVsID0gYmFzZWxldmVsOwogCX0KICAgICB9CiAKLSAgICBpZiAoY29tcGxldGUgPT0gTlVMTCkKLQljb21wbGV0ZSA9IGRpY3RuaWw7CisgIGlmIChjb21wbGV0ZSA9PSBOVUxMKQorICAgIGNvbXBsZXRlID0gZGljdG5pbDsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBESUNUX0RFUFRIX01BWDsgaSsrKSB7Ci0JaWYgKHRyZWVbaV0gIT0gMCkgewotCSAgICB0cmVlW2ldLT5yaWdodCA9IGNvbXBsZXRlOwotCSAgICBjb21wbGV0ZS0+cGFyZW50ID0gdHJlZVtpXTsKLQkgICAgY29tcGxldGUgPSB0cmVlW2ldOworICBmb3IgKGkgPSAwOyBpIDwgRElDVF9ERVBUSF9NQVg7IGkrKykKKyAgICB7CisgICAgICBpZiAodHJlZVtpXSAhPSAwKQorCXsKKwkgIHRyZWVbaV0tPnJpZ2h0ID0gY29tcGxldGU7CisJICBjb21wbGV0ZS0+cGFyZW50ID0gdHJlZVtpXTsKKwkgIGNvbXBsZXRlID0gdHJlZVtpXTsKIAl9CiAgICAgfQogCi0gICAgZGljdG5pbC0+Y29sb3IgPSBkbm9kZV9ibGFjazsKLSAgICBkaWN0bmlsLT5yaWdodCA9IGRpY3RuaWw7Ci0gICAgY29tcGxldGUtPnBhcmVudCA9IGRpY3RuaWw7Ci0gICAgY29tcGxldGUtPmNvbG9yID0gZG5vZGVfYmxhY2s7Ci0gICAgZGljdF9yb290KGRpY3QpID0gY29tcGxldGU7CisgIGRpY3RuaWwtPmNvbG9yID0gZG5vZGVfYmxhY2s7CisgIGRpY3RuaWwtPnJpZ2h0ID0gZGljdG5pbDsKKyAgY29tcGxldGUtPnBhcmVudCA9IGRpY3RuaWw7CisgIGNvbXBsZXRlLT5jb2xvciA9IGRub2RlX2JsYWNrOworICBkaWN0X3Jvb3QgKGRpY3QpID0gY29tcGxldGU7CiAKLSAgICBhc3NlcnQgKGRpY3RfdmVyaWZ5KGRpY3QpKTsKKyAgYXNzZXJ0IChkaWN0X3ZlcmlmeSAoZGljdCkpOwogfQogCi12b2lkIGRpY3RfbWVyZ2UoZGljdF90ICpkZXN0LCBkaWN0X3QgKnNvdXJjZSkKK3ZvaWQKK2RpY3RfbWVyZ2UgKGRpY3RfdCAqIGRlc3QsIGRpY3RfdCAqIHNvdXJjZSkKIHsKLSAgICBkaWN0X2xvYWRfdCBsb2FkOwotICAgIGRub2RlX3QgKmxlZnRub2RlID0gZGljdF9maXJzdChkZXN0KSwgKnJpZ2h0bm9kZSA9IGRpY3RfZmlyc3Qoc291cmNlKTsKKyAgZGljdF9sb2FkX3QgbG9hZDsKKyAgZG5vZGVfdCAqbGVmdG5vZGUgPSBkaWN0X2ZpcnN0IChkZXN0KSwgKnJpZ2h0bm9kZSA9IGRpY3RfZmlyc3QgKHNvdXJjZSk7CiAKLSAgICBhc3NlcnQgKGRpY3Rfc2ltaWxhcihkZXN0LCBzb3VyY2UpKTsJCisgIGFzc2VydCAoZGljdF9zaW1pbGFyIChkZXN0LCBzb3VyY2UpKTsKIAotICAgIGlmIChzb3VyY2UgPT0gZGVzdCkKLQlyZXR1cm47CisgIGlmIChzb3VyY2UgPT0gZGVzdCkKKyAgICByZXR1cm47CiAKLSAgICBkZXN0LT5ub2RlY291bnQgPSAwOwotICAgIGxvYWRfYmVnaW5faW50ZXJuYWwoJmxvYWQsIGRlc3QpOworICBkZXN0LT5ub2RlY291bnQgPSAwOworICBsb2FkX2JlZ2luX2ludGVybmFsICgmbG9hZCwgZGVzdCk7CiAKLSAgICBmb3IgKDs7KSB7Ci0JaWYgKGxlZnRub2RlICE9IE5VTEwgJiYgcmlnaHRub2RlICE9IE5VTEwpIHsKLQkgICAgaWYgKGRlc3QtPmNvbXBhcmUobGVmdG5vZGUtPmtleSwgcmlnaHRub2RlLT5rZXkpIDwgMCkKLQkJZ290byBjb3B5bGVmdDsKLQkgICAgZWxzZQotCQlnb3RvIGNvcHlyaWdodDsKLQl9IGVsc2UgaWYgKGxlZnRub2RlICE9IE5VTEwpIHsKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBpZiAobGVmdG5vZGUgIT0gTlVMTCAmJiByaWdodG5vZGUgIT0gTlVMTCkKKwl7CisJICBpZiAoZGVzdC0+Y29tcGFyZSAobGVmdG5vZGUtPmtleSwgcmlnaHRub2RlLT5rZXkpIDwgMCkKIAkgICAgZ290byBjb3B5bGVmdDsKLQl9IGVsc2UgaWYgKHJpZ2h0bm9kZSAhPSBOVUxMKSB7CisJICBlbHNlCiAJICAgIGdvdG8gY29weXJpZ2h0OwotCX0gZWxzZSB7Ci0JICAgIGFzc2VydCAobGVmdG5vZGUgPT0gTlVMTCAmJiByaWdodG5vZGUgPT0gTlVMTCk7Ci0JICAgIGJyZWFrOworCX0KKyAgICAgIGVsc2UgaWYgKGxlZnRub2RlICE9IE5VTEwpCisJeworCSAgZ290byBjb3B5bGVmdDsKKwl9CisgICAgICBlbHNlIGlmIChyaWdodG5vZGUgIT0gTlVMTCkKKwl7CisJICBnb3RvIGNvcHlyaWdodDsKKwl9CisgICAgICBlbHNlCisJeworCSAgYXNzZXJ0IChsZWZ0bm9kZSA9PSBOVUxMICYmIHJpZ2h0bm9kZSA9PSBOVUxMKTsKKwkgIGJyZWFrOwogCX0KIAogICAgIGNvcHlsZWZ0OgotCXsKLQkgICAgZG5vZGVfdCAqbmV4dCA9IGRpY3RfbmV4dChkZXN0LCBsZWZ0bm9kZSk7Ci0JICAgICNpZm5kZWYgTkRFQlVHCi0JICAgIGxlZnRub2RlLT5sZWZ0ID0gTlVMTDsJLyogc3VwcHJlc3MgYXNzZXJ0aW9uIGluIGRpY3RfbG9hZF9uZXh0ICovCi0JICAgICNlbmRpZgotCSAgICBkaWN0X2xvYWRfbmV4dCgmbG9hZCwgbGVmdG5vZGUsIGxlZnRub2RlLT5rZXkpOwotCSAgICBsZWZ0bm9kZSA9IG5leHQ7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQkKKyAgICAgIHsKKwlkbm9kZV90ICpuZXh0ID0gZGljdF9uZXh0IChkZXN0LCBsZWZ0bm9kZSk7CisjaWZuZGVmIE5ERUJVRworCWxlZnRub2RlLT5sZWZ0ID0gTlVMTDsJLyogc3VwcHJlc3MgYXNzZXJ0aW9uIGluIGRpY3RfbG9hZF9uZXh0ICovCisjZW5kaWYKKwlkaWN0X2xvYWRfbmV4dCAoJmxvYWQsIGxlZnRub2RlLCBsZWZ0bm9kZS0+a2V5KTsKKwlsZWZ0bm9kZSA9IG5leHQ7CisJY29udGludWU7CisgICAgICB9CisKICAgICBjb3B5cmlnaHQ6Ci0JewotCSAgICBkbm9kZV90ICpuZXh0ID0gZGljdF9uZXh0KHNvdXJjZSwgcmlnaHRub2RlKTsKLQkgICAgI2lmbmRlZiBOREVCVUcKLQkgICAgcmlnaHRub2RlLT5sZWZ0ID0gTlVMTDsKLQkgICAgI2VuZGlmCi0JICAgIGRpY3RfbG9hZF9uZXh0KCZsb2FkLCByaWdodG5vZGUsIHJpZ2h0bm9kZS0+a2V5KTsKLQkgICAgcmlnaHRub2RlID0gbmV4dDsKLQkgICAgY29udGludWU7Ci0JfQorICAgICAgeworCWRub2RlX3QgKm5leHQgPSBkaWN0X25leHQgKHNvdXJjZSwgcmlnaHRub2RlKTsKKyNpZm5kZWYgTkRFQlVHCisJcmlnaHRub2RlLT5sZWZ0ID0gTlVMTDsKKyNlbmRpZgorCWRpY3RfbG9hZF9uZXh0ICgmbG9hZCwgcmlnaHRub2RlLCByaWdodG5vZGUtPmtleSk7CisJcmlnaHRub2RlID0gbmV4dDsKKwljb250aW51ZTsKKyAgICAgIH0KICAgICB9CiAKLSAgICBkaWN0X2NsZWFyKHNvdXJjZSk7Ci0gICAgZGljdF9sb2FkX2VuZCgmbG9hZCk7CisgIGRpY3RfY2xlYXIgKHNvdXJjZSk7CisgIGRpY3RfbG9hZF9lbmQgKCZsb2FkKTsKIH0KIAogI2lmZGVmIEtBWkxJQl9URVNUX01BSU4KQEAgLTExOTksMjk4ICsxMzUyLDMyOSBAQAogCiB0eXBlZGVmIGNoYXIgaW5wdXRfdFsyNTZdOwogCi1zdGF0aWMgaW50IHRva2VuaXplKGNoYXIgKnN0cmluZywgLi4uKQorc3RhdGljIGludAordG9rZW5pemUgKGNoYXIgKnN0cmluZywgLi4uKQogewotICAgIGNoYXIgKip0b2twdHI7IAotICAgIHZhX2xpc3QgYXJnbGlzdDsKLSAgICBpbnQgdG9rY291bnQgPSAwOworICBjaGFyICoqdG9rcHRyOworICB2YV9saXN0IGFyZ2xpc3Q7CisgIGludCB0b2tjb3VudCA9IDA7CiAKLSAgICB2YV9zdGFydChhcmdsaXN0LCBzdHJpbmcpOwotICAgIHRva3B0ciA9IHZhX2FyZyhhcmdsaXN0LCBjaGFyICoqKTsKLSAgICB3aGlsZSAodG9rcHRyKSB7Ci0Jd2hpbGUgKCpzdHJpbmcgJiYgaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnN0cmluZykpCi0JICAgIHN0cmluZysrOwotCWlmICghKnN0cmluZykKLQkgICAgYnJlYWs7Ci0JKnRva3B0ciA9IHN0cmluZzsKLQl3aGlsZSAoKnN0cmluZyAmJiAhaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnN0cmluZykpCi0JICAgIHN0cmluZysrOwotCXRva3B0ciA9IHZhX2FyZyhhcmdsaXN0LCBjaGFyICoqKTsKLQl0b2tjb3VudCsrOwotCWlmICghKnN0cmluZykKLQkgICAgYnJlYWs7Ci0JKnN0cmluZysrID0gMDsKKyAgdmFfc3RhcnQgKGFyZ2xpc3QsIHN0cmluZyk7CisgIHRva3B0ciA9IHZhX2FyZyAoYXJnbGlzdCwgY2hhciAqKik7CisgIHdoaWxlICh0b2twdHIpCisgICAgeworICAgICAgd2hpbGUgKCpzdHJpbmcgJiYgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzdHJpbmcpKQorCXN0cmluZysrOworICAgICAgaWYgKCEqc3RyaW5nKQorCWJyZWFrOworICAgICAgKnRva3B0ciA9IHN0cmluZzsKKyAgICAgIHdoaWxlICgqc3RyaW5nICYmICFpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnN0cmluZykpCisJc3RyaW5nKys7CisgICAgICB0b2twdHIgPSB2YV9hcmcgKGFyZ2xpc3QsIGNoYXIgKiopOworICAgICAgdG9rY291bnQrKzsKKyAgICAgIGlmICghKnN0cmluZykKKwlicmVhazsKKyAgICAgICpzdHJpbmcrKyA9IDA7CiAgICAgfQotICAgIHZhX2VuZChhcmdsaXN0KTsKKyAgdmFfZW5kIChhcmdsaXN0KTsKIAotICAgIHJldHVybiB0b2tjb3VudDsKKyAgcmV0dXJuIHRva2NvdW50OwogfQogCi1zdGF0aWMgaW50IGNvbXBhcmVmKGNvbnN0IHZvaWQgKmtleTEsIGNvbnN0IHZvaWQgKmtleTIpCitzdGF0aWMgaW50Citjb21wYXJlZiAoY29uc3Qgdm9pZCAqa2V5MSwgY29uc3Qgdm9pZCAqa2V5MikKIHsKLSAgICByZXR1cm4gc3RyY21wKGtleTEsIGtleTIpOworICByZXR1cm4gc3RyY21wIChrZXkxLCBrZXkyKTsKIH0KIAotc3RhdGljIGNoYXIgKmR1cHN0cmluZyhjaGFyICpzdHIpCitzdGF0aWMgY2hhciAqCitkdXBzdHJpbmcgKGNoYXIgKnN0cikKIHsKLSAgICBpbnQgc3ogPSBzdHJsZW4oc3RyKSArIDE7Ci0gICAgY2hhciAqbmV3ID0gbWFsbG9jKHN6KTsKLSAgICBpZiAobmV3KQotCW1lbWNweShuZXcsIHN0ciwgc3opOwotICAgIHJldHVybiBuZXc7CisgIGludCBzeiA9IHN0cmxlbiAoc3RyKSArIDE7CisgIGNoYXIgKm5ldyA9IG1hbGxvYyAoc3opOworICBpZiAobmV3KQorICAgIG1lbWNweSAobmV3LCBzdHIsIHN6KTsKKyAgcmV0dXJuIG5ldzsKIH0KIAotc3RhdGljIGRub2RlX3QgKm5ld19ub2RlKHZvaWQgKmMpCitzdGF0aWMgZG5vZGVfdCAqCituZXdfbm9kZSAodm9pZCAqYykKIHsKLSAgICBzdGF0aWMgZG5vZGVfdCBmZXdbNV07Ci0gICAgc3RhdGljIGludCBjb3VudDsKKyAgc3RhdGljIGRub2RlX3QgZmV3WzVdOworICBzdGF0aWMgaW50IGNvdW50OwogCi0gICAgaWYgKGNvdW50IDwgNSkKLQlyZXR1cm4gZmV3ICsgY291bnQrKzsKKyAgaWYgKGNvdW50IDwgNSkKKyAgICByZXR1cm4gZmV3ICsgY291bnQrKzsKIAotICAgIHJldHVybiBOVUxMOworICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgZGVsX25vZGUoZG5vZGVfdCAqbiwgdm9pZCAqYykKK3N0YXRpYyB2b2lkCitkZWxfbm9kZSAoZG5vZGVfdCAqIG4sIHZvaWQgKmMpCiB7CiB9CiAKIHN0YXRpYyBpbnQgcHJvbXB0ID0gMDsKIAotc3RhdGljIHZvaWQgY29uc3RydWN0KGRpY3RfdCAqZCkKK3N0YXRpYyB2b2lkCitjb25zdHJ1Y3QgKGRpY3RfdCAqIGQpCiB7Ci0gICAgaW5wdXRfdCBpbjsKLSAgICBpbnQgZG9uZSA9IDA7Ci0gICAgZGljdF9sb2FkX3QgZGw7Ci0gICAgZG5vZGVfdCAqZG47Ci0gICAgY2hhciAqdG9rMSwgKnRvazIsICp2YWw7Ci0gICAgY29uc3QgY2hhciAqa2V5OwotICAgIGNoYXIgKmhlbHAgPSAKLQkicCAgICAgICAgICAgICAgICAgICAgICB0dXJuIHByb21wdCBvblxuIgotCSJxICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaCBjb25zdHJ1Y3Rpb25cbiIKLQkiYSA8a2V5PiA8dmFsPiAgICAgICAgICBhZGQgbmV3IGVudHJ5XG4iOworICBpbnB1dF90IGluOworICBpbnQgZG9uZSA9IDA7CisgIGRpY3RfbG9hZF90IGRsOworICBkbm9kZV90ICpkbjsKKyAgY2hhciAqdG9rMSwgKnRvazIsICp2YWw7CisgIGNvbnN0IGNoYXIgKmtleTsKKyAgY2hhciAqaGVscCA9CisgICAgInAgICAgICAgICAgICAgICAgICAgICAgdHVybiBwcm9tcHQgb25cbiIKKyAgICAicSAgICAgICAgICAgICAgICAgICAgICBmaW5pc2ggY29uc3RydWN0aW9uXG4iCisgICAgImEgPGtleT4gPHZhbD4gICAgICAgICAgYWRkIG5ldyBlbnRyeVxuIjsKIAotICAgIGlmICghZGljdF9pc2VtcHR5KGQpKQotCXB1dHMoIndhcm5pbmc6IGRpY3Rpb25hcnkgbm90IGVtcHR5ISIpOworICBpZiAoIWRpY3RfaXNlbXB0eSAoZCkpCisgICAgcHV0cyAoIndhcm5pbmc6IGRpY3Rpb25hcnkgbm90IGVtcHR5ISIpOwogCi0gICAgZGljdF9sb2FkX2JlZ2luKCZkbCwgZCk7CisgIGRpY3RfbG9hZF9iZWdpbiAoJmRsLCBkKTsKIAotICAgIHdoaWxlICghZG9uZSkgewotCWlmIChwcm9tcHQpCi0JICAgIHB1dGNoYXIoJz4nKTsKLQlmZmx1c2goc3Rkb3V0KTsKKyAgd2hpbGUgKCFkb25lKQorICAgIHsKKyAgICAgIGlmIChwcm9tcHQpCisJcHV0Y2hhciAoJz4nKTsKKyAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKIAotCWlmICghZmdldHMoaW4sIHNpemVvZihpbnB1dF90KSwgc3RkaW4pKQotCSAgICBicmVhazsKKyAgICAgIGlmICghZmdldHMgKGluLCBzaXplb2YgKGlucHV0X3QpLCBzdGRpbikpCisJYnJlYWs7CiAKLQlzd2l0Y2ggKGluWzBdKSB7Ci0JICAgIGNhc2UgJz8nOgotCQlwdXRzKGhlbHApOwotCQlicmVhazsKLQkgICAgY2FzZSAncCc6Ci0JCXByb21wdCA9IDE7Ci0JCWJyZWFrOwotCSAgICBjYXNlICdxJzoKLQkJZG9uZSA9IDE7Ci0JCWJyZWFrOwotCSAgICBjYXNlICdhJzoKLQkJaWYgKHRva2VuaXplKGluKzEsICZ0b2sxLCAmdG9rMiwgKGNoYXIgKiopIDApICE9IDIpIHsKLQkJICAgIHB1dHMoIndoYXQ/Iik7Ci0JCSAgICBicmVhazsKLQkJfQotCQlrZXkgPSBkdXBzdHJpbmcodG9rMSk7Ci0JCXZhbCA9IGR1cHN0cmluZyh0b2syKTsKLQkJZG4gPSBkbm9kZV9jcmVhdGUodmFsKTsKKyAgICAgIHN3aXRjaCAoaW5bMF0pCisJeworCWNhc2UgJz8nOgorCSAgcHV0cyAoaGVscCk7CisJICBicmVhazsKKwljYXNlICdwJzoKKwkgIHByb21wdCA9IDE7CisJICBicmVhazsKKwljYXNlICdxJzoKKwkgIGRvbmUgPSAxOworCSAgYnJlYWs7CisJY2FzZSAnYSc6CisJICBpZiAodG9rZW5pemUgKGluICsgMSwgJnRvazEsICZ0b2syLCAoY2hhciAqKikgMCkgIT0gMikKKwkgICAgeworCSAgICAgIHB1dHMgKCJ3aGF0PyIpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBrZXkgPSBkdXBzdHJpbmcgKHRvazEpOworCSAgdmFsID0gZHVwc3RyaW5nICh0b2syKTsKKwkgIGRuID0gZG5vZGVfY3JlYXRlICh2YWwpOwogCi0JCWlmICgha2V5IHx8ICF2YWwgfHwgIWRuKSB7Ci0JCSAgICBwdXRzKCJvdXQgb2YgbWVtb3J5Iik7Ci0JCSAgICBmcmVlKCh2b2lkICopIGtleSk7Ci0JCSAgICBmcmVlKHZhbCk7Ci0JCSAgICBpZiAoZG4pCi0JCQlkbm9kZV9kZXN0cm95KGRuKTsKLQkJfQorCSAgaWYgKCFrZXkgfHwgIXZhbCB8fCAhZG4pCisJICAgIHsKKwkgICAgICBwdXRzICgib3V0IG9mIG1lbW9yeSIpOworCSAgICAgIGZyZWUgKCh2b2lkICopIGtleSk7CisJICAgICAgZnJlZSAodmFsKTsKKwkgICAgICBpZiAoZG4pCisJCWRub2RlX2Rlc3Ryb3kgKGRuKTsKKwkgICAgfQogCi0JCWRpY3RfbG9hZF9uZXh0KCZkbCwgZG4sIGtleSk7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlwdXRjaGFyKCc/Jyk7Ci0JCXB1dGNoYXIoJ1xuJyk7Ci0JCWJyZWFrOworCSAgZGljdF9sb2FkX25leHQgKCZkbCwgZG4sIGtleSk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgcHV0Y2hhciAoJz8nKTsKKwkgIHB1dGNoYXIgKCdcbicpOworCSAgYnJlYWs7CiAJfQogICAgIH0KIAotICAgIGRpY3RfbG9hZF9lbmQoJmRsKTsKKyAgZGljdF9sb2FkX2VuZCAoJmRsKTsKIH0KIAotaW50IG1haW4odm9pZCkKK2ludAorbWFpbiAodm9pZCkKIHsKLSAgICBpbnB1dF90IGluOwotICAgIGRpY3RfdCBkYXJyYXlbMTBdOwotICAgIGRpY3RfdCAqZCA9ICZkYXJyYXlbMF07Ci0gICAgZG5vZGVfdCAqZG47Ci0gICAgaW50IGk7Ci0gICAgY2hhciAqdG9rMSwgKnRvazIsICp2YWw7Ci0gICAgY29uc3QgY2hhciAqa2V5OworICBpbnB1dF90IGluOworICBkaWN0X3QgZGFycmF5WzEwXTsKKyAgZGljdF90ICpkID0gJmRhcnJheVswXTsKKyAgZG5vZGVfdCAqZG47CisgIGludCBpOworICBjaGFyICp0b2sxLCAqdG9rMiwgKnZhbDsKKyAgY29uc3QgY2hhciAqa2V5OwogCi0gICAgY2hhciAqaGVscCA9Ci0JImEgPGtleT4gPHZhbD4gICAgICAgICAgYWRkIHZhbHVlIHRvIGRpY3Rpb25hcnlcbiIKLQkiZCA8a2V5PiAgICAgICAgICAgICAgICBkZWxldGUgdmFsdWUgZnJvbSBkaWN0aW9uYXJ5XG4iCi0JImwgPGtleT4gICAgICAgICAgICAgICAgbG9va3VwIHZhbHVlIGluIGRpY3Rpb25hcnlcbiIKLQkiKCA8a2V5PiAgICAgICAgICAgICAgICBsb29rdXAgbG93ZXIgYm91bmRcbiIKLQkiKSA8a2V5PiAgICAgICAgICAgICAgICBsb29rdXAgdXBwZXIgYm91bmRcbiIKLQkiIyA8bnVtPiAgICAgICAgICAgICAgICBzd2l0Y2ggdG8gYWx0ZXJuYXRlIGRpY3Rpb25hcnkgKDAtOSlcbiIKLQkiaiA8bnVtPiA8bnVtPiAgICAgICAgICBtZXJnZSB0d28gZGljdGlvbmFyaWVzXG4iCi0JImYgICAgICAgICAgICAgICAgICAgICAgZnJlZSB0aGUgd2hvbGUgZGljdGlvbmFyeVxuIgotCSJrICAgICAgICAgICAgICAgICAgICAgIGFsbG93IGR1cGxpY2F0ZSBrZXlzXG4iCi0JImMgICAgICAgICAgICAgICAgICAgICAgc2hvdyBudW1iZXIgb2YgZW50cmllc1xuIgotCSJ0ICAgICAgICAgICAgICAgICAgICAgIGR1bXAgd2hvbGUgZGljdGlvbmFyeSBpbiBzb3J0IG9yZGVyXG4iCi0JIm0gICAgICAgICAgICAgICAgICAgICAgbWFrZSBkaWN0aW9uYXJ5IG91dCBvZiBzb3J0ZWQgaXRlbXNcbiIKLQkicCAgICAgICAgICAgICAgICAgICAgICB0dXJuIHByb21wdCBvblxuIgotCSJzICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCB0byBub24tZnVuY3Rpb25pbmcgYWxsb2NhdG9yXG4iCi0JInEgICAgICAgICAgICAgICAgICAgICAgcXVpdCI7CisgIGNoYXIgKmhlbHAgPQorICAgICJhIDxrZXk+IDx2YWw+ICAgICAgICAgIGFkZCB2YWx1ZSB0byBkaWN0aW9uYXJ5XG4iCisgICAgImQgPGtleT4gICAgICAgICAgICAgICAgZGVsZXRlIHZhbHVlIGZyb20gZGljdGlvbmFyeVxuIgorICAgICJsIDxrZXk+ICAgICAgICAgICAgICAgIGxvb2t1cCB2YWx1ZSBpbiBkaWN0aW9uYXJ5XG4iCisgICAgIiggPGtleT4gICAgICAgICAgICAgICAgbG9va3VwIGxvd2VyIGJvdW5kXG4iCisgICAgIikgPGtleT4gICAgICAgICAgICAgICAgbG9va3VwIHVwcGVyIGJvdW5kXG4iCisgICAgIiMgPG51bT4gICAgICAgICAgICAgICAgc3dpdGNoIHRvIGFsdGVybmF0ZSBkaWN0aW9uYXJ5ICgwLTkpXG4iCisgICAgImogPG51bT4gPG51bT4gICAgICAgICAgbWVyZ2UgdHdvIGRpY3Rpb25hcmllc1xuIgorICAgICJmICAgICAgICAgICAgICAgICAgICAgIGZyZWUgdGhlIHdob2xlIGRpY3Rpb25hcnlcbiIKKyAgICAiayAgICAgICAgICAgICAgICAgICAgICBhbGxvdyBkdXBsaWNhdGUga2V5c1xuIgorICAgICJjICAgICAgICAgICAgICAgICAgICAgIHNob3cgbnVtYmVyIG9mIGVudHJpZXNcbiIKKyAgICAidCAgICAgICAgICAgICAgICAgICAgICBkdW1wIHdob2xlIGRpY3Rpb25hcnkgaW4gc29ydCBvcmRlclxuIgorICAgICJtICAgICAgICAgICAgICAgICAgICAgIG1ha2UgZGljdGlvbmFyeSBvdXQgb2Ygc29ydGVkIGl0ZW1zXG4iCisgICAgInAgICAgICAgICAgICAgICAgICAgICAgdHVybiBwcm9tcHQgb25cbiIKKyAgICAicyAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggdG8gbm9uLWZ1bmN0aW9uaW5nIGFsbG9jYXRvclxuIgorICAgICJxICAgICAgICAgICAgICAgICAgICAgIHF1aXQiOwogCi0gICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiBkYXJyYXkgLyBzaXplb2YgKmRhcnJheTsgaSsrKQotCWRpY3RfaW5pdCgmZGFycmF5W2ldLCBESUNUQ09VTlRfVF9NQVgsIGNvbXBhcmVmKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZiBkYXJyYXkgLyBzaXplb2YgKmRhcnJheTsgaSsrKQorICAgIGRpY3RfaW5pdCAoJmRhcnJheVtpXSwgRElDVENPVU5UX1RfTUFYLCBjb21wYXJlZik7CiAKLSAgICBmb3IgKDs7KSB7Ci0JaWYgKHByb21wdCkKLQkgICAgcHV0Y2hhcignPicpOwotCWZmbHVzaChzdGRvdXQpOworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGlmIChwcm9tcHQpCisJcHV0Y2hhciAoJz4nKTsKKyAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKIAotCWlmICghZmdldHMoaW4sIHNpemVvZihpbnB1dF90KSwgc3RkaW4pKQotCSAgICBicmVhazsKKyAgICAgIGlmICghZmdldHMgKGluLCBzaXplb2YgKGlucHV0X3QpLCBzdGRpbikpCisJYnJlYWs7CiAKLQlzd2l0Y2goaW5bMF0pIHsKLQkgICAgY2FzZSAnPyc6Ci0JCXB1dHMoaGVscCk7Ci0JCWJyZWFrOwotCSAgICBjYXNlICdhJzoKLQkJaWYgKHRva2VuaXplKGluKzEsICZ0b2sxLCAmdG9rMiwgKGNoYXIgKiopIDApICE9IDIpIHsKLQkJICAgIHB1dHMoIndoYXQ/Iik7Ci0JCSAgICBicmVhazsKLQkJfQotCQlrZXkgPSBkdXBzdHJpbmcodG9rMSk7Ci0JCXZhbCA9IGR1cHN0cmluZyh0b2syKTsKKyAgICAgIHN3aXRjaCAoaW5bMF0pCisJeworCWNhc2UgJz8nOgorCSAgcHV0cyAoaGVscCk7CisJICBicmVhazsKKwljYXNlICdhJzoKKwkgIGlmICh0b2tlbml6ZSAoaW4gKyAxLCAmdG9rMSwgJnRvazIsIChjaGFyICoqKSAwKSAhPSAyKQorCSAgICB7CisJICAgICAgcHV0cyAoIndoYXQ/Iik7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGtleSA9IGR1cHN0cmluZyAodG9rMSk7CisJICB2YWwgPSBkdXBzdHJpbmcgKHRvazIpOwogCi0JCWlmICgha2V5IHx8ICF2YWwpIHsKLQkJICAgIHB1dHMoIm91dCBvZiBtZW1vcnkiKTsKLQkJICAgIGZyZWUoKHZvaWQgKikga2V5KTsKLQkJICAgIGZyZWUodmFsKTsKLQkJfQorCSAgaWYgKCFrZXkgfHwgIXZhbCkKKwkgICAgeworCSAgICAgIHB1dHMgKCJvdXQgb2YgbWVtb3J5Iik7CisJICAgICAgZnJlZSAoKHZvaWQgKikga2V5KTsKKwkgICAgICBmcmVlICh2YWwpOworCSAgICB9CiAKLQkJaWYgKCFkaWN0X2FsbG9jX2luc2VydChkLCBrZXksIHZhbCkpIHsKLQkJICAgIHB1dHMoImRpY3RfYWxsb2NfaW5zZXJ0IGZhaWxlZCIpOwotCQkgICAgZnJlZSgodm9pZCAqKSBrZXkpOwotCQkgICAgZnJlZSh2YWwpOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgJ2QnOgotCQlpZiAodG9rZW5pemUoaW4rMSwgJnRvazEsIChjaGFyICoqKSAwKSAhPSAxKSB7Ci0JCSAgICBwdXRzKCJ3aGF0PyIpOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkJZG4gPSBkaWN0X2xvb2t1cChkLCB0b2sxKTsKLQkJaWYgKCFkbikgewotCQkgICAgcHV0cygiZGljdF9sb29rdXAgZmFpbGVkIik7Ci0JCSAgICBicmVhazsKLQkJfQotCQl2YWwgPSBkbm9kZV9nZXQoZG4pOwotCQlrZXkgPSBkbm9kZV9nZXRrZXkoZG4pOwotCQlkaWN0X2RlbGV0ZV9mcmVlKGQsIGRuKTsKKwkgIGlmICghZGljdF9hbGxvY19pbnNlcnQgKGQsIGtleSwgdmFsKSkKKwkgICAgeworCSAgICAgIHB1dHMgKCJkaWN0X2FsbG9jX2luc2VydCBmYWlsZWQiKTsKKwkgICAgICBmcmVlICgodm9pZCAqKSBrZXkpOworCSAgICAgIGZyZWUgKHZhbCk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgJ2QnOgorCSAgaWYgKHRva2VuaXplIChpbiArIDEsICZ0b2sxLCAoY2hhciAqKikgMCkgIT0gMSkKKwkgICAgeworCSAgICAgIHB1dHMgKCJ3aGF0PyIpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBkbiA9IGRpY3RfbG9va3VwIChkLCB0b2sxKTsKKwkgIGlmICghZG4pCisJICAgIHsKKwkgICAgICBwdXRzICgiZGljdF9sb29rdXAgZmFpbGVkIik7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIHZhbCA9IGRub2RlX2dldCAoZG4pOworCSAga2V5ID0gZG5vZGVfZ2V0a2V5IChkbik7CisJICBkaWN0X2RlbGV0ZV9mcmVlIChkLCBkbik7CiAKLQkJZnJlZSh2YWwpOwotCQlmcmVlKCh2b2lkICopIGtleSk7Ci0JCWJyZWFrOwotCSAgICBjYXNlICdmJzoKLQkJZGljdF9mcmVlKGQpOwotCQlicmVhazsKKwkgIGZyZWUgKHZhbCk7CisJICBmcmVlICgodm9pZCAqKSBrZXkpOworCSAgYnJlYWs7CisJY2FzZSAnZic6CisJICBkaWN0X2ZyZWUgKGQpOworCSAgYnJlYWs7CisJY2FzZSAnbCc6CisJY2FzZSAnKCc6CisJY2FzZSAnKSc6CisJICBpZiAodG9rZW5pemUgKGluICsgMSwgJnRvazEsIChjaGFyICoqKSAwKSAhPSAxKQorCSAgICB7CisJICAgICAgcHV0cyAoIndoYXQ/Iik7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGRuID0gMDsKKwkgIHN3aXRjaCAoaW5bMF0pCisJICAgIHsKIAkgICAgY2FzZSAnbCc6CisJICAgICAgZG4gPSBkaWN0X2xvb2t1cCAoZCwgdG9rMSk7CisJICAgICAgYnJlYWs7CiAJICAgIGNhc2UgJygnOgorCSAgICAgIGRuID0gZGljdF9sb3dlcl9ib3VuZCAoZCwgdG9rMSk7CisJICAgICAgYnJlYWs7CiAJICAgIGNhc2UgJyknOgotCQlpZiAodG9rZW5pemUoaW4rMSwgJnRvazEsIChjaGFyICoqKSAwKSAhPSAxKSB7Ci0JCSAgICBwdXRzKCJ3aGF0PyIpOwotCQkgICAgYnJlYWs7CisJICAgICAgZG4gPSBkaWN0X3VwcGVyX2JvdW5kIChkLCB0b2sxKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgaWYgKCFkbikKKwkgICAgeworCSAgICAgIHB1dHMgKCJsb29rdXAgZmFpbGVkIik7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIHZhbCA9IGRub2RlX2dldCAoZG4pOworCSAgcHV0cyAodmFsKTsKKwkgIGJyZWFrOworCWNhc2UgJ20nOgorCSAgY29uc3RydWN0IChkKTsKKwkgIGJyZWFrOworCWNhc2UgJ2snOgorCSAgZGljdF9hbGxvd19kdXBlcyAoZCk7CisJICBicmVhazsKKwljYXNlICdjJzoKKwkgIHByaW50ZiAoIiVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpIGRpY3RfY291bnQgKGQpKTsKKwkgIGJyZWFrOworCWNhc2UgJ3QnOgorCSAgZm9yIChkbiA9IGRpY3RfZmlyc3QgKGQpOyBkbjsgZG4gPSBkaWN0X25leHQgKGQsIGRuKSkKKwkgICAgeworCSAgICAgIHByaW50ZiAoIiVzXHQlc1xuIiwgKGNoYXIgKikgZG5vZGVfZ2V0a2V5IChkbiksCisJCSAgICAgIChjaGFyICopIGRub2RlX2dldCAoZG4pKTsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSAncSc6CisJICBleGl0ICgwKTsKKwkgIGJyZWFrOworCWNhc2UgJ1wwJzoKKwkgIGJyZWFrOworCWNhc2UgJ3AnOgorCSAgcHJvbXB0ID0gMTsKKwkgIGJyZWFrOworCWNhc2UgJ3MnOgorCSAgZGljdF9zZXRfYWxsb2NhdG9yIChkLCBuZXdfbm9kZSwgZGVsX25vZGUsIE5VTEwpOworCSAgYnJlYWs7CisJY2FzZSAnIyc6CisJICBpZiAodG9rZW5pemUgKGluICsgMSwgJnRvazEsIChjaGFyICoqKSAwKSAhPSAxKQorCSAgICB7CisJICAgICAgcHV0cyAoIndoYXQ/Iik7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGludCBkaWN0bnVtID0gYXRvaSAodG9rMSk7CisJICAgICAgaWYgKGRpY3RudW0gPCAwIHx8IGRpY3RudW0gPiA5KQorCQl7CisJCSAgcHV0cyAoImludmFsaWQgbnVtYmVyIik7CisJCSAgYnJlYWs7CiAJCX0KLQkJZG4gPSAwOwotCQlzd2l0Y2ggKGluWzBdKSB7Ci0JCWNhc2UgJ2wnOgotCQkgICAgZG4gPSBkaWN0X2xvb2t1cChkLCB0b2sxKTsKLQkJICAgIGJyZWFrOwotCQljYXNlICcoJzoKLQkJICAgIGRuID0gZGljdF9sb3dlcl9ib3VuZChkLCB0b2sxKTsKLQkJICAgIGJyZWFrOwotCQljYXNlICcpJzoKLQkJICAgIGRuID0gZGljdF91cHBlcl9ib3VuZChkLCB0b2sxKTsKLQkJICAgIGJyZWFrOworCSAgICAgIGQgPSAmZGFycmF5W2RpY3RudW1dOworCSAgICB9CisJICBicmVhazsKKwljYXNlICdqJzoKKwkgIGlmICh0b2tlbml6ZSAoaW4gKyAxLCAmdG9rMSwgJnRvazIsIChjaGFyICoqKSAwKSAhPSAyKQorCSAgICB7CisJICAgICAgcHV0cyAoIndoYXQ/Iik7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGludCBkaWN0MSA9IGF0b2kgKHRvazEpLCBkaWN0MiA9IGF0b2kgKHRvazIpOworCSAgICAgIGlmIChkaWN0MSA8IDAgfHwgZGljdDEgPiA5IHx8IGRpY3QyIDwgMCB8fCBkaWN0MiA+IDkpCisJCXsKKwkJICBwdXRzICgiaW52YWxpZCBudW1iZXIiKTsKKwkJICBicmVhazsKIAkJfQotCQlpZiAoIWRuKSB7Ci0JCSAgICBwdXRzKCJsb29rdXAgZmFpbGVkIik7Ci0JCSAgICBicmVhazsKLQkJfQotCQl2YWwgPSBkbm9kZV9nZXQoZG4pOwotCQlwdXRzKHZhbCk7Ci0JCWJyZWFrOwotCSAgICBjYXNlICdtJzoKLQkJY29uc3RydWN0KGQpOwotCQlicmVhazsKLQkgICAgY2FzZSAnayc6Ci0JCWRpY3RfYWxsb3dfZHVwZXMoZCk7Ci0JCWJyZWFrOwotCSAgICBjYXNlICdjJzoKLQkJcHJpbnRmKCIlbHVcbiIsICh1bnNpZ25lZCBsb25nKSBkaWN0X2NvdW50KGQpKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgJ3QnOgotCQlmb3IgKGRuID0gZGljdF9maXJzdChkKTsgZG47IGRuID0gZGljdF9uZXh0KGQsIGRuKSkgewotCQkgICAgcHJpbnRmKCIlc1x0JXNcbiIsIChjaGFyICopIGRub2RlX2dldGtleShkbiksCi0JCQkgICAgKGNoYXIgKikgZG5vZGVfZ2V0KGRuKSk7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgJ3EnOgotCQlleGl0KDApOwotCQlicmVhazsKLQkgICAgY2FzZSAnXDAnOgotCQlicmVhazsKLQkgICAgY2FzZSAncCc6Ci0JCXByb21wdCA9IDE7Ci0JCWJyZWFrOwotCSAgICBjYXNlICdzJzoKLQkJZGljdF9zZXRfYWxsb2NhdG9yKGQsIG5ld19ub2RlLCBkZWxfbm9kZSwgTlVMTCk7Ci0JCWJyZWFrOwotCSAgICBjYXNlICcjJzoKLQkJaWYgKHRva2VuaXplKGluKzEsICZ0b2sxLCAoY2hhciAqKikgMCkgIT0gMSkgewotCQkgICAgcHV0cygid2hhdD8iKTsKLQkJICAgIGJyZWFrOwotCQl9IGVsc2UgewotCQkgICAgaW50IGRpY3RudW0gPSBhdG9pKHRvazEpOwotCQkgICAgaWYgKGRpY3RudW0gPCAwIHx8IGRpY3RudW0gPiA5KSB7Ci0JCQlwdXRzKCJpbnZhbGlkIG51bWJlciIpOwotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCSAgICBkID0gJmRhcnJheVtkaWN0bnVtXTsKLQkJfQotCQlicmVhazsKLQkgICAgY2FzZSAnaic6Ci0JCWlmICh0b2tlbml6ZShpbisxLCAmdG9rMSwgJnRvazIsIChjaGFyICoqKSAwKSAhPSAyKSB7Ci0JCSAgICBwdXRzKCJ3aGF0PyIpOwotCQkgICAgYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCSAgICBpbnQgZGljdDEgPSBhdG9pKHRvazEpLCBkaWN0MiA9IGF0b2kodG9rMik7Ci0JCSAgICBpZiAoZGljdDEgPCAwIHx8IGRpY3QxID4gOSB8fCBkaWN0MiA8IDAgfHwgZGljdDIgPiA5KSB7Ci0JCQlwdXRzKCJpbnZhbGlkIG51bWJlciIpOwotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCSAgICBkaWN0X21lcmdlKCZkYXJyYXlbZGljdDFdLCAmZGFycmF5W2RpY3QyXSk7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCXB1dGNoYXIoJz8nKTsKLQkJcHV0Y2hhcignXG4nKTsKLQkJYnJlYWs7CisJICAgICAgZGljdF9tZXJnZSAoJmRhcnJheVtkaWN0MV0sICZkYXJyYXlbZGljdDJdKTsKKwkgICAgfQorCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHB1dGNoYXIgKCc/Jyk7CisJICBwdXRjaGFyICgnXG4nKTsKKwkgIGJyZWFrOwogCX0KICAgICB9CiAKLSAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDA7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaXNpc2QvZGljdC5oIGIvaXNpc2QvZGljdC5oCmluZGV4IDI5NzdhOTAuLjFhNWU5ZDcgMTAwNjQ0Ci0tLSBhL2lzaXNkL2RpY3QuaAorKysgYi9pc2lzZC9kaWN0LmgKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGludG8gcHJvcHJpZXRhcnkgc29mdHdhcmU7IHRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IGZvciBzdWNoIHNvZnR3YXJlIHRvCiAgKiBjb250YWluIGEgY29weXJpZ2h0IG5vdGljZSByZWxhdGVkIHRvIHRoaXMgc291cmNlLgogICoKLSAqICRJZDogZGljdC5oLHYgMS4xIDIwMDMvMTIvMjMgMDg6MDk6NDggamFyZGluIEV4cCAkCisgKiAkSWQ6IGRpY3QuaCx2IDEuMiAyMDA0LzA5LzEwIDIwOjQ4OjIxIGhhc3NvIEV4cCAkCiAgKiAkTmFtZTogICQKICAqLwogCkBAIC0zMSwzNyArMzEsNDEgQEAKICAqLwogCiAjaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeworZXh0ZXJuICJDIgorewogI2VuZGlmCiAKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBkaWN0Y291bnRfdDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGRpY3Rjb3VudF90OwogI2RlZmluZSBESUNUQ09VTlRfVF9NQVggVUxPTkdfTUFYCiAKIC8qCiAgKiBUaGUgZGljdGlvbmFyeSBpcyBpbXBsZW1lbnRlZCBhcyBhIHJlZC1ibGFjayB0cmVlCiAgKi8KIAotdHlwZWRlZiBlbnVtIHsgZG5vZGVfcmVkLCBkbm9kZV9ibGFjayB9IGRub2RlX2NvbG9yX3Q7CisgIHR5cGVkZWYgZW51bQorICB7IGRub2RlX3JlZCwgZG5vZGVfYmxhY2sgfSBkbm9kZV9jb2xvcl90OwogCi10eXBlZGVmIHN0cnVjdCBkbm9kZV90IHsKLSAgICAjaWYgZGVmaW5lZChESUNUX0lNUExFTUVOVEFUSU9OKSB8fCAhZGVmaW5lZChLQVpMSUJfT1BBUVVFX0RFQlVHKQorICB0eXBlZGVmIHN0cnVjdCBkbm9kZV90CisgIHsKKyNpZiBkZWZpbmVkKERJQ1RfSU1QTEVNRU5UQVRJT04pIHx8ICFkZWZpbmVkKEtBWkxJQl9PUEFRVUVfREVCVUcpCiAgICAgc3RydWN0IGRub2RlX3QgKmRpY3RfbGVmdDsKICAgICBzdHJ1Y3QgZG5vZGVfdCAqZGljdF9yaWdodDsKICAgICBzdHJ1Y3QgZG5vZGVfdCAqZGljdF9wYXJlbnQ7CiAgICAgZG5vZGVfY29sb3JfdCBkaWN0X2NvbG9yOwogICAgIGNvbnN0IHZvaWQgKmRpY3Rfa2V5OwogICAgIHZvaWQgKmRpY3RfZGF0YTsKLSAgICAjZWxzZQorI2Vsc2UKICAgICBpbnQgZGljdF9kdW1teTsKLSAgICAjZW5kaWYKLX0gZG5vZGVfdDsKKyNlbmRpZgorICB9IGRub2RlX3Q7CiAKLXR5cGVkZWYgaW50ICgqZGljdF9jb21wX3QpKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKTsKLXR5cGVkZWYgZG5vZGVfdCAqKCpkbm9kZV9hbGxvY190KSh2b2lkICopOwotdHlwZWRlZiB2b2lkICgqZG5vZGVfZnJlZV90KShkbm9kZV90ICosIHZvaWQgKik7CisgIHR5cGVkZWYgaW50ICgqZGljdF9jb21wX3QpIChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7CisgIHR5cGVkZWYgZG5vZGVfdCAqKCpkbm9kZV9hbGxvY190KSAodm9pZCAqKTsKKyAgdHlwZWRlZiB2b2lkICgqZG5vZGVfZnJlZV90KSAoZG5vZGVfdCAqLCB2b2lkICopOwogCi10eXBlZGVmIHN0cnVjdCBkaWN0X3QgewotICAgICNpZiBkZWZpbmVkKERJQ1RfSU1QTEVNRU5UQVRJT04pIHx8ICFkZWZpbmVkKEtBWkxJQl9PUEFRVUVfREVCVUcpCisgIHR5cGVkZWYgc3RydWN0IGRpY3RfdAorICB7CisjaWYgZGVmaW5lZChESUNUX0lNUExFTUVOVEFUSU9OKSB8fCAhZGVmaW5lZChLQVpMSUJfT1BBUVVFX0RFQlVHKQogICAgIGRub2RlX3QgZGljdF9uaWxub2RlOwogICAgIGRpY3Rjb3VudF90IGRpY3Rfbm9kZWNvdW50OwogICAgIGRpY3Rjb3VudF90IGRpY3RfbWF4Y291bnQ7CkBAIC03MCw1OSArNzQsNjEgQEAKICAgICBkbm9kZV9mcmVlX3QgZGljdF9mcmVlbm9kZTsKICAgICB2b2lkICpkaWN0X2NvbnRleHQ7CiAgICAgaW50IGRpY3RfZHVwZXM7Ci0gICAgI2Vsc2UKKyNlbHNlCiAgICAgaW50IGRpY3RfZHVtbW15OwotICAgICNlbmRpZgotfSBkaWN0X3Q7CisjZW5kaWYKKyAgfSBkaWN0X3Q7CiAKLXR5cGVkZWYgdm9pZCAoKmRub2RlX3Byb2Nlc3NfdCkoZGljdF90ICosIGRub2RlX3QgKiwgdm9pZCAqKTsKKyAgdHlwZWRlZiB2b2lkICgqZG5vZGVfcHJvY2Vzc190KSAoZGljdF90ICosIGRub2RlX3QgKiwgdm9pZCAqKTsKIAotdHlwZWRlZiBzdHJ1Y3QgZGljdF9sb2FkX3QgewotICAgICNpZiBkZWZpbmVkKERJQ1RfSU1QTEVNRU5UQVRJT04pIHx8ICFkZWZpbmVkKEtBWkxJQl9PUEFRVUVfREVCVUcpCisgIHR5cGVkZWYgc3RydWN0IGRpY3RfbG9hZF90CisgIHsKKyNpZiBkZWZpbmVkKERJQ1RfSU1QTEVNRU5UQVRJT04pIHx8ICFkZWZpbmVkKEtBWkxJQl9PUEFRVUVfREVCVUcpCiAgICAgZGljdF90ICpkaWN0X2RpY3RwdHI7CiAgICAgZG5vZGVfdCBkaWN0X25pbG5vZGU7Ci0gICAgI2Vsc2UKKyNlbHNlCiAgICAgaW50IGRpY3RfZHVtbW15OwotICAgICNlbmRpZgotfSBkaWN0X2xvYWRfdDsKKyNlbmRpZgorICB9IGRpY3RfbG9hZF90OwogCi1leHRlcm4gZGljdF90ICpkaWN0X2NyZWF0ZShkaWN0Y291bnRfdCwgZGljdF9jb21wX3QpOwotZXh0ZXJuIHZvaWQgZGljdF9zZXRfYWxsb2NhdG9yKGRpY3RfdCAqLCBkbm9kZV9hbGxvY190LCBkbm9kZV9mcmVlX3QsIHZvaWQgKik7Ci1leHRlcm4gdm9pZCBkaWN0X2Rlc3Ryb3koZGljdF90ICopOwotZXh0ZXJuIHZvaWQgZGljdF9mcmVlX25vZGVzKGRpY3RfdCAqKTsKLWV4dGVybiB2b2lkIGRpY3RfZnJlZShkaWN0X3QgKik7Ci1leHRlcm4gZGljdF90ICpkaWN0X2luaXQoZGljdF90ICosIGRpY3Rjb3VudF90LCBkaWN0X2NvbXBfdCk7Ci1leHRlcm4gdm9pZCBkaWN0X2luaXRfbGlrZShkaWN0X3QgKiwgY29uc3QgZGljdF90ICopOwotZXh0ZXJuIGludCBkaWN0X3ZlcmlmeShkaWN0X3QgKik7Ci1leHRlcm4gaW50IGRpY3Rfc2ltaWxhcihjb25zdCBkaWN0X3QgKiwgY29uc3QgZGljdF90ICopOwotZXh0ZXJuIGRub2RlX3QgKmRpY3RfbG9va3VwKGRpY3RfdCAqLCBjb25zdCB2b2lkICopOwotZXh0ZXJuIGRub2RlX3QgKmRpY3RfbG93ZXJfYm91bmQoZGljdF90ICosIGNvbnN0IHZvaWQgKik7Ci1leHRlcm4gZG5vZGVfdCAqZGljdF91cHBlcl9ib3VuZChkaWN0X3QgKiwgY29uc3Qgdm9pZCAqKTsKLWV4dGVybiB2b2lkIGRpY3RfaW5zZXJ0KGRpY3RfdCAqLCBkbm9kZV90ICosIGNvbnN0IHZvaWQgKik7Ci1leHRlcm4gZG5vZGVfdCAqZGljdF9kZWxldGUoZGljdF90ICosIGRub2RlX3QgKik7Ci1leHRlcm4gaW50IGRpY3RfYWxsb2NfaW5zZXJ0KGRpY3RfdCAqLCBjb25zdCB2b2lkICosIHZvaWQgKik7Ci1leHRlcm4gdm9pZCBkaWN0X2RlbGV0ZV9mcmVlKGRpY3RfdCAqLCBkbm9kZV90ICopOwotZXh0ZXJuIGRub2RlX3QgKmRpY3RfZmlyc3QoZGljdF90ICopOwotZXh0ZXJuIGRub2RlX3QgKmRpY3RfbGFzdChkaWN0X3QgKik7Ci1leHRlcm4gZG5vZGVfdCAqZGljdF9uZXh0KGRpY3RfdCAqLCBkbm9kZV90ICopOwotZXh0ZXJuIGRub2RlX3QgKmRpY3RfcHJldihkaWN0X3QgKiwgZG5vZGVfdCAqKTsKLWV4dGVybiBkaWN0Y291bnRfdCBkaWN0X2NvdW50KGRpY3RfdCAqKTsKLWV4dGVybiBpbnQgZGljdF9pc2VtcHR5KGRpY3RfdCAqKTsKLWV4dGVybiBpbnQgZGljdF9pc2Z1bGwoZGljdF90ICopOwotZXh0ZXJuIGludCBkaWN0X2NvbnRhaW5zKGRpY3RfdCAqLCBkbm9kZV90ICopOwotZXh0ZXJuIHZvaWQgZGljdF9hbGxvd19kdXBlcyhkaWN0X3QgKik7Ci1leHRlcm4gaW50IGRub2RlX2lzX2luX2FfZGljdChkbm9kZV90ICopOwotZXh0ZXJuIGRub2RlX3QgKmRub2RlX2NyZWF0ZSh2b2lkICopOwotZXh0ZXJuIGRub2RlX3QgKmRub2RlX2luaXQoZG5vZGVfdCAqLCB2b2lkICopOwotZXh0ZXJuIHZvaWQgZG5vZGVfZGVzdHJveShkbm9kZV90ICopOwotZXh0ZXJuIHZvaWQgKmRub2RlX2dldChkbm9kZV90ICopOwotZXh0ZXJuIGNvbnN0IHZvaWQgKmRub2RlX2dldGtleShkbm9kZV90ICopOwotZXh0ZXJuIHZvaWQgZG5vZGVfcHV0KGRub2RlX3QgKiwgdm9pZCAqKTsKLWV4dGVybiB2b2lkIGRpY3RfcHJvY2VzcyhkaWN0X3QgKiwgdm9pZCAqLCBkbm9kZV9wcm9jZXNzX3QpOwotZXh0ZXJuIHZvaWQgZGljdF9sb2FkX2JlZ2luKGRpY3RfbG9hZF90ICosIGRpY3RfdCAqKTsKLWV4dGVybiB2b2lkIGRpY3RfbG9hZF9uZXh0KGRpY3RfbG9hZF90ICosIGRub2RlX3QgKiwgY29uc3Qgdm9pZCAqKTsKLWV4dGVybiB2b2lkIGRpY3RfbG9hZF9lbmQoZGljdF9sb2FkX3QgKik7Ci1leHRlcm4gdm9pZCBkaWN0X21lcmdlKGRpY3RfdCAqLCBkaWN0X3QgKik7CisgIGV4dGVybiBkaWN0X3QgKmRpY3RfY3JlYXRlIChkaWN0Y291bnRfdCwgZGljdF9jb21wX3QpOworICBleHRlcm4gdm9pZCBkaWN0X3NldF9hbGxvY2F0b3IgKGRpY3RfdCAqLCBkbm9kZV9hbGxvY190LCBkbm9kZV9mcmVlX3QsCisJCQkJICB2b2lkICopOworICBleHRlcm4gdm9pZCBkaWN0X2Rlc3Ryb3kgKGRpY3RfdCAqKTsKKyAgZXh0ZXJuIHZvaWQgZGljdF9mcmVlX25vZGVzIChkaWN0X3QgKik7CisgIGV4dGVybiB2b2lkIGRpY3RfZnJlZSAoZGljdF90ICopOworICBleHRlcm4gZGljdF90ICpkaWN0X2luaXQgKGRpY3RfdCAqLCBkaWN0Y291bnRfdCwgZGljdF9jb21wX3QpOworICBleHRlcm4gdm9pZCBkaWN0X2luaXRfbGlrZSAoZGljdF90ICosIGNvbnN0IGRpY3RfdCAqKTsKKyAgZXh0ZXJuIGludCBkaWN0X3ZlcmlmeSAoZGljdF90ICopOworICBleHRlcm4gaW50IGRpY3Rfc2ltaWxhciAoY29uc3QgZGljdF90ICosIGNvbnN0IGRpY3RfdCAqKTsKKyAgZXh0ZXJuIGRub2RlX3QgKmRpY3RfbG9va3VwIChkaWN0X3QgKiwgY29uc3Qgdm9pZCAqKTsKKyAgZXh0ZXJuIGRub2RlX3QgKmRpY3RfbG93ZXJfYm91bmQgKGRpY3RfdCAqLCBjb25zdCB2b2lkICopOworICBleHRlcm4gZG5vZGVfdCAqZGljdF91cHBlcl9ib3VuZCAoZGljdF90ICosIGNvbnN0IHZvaWQgKik7CisgIGV4dGVybiB2b2lkIGRpY3RfaW5zZXJ0IChkaWN0X3QgKiwgZG5vZGVfdCAqLCBjb25zdCB2b2lkICopOworICBleHRlcm4gZG5vZGVfdCAqZGljdF9kZWxldGUgKGRpY3RfdCAqLCBkbm9kZV90ICopOworICBleHRlcm4gaW50IGRpY3RfYWxsb2NfaW5zZXJ0IChkaWN0X3QgKiwgY29uc3Qgdm9pZCAqLCB2b2lkICopOworICBleHRlcm4gdm9pZCBkaWN0X2RlbGV0ZV9mcmVlIChkaWN0X3QgKiwgZG5vZGVfdCAqKTsKKyAgZXh0ZXJuIGRub2RlX3QgKmRpY3RfZmlyc3QgKGRpY3RfdCAqKTsKKyAgZXh0ZXJuIGRub2RlX3QgKmRpY3RfbGFzdCAoZGljdF90ICopOworICBleHRlcm4gZG5vZGVfdCAqZGljdF9uZXh0IChkaWN0X3QgKiwgZG5vZGVfdCAqKTsKKyAgZXh0ZXJuIGRub2RlX3QgKmRpY3RfcHJldiAoZGljdF90ICosIGRub2RlX3QgKik7CisgIGV4dGVybiBkaWN0Y291bnRfdCBkaWN0X2NvdW50IChkaWN0X3QgKik7CisgIGV4dGVybiBpbnQgZGljdF9pc2VtcHR5IChkaWN0X3QgKik7CisgIGV4dGVybiBpbnQgZGljdF9pc2Z1bGwgKGRpY3RfdCAqKTsKKyAgZXh0ZXJuIGludCBkaWN0X2NvbnRhaW5zIChkaWN0X3QgKiwgZG5vZGVfdCAqKTsKKyAgZXh0ZXJuIHZvaWQgZGljdF9hbGxvd19kdXBlcyAoZGljdF90ICopOworICBleHRlcm4gaW50IGRub2RlX2lzX2luX2FfZGljdCAoZG5vZGVfdCAqKTsKKyAgZXh0ZXJuIGRub2RlX3QgKmRub2RlX2NyZWF0ZSAodm9pZCAqKTsKKyAgZXh0ZXJuIGRub2RlX3QgKmRub2RlX2luaXQgKGRub2RlX3QgKiwgdm9pZCAqKTsKKyAgZXh0ZXJuIHZvaWQgZG5vZGVfZGVzdHJveSAoZG5vZGVfdCAqKTsKKyAgZXh0ZXJuIHZvaWQgKmRub2RlX2dldCAoZG5vZGVfdCAqKTsKKyAgZXh0ZXJuIGNvbnN0IHZvaWQgKmRub2RlX2dldGtleSAoZG5vZGVfdCAqKTsKKyAgZXh0ZXJuIHZvaWQgZG5vZGVfcHV0IChkbm9kZV90ICosIHZvaWQgKik7CisgIGV4dGVybiB2b2lkIGRpY3RfcHJvY2VzcyAoZGljdF90ICosIHZvaWQgKiwgZG5vZGVfcHJvY2Vzc190KTsKKyAgZXh0ZXJuIHZvaWQgZGljdF9sb2FkX2JlZ2luIChkaWN0X2xvYWRfdCAqLCBkaWN0X3QgKik7CisgIGV4dGVybiB2b2lkIGRpY3RfbG9hZF9uZXh0IChkaWN0X2xvYWRfdCAqLCBkbm9kZV90ICosIGNvbnN0IHZvaWQgKik7CisgIGV4dGVybiB2b2lkIGRpY3RfbG9hZF9lbmQgKGRpY3RfbG9hZF90ICopOworICBleHRlcm4gdm9pZCBkaWN0X21lcmdlIChkaWN0X3QgKiwgZGljdF90ICopOwogCiAjaWYgZGVmaW5lZChESUNUX0lNUExFTUVOVEFUSU9OKSB8fCAhZGVmaW5lZChLQVpMSUJfT1BBUVVFX0RFQlVHKQogI2lmZGVmIEtBWkxJQl9TSURFRUZGRUNUX0RFQlVHCmRpZmYgLS1naXQgYS9pc2lzZC9pc2lzX2FkamFjZW5jeS5jIGIvaXNpc2QvaXNpc19hZGphY2VuY3kuYwppbmRleCA4NmZlZDFkLi4zNzcwZWJkIDEwMDY0NAotLS0gYS9pc2lzZC9pc2lzX2FkamFjZW5jeS5jCisrKyBiL2lzaXNkL2lzaXNfYWRqYWNlbmN5LmMKQEAgLTQ3LDE3MiArNDcsMTgwIEBACiAjaW5jbHVkZSAiaXNpc2QvaXNpc19keW5obi5oIgogI2luY2x1ZGUgImlzaXNkL2lzaXNfcGR1LmgiCiAKLQogZXh0ZXJuIHN0cnVjdCBpc2lzICppc2lzOwogCi0KIHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqCi1hZGpfYWxsb2MgKHVfY2hhciAqaWQpCithZGpfYWxsb2MgKHVfY2hhciAqIGlkKQogewotICAgIHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqOworICBzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKmFkajsKIAotICAgIGFkaiA9IFhNQUxMT0MgKE1UWVBFX0lTSVNfQURKQUNFTkNZLCBzaXplb2YgKHN0cnVjdCBpc2lzX2FkamFjZW5jeSkpOwotICAgIG1lbXNldCAoYWRqLCAwLCBzaXplb2YgKHN0cnVjdCBpc2lzX2FkamFjZW5jeSkpOwotICAgIG1lbWNweSAoYWRqLT5zeXNpZCwgaWQsIElTSVNfU1lTX0lEX0xFTik7Ci0gICAgCi0gICAgcmV0dXJuIGFkajsKKyAgYWRqID0gWE1BTExPQyAoTVRZUEVfSVNJU19BREpBQ0VOQ1ksIHNpemVvZiAoc3RydWN0IGlzaXNfYWRqYWNlbmN5KSk7CisgIG1lbXNldCAoYWRqLCAwLCBzaXplb2YgKHN0cnVjdCBpc2lzX2FkamFjZW5jeSkpOworICBtZW1jcHkgKGFkai0+c3lzaWQsIGlkLCBJU0lTX1NZU19JRF9MRU4pOworCisgIHJldHVybiBhZGo7CiB9CiAKIHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqCi1pc2lzX25ld19hZGogKHVfY2hhciAqaWQsIHVfY2hhciAqc25wYSwgaW50IGxldmVsLCAKK2lzaXNfbmV3X2FkaiAodV9jaGFyICogaWQsIHVfY2hhciAqIHNucGEsIGludCBsZXZlbCwKIAkgICAgICBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0KQogewotCiAgIHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqOwotICBpbnQgaTsgIAorICBpbnQgaTsKIAotICBhZGogPSBhZGpfYWxsb2MgKGlkKTsgLyogUDJQIGtsdWRnZSAqLwotICAKLSAgaWYgKGFkaiA9PSBOVUxMKXsKLSAgICB6bG9nX2VyciAoIk91dCBvZiBtZW1vcnkhIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KKyAgYWRqID0gYWRqX2FsbG9jIChpZCk7CQkvKiBQMlAga2x1ZGdlICovCisKKyAgaWYgKGFkaiA9PSBOVUxMKQorICAgIHsKKyAgICAgIHpsb2dfZXJyICgiT3V0IG9mIG1lbW9yeSEiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAogICBtZW1jcHkgKGFkai0+c25wYSwgc25wYSwgNik7CiAgIGFkai0+Y2lyY3VpdCA9IGNpcmN1aXQ7CiAgIGFkai0+bGV2ZWwgPSBsZXZlbDsKICAgYWRqLT5mbGFwcyA9IDA7CiAgIGFkai0+bGFzdF9mbGFwID0gdGltZSAoTlVMTCk7Ci0gIGlmIChjaXJjdWl0LT5jaXJjX3R5cGUgPT0gQ0lSQ1VJVF9UX0JST0FEQ0FTVCkgewotICAgIGxpc3Rub2RlX2FkZCAoY2lyY3VpdC0+dS5iYy5hZGpkYltsZXZlbC0xXSwgYWRqKTsKLSAgICBhZGotPmRpc2NoYW5nZXNbbGV2ZWwgLSAxXSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IERJU19SRUNPUkRTOyBpKyspIC8qIGNsZWFyIE4gRElTIHN0YXRlIGNoYW5nZSByZWNvcmRzICovCisgIGlmIChjaXJjdWl0LT5jaXJjX3R5cGUgPT0gQ0lSQ1VJVF9UX0JST0FEQ0FTVCkKKyAgICB7CisgICAgICBsaXN0bm9kZV9hZGQgKGNpcmN1aXQtPnUuYmMuYWRqZGJbbGV2ZWwgLSAxXSwgYWRqKTsKKyAgICAgIGFkai0+ZGlzY2hhbmdlc1tsZXZlbCAtIDFdID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBESVNfUkVDT1JEUzsgaSsrKQkvKiBjbGVhciBOIERJUyBzdGF0ZSBjaGFuZ2UgcmVjb3JkcyAqLwogCXsKLQkgIGFkai0+ZGlzX3JlY29yZFsoaSAqIElTSVNfTEVWRUxTKSArIGxldmVsIC0gMV0uZGlzIAorCSAgYWRqLT5kaXNfcmVjb3JkWyhpICogSVNJU19MRVZFTFMpICsgbGV2ZWwgLSAxXS5kaXMKIAkgICAgPSBJU0lTX1VOS05PV05fRElTOwotCSAgYWRqLT5kaXNfcmVjb3JkWyhpICogSVNJU19MRVZFTFMpICsgbGV2ZWwgLSAxXS5sYXN0X2Rpc19jaGFuZ2UgCi0gICAgICAgICAgICA9IHRpbWUgKE5VTEwpOworCSAgYWRqLT5kaXNfcmVjb3JkWyhpICogSVNJU19MRVZFTFMpICsgbGV2ZWwgLSAxXS5sYXN0X2Rpc19jaGFuZ2UKKwkgICAgPSB0aW1lIChOVUxMKTsKIAl9Ci0gIH0KKyAgICB9CiAKICAgcmV0dXJuIGFkajsKIH0KIAogc3RydWN0IGlzaXNfYWRqYWNlbmN5ICoKLWlzaXNfYWRqX2xvb2t1cCAodV9jaGFyICpzeXNpZCwgIHN0cnVjdCBsaXN0ICphZGpkYikKK2lzaXNfYWRqX2xvb2t1cCAodV9jaGFyICogc3lzaWQsIHN0cnVjdCBsaXN0ICphZGpkYikKIHsKICAgc3RydWN0IGlzaXNfYWRqYWNlbmN5ICphZGo7CiAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKIAotICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoYWRqZGIpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICBhZGogPSBnZXRkYXRhIChub2RlKTsKLSAgICBpZiAobWVtY21wIChhZGotPnN5c2lkLCBzeXNpZCwgSVNJU19TWVNfSURfTEVOKSA9PSAwKQotICAgICAgcmV0dXJuIGFkajsKLSAgfQotICAKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGFkamRiKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorICAgIHsKKyAgICAgIGFkaiA9IGdldGRhdGEgKG5vZGUpOworICAgICAgaWYgKG1lbWNtcCAoYWRqLT5zeXNpZCwgc3lzaWQsIElTSVNfU1lTX0lEX0xFTikgPT0gMCkKKwlyZXR1cm4gYWRqOworICAgIH0KKwogICByZXR1cm4gTlVMTDsKIH0KIAogCiBzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKgotaXNpc19hZGpfbG9va3VwX3NucGEgKHVfY2hhciAqc3NucGEsIHN0cnVjdCBsaXN0ICphZGpkYikKK2lzaXNfYWRqX2xvb2t1cF9zbnBhICh1X2NoYXIgKiBzc25wYSwgc3RydWN0IGxpc3QgKmFkamRiKQogewogICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgIHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqOwogCi0gIGZvciAobm9kZSA9IGxpc3RoZWFkIChhZGpkYik7IG5vZGU7IG5leHRub2RlIChub2RlKSkgewotICAgIGFkaiA9IGdldGRhdGEgKG5vZGUpOwotICAgIGlmIChtZW1jbXAgKGFkai0+c25wYSwgc3NucGEsIEVUSF9BTEVOKSA9PSAwKQotICAgICAgcmV0dXJuIGFkajsKLSAgfQotICAKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGFkamRiKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorICAgIHsKKyAgICAgIGFkaiA9IGdldGRhdGEgKG5vZGUpOworICAgICAgaWYgKG1lbWNtcCAoYWRqLT5zbnBhLCBzc25wYSwgRVRIX0FMRU4pID09IDApCisJcmV0dXJuIGFkajsKKyAgICB9CisKICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qCiAgKiBXaGVuIHdlIHJlY2lldmUgYSBOVUxMIGxpc3QsIHdlIHdpbGwga25vdyBpdHMgcDJwCiAgKi8KLXZvaWQgCit2b2lkCiBpc2lzX2RlbGV0ZV9hZGogKHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqLCBzdHJ1Y3QgbGlzdCAqYWRqZGIpCiB7CiAgIHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqMjsKICAgc3RydWN0IGxpc3Rub2RlICpub2RlOwotICAKLSAgaWYgKGFkamRiKSB7Ci0gICAgZm9yIChub2RlID0gbGlzdGhlYWQgKGFkamRiKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7Ci0gICAgICBhZGoyID0gZ2V0ZGF0YSAobm9kZSk7Ci0gICAgICBpZiAoYWRqMiA9PSBhZGopCi0gICAgICAgIGJyZWFrOworCisgIGlmIChhZGpkYikKKyAgICB7CisgICAgICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoYWRqZGIpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisJeworCSAgYWRqMiA9IGdldGRhdGEgKG5vZGUpOworCSAgaWYgKGFkajIgPT0gYWRqKQorCSAgICBicmVhazsKKwl9CisgICAgICBsaXN0bm9kZV9kZWxldGUgKGFkamRiLCBhZGopOwogICAgIH0KLSAgICBsaXN0bm9kZV9kZWxldGUgKGFkamRiLCBhZGopOwotICB9Ci0gIAorCiAgIGlmIChhZGotPmlwdjRfYWRkcnMpCiAgICAgbGlzdF9kZWxldGUgKGFkai0+aXB2NF9hZGRycyk7CiAjaWZkZWYgSEFWRV9JUFY2CiAgIGlmIChhZGotPmlwdjZfYWRkcnMpCiAgICAgbGlzdF9kZWxldGUgKGFkai0+aXB2Nl9hZGRycyk7CiAjZW5kaWYKLSAgaWYgKGFkaikgewotICAgIFhGUkVFIChNVFlQRV9JU0lTX0FESkFDRU5DWSxhZGopOwotICB9IGVsc2UgewotICAgIHpsb2dfaW5mbyAoInRyaWVkIHRvIGRlbGV0ZSBhIG5vbi1leGlzdGVudCBhZGphY2VuY3kiKTsKLSAgfQotICAKLSAgCisgIGlmIChhZGopCisgICAgeworICAgICAgWEZSRUUgKE1UWVBFX0lTSVNfQURKQUNFTkNZLCBhZGopOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHpsb2dfaW5mbyAoInRyaWVkIHRvIGRlbGV0ZSBhIG5vbi1leGlzdGVudCBhZGphY2VuY3kiKTsKKyAgICB9CiAKICAgcmV0dXJuOwogfQogCi12b2lkIAotaXNpc19hZGpfc3RhdGVfY2hhbmdlIChzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKmFkaiwgZW51bSBpc2lzX2Fkal9zdGF0ZSBzdGF0ZSwgCi0gICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnJlYXNvbikKLQordm9pZAoraXNpc19hZGpfc3RhdGVfY2hhbmdlIChzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKmFkaiwgZW51bSBpc2lzX2Fkal9zdGF0ZSBzdGF0ZSwKKwkJICAgICAgIGNoYXIgKnJlYXNvbikKIHsKICAgaW50IG9sZF9zdGF0ZTsKICAgaW50IGxldmVsID0gYWRqLT5sZXZlbDsKICAgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdDsKLSAgCisKICAgb2xkX3N0YXRlID0gYWRqLT5hZGpfc3RhdGU7CiAgIGFkai0+YWRqX3N0YXRlID0gc3RhdGU7CiAKICAgY2lyY3VpdCA9IGFkai0+Y2lyY3VpdDsKLSAgCi0gIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19BREpfUEFDS0VUUykgewotICAgIHpsb2dfaW5mbyAoIklTSVMtQWRqICglcyk6IEFkamFjZW5jeSBzdGF0ZSBjaGFuZ2UgJWQtPiVkOiAlcyIsCi0gICAgICAgICAgICAgICBjaXJjdWl0LT5hcmVhLT5hcmVhX3RhZywKLSAgICAgICAgICAgICAgIG9sZF9zdGF0ZSwKLSAgICAgICAgICAgICAgIHN0YXRlLCAKLSAgICAgICAgICAgICAgIHJlYXNvbiA/IHJlYXNvbiA6ICJ1bnNwZWNpZmllZCIpOwotICB9CiAKLSAgaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSA9PSBDSVJDVUlUX1RfQlJPQURDQVNUKSB7Ci0gICAgaWYgKHN0YXRlID09IElTSVNfQURKX1VQKQotICAgICAgY2lyY3VpdC0+dXBhZGpjb3VudFtsZXZlbC0xXSsrOwotICAgIGlmIChzdGF0ZSA9PSBJU0lTX0FESl9ET1dOKSB7Ci0gICAgICBpc2lzX2RlbGV0ZV9hZGogKGFkaiwgYWRqLT5jaXJjdWl0LT51LmJjLmFkamRiW2xldmVsIC0gMV0pOwotICAgICAgY2lyY3VpdC0+dXBhZGpjb3VudFtsZXZlbC0xXS0tOworICBpZiAoaXNpcy0+ZGVidWdzICYgREVCVUdfQURKX1BBQ0tFVFMpCisgICAgeworICAgICAgemxvZ19pbmZvICgiSVNJUy1BZGogKCVzKTogQWRqYWNlbmN5IHN0YXRlIGNoYW5nZSAlZC0+JWQ6ICVzIiwKKwkJIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLAorCQkgb2xkX3N0YXRlLCBzdGF0ZSwgcmVhc29uID8gcmVhc29uIDogInVuc3BlY2lmaWVkIik7CiAgICAgfQogCi0gICAgbGlzdF9kZWxldGVfYWxsX25vZGUgKGNpcmN1aXQtPnUuYmMubGFuX25laWdoc1tsZXZlbCAtIDFdKTsKLSAgICBpc2lzX2Fkal9idWlsZF9uZWlnaF9saXN0IChjaXJjdWl0LT51LmJjLmFkamRiW2xldmVsIC0gMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lyY3VpdC0+dS5iYy5sYW5fbmVpZ2hzW2xldmVsIC0gMV0pOwotICB9IGVsc2UgaWYgKHN0YXRlID09IElTSVNfQURKX1VQKSB7IC8qIHAycCBpbnRlcmZhY2UgKi8KLSAgICBpZiAoYWRqLT5zeXNfdHlwZSA9PSBJU0lTX1NZU1RZUEVfVU5LTk9XTikKLSAgICAgIHNlbmRfaGVsbG8gKGNpcmN1aXQsIDEpOwotICAgIAotICAgIC8qIHVwZGF0ZSBjb3VudGVyICYgdGltZXJzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgKi8KLSAgICBhZGotPmxhc3RfZmxhcCA9IHRpbWUoTlVMTCk7Ci0gICAgYWRqLT5mbGFwcysrOworICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QpCisgICAgeworICAgICAgaWYgKHN0YXRlID09IElTSVNfQURKX1VQKQorCWNpcmN1aXQtPnVwYWRqY291bnRbbGV2ZWwgLSAxXSsrOworICAgICAgaWYgKHN0YXRlID09IElTSVNfQURKX0RPV04pCisJeworCSAgaXNpc19kZWxldGVfYWRqIChhZGosIGFkai0+Y2lyY3VpdC0+dS5iYy5hZGpkYltsZXZlbCAtIDFdKTsKKwkgIGNpcmN1aXQtPnVwYWRqY291bnRbbGV2ZWwgLSAxXS0tOworCX0KIAotICAgIC8qIDcuMy4xNyAtIGdvaW5nIHVwIG9uIFAyUCAtPiBzZW5kIENTTlAgKi8KLSAgICAvKiBGSVhNRTogeXVwLCBJIGtub3cgaXRzIHdyb25nLi4uIGJ1dCBpIHdpbGwgZG8gaXQhIChmb3Igbm93KSAqLwotICAgIHNlbmRfY3NucCAoY2lyY3VpdCwxKTsKLSAgICBzZW5kX2NzbnAgKGNpcmN1aXQsMik7Ci0gIH0gZWxzZSBpZiAoc3RhdGUgPT0gSVNJU19BREpfRE9XTikgeyAvKiBwMnAgaW50ZXJmYWNlICovCi0gICAgYWRqLT5jaXJjdWl0LT51LnAycC5uZWlnaGJvciA9IE5VTEw7Ci0gICAgaXNpc19kZWxldGVfYWRqIChhZGosIE5VTEwpOwotICB9CisgICAgICBsaXN0X2RlbGV0ZV9hbGxfbm9kZSAoY2lyY3VpdC0+dS5iYy5sYW5fbmVpZ2hzW2xldmVsIC0gMV0pOworICAgICAgaXNpc19hZGpfYnVpbGRfbmVpZ2hfbGlzdCAoY2lyY3VpdC0+dS5iYy5hZGpkYltsZXZlbCAtIDFdLAorCQkJCSBjaXJjdWl0LT51LmJjLmxhbl9uZWlnaHNbbGV2ZWwgLSAxXSk7CisgICAgfQorICBlbHNlIGlmIChzdGF0ZSA9PSBJU0lTX0FESl9VUCkKKyAgICB7CQkJCS8qIHAycCBpbnRlcmZhY2UgKi8KKyAgICAgIGlmIChhZGotPnN5c190eXBlID09IElTSVNfU1lTVFlQRV9VTktOT1dOKQorCXNlbmRfaGVsbG8gKGNpcmN1aXQsIDEpOworCisgICAgICAvKiB1cGRhdGUgY291bnRlciAmIHRpbWVycyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzICovCisgICAgICBhZGotPmxhc3RfZmxhcCA9IHRpbWUgKE5VTEwpOworICAgICAgYWRqLT5mbGFwcysrOworCisgICAgICAvKiA3LjMuMTcgLSBnb2luZyB1cCBvbiBQMlAgLT4gc2VuZCBDU05QICovCisgICAgICAvKiBGSVhNRTogeXVwLCBJIGtub3cgaXRzIHdyb25nLi4uIGJ1dCBpIHdpbGwgZG8gaXQhIChmb3Igbm93KSAqLworICAgICAgc2VuZF9jc25wIChjaXJjdWl0LCAxKTsKKyAgICAgIHNlbmRfY3NucCAoY2lyY3VpdCwgMik7CisgICAgfQorICBlbHNlIGlmIChzdGF0ZSA9PSBJU0lTX0FESl9ET1dOKQorICAgIHsJCQkJLyogcDJwIGludGVyZmFjZSAqLworICAgICAgYWRqLT5jaXJjdWl0LT51LnAycC5uZWlnaGJvciA9IE5VTEw7CisgICAgICBpc2lzX2RlbGV0ZV9hZGogKGFkaiwgTlVMTCk7CisgICAgfQogICByZXR1cm47CiB9CiAKQEAgLTIyMyw0NyArMjMxLDQ5IEBACiAgIHN0cnVjdCBpc2lzX2R5bmhuICpkeW47CiAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKICAgc3RydWN0IGluX2FkZHIgKmlwdjRfYWRkcjsKLSNpZmRlZiBIQVZFX0lQVjYgCisjaWZkZWYgSEFWRV9JUFY2CiAgIHN0cnVjdCBpbjZfYWRkciAqaXB2Nl9hZGRyOwotICB1X2NoYXIgaXA2IFtJTkVUNl9BRERSU1RSTEVOXTsKKyAgdV9jaGFyIGlwNltJTkVUNl9BRERSU1RSTEVOXTsKICNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KLSAgCi0gIGlmKCFhZGopCisKKyAgaWYgKCFhZGopCiAgICAgcmV0dXJuOwogICBkeW4gPSBkeW5obl9maW5kX2J5X2lkIChhZGotPnN5c2lkKTsKICAgaWYgKGR5bikKICAgICB6bG9nX2luZm8gKCIlcyIsIGR5bi0+bmFtZS5uYW1lKTsKLSAgCi0gIHpsb2dfaW5mbyAoIlN5c3RlbUlkICUyMHMgU05QQSAlcywgbGV2ZWwgJWRcbkhvbGRpbmcgVGltZSAlZCIsCi0gICAgICAgICAgICAgYWRqLT5zeXNpZCA/IHN5c2lkX3ByaW50IChhZGotPnN5c2lkKSA6ICJ1bmtub3duIiAsIAotICAgICAgICAgICAgIHNucGFfcHJpbnQgKGFkai0+c25wYSksCi0gICAgICAgICAgICAgYWRqLT5sZXZlbCwgYWRqLT5ob2xkX3RpbWUpOwotICBpZiAoYWRqLT5pcHY0X2FkZHJzICYmIGxpc3Rjb3VudCAoYWRqLT5pcHY0X2FkZHJzKSA+IDApIHsKLSAgICB6bG9nX2luZm8gKCJJUHY0IEFkZHJlc3NlczoiKTsKLSAgICAKLSAgICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoYWRqLT5pcHY0X2FkZHJzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7Ci0gICAgICBpcHY0X2FkZHIgPSBnZXRkYXRhIChub2RlKTsKLSAgICAgIHpsb2dfaW5mbyAoIiVzIiwgaW5ldF9udG9hKCppcHY0X2FkZHIpKTsKLSAgICB9Ci0gIH0KIAotI2lmZGVmIEhBVkVfSVBWNiAgCi0gIGlmIChhZGotPmlwdjZfYWRkcnMgJiYgbGlzdGNvdW50IChhZGotPmlwdjZfYWRkcnMpID4gMCkgewotICAgIHpsb2dfaW5mbyAoIklQdjYgQWRkcmVzc2VzOiIpOwotICAgIGZvciAobm9kZSA9IGxpc3RoZWFkIChhZGotPmlwdjZfYWRkcnMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICAgIGlwdjZfYWRkciA9IGdldGRhdGEgKG5vZGUpOwotICAgICAgaW5ldF9udG9wIChBRl9JTkVUNiwgaXB2Nl9hZGRyLCBpcDYsIElORVQ2X0FERFJTVFJMRU4pOyAKLSAgICAgIHpsb2dfaW5mbyAoIiVzIiwgaXA2KTsKKyAgemxvZ19pbmZvICgiU3lzdGVtSWQgJTIwcyBTTlBBICVzLCBsZXZlbCAlZFxuSG9sZGluZyBUaW1lICVkIiwKKwkgICAgIGFkai0+c3lzaWQgPyBzeXNpZF9wcmludCAoYWRqLT5zeXNpZCkgOiAidW5rbm93biIsCisJICAgICBzbnBhX3ByaW50IChhZGotPnNucGEpLCBhZGotPmxldmVsLCBhZGotPmhvbGRfdGltZSk7CisgIGlmIChhZGotPmlwdjRfYWRkcnMgJiYgbGlzdGNvdW50IChhZGotPmlwdjRfYWRkcnMpID4gMCkKKyAgICB7CisgICAgICB6bG9nX2luZm8gKCJJUHY0IEFkZHJlc3NlczoiKTsKKworICAgICAgZm9yIChub2RlID0gbGlzdGhlYWQgKGFkai0+aXB2NF9hZGRycyk7IG5vZGU7IG5leHRub2RlIChub2RlKSkKKwl7CisJICBpcHY0X2FkZHIgPSBnZXRkYXRhIChub2RlKTsKKwkgIHpsb2dfaW5mbyAoIiVzIiwgaW5ldF9udG9hICgqaXB2NF9hZGRyKSk7CisJfQogICAgIH0KLSAgfQorCisjaWZkZWYgSEFWRV9JUFY2CisgIGlmIChhZGotPmlwdjZfYWRkcnMgJiYgbGlzdGNvdW50IChhZGotPmlwdjZfYWRkcnMpID4gMCkKKyAgICB7CisgICAgICB6bG9nX2luZm8gKCJJUHY2IEFkZHJlc3NlczoiKTsKKyAgICAgIGZvciAobm9kZSA9IGxpc3RoZWFkIChhZGotPmlwdjZfYWRkcnMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisJeworCSAgaXB2Nl9hZGRyID0gZ2V0ZGF0YSAobm9kZSk7CisJICBpbmV0X250b3AgKEFGX0lORVQ2LCBpcHY2X2FkZHIsIGlwNiwgSU5FVDZfQUREUlNUUkxFTik7CisJICB6bG9nX2luZm8gKCIlcyIsIGlwNik7CisJfQorICAgIH0KICNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KLSAgemxvZ19pbmZvICgiU3BlYWtzOiAlcyIsIG5scGlkMnN0cmluZygmYWRqLT5ubHBpZHMpKTsKLSAgCisgIHpsb2dfaW5mbyAoIlNwZWFrczogJXMiLCBubHBpZDJzdHJpbmcgKCZhZGotPm5scGlkcykpOwogCiAgIHJldHVybjsKIH0KIAotaW50IAoraW50CiBpc2lzX2Fkal9leHBpcmUgKHN0cnVjdCB0aHJlYWQgKnRocmVhZCkKIHsKICAgc3RydWN0IGlzaXNfYWRqYWNlbmN5ICphZGo7CkBAIC0yODYsMTkgKzI5NiwyMCBAQAogY29uc3QgY2hhciAqCiBhZGpfc3RhdGUyc3RyaW5nIChpbnQgc3RhdGUpCiB7Ci0gIAotICBzd2l0Y2ggKHN0YXRlKSB7Ci0gIGNhc2UgSVNJU19BREpfSU5JVElBTElaSU5HOgotICAgIHJldHVybiAiSW5pdGlhbGl6aW5nIjsKLSAgY2FzZSBJU0lTX0FESl9VUDoKLSAgICByZXR1cm4gIlVwIjsKLSAgY2FzZSBJU0lTX0FESl9ET1dOOgotICAgIHJldHVybiAiRG93biI7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuICJVbmtub3duIjsKLSAgfQotICAKLSAgcmV0dXJuIE5VTEw7IC8qIG5vdCByZWFjaGVkICovCisKKyAgc3dpdGNoIChzdGF0ZSkKKyAgICB7CisgICAgY2FzZSBJU0lTX0FESl9JTklUSUFMSVpJTkc6CisgICAgICByZXR1cm4gIkluaXRpYWxpemluZyI7CisgICAgY2FzZSBJU0lTX0FESl9VUDoKKyAgICAgIHJldHVybiAiVXAiOworICAgIGNhc2UgSVNJU19BREpfRE9XTjoKKyAgICAgIHJldHVybiAiRG93biI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiVW5rbm93biI7CisgICAgfQorCisgIHJldHVybiBOVUxMOwkJCS8qIG5vdCByZWFjaGVkICovCiB9CiAKIC8qCkBAIC0zMTAsNyArMzIxLDcgQEAKIAogI2lmZGVmIEhBVkVfSVBWNgogICBzdHJ1Y3QgaW42X2FkZHIgKmlwdjZfYWRkcjsKLSAgdV9jaGFyIGlwNiBbSU5FVDZfQUREUlNUUkxFTl07CisgIHVfY2hhciBpcDZbSU5FVDZfQUREUlNUUkxFTl07CiAjZW5kaWYgLyogSEFWRV9JUFY2ICovCiAgIHN0cnVjdCBpbl9hZGRyICppcF9hZGRyOwogICB0aW1lX3Qgbm93OwpAQCAtMzIxLDExMSArMzMyLDExMiBAQAogICBkeW4gPSBkeW5obl9maW5kX2J5X2lkIChhZGotPnN5c2lkKTsKICAgaWYgKGR5bikKICAgICB2dHlfb3V0ICh2dHksICIgICUtMjBzIiwgZHluLT5uYW1lLm5hbWUpOwotICBlbHNlIGlmIChhZGotPnN5c2lkKXsKLSAgICB2dHlfb3V0ICh2dHksICIgICUtMjBzIiwgc3lzaWRfcHJpbnQgKGFkai0+c3lzaWQpKTsKLSAgfSBlbHNlIHsKLSAgICB2dHlfb3V0ICh2dHksICIgIHVua25vd24gIik7Ci0gIH0KLQotICBpZiAoZGV0YWlsID09IElTSVNfVUlfTEVWRUxfQlJJRUYpIHsKLSAgICBpZiAoYWRqLT5jaXJjdWl0KQotICAgICAgdnR5X291dCAodnR5LCAiJS0xMnMiLGFkai0+Y2lyY3VpdC0+aW50ZXJmYWNlLT5uYW1lKTsgCi0gICAgZWxzZQotICAgICAgdnR5X291dCAodnR5LCAiTlVMTCBjaXJjdWl0ISIpOwotICAgIHZ0eV9vdXQgKHZ0eSwgIiUtM3UiLCBhZGotPmxldmVsKTsgLyogbGV2ZWwgKi8KLSAgICB2dHlfb3V0ICh2dHksICIlLTEzcyIsIGFkal9zdGF0ZTJzdHJpbmcgKGFkai0+YWRqX3N0YXRlKSk7Ci0gICAgbm93ID0gdGltZSAoTlVMTCk7Ci0gICAgaWYgKGFkai0+bGFzdF91cGQpCi0gICAgICB2dHlfb3V0ICh2dHksICIlLTlsdSIsIGFkai0+bGFzdF91cGQgKyBhZGotPmhvbGRfdGltZSAtIG5vdyk7Ci0gICAgZWxzZQotICAgICAgdnR5X291dCAodnR5LCAiLSAgICAgICAgIik7Ci0gICAgdnR5X291dCAodnR5LCAiJS0xMHMiLCBzbnBhX3ByaW50IChhZGotPnNucGEpKTsgCi0gICAgdnR5X291dCAodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7Ci0gIH0KLQotICBpZiAoZGV0YWlsID09IElTSVNfVUlfTEVWRUxfREVUQUlMKSB7Ci0gICAgbGV2ZWwgPSBhZGotPmxldmVsOwotICAgIGlmIChhZGotPmNpcmN1aXQpCi0gICAgICB2dHlfb3V0ICh2dHksICIlcyAgICBJbnRlcmZhY2U6ICVzIiwKLSAgICAgICAgICAgICAgIFZUWV9ORVdMSU5FLAotICAgICAgICAgICAgICAgYWRqLT5jaXJjdWl0LT5pbnRlcmZhY2UtPm5hbWUpOyAvKiBpbnRlcmZhY2UgbmFtZSAqLwotICAgIGVsc2UKLSAgICAgIHZ0eV9vdXQgKHZ0eSwgIk5VTEwgY2lyY3VpdCElcyIsIFZUWV9ORVdMSU5FKTsKLSAgICB2dHlfb3V0ICh2dHksICIsIExldmVsOiAldSIsIGFkai0+bGV2ZWwpOyAvKiBsZXZlbCAqLwotICAgIHZ0eV9vdXQgKHZ0eSwgIiwgU3RhdGU6ICVzIiwgYWRqX3N0YXRlMnN0cmluZyAoYWRqLT5hZGpfc3RhdGUpKTsKLSAgICBub3cgPSB0aW1lIChOVUxMKTsKLSAgICBpZiAoYWRqLT5sYXN0X3VwZCkKLSAgICAgIHZ0eV9vdXQgKHZ0eSwgIiwgRXhwaXJlcyBpbiAlcyIsIAotICAgICAgICAgICAgICAgdGltZTJzdHJpbmcgKGFkai0+bGFzdF91cGQgKyBhZGotPmhvbGRfdGltZSAtIG5vdykpOwotICAgIGVsc2UKLSAgICAgIHZ0eV9vdXQgKHZ0eSwgIiwgRXhwaXJlcyBpbiAlcyIsIAotICAgICAgICAgICAgICAgdGltZTJzdHJpbmcgKGFkai0+aG9sZF90aW1lKSk7Ci0gICAgdnR5X291dCAodnR5LCAiJXMgICAgQWRqYWNlbmN5IGZsYXBzOiAldSIsCi0JICAgICBWVFlfTkVXTElORSwKLQkgICAgIGFkai0+ZmxhcHMpOwotICAgIHZ0eV9vdXQgKHZ0eSwgIiwgTGFzdDogJXMgYWdvIiwgdGltZTJzdHJpbmcobm93IC0gYWRqLT5sYXN0X2ZsYXApKTsKLSAgICB2dHlfb3V0ICh2dHksICIlcyAgICBDaXJjdWl0IHR5cGU6ICVzIiwKLQkgICAgIFZUWV9ORVdMSU5FLAotCSAgICAgY2lyY3VpdF90MnN0cmluZyhhZGotPmNpcmN1aXRfdCkpOwotICAgIHZ0eV9vdXQgKHZ0eSwgIiwgU3BlYWtzOiAlcyIsIG5scGlkMnN0cmluZygmYWRqLT5ubHBpZHMpKTsKLSAgICB2dHlfb3V0ICh2dHksICIlcyAgICBTTlBBOiAlcyIsCi0JICAgICBWVFlfTkVXTElORSwKLQkgICAgIHNucGFfcHJpbnQgKGFkai0+c25wYSkpOyAgIAotICAgIGR5biA9IGR5bmhuX2ZpbmRfYnlfaWQgKGFkai0+bGFuaWQpOwotICAgIGlmIChkeW4pCi0gICAgICB2dHlfb3V0ICh2dHksICIsIExBTiBpZDogJXMuJTAyeCIsCi0JICAgICAgIGR5bi0+bmFtZS5uYW1lLAotCSAgICAgICBhZGotPmxhbmlkW0lTSVNfU1lTX0lEX0xFTl0pOwotICAgIGVsc2UgCi0gICAgICB2dHlfb3V0ICh2dHksICIsIExBTiBpZDogJXMuJTAyeCIsCi0JICAgICAgIHN5c2lkX3ByaW50IChhZGotPmxhbmlkKSwKLQkgICAgICAgYWRqLT5sYW5pZFtJU0lTX1NZU19JRF9MRU5dKTsKLSAgICAKLSAgICB2dHlfb3V0ICh2dHksICIlcyAgICBQcmlvcml0eTogJXUiLAotCSAgICAgVlRZX05FV0xJTkUsCi0JICAgICBhZGotPnByaW9bYWRqLT5sZXZlbC0xXSk7Ci0KLSAgICB2dHlfb3V0ICh2dHksICIsICVzLCBESVMgZmxhcHM6ICV1LCBMYXN0OiAlcyBhZ28lcyIsCi0JICAgICBpc2lzX2Rpc2ZsYWcyc3RyaW5nKGFkai0+ZGlzX3JlY29yZFtJU0lTX0xFVkVMUytsZXZlbC0xXS5kaXMpLAotCSAgICAgYWRqLT5kaXNjaGFuZ2VzW2xldmVsLTFdLAotCSAgICAgdGltZTJzdHJpbmcgKG5vdyAtIAotICAgICAgICAgICAgICAgICAgIChhZGotPmRpc19yZWNvcmRbSVNJU19MRVZFTFMgKyBsZXZlbCAtIDFdLmxhc3RfZGlzX2NoYW5nZSkpLAotCSAgICAgVlRZX05FV0xJTkUpOyAgICAKLSAgICAgICAgICAgICAJCi0gICAgaWYgKGFkai0+aXB2NF9hZGRycyAmJiBsaXN0Y291bnQgKGFkai0+aXB2NF9hZGRycykgPiAwKSB7Ci0gICAgICB2dHlfb3V0ICh2dHksICIgICAgSVB2NCBBZGRyZXNzZXM6JXMiLCBWVFlfTkVXTElORSk7Ci0gICAgICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoYWRqLT5pcHY0X2FkZHJzKTtub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICAgICAgaXBfYWRkciA9IGdldGRhdGEgKG5vZGUpOwotICAgICAgICB2dHlfb3V0ICh2dHksICIgICAgICAlcyVzIiwgaW5ldF9udG9hKCppcF9hZGRyKSwgVlRZX05FV0xJTkUpOwotICAgICAgfQorICBlbHNlIGlmIChhZGotPnN5c2lkKQorICAgIHsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIiAgJS0yMHMiLCBzeXNpZF9wcmludCAoYWRqLT5zeXNpZCkpOwogICAgIH0KLSNpZmRlZiBIQVZFX0lQVjYgIAotICAgIGlmIChhZGotPmlwdjZfYWRkcnMgJiYgbGlzdGNvdW50IChhZGotPmlwdjZfYWRkcnMpID4gMCkgewotICAgICAgdnR5X291dCAodnR5LCAiICAgIElQdjYgQWRkcmVzc2VzOiVzIiwgVlRZX05FV0xJTkUpOwotICAgICAgZm9yIChub2RlID0gbGlzdGhlYWQgKGFkai0+aXB2Nl9hZGRycyk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgewotICAgICAgICBpcHY2X2FkZHIgPSBnZXRkYXRhIChub2RlKTsKLSAgICAgICAgaW5ldF9udG9wIChBRl9JTkVUNiwgaXB2Nl9hZGRyLCBpcDYsIElORVQ2X0FERFJTVFJMRU4pOyAKLSAgICAgICAgdnR5X291dCAodnR5LCAiICAgICAgJXMlcyIsIGlwNiwgVlRZX05FV0xJTkUpOwotICAgICAgfQorICBlbHNlCisgICAgeworICAgICAgdnR5X291dCAodnR5LCAiICB1bmtub3duICIpOwogICAgIH0KKworICBpZiAoZGV0YWlsID09IElTSVNfVUlfTEVWRUxfQlJJRUYpCisgICAgeworICAgICAgaWYgKGFkai0+Y2lyY3VpdCkKKwl2dHlfb3V0ICh2dHksICIlLTEycyIsIGFkai0+Y2lyY3VpdC0+aW50ZXJmYWNlLT5uYW1lKTsKKyAgICAgIGVsc2UKKwl2dHlfb3V0ICh2dHksICJOVUxMIGNpcmN1aXQhIik7CisgICAgICB2dHlfb3V0ICh2dHksICIlLTN1IiwgYWRqLT5sZXZlbCk7CS8qIGxldmVsICovCisgICAgICB2dHlfb3V0ICh2dHksICIlLTEzcyIsIGFkal9zdGF0ZTJzdHJpbmcgKGFkai0+YWRqX3N0YXRlKSk7CisgICAgICBub3cgPSB0aW1lIChOVUxMKTsKKyAgICAgIGlmIChhZGotPmxhc3RfdXBkKQorCXZ0eV9vdXQgKHZ0eSwgIiUtOWx1IiwgYWRqLT5sYXN0X3VwZCArIGFkai0+aG9sZF90aW1lIC0gbm93KTsKKyAgICAgIGVsc2UKKwl2dHlfb3V0ICh2dHksICItICAgICAgICAiKTsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIiUtMTBzIiwgc25wYV9wcmludCAoYWRqLT5zbnBhKSk7CisgICAgICB2dHlfb3V0ICh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKyAgICB9CisKKyAgaWYgKGRldGFpbCA9PSBJU0lTX1VJX0xFVkVMX0RFVEFJTCkKKyAgICB7CisgICAgICBsZXZlbCA9IGFkai0+bGV2ZWw7CisgICAgICBpZiAoYWRqLT5jaXJjdWl0KQorCXZ0eV9vdXQgKHZ0eSwgIiVzICAgIEludGVyZmFjZTogJXMiLCBWVFlfTkVXTElORSwgYWRqLT5jaXJjdWl0LT5pbnRlcmZhY2UtPm5hbWUpOwkvKiBpbnRlcmZhY2UgbmFtZSAqLworICAgICAgZWxzZQorCXZ0eV9vdXQgKHZ0eSwgIk5VTEwgY2lyY3VpdCElcyIsIFZUWV9ORVdMSU5FKTsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIiwgTGV2ZWw6ICV1IiwgYWRqLT5sZXZlbCk7CS8qIGxldmVsICovCisgICAgICB2dHlfb3V0ICh2dHksICIsIFN0YXRlOiAlcyIsIGFkal9zdGF0ZTJzdHJpbmcgKGFkai0+YWRqX3N0YXRlKSk7CisgICAgICBub3cgPSB0aW1lIChOVUxMKTsKKyAgICAgIGlmIChhZGotPmxhc3RfdXBkKQorCXZ0eV9vdXQgKHZ0eSwgIiwgRXhwaXJlcyBpbiAlcyIsCisJCSB0aW1lMnN0cmluZyAoYWRqLT5sYXN0X3VwZCArIGFkai0+aG9sZF90aW1lIC0gbm93KSk7CisgICAgICBlbHNlCisJdnR5X291dCAodnR5LCAiLCBFeHBpcmVzIGluICVzIiwgdGltZTJzdHJpbmcgKGFkai0+aG9sZF90aW1lKSk7CisgICAgICB2dHlfb3V0ICh2dHksICIlcyAgICBBZGphY2VuY3kgZmxhcHM6ICV1IiwgVlRZX05FV0xJTkUsIGFkai0+ZmxhcHMpOworICAgICAgdnR5X291dCAodnR5LCAiLCBMYXN0OiAlcyBhZ28iLCB0aW1lMnN0cmluZyAobm93IC0gYWRqLT5sYXN0X2ZsYXApKTsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIiVzICAgIENpcmN1aXQgdHlwZTogJXMiLAorCSAgICAgICBWVFlfTkVXTElORSwgY2lyY3VpdF90MnN0cmluZyAoYWRqLT5jaXJjdWl0X3QpKTsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIiwgU3BlYWtzOiAlcyIsIG5scGlkMnN0cmluZyAoJmFkai0+bmxwaWRzKSk7CisgICAgICB2dHlfb3V0ICh2dHksICIlcyAgICBTTlBBOiAlcyIsIFZUWV9ORVdMSU5FLCBzbnBhX3ByaW50IChhZGotPnNucGEpKTsKKyAgICAgIGR5biA9IGR5bmhuX2ZpbmRfYnlfaWQgKGFkai0+bGFuaWQpOworICAgICAgaWYgKGR5bikKKwl2dHlfb3V0ICh2dHksICIsIExBTiBpZDogJXMuJTAyeCIsCisJCSBkeW4tPm5hbWUubmFtZSwgYWRqLT5sYW5pZFtJU0lTX1NZU19JRF9MRU5dKTsKKyAgICAgIGVsc2UKKwl2dHlfb3V0ICh2dHksICIsIExBTiBpZDogJXMuJTAyeCIsCisJCSBzeXNpZF9wcmludCAoYWRqLT5sYW5pZCksIGFkai0+bGFuaWRbSVNJU19TWVNfSURfTEVOXSk7CisKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIiVzICAgIFByaW9yaXR5OiAldSIsCisJICAgICAgIFZUWV9ORVdMSU5FLCBhZGotPnByaW9bYWRqLT5sZXZlbCAtIDFdKTsKKworICAgICAgdnR5X291dCAodnR5LCAiLCAlcywgRElTIGZsYXBzOiAldSwgTGFzdDogJXMgYWdvJXMiLAorCSAgICAgICBpc2lzX2Rpc2ZsYWcyc3RyaW5nIChhZGotPmRpc19yZWNvcmRbSVNJU19MRVZFTFMgKyBsZXZlbCAtIDFdLgorCQkJCSAgICBkaXMpLCBhZGotPmRpc2NoYW5nZXNbbGV2ZWwgLSAxXSwKKwkgICAgICAgdGltZTJzdHJpbmcgKG5vdyAtCisJCQkgICAgKGFkai0+ZGlzX3JlY29yZFtJU0lTX0xFVkVMUyArIGxldmVsIC0gMV0uCisJCQkgICAgIGxhc3RfZGlzX2NoYW5nZSkpLCBWVFlfTkVXTElORSk7CisKKyAgICAgIGlmIChhZGotPmlwdjRfYWRkcnMgJiYgbGlzdGNvdW50IChhZGotPmlwdjRfYWRkcnMpID4gMCkKKwl7CisJICB2dHlfb3V0ICh2dHksICIgICAgSVB2NCBBZGRyZXNzZXM6JXMiLCBWVFlfTkVXTElORSk7CisJICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoYWRqLT5pcHY0X2FkZHJzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorCSAgICB7CisJICAgICAgaXBfYWRkciA9IGdldGRhdGEgKG5vZGUpOworCSAgICAgIHZ0eV9vdXQgKHZ0eSwgIiAgICAgICVzJXMiLCBpbmV0X250b2EgKCppcF9hZGRyKSwgVlRZX05FV0xJTkUpOworCSAgICB9CisJfQorI2lmZGVmIEhBVkVfSVBWNgorICAgICAgaWYgKGFkai0+aXB2Nl9hZGRycyAmJiBsaXN0Y291bnQgKGFkai0+aXB2Nl9hZGRycykgPiAwKQorCXsKKwkgIHZ0eV9vdXQgKHZ0eSwgIiAgICBJUHY2IEFkZHJlc3NlczolcyIsIFZUWV9ORVdMSU5FKTsKKwkgIGZvciAobm9kZSA9IGxpc3RoZWFkIChhZGotPmlwdjZfYWRkcnMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisJICAgIHsKKwkgICAgICBpcHY2X2FkZHIgPSBnZXRkYXRhIChub2RlKTsKKwkgICAgICBpbmV0X250b3AgKEFGX0lORVQ2LCBpcHY2X2FkZHIsIGlwNiwgSU5FVDZfQUREUlNUUkxFTik7CisJICAgICAgdnR5X291dCAodnR5LCAiICAgICAgJXMlcyIsIGlwNiwgVlRZX05FV0xJTkUpOworCSAgICB9CisJfQogI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwotICAgIHZ0eV9vdXQgKHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOwotICB9CisgICAgICB2dHlfb3V0ICh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKyAgICB9CiAgIHJldHVybjsKIH0KIAogdm9pZAotaXNpc19hZGpfcHJpbnRfdnR5IChzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKmFkaiwgc3RydWN0IHZ0eSAqdnR5KSB7Citpc2lzX2Fkal9wcmludF92dHkgKHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqLCBzdHJ1Y3QgdnR5ICp2dHkpCit7CiAgIGlzaXNfYWRqX3ByaW50X3Z0eTIgKGFkaiwgdnR5LCBJU0lTX1VJX0xFVkVMX0JSSUVGKTsKIH0KIAogdm9pZAotaXNpc19hZGpfcHJpbnRfdnR5X2RldGFpbCAoc3RydWN0IGlzaXNfYWRqYWNlbmN5ICphZGosIHN0cnVjdCB2dHkgKnZ0eSkgeworaXNpc19hZGpfcHJpbnRfdnR5X2RldGFpbCAoc3RydWN0IGlzaXNfYWRqYWNlbmN5ICphZGosIHN0cnVjdCB2dHkgKnZ0eSkKK3sKICAgaXNpc19hZGpfcHJpbnRfdnR5MiAoYWRqLCB2dHksIElTSVNfVUlfTEVWRUxfREVUQUlMKTsKIH0KIAogdm9pZAotaXNpc19hZGpfcHJpbnRfdnR5X2V4dGVuc2l2ZSAoc3RydWN0IGlzaXNfYWRqYWNlbmN5ICphZGosIHN0cnVjdCB2dHkgKnZ0eSkgeworaXNpc19hZGpfcHJpbnRfdnR5X2V4dGVuc2l2ZSAoc3RydWN0IGlzaXNfYWRqYWNlbmN5ICphZGosIHN0cnVjdCB2dHkgKnZ0eSkKK3sKICAgaXNpc19hZGpfcHJpbnRfdnR5MiAoYWRqLCB2dHksIElTSVNfVUlfTEVWRUxfRVhURU5TSVZFKTsKIH0KIApAQCAtNDM1LDU0ICs0NDcsNTYgQEAKICAgaXNpc19hZGpfcHJpbnRfdnR5MiAoYWRqLCB2dHksIElTSVNfVUlfTEVWRUxfQlJJRUYpOwogfQogCi12b2lkIAotaXNpc19hZGpfcDJwX3ByaW50X3Z0eV9kZXRhaWwgKHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqLCBzdHJ1Y3QgdnR5ICp2dHkpIAordm9pZAoraXNpc19hZGpfcDJwX3ByaW50X3Z0eV9kZXRhaWwgKHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqLCBzdHJ1Y3QgdnR5ICp2dHkpCiB7CiAgIGlzaXNfYWRqX3ByaW50X3Z0eTIgKGFkaiwgdnR5LCBJU0lTX1VJX0xFVkVMX0RFVEFJTCk7CiB9CiAKLXZvaWQgCit2b2lkCiBpc2lzX2Fkal9wMnBfcHJpbnRfdnR5X2V4dGVuc2l2ZSAoc3RydWN0IGlzaXNfYWRqYWNlbmN5ICphZGosIHN0cnVjdCB2dHkgKnZ0eSkKIHsKICAgaXNpc19hZGpfcHJpbnRfdnR5MiAoYWRqLCB2dHksIElTSVNfVUlfTEVWRUxfRVhURU5TSVZFKTsKIH0KIAogdm9pZAotaXNpc19hZGpkYl9pdGVyYXRlIChzdHJ1Y3QgbGlzdCAqYWRqZGIsIHZvaWQgKCpmdW5jKShzdHJ1Y3QgaXNpc19hZGphY2VuY3kqLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopLCB2b2lkICphcmcpCitpc2lzX2FkamRiX2l0ZXJhdGUgKHN0cnVjdCBsaXN0ICphZGpkYiwgdm9pZCAoKmZ1bmMpIChzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKiwKKwkJCQkJCSAgICAgIHZvaWQgKiksIHZvaWQgKmFyZykKIHsKICAgc3RydWN0IGxpc3Rub2RlICpub2RlOwogICBzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKmFkajsKLSAgZm9yIChub2RlID0gbGlzdGhlYWQgKGFkamRiKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7Ci0gICAgYWRqID0gZ2V0ZGF0YSAobm9kZSk7Ci0gICAgKCpmdW5jKShhZGosIGFyZyk7Ci0gIH0KKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGFkamRiKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorICAgIHsKKyAgICAgIGFkaiA9IGdldGRhdGEgKG5vZGUpOworICAgICAgKCpmdW5jKSAoYWRqLCBhcmcpOworICAgIH0KIH0KIAogdm9pZAogaXNpc19hZGpfYnVpbGRfbmVpZ2hfbGlzdCAoc3RydWN0IGxpc3QgKmFkamRiLCBzdHJ1Y3QgbGlzdCAqbGlzdCkKLQogewogICBzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKmFkajsKICAgc3RydWN0IGxpc3Rub2RlICpub2RlOwotICAKLSAgCi0gIGlmICghbGlzdCkgewotICAgIHpsb2dfd2FybiAoImlzaXNfYWRqX2J1aWxkX25laWdoX2xpc3QoKTogTlVMTCBsaXN0Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIAotICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoYWRqZGIpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICBhZGogPSBnZXRkYXRhIChub2RlKTsKLSAgICBpZiAoIWFkaikgewotICAgICAgemxvZ193YXJuICgiaXNpc19hZGpfYnVpbGRfbmVpZ2hfbGlzdCgpOiBOVUxMIGFkaiIpOworCisgIGlmICghbGlzdCkKKyAgICB7CisgICAgICB6bG9nX3dhcm4gKCJpc2lzX2Fkal9idWlsZF9uZWlnaF9saXN0KCk6IE5VTEwgbGlzdCIpOwogICAgICAgcmV0dXJuOwogICAgIH0KLSAgCi0gICAgaWYgKChhZGotPmFkal9zdGF0ZSA9PSBJU0lTX0FESl9VUCB8fCAKLSAgICAgICBhZGotPmFkal9zdGF0ZSA9PSBJU0lTX0FESl9JTklUSUFMSVpJTkcpKQotICAgICAgbGlzdG5vZGVfYWRkIChsaXN0LCBhZGotPnNucGEpOwotICB9CisKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGFkamRiKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorICAgIHsKKyAgICAgIGFkaiA9IGdldGRhdGEgKG5vZGUpOworICAgICAgaWYgKCFhZGopCisJeworCSAgemxvZ193YXJuICgiaXNpc19hZGpfYnVpbGRfbmVpZ2hfbGlzdCgpOiBOVUxMIGFkaiIpOworCSAgcmV0dXJuOworCX0KKworICAgICAgaWYgKChhZGotPmFkal9zdGF0ZSA9PSBJU0lTX0FESl9VUCB8fAorCSAgIGFkai0+YWRqX3N0YXRlID09IElTSVNfQURKX0lOSVRJQUxJWklORykpCisJbGlzdG5vZGVfYWRkIChsaXN0LCBhZGotPnNucGEpOworICAgIH0KICAgcmV0dXJuOwogfQogCkBAIC00OTIsMjMgKzUwNiwyNSBAQAogICBzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKmFkajsKICAgc3RydWN0IGxpc3Rub2RlICpub2RlOwogCi0gIGlmICghbGlzdCkgewotICAgIHpsb2dfd2FybiAoImlzaXNfYWRqX2J1aWxkX3VwX2xpc3QoKTogTlVMTCBsaXN0Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZm9yIChub2RlID0gbGlzdGhlYWQgKGFkamRiKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7Ci0gICAgYWRqID0gZ2V0ZGF0YSAobm9kZSk7Ci0gICAgCi0gICAgaWYgKCFhZGopIHsKLSAgICAgIHpsb2dfd2FybiAoImlzaXNfYWRqX2J1aWxkX3VwX2xpc3QoKTogTlVMTCBhZGoiKTsKKyAgaWYgKCFsaXN0KQorICAgIHsKKyAgICAgIHpsb2dfd2FybiAoImlzaXNfYWRqX2J1aWxkX3VwX2xpc3QoKTogTlVMTCBsaXN0Iik7CiAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKGFkai0+YWRqX3N0YXRlID09IElTSVNfQURKX1VQKQotICAgICAgbGlzdG5vZGVfYWRkIChsaXN0LCBhZGopOwotICB9Ci0gIAorICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoYWRqZGIpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisgICAgeworICAgICAgYWRqID0gZ2V0ZGF0YSAobm9kZSk7CisKKyAgICAgIGlmICghYWRqKQorCXsKKwkgIHpsb2dfd2FybiAoImlzaXNfYWRqX2J1aWxkX3VwX2xpc3QoKTogTlVMTCBhZGoiKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIGlmIChhZGotPmFkal9zdGF0ZSA9PSBJU0lTX0FESl9VUCkKKwlsaXN0bm9kZV9hZGQgKGxpc3QsIGFkaik7CisgICAgfQorCiAgIHJldHVybjsKIH0KLQpkaWZmIC0tZ2l0IGEvaXNpc2QvaXNpc19hZGphY2VuY3kuaCBiL2lzaXNkL2lzaXNfYWRqYWNlbmN5LmgKaW5kZXggNWMwNzcyYy4uYTliMTkxMyAxMDA2NDQKLS0tIGEvaXNpc2QvaXNpc19hZGphY2VuY3kuaAorKysgYi9pc2lzZC9pc2lzX2FkamFjZW5jeS5oCkBAIC0zMyw3ICszMyw3IEBACiAgIElTSVNfQURKX0xFVkVMMUFORDIKIH07CiAKLWVudW0gaXNpc19zeXN0ZW1fdHlwZSAKK2VudW0gaXNpc19zeXN0ZW1fdHlwZQogewogICBJU0lTX1NZU1RZUEVfVU5LTk9XTiwKICAgSVNJU19TWVNUWVBFX0VTLApAQCAtNDIsNyArNDIsNyBAQAogICBJU0lTX1NZU1RZUEVfTDJfSVMKIH07CiAKLWVudW0gaXNpc19hZGpfc3RhdGUgCitlbnVtIGlzaXNfYWRqX3N0YXRlCiB7CiAgIElTSVNfQURKX0lOSVRJQUxJWklORywKICAgSVNJU19BREpfVVAsCkBAIC02Miw2NSArNjIsNjYgQEAKICAgSVNJU19BREpfUkVBU09OX0NIRUNLU1VNX0ZBSUxFRAogfTsKIAotI2RlZmluZSBESVNfUkVDT1JEUyA4IC8qIGtlZXAgdGhlIGxhc3QgOCBESVMgc3RhdGUgY2hhbmdlcyBvbiByZWNvcmQgKi8KKyNkZWZpbmUgRElTX1JFQ09SRFMgOAkvKiBrZWVwIHRoZSBsYXN0IDggRElTIHN0YXRlIGNoYW5nZXMgb24gcmVjb3JkICovCiAKLXN0cnVjdCBpc2lzX2Rpc19yZWNvcmQgewotICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXM7IC8qIGlzIG91ciBuZWlnaGJvciB0aGUgRElTID8gKi8gICAgICAgICAgdGltZV90ICAgICAgICAgICAgICAgbGFzdF9kaXNfY2hhbmdlOyAvKiB0aW1lc3RhbXAgZm9yIGxhc3QgZGlzIGNoYW5nZSAqLworc3RydWN0IGlzaXNfZGlzX3JlY29yZAoreworICBpbnQgZGlzOwkJCS8qIGlzIG91ciBuZWlnaGJvciB0aGUgRElTID8gKi8KKyAgdGltZV90IGxhc3RfZGlzX2NoYW5nZTsJLyogdGltZXN0YW1wIGZvciBsYXN0IGRpcyBjaGFuZ2UgKi8KIH07CiAKLXN0cnVjdCBpc2lzX2FkamFjZW5jeXsKLSAgdV9jaGFyIHNucGFbRVRIX0FMRU5dOyAgICAgICAgICAgLyogTmVpZ2hib3VyU05QQUFkZHJlc3MgKi8gCi0gIHVfY2hhciBzeXNpZFtJU0lTX1NZU19JRF9MRU5dOyAgIC8qIG5laWdoYm91clN5c3RlbUlkZW50aWZpZXIgKi8KLSAgdV9jaGFyIGxhbmlkW0lTSVNfU1lTX0lEX0xFTisxXTsgLyogTEFOIGlkIG9uIGJjYXN0IGNpcmN1aXRzICovCi0gIGludCBkaXNjaGFuZ2VzW0lTSVNfTEVWRUxTXTsgICAgIC8qIGhvdyBtYW55IERJUyBjaGFuZ2VzID8qLyAKK3N0cnVjdCBpc2lzX2FkamFjZW5jeQoreworICB1X2NoYXIgc25wYVtFVEhfQUxFTl07CQkvKiBOZWlnaGJvdXJTTlBBQWRkcmVzcyAqLworICB1X2NoYXIgc3lzaWRbSVNJU19TWVNfSURfTEVOXTsJLyogbmVpZ2hib3VyU3lzdGVtSWRlbnRpZmllciAqLworICB1X2NoYXIgbGFuaWRbSVNJU19TWVNfSURfTEVOICsgMV07CS8qIExBTiBpZCBvbiBiY2FzdCBjaXJjdWl0cyAqLworICBpbnQgZGlzY2hhbmdlc1tJU0lTX0xFVkVMU107CQkvKiBob3cgbWFueSBESVMgY2hhbmdlcyA/ICovCiAgIC8qIGFuIGFycmF5IG9mIE4gbGV2ZWxzIGZvciBNIHJlY29yZHMgKi8KLSAgc3RydWN0IGlzaXNfZGlzX3JlY29yZCAgZGlzX3JlY29yZFtESVNfUkVDT1JEUyAqIElTSVNfTEVWRUxTXTsgCi0gIGVudW0gaXNpc19hZGpfc3RhdGUgYWRqX3N0YXRlOyAgLyogYWRqYWNlbmN5U3RhdGUgKi8KLSAgZW51bSBpc2lzX2Fkal91c2FnZSBhZGpfdXNhZ2U7ICAvKiBhZGphY2VuY3lVc2FnZSAqLwotICBzdHJ1Y3QgbGlzdCAqYXJlYV9hZGRyczsgICAgICAgIC8qIGFyZWFBZHJlc3Nlc09mTmVpZ2hib3VyICovCi0gIHN0cnVjdCBubHBpZHMgbmxwaWRzOyAgICAgICAgICAgLyogcHJvdG9jb2xzIHNwb2tlbiAuLi4gKi8KKyAgc3RydWN0IGlzaXNfZGlzX3JlY29yZCBkaXNfcmVjb3JkW0RJU19SRUNPUkRTICogSVNJU19MRVZFTFNdOworICBlbnVtIGlzaXNfYWRqX3N0YXRlIGFkal9zdGF0ZTsJLyogYWRqYWNlbmN5U3RhdGUgKi8KKyAgZW51bSBpc2lzX2Fkal91c2FnZSBhZGpfdXNhZ2U7CS8qIGFkamFjZW5jeVVzYWdlICovCisgIHN0cnVjdCBsaXN0ICphcmVhX2FkZHJzOwkJLyogYXJlYUFkcmVzc2VzT2ZOZWlnaGJvdXIgKi8KKyAgc3RydWN0IG5scGlkcyBubHBpZHM7CQkJLyogcHJvdG9jb2xzIHNwb2tlbiAuLi4gKi8KICAgc3RydWN0IGxpc3QgKmlwdjRfYWRkcnM7CiAjaWZkZWYgSEFWRV9JUFY2CiAgIHN0cnVjdCBsaXN0ICppcHY2X2FkZHJzOwotI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwotICB1X2NoYXIgcHJpb1tJU0lTX0xFVkVMU107ICAgICAgICAvKiBwcmlvcml0eU9mTmVpZ2hib3VyIGZvciBESVMqLwotICBpbnQgY2lyY3VpdF90OyAgICAgICAgICAgICAgICAgICAvKiBmcm9tIGhlbGxvIFBEVSBoZHIgKi8KLSAgaW50IGxldmVsOyAgICAgICAgICAgICAgICAgICAgICAgLyogbGV2ZWwgKDEgb3IgMikgKi8KLSAgZW51bSAgaXNpc19zeXN0ZW1fdHlwZSBzeXNfdHlwZTsgLyogbmVpZ2hib3VyU3lzdGVtVHlwZSAqLwotICB1X2ludDE2X3QgaG9sZF90aW1lOyAgICAgICAgICAgICAvKiBlbnRyeVJlbWFpbmluZ1RpbWUgKi8KKyNlbmRpZgkJCQkvKiBIQVZFX0lQVjYgKi8KKyAgdV9jaGFyIHByaW9bSVNJU19MRVZFTFNdOwkvKiBwcmlvcml0eU9mTmVpZ2hib3VyIGZvciBESVMgKi8KKyAgaW50IGNpcmN1aXRfdDsJCS8qIGZyb20gaGVsbG8gUERVIGhkciAqLworICBpbnQgbGV2ZWw7CQkJLyogbGV2ZWwgKDEgb3IgMikgKi8KKyAgZW51bSBpc2lzX3N5c3RlbV90eXBlIHN5c190eXBlOwkvKiBuZWlnaGJvdXJTeXN0ZW1UeXBlICovCisgIHVfaW50MTZfdCBob2xkX3RpbWU7CQkvKiBlbnRyeVJlbWFpbmluZ1RpbWUgKi8KICAgdV9pbnQzMl90IGxhc3RfdXBkOwotICB1X2ludDMyX3QgbGFzdF9mbGFwOyAgICAgICAgICAgICAvKiBsYXN0IHRpbWUgdGhlIGFkaiBmbGFwcGVkICovCi0gIGludCBmbGFwczsgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBhZGphY2VuY3kgZmxhcHMgICovCi0gIHN0cnVjdCB0aHJlYWQgKnRfZXhwaXJlOyAgICAgICAgIC8qIGV4cGlyZSBhZnRlciBob2xkX3RpbWUgICovCi0gIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQ7ICAgIC8qIGJhY2sgcG9pbnRlciAqLyAgICAgCisgIHVfaW50MzJfdCBsYXN0X2ZsYXA7CQkvKiBsYXN0IHRpbWUgdGhlIGFkaiBmbGFwcGVkICovCisgIGludCBmbGFwczsJCQkvKiBudW1iZXIgb2YgYWRqYWNlbmN5IGZsYXBzICAqLworICBzdHJ1Y3QgdGhyZWFkICp0X2V4cGlyZTsJLyogZXhwaXJlIGFmdGVyIGhvbGRfdGltZSAgKi8KKyAgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdDsJLyogYmFjayBwb2ludGVyICovCiB9OwogCi0KLXN0cnVjdCBpc2lzX2FkamFjZW5jeSAqaXNpc19hZGpfbG9va3VwICh1X2NoYXIgKnN5c2lkLCBzdHJ1Y3QgbGlzdCAqYWRqZGIpOwotc3RydWN0IGlzaXNfYWRqYWNlbmN5ICppc2lzX2Fkal9sb29rdXBfc25wYSAodV9jaGFyICpzc25wYSwgCitzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKmlzaXNfYWRqX2xvb2t1cCAodV9jaGFyICogc3lzaWQsIHN0cnVjdCBsaXN0ICphZGpkYik7CitzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKmlzaXNfYWRqX2xvb2t1cF9zbnBhICh1X2NoYXIgKiBzc25wYSwKIAkJCQkJICAgICBzdHJ1Y3QgbGlzdCAqYWRqZGIpOwotc3RydWN0IGlzaXNfYWRqYWNlbmN5ICppc2lzX25ld19hZGogKHVfY2hhciAqaWQsIHVfY2hhciAqc25wYSwgaW50IGxldmVsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0KTsgCi12b2lkIGlzaXNfZGVsZXRlX2FkaiAoc3RydWN0IGlzaXNfYWRqYWNlbmN5ICphZGosIHN0cnVjdCBsaXN0ICphZGpkYik7IAotdm9pZCBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGlzaXNfYWRqX3N0YXRlIHN0YXRlLCBjaGFyICpyZWFzb24pOyAKLXZvaWQgaXNpc19hZGpfcHJpbnQgKHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqKTsgCi1pbnQgIGlzaXNfYWRqX2V4cGlyZSAoc3RydWN0IHRocmVhZCAqdGhyZWFkKTsKK3N0cnVjdCBpc2lzX2FkamFjZW5jeSAqaXNpc19uZXdfYWRqICh1X2NoYXIgKiBpZCwgdV9jaGFyICogc25wYSwgaW50IGxldmVsLAorCQkJCSAgICAgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCk7Cit2b2lkIGlzaXNfZGVsZXRlX2FkaiAoc3RydWN0IGlzaXNfYWRqYWNlbmN5ICphZGosIHN0cnVjdCBsaXN0ICphZGpkYik7Cit2b2lkIGlzaXNfYWRqX3N0YXRlX2NoYW5nZSAoc3RydWN0IGlzaXNfYWRqYWNlbmN5ICphZGosCisJCQkgICAgZW51bSBpc2lzX2Fkal9zdGF0ZSBzdGF0ZSwgY2hhciAqcmVhc29uKTsKK3ZvaWQgaXNpc19hZGpfcHJpbnQgKHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqKTsKK2ludCBpc2lzX2Fkal9leHBpcmUgKHN0cnVjdCB0aHJlYWQgKnRocmVhZCk7CiB2b2lkIGlzaXNfYWRqX3ByaW50X3Z0eSAoc3RydWN0IGlzaXNfYWRqYWNlbmN5ICphZGosIHN0cnVjdCB2dHkgKnZ0eSk7CiB2b2lkIGlzaXNfYWRqX3ByaW50X3Z0eV9kZXRhaWwgKHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqLCBzdHJ1Y3QgdnR5ICp2dHkpOwotdm9pZCBpc2lzX2Fkal9wcmludF92dHlfZXh0ZW5zaXZlIChzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKmFkaiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2dHkgKnZ0eSk7Cit2b2lkIGlzaXNfYWRqX3ByaW50X3Z0eV9leHRlbnNpdmUgKHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqLAorCQkJCSAgIHN0cnVjdCB2dHkgKnZ0eSk7CiB2b2lkIGlzaXNfYWRqX3AycF9wcmludF92dHkgKHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqLCBzdHJ1Y3QgdnR5ICp2dHkpOwotdm9pZCBpc2lzX2Fkal9wMnBfcHJpbnRfdnR5X2RldGFpbCAoc3RydWN0IGlzaXNfYWRqYWNlbmN5ICphZGosIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZ0eSAqdnR5KTsKLXZvaWQgaXNpc19hZGpfcDJwX3ByaW50X3Z0eV9leHRlbnNpdmUgKHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2dHkgKnZ0eSk7Cit2b2lkIGlzaXNfYWRqX3AycF9wcmludF92dHlfZGV0YWlsIChzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKmFkaiwKKwkJCQkgICAgc3RydWN0IHZ0eSAqdnR5KTsKK3ZvaWQgaXNpc19hZGpfcDJwX3ByaW50X3Z0eV9leHRlbnNpdmUgKHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqLAorCQkJCSAgICAgICBzdHJ1Y3QgdnR5ICp2dHkpOwogCiB2b2lkIGlzaXNfYWRqX2J1aWxkX25laWdoX2xpc3QgKHN0cnVjdCBsaXN0ICphZGpkYiwgc3RydWN0IGxpc3QgKmxpc3QpOwogdm9pZCBpc2lzX2Fkal9idWlsZF91cF9saXN0IChzdHJ1Y3QgbGlzdCAqYWRqZGIsIHN0cnVjdCBsaXN0ICpsaXN0KTsKLXZvaWQgaXNpc19hZGpkYl9pdGVyYXRlIChzdHJ1Y3QgbGlzdCAqYWRqZGIsIAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpmdW5jKShzdHJ1Y3QgaXNpc19hZGphY2VuY3kqLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSwgdm9pZCAqYXJnKTsKK3ZvaWQgaXNpc19hZGpkYl9pdGVyYXRlIChzdHJ1Y3QgbGlzdCAqYWRqZGIsCisJCQkgdm9pZCAoKmZ1bmMpIChzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKiwKKwkJCQkgICAgICAgdm9pZCAqKSwgdm9pZCAqYXJnKTsKIAogI2VuZGlmIC8qIElTSVNfQURKQUNFTkNZX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaXNpc2QvaXNpc19jaXJjdWl0LmMgYi9pc2lzZC9pc2lzX2NpcmN1aXQuYwppbmRleCAxOTJiMTA3Li42NzFlYmJmIDEwMDY0NAotLS0gYS9pc2lzZC9pc2lzX2NpcmN1aXQuYworKysgYi9pc2lzZC9pc2lzX2NpcmN1aXQuYwpAQCAtNjcsMjQgKzY3LDI3IEBACiAgIGludCBpOwogCiAgIGNpcmN1aXQgPSBYTUFMTE9DIChNVFlQRV9JU0lTX0NJUkNVSVQsIHNpemVvZiAoc3RydWN0IGlzaXNfY2lyY3VpdCkpOwotICBpZiAoY2lyY3VpdCkgewotICAgIG1lbXNldCAoY2lyY3VpdCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaXNpc19jaXJjdWl0KSk7Ci0gICAgLyogc2V0IGRlZmF1bHQgbWV0cmljcyBmb3IgY2lyY3VpdCAqLwotICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgIGNpcmN1aXQtPm1ldHJpY3NbaV0ubWV0cmljX2RlZmF1bHQgPSBERUZBVUxUX0NJUkNVSVRfTUVUUklDUzsKLSAgICAgIGNpcmN1aXQtPm1ldHJpY3NbaV0ubWV0cmljX2V4cGVuc2UgPSBNRVRSSUNTX1VOU1VQUE9SVEVEOwotICAgICAgY2lyY3VpdC0+bWV0cmljc1tpXS5tZXRyaWNfZXJyb3IgPSBNRVRSSUNTX1VOU1VQUE9SVEVEOwotICAgICAgY2lyY3VpdC0+bWV0cmljc1tpXS5tZXRyaWNfZGVsYXkgPSBNRVRSSUNTX1VOU1VQUE9SVEVEOworICBpZiAoY2lyY3VpdCkKKyAgICB7CisgICAgICBtZW1zZXQgKGNpcmN1aXQsIDAsIHNpemVvZiAoc3RydWN0IGlzaXNfY2lyY3VpdCkpOworICAgICAgLyogc2V0IGRlZmF1bHQgbWV0cmljcyBmb3IgY2lyY3VpdCAqLworICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwl7CisJICBjaXJjdWl0LT5tZXRyaWNzW2ldLm1ldHJpY19kZWZhdWx0ID0gREVGQVVMVF9DSVJDVUlUX01FVFJJQ1M7CisJICBjaXJjdWl0LT5tZXRyaWNzW2ldLm1ldHJpY19leHBlbnNlID0gTUVUUklDU19VTlNVUFBPUlRFRDsKKwkgIGNpcmN1aXQtPm1ldHJpY3NbaV0ubWV0cmljX2Vycm9yID0gTUVUUklDU19VTlNVUFBPUlRFRDsKKwkgIGNpcmN1aXQtPm1ldHJpY3NbaV0ubWV0cmljX2RlbGF5ID0gTUVUUklDU19VTlNVUFBPUlRFRDsKKwl9CiAgICAgfQotICB9IGVsc2UgewotICAgIHpsb2dfZXJyICgiQ2FuJ3QgbWFsbG9jIGlzaXMgY2lyY3VpdCIpOwotICAgIHJldHVybiAgTlVMTDsKLSAgfQotICAKKyAgZWxzZQorICAgIHsKKyAgICAgIHpsb2dfZXJyICgiQ2FuJ3QgbWFsbG9jIGlzaXMgY2lyY3VpdCIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCiAgIHJldHVybiBjaXJjdWl0OwogfQogCi0KIHZvaWQKIGlzaXNfY2lyY3VpdF9jb25maWd1cmUgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWEpCiB7CkBAIC05OCwxOCArMTAxLDIwIEBACiAgIC8qCiAgICAqIERlZmF1bHQgdmFsdWVzCiAgICAqLwotICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgY2lyY3VpdC0+aGVsbG9faW50ZXJ2YWxbaV0gPSBIRUxMT19JTlRFUlZBTDsKLSAgICBjaXJjdWl0LT5oZWxsb19tdWx0aXBsaWVyW2ldID0gSEVMTE9fTVVMVElQTElFUjsKLSAgICBjaXJjdWl0LT5jc25wX2ludGVydmFsW2ldID0gQ1NOUF9JTlRFUlZBTDsKLSAgICBjaXJjdWl0LT5wc25wX2ludGVydmFsW2ldID0gUFNOUF9JTlRFUlZBTDsKLSAgICBjaXJjdWl0LT51LmJjLnByaW9yaXR5W2ldID0gREVGQVVMVF9QUklPUklUWTsKLSAgfQotICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QpIHsKLSAgICBjaXJjdWl0LT51LmJjLmFkamRiWzBdID0gbGlzdF9uZXcgKCk7Ci0gICAgY2lyY3VpdC0+dS5iYy5hZGpkYlsxXSA9IGxpc3RfbmV3ICgpOwotICAgIGNpcmN1aXQtPnUuYmMucGFkX2hlbGxvcyA9IDE7Ci0gIH0KKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB7CisgICAgICBjaXJjdWl0LT5oZWxsb19pbnRlcnZhbFtpXSA9IEhFTExPX0lOVEVSVkFMOworICAgICAgY2lyY3VpdC0+aGVsbG9fbXVsdGlwbGllcltpXSA9IEhFTExPX01VTFRJUExJRVI7CisgICAgICBjaXJjdWl0LT5jc25wX2ludGVydmFsW2ldID0gQ1NOUF9JTlRFUlZBTDsKKyAgICAgIGNpcmN1aXQtPnBzbnBfaW50ZXJ2YWxbaV0gPSBQU05QX0lOVEVSVkFMOworICAgICAgY2lyY3VpdC0+dS5iYy5wcmlvcml0eVtpXSA9IERFRkFVTFRfUFJJT1JJVFk7CisgICAgfQorICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QpCisgICAgeworICAgICAgY2lyY3VpdC0+dS5iYy5hZGpkYlswXSA9IGxpc3RfbmV3ICgpOworICAgICAgY2lyY3VpdC0+dS5iYy5hZGpkYlsxXSA9IGxpc3RfbmV3ICgpOworICAgICAgY2lyY3VpdC0+dS5iYy5wYWRfaGVsbG9zID0gMTsKKyAgICB9CiAgIGNpcmN1aXQtPmxzcF9pbnRlcnZhbCA9IExTUF9JTlRFUlZBTDsKIAogICAvKgpAQCAtMTIzLDExICsxMjgsMTEgQEAKICAgcmV0dXJuOwogfQogCi12b2lkIAordm9pZAogaXNpc19jaXJjdWl0X2RlY29uZmlndXJlIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhKSAKKwkJCSAgc3RydWN0IGlzaXNfYXJlYSAqYXJlYSkKIHsKLSAgCisKICAgLyogUmVtb3ZlIGNpcmN1aXQgZnJvbSBhcmVhICovCiAgIGxpc3Rub2RlX2RlbGV0ZSAoYXJlYS0+Y2lyY3VpdF9saXN0LCBjaXJjdWl0KTsKICAgLyogRnJlZSB0aGUgaW5kZXggb2YgU1JNIGFuZCBTU04gZmxhZ3MgKi8KQEAgLTE0MSwxNiArMTQ2LDE3IEBACiB7CiAgIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQgPSBOVUxMOwogICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7Ci0gIAorCiAgIGlmICghbGlzdCkKICAgICByZXR1cm4gTlVMTDsKLSAgCi0gIGZvciAobm9kZSA9IGxpc3RoZWFkIChsaXN0KTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7Ci0gICAgY2lyY3VpdCA9IGdldGRhdGEgKG5vZGUpOwotICAgIGlmIChjaXJjdWl0LT5pbnRlcmZhY2UgPT0gaWZwKQotICAgICAgcmV0dXJuIGNpcmN1aXQ7Ci0gIH0KLSAgCisKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGxpc3QpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisgICAgeworICAgICAgY2lyY3VpdCA9IGdldGRhdGEgKG5vZGUpOworICAgICAgaWYgKGNpcmN1aXQtPmludGVyZmFjZSA9PSBpZnApCisJcmV0dXJuIGNpcmN1aXQ7CisgICAgfQorCiAgIHJldHVybiBOVUxMOwogfQogCkBAIC0xNjQsMTMgKzE3MCwxNCBAQAogICBpZiAoIWlzaXMtPmFyZWFfbGlzdCkKICAgICByZXR1cm4gTlVMTDsKIAotICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoaXNpcy0+YXJlYV9saXN0KTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7Ci0gICAgYXJlYSA9IGdldGRhdGEgKG5vZGUpOwotICAgIGNpcmN1aXQgPSBjaXJjdWl0X2xvb2t1cF9ieV9pZnAgKGlmcCwgYXJlYS0+Y2lyY3VpdF9saXN0KTsKLSAgICBpZiAoY2lyY3VpdCkKLSAgICAgIHJldHVybiBjaXJjdWl0OwotICB9Ci0gIAorICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoaXNpcy0+YXJlYV9saXN0KTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorICAgIHsKKyAgICAgIGFyZWEgPSBnZXRkYXRhIChub2RlKTsKKyAgICAgIGNpcmN1aXQgPSBjaXJjdWl0X2xvb2t1cF9ieV9pZnAgKGlmcCwgYXJlYS0+Y2lyY3VpdF9saXN0KTsKKyAgICAgIGlmIChjaXJjdWl0KQorCXJldHVybiBjaXJjdWl0OworICAgIH0KKwogICByZXR1cm4gY2lyY3VpdF9sb29rdXBfYnlfaWZwIChpZnAsIGlzaXMtPmluaXRfY2lyY19saXN0KTsKIH0KIApAQCAtMTgxLDE3ICsxODgsMTggQEAKICAgaWYgKCFjaXJjdWl0KQogICAgIHJldHVybjsKIAotICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QpIHsKLSAgICAvKiBkZXN0cm95IGFkamFjZW5jeSBkYXRhYmFzZXMgKi8KLSAgICBsaXN0X2RlbGV0ZSAoY2lyY3VpdC0+dS5iYy5hZGpkYlswXSk7Ci0gICAgbGlzdF9kZWxldGUgKGNpcmN1aXQtPnUuYmMuYWRqZGJbMV0pOwotICAgIC8qIGRlc3Ryb3kgbmVpZ2hib3VyIGxpc3RzICovCi0gICAgaWYgKGNpcmN1aXQtPnUuYmMubGFuX25laWdoc1swXSkKLSAgICAgIGxpc3RfZGVsZXRlIChjaXJjdWl0LT51LmJjLmxhbl9uZWlnaHNbMF0pOwotICAgIGlmIChjaXJjdWl0LT51LmJjLmxhbl9uZWlnaHNbMV0pCi0gICAgICBsaXN0X2RlbGV0ZSAoY2lyY3VpdC0+dS5iYy5sYW5fbmVpZ2hzWzFdKTsKLSAgICAvKiBkZXN0cm95IGFkZHJlc3NlcyAqLwotICB9CisgIGlmIChjaXJjdWl0LT5jaXJjX3R5cGUgPT0gQ0lSQ1VJVF9UX0JST0FEQ0FTVCkKKyAgICB7CisgICAgICAvKiBkZXN0cm95IGFkamFjZW5jeSBkYXRhYmFzZXMgKi8KKyAgICAgIGxpc3RfZGVsZXRlIChjaXJjdWl0LT51LmJjLmFkamRiWzBdKTsKKyAgICAgIGxpc3RfZGVsZXRlIChjaXJjdWl0LT51LmJjLmFkamRiWzFdKTsKKyAgICAgIC8qIGRlc3Ryb3kgbmVpZ2hib3VyIGxpc3RzICovCisgICAgICBpZiAoY2lyY3VpdC0+dS5iYy5sYW5fbmVpZ2hzWzBdKQorCWxpc3RfZGVsZXRlIChjaXJjdWl0LT51LmJjLmxhbl9uZWlnaHNbMF0pOworICAgICAgaWYgKGNpcmN1aXQtPnUuYmMubGFuX25laWdoc1sxXSkKKwlsaXN0X2RlbGV0ZSAoY2lyY3VpdC0+dS5iYy5sYW5fbmVpZ2hzWzFdKTsKKyAgICAgIC8qIGRlc3Ryb3kgYWRkcmVzc2VzICovCisgICAgfQogICBpZiAoY2lyY3VpdC0+aXBfYWRkcnMpCiAgICAgbGlzdF9kZWxldGUgKGNpcmN1aXQtPmlwX2FkZHJzKTsKICNpZmRlZiBIQVZFX0lQVjYKQEAgLTIwMCw3ICsyMDgsNyBAQAogICBpZiAoY2lyY3VpdC0+aXB2Nl9ub25fbGluaykKICAgICBsaXN0X2RlbGV0ZSAoY2lyY3VpdC0+aXB2Nl9ub25fbGluayk7CiAjZW5kaWYgLyogSEFWRV9JUFY2ICovCi0gIAorCiAgIC8qIGFuZCBsYXN0bHkgdGhlIGNpcmN1aXQgaXRzZWxmICovCiAgIFhGUkVFIChNVFlQRV9JU0lTX0NJUkNVSVQsIGNpcmN1aXQpOwogCkBAIC0yMDgsNjMgKzIxNiw3MCBAQAogfQogCiB2b2lkCi1pc2lzX2NpcmN1aXRfYWRkX2FkZHIgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsIAotICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29ubmVjdGVkICpjb25uKQoraXNpc19jaXJjdWl0X2FkZF9hZGRyIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LCBzdHJ1Y3QgY29ubmVjdGVkICpjb25uKQogewogICBzdHJ1Y3QgcHJlZml4X2lwdjQgKmlwdjQ7Ci0gIHVfY2hhciBidWYgW0JVRlNJWl07CisgIHVfY2hhciBidWZbQlVGU0laXTsKICNpZmRlZiBIQVZFX0lQVjYKICAgc3RydWN0IHByZWZpeF9pcHY2ICppcHY2OwogI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwotICBpZiAoIWNpcmN1aXQtPmlwX2FkZHJzKSB7Ci0gICAgY2lyY3VpdC0+aXBfYWRkcnMgPSBsaXN0X25ldyAoKTsKLSAgfQorICBpZiAoIWNpcmN1aXQtPmlwX2FkZHJzKQorICAgIHsKKyAgICAgIGNpcmN1aXQtPmlwX2FkZHJzID0gbGlzdF9uZXcgKCk7CisgICAgfQogI2lmZGVmIEhBVkVfSVBWNgotICBpZiAoIWNpcmN1aXQtPmlwdjZfbGluaykgewotICAgIGNpcmN1aXQtPmlwdjZfbGluayA9IGxpc3RfbmV3ICgpOwotICB9Ci0gIGlmICghY2lyY3VpdC0+aXB2Nl9ub25fbGluaykgewotICAgIGNpcmN1aXQtPmlwdjZfbm9uX2xpbmsgPSBsaXN0X25ldyAoKTsKLSAgfQorICBpZiAoIWNpcmN1aXQtPmlwdjZfbGluaykKKyAgICB7CisgICAgICBjaXJjdWl0LT5pcHY2X2xpbmsgPSBsaXN0X25ldyAoKTsKKyAgICB9CisgIGlmICghY2lyY3VpdC0+aXB2Nl9ub25fbGluaykKKyAgICB7CisgICAgICBjaXJjdWl0LT5pcHY2X25vbl9saW5rID0gbGlzdF9uZXcgKCk7CisgICAgfQogI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwogCiAgIG1lbXNldCAoJmJ1ZiwgMCwgQlVGU0laKTsKLSAgaWYgKGNvbm4tPmFkZHJlc3MtPmZhbWlseSA9PSBBRl9JTkVUKSB7Ci0gICAgaXB2NCA9IHByZWZpeF9pcHY0X25ldyAoKTsKLSAgICBpcHY0LT5wcmVmaXhsZW4gPSBjb25uLT5hZGRyZXNzLT5wcmVmaXhsZW47Ci0gICAgaXB2NC0+cHJlZml4ID0gY29ubi0+YWRkcmVzcy0+dS5wcmVmaXg0OwotICAgIGxpc3Rub2RlX2FkZCAoY2lyY3VpdC0+aXBfYWRkcnMsIGlwdjQpOwotICAgIHByZWZpeDJzdHIgKGNvbm4tPmFkZHJlc3MsIGJ1ZiwgQlVGU0laKTsKKyAgaWYgKGNvbm4tPmFkZHJlc3MtPmZhbWlseSA9PSBBRl9JTkVUKQorICAgIHsKKyAgICAgIGlwdjQgPSBwcmVmaXhfaXB2NF9uZXcgKCk7CisgICAgICBpcHY0LT5wcmVmaXhsZW4gPSBjb25uLT5hZGRyZXNzLT5wcmVmaXhsZW47CisgICAgICBpcHY0LT5wcmVmaXggPSBjb25uLT5hZGRyZXNzLT51LnByZWZpeDQ7CisgICAgICBsaXN0bm9kZV9hZGQgKGNpcmN1aXQtPmlwX2FkZHJzLCBpcHY0KTsKKyAgICAgIHByZWZpeDJzdHIgKGNvbm4tPmFkZHJlc3MsIGJ1ZiwgQlVGU0laKTsKICNpZmRlZiBFWFRSRU1FX0RFQlVHCi0gICAgemxvZ19pbmZvICgiQWRkZWQgSVAgYWRkcmVzcyAlcyB0byBjaXJjdWl0ICVkIiwgYnVmLAotICAgICAgICAgICAgICAgY2lyY3VpdC0+Y2lyY3VpdF9pZCk7Ci0jZW5kaWYgLyogRVhUUkVNRV9ERUJVRyAqLwkKLSAgfQotI2lmZGVmIEhBVkVfSVBWNgotICBpZiAoY29ubi0+YWRkcmVzcy0+ZmFtaWx5ID09IEFGX0lORVQ2KSB7Ci0gICAgaXB2NiA9IHByZWZpeF9pcHY2X25ldyAoKTsKLSAgICBpcHY2LT5wcmVmaXhsZW4gPSBjb25uLT5hZGRyZXNzLT5wcmVmaXhsZW47Ci0gICAgaXB2Ni0+cHJlZml4ID0gY29ubi0+YWRkcmVzcy0+dS5wcmVmaXg2OwotICAgIGlmIChJTjZfSVNfQUREUl9MSU5LTE9DQUwoJmlwdjYtPnByZWZpeCkpIHsKLSAgICAgIGxpc3Rub2RlX2FkZCAoY2lyY3VpdC0+aXB2Nl9saW5rLCBpcHY2KTsKLSAgICB9IGVsc2UgewotICAgICAgbGlzdG5vZGVfYWRkIChjaXJjdWl0LT5pcHY2X25vbl9saW5rLCBpcHY2KTsKKyAgICAgIHpsb2dfaW5mbyAoIkFkZGVkIElQIGFkZHJlc3MgJXMgdG8gY2lyY3VpdCAlZCIsIGJ1ZiwKKwkJIGNpcmN1aXQtPmNpcmN1aXRfaWQpOworI2VuZGlmIC8qIEVYVFJFTUVfREVCVUcgKi8KICAgICB9Ci0gICAgcHJlZml4MnN0ciAoY29ubi0+YWRkcmVzcywgYnVmLCBCVUZTSVopOworI2lmZGVmIEhBVkVfSVBWNgorICBpZiAoY29ubi0+YWRkcmVzcy0+ZmFtaWx5ID09IEFGX0lORVQ2KQorICAgIHsKKyAgICAgIGlwdjYgPSBwcmVmaXhfaXB2Nl9uZXcgKCk7CisgICAgICBpcHY2LT5wcmVmaXhsZW4gPSBjb25uLT5hZGRyZXNzLT5wcmVmaXhsZW47CisgICAgICBpcHY2LT5wcmVmaXggPSBjb25uLT5hZGRyZXNzLT51LnByZWZpeDY7CisgICAgICBpZiAoSU42X0lTX0FERFJfTElOS0xPQ0FMICgmaXB2Ni0+cHJlZml4KSkKKwl7CisJICBsaXN0bm9kZV9hZGQgKGNpcmN1aXQtPmlwdjZfbGluaywgaXB2Nik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGxpc3Rub2RlX2FkZCAoY2lyY3VpdC0+aXB2Nl9ub25fbGluaywgaXB2Nik7CisJfQorICAgICAgcHJlZml4MnN0ciAoY29ubi0+YWRkcmVzcywgYnVmLCBCVUZTSVopOwogI2lmZGVmIEVYVFJFTUVfREVCVUcKLSAgICB6bG9nX2luZm8gKCJBZGRlZCBJUHY2IGFkZHJlc3MgJXMgdG8gY2lyY3VpdCAlZCIsIGJ1ZiwgCi0gICAgICAgICAgICAgICBjaXJjdWl0LT5jaXJjdWl0X2lkKTsKLSNlbmRpZiAvKiBFWFRSRU1FX0RFQlVHICovIAotICB9CisgICAgICB6bG9nX2luZm8gKCJBZGRlZCBJUHY2IGFkZHJlc3MgJXMgdG8gY2lyY3VpdCAlZCIsIGJ1ZiwKKwkJIGNpcmN1aXQtPmNpcmN1aXRfaWQpOworI2VuZGlmIC8qIEVYVFJFTUVfREVCVUcgKi8KKyAgICB9CiAjZW5kaWYgLyogSEFWRV9JUFY2ICovCi0gIAorCiAKICAgcmV0dXJuOwogfQogCiB2b2lkCiBpc2lzX2NpcmN1aXRfZGVsX2FkZHIgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb25uZWN0ZWQgKmNvbm5lY3RlZCkKKwkJICAgICAgIHN0cnVjdCBjb25uZWN0ZWQgKmNvbm5lY3RlZCkKIHsKIAogfQpAQCAtMjc3LDYwICsyOTIsNzEgQEAKIAogICBjaXJjdWl0LT5pbnRlcmZhY2UgPSBpZnA7CiAgIGlmcC0+aW5mbyA9IGNpcmN1aXQ7Ci0gIAotICBjaXJjdWl0LT5jaXJjdWl0X2lkID0gaWZwLT5pZmluZGV4ICUgMjU1OyAvKiBGSVhNRTogV2h5IG5vdCA/ICovCisKKyAgY2lyY3VpdC0+Y2lyY3VpdF9pZCA9IGlmcC0+aWZpbmRleCAlIDI1NTsJLyogRklYTUU6IFdoeSBub3QgPyAqLwogCiAgIC8qICBpc2lzX2NpcmN1aXRfdXBkYXRlX2FkZHJzIChjaXJjdWl0LCBpZnApOyAqLwogCi0gIGlmIChpZl9pc19icm9hZGNhc3QgKGlmcCkpIHsKLSAgICBjaXJjdWl0LT5jaXJjX3R5cGUgPSBDSVJDVUlUX1RfQlJPQURDQVNUOwotICAgIC8qCi0gICAgICogR2V0IHRoZSBIYXJkd2FyZSBBZGRyZXNzCi0gICAgICovCisgIGlmIChpZl9pc19icm9hZGNhc3QgKGlmcCkpCisgICAgeworICAgICAgY2lyY3VpdC0+Y2lyY190eXBlID0gQ0lSQ1VJVF9UX0JST0FEQ0FTVDsKKyAgICAgIC8qCisgICAgICAgKiBHZXQgdGhlIEhhcmR3YXJlIEFkZHJlc3MKKyAgICAgICAqLwogI2lmZGVmIEhBVkVfU09DS0FERFJfREwKLSAgICBpZiAoY2lyY3VpdC0+aW50ZXJmYWNlLT5zZGwuc2RsX2FsZW4gIT0gRVRIRVJfQUREUl9MRU4pCi0gICAgICB6bG9nX3dhcm4gKCJ1bnN1cHBvcnRlZCBsaW5rIGxheWVyIik7Ci0gICAgZWxzZQotICAgICAgbWVtY3B5IChjaXJjdWl0LT51LmJjLnNucGEsIExMQUREUigmY2lyY3VpdC0+aW50ZXJmYWNlLT5zZGwpLCBFVEhfQUxFTik7CisgICAgICBpZiAoY2lyY3VpdC0+aW50ZXJmYWNlLT5zZGwuc2RsX2FsZW4gIT0gRVRIRVJfQUREUl9MRU4pCisJemxvZ193YXJuICgidW5zdXBwb3J0ZWQgbGluayBsYXllciIpOworICAgICAgZWxzZQorCW1lbWNweSAoY2lyY3VpdC0+dS5iYy5zbnBhLCBMTEFERFIgKCZjaXJjdWl0LT5pbnRlcmZhY2UtPnNkbCksCisJCUVUSF9BTEVOKTsKICNlbHNlCi0gICAgaWYgKGNpcmN1aXQtPmludGVyZmFjZS0+aHdfYWRkcl9sZW4gIT0gRVRIX0FMRU4pIHsKLSAgICAgIHpsb2dfd2FybiAoInVuc3VwcG9ydGVkIGxpbmsgbGF5ZXIiKTsKLSAgICB9IGVsc2UgewotICAgICAgbWVtY3B5IChjaXJjdWl0LT51LmJjLnNucGEsIGNpcmN1aXQtPmludGVyZmFjZS0+aHdfYWRkciwgRVRIX0FMRU4pOwotICAgIH0KKyAgICAgIGlmIChjaXJjdWl0LT5pbnRlcmZhY2UtPmh3X2FkZHJfbGVuICE9IEVUSF9BTEVOKQorCXsKKwkgIHpsb2dfd2FybiAoInVuc3VwcG9ydGVkIGxpbmsgbGF5ZXIiKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbWVtY3B5IChjaXJjdWl0LT51LmJjLnNucGEsIGNpcmN1aXQtPmludGVyZmFjZS0+aHdfYWRkciwgRVRIX0FMRU4pOworCX0KICNpZmRlZiBFWFRSRU1FX0RFR1VHCi0gICAgemxvZ19pbmZvICgiaXNpc19jaXJjdWl0X2lmX2FkZDogaWZfaWQgJWQsIGlzb210dSAlZCBzbnBhICVzIiwgCi0JICAgICAgIGNpcmN1aXQtPmludGVyZmFjZS0+aWZpbmRleCwgSVNPX01UVSAoY2lyY3VpdCksIAotCSAgICAgICBzbnBhX3ByaW50IChjaXJjdWl0LT51LmJjLnNucGEpKTsKKyAgICAgIHpsb2dfaW5mbyAoImlzaXNfY2lyY3VpdF9pZl9hZGQ6IGlmX2lkICVkLCBpc29tdHUgJWQgc25wYSAlcyIsCisJCSBjaXJjdWl0LT5pbnRlcmZhY2UtPmlmaW5kZXgsIElTT19NVFUgKGNpcmN1aXQpLAorCQkgc25wYV9wcmludCAoY2lyY3VpdC0+dS5iYy5zbnBhKSk7CiAKICNlbmRpZiAvKiBFWFRSRU1FX0RFQlVHICovCi0jZW5kaWYgLyogSEFWRV9TT0NLQUREUl9ETCAqLyAgIAotICB9IGVsc2UgaWYgKGlmX2lzX3BvaW50b3BvaW50IChpZnApKSB7Ci0gICAgY2lyY3VpdC0+Y2lyY190eXBlID0gQ0lSQ1VJVF9UX1AyUDsKLSAgfSBlbHNlIHsKLSAgICB6bG9nX3dhcm4gKCJpc2lzX2NpcmN1aXRfaWZfYWRkOiB1bnN1cHBvcnRlZCBtZWRpYSIpOwotICB9Ci0gIAotICBmb3IgKG5vZGUgPSBpZnAtPmNvbm5lY3RlZCA/IGxpc3RoZWFkIChpZnAtPmNvbm5lY3RlZCkgOiBOVUxMOyBub2RlOyAKLSAgICAgICBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICBjb25uID0gZ2V0ZGF0YSAobm9kZSk7Ci0gICAgaXNpc19jaXJjdWl0X2FkZF9hZGRyIChjaXJjdWl0LCBjb25uKTsKLSAgfQorI2VuZGlmIC8qIEhBVkVfU09DS0FERFJfREwgKi8KKyAgICB9CisgIGVsc2UgaWYgKGlmX2lzX3BvaW50b3BvaW50IChpZnApKQorICAgIHsKKyAgICAgIGNpcmN1aXQtPmNpcmNfdHlwZSA9IENJUkNVSVRfVF9QMlA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgemxvZ193YXJuICgiaXNpc19jaXJjdWl0X2lmX2FkZDogdW5zdXBwb3J0ZWQgbWVkaWEiKTsKKyAgICB9CisKKyAgZm9yIChub2RlID0gaWZwLT5jb25uZWN0ZWQgPyBsaXN0aGVhZCAoaWZwLT5jb25uZWN0ZWQpIDogTlVMTDsgbm9kZTsKKyAgICAgICBuZXh0bm9kZSAobm9kZSkpCisgICAgeworICAgICAgY29ubiA9IGdldGRhdGEgKG5vZGUpOworICAgICAgaXNpc19jaXJjdWl0X2FkZF9hZGRyIChjaXJjdWl0LCBjb25uKTsKKyAgICB9CiAKICAgcmV0dXJuOwogfQogCiB2b2lkCi1pc2lzX2NpcmN1aXRfdXBkYXRlX3BhcmFtcyAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVyZmFjZSAqaWZwKQoraXNpc19jaXJjdWl0X3VwZGF0ZV9wYXJhbXMgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsCisJCQkgICAgc3RydWN0IGludGVyZmFjZSAqaWZwKQogewogICBhc3NlcnQgKGNpcmN1aXQpOwotICAKLSAgaWYgKGNpcmN1aXQtPmNpcmN1aXRfaWQgIT0gaWZwLT5pZmluZGV4KSB7Ci0gICAgemxvZ193YXJuICgiY2hhbmdpbmcgY2lyY3VpdF9pZCAlZC0+JWQiLCBjaXJjdWl0LT5jaXJjdWl0X2lkLCAKLSAgICAgICAgICAgICAgIGlmcC0+aWZpbmRleCk7ICAgIAotICAgIGNpcmN1aXQtPmNpcmN1aXRfaWQgPSBpZnAtPmlmaW5kZXggJSAyNTU7IAotICB9CisKKyAgaWYgKGNpcmN1aXQtPmNpcmN1aXRfaWQgIT0gaWZwLT5pZmluZGV4KQorICAgIHsKKyAgICAgIHpsb2dfd2FybiAoImNoYW5naW5nIGNpcmN1aXRfaWQgJWQtPiVkIiwgY2lyY3VpdC0+Y2lyY3VpdF9pZCwKKwkJIGlmcC0+aWZpbmRleCk7CisgICAgICBjaXJjdWl0LT5jaXJjdWl0X2lkID0gaWZwLT5pZmluZGV4ICUgMjU1OworICAgIH0KIAogICAvKiBGSVhNRTogV2h5IGlzIHRoaXMgbmVlZGVkPyBzaG91bGRuJ3Qgd2UgY29tcGFyZSB0byB0aGUgYXJlYSdzIG10dSAqLwogICAvKiBPZmVyLCB0aGlzIHdhcyBoZXJlIGluIGNhc2Ugc29tZW9uZSBjaGFuZ2VzIHRoZSBtdHUgKGUuZy4gd2l0aCBpZmNvbmZpZykgCkBAIC0zNDEsMTI1ICszNjcsMTQxIEBACiAgICAgIGlmcC0+bXR1KTsgICAgCiAgICAgIGNpcmN1aXQtPm10dSA9IGlmcC0+bXR1OwogICAgICB9Ci0gICovCisgICAqLwogICAvKgogICAgKiBHZXQgdGhlIEhhcmR3YXJlIEFkZHJlc3MKICAgICovCiAjaWZkZWYgSEFWRV9TT0NLQUREUl9ETAogICBpZiAoY2lyY3VpdC0+aW50ZXJmYWNlLT5zZGwuc2RsX2FsZW4gIT0gRVRIRVJfQUREUl9MRU4pCi0gICAgICB6bG9nX3dhcm4gKCJ1bnN1cHBvcnRlZCBsaW5rIGxheWVyIik7Ci0gICAgZWxzZQotICAgICAgbWVtY3B5IChjaXJjdWl0LT51LmJjLnNucGEsIExMQUREUigmY2lyY3VpdC0+aW50ZXJmYWNlLT5zZGwpLCBFVEhfQUxFTik7Ci0jZWxzZQotICBpZiAoY2lyY3VpdC0+aW50ZXJmYWNlLT5od19hZGRyX2xlbiAhPSBFVEhfQUxFTikgewogICAgIHpsb2dfd2FybiAoInVuc3VwcG9ydGVkIGxpbmsgbGF5ZXIiKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAobWVtY21wKGNpcmN1aXQtPnUuYmMuc25wYSwgY2lyY3VpdC0+aW50ZXJmYWNlLT5od19hZGRyLCBFVEhfQUxFTikpIHsKLSAgICAgIHpsb2dfd2FybiAoImNoYW5naW5nIGNpcmN1aXQgc25wYSAlcy0+JXMiLCAKLQkJIHNucGFfcHJpbnQgKGNpcmN1aXQtPnUuYmMuc25wYSksIAotCQkgc25wYV9wcmludCAoY2lyY3VpdC0+aW50ZXJmYWNlLT5od19hZGRyKSk7CisgIGVsc2UKKyAgICBtZW1jcHkgKGNpcmN1aXQtPnUuYmMuc25wYSwgTExBRERSICgmY2lyY3VpdC0+aW50ZXJmYWNlLT5zZGwpLCBFVEhfQUxFTik7CisjZWxzZQorICBpZiAoY2lyY3VpdC0+aW50ZXJmYWNlLT5od19hZGRyX2xlbiAhPSBFVEhfQUxFTikKKyAgICB7CisgICAgICB6bG9nX3dhcm4gKCJ1bnN1cHBvcnRlZCBsaW5rIGxheWVyIik7CiAgICAgfQotICB9Ci0jZW5kaWYgCisgIGVsc2UKKyAgICB7CisgICAgICBpZiAobWVtY21wIChjaXJjdWl0LT51LmJjLnNucGEsIGNpcmN1aXQtPmludGVyZmFjZS0+aHdfYWRkciwgRVRIX0FMRU4pKQorCXsKKwkgIHpsb2dfd2FybiAoImNoYW5naW5nIGNpcmN1aXQgc25wYSAlcy0+JXMiLAorCQkgICAgIHNucGFfcHJpbnQgKGNpcmN1aXQtPnUuYmMuc25wYSksCisJCSAgICAgc25wYV9wcmludCAoY2lyY3VpdC0+aW50ZXJmYWNlLT5od19hZGRyKSk7CisJfQorICAgIH0KKyNlbmRpZgogCisgIGlmIChpZl9pc19icm9hZGNhc3QgKGlmcCkpCisgICAgeworICAgICAgY2lyY3VpdC0+Y2lyY190eXBlID0gQ0lSQ1VJVF9UX0JST0FEQ0FTVDsKKyAgICB9CisgIGVsc2UgaWYgKGlmX2lzX3BvaW50b3BvaW50IChpZnApKQorICAgIHsKKyAgICAgIGNpcmN1aXQtPmNpcmNfdHlwZSA9IENJUkNVSVRfVF9QMlA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgemxvZ193YXJuICgiaXNpc19jaXJjdWl0X3VwZGF0ZV9wYXJhbXM6IHVuc3VwcG9ydGVkIG1lZGlhIik7CisgICAgfQogCi0KLSAgaWYgKGlmX2lzX2Jyb2FkY2FzdCAoaWZwKSkgewotICAgIGNpcmN1aXQtPmNpcmNfdHlwZSA9IENJUkNVSVRfVF9CUk9BRENBU1Q7Ci0gIH0gZWxzZSBpZiAoaWZfaXNfcG9pbnRvcG9pbnQgKGlmcCkpIHsKLSAgICBjaXJjdWl0LT5jaXJjX3R5cGUgPSBDSVJDVUlUX1RfUDJQOwotICB9IGVsc2UgewotICAgIHpsb2dfd2FybiAoImlzaXNfY2lyY3VpdF91cGRhdGVfcGFyYW1zOiB1bnN1cHBvcnRlZCBtZWRpYSIpOwotICB9Ci0gIAogICByZXR1cm47CiB9CiAKIHZvaWQKLWlzaXNfY2lyY3VpdF9pZl9kZWwgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQpIAoraXNpc19jaXJjdWl0X2lmX2RlbCAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCkKIHsKICAgY2lyY3VpdC0+aW50ZXJmYWNlLT5pbmZvID0gTlVMTDsKICAgY2lyY3VpdC0+aW50ZXJmYWNlID0gTlVMTDsKLSAgCisKICAgcmV0dXJuOwogfQogCiB2b2lkCiBpc2lzX2NpcmN1aXRfdXAgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQpCiB7Ci0gIAotICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QpIHsKLSAgICBpZiAoY2lyY3VpdC0+YXJlYS0+bWluX2JjYXN0X210dSA9PSAwIHx8IAotICAgICAgICBJU09fTVRVKGNpcmN1aXQpIDwgY2lyY3VpdC0+YXJlYS0+bWluX2JjYXN0X210dSApCi0gICAgICBjaXJjdWl0LT5hcmVhLT5taW5fYmNhc3RfbXR1ID0gSVNPX01UVShjaXJjdWl0KTsKLSAgICAvKgotICAgICAqIElTTyAxMDU4OSAtIDguNC4xIEVuYWJsaW5nIG9mIGJyb2FkY2FzdCBjaXJjdWl0cwotICAgICAqLwogCi0gICAgLyogaW5pdGlsaXppbmcgdGhlIGhlbGxvIHNlbmRpbmcgdGhyZWFkcwotICAgICAqIGZvciBhIGJyb2FkY2FzdCBJRgotICAgICAqLworICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QpCisgICAgeworICAgICAgaWYgKGNpcmN1aXQtPmFyZWEtPm1pbl9iY2FzdF9tdHUgPT0gMCB8fAorCSAgSVNPX01UVSAoY2lyY3VpdCkgPCBjaXJjdWl0LT5hcmVhLT5taW5fYmNhc3RfbXR1KQorCWNpcmN1aXQtPmFyZWEtPm1pbl9iY2FzdF9tdHUgPSBJU09fTVRVIChjaXJjdWl0KTsKKyAgICAgIC8qCisgICAgICAgKiBJU08gMTA1ODkgLSA4LjQuMSBFbmFibGluZyBvZiBicm9hZGNhc3QgY2lyY3VpdHMKKyAgICAgICAqLwogCi0gICAgLyogOC40LjEgYSkgY29tbWVuY2Ugc2VuZGluZyBvZiBJSUggUERVcyAqLworICAgICAgLyogaW5pdGlsaXppbmcgdGhlIGhlbGxvIHNlbmRpbmcgdGhyZWFkcworICAgICAgICogZm9yIGEgYnJvYWRjYXN0IElGCisgICAgICAgKi8KIAotICAgIGlmIChjaXJjdWl0LT5jaXJjdWl0X2lzX3R5cGUgJiBJU19MRVZFTF8xKSB7Ci0gICAgICB0aHJlYWRfYWRkX2V2ZW50IChtYXN0ZXIsIHNlbmRfbGFuX2wxX2hlbGxvLCBjaXJjdWl0LCAwKTsKLSAgICAgIGNpcmN1aXQtPnUuYmMubGFuX25laWdoc1swXSA9IGxpc3RfbmV3ICgpOworICAgICAgLyogOC40LjEgYSkgY29tbWVuY2Ugc2VuZGluZyBvZiBJSUggUERVcyAqLworCisgICAgICBpZiAoY2lyY3VpdC0+Y2lyY3VpdF9pc190eXBlICYgSVNfTEVWRUxfMSkKKwl7CisJICB0aHJlYWRfYWRkX2V2ZW50IChtYXN0ZXIsIHNlbmRfbGFuX2wxX2hlbGxvLCBjaXJjdWl0LCAwKTsKKwkgIGNpcmN1aXQtPnUuYmMubGFuX25laWdoc1swXSA9IGxpc3RfbmV3ICgpOworCX0KKworICAgICAgaWYgKGNpcmN1aXQtPmNpcmN1aXRfaXNfdHlwZSAmIElTX0xFVkVMXzIpCisJeworCSAgdGhyZWFkX2FkZF9ldmVudCAobWFzdGVyLCBzZW5kX2xhbl9sMl9oZWxsbywgY2lyY3VpdCwgMCk7CisJICBjaXJjdWl0LT51LmJjLmxhbl9uZWlnaHNbMV0gPSBsaXN0X25ldyAoKTsKKwl9CisKKyAgICAgIC8qIDguNC4xIGIpIEZJWE1FOiBzb2xpY2l0IEVTIC0gOC40LjYgKi8KKyAgICAgIC8qIDguNC4xIGMpIEZJWE1FOiBsaXN0ZW4gZm9yIEVTSCBQRFVzICovCisKKyAgICAgIC8qIDguNC4xIGQpICovCisgICAgICAvKiBkciBlbGVjdGlvbiB3aWxsIGNvbW1lbmNlIGluLi4uICovCisgICAgICBpZiAoY2lyY3VpdC0+Y2lyY3VpdF9pc190eXBlICYgSVNfTEVWRUxfMSkKKwlUSFJFQURfVElNRVJfT04gKG1hc3RlciwgY2lyY3VpdC0+dS5iYy50X3J1bl9kclswXSwgaXNpc19ydW5fZHJfbDEsCisJCQkgY2lyY3VpdCwKKwkJCSAyICogY2lyY3VpdC0+aGVsbG9fbXVsdGlwbGllclswXSAqCisJCQkgY2lyY3VpdC0+aGVsbG9faW50ZXJ2YWxbMF0pOworICAgICAgaWYgKGNpcmN1aXQtPmNpcmN1aXRfaXNfdHlwZSAmIElTX0xFVkVMXzIpCisJVEhSRUFEX1RJTUVSX09OIChtYXN0ZXIsIGNpcmN1aXQtPnUuYmMudF9ydW5fZHJbMV0sIGlzaXNfcnVuX2RyX2wyLAorCQkJIGNpcmN1aXQsCisJCQkgMiAqIGNpcmN1aXQtPmhlbGxvX211bHRpcGxpZXJbMV0gKgorCQkJIGNpcmN1aXQtPmhlbGxvX2ludGVydmFsWzFdKTsKICAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBpbml0aWFsaXppbmcgdGhlIGhlbGxvIHNlbmQgdGhyZWFkcworICAgICAgICogZm9yIGEgcHRwIElGCisgICAgICAgKi8KKyAgICAgIHRocmVhZF9hZGRfZXZlbnQgKG1hc3Rlciwgc2VuZF9wMnBfaGVsbG8sIGNpcmN1aXQsIDApOwogCi0gICAgaWYgKGNpcmN1aXQtPmNpcmN1aXRfaXNfdHlwZSAmIElTX0xFVkVMXzIpIHsKLSAgICAgIHRocmVhZF9hZGRfZXZlbnQgKG1hc3Rlciwgc2VuZF9sYW5fbDJfaGVsbG8sIGNpcmN1aXQsIDApOwotICAgICAgY2lyY3VpdC0+dS5iYy5sYW5fbmVpZ2hzWzFdID0gbGlzdF9uZXcgKCk7CiAgICAgfQogCi0gICAgLyogOC40LjEgYikgRklYTUU6IHNvbGljaXQgRVMgLSA4LjQuNiAqLwotICAgIC8qIDguNC4xIGMpIEZJWE1FOiBsaXN0ZW4gZm9yIEVTSCBQRFVzICovCi0KLSAgICAvKiA4LjQuMSBkKSAqLwotICAgIC8qIGRyIGVsZWN0aW9uIHdpbGwgY29tbWVuY2UgaW4uLi4gKi8KLSAgICBpZiAoY2lyY3VpdC0+Y2lyY3VpdF9pc190eXBlICYgSVNfTEVWRUxfMSkgCi0gICAgICBUSFJFQURfVElNRVJfT04obWFzdGVyLCBjaXJjdWl0LT51LmJjLnRfcnVuX2RyWzBdLCBpc2lzX3J1bl9kcl9sMSwKLSAgICAgICAgICBjaXJjdWl0LAotICAgICAgICAyICogY2lyY3VpdC0+aGVsbG9fbXVsdGlwbGllclswXSAqIGNpcmN1aXQtPmhlbGxvX2ludGVydmFsWzBdKTsgCi0gICAgaWYgKGNpcmN1aXQtPmNpcmN1aXRfaXNfdHlwZSAmIElTX0xFVkVMXzIpIAotICAgICAgVEhSRUFEX1RJTUVSX09OKG1hc3RlciwgY2lyY3VpdC0+dS5iYy50X3J1bl9kclsxXSwgaXNpc19ydW5fZHJfbDIsCi0gICAgICAgICAgY2lyY3VpdCwKLSAgICAgICAyICogY2lyY3VpdC0+aGVsbG9fbXVsdGlwbGllclsxXSAqIGNpcmN1aXQtPmhlbGxvX2ludGVydmFsWzFdKTsgCi0gIH0gZWxzZSB7Ci0gICAgLyogaW5pdGlhbGl6aW5nIHRoZSBoZWxsbyBzZW5kIHRocmVhZHMKLSAgICAgKiBmb3IgYSBwdHAgSUYKLSAgICAgKi8KLSAgICB0aHJlYWRfYWRkX2V2ZW50IChtYXN0ZXIsIHNlbmRfcDJwX2hlbGxvLCBjaXJjdWl0LCAwKTsKLQotICB9Ci0KICAgLyogaW5pdGlhbGl6aW5nIFBTTlAgdGltZXJzICovCi0gIGlmIChjaXJjdWl0LT5jaXJjdWl0X2lzX3R5cGUgJiBJU19MRVZFTF8xKSB7Ci0gICAgVEhSRUFEX1RJTUVSX09OKG1hc3RlciwgY2lyY3VpdC0+dF9zZW5kX3BzbnBbMF0sIHNlbmRfbDFfcHNucCwgY2lyY3VpdCwKLSAgICAgICAgaXNpc19qaXR0ZXIoY2lyY3VpdC0+cHNucF9pbnRlcnZhbFswXSwgUFNOUF9KSVRURVIpKTsKLSAgfQotICAKLSAgaWYgKGNpcmN1aXQtPmNpcmN1aXRfaXNfdHlwZSAmIElTX0xFVkVMXzIpIHsKLSAgICBUSFJFQURfVElNRVJfT04obWFzdGVyLCBjaXJjdWl0LT50X3NlbmRfcHNucFsxXSwgc2VuZF9sMl9wc25wLCBjaXJjdWl0LAotICAgICAgICBpc2lzX2ppdHRlcihjaXJjdWl0LT5wc25wX2ludGVydmFsWzFdLCBQU05QX0pJVFRFUikpOwotICB9Ci0gIAorICBpZiAoY2lyY3VpdC0+Y2lyY3VpdF9pc190eXBlICYgSVNfTEVWRUxfMSkKKyAgICB7CisgICAgICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgY2lyY3VpdC0+dF9zZW5kX3BzbnBbMF0sIHNlbmRfbDFfcHNucCwgY2lyY3VpdCwKKwkJICAgICAgIGlzaXNfaml0dGVyIChjaXJjdWl0LT5wc25wX2ludGVydmFsWzBdLCBQU05QX0pJVFRFUikpOworICAgIH0KKworICBpZiAoY2lyY3VpdC0+Y2lyY3VpdF9pc190eXBlICYgSVNfTEVWRUxfMikKKyAgICB7CisgICAgICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgY2lyY3VpdC0+dF9zZW5kX3BzbnBbMV0sIHNlbmRfbDJfcHNucCwgY2lyY3VpdCwKKwkJICAgICAgIGlzaXNfaml0dGVyIChjaXJjdWl0LT5wc25wX2ludGVydmFsWzFdLCBQU05QX0pJVFRFUikpOworICAgIH0KKwogICAvKiBpbml0aWFsaXplIHRoZSBjaXJjdWl0IHN0cmVhbXMgKi8KICAgaWYgKGNpcmN1aXQtPnJjdl9zdHJlYW0gPT0gTlVMTCkKLSAgICBjaXJjdWl0LT5yY3Zfc3RyZWFtID0gc3RyZWFtX25ldyAoSVNPX01UVShjaXJjdWl0KSk7CisgICAgY2lyY3VpdC0+cmN2X3N0cmVhbSA9IHN0cmVhbV9uZXcgKElTT19NVFUgKGNpcmN1aXQpKTsKIAogICBpZiAoY2lyY3VpdC0+c25kX3N0cmVhbSA9PSBOVUxMKQotICAgIGNpcmN1aXQtPnNuZF9zdHJlYW0gPSBzdHJlYW1fbmV3IChJU09fTVRVKGNpcmN1aXQpKTsKKyAgICBjaXJjdWl0LT5zbmRfc3RyZWFtID0gc3RyZWFtX25ldyAoSVNPX01UVSAoY2lyY3VpdCkpOwogCiAgIC8qIHVuaWZpZWQgaW5pdCBmb3IgY2lyY3VpdHMgKi8KICAgaXNpc19zb2NrX2luaXQgKGNpcmN1aXQpOwogCiAjaWZkZWYgR05VX0xJTlVYCi0gIFRIUkVBRF9SRUFEX09OKG1hc3RlciwgY2lyY3VpdC0+dF9yZWFkLCBpc2lzX3JlY2VpdmUsIGNpcmN1aXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lyY3VpdC0+ZmQpOworICBUSFJFQURfUkVBRF9PTiAobWFzdGVyLCBjaXJjdWl0LT50X3JlYWQsIGlzaXNfcmVjZWl2ZSwgY2lyY3VpdCwKKwkJICBjaXJjdWl0LT5mZCk7CiAjZWxzZQotICBUSFJFQURfVElNRVJfT04obWFzdGVyLCBjaXJjdWl0LT50X3JlYWQsIGlzaXNfcmVjZWl2ZSwgY2lyY3VpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lyY3VpdC0+ZmQpOworICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgY2lyY3VpdC0+dF9yZWFkLCBpc2lzX3JlY2VpdmUsIGNpcmN1aXQsCisJCSAgIGNpcmN1aXQtPmZkKTsKICNlbmRpZgogICByZXR1cm47CiB9CkBAIC00NjcsMTUgKzUwOSwxOCBAQAogdm9pZAogaXNpc19jaXJjdWl0X2Rvd24gKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQpCiB7Ci0gIC8qIENhbmNlbCBhbGwgYWN0aXZlIHRocmVhZHMgLS0gRklYTUU6IHdyb25nIHBsYWNlKi8KKyAgLyogQ2FuY2VsIGFsbCBhY3RpdmUgdGhyZWFkcyAtLSBGSVhNRTogd3JvbmcgcGxhY2UgKi8KICAgLyogSFQ6IFJlYWQgdGhyZWFkIGlmIEdOVV9MSU5VWCwgVElNRVIgdGhyZWFkIG90aGVyd2lzZS4gKi8KLSAgVEhSRUFEX09GRihjaXJjdWl0LT50X3JlYWQpOwotICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QpIHsKLSAgICBUSFJFQURfVElNRVJfT0ZGKGNpcmN1aXQtPnUuYmMudF9zZW5kX2xhbl9oZWxsb1swXSk7Ci0gICAgVEhSRUFEX1RJTUVSX09GRihjaXJjdWl0LT51LmJjLnRfc2VuZF9sYW5faGVsbG9bMV0pOwotICB9IGVsc2UgaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSA9PSBDSVJDVUlUX1RfUDJQKSB7Ci0gICAgVEhSRUFEX1RJTUVSX09GRihjaXJjdWl0LT51LnAycC50X3NlbmRfcDJwX2hlbGxvKTsKLSAgfQorICBUSFJFQURfT0ZGIChjaXJjdWl0LT50X3JlYWQpOworICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QpCisgICAgeworICAgICAgVEhSRUFEX1RJTUVSX09GRiAoY2lyY3VpdC0+dS5iYy50X3NlbmRfbGFuX2hlbGxvWzBdKTsKKyAgICAgIFRIUkVBRF9USU1FUl9PRkYgKGNpcmN1aXQtPnUuYmMudF9zZW5kX2xhbl9oZWxsb1sxXSk7CisgICAgfQorICBlbHNlIGlmIChjaXJjdWl0LT5jaXJjX3R5cGUgPT0gQ0lSQ1VJVF9UX1AyUCkKKyAgICB7CisgICAgICBUSFJFQURfVElNRVJfT0ZGIChjaXJjdWl0LT51LnAycC50X3NlbmRfcDJwX2hlbGxvKTsKKyAgICB9CiAgIC8qIGNsb3NlIHRoZSBzb2NrZXQgKi8KICAgY2xvc2UgKGNpcmN1aXQtPmZkKTsKIApAQCAtNDg2LDIyICs1MzEsMjQgQEAKIGNpcmN1aXRfdXBkYXRlX25scGlkcyAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCkKIHsKICAgY2lyY3VpdC0+bmxwaWRzLmNvdW50ID0gMDsKLSAgCi0gIGlmIChjaXJjdWl0LT5pcF9yb3V0ZXIpIHsKLSAgICBjaXJjdWl0LT5ubHBpZHMubmxwaWRzWzBdID0gTkxQSURfSVA7Ci0gICAgY2lyY3VpdC0+bmxwaWRzLmNvdW50Kys7Ci0gIH0KKworICBpZiAoY2lyY3VpdC0+aXBfcm91dGVyKQorICAgIHsKKyAgICAgIGNpcmN1aXQtPm5scGlkcy5ubHBpZHNbMF0gPSBOTFBJRF9JUDsKKyAgICAgIGNpcmN1aXQtPm5scGlkcy5jb3VudCsrOworICAgIH0KICNpZmRlZiBIQVZFX0lQVjYKLSAgaWYgKGNpcmN1aXQtPmlwdjZfcm91dGVyKSB7Ci0gICAgY2lyY3VpdC0+bmxwaWRzLm5scGlkc1tjaXJjdWl0LT5ubHBpZHMuY291bnRdID0gTkxQSURfSVBWNjsKLSAgICBjaXJjdWl0LT5ubHBpZHMuY291bnQrKzsKLSAgfQorICBpZiAoY2lyY3VpdC0+aXB2Nl9yb3V0ZXIpCisgICAgeworICAgICAgY2lyY3VpdC0+bmxwaWRzLm5scGlkc1tjaXJjdWl0LT5ubHBpZHMuY291bnRdID0gTkxQSURfSVBWNjsKKyAgICAgIGNpcmN1aXQtPm5scGlkcy5jb3VudCsrOworICAgIH0KICNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KICAgcmV0dXJuOwogfQogCiBpbnQKLWlzaXNfaW50ZXJmYWNlX2NvbmZpZ193cml0ZSAoc3RydWN0IHZ0eSAqdnR5KSAKK2lzaXNfaW50ZXJmYWNlX2NvbmZpZ193cml0ZSAoc3RydWN0IHZ0eSAqdnR5KQogewogCiAgIGludCB3cml0ZSA9IDA7CkBAIC01MTksMTQ2ICs1NjYsMTk0IEBACiAKICAgY2hhciBidWZbQlVGU0laXTsKIAotCiAgIExJU1RfTE9PUCAoaWZsaXN0LCBpZnAsIG5vZGUpCiAgIHsKICAgICAvKiBJRiBuYW1lICovCi0gICAgdnR5X291dCAodnR5LCAiaW50ZXJmYWNlICVzJXMiLCBpZnAtPm5hbWUsVlRZX05FV0xJTkUpOworICAgIHZ0eV9vdXQgKHZ0eSwgImludGVyZmFjZSAlcyVzIiwgaWZwLT5uYW1lLCBWVFlfTkVXTElORSk7CiAgICAgd3JpdGUrKzsKICAgICAvKiBJRiBkZXNjICovCi0gICAgaWYgKGlmcC0+ZGVzYykgewotICAgICAgdnR5X291dCAodnR5LCAiIGRlc2NyaXB0aW9uICVzJXMiLCBpZnAtPmRlc2MsVlRZX05FV0xJTkUpOwotICAgICAgd3JpdGUrKzsKLSAgICB9CisgICAgaWYgKGlmcC0+ZGVzYykKKyAgICAgIHsKKwl2dHlfb3V0ICh2dHksICIgZGVzY3JpcHRpb24gJXMlcyIsIGlmcC0+ZGVzYywgVlRZX05FV0xJTkUpOworCXdyaXRlKys7CisgICAgICB9CiAgICAgLyogSVNJUyBDaXJjdWl0ICovCiAgICAgTElTVF9MT09QIChpc2lzLT5hcmVhX2xpc3QsIGFyZWEsIG5vZGUyKQogICAgIHsKICAgICAgIGMgPSBjaXJjdWl0X2xvb2t1cF9ieV9pZnAgKGlmcCwgYXJlYS0+Y2lyY3VpdF9saXN0KTsKLSAgICAgIGlmIChjKSB7Ci0gICAgICAgIGlmIChjLT5pcF9yb3V0ZXIpIHsKLSAgICAgICAgICB2dHlfb3V0ICh2dHksICIgaXAgcm91dGVyIGlzaXMgJXMlcyIsYXJlYS0+YXJlYV90YWcsVlRZX05FV0xJTkUpOwotICAgICAgICAgIHdyaXRlKys7Ci0gICAgICAgIH0KKyAgICAgIGlmIChjKQorCXsKKwkgIGlmIChjLT5pcF9yb3V0ZXIpCisJICAgIHsKKwkgICAgICB2dHlfb3V0ICh2dHksICIgaXAgcm91dGVyIGlzaXMgJXMlcyIsIGFyZWEtPmFyZWFfdGFnLAorCQkgICAgICAgVlRZX05FV0xJTkUpOworCSAgICAgIHdyaXRlKys7CisJICAgIH0KICNpZmRlZiBIQVZFX0lQVjYKLSAgICAgICAgaWYgKGMtPmlwdjZfcm91dGVyKSB7Ci0gICAgICAgICAgdnR5X291dCAodnR5LCAiIGlwdjYgcm91dGVyIGlzaXMgJXMlcyIsYXJlYS0+YXJlYV90YWcsVlRZX05FV0xJTkUpOwotICAgICAgICAgIHdyaXRlKys7Ci0gICAgICAgIH0KKwkgIGlmIChjLT5pcHY2X3JvdXRlcikKKwkgICAgeworCSAgICAgIHZ0eV9vdXQgKHZ0eSwgIiBpcHY2IHJvdXRlciBpc2lzICVzJXMiLCBhcmVhLT5hcmVhX3RhZywKKwkJICAgICAgIFZUWV9ORVdMSU5FKTsKKwkgICAgICB3cml0ZSsrOworCSAgICB9CiAjZW5kaWYgLyogSEFWRV9JUFY2ICovCiAKLSAgICAgICAgLyogSVNJUyAtIGNpcmN1aXQgdHlwZSAqLwotICAgICAgICBpZiAoYy0+Y2lyY3VpdF9pc190eXBlICA9PSBJU19MRVZFTF8xKSB7Ci0gICAgICAgICAgdnR5X291dCAodnR5LCAiIGlzaXMgY2lyY3VpdC10eXBlIGxldmVsLTElcyIsIFZUWV9ORVdMSU5FKTsKLSAgICAgICAgICB3cml0ZSArKzsKLSAgICAgICAgfSBlbHNlIHtpZiAoYy0+Y2lyY3VpdF9pc190eXBlICA9PSBJU19MRVZFTF8yKSB7Ci0gICAgICAgICAgdnR5X291dCAodnR5LCAiIGlzaXMgY2lyY3VpdC10eXBlIGxldmVsLTItb25seSVzIiwgVlRZX05FV0xJTkUpOwotICAgICAgICAgIHdyaXRlICsrOwotICAgICAgICB9fQorCSAgLyogSVNJUyAtIGNpcmN1aXQgdHlwZSAqLworCSAgaWYgKGMtPmNpcmN1aXRfaXNfdHlwZSA9PSBJU19MRVZFTF8xKQorCSAgICB7CisJICAgICAgdnR5X291dCAodnR5LCAiIGlzaXMgY2lyY3VpdC10eXBlIGxldmVsLTElcyIsIFZUWV9ORVdMSU5FKTsKKwkgICAgICB3cml0ZSsrOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoYy0+Y2lyY3VpdF9pc190eXBlID09IElTX0xFVkVMXzIpCisJCXsKKwkJICB2dHlfb3V0ICh2dHksICIgaXNpcyBjaXJjdWl0LXR5cGUgbGV2ZWwtMi1vbmx5JXMiLAorCQkJICAgVlRZX05FV0xJTkUpOworCQkgIHdyaXRlKys7CisJCX0KKwkgICAgfQogCi0gICAgICAgIC8qIElTSVMgLSBDU05QIGludGVydmFsIC0gRklYTUU6IGNvbXBhcmUgdG8gY2lzY28qLwotICAgICAgICBpZiAoYy0+Y3NucF9pbnRlcnZhbFswXSA9PSBjLT5jc25wX2ludGVydmFsWzFdKSB7Ci0gICAgICAgICAgaWYgKGMtPmNzbnBfaW50ZXJ2YWxbMF0gIT0gQ1NOUF9JTlRFUlZBTCkgewotICAgICAgICAgICAgdnR5X291dCAodnR5LCAiIGlzaXMgY3NucC1pbnRlcnZhbCAlZCVzIiwgIGMtPmNzbnBfaW50ZXJ2YWxbMF0sIAotCQkgICAgIFZUWV9ORVdMSU5FKTsKLSAgICAgICAgICAgIHdyaXRlICsrOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmb3IgKGk9MDtpPDI7aSsrKSB7Ci0gICAgICAgICAgICBpZiAoYy0+Y3NucF9pbnRlcnZhbFsxXSAhPSBDU05QX0lOVEVSVkFMKSB7Ci0gICAgICAgICAgICAgIHZ0eV9vdXQgKHZ0eSwgIiBpc2lzIGNzbnAtaW50ZXJ2YWwgJWQgbGV2ZWwtJWQlcyIsICAKLQkJICAgICAgIGMtPmNzbnBfaW50ZXJ2YWxbMV0saSsxLCBWVFlfTkVXTElORSk7Ci0gICAgICAgICAgICAgIHdyaXRlICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQorCSAgLyogSVNJUyAtIENTTlAgaW50ZXJ2YWwgLSBGSVhNRTogY29tcGFyZSB0byBjaXNjbyAqLworCSAgaWYgKGMtPmNzbnBfaW50ZXJ2YWxbMF0gPT0gYy0+Y3NucF9pbnRlcnZhbFsxXSkKKwkgICAgeworCSAgICAgIGlmIChjLT5jc25wX2ludGVydmFsWzBdICE9IENTTlBfSU5URVJWQUwpCisJCXsKKwkJICB2dHlfb3V0ICh2dHksICIgaXNpcyBjc25wLWludGVydmFsICVkJXMiLAorCQkJICAgYy0+Y3NucF9pbnRlcnZhbFswXSwgVlRZX05FV0xJTkUpOworCQkgIHdyaXRlKys7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJeworCQkgIGlmIChjLT5jc25wX2ludGVydmFsWzFdICE9IENTTlBfSU5URVJWQUwpCisJCSAgICB7CisJCSAgICAgIHZ0eV9vdXQgKHZ0eSwgIiBpc2lzIGNzbnAtaW50ZXJ2YWwgJWQgbGV2ZWwtJWQlcyIsCisJCQkgICAgICAgYy0+Y3NucF9pbnRlcnZhbFsxXSwgaSArIDEsIFZUWV9ORVdMSU5FKTsKKwkJICAgICAgd3JpdGUrKzsKKwkJICAgIH0KKwkJfQorCSAgICB9CiAKLSAgICAgICAgLyogSVNJUyAtIEhlbGxvIHBhZGRpbmcgLSBEZWZhdWx0cyB0byB0cnVlIHNvIG9ubHkgZGlzcGxheSBpZiBmYWxzZSAqLwotICAgICAgICBpZiAoYy0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QgJiYgIWMtPnUuYmMucGFkX2hlbGxvcykgewotICAgICAgICAgIHZ0eV9vdXQgKHZ0eSwgIiBubyBpc2lzIGhlbGxvIHBhZGRpbmclcyIsICBWVFlfTkVXTElORSk7Ci0gICAgICAgICAgd3JpdGUgKys7Ci0gICAgICAgIH0KKwkgIC8qIElTSVMgLSBIZWxsbyBwYWRkaW5nIC0gRGVmYXVsdHMgdG8gdHJ1ZSBzbyBvbmx5IGRpc3BsYXkgaWYgZmFsc2UgKi8KKwkgIGlmIChjLT5jaXJjX3R5cGUgPT0gQ0lSQ1VJVF9UX0JST0FEQ0FTVCAmJiAhYy0+dS5iYy5wYWRfaGVsbG9zKQorCSAgICB7CisJICAgICAgdnR5X291dCAodnR5LCAiIG5vIGlzaXMgaGVsbG8gcGFkZGluZyVzIiwgVlRZX05FV0xJTkUpOworCSAgICAgIHdyaXRlKys7CisJICAgIH0KIAotICAgICAgICAvKiBJU0lTIC0gSGVsbG8gaW50ZXJ2YWwgLSBGSVhNRTogY29tcGFyZSB0byBjaXNjbyAqLwotICAgICAgICBpZiAoYy0+aGVsbG9faW50ZXJ2YWxbMF0gPT0gYy0+aGVsbG9faW50ZXJ2YWxbMV0pIHsKLSAgICAgICAgICBpZiAoYy0+aGVsbG9faW50ZXJ2YWxbMF0gIT0gSEVMTE9fSU5URVJWQUwpIHsKLSAgICAgICAgICAgIHZ0eV9vdXQgKHZ0eSwgIiBpc2lzIGhlbGxvLWludGVydmFsICVkJXMiLCAgYy0+aGVsbG9faW50ZXJ2YWxbMF0sIAotCQkgICAgIFZUWV9ORVdMSU5FKTsKLSAgICAgICAgICAgIHdyaXRlICsrOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmb3IgKGk9MDtpPDI7aSsrKSB7Ci0gICAgICAgICAgICBpZiAoYy0+aGVsbG9faW50ZXJ2YWxbaV0gIT0gSEVMTE9fSU5URVJWQUwpIHsKLSAgICAgICAgICAgICAgaWYgKGMtPmhlbGxvX2ludGVydmFsW2ldID09IEhFTExPX01JTklNQUwpIHsKLSAgICAgICAgICAgICAgICB2dHlfb3V0ICh2dHksICIgaXNpcyBoZWxsby1pbnRlcnZhbCBtaW5pbWFsIGxldmVsLSVkJXMiLCBpKzEsIAotCQkJIFZUWV9ORVdMSU5FKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB2dHlfb3V0ICh2dHksICIgaXNpcyBoZWxsby1pbnRlcnZhbCAlZCBsZXZlbC0lZCVzIiwgIAotCQkJIGMtPmhlbGxvX2ludGVydmFsW2ldLGkrMSwgVlRZX05FV0xJTkUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIHdyaXRlICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQorCSAgLyogSVNJUyAtIEhlbGxvIGludGVydmFsIC0gRklYTUU6IGNvbXBhcmUgdG8gY2lzY28gKi8KKwkgIGlmIChjLT5oZWxsb19pbnRlcnZhbFswXSA9PSBjLT5oZWxsb19pbnRlcnZhbFsxXSkKKwkgICAgeworCSAgICAgIGlmIChjLT5oZWxsb19pbnRlcnZhbFswXSAhPSBIRUxMT19JTlRFUlZBTCkKKwkJeworCQkgIHZ0eV9vdXQgKHZ0eSwgIiBpc2lzIGhlbGxvLWludGVydmFsICVkJXMiLAorCQkJICAgYy0+aGVsbG9faW50ZXJ2YWxbMF0sIFZUWV9ORVdMSU5FKTsKKwkJICB3cml0ZSsrOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCXsKKwkJICBpZiAoYy0+aGVsbG9faW50ZXJ2YWxbaV0gIT0gSEVMTE9fSU5URVJWQUwpCisJCSAgICB7CisJCSAgICAgIGlmIChjLT5oZWxsb19pbnRlcnZhbFtpXSA9PSBIRUxMT19NSU5JTUFMKQorCQkJeworCQkJICB2dHlfb3V0ICh2dHksCisJCQkJICAgIiBpc2lzIGhlbGxvLWludGVydmFsIG1pbmltYWwgbGV2ZWwtJWQlcyIsCisJCQkJICAgaSArIDEsIFZUWV9ORVdMSU5FKTsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICB2dHlfb3V0ICh2dHksICIgaXNpcyBoZWxsby1pbnRlcnZhbCAlZCBsZXZlbC0lZCVzIiwKKwkJCQkgICBjLT5oZWxsb19pbnRlcnZhbFtpXSwgaSArIDEsIFZUWV9ORVdMSU5FKTsKKwkJCX0KKwkJICAgICAgd3JpdGUrKzsKKwkJICAgIH0KKwkJfQorCSAgICB9CiAKLSAgICAgICAgLyogSVNJUyAtIEhlbGxvIE11bHRpcGxpZXIgKi8KLSAgICAgICAgaWYgKGMtPmhlbGxvX211bHRpcGxpZXJbMF0gPT0gYy0+aGVsbG9fbXVsdGlwbGllclsxXSkgewotICAgICAgICAgIGlmIChjLT5oZWxsb19tdWx0aXBsaWVyWzBdICE9IEhFTExPX01VTFRJUExJRVIgKSB7Ci0gICAgICAgICAgICB2dHlfb3V0ICh2dHksICIgaXNpcyBoZWxsby1tdWx0aXBsaWVyICVkJXMiLCAgCi0JCSAgICAgYy0+aGVsbG9fbXVsdGlwbGllclswXSwgVlRZX05FV0xJTkUpOwotICAgICAgICAgICAgd3JpdGUgKys7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZvciAoaT0wO2k8MjtpKyspIHsKLSAgICAgICAgICAgIGlmIChjLT5oZWxsb19tdWx0aXBsaWVyW2ldICE9IEhFTExPX01VTFRJUExJRVIpIHsKLSAgICAgICAgICAgICAgdnR5X291dCAodnR5LCAiIGlzaXMgaGVsbG8tbXVsdGlwbGllciAlZCBsZXZlbC0lZCVzIiwgIAotCQkgICAgICAgYy0+aGVsbG9fbXVsdGlwbGllcltpXSxpKzEsIFZUWV9ORVdMSU5FKTsKLSAgICAgICAgICAgICAgd3JpdGUgKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIElTSVMgLSBQcmlvcml0eSAqLwotICAgICAgICBpZiAoYy0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QpIHsKLSAgICAgICAgICBpZiAoYy0+dS5iYy5wcmlvcml0eVswXSA9PSBjLT51LmJjLnByaW9yaXR5WzFdKSB7Ci0gICAgICAgICAgICBpZiAoYy0+dS5iYy5wcmlvcml0eVswXSAhPSBERUZBVUxUX1BSSU9SSVRZKSB7Ci0gICAgICAgICAgICAgIHZ0eV9vdXQgKHZ0eSwgIiBpc2lzIHByaW9yaXR5ICVkJXMiLCAgYy0+dS5iYy5wcmlvcml0eVswXSwgCi0gICAgICAgICAgICAgICAgICAgICAgIFZUWV9ORVdMSU5FKTsKLSAgICAgICAgICAgICAgd3JpdGUgKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaT0wO2k8MjtpKyspIHsKLSAgICAgICAgICAgICAgaWYgKGMtPnUuYmMucHJpb3JpdHlbaV0gIT0gREVGQVVMVF9QUklPUklUWSkgewotICAgICAgICAgICAgICAgIHZ0eV9vdXQgKHZ0eSwgIiBpc2lzIHByaW9yaXR5ICVkIGxldmVsLSVkJXMiLCAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgYy0+dS5iYy5wcmlvcml0eVtpXSxpKzEsIFZUWV9ORVdMSU5FKTsKLSAgICAgICAgICAgICAgICB3cml0ZSArKzsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBJU0lTIC0gTWV0cmljICovCi0gICAgICAgIGlmIChjLT5tZXRyaWNzWzBdLm1ldHJpY19kZWZhdWx0ID09IGMtPm1ldHJpY3NbMV0ubWV0cmljX2RlZmF1bHQpIHsKLSAgICAgICAgICBpZiAoYy0+bWV0cmljc1swXS5tZXRyaWNfZGVmYXVsdCAhPSBERUZBVUxUX0NJUkNVSVRfTUVUUklDUykgewotICAgICAgICAgICAgdnR5X291dCAodnR5LCAiIGlzaXMgbWV0cmljICVkJXMiLCAgYy0+bWV0cmljc1swXS5tZXRyaWNfZGVmYXVsdCwgCi0JCSAgICAgVlRZX05FV0xJTkUpOwotICAgICAgICAgICAgd3JpdGUgKys7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZvciAoaT0wO2k8MjtpKyspIHsKLSAgICAgICAgICAgIGlmIChjLT5tZXRyaWNzW2ldLm1ldHJpY19kZWZhdWx0ICE9IERFRkFVTFRfQ0lSQ1VJVF9NRVRSSUNTKSB7Ci0gICAgICAgICAgICAgIHZ0eV9vdXQgKHZ0eSwgIiBpc2lzIG1ldHJpYyAlZCBsZXZlbC0lZCVzIiwgIAotCQkgICAgICAgYy0+bWV0cmljc1tpXS5tZXRyaWNfZGVmYXVsdCxpKzEsIFZUWV9ORVdMSU5FKTsKLSAgICAgICAgICAgICAgd3JpdGUgKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9CisJICAvKiBJU0lTIC0gSGVsbG8gTXVsdGlwbGllciAqLworCSAgaWYgKGMtPmhlbGxvX211bHRpcGxpZXJbMF0gPT0gYy0+aGVsbG9fbXVsdGlwbGllclsxXSkKKwkgICAgeworCSAgICAgIGlmIChjLT5oZWxsb19tdWx0aXBsaWVyWzBdICE9IEhFTExPX01VTFRJUExJRVIpCisJCXsKKwkJICB2dHlfb3V0ICh2dHksICIgaXNpcyBoZWxsby1tdWx0aXBsaWVyICVkJXMiLAorCQkJICAgYy0+aGVsbG9fbXVsdGlwbGllclswXSwgVlRZX05FV0xJTkUpOworCQkgIHdyaXRlKys7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJeworCQkgIGlmIChjLT5oZWxsb19tdWx0aXBsaWVyW2ldICE9IEhFTExPX01VTFRJUExJRVIpCisJCSAgICB7CisJCSAgICAgIHZ0eV9vdXQgKHZ0eSwgIiBpc2lzIGhlbGxvLW11bHRpcGxpZXIgJWQgbGV2ZWwtJWQlcyIsCisJCQkgICAgICAgYy0+aGVsbG9fbXVsdGlwbGllcltpXSwgaSArIDEsIFZUWV9ORVdMSU5FKTsKKwkJICAgICAgd3JpdGUrKzsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJICAvKiBJU0lTIC0gUHJpb3JpdHkgKi8KKwkgIGlmIChjLT5jaXJjX3R5cGUgPT0gQ0lSQ1VJVF9UX0JST0FEQ0FTVCkKKwkgICAgeworCSAgICAgIGlmIChjLT51LmJjLnByaW9yaXR5WzBdID09IGMtPnUuYmMucHJpb3JpdHlbMV0pCisJCXsKKwkJICBpZiAoYy0+dS5iYy5wcmlvcml0eVswXSAhPSBERUZBVUxUX1BSSU9SSVRZKQorCQkgICAgeworCQkgICAgICB2dHlfb3V0ICh2dHksICIgaXNpcyBwcmlvcml0eSAlZCVzIiwKKwkJCSAgICAgICBjLT51LmJjLnByaW9yaXR5WzBdLCBWVFlfTkVXTElORSk7CisJCSAgICAgIHdyaXRlKys7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQkgICAgeworCQkgICAgICBpZiAoYy0+dS5iYy5wcmlvcml0eVtpXSAhPSBERUZBVUxUX1BSSU9SSVRZKQorCQkJeworCQkJICB2dHlfb3V0ICh2dHksICIgaXNpcyBwcmlvcml0eSAlZCBsZXZlbC0lZCVzIiwKKwkJCQkgICBjLT51LmJjLnByaW9yaXR5W2ldLCBpICsgMSwgVlRZX05FV0xJTkUpOworCQkJICB3cml0ZSsrOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0KKwkgIC8qIElTSVMgLSBNZXRyaWMgKi8KKwkgIGlmIChjLT5tZXRyaWNzWzBdLm1ldHJpY19kZWZhdWx0ID09IGMtPm1ldHJpY3NbMV0ubWV0cmljX2RlZmF1bHQpCisJICAgIHsKKwkgICAgICBpZiAoYy0+bWV0cmljc1swXS5tZXRyaWNfZGVmYXVsdCAhPSBERUZBVUxUX0NJUkNVSVRfTUVUUklDUykKKwkJeworCQkgIHZ0eV9vdXQgKHZ0eSwgIiBpc2lzIG1ldHJpYyAlZCVzIiwKKwkJCSAgIGMtPm1ldHJpY3NbMF0ubWV0cmljX2RlZmF1bHQsIFZUWV9ORVdMSU5FKTsKKwkJICB3cml0ZSsrOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCXsKKwkJICBpZiAoYy0+bWV0cmljc1tpXS5tZXRyaWNfZGVmYXVsdCAhPSBERUZBVUxUX0NJUkNVSVRfTUVUUklDUykKKwkJICAgIHsKKwkJICAgICAgdnR5X291dCAodnR5LCAiIGlzaXMgbWV0cmljICVkIGxldmVsLSVkJXMiLAorCQkJICAgICAgIGMtPm1ldHJpY3NbaV0ubWV0cmljX2RlZmF1bHQsIGkgKyAxLAorCQkJICAgICAgIFZUWV9ORVdMSU5FKTsKKwkJICAgICAgd3JpdGUrKzsKKwkJICAgIH0KKwkJfQorCSAgICB9CiAKLSAgICAgIH0KKwl9CiAgICAgfQotICAgIHZ0eV9vdXQgKHZ0eSwgIiElcyIsVlRZX05FV0xJTkUpOworICAgIHZ0eV9vdXQgKHZ0eSwgIiElcyIsIFZUWV9ORVdMSU5FKTsKICAgfQotICAKKwogICByZXR1cm4gd3JpdGU7CiB9Ci0gIAogCiBERUZVTiAoaXBfcm91dGVyX2lzaXMsCiAgICAgICAgaXBfcm91dGVyX2lzaXNfY21kLApAQCAtNjY2LDQ3ICs3NjEsNTEgQEAKICAgICAgICAiSW50ZXJmYWNlIEludGVybmV0IFByb3RvY29sIGNvbmZpZyBjb21tYW5kc1xuIgogICAgICAgICJJUCByb3V0ZXIgaW50ZXJmYWNlIGNvbW1hbmRzXG4iCiAgICAgICAgIklTLUlTIFJvdXRpbmcgZm9yIElQXG4iCi0gICAgICAgIlJvdXRpbmcgcHJvY2VzcyB0YWdcbiIKLSAgICAgICApCisgICAgICAgIlJvdXRpbmcgcHJvY2VzcyB0YWdcbiIpCiB7CiAgIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmM7CiAgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKICAgc3RydWN0IGlzaXNfYXJlYSAqYXJlYTsKLSAgCi0gIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopdnR5LT5pbmRleDsKKworICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OwogICBhc3NlcnQgKGlmcCk7Ci0gIAorCiAgIGFyZWEgPSBpc2lzX2FyZWFfbG9va3VwIChhcmd2WzBdKTsKIAogICAvKiBQcmV2ZW50IG1vcmUgdGhhbiBvbmUgY2lyY3VpdCBwZXIgaW50ZXJmYWNlICovCiAgIGlmIChhcmVhKQogICAgIGMgPSBjaXJjdWl0X2xvb2t1cF9ieV9pZnAgKGlmcCwgYXJlYS0+Y2lyY3VpdF9saXN0KTsKLSAgZWxzZSBjID0gTlVMTDsKLSAgaWYgKGMgJiYgKGlmcC0+aW5mbyAhPSBOVUxMKSkgeworICBlbHNlCisgICAgYyA9IE5VTEw7CisgIGlmIChjICYmIChpZnAtPmluZm8gIT0gTlVMTCkpCisgICAgewogI2lmZGVmIEhBVkVfSVBWNgotICAgIGlmIChjLT5pcHY2X3JvdXRlciA9PSAwKSB7CisgICAgICBpZiAoYy0+aXB2Nl9yb3V0ZXIgPT0gMCkKKwl7CiAjZW5kaWYgLyogSEFWRV9JUFY2ICovCi0gICAgICB2dHlfb3V0ICh2dHksICJJU0lTIGNpcmN1aXQgaXMgYWxyZWFkeSBkZWZpbmVkJXMiLCBWVFlfTkVXTElORSk7Ci0gICAgICByZXR1cm4gQ01EX1dBUk5JTkc7CisJICB2dHlfb3V0ICh2dHksICJJU0lTIGNpcmN1aXQgaXMgYWxyZWFkeSBkZWZpbmVkJXMiLCBWVFlfTkVXTElORSk7CisJICByZXR1cm4gQ01EX1dBUk5JTkc7CiAjaWZkZWYgSEFWRV9JUFY2CisJfQorI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwogICAgIH0KLSNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KLSAgfQotICAKKwogICAvKiB0aGlzIGlzIGhlcmUgZm9yIGNpc2NvcGFiaWxpdHkgKi8KLSAgaWYgKCFhcmVhKSB7Ci0gICAgdnR5X291dCAodnR5LCAiQ2FuJ3QgZmluZCBJU0lTIGluc3RhbmNlICVzIiwgVlRZX05FV0xJTkUpOwotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQorICBpZiAoIWFyZWEpCisgICAgeworICAgICAgdnR5X291dCAodnR5LCAiQ2FuJ3QgZmluZCBJU0lTIGluc3RhbmNlICVzIiwgVlRZX05FV0xJTkUpOworICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KIAotICBpZiAoIWMpIHsKLSAgICBjID0gY2lyY3VpdF9sb29rdXBfYnlfaWZwIChpZnAsIGlzaXMtPmluaXRfY2lyY19saXN0KTsgCi0gICAgYyA9IGlzaXNfY3NtX3N0YXRlX2NoYW5nZSAoSVNJU19FTkFCTEUsIGMsIGFyZWEpOwotICAgIGMtPmludGVyZmFjZSA9IGlmcDsgIC8qIHRoaXMgaXMgYXV0b21hdGljICovCi0gICAgaWZwLT5pbmZvID0gYzsgICAgICAgLyogaGFyZGx5IHJlbGF0ZWQgdG8gdGhlIEZTTSAqLwotICB9CisgIGlmICghYykKKyAgICB7CisgICAgICBjID0gY2lyY3VpdF9sb29rdXBfYnlfaWZwIChpZnAsIGlzaXMtPmluaXRfY2lyY19saXN0KTsKKyAgICAgIGMgPSBpc2lzX2NzbV9zdGF0ZV9jaGFuZ2UgKElTSVNfRU5BQkxFLCBjLCBhcmVhKTsKKyAgICAgIGMtPmludGVyZmFjZSA9IGlmcDsJLyogdGhpcyBpcyBhdXRvbWF0aWMgKi8KKyAgICAgIGlmcC0+aW5mbyA9IGM7CQkvKiBoYXJkbHkgcmVsYXRlZCB0byB0aGUgRlNNICovCisgICAgfQogCi0gIGlmKCFjKSAKKyAgaWYgKCFjKQogICAgIHJldHVybiBDTURfV0FSTklORzsKIAogICBjLT5pcF9yb3V0ZXIgPSAxOwpAQCAtNzE0LDcgKzgxMyw3IEBACiAgIGNpcmN1aXRfdXBkYXRlX25scGlkcyAoYyk7CiAKICAgdnR5LT5ub2RlID0gSU5URVJGQUNFX05PREU7Ci0gIAorCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KIApAQCAtNzI1LDM2ICs4MjQsMzcgQEAKICAgICAgICAiSW50ZXJmYWNlIEludGVybmV0IFByb3RvY29sIGNvbmZpZyBjb21tYW5kc1xuIgogICAgICAgICJJUCByb3V0ZXIgaW50ZXJmYWNlIGNvbW1hbmRzXG4iCiAgICAgICAgIklTLUlTIFJvdXRpbmcgZm9yIElQXG4iCi0gICAgICAgIlJvdXRpbmcgcHJvY2VzcyB0YWdcbiIKLSAgICAgICApIAorICAgICAgICJSb3V0aW5nIHByb2Nlc3MgdGFnXG4iKQogewogICBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0ID0gTlVMTDsKICAgc3RydWN0IGludGVyZmFjZSAqaWZwOwogICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOwogICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAKLSAgaWZwID0gKHN0cnVjdCBpbnRlcmZhY2UgKil2dHktPmluZGV4OworICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OwogICBhc3NlcnQgKGlmcCk7Ci0gIAorCiAgIGFyZWEgPSBpc2lzX2FyZWFfbG9va3VwIChhcmd2WzBdKTsKLSAgaWYgKCFhcmVhKSB7Ci0gICAgdnR5X291dCAodnR5LCAiQ2FuJ3QgZmluZCBJU0lTIGluc3RhbmNlICVzIiwgVlRZX05FV0xJTkUpOwotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQorICBpZiAoIWFyZWEpCisgICAgeworICAgICAgdnR5X291dCAodnR5LCAiQ2FuJ3QgZmluZCBJU0lTIGluc3RhbmNlICVzIiwgVlRZX05FV0xJTkUpOworICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KICAgTElTVF9MT09QIChhcmVhLT5jaXJjdWl0X2xpc3QsIGNpcmN1aXQsIG5vZGUpCiAgICAgaWYgKGNpcmN1aXQtPmludGVyZmFjZSA9PSBpZnApCiAgICAgICBicmVhazsKLSAgaWYgKCFjaXJjdWl0KSB7Ci0gICAgdnR5X291dCAodnR5LCAiQ2FuJ3QgZmluZCBJU0lTIGludGVyZmFjZSAlcyIsIFZUWV9ORVdMSU5FKTsKLSAgICByZXR1cm4gQ01EX1dBUk5JTkc7Ci0gIH0KKyAgaWYgKCFjaXJjdWl0KQorICAgIHsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIkNhbid0IGZpbmQgSVNJUyBpbnRlcmZhY2UgJXMiLCBWVFlfTkVXTElORSk7CisgICAgICByZXR1cm4gQ01EX1dBUk5JTkc7CisgICAgfQogICBjaXJjdWl0LT5pcF9yb3V0ZXIgPSAwOwogICBhcmVhLT5pcF9jaXJjdWl0cy0tOwogI2lmZGVmIEhBVkVfSVBWNgogICBpZiAoY2lyY3VpdC0+aXB2Nl9yb3V0ZXIgPT0gMCkKICNlbmRpZgogICAgIGlzaXNfY3NtX3N0YXRlX2NoYW5nZSAoSVNJU19ESVNBQkxFLCBjaXJjdWl0LCBhcmVhKTsKLSAgCisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC03NjUsMzggKzg2NSw0MCBAQAogICAgICAgICJDb25maWd1cmUgY2lyY3VpdCB0eXBlIGZvciBpbnRlcmZhY2VcbiIKICAgICAgICAiTGV2ZWwtMSBvbmx5IGFkamFjZW5jaWVzIGFyZSBmb3JtZWRcbiIKICAgICAgICAiTGV2ZWwtMS0yIGFkamFjZW5jaWVzIGFyZSBmb3JtZWRcbiIKLSAgICAgICAiTGV2ZWwtMiBvbmx5IGFkamFjZW5jaWVzIGFyZSBmb3JtZWRcbiIKLSAgICAgICApCisgICAgICAgIkxldmVsLTIgb25seSBhZGphY2VuY2llcyBhcmUgZm9ybWVkXG4iKQogewogICBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0OwogICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CiAgIGludCBjaXJjdWl0X3Q7CiAgIGludCBpc190eXBlOwotICAKLSAgaWZwICA9IHZ0eS0+aW5kZXg7CisKKyAgaWZwID0gdnR5LT5pbmRleDsKICAgY2lyY3VpdCA9IGlmcC0+aW5mbzsKICAgLyogVUdMWSAtIHdpbGwgcmVtb3ZlIGw4ciAqLwotICBpZiAoY2lyY3VpdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIENNRF9XQVJOSU5HOwotICB9CisgIGlmIChjaXJjdWl0ID09IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KIAogICBhc3NlcnQgKGNpcmN1aXQpOwogCiAgIGNpcmN1aXRfdCA9IHN0cmluZzJjaXJjdWl0X3QgKGFyZ3ZbMF0pOwogCi0gIGlmICghY2lyY3VpdF90KSB7IAotICAgIHZ0eV9vdXQgKHZ0eSwgIlVua25vd24gY2lyY3VpdC10eXBlICVzIiwgVlRZX05FV0xJTkUpOwotICAgIHJldHVybiBDTURfU1VDQ0VTUzsKLSAgfQotICAKKyAgaWYgKCFjaXJjdWl0X3QpCisgICAgeworICAgICAgdnR5X291dCAodnR5LCAiVW5rbm93biBjaXJjdWl0LXR5cGUgJXMiLCBWVFlfTkVXTElORSk7CisgICAgICByZXR1cm4gQ01EX1NVQ0NFU1M7CisgICAgfQorCiAgIGlzX3R5cGUgPSBjaXJjdWl0LT5hcmVhLT5pc190eXBlOwogICBpZiAoaXNfdHlwZSA9PSBJU19MRVZFTF8xX0FORF8yIHx8IGlzX3R5cGUgPT0gY2lyY3VpdF90KQotICAgaXNpc19ldmVudF9jaXJjdWl0X3R5cGVfY2hhbmdlIChjaXJjdWl0LCBjaXJjdWl0X3QpOwotICBlbHNlIHsKLSAgICB2dHlfb3V0ICh2dHksICJpbnZhbGlkIGNpcmN1aXQgbGV2ZWwgZm9yIGFyZWEgJXMuJXMiLCAKLQkgICAgIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLCBWVFlfTkVXTElORSk7Ci0gIH0KLSAgCisgICAgaXNpc19ldmVudF9jaXJjdWl0X3R5cGVfY2hhbmdlIChjaXJjdWl0LCBjaXJjdWl0X3QpOworICBlbHNlCisgICAgeworICAgICAgdnR5X291dCAodnR5LCAiaW52YWxpZCBjaXJjdWl0IGxldmVsIGZvciBhcmVhICVzLiVzIiwKKwkgICAgICAgY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsIFZUWV9ORVdMSU5FKTsKKyAgICB9CisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC04MDgsMjUgKzkxMCwyNSBAQAogICAgICAgICJDb25maWd1cmUgY2lyY3VpdCB0eXBlIGZvciBpbnRlcmZhY2VcbiIKICAgICAgICAiTGV2ZWwtMSBvbmx5IGFkamFjZW5jaWVzIGFyZSBmb3JtZWRcbiIKICAgICAgICAiTGV2ZWwtMS0yIGFkamFjZW5jaWVzIGFyZSBmb3JtZWRcbiIKLSAgICAgICAiTGV2ZWwtMiBvbmx5IGFkamFjZW5jaWVzIGFyZSBmb3JtZWRcbiIKLSAgICAgICApCisgICAgICAgIkxldmVsLTIgb25seSBhZGphY2VuY2llcyBhcmUgZm9ybWVkXG4iKQogewogICBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0OwogICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7Ci0gIAotICBpZnAgID0gdnR5LT5pbmRleDsKLSAgY2lyY3VpdCA9IGlmcC0+aW5mbzsKLSAgaWYgKGNpcmN1aXQgPT0gTlVMTCkgewotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQogCi0gIGFzc2VydChjaXJjdWl0KTsKLSAgCisgIGlmcCA9IHZ0eS0+aW5kZXg7CisgIGNpcmN1aXQgPSBpZnAtPmluZm87CisgIGlmIChjaXJjdWl0ID09IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KKworICBhc3NlcnQgKGNpcmN1aXQpOworCiAgIC8qCiAgICAqIFNldCB0aGUgY2lyY3VpdHMgbGV2ZWwgdG8gaXRzIGRlZmF1bHQgdmFsdWUgd2hpY2ggaXMgdGhhdCBvZiB0aGUgYXJlYQogICAgKi8KICAgaXNpc19ldmVudF9jaXJjdWl0X3R5cGVfY2hhbmdlIChjaXJjdWl0LCBjaXJjdWl0LT5hcmVhLT5pc190eXBlKTsKLSAgCisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC04NDAsMjIgKzk0MiwyNCBAQAogICBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0OwogICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CiAgIGludCBsZW47Ci0gCi0gIGlmcCAgPSB2dHktPmluZGV4OworCisgIGlmcCA9IHZ0eS0+aW5kZXg7CiAgIGNpcmN1aXQgPSBpZnAtPmluZm87Ci0gIGlmIChjaXJjdWl0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gQ01EX1dBUk5JTkc7Ci0gIH0KLSAgCisgIGlmIChjaXJjdWl0ID09IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KKwogICBsZW4gPSBzdHJsZW4gKGFyZ3ZbMF0pOwotICBpZiAobGVuID4gMjU0KSB7Ci0gICAgdnR5X291dCAodnR5LCAiVG9vIGxvbmcgY2lyY3VpdCBwYXNzd29yZCAoPjI1NCklcyIsIFZUWV9ORVdMSU5FKTsKLSAgICByZXR1cm4gQ01EX1dBUk5JTkc7Ci0gIH0KKyAgaWYgKGxlbiA+IDI1NCkKKyAgICB7CisgICAgICB2dHlfb3V0ICh2dHksICJUb28gbG9uZyBjaXJjdWl0IHBhc3N3b3JkICg+MjU0KSVzIiwgVlRZX05FV0xJTkUpOworICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KICAgY2lyY3VpdC0+cGFzc3dkLmxlbiA9IGxlbjsKICAgY2lyY3VpdC0+cGFzc3dkLnR5cGUgPSBJU0lTX1BBU1NXRF9UWVBFX0NMRUFSVFhUOwogICBzdHJuY3B5IChjaXJjdWl0LT5wYXNzd2QucGFzc3dkLCBhcmd2WzBdLCAyNTUpOwotICAKKwogICByZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKQEAgLTg2OCwxNSArOTcyLDE2IEBACiB7CiAgIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQ7CiAgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKLSAgCi0gIGlmcCAgPSB2dHktPmluZGV4OworCisgIGlmcCA9IHZ0eS0+aW5kZXg7CiAgIGNpcmN1aXQgPSBpZnAtPmluZm87Ci0gIGlmIChjaXJjdWl0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gQ01EX1dBUk5JTkc7Ci0gIH0KLSAgICAKKyAgaWYgKGNpcmN1aXQgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm4gQ01EX1dBUk5JTkc7CisgICAgfQorCiAgIG1lbXNldCAoJmNpcmN1aXQtPnBhc3N3ZCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaXNpc19wYXNzd2QpKTsKLSAgCisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC04ODYsMjUgKzk5MSwyNSBAQAogICAgICAgICJpc2lzIHByaW9yaXR5IDwwLTEyNz4iLAogICAgICAgICJJUy1JUyBjb21tYW5kc1xuIgogICAgICAgICJTZXQgcHJpb3JpdHkgZm9yIERlc2lnbmF0ZWQgUm91dGVyIGVsZWN0aW9uXG4iCi0gICAgICAgIlByaW9yaXR5IHZhbHVlXG4iCi0gICAgICAgKQorICAgICAgICJQcmlvcml0eSB2YWx1ZVxuIikKIHsKICAgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdDsKICAgc3RydWN0IGludGVyZmFjZSAqaWZwOwogICBpbnQgcHJpbzsKLSAgCi0gIGlmcCAgPSB2dHktPmluZGV4OworCisgIGlmcCA9IHZ0eS0+aW5kZXg7CiAgIGNpcmN1aXQgPSBpZnAtPmluZm87Ci0gIGlmIChjaXJjdWl0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gQ01EX1dBUk5JTkc7Ci0gIH0KKyAgaWYgKGNpcmN1aXQgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm4gQ01EX1dBUk5JTkc7CisgICAgfQogICBhc3NlcnQgKGNpcmN1aXQpOwogCiAgIHByaW8gPSBhdG9pIChhcmd2WzBdKTsKIAogICBjaXJjdWl0LT51LmJjLnByaW9yaXR5WzBdID0gcHJpbzsKICAgY2lyY3VpdC0+dS5iYy5wcmlvcml0eVsxXSA9IHByaW87Ci0gIAorCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KIApAQCAtOTEzLDIyICsxMDE4LDIyIEBACiAgICAgICAgIm5vIGlzaXMgcHJpb3JpdHkiLAogICAgICAgIE5PX1NUUgogICAgICAgICJJUy1JUyBjb21tYW5kc1xuIgotICAgICAgICJTZXQgcHJpb3JpdHkgZm9yIERlc2lnbmF0ZWQgUm91dGVyIGVsZWN0aW9uXG4iCi0gICAgICAgKQorICAgICAgICJTZXQgcHJpb3JpdHkgZm9yIERlc2lnbmF0ZWQgUm91dGVyIGVsZWN0aW9uXG4iKQogewogICBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0OwogICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CiAKLSAgaWZwICA9IHZ0eS0+aW5kZXg7CisgIGlmcCA9IHZ0eS0+aW5kZXg7CiAgIGNpcmN1aXQgPSBpZnAtPmluZm87Ci0gIGlmIChjaXJjdWl0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gQ01EX1dBUk5JTkc7Ci0gIH0KKyAgaWYgKGNpcmN1aXQgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm4gQ01EX1dBUk5JTkc7CisgICAgfQogICBhc3NlcnQgKGNpcmN1aXQpOwogCiAgIGNpcmN1aXQtPnUuYmMucHJpb3JpdHlbMF0gPSBERUZBVUxUX1BSSU9SSVRZOwogICBjaXJjdWl0LT51LmJjLnByaW9yaXR5WzFdID0gREVGQVVMVF9QUklPUklUWTsKLSAgCisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC05MzgsMzMgKzEwNDMsMzIgQEAKICAgICAgICBOT19TVFIKICAgICAgICAiSVMtSVMgY29tbWFuZHNcbiIKICAgICAgICAiU2V0IHByaW9yaXR5IGZvciBEZXNpZ25hdGVkIFJvdXRlciBlbGVjdGlvblxuIgotICAgICAgICJQcmlvcml0eSB2YWx1ZVxuIgotICAgICAgICkKKyAgICAgICAiUHJpb3JpdHkgdmFsdWVcbiIpCiAKIERFRlVOIChpc2lzX3ByaW9yaXR5X2wxLAogICAgICAgIGlzaXNfcHJpb3JpdHlfbDFfY21kLAotICAgICAgICJpc2lzIHByaW9yaXR5IDwwLTEyNz4gbGV2ZWwtMSIsIAorICAgICAgICJpc2lzIHByaW9yaXR5IDwwLTEyNz4gbGV2ZWwtMSIsCiAgICAgICAgIklTLUlTIGNvbW1hbmRzXG4iCiAgICAgICAgIlNldCBwcmlvcml0eSBmb3IgRGVzaWduYXRlZCBSb3V0ZXIgZWxlY3Rpb25cbiIKICAgICAgICAiUHJpb3JpdHkgdmFsdWVcbiIKLSAgICAgICAiU3BlY2lmeSBwcmlvcml0eSBmb3IgbGV2ZWwtMSByb3V0aW5nXG4iCi0gICAgICAgKQorICAgICAgICJTcGVjaWZ5IHByaW9yaXR5IGZvciBsZXZlbC0xIHJvdXRpbmdcbiIpCiB7CiAgIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQ7CiAgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKICAgaW50IHByaW87Ci0gIAotICBpZnAgID0gdnR5LT5pbmRleDsKKworICBpZnAgPSB2dHktPmluZGV4OwogICBjaXJjdWl0ID0gaWZwLT5pbmZvOwotICBpZiAoY2lyY3VpdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIENNRF9XQVJOSU5HOwotICB9CisgIGlmIChjaXJjdWl0ID09IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KICAgYXNzZXJ0IChjaXJjdWl0KTsKIAogICBwcmlvID0gYXRvaSAoYXJndlswXSk7CiAKICAgY2lyY3VpdC0+dS5iYy5wcmlvcml0eVswXSA9IHByaW87Ci0gIAorCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KIApAQCAtOTc0LDIxICsxMDc4LDIxIEBACiAgICAgICAgTk9fU1RSCiAgICAgICAgIklTLUlTIGNvbW1hbmRzXG4iCiAgICAgICAgIlNldCBwcmlvcml0eSBmb3IgRGVzaWduYXRlZCBSb3V0ZXIgZWxlY3Rpb25cbiIKLSAgICAgICAiU3BlY2lmeSBwcmlvcml0eSBmb3IgbGV2ZWwtMSByb3V0aW5nXG4iCi0gICAgICAgKQorICAgICAgICJTcGVjaWZ5IHByaW9yaXR5IGZvciBsZXZlbC0xIHJvdXRpbmdcbiIpCiB7CiAgIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQ7CiAgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKLSAgCi0gIGlmcCAgPSB2dHktPmluZGV4OworCisgIGlmcCA9IHZ0eS0+aW5kZXg7CiAgIGNpcmN1aXQgPSBpZnAtPmluZm87Ci0gIGlmIChjaXJjdWl0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gQ01EX1dBUk5JTkc7Ci0gIH0KKyAgaWYgKGNpcmN1aXQgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm4gQ01EX1dBUk5JTkc7CisgICAgfQogICBhc3NlcnQgKGNpcmN1aXQpOwotICAKKwogICBjaXJjdWl0LT51LmJjLnByaW9yaXR5WzBdID0gREVGQVVMVF9QUklPUklUWTsKLSAgCisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC05OTksMzMgKzExMDMsMzIgQEAKICAgICAgICAiSVMtSVMgY29tbWFuZHNcbiIKICAgICAgICAiU2V0IHByaW9yaXR5IGZvciBEZXNpZ25hdGVkIFJvdXRlciBlbGVjdGlvblxuIgogICAgICAgICJQcmlvcml0eSB2YWx1ZVxuIgotICAgICAgICJTcGVjaWZ5IHByaW9yaXR5IGZvciBsZXZlbC0xIHJvdXRpbmdcbiIKLSAgICAgICApCisgICAgICAgIlNwZWNpZnkgcHJpb3JpdHkgZm9yIGxldmVsLTEgcm91dGluZ1xuIikKIAogREVGVU4gKGlzaXNfcHJpb3JpdHlfbDIsCiAgICAgICAgaXNpc19wcmlvcml0eV9sMl9jbWQsCi0gICAgICAgImlzaXMgcHJpb3JpdHkgPDAtMTI3PiBsZXZlbC0yIiwgCisgICAgICAgImlzaXMgcHJpb3JpdHkgPDAtMTI3PiBsZXZlbC0yIiwKICAgICAgICAiSVMtSVMgY29tbWFuZHNcbiIKICAgICAgICAiU2V0IHByaW9yaXR5IGZvciBEZXNpZ25hdGVkIFJvdXRlciBlbGVjdGlvblxuIgogICAgICAgICJQcmlvcml0eSB2YWx1ZVxuIgotICAgICAgICJTcGVjaWZ5IHByaW9yaXR5IGZvciBsZXZlbC0yIHJvdXRpbmdcbiIKLSAgICAgICApCisgICAgICAgIlNwZWNpZnkgcHJpb3JpdHkgZm9yIGxldmVsLTIgcm91dGluZ1xuIikKIHsKICAgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdDsKICAgc3RydWN0IGludGVyZmFjZSAqaWZwOwogICBpbnQgcHJpbzsKLSAgCi0gIGlmcCAgPSB2dHktPmluZGV4OworCisgIGlmcCA9IHZ0eS0+aW5kZXg7CiAgIGNpcmN1aXQgPSBpZnAtPmluZm87Ci0gIGlmIChjaXJjdWl0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gQ01EX1dBUk5JTkc7Ci0gIH0KKyAgaWYgKGNpcmN1aXQgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm4gQ01EX1dBUk5JTkc7CisgICAgfQogICBhc3NlcnQgKGNpcmN1aXQpOwogCiAgIHByaW8gPSBhdG9pIChhcmd2WzBdKTsKIAogICBjaXJjdWl0LT51LmJjLnByaW9yaXR5WzFdID0gcHJpbzsKLSAgCisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC0xMDM1LDIxICsxMTM4LDIxIEBACiAgICAgICAgTk9fU1RSCiAgICAgICAgIklTLUlTIGNvbW1hbmRzXG4iCiAgICAgICAgIlNldCBwcmlvcml0eSBmb3IgRGVzaWduYXRlZCBSb3V0ZXIgZWxlY3Rpb25cbiIKLSAgICAgICAiU3BlY2lmeSBwcmlvcml0eSBmb3IgbGV2ZWwtMiByb3V0aW5nXG4iCi0gICAgICAgKQorICAgICAgICJTcGVjaWZ5IHByaW9yaXR5IGZvciBsZXZlbC0yIHJvdXRpbmdcbiIpCiB7CiAgIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQ7CiAgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKLSAgCi0gIGlmcCAgPSB2dHktPmluZGV4OworCisgIGlmcCA9IHZ0eS0+aW5kZXg7CiAgIGNpcmN1aXQgPSBpZnAtPmluZm87Ci0gIGlmIChjaXJjdWl0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gQ01EX1dBUk5JTkc7Ci0gIH0KKyAgaWYgKGNpcmN1aXQgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm4gQ01EX1dBUk5JTkc7CisgICAgfQogICBhc3NlcnQgKGNpcmN1aXQpOwotICAKKwogICBjaXJjdWl0LT51LmJjLnByaW9yaXR5WzFdID0gREVGQVVMVF9QUklPUklUWTsKLSAgCisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC0xMDYwLDI4ICsxMTYzLDI2IEBACiAgICAgICAgIklTLUlTIGNvbW1hbmRzXG4iCiAgICAgICAgIlNldCBwcmlvcml0eSBmb3IgRGVzaWduYXRlZCBSb3V0ZXIgZWxlY3Rpb25cbiIKICAgICAgICAiUHJpb3JpdHkgdmFsdWVcbiIKLSAgICAgICAiU3BlY2lmeSBwcmlvcml0eSBmb3IgbGV2ZWwtMiByb3V0aW5nXG4iCi0gICAgICAgKQorICAgICAgICJTcGVjaWZ5IHByaW9yaXR5IGZvciBsZXZlbC0yIHJvdXRpbmdcbiIpCiAKIC8qIE1ldHJpYyBjb21tYW5kICovCi0KLURFRlVOIChpc2lzX21ldHJpYywKKyAgREVGVU4gKGlzaXNfbWV0cmljLAogICAgICAgIGlzaXNfbWV0cmljX2NtZCwKICAgICAgICAiaXNpcyBtZXRyaWMgPDAtNjM+IiwKICAgICAgICAiSVMtSVMgY29tbWFuZHNcbiIKICAgICAgICAiU2V0IGRlZmF1bHQgbWV0cmljIGZvciBjaXJjdWl0XG4iCi0gICAgICAgIkRlZmF1bHQgbWV0cmljIHZhbHVlXG4iCi0gICAgICAgKQorICAgICAgICJEZWZhdWx0IG1ldHJpYyB2YWx1ZVxuIikKIHsKICAgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdDsKICAgc3RydWN0IGludGVyZmFjZSAqaWZwOwogICBpbnQgbWV0OwogCi0gIGlmcCAgPSB2dHktPmluZGV4OworICBpZnAgPSB2dHktPmluZGV4OwogICBjaXJjdWl0ID0gaWZwLT5pbmZvOwotICBpZiAoY2lyY3VpdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIENNRF9XQVJOSU5HOwotICB9CisgIGlmIChjaXJjdWl0ID09IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KICAgYXNzZXJ0IChjaXJjdWl0KTsKIAogICBtZXQgPSBhdG9pIChhcmd2WzBdKTsKQEAgLTEwOTcsMTcgKzExOTgsMTcgQEAKICAgICAgICAibm8gaXNpcyBtZXRyaWMiLAogICAgICAgIE5PX1NUUgogICAgICAgICJJUy1JUyBjb21tYW5kc1xuIgotICAgICAgICJTZXQgZGVmYXVsdCBtZXRyaWMgZm9yIGNpcmN1aXRcbiIKLSAgICAgICApCisgICAgICAgIlNldCBkZWZhdWx0IG1ldHJpYyBmb3IgY2lyY3VpdFxuIikKIHsKICAgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdDsKICAgc3RydWN0IGludGVyZmFjZSAqaWZwOwogCi0gIGlmcCAgPSB2dHktPmluZGV4OworICBpZnAgPSB2dHktPmluZGV4OwogICBjaXJjdWl0ID0gaWZwLT5pbmZvOwotICBpZiAoY2lyY3VpdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIENNRF9XQVJOSU5HOwotICB9CisgIGlmIChjaXJjdWl0ID09IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KICAgYXNzZXJ0IChjaXJjdWl0KTsKIAogICBjaXJjdWl0LT5tZXRyaWNzWzBdLm1ldHJpY19kZWZhdWx0ID0gREVGQVVMVF9DSVJDVUlUX01FVFJJQ1M7CkBAIC0xMTIyLDQwICsxMjIzLDQwIEBACiAgICAgICAgTk9fU1RSCiAgICAgICAgIklTLUlTIGNvbW1hbmRzXG4iCiAgICAgICAgIlNldCBkZWZhdWx0IG1ldHJpYyBmb3IgY2lyY3VpdFxuIgotICAgICAgICJEZWZhdWx0IG1ldHJpYyB2YWx1ZVxuIgotICAgICAgICkKKyAgICAgICAiRGVmYXVsdCBtZXRyaWMgdmFsdWVcbiIpCisKIC8qIGVuZCBvZiBtZXRyaWNzICovCi0KLQotREVGVU4gKGlzaXNfaGVsbG9faW50ZXJ2YWwsCisgIERFRlVOIChpc2lzX2hlbGxvX2ludGVydmFsLAogICAgICAgIGlzaXNfaGVsbG9faW50ZXJ2YWxfY21kLAogICAgICAgICJpc2lzIGhlbGxvLWludGVydmFsICg8MS02NTUzNT58bWluaW1hbCkiLAogICAgICAgICJJUy1JUyBjb21tYW5kc1xuIgogICAgICAgICJTZXQgSGVsbG8gaW50ZXJ2YWxcbiIKICAgICAgICAiSGVsbG8gaW50ZXJ2YWwgdmFsdWVcbiIKLSAgICAgICAiSG9sZHRpbWUgMSBzZWNvbmRzLCBpbnRlcnZhbCBkZXBlbmRzIG9uIG11bHRpcGxpZXJcbiIKLSAgICAgICApCisgICAgICAgIkhvbGR0aW1lIDEgc2Vjb25kcywgaW50ZXJ2YWwgZGVwZW5kcyBvbiBtdWx0aXBsaWVyXG4iKQogewogICBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0OwogICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CiAgIGludCBpbnRlcnZhbDsKICAgY2hhciBjOwogCi0gIGlmcCAgPSB2dHktPmluZGV4OworICBpZnAgPSB2dHktPmluZGV4OwogICBjaXJjdWl0ID0gaWZwLT5pbmZvOwotICBpZiAoY2lyY3VpdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIENNRF9XQVJOSU5HOwotICB9Ci0gIGFzc2VydCAoY2lyY3VpdCk7IAorICBpZiAoY2lyY3VpdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CisgIGFzc2VydCAoY2lyY3VpdCk7CiAgIGMgPSAqYXJndlswXTsKLSAgaWYgKGlzZGlnaXQoKGludCljKSkgewotICAgIGludGVydmFsID0gYXRvaSAoYXJndlswXSk7Ci0gIH0gZWxzZQotICAgIGludGVydmFsID0gSEVMTE9fTUlOSU1BTDsgLyogRklYTUU6IHNob3VsZCBiZSBjYWxjdWxhdGVkICovCisgIGlmIChpc2RpZ2l0ICgoaW50KSBjKSkKKyAgICB7CisgICAgICBpbnRlcnZhbCA9IGF0b2kgKGFyZ3ZbMF0pOworICAgIH0KKyAgZWxzZQorICAgIGludGVydmFsID0gSEVMTE9fTUlOSU1BTDsJLyogRklYTUU6IHNob3VsZCBiZSBjYWxjdWxhdGVkICovCiAKLSAgY2lyY3VpdC0+aGVsbG9faW50ZXJ2YWxbMF0gPSAodV9pbnQxNl90KWludGVydmFsOwotICBjaXJjdWl0LT5oZWxsb19pbnRlcnZhbFsxXSA9ICh1X2ludDE2X3QpaW50ZXJ2YWw7Ci0gIAorICBjaXJjdWl0LT5oZWxsb19pbnRlcnZhbFswXSA9ICh1X2ludDE2X3QpIGludGVydmFsOworICBjaXJjdWl0LT5oZWxsb19pbnRlcnZhbFsxXSA9ICh1X2ludDE2X3QpIGludGVydmFsOworCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KIApAQCAtMTE2NCwyMyArMTI2NSwyMyBAQAogICAgICAgICJubyBpc2lzIGhlbGxvLWludGVydmFsIiwKICAgICAgICBOT19TVFIKICAgICAgICAiSVMtSVMgY29tbWFuZHNcbiIKLSAgICAgICAiU2V0IEhlbGxvIGludGVydmFsXG4iCi0gICAgICAgKQorICAgICAgICJTZXQgSGVsbG8gaW50ZXJ2YWxcbiIpCiB7CiAgIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQ7CiAgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKIAotICBpZnAgID0gdnR5LT5pbmRleDsKKyAgaWZwID0gdnR5LT5pbmRleDsKICAgY2lyY3VpdCA9IGlmcC0+aW5mbzsKLSAgaWYgKGNpcmN1aXQgPT0gTlVMTCkgewotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQorICBpZiAoY2lyY3VpdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CiAgIGFzc2VydCAoY2lyY3VpdCk7Ci0gIAogCi0gIGNpcmN1aXQtPmhlbGxvX2ludGVydmFsWzBdID0gSEVMTE9fSU5URVJWQUw7IC8qIERlZmF1bHQgaXMgMSBzZWMuICovCisKKyAgY2lyY3VpdC0+aGVsbG9faW50ZXJ2YWxbMF0gPSBIRUxMT19JTlRFUlZBTDsJLyogRGVmYXVsdCBpcyAxIHNlYy4gKi8KICAgY2lyY3VpdC0+aGVsbG9faW50ZXJ2YWxbMV0gPSBIRUxMT19JTlRFUlZBTDsKLSAgCisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC0xMTkxLDggKzEyOTIsNyBAQAogICAgICAgICJJUy1JUyBjb21tYW5kc1xuIgogICAgICAgICJTZXQgSGVsbG8gaW50ZXJ2YWxcbiIKICAgICAgICAiSGVsbG8gaW50ZXJ2YWwgdmFsdWVcbiIKLSAgICAgICAiSG9sZHRpbWUgMSBzZWNvbmQsIGludGVydmFsIGRlcGVuZHMgb24gbXVsdGlwbGllclxuIgotICAgICAgICkKKyAgICAgICAiSG9sZHRpbWUgMSBzZWNvbmQsIGludGVydmFsIGRlcGVuZHMgb24gbXVsdGlwbGllclxuIikKIAogREVGVU4gKGlzaXNfaGVsbG9faW50ZXJ2YWxfbDEsCiAgICAgICAgaXNpc19oZWxsb19pbnRlcnZhbF9sMV9jbWQsCkBAIC0xMjAxLDI5ICsxMzAxLDMxIEBACiAgICAgICAgIlNldCBIZWxsbyBpbnRlcnZhbFxuIgogICAgICAgICJIZWxsbyBpbnRlcnZhbCB2YWx1ZVxuIgogICAgICAgICJIb2xkdGltZSAxIHNlY29uZCwgaW50ZXJ2YWwgZGVwZW5kcyBvbiBtdWx0aXBsaWVyXG4iCi0gICAgICAgIlNwZWNpZnkgaGVsbG8taW50ZXJ2YWwgZm9yIGxldmVsLTEgSUlIc1xuIgotICAgICAgICkKKyAgICAgICAiU3BlY2lmeSBoZWxsby1pbnRlcnZhbCBmb3IgbGV2ZWwtMSBJSUhzXG4iKQogewogICBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0OwogICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CiAgIGxvbmcgaW50ZXJ2YWw7CiAgIGNoYXIgYzsKIAotICBpZnAgID0gdnR5LT5pbmRleDsKKyAgaWZwID0gdnR5LT5pbmRleDsKICAgY2lyY3VpdCA9IGlmcC0+aW5mbzsKLSAgaWYgKGNpcmN1aXQgPT0gTlVMTCkgewotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQorICBpZiAoY2lyY3VpdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CiAgIGFzc2VydCAoY2lyY3VpdCk7Ci0gCisKICAgYyA9ICphcmd2WzBdOwotICBpZiAoaXNkaWdpdCgoaW50KWMpKSB7Ci0gICAgaW50ZXJ2YWwgPSBhdG9pIChhcmd2WzBdKTsKLSAgfSBlbHNlCisgIGlmIChpc2RpZ2l0ICgoaW50KSBjKSkKKyAgICB7CisgICAgICBpbnRlcnZhbCA9IGF0b2kgKGFyZ3ZbMF0pOworICAgIH0KKyAgZWxzZQogICAgIGludGVydmFsID0gSEVMTE9fTUlOSU1BTDsKIAotICBjaXJjdWl0LT5oZWxsb19pbnRlcnZhbFswXSA9ICh1X2ludDE2X3QpaW50ZXJ2YWw7Ci0gIAorICBjaXJjdWl0LT5oZWxsb19pbnRlcnZhbFswXSA9ICh1X2ludDE2X3QpIGludGVydmFsOworCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KIApAQCAtMTIzMywyMiArMTMzNSwyMiBAQAogICAgICAgIE5PX1NUUgogICAgICAgICJJUy1JUyBjb21tYW5kc1xuIgogICAgICAgICJTZXQgSGVsbG8gaW50ZXJ2YWxcbiIKLSAgICAgICAiU3BlY2lmeSBoZWxsby1pbnRlcnZhbCBmb3IgbGV2ZWwtMSBJSUhzXG4iCi0gICAgICAgKQorICAgICAgICJTcGVjaWZ5IGhlbGxvLWludGVydmFsIGZvciBsZXZlbC0xIElJSHNcbiIpCiB7CiAgIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQ7CiAgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKIAotICBpZnAgID0gdnR5LT5pbmRleDsKKyAgaWZwID0gdnR5LT5pbmRleDsKICAgY2lyY3VpdCA9IGlmcC0+aW5mbzsKLSAgaWYgKGNpcmN1aXQgPT0gTlVMTCkgewotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQorICBpZiAoY2lyY3VpdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CiAgIGFzc2VydCAoY2lyY3VpdCk7Ci0gIAogCi0gIGNpcmN1aXQtPmhlbGxvX2ludGVydmFsWzBdID0gSEVMTE9fSU5URVJWQUw7IC8qIERlZmF1bHQgaXMgMSBzZWMuICovCi0gIAorCisgIGNpcmN1aXQtPmhlbGxvX2ludGVydmFsWzBdID0gSEVMTE9fSU5URVJWQUw7CS8qIERlZmF1bHQgaXMgMSBzZWMuICovCisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC0xMjYwLDggKzEzNjIsNyBAQAogICAgICAgICJTZXQgSGVsbG8gaW50ZXJ2YWxcbiIKICAgICAgICAiSGVsbG8gaW50ZXJ2YWwgdmFsdWVcbiIKICAgICAgICAiSG9sZHRpbWUgMSBzZWNvbmQsIGludGVydmFsIGRlcGVuZHMgb24gbXVsdGlwbGllclxuIgotICAgICAgICJTcGVjaWZ5IGhlbGxvLWludGVydmFsIGZvciBsZXZlbC0xIElJSHNcbiIKLSAgICAgICApCisgICAgICAgIlNwZWNpZnkgaGVsbG8taW50ZXJ2YWwgZm9yIGxldmVsLTEgSUlIc1xuIikKIAogREVGVU4gKGlzaXNfaGVsbG9faW50ZXJ2YWxfbDIsCiAgICAgICAgaXNpc19oZWxsb19pbnRlcnZhbF9sMl9jbWQsCkBAIC0xMjcwLDI5ICsxMzcxLDMxIEBACiAgICAgICAgIlNldCBIZWxsbyBpbnRlcnZhbFxuIgogICAgICAgICJIZWxsbyBpbnRlcnZhbCB2YWx1ZVxuIgogICAgICAgICJIb2xkdGltZSAxIHNlY29uZCwgaW50ZXJ2YWwgZGVwZW5kcyBvbiBtdWx0aXBsaWVyXG4iCi0gICAgICAgIlNwZWNpZnkgaGVsbG8taW50ZXJ2YWwgZm9yIGxldmVsLTIgSUlIc1xuIgotICAgICAgICkKKyAgICAgICAiU3BlY2lmeSBoZWxsby1pbnRlcnZhbCBmb3IgbGV2ZWwtMiBJSUhzXG4iKQogewogICBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0OwogICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CiAgIGxvbmcgaW50ZXJ2YWw7CiAgIGNoYXIgYzsKIAotICBpZnAgID0gdnR5LT5pbmRleDsKKyAgaWZwID0gdnR5LT5pbmRleDsKICAgY2lyY3VpdCA9IGlmcC0+aW5mbzsKLSAgaWYgKGNpcmN1aXQgPT0gTlVMTCkgewotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQorICBpZiAoY2lyY3VpdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CiAgIGFzc2VydCAoY2lyY3VpdCk7Ci0gCisKICAgYyA9ICphcmd2WzBdOwotICBpZiAoaXNkaWdpdCgoaW50KWMpKSB7Ci0gICAgaW50ZXJ2YWwgPSBhdG9pIChhcmd2WzBdKTsKLSAgfSBlbHNlCisgIGlmIChpc2RpZ2l0ICgoaW50KSBjKSkKKyAgICB7CisgICAgICBpbnRlcnZhbCA9IGF0b2kgKGFyZ3ZbMF0pOworICAgIH0KKyAgZWxzZQogICAgIGludGVydmFsID0gSEVMTE9fTUlOSU1BTDsKIAotICBjaXJjdWl0LT5oZWxsb19pbnRlcnZhbFsxXSA9ICh1X2ludDE2X3QpaW50ZXJ2YWw7Ci0gIAorICBjaXJjdWl0LT5oZWxsb19pbnRlcnZhbFsxXSA9ICh1X2ludDE2X3QpIGludGVydmFsOworCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KIApAQCAtMTMwMiwyMiArMTQwNSwyMiBAQAogICAgICAgIE5PX1NUUgogICAgICAgICJJUy1JUyBjb21tYW5kc1xuIgogICAgICAgICJTZXQgSGVsbG8gaW50ZXJ2YWxcbiIKLSAgICAgICAiU3BlY2lmeSBoZWxsby1pbnRlcnZhbCBmb3IgbGV2ZWwtMiBJSUhzXG4iCi0gICAgICAgKQorICAgICAgICJTcGVjaWZ5IGhlbGxvLWludGVydmFsIGZvciBsZXZlbC0yIElJSHNcbiIpCiB7CiAgIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQ7CiAgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKIAotICBpZnAgID0gdnR5LT5pbmRleDsKKyAgaWZwID0gdnR5LT5pbmRleDsKICAgY2lyY3VpdCA9IGlmcC0+aW5mbzsKLSAgaWYgKGNpcmN1aXQgPT0gTlVMTCkgewotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQorICBpZiAoY2lyY3VpdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CiAgIGFzc2VydCAoY2lyY3VpdCk7Ci0gIAogCi0gIGNpcmN1aXQtPmhlbGxvX2ludGVydmFsWzFdID0gSEVMTE9fSU5URVJWQUw7IC8qIERlZmF1bHQgaXMgMSBzZWMuICovCi0gIAorCisgIGNpcmN1aXQtPmhlbGxvX2ludGVydmFsWzFdID0gSEVMTE9fSU5URVJWQUw7CS8qIERlZmF1bHQgaXMgMSBzZWMuICovCisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC0xMzI5LDM0ICsxNDMyLDMyIEBACiAgICAgICAgIlNldCBIZWxsbyBpbnRlcnZhbFxuIgogICAgICAgICJIZWxsbyBpbnRlcnZhbCB2YWx1ZVxuIgogICAgICAgICJIb2xkdGltZSAxIHNlY29uZCwgaW50ZXJ2YWwgZGVwZW5kcyBvbiBtdWx0aXBsaWVyXG4iCi0gICAgICAgIlNwZWNpZnkgaGVsbG8taW50ZXJ2YWwgZm9yIGxldmVsLTIgSUlIc1xuIgotICAgICAgICkKLQorICAgICAgICJTcGVjaWZ5IGhlbGxvLWludGVydmFsIGZvciBsZXZlbC0yIElJSHNcbiIpCiAKIERFRlVOIChpc2lzX2hlbGxvX211bHRpcGxpZXIsCiAgICAgICAgaXNpc19oZWxsb19tdWx0aXBsaWVyX2NtZCwKICAgICAgICAiaXNpcyBoZWxsby1tdWx0aXBsaWVyIDwzLTEwMDA+IiwKICAgICAgICAiSVMtSVMgY29tbWFuZHNcbiIKICAgICAgICAiU2V0IG11bHRpcGxpZXIgZm9yIEhlbGxvIGhvbGRpbmcgdGltZVxuIgotICAgICAgICJIZWxsbyBtdWx0aXBsaWVyIHZhbHVlXG4iCi0gICAgICAgKQorICAgICAgICJIZWxsbyBtdWx0aXBsaWVyIHZhbHVlXG4iKQogewogICBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0OwogICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CiAgIGludCBtdWx0OwotICAKLSAgaWZwICA9IHZ0eS0+aW5kZXg7CisKKyAgaWZwID0gdnR5LT5pbmRleDsKICAgY2lyY3VpdCA9IGlmcC0+aW5mbzsKLSAgaWYgKGNpcmN1aXQgPT0gTlVMTCkgewotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQorICBpZiAoY2lyY3VpdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CiAgIGFzc2VydCAoY2lyY3VpdCk7CiAKICAgbXVsdCA9IGF0b2kgKGFyZ3ZbMF0pOwogCi0gIGNpcmN1aXQtPmhlbGxvX211bHRpcGxpZXJbMF0gPSAodV9pbnQxNl90KW11bHQ7Ci0gIGNpcmN1aXQtPmhlbGxvX211bHRpcGxpZXJbMV0gPSAodV9pbnQxNl90KW11bHQ7Ci0gICAgCisgIGNpcmN1aXQtPmhlbGxvX211bHRpcGxpZXJbMF0gPSAodV9pbnQxNl90KSBtdWx0OworICBjaXJjdWl0LT5oZWxsb19tdWx0aXBsaWVyWzFdID0gKHVfaW50MTZfdCkgbXVsdDsKKwogICByZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKQEAgLTEzNjUsMTcgKzE0NjYsMTcgQEAKICAgICAgICAibm8gaXNpcyBoZWxsby1tdWx0aXBsaWVyIiwKICAgICAgICBOT19TVFIKICAgICAgICAiSVMtSVMgY29tbWFuZHNcbiIKLSAgICAgICAiU2V0IG11bHRpcGxpZXIgZm9yIEhlbGxvIGhvbGRpbmcgdGltZVxuIgotICAgICAgICkKKyAgICAgICAiU2V0IG11bHRpcGxpZXIgZm9yIEhlbGxvIGhvbGRpbmcgdGltZVxuIikKIHsKICAgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdDsKICAgc3RydWN0IGludGVyZmFjZSAqaWZwOwotICAKLSAgaWZwICA9IHZ0eS0+aW5kZXg7CisKKyAgaWZwID0gdnR5LT5pbmRleDsKICAgY2lyY3VpdCA9IGlmcC0+aW5mbzsKLSAgaWYgKGNpcmN1aXQgPT0gTlVMTCkgewotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQorICBpZiAoY2lyY3VpdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CiAgIGFzc2VydCAoY2lyY3VpdCk7CiAKICAgY2lyY3VpdC0+aGVsbG9fbXVsdGlwbGllclswXSA9IEhFTExPX01VTFRJUExJRVI7CkBAIC0xMzkwLDggKzE0OTEsNyBAQAogICAgICAgIE5PX1NUUgogICAgICAgICJJUy1JUyBjb21tYW5kc1xuIgogICAgICAgICJTZXQgbXVsdGlwbGllciBmb3IgSGVsbG8gaG9sZGluZyB0aW1lXG4iCi0gICAgICAgIkhlbGxvIG11bHRpcGxpZXIgdmFsdWVcbiIKLSAgICAgICApCisgICAgICAgIkhlbGxvIG11bHRpcGxpZXIgdmFsdWVcbiIpCiAKIERFRlVOIChpc2lzX2hlbGxvX211bHRpcGxpZXJfbDEsCiAgICAgICAgaXNpc19oZWxsb19tdWx0aXBsaWVyX2wxX2NtZCwKQEAgLTEzOTksMjQgKzE0OTksMjQgQEAKICAgICAgICAiSVMtSVMgY29tbWFuZHNcbiIKICAgICAgICAiU2V0IG11bHRpcGxpZXIgZm9yIEhlbGxvIGhvbGRpbmcgdGltZVxuIgogICAgICAgICJIZWxsbyBtdWx0aXBsaWVyIHZhbHVlXG4iCi0gICAgICAgIlNwZWNpZnkgaGVsbG8gbXVsdGlwbGllciBmb3IgbGV2ZWwtMSBJSUhzXG4iCi0gICAgICAgKQorICAgICAgICJTcGVjaWZ5IGhlbGxvIG11bHRpcGxpZXIgZm9yIGxldmVsLTEgSUlIc1xuIikKIHsKICAgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdDsKICAgc3RydWN0IGludGVyZmFjZSAqaWZwOwogICBpbnQgbXVsdDsKLSAgCi0gIGlmcCAgPSB2dHktPmluZGV4OworCisgIGlmcCA9IHZ0eS0+aW5kZXg7CiAgIGNpcmN1aXQgPSBpZnAtPmluZm87Ci0gIGlmIChjaXJjdWl0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gQ01EX1dBUk5JTkc7Ci0gIH0KKyAgaWYgKGNpcmN1aXQgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm4gQ01EX1dBUk5JTkc7CisgICAgfQogICBhc3NlcnQgKGNpcmN1aXQpOwogCiAgIG11bHQgPSBhdG9pIChhcmd2WzBdKTsKIAotICBjaXJjdWl0LT5oZWxsb19tdWx0aXBsaWVyWzBdID0gKHVfaW50MTZfdCltdWx0OwotICAgIAorICBjaXJjdWl0LT5oZWxsb19tdWx0aXBsaWVyWzBdID0gKHVfaW50MTZfdCkgbXVsdDsKKwogICByZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKQEAgLTE0MjYsMTcgKzE1MjYsMTcgQEAKICAgICAgICBOT19TVFIKICAgICAgICAiSVMtSVMgY29tbWFuZHNcbiIKICAgICAgICAiU2V0IG11bHRpcGxpZXIgZm9yIEhlbGxvIGhvbGRpbmcgdGltZVxuIgotICAgICAgICJTcGVjaWZ5IGhlbGxvIG11bHRpcGxpZXIgZm9yIGxldmVsLTEgSUlIc1xuIgotICAgICAgICkKKyAgICAgICAiU3BlY2lmeSBoZWxsbyBtdWx0aXBsaWVyIGZvciBsZXZlbC0xIElJSHNcbiIpCiB7CiAgIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQ7CiAgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKLSAgCi0gIGlmcCAgPSB2dHktPmluZGV4OworCisgIGlmcCA9IHZ0eS0+aW5kZXg7CiAgIGNpcmN1aXQgPSBpZnAtPmluZm87Ci0gIGlmIChjaXJjdWl0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gQ01EX1dBUk5JTkc7Ci0gIH0KKyAgaWYgKGNpcmN1aXQgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm4gQ01EX1dBUk5JTkc7CisgICAgfQogICBhc3NlcnQgKGNpcmN1aXQpOwogCiAgIGNpcmN1aXQtPmhlbGxvX211bHRpcGxpZXJbMF0gPSBIRUxMT19NVUxUSVBMSUVSOwpAQCAtMTQ1MSw4ICsxNTUxLDcgQEAKICAgICAgICAiSVMtSVMgY29tbWFuZHNcbiIKICAgICAgICAiU2V0IG11bHRpcGxpZXIgZm9yIEhlbGxvIGhvbGRpbmcgdGltZVxuIgogICAgICAgICJIZWxsbyBtdWx0aXBsaWVyIHZhbHVlXG4iCi0gICAgICAgIlNwZWNpZnkgaGVsbG8gbXVsdGlwbGllciBmb3IgbGV2ZWwtMSBJSUhzXG4iCi0gICAgICAgKQorICAgICAgICJTcGVjaWZ5IGhlbGxvIG11bHRpcGxpZXIgZm9yIGxldmVsLTEgSUlIc1xuIikKIAogREVGVU4gKGlzaXNfaGVsbG9fbXVsdGlwbGllcl9sMiwKICAgICAgICBpc2lzX2hlbGxvX211bHRpcGxpZXJfbDJfY21kLApAQCAtMTQ2MCwyNCArMTU1OSwyNCBAQAogICAgICAgICJJUy1JUyBjb21tYW5kc1xuIgogICAgICAgICJTZXQgbXVsdGlwbGllciBmb3IgSGVsbG8gaG9sZGluZyB0aW1lXG4iCiAgICAgICAgIkhlbGxvIG11bHRpcGxpZXIgdmFsdWVcbiIKLSAgICAgICAiU3BlY2lmeSBoZWxsbyBtdWx0aXBsaWVyIGZvciBsZXZlbC0yIElJSHNcbiIKLSAgICAgICApCisgICAgICAgIlNwZWNpZnkgaGVsbG8gbXVsdGlwbGllciBmb3IgbGV2ZWwtMiBJSUhzXG4iKQogewogICBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0OwogICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CiAgIGludCBtdWx0OwotICAKLSAgaWZwICA9IHZ0eS0+aW5kZXg7CisKKyAgaWZwID0gdnR5LT5pbmRleDsKICAgY2lyY3VpdCA9IGlmcC0+aW5mbzsKLSAgaWYgKGNpcmN1aXQgPT0gTlVMTCkgewotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQorICBpZiAoY2lyY3VpdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CiAgIGFzc2VydCAoY2lyY3VpdCk7CiAKICAgbXVsdCA9IGF0b2kgKGFyZ3ZbMF0pOwogCi0gIGNpcmN1aXQtPmhlbGxvX211bHRpcGxpZXJbMV0gPSAodV9pbnQxNl90KW11bHQ7Ci0gICAgCisgIGNpcmN1aXQtPmhlbGxvX211bHRpcGxpZXJbMV0gPSAodV9pbnQxNl90KSBtdWx0OworCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KIApAQCAtMTQ4NywxNyArMTU4NiwxNyBAQAogICAgICAgIE5PX1NUUgogICAgICAgICJJUy1JUyBjb21tYW5kc1xuIgogICAgICAgICJTZXQgbXVsdGlwbGllciBmb3IgSGVsbG8gaG9sZGluZyB0aW1lXG4iCi0gICAgICAgIlNwZWNpZnkgaGVsbG8gbXVsdGlwbGllciBmb3IgbGV2ZWwtMiBJSUhzXG4iCi0gICAgICAgKQorICAgICAgICJTcGVjaWZ5IGhlbGxvIG11bHRpcGxpZXIgZm9yIGxldmVsLTIgSUlIc1xuIikKIHsKICAgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdDsKICAgc3RydWN0IGludGVyZmFjZSAqaWZwOwotICAKLSAgaWZwICA9IHZ0eS0+aW5kZXg7CisKKyAgaWZwID0gdnR5LT5pbmRleDsKICAgY2lyY3VpdCA9IGlmcC0+aW5mbzsKLSAgaWYgKGNpcmN1aXQgPT0gTlVMTCkgewotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQorICBpZiAoY2lyY3VpdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CiAgIGFzc2VydCAoY2lyY3VpdCk7CiAKICAgY2lyY3VpdC0+aGVsbG9fbXVsdGlwbGllclsxXSA9IEhFTExPX01VTFRJUExJRVI7CkBAIC0xNTEyLDggKzE2MTEsNyBAQAogICAgICAgICJJUy1JUyBjb21tYW5kc1xuIgogICAgICAgICJTZXQgbXVsdGlwbGllciBmb3IgSGVsbG8gaG9sZGluZyB0aW1lXG4iCiAgICAgICAgIkhlbGxvIG11bHRpcGxpZXIgdmFsdWVcbiIKLSAgICAgICAiU3BlY2lmeSBoZWxsbyBtdWx0aXBsaWVyIGZvciBsZXZlbC0yIElJSHNcbiIKLSAgICAgICApCisgICAgICAgIlNwZWNpZnkgaGVsbG8gbXVsdGlwbGllciBmb3IgbGV2ZWwtMiBJSUhzXG4iKQogCiBERUZVTiAoaXNpc19oZWxsbywKICAgICAgICBpc2lzX2hlbGxvX2NtZCwKQEAgLTE1MjUsMTYgKzE2MjMsMTcgQEAKIHsKICAgc3RydWN0IGludGVyZmFjZSAqaWZwOwogICBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0OwotICAKLSAgaWZwICA9IHZ0eS0+aW5kZXg7CisKKyAgaWZwID0gdnR5LT5pbmRleDsKICAgY2lyY3VpdCA9IGlmcC0+aW5mbzsKLSAgaWYgKGNpcmN1aXQgPT0gTlVMTCkgewotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQorICBpZiAoY2lyY3VpdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CiAgIGFzc2VydCAoY2lyY3VpdCk7Ci0gIAorCiAgIGNpcmN1aXQtPnUuYmMucGFkX2hlbGxvcyA9IDE7Ci0gIAorCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KIApAQCAtMTU0Myw5ICsxNjQyLDcgQEAKICAgICAgICBpcF9hZGRyZXNzX2NtZCwKICAgICAgICAiaXAgYWRkcmVzcyBBLkIuQy5EL0EiLAogICAgICAgICJJbnRlcmZhY2UgSW50ZXJuZXQgUHJvdG9jb2wgY29uZmlnIGNvbW1hbmRzXG4iCi0gICAgICAgIlNldCB0aGUgSVAgYWRkcmVzcyBvZiBhbiBpbnRlcmZhY2VcbiIKLSAgICAgICAiSVAgYWRkcmVzcyAoZS5nLiAxMC4wLjAuMS84XG4iKQotICAKKyAgICAgICAiU2V0IHRoZSBJUCBhZGRyZXNzIG9mIGFuIGludGVyZmFjZVxuIiAiSVAgYWRkcmVzcyAoZS5nLiAxMC4wLjAuMS84XG4iKQogewogICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CiAgIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQ7CkBAIC0xNTUzLDExICsxNjUwLDEyIEBACiAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKICAgaW50IHJldCwgZm91bmQgPSAxOwogCi0gIGlmcCAgPSB2dHktPmluZGV4OworICBpZnAgPSB2dHktPmluZGV4OwogICBjaXJjdWl0ID0gaWZwLT5pbmZvOwotICBpZiAoY2lyY3VpdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIENNRF9XQVJOSU5HOwotICB9CisgIGlmIChjaXJjdWl0ID09IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KIAogICBhc3NlcnQgKGNpcmN1aXQpOwogI2lmZGVmIEhBVkVfSVBWNgpAQCAtMTU2NSwzMiArMTY2MywzNiBAQAogI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwogCiAgIGlwdjQgPSBwcmVmaXhfaXB2NF9uZXcgKCk7Ci0gIAotICByZXQgPSBzdHIycHJlZml4X2lwdjQgKGFyZ3ZbMF0sIGlwdjQpOwotICBpZiAocmV0IDw9IDApIHsKLSAgICB6bG9nX3dhcm4gKCJpcF9hZGRyZXNzX2NtZCgpOiBtYWxmb3JtZWQgYWRkcmVzcyIpOwotICAgIHZ0eV9vdXQgKHZ0eSwgIiUlIE1hbGZvcm1lZCBhZGRyZXNzICVzIiwgVlRZX05FV0xJTkUpOwotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQotICAKLSAgaWYgKCFjaXJjdWl0LT5pcF9hZGRycykgCi0gICAgY2lyY3VpdC0+aXBfYWRkcnMgPSBsaXN0X25ldyAoKTsKLSAgZWxzZSB7Ci0gICAgZm9yIChub2RlID0gbGlzdGhlYWQgKGNpcmN1aXQtPmlwX2FkZHJzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7Ci0gICAgICBpcCA9IGdldGRhdGEgKG5vZGUpOwotICAgICAgaWYgKHByZWZpeF9zYW1lICgoc3RydWN0IHByZWZpeCAqKWlwLCAoc3RydWN0IHByZWZpeCAqKWlwdjQpKQotCWZvdW5kID0gMTsKLSAgICB9Ci0gICAgaWYgKGZvdW5kKSB7Ci0gICAgcHJlZml4X2lwdjRfZnJlZSAoaXB2NCk7Ci0gICAgcmV0dXJuIENNRF9TVUNDRVNTOwotICAgIH0KLSAgfQogCi0gIAorICByZXQgPSBzdHIycHJlZml4X2lwdjQgKGFyZ3ZbMF0sIGlwdjQpOworICBpZiAocmV0IDw9IDApCisgICAgeworICAgICAgemxvZ193YXJuICgiaXBfYWRkcmVzc19jbWQoKTogbWFsZm9ybWVkIGFkZHJlc3MiKTsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIiUlIE1hbGZvcm1lZCBhZGRyZXNzICVzIiwgVlRZX05FV0xJTkUpOworICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KKworICBpZiAoIWNpcmN1aXQtPmlwX2FkZHJzKQorICAgIGNpcmN1aXQtPmlwX2FkZHJzID0gbGlzdF9uZXcgKCk7CisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoY2lyY3VpdC0+aXBfYWRkcnMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisJeworCSAgaXAgPSBnZXRkYXRhIChub2RlKTsKKwkgIGlmIChwcmVmaXhfc2FtZSAoKHN0cnVjdCBwcmVmaXggKikgaXAsIChzdHJ1Y3QgcHJlZml4ICopIGlwdjQpKQorCSAgICBmb3VuZCA9IDE7CisJfQorICAgICAgaWYgKGZvdW5kKQorCXsKKwkgIHByZWZpeF9pcHY0X2ZyZWUgKGlwdjQpOworCSAgcmV0dXJuIENNRF9TVUNDRVNTOworCX0KKyAgICB9CisKKwogICBsaXN0bm9kZV9hZGQgKGNpcmN1aXQtPmlwX2FkZHJzLCBpcHY0KTsKLSNpZmRlZiBFWFRSRU1FX0RFQlVHICAKLSAgemxvZ19pbmZvICgiYWRkZWQgSVAgYWRkcmVzcyAlcyB0byBjaXJjdWl0ICVkIiwgYXJndlswXSwgCisjaWZkZWYgRVhUUkVNRV9ERUJVRworICB6bG9nX2luZm8gKCJhZGRlZCBJUCBhZGRyZXNzICVzIHRvIGNpcmN1aXQgJWQiLCBhcmd2WzBdLAogCSAgICAgY2lyY3VpdC0+aW50ZXJmYWNlLT5pZmluZGV4KTsKICNlbmRpZiAvKiBFWFRSRU1FX0RFQlVHICovCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKQEAgLTE2MTAsMzYgKzE3MTIsNDMgQEAKICAgc3RydWN0IGxpc3Rub2RlICpub2RlOwogICBpbnQgcmV0OwogCi0gIGlmcCAgPSB2dHktPmluZGV4OworICBpZnAgPSB2dHktPmluZGV4OwogICBjaXJjdWl0ID0gaWZwLT5pbmZvOwogICAvKiBVR0xZIC0gd2lsbCByZW1vdmUgbDhyICovCi0gIGlmIChjaXJjdWl0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gQ01EX1dBUk5JTkc7Ci0gIH0KKyAgaWYgKGNpcmN1aXQgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm4gQ01EX1dBUk5JTkc7CisgICAgfQogICBhc3NlcnQgKGNpcmN1aXQpOwogCi0gIGlmICghY2lyY3VpdC0+aXBfYWRkcnMgfHwgY2lyY3VpdC0+aXBfYWRkcnMtPmNvdW50ID09IDApIHsKLSAgICB2dHlfb3V0ICh2dHksICJJbnZhbGlkIGFkZHJlc3MgJXMiLCBWVFlfTkVXTElORSk7Ci0gICAgcmV0dXJuIENNRF9XQVJOSU5HOwotICB9CisgIGlmICghY2lyY3VpdC0+aXBfYWRkcnMgfHwgY2lyY3VpdC0+aXBfYWRkcnMtPmNvdW50ID09IDApCisgICAgeworICAgICAgdnR5X291dCAodnR5LCAiSW52YWxpZCBhZGRyZXNzICVzIiwgVlRZX05FV0xJTkUpOworICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KICAgcmV0ID0gc3RyMnByZWZpeF9pcHY0IChhcmd2WzBdLCAmaXB2NCk7Ci0gIGlmIChyZXQgPD0gMCkgewotICAgIHZ0eV9vdXQgKHZ0eSwgIiUlIE1hbGZvcm1lZCBhZGRyZXNzICVzIiwgVlRZX05FV0xJTkUpOwotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQotICAKLSAgZm9yIChub2RlID0gbGlzdGhlYWQgKGNpcmN1aXQtPmlwX2FkZHJzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7Ci0gICAgaXAgPSBnZXRkYXRhIChub2RlKTsKLSAgICBpZiAocHJlZml4X3NhbWUgKChzdHJ1Y3QgcHJlZml4ICopaXAsIChzdHJ1Y3QgcHJlZml4ICopJmlwdjQpKQotICAgICAgYnJlYWs7Ci0gIH0KLSAgCi0gIGlmIChpcCkgewotICAgIGxpc3Rub2RlX2RlbGV0ZSAoY2lyY3VpdC0+aXBfYWRkcnMsIGlwKTsKLSAgfSBlbHNlIHsKLSAgICB2dHlfb3V0ICh2dHksICJJbnZhbGlkIGFkZHJlc3MgJXMiLCBWVFlfTkVXTElORSk7Ci0gIH0KLSAgCisgIGlmIChyZXQgPD0gMCkKKyAgICB7CisgICAgICB2dHlfb3V0ICh2dHksICIlJSBNYWxmb3JtZWQgYWRkcmVzcyAlcyIsIFZUWV9ORVdMSU5FKTsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CisKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGNpcmN1aXQtPmlwX2FkZHJzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorICAgIHsKKyAgICAgIGlwID0gZ2V0ZGF0YSAobm9kZSk7CisgICAgICBpZiAocHJlZml4X3NhbWUgKChzdHJ1Y3QgcHJlZml4ICopIGlwLCAoc3RydWN0IHByZWZpeCAqKSAmaXB2NCkpCisJYnJlYWs7CisgICAgfQorCisgIGlmIChpcCkKKyAgICB7CisgICAgICBsaXN0bm9kZV9kZWxldGUgKGNpcmN1aXQtPmlwX2FkZHJzLCBpcCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdnR5X291dCAodnR5LCAiSW52YWxpZCBhZGRyZXNzICVzIiwgVlRZX05FV0xJTkUpOworICAgIH0KKwogICByZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAjZW5kaWYKQEAgLTE2NTYsMTUgKzE3NjUsMTYgQEAKICAgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdDsKICAgc3RydWN0IGludGVyZmFjZSAqaWZwOwogCi0gIGlmcCAgPSB2dHktPmluZGV4OworICBpZnAgPSB2dHktPmluZGV4OwogICBjaXJjdWl0ID0gaWZwLT5pbmZvOwotICBpZiAoY2lyY3VpdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIENNRF9XQVJOSU5HOwotICB9CisgIGlmIChjaXJjdWl0ID09IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KICAgYXNzZXJ0IChjaXJjdWl0KTsKLSAgCisKICAgY2lyY3VpdC0+dS5iYy5wYWRfaGVsbG9zID0gMDsKLSAgCisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC0xNjc5LDE4ICsxNzg5LDE5IEBACiAgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKICAgdW5zaWduZWQgbG9uZyBpbnRlcnZhbDsKIAotICBpZnAgID0gdnR5LT5pbmRleDsKKyAgaWZwID0gdnR5LT5pbmRleDsKICAgY2lyY3VpdCA9IGlmcC0+aW5mbzsKLSAgaWYgKGNpcmN1aXQgPT0gTlVMTCkgewotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQorICBpZiAoY2lyY3VpdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CiAgIGFzc2VydCAoY2lyY3VpdCk7Ci0gIAorCiAgIGludGVydmFsID0gYXRvbCAoYXJndlswXSk7CiAKLSAgY2lyY3VpdC0+Y3NucF9pbnRlcnZhbFswXSA9ICh1X2ludDE2X3QpaW50ZXJ2YWw7Ci0gIGNpcmN1aXQtPmNzbnBfaW50ZXJ2YWxbMV0gPSAodV9pbnQxNl90KWludGVydmFsOwotICAgIAorICBjaXJjdWl0LT5jc25wX2ludGVydmFsWzBdID0gKHVfaW50MTZfdCkgaW50ZXJ2YWw7CisgIGNpcmN1aXQtPmNzbnBfaW50ZXJ2YWxbMV0gPSAodV9pbnQxNl90KSBpbnRlcnZhbDsKKwogICByZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKQEAgLTE2OTksMjIgKzE4MTAsMjIgQEAKICAgICAgICAibm8gaXNpcyBjc25wLWludGVydmFsIiwKICAgICAgICBOT19TVFIKICAgICAgICAiSVMtSVMgY29tbWFuZHNcbiIKLSAgICAgICAiU2V0IENTTlAgaW50ZXJ2YWwgaW4gc2Vjb25kc1xuIgotICAgICAgICkKKyAgICAgICAiU2V0IENTTlAgaW50ZXJ2YWwgaW4gc2Vjb25kc1xuIikKIHsKICAgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdDsKICAgc3RydWN0IGludGVyZmFjZSAqaWZwOwogCi0gIGlmcCAgPSB2dHktPmluZGV4OworICBpZnAgPSB2dHktPmluZGV4OwogICBjaXJjdWl0ID0gaWZwLT5pbmZvOwotICBpZiAoY2lyY3VpdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIENNRF9XQVJOSU5HOwotICB9CisgIGlmIChjaXJjdWl0ID09IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KICAgYXNzZXJ0IChjaXJjdWl0KTsKLSAgICAKKwogICBjaXJjdWl0LT5jc25wX2ludGVydmFsWzBdID0gQ1NOUF9JTlRFUlZBTDsKICAgY2lyY3VpdC0+Y3NucF9pbnRlcnZhbFsxXSA9IENTTlBfSU5URVJWQUw7Ci0gICAgCisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC0xNzI2LDcgKzE4MzcsNiBAQAogICAgICAgICJTZXQgQ1NOUCBpbnRlcnZhbCBpbiBzZWNvbmRzXG4iCiAgICAgICAgIkNTTlAgaW50ZXJ2YWwgdmFsdWVcbiIpCiAKLQogREVGVU4gKGNzbnBfaW50ZXJ2YWxfbDEsCiAgICAgICAgY3NucF9pbnRlcnZhbF9sMV9jbWQsCiAgICAgICAgImlzaXMgY3NucC1pbnRlcnZhbCA8MC02NTUzNT4gbGV2ZWwtMSIsCkBAIC0xNzM5LDE3ICsxODQ5LDE4IEBACiAgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKICAgdW5zaWduZWQgbG9uZyBpbnRlcnZhbDsKIAotICBpZnAgID0gdnR5LT5pbmRleDsKKyAgaWZwID0gdnR5LT5pbmRleDsKICAgY2lyY3VpdCA9IGlmcC0+aW5mbzsKLSAgaWYgKGNpcmN1aXQgPT0gTlVMTCkgewotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQorICBpZiAoY2lyY3VpdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CiAgIGFzc2VydCAoY2lyY3VpdCk7Ci0gIAorCiAgIGludGVydmFsID0gYXRvbCAoYXJndlswXSk7Ci0gIAotICBjaXJjdWl0LT5jc25wX2ludGVydmFsWzBdID0gKHVfaW50MTZfdClpbnRlcnZhbDsKLSAgICAKKworICBjaXJjdWl0LT5jc25wX2ludGVydmFsWzBdID0gKHVfaW50MTZfdCkgaW50ZXJ2YWw7CisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC0xNzY0LDE1ICsxODc1LDE2IEBACiAgIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQ7CiAgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKIAotICBpZnAgID0gdnR5LT5pbmRleDsKKyAgaWZwID0gdnR5LT5pbmRleDsKICAgY2lyY3VpdCA9IGlmcC0+aW5mbzsKLSAgaWYgKGNpcmN1aXQgPT0gTlVMTCkgewotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQorICBpZiAoY2lyY3VpdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CiAgIGFzc2VydCAoY2lyY3VpdCk7Ci0gIAorCiAgIGNpcmN1aXQtPmNzbnBfaW50ZXJ2YWxbMF0gPSBDU05QX0lOVEVSVkFMOwotICAgIAorCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KIApAQCAtMTc4NSw3ICsxODk3LDYgQEAKICAgICAgICAiQ1NOUCBpbnRlcnZhbCB2YWx1ZVxuIgogICAgICAgICJTcGVjaWZ5IGludGVydmFsIGZvciBsZXZlbC0xIENTTlBzXG4iKQogCi0KIERFRlVOIChjc25wX2ludGVydmFsX2wyLAogICAgICAgIGNzbnBfaW50ZXJ2YWxfbDJfY21kLAogICAgICAgICJpc2lzIGNzbnAtaW50ZXJ2YWwgPDAtNjU1MzU+IGxldmVsLTIiLApAQCAtMTc5OCwxNyArMTkwOSwxOCBAQAogICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CiAgIHVuc2lnbmVkIGxvbmcgaW50ZXJ2YWw7CiAKLSAgaWZwICA9IHZ0eS0+aW5kZXg7CisgIGlmcCA9IHZ0eS0+aW5kZXg7CiAgIGNpcmN1aXQgPSBpZnAtPmluZm87Ci0gIGlmIChjaXJjdWl0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gQ01EX1dBUk5JTkc7Ci0gIH0KKyAgaWYgKGNpcmN1aXQgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm4gQ01EX1dBUk5JTkc7CisgICAgfQogICBhc3NlcnQgKGNpcmN1aXQpOwotICAKKwogICBpbnRlcnZhbCA9IGF0b2wgKGFyZ3ZbMF0pOwotICAKLSAgY2lyY3VpdC0+Y3NucF9pbnRlcnZhbFsxXSA9ICh1X2ludDE2X3QpaW50ZXJ2YWw7Ci0gICAgCisKKyAgY2lyY3VpdC0+Y3NucF9pbnRlcnZhbFsxXSA9ICh1X2ludDE2X3QpIGludGVydmFsOworCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KIApAQCAtMTgyMywxNSArMTkzNSwxNiBAQAogICBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0OwogICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CiAKLSAgaWZwICA9IHZ0eS0+aW5kZXg7CisgIGlmcCA9IHZ0eS0+aW5kZXg7CiAgIGNpcmN1aXQgPSBpZnAtPmluZm87Ci0gIGlmIChjaXJjdWl0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gQ01EX1dBUk5JTkc7Ci0gIH0KKyAgaWYgKGNpcmN1aXQgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm4gQ01EX1dBUk5JTkc7CisgICAgfQogICBhc3NlcnQgKGNpcmN1aXQpOwotICAKKwogICBjaXJjdWl0LT5jc25wX2ludGVydmFsWzFdID0gQ1NOUF9JTlRFUlZBTDsKLSAgICAKKwogICByZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKQEAgLTE4NDQsNyArMTk1Nyw2IEBACiAgICAgICAgIkNTTlAgaW50ZXJ2YWwgdmFsdWVcbiIKICAgICAgICAiU3BlY2lmeSBpbnRlcnZhbCBmb3IgbGV2ZWwtMiBDU05Qc1xuIikKIAotCiAjaWZkZWYgSEFWRV9JUFY2CiBERUZVTiAoaXB2Nl9yb3V0ZXJfaXNpcywKICAgICAgICBpcHY2X3JvdXRlcl9pc2lzX2NtZCwKQEAgLTE4NTcsMzggKzE5NjksNDQgQEAKICAgc3RydWN0IGlzaXNfY2lyY3VpdCAqYzsKICAgc3RydWN0IGludGVyZmFjZSAqaWZwOwogICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOwotICAKLSAgaWZwID0gKHN0cnVjdCBpbnRlcmZhY2UgKil2dHktPmluZGV4OworCisgIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CiAgIGFzc2VydCAoaWZwKTsKLSAgCisKICAgYXJlYSA9IGlzaXNfYXJlYV9sb29rdXAgKGFyZ3ZbMF0pOwogCiAgIC8qIFByZXZlbnQgbW9yZSB0aGFuIG9uZSBjaXJjdWl0IHBlciBpbnRlcmZhY2UgKi8KICAgaWYgKGFyZWEpCiAgICAgYyA9IGNpcmN1aXRfbG9va3VwX2J5X2lmcCAoaWZwLCBhcmVhLT5jaXJjdWl0X2xpc3QpOwotICBlbHNlICBjID0gTlVMTDsKLSAgCi0gIGlmIChjICYmIChpZnAtPmluZm8gIT0gTlVMTCkpIHsKLSAgICBpZiAoYy0+aXB2Nl9yb3V0ZXIgPT0gMSkgewotICAgICAgdnR5X291dCAodnR5LCAiSVNJUyBjaXJjdWl0IGlzIGFscmVhZHkgZGVmaW5lZCBmb3IgSVB2NiVzIiwgVlRZX05FV0xJTkUpOwotICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICBlbHNlCisgICAgYyA9IE5VTEw7CisKKyAgaWYgKGMgJiYgKGlmcC0+aW5mbyAhPSBOVUxMKSkKKyAgICB7CisgICAgICBpZiAoYy0+aXB2Nl9yb3V0ZXIgPT0gMSkKKwl7CisJICB2dHlfb3V0ICh2dHksICJJU0lTIGNpcmN1aXQgaXMgYWxyZWFkeSBkZWZpbmVkIGZvciBJUHY2JXMiLAorCQkgICBWVFlfTkVXTElORSk7CisJICByZXR1cm4gQ01EX1dBUk5JTkc7CisJfQogICAgIH0KLSAgfQogCiAgIC8qIHRoaXMgaXMgaGVyZSBmb3IgY2lzY29wYWJpbGl0eSAqLwotICBpZiAoIWFyZWEpIHsKLSAgICB2dHlfb3V0ICh2dHksICJDYW4ndCBmaW5kIElTSVMgaW5zdGFuY2UgJXMiLCBWVFlfTkVXTElORSk7Ci0gICAgcmV0dXJuIENNRF9XQVJOSU5HOwotICB9CisgIGlmICghYXJlYSkKKyAgICB7CisgICAgICB2dHlfb3V0ICh2dHksICJDYW4ndCBmaW5kIElTSVMgaW5zdGFuY2UgJXMiLCBWVFlfTkVXTElORSk7CisgICAgICByZXR1cm4gQ01EX1dBUk5JTkc7CisgICAgfQogCi0gIGlmICghYykgewotICAgIGMgPSBjaXJjdWl0X2xvb2t1cF9ieV9pZnAgKGlmcCwgaXNpcy0+aW5pdF9jaXJjX2xpc3QpOyAKLSAgICBjID0gaXNpc19jc21fc3RhdGVfY2hhbmdlIChJU0lTX0VOQUJMRSwgYywgYXJlYSk7Ci0gICAgYy0+aW50ZXJmYWNlID0gaWZwOyAgICAgICAKLSAgICBpZnAtPmluZm8gPSBjOyAgICAgICAgICAgICAgIAotICB9CisgIGlmICghYykKKyAgICB7CisgICAgICBjID0gY2lyY3VpdF9sb29rdXBfYnlfaWZwIChpZnAsIGlzaXMtPmluaXRfY2lyY19saXN0KTsKKyAgICAgIGMgPSBpc2lzX2NzbV9zdGF0ZV9jaGFuZ2UgKElTSVNfRU5BQkxFLCBjLCBhcmVhKTsKKyAgICAgIGMtPmludGVyZmFjZSA9IGlmcDsKKyAgICAgIGlmcC0+aW5mbyA9IGM7CisgICAgfQogCi0gIGlmKCFjKSAKKyAgaWYgKCFjKQogICAgIHJldHVybiBDTURfV0FSTklORzsKIAogICBjLT5pcHY2X3JvdXRlciA9IDE7CkBAIC0xOTEyLDIwICsyMDMwLDIxIEBACiAgIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmM7CiAgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKICAgc3RydWN0IGlzaXNfYXJlYSAqYXJlYTsKLSAgCi0gIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopdnR5LT5pbmRleDsKKworICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OwogICAvKiBVR0xZIC0gd2lsbCByZW1vdmUgbDhyCiAgICAgIGlmIChjaXJjdWl0ID09IE5VTEwpIHsKLSAgcmV0dXJuIENNRF9XQVJOSU5HOwotICAgIH0gKi8KKyAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgICB9ICovCiAgIGFzc2VydCAoaWZwKTsKLSAgCisKICAgYXJlYSA9IGlzaXNfYXJlYV9sb29rdXAgKGFyZ3ZbMF0pOwotICBpZiAoIWFyZWEpIHsKLSAgICB2dHlfb3V0ICh2dHksICJDYW4ndCBmaW5kIElTSVMgaW5zdGFuY2UgJXMiLCBWVFlfTkVXTElORSk7Ci0gICAgcmV0dXJuIENNRF9XQVJOSU5HOwotICB9Ci0gCisgIGlmICghYXJlYSkKKyAgICB7CisgICAgICB2dHlfb3V0ICh2dHksICJDYW4ndCBmaW5kIElTSVMgaW5zdGFuY2UgJXMiLCBWVFlfTkVXTElORSk7CisgICAgICByZXR1cm4gQ01EX1dBUk5JTkc7CisgICAgfQorCiAgIGMgPSBjaXJjdWl0X2xvb2t1cF9ieV9pZnAgKGlmcCwgYXJlYS0+Y2lyY3VpdF9saXN0KTsKICAgaWYgKCFjKQogICAgIHJldHVybiBDTURfV0FSTklORzsKQEAgLTE5MzgsNyArMjA1Nyw3IEBACiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KIAotI2lmIDAgLyogR3Vlc3Mgd2UgZG9uJ3QgcmVhbGx5IG5lZWQgdGhlc2UgKi8KKyNpZiAwCQkJCS8qIEd1ZXNzIHdlIGRvbid0IHJlYWxseSBuZWVkIHRoZXNlICovCiAKIERFRlVOIChpcHY2X2FkZHJlc3MsCiAgICAgICAgaXB2Nl9hZGRyZXNzX2NtZCwKQEAgLTE5NTMsNDYgKzIwNzIsNTIgQEAKICAgc3RydWN0IGxpc3Rub2RlICpub2RlOwogICBpbnQgcmV0LCBmb3VuZCA9IDE7CiAKLSAgaWZwICA9IHZ0eS0+aW5kZXg7CisgIGlmcCA9IHZ0eS0+aW5kZXg7CiAgIGNpcmN1aXQgPSBpZnAtPmluZm87CiAgIC8qIFVHTFkgLSB3aWxsIHJlbW92ZSBsOHIgKi8KLSAgaWYgKGNpcmN1aXQgPT0gTlVMTCkgewotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQorICBpZiAoY2lyY3VpdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CiAgIGFzc2VydCAoY2lyY3VpdCk7CiAjaWZkZWYgRVhUUkVNRV9ERUJVRwogICB6bG9nX2luZm8gKCJpcHY2X2FkZHJlc3NfY21kIGNpcmN1aXQgJWQiLCBjaXJjdWl0LT5pZHgpOwogI2VuZGlmIC8qIEVYVFJFTUVfREVCVUcgKi8KLSAgCi0gIGlmIChjaXJjdWl0ID09IE5VTEwpIHsKLSAgICB6bG9nX3dhcm4gKCJpcHY2X2FkZHJlc3NfY21kKCk6IG5vIGNpcmN1aXQiKTsKLSAgICByZXR1cm4gQ01EX1dBUk5JTkc7Ci0gIH0KLSAgCi0gIAotICBpcHY2ID0gcHJlZml4X2lwdjZfbmV3ICgpOwotICAKLSAgcmV0ID0gc3RyMnByZWZpeF9pcHY2IChhcmd2WzBdLCBpcHY2KTsKLSAgaWYgKHJldCA8PSAwKSB7Ci0gICAgdnR5X291dCAodnR5LCAiJSUgTWFsZm9ybWVkIGFkZHJlc3MgJXMiLCBWVFlfTkVXTElORSk7Ci0gICAgcmV0dXJuIENNRF9XQVJOSU5HOwotICB9Ci0gIAotICBpZiAoIWNpcmN1aXQtPmlwdjZfYWRkcnMpIAotICAgIGNpcmN1aXQtPmlwdjZfYWRkcnMgPSBsaXN0X25ldyAoKTsKLSAgZWxzZSB7Ci0gICAgZm9yIChub2RlID0gbGlzdGhlYWQgKGNpcmN1aXQtPmlwdjZfYWRkcnMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICAgIGlwNiA9IGdldGRhdGEgKG5vZGUpOwotICAgICAgaWYgKHByZWZpeF9zYW1lICgoc3RydWN0IHByZWZpeCAqKWlwNiwgKHN0cnVjdCBwcmVmaXggKilpcHY2KSkKLSAgICAgIGZvdW5kID0gMTsKLSAgICB9Ci0gICAgaWYgKGZvdW5kKSB7Ci0gICAgcHJlZml4X2lwdjZfZnJlZSAoaXB2Nik7Ci0gICAgcmV0dXJuIENNRF9TVUNDRVNTOwotICAgIH0KLSAgfQogCi0gIAorICBpZiAoY2lyY3VpdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHpsb2dfd2FybiAoImlwdjZfYWRkcmVzc19jbWQoKTogbm8gY2lyY3VpdCIpOworICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KKworCisgIGlwdjYgPSBwcmVmaXhfaXB2Nl9uZXcgKCk7CisKKyAgcmV0ID0gc3RyMnByZWZpeF9pcHY2IChhcmd2WzBdLCBpcHY2KTsKKyAgaWYgKHJldCA8PSAwKQorICAgIHsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIiUlIE1hbGZvcm1lZCBhZGRyZXNzICVzIiwgVlRZX05FV0xJTkUpOworICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KKworICBpZiAoIWNpcmN1aXQtPmlwdjZfYWRkcnMpCisgICAgY2lyY3VpdC0+aXB2Nl9hZGRycyA9IGxpc3RfbmV3ICgpOworICBlbHNlCisgICAgeworICAgICAgZm9yIChub2RlID0gbGlzdGhlYWQgKGNpcmN1aXQtPmlwdjZfYWRkcnMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisJeworCSAgaXA2ID0gZ2V0ZGF0YSAobm9kZSk7CisJICBpZiAocHJlZml4X3NhbWUgKChzdHJ1Y3QgcHJlZml4ICopIGlwNiwgKHN0cnVjdCBwcmVmaXggKikgaXB2NikpCisJICAgIGZvdW5kID0gMTsKKwl9CisgICAgICBpZiAoZm91bmQpCisJeworCSAgcHJlZml4X2lwdjZfZnJlZSAoaXB2Nik7CisJICByZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorICAgIH0KKworCiAgIGxpc3Rub2RlX2FkZCAoY2lyY3VpdC0+aXB2Nl9hZGRycywgaXB2Nik7CiAjaWZkZWYgRVhUUkVNRV9ERUJVRwogICB6bG9nX2luZm8gKCJhZGRlZCBJUHY2IGFkZHJlc3MgJXMgdG8gY2lyY3VpdCAlZCIsIGFyZ3ZbMF0sIGNpcmN1aXQtPmlkeCk7CkBAIC0yMDAzLDcgKzIxMjgsNyBAQAogCiBERUZVTiAobm9faXB2Nl9hZGRyZXNzLAogICAgICAgIG5vX2lwdjZfYWRkcmVzc19jbWQsCi0gICAgICAgIm5vIGlwdjYgYWRkcmVzcyBYOlg6Olg6WC9NIiwgICAgICAgICAgICAgIAorICAgICAgICJubyBpcHY2IGFkZHJlc3MgWDpYOjpYOlgvTSIsCiAgICAgICAgTk9fU1RSCiAgICAgICAgIkludGVyZmFjZSBJbnRlcm5ldCBQcm90b2NvbCBjb25maWcgY29tbWFuZHNcbiIKICAgICAgICAiU2V0IHRoZSBJUCBhZGRyZXNzIG9mIGFuIGludGVyZmFjZVxuIgpAQCAtMjAxNSw1MCArMjE0MCw1NCBAQAogICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgIGludCByZXQ7CiAKLSAgaWZwICA9IHZ0eS0+aW5kZXg7CisgIGlmcCA9IHZ0eS0+aW5kZXg7CiAgIGNpcmN1aXQgPSBpZnAtPmluZm87CiAgIC8qIFVHTFkgLSB3aWxsIHJlbW92ZSBsOHIgKi8KLSAgaWYgKGNpcmN1aXQgPT0gTlVMTCkgewotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQorICBpZiAoY2lyY3VpdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CiAgIGFzc2VydCAoY2lyY3VpdCk7CiAKLSAgaWYgKCFjaXJjdWl0LT5pcHY2X2FkZHJzIHx8IGNpcmN1aXQtPmlwdjZfYWRkcnMtPmNvdW50ID09IDApIHsKLSAgICB2dHlfb3V0ICh2dHksICJJbnZhbGlkIGFkZHJlc3MgJXMiLCBWVFlfTkVXTElORSk7Ci0gICAgcmV0dXJuIENNRF9XQVJOSU5HOwotICB9CisgIGlmICghY2lyY3VpdC0+aXB2Nl9hZGRycyB8fCBjaXJjdWl0LT5pcHY2X2FkZHJzLT5jb3VudCA9PSAwKQorICAgIHsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIkludmFsaWQgYWRkcmVzcyAlcyIsIFZUWV9ORVdMSU5FKTsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CiAgIHJldCA9IHN0cjJwcmVmaXhfaXB2NiAoYXJndlswXSwgJmlwdjYpOwotICBpZiAocmV0IDw9IDApIHsKLSAgICB2dHlfb3V0ICh2dHksICIlJSBNYWxmb3JtZWQgYWRkcmVzcyAlcyIsIFZUWV9ORVdMSU5FKTsKLSAgICByZXR1cm4gQ01EX1dBUk5JTkc7Ci0gIH0KLSAgCi0gIGZvciAobm9kZSA9IGxpc3RoZWFkIChjaXJjdWl0LT5pcHY2X2FkZHJzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7Ci0gICAgaXA2ID0gZ2V0ZGF0YSAobm9kZSk7Ci0gICAgaWYgKHByZWZpeF9zYW1lICgoc3RydWN0IHByZWZpeCAqKWlwNiwgKHN0cnVjdCBwcmVmaXggKikmaXB2NikpCi0gICAgICBicmVhazsKLSAgfQotICAKLSAgaWYgKGlwNikgewotICAgIGxpc3Rub2RlX2RlbGV0ZSAoY2lyY3VpdC0+aXB2Nl9hZGRycywgaXA2KTsKLSAgfSBlbHNlIHsKLSAgICB2dHlfb3V0ICh2dHksICJJbnZhbGlkIGFkZHJlc3MgJXMiLCBWVFlfTkVXTElORSk7Ci0gIH0KLSAgCisgIGlmIChyZXQgPD0gMCkKKyAgICB7CisgICAgICB2dHlfb3V0ICh2dHksICIlJSBNYWxmb3JtZWQgYWRkcmVzcyAlcyIsIFZUWV9ORVdMSU5FKTsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CisKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGNpcmN1aXQtPmlwdjZfYWRkcnMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisgICAgeworICAgICAgaXA2ID0gZ2V0ZGF0YSAobm9kZSk7CisgICAgICBpZiAocHJlZml4X3NhbWUgKChzdHJ1Y3QgcHJlZml4ICopIGlwNiwgKHN0cnVjdCBwcmVmaXggKikgJmlwdjYpKQorCWJyZWFrOworICAgIH0KKworICBpZiAoaXA2KQorICAgIHsKKyAgICAgIGxpc3Rub2RlX2RlbGV0ZSAoY2lyY3VpdC0+aXB2Nl9hZGRycywgaXA2KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB2dHlfb3V0ICh2dHksICJJbnZhbGlkIGFkZHJlc3MgJXMiLCBWVFlfTkVXTElORSk7CisgICAgfQorCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KICNlbmRpZiAvKiAwICovCi0jZW5kaWYgLyogSEFWRV9JUFY2ICovIAorI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwogCi0KLXN0cnVjdCBjbWRfbm9kZSBpbnRlcmZhY2Vfbm9kZSA9Ci17CitzdHJ1Y3QgY21kX25vZGUgaW50ZXJmYWNlX25vZGUgPSB7CiAgIElOVEVSRkFDRV9OT0RFLAogICAiJXMoY29uZmlnLWlmKSMgIiwKICAgMSwKIH07CiAKLQogaW50CiBpc2lzX2lmX25ld19ob29rIChzdHJ1Y3QgaW50ZXJmYWNlICppZnApCiB7CkBAIC0yMDc3LDExICsyMjA2LDkgQEAKICAgcmV0dXJuIDA7CiB9CiAKLQogdm9pZAogaXNpc19jaXJjdWl0X2luaXQgKCkKIHsKLSAgCiAgIC8qIEluaXRpYWxpemUgWmVicmEgaW50ZXJmYWNlIGRhdGEgc3RydWN0dXJlICovCiAgIGlmX2luaXQgKCk7CiAgIGlmX2FkZF9ob29rIChJRl9ORVdfSE9PSywgaXNpc19pZl9uZXdfaG9vayk7CkBAIC0yMTYyLDUgKzIyODksNCBAQAogICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmbm9faXB2Nl9hZGRyZXNzX2NtZCk7CiAjZW5kaWYKICNlbmRpZgotCiB9CmRpZmYgLS1naXQgYS9pc2lzZC9pc2lzX2NpcmN1aXQuaCBiL2lzaXNkL2lzaXNfY2lyY3VpdC5oCmluZGV4IDcxNjNjNWIuLjQ4NGMwNTcgMTAwNjQ0Ci0tLSBhL2lzaXNkL2lzaXNfY2lyY3VpdC5oCisrKyBiL2lzaXNkL2lzaXNfY2lyY3VpdC5oCkBAIC0yNSwxMzQgKzI1LDEzOSBAQAogCiAjZGVmaW5lIENJUkNVSVRfTUFYIDI1NQogCi1zdHJ1Y3QgcGFzc3dvcmQgeworc3RydWN0IHBhc3N3b3JkCit7CiAgIHN0cnVjdCBwYXNzd29yZCAqbmV4dDsKLSAgaW50ICAgICAgICAgICAgICAgbGVuOwotICB1X2NoYXIgICAgICAgICAgKnBhc3M7CisgIGludCBsZW47CisgIHVfY2hhciAqcGFzczsKIH07CiAKLXN0cnVjdCBtZXRyaWMgeworc3RydWN0IG1ldHJpYworewogICB1X2NoYXIgbWV0cmljX2RlZmF1bHQ7CiAgIHVfY2hhciBtZXRyaWNfZXJyb3I7CiAgIHVfY2hhciBtZXRyaWNfZXhwZW5zZTsKICAgdV9jaGFyIG1ldHJpY19kZWxheTsKIH07CiAKLXN0cnVjdCBpc2lzX2JjYXN0X2luZm8gewotICB1X2NoYXIgc25wYSBbRVRIX0FMRU5dOyAgICAgICAgICAgICAgICAgIC8qIFNOUEEgb2YgdGhpcyBjaXJjdWl0ICovCi0gIGNoYXIgcnVuX2RyX2VsZWN0WzJdOyAgICAgICAgICAgICAgICAgICAgLyogU2hvdWxkIHdlIHJ1biBkciBlbGVjdGlvbiA/ICovCi0gIHN0cnVjdCB0aHJlYWQgKnRfcnVuX2RyWzJdOyAgICAgICAgICAgICAgLyogRFIgZWxlY3Rpb24gdGhyZWFkICovCi0gIHN0cnVjdCB0aHJlYWQgKnRfc2VuZF9sYW5faGVsbG9bMl07ICAgICAgLyogc2VuZCBMQU4gSUlIcyBpbiB0aGlzIHRocmVhZCAqLwotICBzdHJ1Y3QgbGlzdCAqYWRqZGJbMl07ICAgICAgICAgICAgICAgICAgIC8qIGFkamFjZW5jeSBkYnMgKi8KLSAgc3RydWN0IGxpc3QgKmxhbl9uZWlnaHNbMl07ICAgICAgICAgICAgICAvKiBsaXN0IG9mIGx4IG5laWdoIHNucGEgKi8KLSAgY2hhciBpc19kclsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBcmUgd2UgbGV2ZWwgeCBEUiA/ICovCi0gIHVfY2hhciBsMV9kZXNpZ19pc1tJU0lTX1NZU19JRF9MRU4gKyAxXTsgLyogbGV2ZWwtMSBEUiAqLwotICB1X2NoYXIgbDJfZGVzaWdfaXNbSVNJU19TWVNfSURfTEVOICsgMV07IC8qIGxldmVsLTIgRFIgKi8KLSAgc3RydWN0IHRocmVhZCAqdF9yZWZyZXNoX3BzZXVkb19sc3BbMl07ICAvKiByZWZyZXNoIHBzZXVkby1ub2RlIExTUHMgKi8KLSAgaW50IHBhZF9oZWxsb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGQgcGFkZGluZyB0byBIZWxsbyBQRFVzID8gKi8KLSAgdV9jaGFyIHByaW9yaXR5WzJdOyAgICAgICAgICAgICAgICAgICAgICAvKiBsMS8yIElTIFByaW9yaXR5ICovCitzdHJ1Y3QgaXNpc19iY2FzdF9pbmZvCit7CisgIHVfY2hhciBzbnBhW0VUSF9BTEVOXTsJLyogU05QQSBvZiB0aGlzIGNpcmN1aXQgKi8KKyAgY2hhciBydW5fZHJfZWxlY3RbMl07CQkvKiBTaG91bGQgd2UgcnVuIGRyIGVsZWN0aW9uID8gKi8KKyAgc3RydWN0IHRocmVhZCAqdF9ydW5fZHJbMl07CS8qIERSIGVsZWN0aW9uIHRocmVhZCAqLworICBzdHJ1Y3QgdGhyZWFkICp0X3NlbmRfbGFuX2hlbGxvWzJdOwkvKiBzZW5kIExBTiBJSUhzIGluIHRoaXMgdGhyZWFkICovCisgIHN0cnVjdCBsaXN0ICphZGpkYlsyXTsJLyogYWRqYWNlbmN5IGRicyAqLworICBzdHJ1Y3QgbGlzdCAqbGFuX25laWdoc1syXTsJLyogbGlzdCBvZiBseCBuZWlnaCBzbnBhICovCisgIGNoYXIgaXNfZHJbMl07CQkvKiBBcmUgd2UgbGV2ZWwgeCBEUiA/ICovCisgIHVfY2hhciBsMV9kZXNpZ19pc1tJU0lTX1NZU19JRF9MRU4gKyAxXTsJLyogbGV2ZWwtMSBEUiAqLworICB1X2NoYXIgbDJfZGVzaWdfaXNbSVNJU19TWVNfSURfTEVOICsgMV07CS8qIGxldmVsLTIgRFIgKi8KKyAgc3RydWN0IHRocmVhZCAqdF9yZWZyZXNoX3BzZXVkb19sc3BbMl07CS8qIHJlZnJlc2ggcHNldWRvLW5vZGUgTFNQcyAqLworICBpbnQgcGFkX2hlbGxvczsJCS8qIGFkZCBwYWRkaW5nIHRvIEhlbGxvIFBEVXMgPyAqLworICB1X2NoYXIgcHJpb3JpdHlbMl07CQkvKiBsMS8yIElTIFByaW9yaXR5ICovCiB9OwogCi1zdHJ1Y3QgaXNpc19wMnBfaW5mbyB7Ci0gIHN0cnVjdCBpc2lzX2FkamFjZW5jeSAgICAqbmVpZ2hib3I7Ci0gIHN0cnVjdCB0aHJlYWQgKnRfc2VuZF9wMnBfaGVsbG87ICAgICAgICAgLyogc2VuZCBQMlAgSUlIcyBpbiB0aGlzIHRocmVhZCAgKi8KK3N0cnVjdCBpc2lzX3AycF9pbmZvCit7CisgIHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqbmVpZ2hib3I7CisgIHN0cnVjdCB0aHJlYWQgKnRfc2VuZF9wMnBfaGVsbG87CS8qIHNlbmQgUDJQIElJSHMgaW4gdGhpcyB0aHJlYWQgICovCiB9OwogCi1zdHJ1Y3QgaXNpc19jaXJjdWl0IHsKK3N0cnVjdCBpc2lzX2NpcmN1aXQKK3sKICAgaW50IHN0YXRlOwotICB1X2NoYXIgY2lyY3VpdF9pZDsgICAgICAgICAgICAgLyogbDEvbDIgcDJwL2JjYXN0IENpcmN1aXRJRCAqLwotICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOyAgICAgICAgLyogYmFjayBwb2ludGVyIHRvIHRoZSBhcmVhICovCi0gIHN0cnVjdCBpbnRlcmZhY2UgKmludGVyZmFjZTsgICAvKiBpbnRlcmZhY2UgaW5mbyBmcm9tIHogKi8KLSAgaW50IGZkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElTLUlTIGwxLzIgc29ja2V0ICovCi0gIHN0cnVjdCBubHBpZHMgbmxwaWRzOyAgICAKKyAgdV9jaGFyIGNpcmN1aXRfaWQ7CQkvKiBsMS9sMiBwMnAvYmNhc3QgQ2lyY3VpdElEICovCisgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWE7CS8qIGJhY2sgcG9pbnRlciB0byB0aGUgYXJlYSAqLworICBzdHJ1Y3QgaW50ZXJmYWNlICppbnRlcmZhY2U7CS8qIGludGVyZmFjZSBpbmZvIGZyb20geiAqLworICBpbnQgZmQ7CQkJLyogSVMtSVMgbDEvMiBzb2NrZXQgKi8KKyAgc3RydWN0IG5scGlkcyBubHBpZHM7CiAgIC8qCiAgICAqIFRocmVhZHMKICAgICovCiAgIHN0cnVjdCB0aHJlYWQgKnRfcmVhZDsKICAgc3RydWN0IHRocmVhZCAqdF9zZW5kX2NzbnBbMl07CiAgIHN0cnVjdCB0aHJlYWQgKnRfc2VuZF9wc25wWzJdOwotICBzdHJ1Y3QgbGlzdCAqbHNwX3F1ZXVlOyAgICAgICAgLyogTFNQcyB0byBiZSB0eGVkIChib3RoIGxldmVscykgKi8KKyAgc3RydWN0IGxpc3QgKmxzcF9xdWV1ZTsJLyogTFNQcyB0byBiZSB0eGVkIChib3RoIGxldmVscykgKi8KICAgLyogdGhlcmUgaXMgbm8gcmVhbCBwb2ludCBpbiB0d28gc3RyZWFtcywganVzdCBmb3IgcHJvZ3JhbW1pbmcga2lja2VyICovCi0gIGludCAoKiByeCkgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsIHVfY2hhciAqc3NucGEpOwotICBzdHJ1Y3Qgc3RyZWFtICpyY3Zfc3RyZWFtOyAgICAgLyogU3RyZWFtIGZvciByZWNlaXZpbmcgKi8KLSAgaW50ICgqIHR4KSAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgaW50IGxldmVsKTsKLSAgc3RydWN0IHN0cmVhbSAqc25kX3N0cmVhbTsgICAgIC8qIFN0cmVhbSBmb3Igc2VuZGluZyAqLwotICBpbnQgaWR4OyAgICAgICAgICAgICAgICAgICAgICAgLyogaWR4IGluIFNbUk18U05dIGZsYWdzICovCi0jZGVmaW5lIENJUkNVSVRfVF9CUk9BRENBU1QgIDAgCisgIGludCAoKnJ4KSAoc3RydWN0IGlzaXNfY2lyY3VpdCAqIGNpcmN1aXQsIHVfY2hhciAqIHNzbnBhKTsKKyAgc3RydWN0IHN0cmVhbSAqcmN2X3N0cmVhbTsJLyogU3RyZWFtIGZvciByZWNlaXZpbmcgKi8KKyAgaW50ICgqdHgpIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICogY2lyY3VpdCwgaW50IGxldmVsKTsKKyAgc3RydWN0IHN0cmVhbSAqc25kX3N0cmVhbTsJLyogU3RyZWFtIGZvciBzZW5kaW5nICovCisgIGludCBpZHg7CQkJLyogaWR4IGluIFNbUk18U05dIGZsYWdzICovCisjZGVmaW5lIENJUkNVSVRfVF9CUk9BRENBU1QgIDAKICNkZWZpbmUgQ0lSQ1VJVF9UX1AyUCAgICAgICAgMQogI2RlZmluZSBDSVJDVUlUX1RfU1RBVElDX0lOICAyCiAjZGVmaW5lIENJUkNVSVRfVF9TVEFUSUNfT1VUIDMKICNkZWZpbmUgQ0lSQ1VJVF9UX0RBICAgICAgICAgNAotICBpbnQgICAgICAgIGNpcmNfdHlwZTsgICAgICAgICAgLyogdHlwZSBvZiB0aGUgcGh5c2ljYWwgaW50ZXJmYWNlICovCi0gIHVuaW9uIHsKKyAgaW50IGNpcmNfdHlwZTsJCS8qIHR5cGUgb2YgdGhlIHBoeXNpY2FsIGludGVyZmFjZSAqLworICB1bmlvbgorICB7CiAgICAgc3RydWN0IGlzaXNfYmNhc3RfaW5mbyBiYzsKICAgICBzdHJ1Y3QgaXNpc19wMnBfaW5mbyBwMnA7CiAgIH0gdTsKLSAgY2hhciBleHRfZG9tYWluOyAgICAgICAgICAgICAgIC8qIGV4dGVybmFsRG9tYWluICAgKGJvb2xlYW4pICovCisgIGNoYXIgZXh0X2RvbWFpbjsJCS8qIGV4dGVybmFsRG9tYWluICAgKGJvb2xlYW4pICovCiAgIC8qIAogICAgKiBDb25maWd1cmFibGVzIAogICAgKi8KLSAgc3RydWN0IGlzaXNfcGFzc3dkIHBhc3N3ZDsgICAgICAvKiBDaXJjdWl0IHJ4L3R4IHBhc3N3b3JkICovCi0gIGxvbmcgbHNwX2ludGVydmFsOyAgICAgICAgICAgIAotICBpbnQgbWFudWFsX2wyX29ubHk7ICAgICAgICAgICAgIC8qIG1hbnVhbEwyT25seU1vZGUgKGJvb2xlYW4pICovCi0gIGludCBjaXJjdWl0X2lzX3R5cGU7ICAgICAgICAgICAgLyogY2lyY3VpdCBpcyB0eXBlID09IGxldmVsIG9mIGNpcmN1aXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkaWZmcmVuY2lhdGVkIGZyb20gY2lyY3VpdCB0eXBlIChtZWRpYSkgKi8KLSAgdV9pbnQzMl90IGhlbGxvX2ludGVydmFsWzJdOyAgICAvKiBsMUhlbGxvSW50ZXJ2YWwgaW4gbXNlY3MgKi8KLSAgdV9pbnQxNl90IGhlbGxvX211bHRpcGxpZXJbMl07ICAvKiBsMUhlbGxvTXVsdGlwbGllciAqLwotICB1X2ludDE2X3QgY3NucF9pbnRlcnZhbFsyXTsgICAgIC8qIGxldmVsLTEgY3NucC1pbnRlcnZhbCBpbiBzZWNvbmRzICovCi0gIHVfaW50MTZfdCBwc25wX2ludGVydmFsWzJdOyAgICAgLyogbGV2ZWwtMSBwc25wLWludGVydmFsIGluIHNlY29uZHMgKi8KLSAgc3RydWN0IG1ldHJpYyBtZXRyaWNzWzJdOyAgICAgICAvKiBsMVh4eE1ldHJpYyAqLwotICBzdHJ1Y3QgcGFzc3dvcmQgKmNfcnhfcGFzc3dkczsgIC8qIGNpcmN1aXRSZWNlaXZlUGFzc3dvcmRzICovCi0gIHN0cnVjdCBwYXNzd29yZCAqY190Y19wYXNzd2Q7ICAgLyogY2lyY3VpdFRyYW5zbWl0UGFzc3dvcmQgKi8KLSAgaW50IGlwX3JvdXRlcjsgICAgICAgICAgICAgICAgICAvKiBSb3V0ZSBJUCA/ICovCi0gIHN0cnVjdCBsaXN0ICppcF9hZGRyczsgICAgICAgICAgLyogb3VyIElQIGFkZHJlc3NlcyAqLworICBzdHJ1Y3QgaXNpc19wYXNzd2QgcGFzc3dkOwkvKiBDaXJjdWl0IHJ4L3R4IHBhc3N3b3JkICovCisgIGxvbmcgbHNwX2ludGVydmFsOworICBpbnQgbWFudWFsX2wyX29ubHk7CQkvKiBtYW51YWxMMk9ubHlNb2RlIChib29sZWFuKSAqLworICBpbnQgY2lyY3VpdF9pc190eXBlOwkJLyogY2lyY3VpdCBpcyB0eXBlID09IGxldmVsIG9mIGNpcmN1aXQKKwkJCQkgKiBkaWZmcmVuY2lhdGVkIGZyb20gY2lyY3VpdCB0eXBlIChtZWRpYSkgKi8KKyAgdV9pbnQzMl90IGhlbGxvX2ludGVydmFsWzJdOwkvKiBsMUhlbGxvSW50ZXJ2YWwgaW4gbXNlY3MgKi8KKyAgdV9pbnQxNl90IGhlbGxvX211bHRpcGxpZXJbMl07CS8qIGwxSGVsbG9NdWx0aXBsaWVyICovCisgIHVfaW50MTZfdCBjc25wX2ludGVydmFsWzJdOwkvKiBsZXZlbC0xIGNzbnAtaW50ZXJ2YWwgaW4gc2Vjb25kcyAqLworICB1X2ludDE2X3QgcHNucF9pbnRlcnZhbFsyXTsJLyogbGV2ZWwtMSBwc25wLWludGVydmFsIGluIHNlY29uZHMgKi8KKyAgc3RydWN0IG1ldHJpYyBtZXRyaWNzWzJdOwkvKiBsMVh4eE1ldHJpYyAqLworICBzdHJ1Y3QgcGFzc3dvcmQgKmNfcnhfcGFzc3dkczsJLyogY2lyY3VpdFJlY2VpdmVQYXNzd29yZHMgKi8KKyAgc3RydWN0IHBhc3N3b3JkICpjX3RjX3Bhc3N3ZDsJLyogY2lyY3VpdFRyYW5zbWl0UGFzc3dvcmQgKi8KKyAgaW50IGlwX3JvdXRlcjsJCS8qIFJvdXRlIElQID8gKi8KKyAgc3RydWN0IGxpc3QgKmlwX2FkZHJzOwkvKiBvdXIgSVAgYWRkcmVzc2VzICovCiAjaWZkZWYgSEFWRV9JUFY2Ci0gIGludCBpcHY2X3JvdXRlcjsgICAgICAgICAgICAgICAgLyogUm91dGUgSVB2NiA/ICovCi0gIHN0cnVjdCBsaXN0ICppcHY2X2xpbms7ICAgICAgICAgLyogb3VyIGxpbmsgbG9jYWwgSVB2NiBhZGRyZXNzZXMgKi8KLSAgc3RydWN0IGxpc3QgKmlwdjZfbm9uX2xpbms7ICAgICAvKiBvdXIgbm9uLWxpbmsgbG9jYWwgSVB2NiBhZGRyZXNzZXMgKi8KLSNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KKyAgaW50IGlwdjZfcm91dGVyOwkJLyogUm91dGUgSVB2NiA/ICovCisgIHN0cnVjdCBsaXN0ICppcHY2X2xpbms7CS8qIG91ciBsaW5rIGxvY2FsIElQdjYgYWRkcmVzc2VzICovCisgIHN0cnVjdCBsaXN0ICppcHY2X25vbl9saW5rOwkvKiBvdXIgbm9uLWxpbmsgbG9jYWwgSVB2NiBhZGRyZXNzZXMgKi8KKyNlbmRpZgkJCQkvKiBIQVZFX0lQVjYgKi8KICAgLyogCiAgICAqIFJGQyAyOTczIElTLUlTIE1lc2ggR3JvdXBzIAogICAgKi8KICNkZWZpbmUgTUVTSF9JTkFDVElWRSAwCiAjZGVmaW5lIE1FU0hfQkxPQ0tFRCAgMQogI2RlZmluZSBNRVNIX1NFVCAgICAgIDIKLSAgaW50IG1lc2hfZW5hYmxlZDsgICAgICAgICAgICAgICAvKiBtZXNoR3JvdXBFbmFibGVkICovCi0gIHVfaW50MTZfdCBtZXNoX2dyb3VwOyAgICAgICAgICAgLyogbWVzaEdyb3VwICovCisgIGludCBtZXNoX2VuYWJsZWQ7CQkvKiBtZXNoR3JvdXBFbmFibGVkICovCisgIHVfaW50MTZfdCBtZXNoX2dyb3VwOwkJLyogbWVzaEdyb3VwICovCiAgIHVfaW50MTZfdCB1cGFkamNvdW50WzJdOwogICAvKgogICAgKiBDb3VudGVycyBhcyBpbiAxMDU4OS0tMTEuMi41LjkKICAgICovCi0gIHVfaW50MzJfdCBhZGpfc3RhdGVfY2hhbmdlczsgICAgLyogY2hhbmdlc0luQWRqYWNlbmN5U3RhdGUgKi8KLSAgdV9pbnQzMl90IGluaXRfZmFpbHVyZXM7ICAgICAgICAvKiBpbnRpYWxpc2F0aW9uRmFpbHVyZXMgKi8KLSAgdV9pbnQzMl90IGN0cmxfcGR1c19yeGVkOyAgICAgICAvKiBjb250cm9sUERVc1JlY2VpdmVkICovCi0gIHVfaW50MzJfdCBjdHJsX3BkdXNfdHhlZDsgICAgICAgLyogY29udHJvbFBEVXNTZW50ICovCi0gIHVfaW50MzJfdCBkZXNpZ19jaGFuZ2VzWzJdOyAgICAgLyogbGFuTHhEZXNpZ25hdGVkSW50ZXJtZWRpYXRlU3lzdGVtQ2hhbmdlcyovCi0gIHVfaW50MzJfdCByZWpfYWRqYWNlbmNpZXM7ICAgICAgLyogcmVqZWN0ZWRBZGphY2VuY2llcyAqLworICB1X2ludDMyX3QgYWRqX3N0YXRlX2NoYW5nZXM7CS8qIGNoYW5nZXNJbkFkamFjZW5jeVN0YXRlICovCisgIHVfaW50MzJfdCBpbml0X2ZhaWx1cmVzOwkvKiBpbnRpYWxpc2F0aW9uRmFpbHVyZXMgKi8KKyAgdV9pbnQzMl90IGN0cmxfcGR1c19yeGVkOwkvKiBjb250cm9sUERVc1JlY2VpdmVkICovCisgIHVfaW50MzJfdCBjdHJsX3BkdXNfdHhlZDsJLyogY29udHJvbFBEVXNTZW50ICovCisgIHVfaW50MzJfdCBkZXNpZ19jaGFuZ2VzWzJdOwkvKiBsYW5MeERlc2lnbmF0ZWRJbnRlcm1lZGlhdGVTeXN0ZW1DaGFuZ2VzICovCisgIHVfaW50MzJfdCByZWpfYWRqYWNlbmNpZXM7CS8qIHJlamVjdGVkQWRqYWNlbmNpZXMgKi8KIH07CiAKK3ZvaWQgaXNpc19jaXJjdWl0X2luaXQgKHZvaWQpOworc3RydWN0IGlzaXNfY2lyY3VpdCAqaXNpc19jaXJjdWl0X25ldyAodm9pZCk7CitzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0X2xvb2t1cF9ieV9pZnAgKHN0cnVjdCBpbnRlcmZhY2UgKmlmcCwKKwkJCQkJICAgIHN0cnVjdCBsaXN0ICpsaXN0KTsKK3N0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXRfc2Nhbl9ieV9pZnAgKHN0cnVjdCBpbnRlcmZhY2UgKmlmcCk7Cit2b2lkIGlzaXNfY2lyY3VpdF9kZWwgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQpOwordm9pZCBpc2lzX2NpcmN1aXRfY29uZmlndXJlIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LAorCQkJICAgICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhKTsKK3ZvaWQgaXNpc19jaXJjdWl0X3VwIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0KTsKK3ZvaWQgaXNpc19jaXJjdWl0X2RlY29uZmlndXJlIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LAorCQkJICAgICAgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWEpOwogCi12b2lkICAgICAgICAgICAgICAgICBpc2lzX2NpcmN1aXRfaW5pdCAgICAgICAgKHZvaWQpOwotc3RydWN0IGlzaXNfY2lyY3VpdCAqaXNpc19jaXJjdWl0X25ldyAgICAgICAgICh2b2lkKTsKLXN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXRfbG9va3VwX2J5X2lmcCAgICAoc3RydWN0IGludGVyZmFjZSAqaWZwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxpc3QgKmxpc3QpOwotc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdF9zY2FuX2J5X2lmcCAgICAgIChzdHJ1Y3QgaW50ZXJmYWNlICppZnApOwotdm9pZCAgICAgICAgICAgICAgICAgaXNpc19jaXJjdWl0X2RlbCAgICAgICAgIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0KTsKLXZvaWQgICAgICAgICAgICAgICAgIGlzaXNfY2lyY3VpdF9jb25maWd1cmUgICAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWEpOwotdm9pZCAgICAgICAgICAgICAgICAgaXNpc19jaXJjdWl0X3VwICAgICAgICAgIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0KTsKLXZvaWQgICAgICAgICAgICAgICAgIGlzaXNfY2lyY3VpdF9kZWNvbmZpZ3VyZSAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWEpOwotCi1pbnQgICAgICAgICAgICAgICAgICBpc2lzX2NpcmN1aXRfZGVzdHJveSAgICAgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQpOwotdm9pZCAgICAgICAgICAgICAgICAgaXNpc19jaXJjdWl0X2lmX2FkZCAgICAgIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZXJmYWNlICppZnApOwotdm9pZCAgICAgICAgICAgICAgICAgaXNpc19jaXJjdWl0X2lmX2RlbCAgICAgIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0KTsKLXZvaWQgICAgICAgICAgICAgICAgIGNpcmN1aXRfdXBkYXRlX25scGlkcyAgICAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCk7Ci12b2lkICAgICAgICAgICAgICAgICBpc2lzX2NpcmN1aXRfdXBkYXRlX3BhcmFtcyAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZXJmYWNlICppZnApOwotdm9pZCAgICAgICAgICAgICAgICAgaXNpc19jaXJjdWl0X2FkZF9hZGRyIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbm5lY3RlZCAqY29ubik7Ci12b2lkICAgICAgICAgICAgICAgICBpc2lzX2NpcmN1aXRfZGVsX2FkZHIgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29ubmVjdGVkICpjb25uKTsKK2ludCBpc2lzX2NpcmN1aXRfZGVzdHJveSAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCk7Cit2b2lkIGlzaXNfY2lyY3VpdF9pZl9hZGQgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsCisJCQkgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcCk7Cit2b2lkIGlzaXNfY2lyY3VpdF9pZl9kZWwgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQpOwordm9pZCBjaXJjdWl0X3VwZGF0ZV9ubHBpZHMgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQpOwordm9pZCBpc2lzX2NpcmN1aXRfdXBkYXRlX3BhcmFtcyAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwKKwkJCQkgc3RydWN0IGludGVyZmFjZSAqaWZwKTsKK3ZvaWQgaXNpc19jaXJjdWl0X2FkZF9hZGRyIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LAorCQkJICAgIHN0cnVjdCBjb25uZWN0ZWQgKmNvbm4pOwordm9pZCBpc2lzX2NpcmN1aXRfZGVsX2FkZHIgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsCisJCQkgICAgc3RydWN0IGNvbm5lY3RlZCAqY29ubik7CiAjZW5kaWYgLyogX1pFQlJBX0lTSVNfQ0lSQ1VJVF9IICovCmRpZmYgLS1naXQgYS9pc2lzZC9pc2lzX2NvbW1vbi5oIGIvaXNpc2QvaXNpc19jb21tb24uaAppbmRleCA5NTFlNjM3Li43YTA3NjhhIDEwMDY0NAotLS0gYS9pc2lzZC9pc2lzX2NvbW1vbi5oCisrKyBiL2lzaXNkL2lzaXNfY29tbW9uLmgKQEAgLTIzLDEzICsyMywxNSBAQAogCiAvKgogICogQXJlYSBBZGRyZXNzCi0gKi8gCi1zdHJ1Y3QgYXJlYV9hZGRyIHsKLSAgdV9jaGFyICAgICAgICAgICAgIGFkZHJfbGVuOwotICB1X2NoYXIgICAgICAgICAgICAgYXJlYV9hZGRyWzIwXTsKKyAqLworc3RydWN0IGFyZWFfYWRkcgoreworICB1X2NoYXIgYWRkcl9sZW47CisgIHVfY2hhciBhcmVhX2FkZHJbMjBdOwogfTsKIAotc3RydWN0IGlzaXNfcGFzc3dkIHsKK3N0cnVjdCBpc2lzX3Bhc3N3ZAorewogICB1X2NoYXIgbGVuOwogI2RlZmluZSBJU0lTX1BBU1NXRF9UWVBFX1VOVVNFRCAgIDAKICNkZWZpbmUgSVNJU19QQVNTV0RfVFlQRV9DTEVBUlRYVCAxCkBAIC00Myw3ICs0NSw4IEBACiAgKiBvbmUgc3RydWN0IGZvciBjYWNoZSBsaXN0CiAgKiBvbmUgc3RydWN0IGZvciBMU1AgVExWCiAgKi8KLXN0cnVjdCBob3N0bmFtZSB7CitzdHJ1Y3QgaG9zdG5hbWUKK3sKICAgdV9jaGFyIG5hbWVsZW47CiAgIHVfY2hhciBuYW1lWzI1NV07CiB9OwpAQCAtNTEsMTUgKzU0LDE3IEBACiAvKgogICogU3VwcG9ydGVkIFByb3RvY29sIElEcwogICovCi1zdHJ1Y3QgbmxwaWRzIHsKK3N0cnVjdCBubHBpZHMKK3sKICAgdV9jaGFyIGNvdW50OwotICB1X2NoYXIgbmxwaWRzWzRdOyAvKiBGSVhNRTogZW5vdWdoID8gKi8gCisgIHVfY2hhciBubHBpZHNbNF07CQkvKiBGSVhNRTogZW5vdWdoID8gKi8KIH07CiAKIC8qCiAgKiBGbGFncyBzdHJ1Y3R1cmUgZm9yIFNTTiBhbmQgU1JNIGZsYWdzCi0gKi8gCi1zdHJ1Y3QgZmxhZ3MgeworICovCitzdHJ1Y3QgZmxhZ3MKK3sKICAgaW50IG1heGluZGV4OwogICBzdHJ1Y3QgbGlzdCAqZnJlZV9pZGNzOwogfTsKZGlmZiAtLWdpdCBhL2lzaXNkL2lzaXNfY29uc3RhbnRzLmggYi9pc2lzZC9pc2lzX2NvbnN0YW50cy5oCmluZGV4IGM3MzJiZmMuLjFiNzViYTYgMTAwNjQ0Ci0tLSBhL2lzaXNkL2lzaXNfY29uc3RhbnRzLmgKKysrIGIvaXNpc2QvaXNpc19jb25zdGFudHMuaApAQCAtMjUsOSArMjUsOSBAQAogCiAvKgogICogQXJjaGl0ZWN0dXJhbCBjb25zdGFudCB2YWx1ZXMgZnJvbSBwLiAzNSBvZiBJU08vSUVDIDEwNTg5Ci0gKi8gCisgKi8KIAotI2RlZmluZSBNQVhfTElOS19NRVRSSUMgICAgICAgICAgICAgICA2MyAKKyNkZWZpbmUgTUFYX0xJTktfTUVUUklDICAgICAgICAgICAgICAgNjMKICNkZWZpbmUgTUFYX1BBVEhfTUVUUklDICAgICAgICAgICAgICAgMTAyMwogI2RlZmluZSBJU09fU0FQICAgICAgICAgICAgICAgICAgICAgICAweEZFCiAjZGVmaW5lIElOVFJBRE9NQUlOX1JPVVRFSU5HX1NFTEVDVE9SIDAKQEAgLTM4LDExICszOCwxMSBAQAogICogaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaml0dGVyIHZhbHVlcwogICovCiAKLSNkZWZpbmUgSUlIX0pJVFRFUiAgICAgICAgICAgICAgICAgICAgMjUgIC8qICUgKi8KLSNkZWZpbmUgTUFYX0FHRV9KSVRURVIgICAgICAgICAgICAgICAgIDUgIC8qICUgKi8KLSNkZWZpbmUgTUFYX0xTUF9HRU5fSklUVEVSICAgICAgICAgICAgIDUgIC8qICUgKi8KLSNkZWZpbmUgQ1NOUF9KSVRURVIgICAgICAgICAgICAgICAgICAgMTAgIC8qICUgKi8KLSNkZWZpbmUgUFNOUF9KSVRURVIgICAgICAgICAgICAgICAgICAgMTAgIC8qICUgKi8KKyNkZWZpbmUgSUlIX0pJVFRFUiAgICAgICAgICAgICAgICAgICAgMjUJLyogJSAqLworI2RlZmluZSBNQVhfQUdFX0pJVFRFUiAgICAgICAgICAgICAgICAgNQkvKiAlICovCisjZGVmaW5lIE1BWF9MU1BfR0VOX0pJVFRFUiAgICAgICAgICAgICA1CS8qICUgKi8KKyNkZWZpbmUgQ1NOUF9KSVRURVIgICAgICAgICAgICAgICAgICAgMTAJLyogJSAqLworI2RlZmluZSBQU05QX0pJVFRFUiAgICAgICAgICAgICAgICAgICAxMAkvKiAlICovCiAKICNkZWZpbmUgUkFORE9NX1NQUkVBRCAgICAgICAgICAgMTAwMDAwLjAKIApAQCAtNzAsMTIgKzcwLDEyIEBACiAjZGVmaW5lIEhFTExPX01VTFRJUExJRVIgICAgICAgICAgICAgIDMKICNkZWZpbmUgREVGQVVMVF9QUklPUklUWSAgICAgICAgICAgICAgNjQKIC8qIGRpZmZlcmVudCB2ZW5kb3JzIGltcGxlbWVudCBkaWZmZXJlbnQgdmFsdWVzIDUtMTAgb24gYXZlcmFnZSAqLwotI2RlZmluZSBMU1BfR0VOX0lOVEVSVkFMX0RFRkFVTFQgICAgICAxMCAKLSNkZWZpbmUgTFNQX0lOVEVSVkFMICAgICAgICAgICAgICAgICAgMzMgIC8qIG1zZWNzICovCisjZGVmaW5lIExTUF9HRU5fSU5URVJWQUxfREVGQVVMVCAgICAgIDEwCisjZGVmaW5lIExTUF9JTlRFUlZBTCAgICAgICAgICAgICAgICAgIDMzCS8qIG1zZWNzICovCiAjZGVmaW5lIERFRkFVTFRfQ0lSQ1VJVF9NRVRSSUNTIDEwCiAjZGVmaW5lIE1FVFJJQ1NfVU5TVVBQT1JURUQgMHg4MAotI2RlZmluZSBQRVJJT0RJQ19TUEZfSU5URVJWQUwgICAgICAgICA2MCAvKiBhdCB0aGUgdG9wIG9mIG15IGhlYWQgKi8KLSNkZWZpbmUgTUlOSU1VTV9TUEZfSU5URVJWQUwgICAgICAgICAgIDUgLyogLi4gc2FtZSBoZXJlICAgICAgICAgICovIAorI2RlZmluZSBQRVJJT0RJQ19TUEZfSU5URVJWQUwgICAgICAgICA2MAkvKiBhdCB0aGUgdG9wIG9mIG15IGhlYWQgKi8KKyNkZWZpbmUgTUlOSU1VTV9TUEZfSU5URVJWQUwgICAgICAgICAgIDUJLyogLi4gc2FtZSBoZXJlICAgICAgICAgICovCiAKIC8qCiAgKiBOTFBJRCB2YWx1ZXMKQEAgLTE0MywxMiArMTQzLDQgQEAKICNkZWZpbmUgRVRIX0FMRU4gNgogI2VuZGlmCiAKLSNlbmRpZiAgLyogSVNJU19DT05TVEFOVFNfSCAqLwotCi0KLQotCi0KLQotCi0KKyNlbmRpZiAvKiBJU0lTX0NPTlNUQU5UU19IICovCmRpZmYgLS1naXQgYS9pc2lzZC9pc2lzX2NzbS5jIGIvaXNpc2QvaXNpc19jc20uYwppbmRleCBiMjA1NzkwLi44ZjQ0ZGIxIDEwMDY0NAotLS0gYS9pc2lzZC9pc2lzX2NzbS5jCisrKyBiL2lzaXNkL2lzaXNfY3NtLmMKQEAgLTUyLDggKzUyLDcgQEAKIAogZXh0ZXJuIHN0cnVjdCBpc2lzICppc2lzOwogCi1zdGF0aWMgY2hhciAqY3NtX3N0YXRlc3RyW10gPSAKLXsKK3N0YXRpYyBjaGFyICpjc21fc3RhdGVzdHJbXSA9IHsKICAgIkNfU1RBVEVfTkEiLAogICAiQ19TVEFURV9JTklUIiwKICAgIkNfU1RBVEVfQ09ORiIsCkBAIC02Miw4ICs2MSw3IEBACiAKICNkZWZpbmUgU1RBVEUyU1RSKFMpIGNzbV9zdGF0ZXN0cltTXQogCi1zdGF0aWMgY2hhciAqY3NtX2V2ZW50c3RyW10gPQoteworc3RhdGljIGNoYXIgKmNzbV9ldmVudHN0cltdID0gewogICAiTk9fU1RBVEUiLAogICAiSVNJU19FTkFCTEUiLAogICAiSUZfVVBfRlJPTV9aIiwKQEAgLTczLDExMyArNzEsMTEzIEBACiAKICNkZWZpbmUgRVZFTlQyU1RSKEUpIGNzbV9ldmVudHN0cltFXQogCi0KLXN0cnVjdCBpc2lzX2NpcmN1aXQqCi1pc2lzX2NzbV9zdGF0ZV9jaGFuZ2UgKGludCBldmVudCwgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZykKK3N0cnVjdCBpc2lzX2NpcmN1aXQgKgoraXNpc19jc21fc3RhdGVfY2hhbmdlIChpbnQgZXZlbnQsIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsIHZvaWQgKmFyZykKIHsKICAgaW50IG9sZF9zdGF0ZTsKIAogICBvbGRfc3RhdGUgPSBjaXJjdWl0ID8gY2lyY3VpdC0+c3RhdGUgOiBDX1NUQVRFX05BOwotICAKLSAgemxvZ19pbmZvICgiQ1NNX0VWRU5UOiAlcyIsIEVWRU5UMlNUUihldmVudCkpOwotICAKLSAgc3dpdGNoIChvbGRfc3RhdGUpIHsKLSAgY2FzZSBDX1NUQVRFX05BOgotICAgIGlmIChjaXJjdWl0KQotICAgICAgemxvZ193YXJuICgiTm9uLW51bGwgY2lyY3VpdCB3aGlsZSBzdGF0ZSBDX1NUQVRFX05BIik7Ci0gICAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgSVNJU19FTkFCTEU6Ci0gICAgICBjaXJjdWl0ID0gaXNpc19jaXJjdWl0X25ldyAoKTsKLSAgICAgIGlzaXNfY2lyY3VpdF9jb25maWd1cmUgKGNpcmN1aXQsIChzdHJ1Y3QgaXNpc19hcmVhICopYXJnKTsKLSAgICAgIGNpcmN1aXQtPnN0YXRlID0gQ19TVEFURV9DT05GOworCisgIHpsb2dfaW5mbyAoIkNTTV9FVkVOVDogJXMiLCBFVkVOVDJTVFIgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChvbGRfc3RhdGUpCisgICAgeworICAgIGNhc2UgQ19TVEFURV9OQToKKyAgICAgIGlmIChjaXJjdWl0KQorCXpsb2dfd2FybiAoIk5vbi1udWxsIGNpcmN1aXQgd2hpbGUgc3RhdGUgQ19TVEFURV9OQSIpOworICAgICAgc3dpdGNoIChldmVudCkKKwl7CisJY2FzZSBJU0lTX0VOQUJMRToKKwkgIGNpcmN1aXQgPSBpc2lzX2NpcmN1aXRfbmV3ICgpOworCSAgaXNpc19jaXJjdWl0X2NvbmZpZ3VyZSAoY2lyY3VpdCwgKHN0cnVjdCBpc2lzX2FyZWEgKikgYXJnKTsKKwkgIGNpcmN1aXQtPnN0YXRlID0gQ19TVEFURV9DT05GOworCSAgYnJlYWs7CisJY2FzZSBJRl9VUF9GUk9NX1o6CisJICBjaXJjdWl0ID0gaXNpc19jaXJjdWl0X25ldyAoKTsKKwkgIGlzaXNfY2lyY3VpdF9pZl9hZGQgKGNpcmN1aXQsIChzdHJ1Y3QgaW50ZXJmYWNlICopIGFyZyk7CisJICBsaXN0bm9kZV9hZGQgKGlzaXMtPmluaXRfY2lyY19saXN0LCBjaXJjdWl0KTsKKwkgIGNpcmN1aXQtPnN0YXRlID0gQ19TVEFURV9JTklUOworCSAgYnJlYWs7CisJY2FzZSBJU0lTX0RJU0FCTEU6CisJICB6bG9nX3dhcm4gKCJjaXJjdWl0IGFscmVhZHkgZGlzYWJsZWQiKTsKKwljYXNlIElGX0RPV05fRlJPTV9aOgorCSAgemxvZ193YXJuICgiY2lyY3VpdCBhbHJlYWR5IGRpc2Nvbm5lY3RlZCIpOworCSAgYnJlYWs7CisJfQogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJRl9VUF9GUk9NX1o6Ci0gICAgICBjaXJjdWl0ID0gaXNpc19jaXJjdWl0X25ldyAoKTsKLSAgICAgIGlzaXNfY2lyY3VpdF9pZl9hZGQgKGNpcmN1aXQsIChzdHJ1Y3QgaW50ZXJmYWNlICopYXJnKTsKLSAgICAgIGxpc3Rub2RlX2FkZCAoaXNpcy0+aW5pdF9jaXJjX2xpc3QsIGNpcmN1aXQpOwotICAgICAgY2lyY3VpdC0+c3RhdGUgPSBDX1NUQVRFX0lOSVQ7CisgICAgY2FzZSBDX1NUQVRFX0lOSVQ6CisgICAgICBzd2l0Y2ggKGV2ZW50KQorCXsKKwljYXNlIElTSVNfRU5BQkxFOgorCSAgaXNpc19jaXJjdWl0X2NvbmZpZ3VyZSAoY2lyY3VpdCwgKHN0cnVjdCBpc2lzX2FyZWEgKikgYXJnKTsKKwkgIGlzaXNfY2lyY3VpdF91cCAoY2lyY3VpdCk7CisJICBjaXJjdWl0LT5zdGF0ZSA9IENfU1RBVEVfVVA7CisJICBpc2lzX2V2ZW50X2NpcmN1aXRfc3RhdGVfY2hhbmdlIChjaXJjdWl0LCAxKTsKKwkgIGxpc3Rub2RlX2RlbGV0ZSAoaXNpcy0+aW5pdF9jaXJjX2xpc3QsIGNpcmN1aXQpOworCSAgYnJlYWs7CisJY2FzZSBJRl9VUF9GUk9NX1o6CisJICB6bG9nX3dhcm4gKCJjaXJjdWl0IGFscmVhZHkgY29ubmVjdGVkIik7CisJICBicmVhazsKKwljYXNlIElTSVNfRElTQUJMRToKKwkgIHpsb2dfd2FybiAoImNpcmN1aXQgYWxyZWFkeSBkaXNhYmxlZCIpOworCSAgYnJlYWs7CisJY2FzZSBJRl9ET1dOX0ZST01fWjoKKwkgIGlzaXNfY2lyY3VpdF9pZl9kZWwgKGNpcmN1aXQpOworCSAgbGlzdG5vZGVfZGVsZXRlIChpc2lzLT5pbml0X2NpcmNfbGlzdCwgY2lyY3VpdCk7CisJICBpc2lzX2NpcmN1aXRfZGVsIChjaXJjdWl0KTsKKwkgIGJyZWFrOworCX0KICAgICAgIGJyZWFrOwotICAgIGNhc2UgSVNJU19ESVNBQkxFOgotICAgICAgemxvZ193YXJuICgiY2lyY3VpdCBhbHJlYWR5IGRpc2FibGVkIik7Ci0gICAgY2FzZSBJRl9ET1dOX0ZST01fWjoKLSAgICAgIHpsb2dfd2FybiAoImNpcmN1aXQgYWxyZWFkeSBkaXNjb25uZWN0ZWQiKTsKKyAgICBjYXNlIENfU1RBVEVfQ09ORjoKKyAgICAgIHN3aXRjaCAoZXZlbnQpCisJeworCWNhc2UgSVNJU19FTkFCTEU6CisJICB6bG9nX3dhcm4gKCJjaXJjdWl0IGFscmVhZHkgZW5hYmxlZCIpOworCSAgYnJlYWs7CisJY2FzZSBJRl9VUF9GUk9NX1o6CisJICBpc2lzX2NpcmN1aXRfaWZfYWRkIChjaXJjdWl0LCAoc3RydWN0IGludGVyZmFjZSAqKSBhcmcpOworCSAgaXNpc19jaXJjdWl0X3VwIChjaXJjdWl0KTsKKwkgIGNpcmN1aXQtPnN0YXRlID0gQ19TVEFURV9VUDsKKwkgIGlzaXNfZXZlbnRfY2lyY3VpdF9zdGF0ZV9jaGFuZ2UgKGNpcmN1aXQsIDEpOworCSAgYnJlYWs7CisJY2FzZSBJU0lTX0RJU0FCTEU6CisJICBpc2lzX2NpcmN1aXRfZGVjb25maWd1cmUgKGNpcmN1aXQsIChzdHJ1Y3QgaXNpc19hcmVhICopIGFyZyk7CisJICBpc2lzX2NpcmN1aXRfZGVsIChjaXJjdWl0KTsKKwkgIGJyZWFrOworCWNhc2UgSUZfRE9XTl9GUk9NX1o6CisJICB6bG9nX3dhcm4gKCJjaXJjdWl0IGFscmVhZHkgZGlzY29ubmVjdGVkIik7CisJICBicmVhazsKKwl9CiAgICAgICBicmVhazsKKyAgICBjYXNlIENfU1RBVEVfVVA6CisgICAgICBzd2l0Y2ggKGV2ZW50KQorCXsKKwljYXNlIElTSVNfRU5BQkxFOgorCSAgemxvZ193YXJuICgiY2lyY3VpdCBhbHJlYWR5IGNvbmZpZ3VyZWQiKTsKKwkgIGJyZWFrOworCWNhc2UgSUZfVVBfRlJPTV9aOgorCSAgemxvZ193YXJuICgiY2lyY3VpdCBhbHJlYWR5IGNvbm5lY3RlZCIpOworCSAgYnJlYWs7CisJY2FzZSBJU0lTX0RJU0FCTEU6CisJICBpc2lzX2NpcmN1aXRfZGVjb25maWd1cmUgKGNpcmN1aXQsIChzdHJ1Y3QgaXNpc19hcmVhICopIGFyZyk7CisJICBsaXN0bm9kZV9hZGQgKGlzaXMtPmluaXRfY2lyY19saXN0LCBjaXJjdWl0KTsKKwkgIGNpcmN1aXQtPnN0YXRlID0gQ19TVEFURV9JTklUOworCSAgaXNpc19ldmVudF9jaXJjdWl0X3N0YXRlX2NoYW5nZSAoY2lyY3VpdCwgMCk7CisJICBicmVhazsKKwljYXNlIElGX0RPV05fRlJPTV9aOgorCSAgaXNpc19jaXJjdWl0X2lmX2RlbCAoY2lyY3VpdCk7CisJICBjaXJjdWl0LT5zdGF0ZSA9IENfU1RBVEVfQ09ORjsKKwkgIGlzaXNfZXZlbnRfY2lyY3VpdF9zdGF0ZV9jaGFuZ2UgKGNpcmN1aXQsIDApOworCSAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgemxvZ193YXJuICgiSW52YWxpZCBjaXJjdWl0IHN0YXRlICVkIiwgb2xkX3N0YXRlKTsKICAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgQ19TVEFURV9JTklUOgotICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIElTSVNfRU5BQkxFOgotICAgICAgaXNpc19jaXJjdWl0X2NvbmZpZ3VyZSAoY2lyY3VpdCwgKHN0cnVjdCBpc2lzX2FyZWEgKilhcmcpOwotICAgICAgaXNpc19jaXJjdWl0X3VwIChjaXJjdWl0KTsKLSAgICAgIGNpcmN1aXQtPnN0YXRlID0gQ19TVEFURV9VUDsKLSAgICAgIGlzaXNfZXZlbnRfY2lyY3VpdF9zdGF0ZV9jaGFuZ2UgKGNpcmN1aXQsIDEpOwotICAgICAgbGlzdG5vZGVfZGVsZXRlIChpc2lzLT5pbml0X2NpcmNfbGlzdCwgY2lyY3VpdCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElGX1VQX0ZST01fWjoKLSAgICAgIHpsb2dfd2FybiAoImNpcmN1aXQgYWxyZWFkeSBjb25uZWN0ZWQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVNJU19ESVNBQkxFOgotICAgICAgemxvZ193YXJuICgiY2lyY3VpdCBhbHJlYWR5IGRpc2FibGVkIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElGX0RPV05fRlJPTV9aOgotICAgICAgaXNpc19jaXJjdWl0X2lmX2RlbCAoY2lyY3VpdCk7Ci0gICAgICBsaXN0bm9kZV9kZWxldGUgKGlzaXMtPmluaXRfY2lyY19saXN0LCBjaXJjdWl0KTsKLSAgICAgIGlzaXNfY2lyY3VpdF9kZWwgKGNpcmN1aXQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIENfU1RBVEVfQ09ORjoKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBJU0lTX0VOQUJMRToKLSAgICAgIHpsb2dfd2FybiAoImNpcmN1aXQgYWxyZWFkeSBlbmFibGVkIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElGX1VQX0ZST01fWjoKLSAgICAgIGlzaXNfY2lyY3VpdF9pZl9hZGQgKGNpcmN1aXQsIChzdHJ1Y3QgaW50ZXJmYWNlICopYXJnKTsKLSAgICAgIGlzaXNfY2lyY3VpdF91cCAoY2lyY3VpdCk7Ci0gICAgICBjaXJjdWl0LT5zdGF0ZSA9IENfU1RBVEVfVVA7Ci0gICAgICBpc2lzX2V2ZW50X2NpcmN1aXRfc3RhdGVfY2hhbmdlIChjaXJjdWl0LCAxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVNJU19ESVNBQkxFOgotICAgICAgaXNpc19jaXJjdWl0X2RlY29uZmlndXJlIChjaXJjdWl0LCAoc3RydWN0IGlzaXNfYXJlYSAqKWFyZyk7Ci0gICAgICBpc2lzX2NpcmN1aXRfZGVsIChjaXJjdWl0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSUZfRE9XTl9GUk9NX1o6Ci0gICAgICB6bG9nX3dhcm4gKCJjaXJjdWl0IGFscmVhZHkgZGlzY29ubmVjdGVkIik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgQ19TVEFURV9VUDoKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBJU0lTX0VOQUJMRToKLSAgICAgIHpsb2dfd2FybiAoImNpcmN1aXQgYWxyZWFkeSBjb25maWd1cmVkIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElGX1VQX0ZST01fWjoKLSAgICAgIHpsb2dfd2FybiAoImNpcmN1aXQgYWxyZWFkeSBjb25uZWN0ZWQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVNJU19ESVNBQkxFOgotICAgICAgaXNpc19jaXJjdWl0X2RlY29uZmlndXJlIChjaXJjdWl0LCAoc3RydWN0IGlzaXNfYXJlYSAqKWFyZyk7Ci0gICAgICBsaXN0bm9kZV9hZGQgKGlzaXMtPmluaXRfY2lyY19saXN0LCBjaXJjdWl0KTsKLSAgICAgIGNpcmN1aXQtPnN0YXRlID0gQ19TVEFURV9JTklUOwotICAgICAgaXNpc19ldmVudF9jaXJjdWl0X3N0YXRlX2NoYW5nZSAoY2lyY3VpdCwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElGX0RPV05fRlJPTV9aOgotICAgICAgaXNpc19jaXJjdWl0X2lmX2RlbCAoY2lyY3VpdCk7Ci0gICAgICBjaXJjdWl0LT5zdGF0ZSA9IENfU1RBVEVfQ09ORjsKLSAgICAgIGlzaXNfZXZlbnRfY2lyY3VpdF9zdGF0ZV9jaGFuZ2UgKGNpcmN1aXQsIDApOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGJyZWFrOwotICAgIAotICBkZWZhdWx0OgotICAgIHpsb2dfd2FybiAoIkludmFsaWQgY2lyY3VpdCBzdGF0ZSAlZCIsIG9sZF9zdGF0ZSk7Ci0gIH0KLSAgCi0gIHpsb2dfaW5mbyAoIkNTTV9TVEFURV9DSEFOR0U6ICVzIC0+ICVzICIsIFNUQVRFMlNUUiAob2xkX3N0YXRlKSwgCi0gICAgICAgICAgICAgY2lyY3VpdCA/IFNUQVRFMlNUUiAoY2lyY3VpdC0+c3RhdGUpIDogU1RBVEUyU1RSIChDX1NUQVRFX05BKSk7CisKKyAgemxvZ19pbmZvICgiQ1NNX1NUQVRFX0NIQU5HRTogJXMgLT4gJXMgIiwgU1RBVEUyU1RSIChvbGRfc3RhdGUpLAorCSAgICAgY2lyY3VpdCA/IFNUQVRFMlNUUiAoY2lyY3VpdC0+c3RhdGUpIDogU1RBVEUyU1RSIChDX1NUQVRFX05BKSk7CiAKICAgcmV0dXJuIGNpcmN1aXQ7CiB9Ci0KLQotCmRpZmYgLS1naXQgYS9pc2lzZC9pc2lzX2NzbS5oIGIvaXNpc2QvaXNpc19jc20uaAppbmRleCAyM2NjMjE1Li5kNmIxM2FjIDEwMDY0NAotLS0gYS9pc2lzZC9pc2lzX2NzbS5oCisrKyBiL2lzaXNkL2lzaXNfY3NtLmgKQEAgLTI4LDkgKzI4LDkgQEAKICAqIENpcmN1aXQgc3RhdGVzCiAgKi8KICNkZWZpbmUgQ19TVEFURV9OQSAgIDAKLSNkZWZpbmUgQ19TVEFURV9JTklUIDEgLyogQ29ubmVjdGVkIHRvIGludGVyZmFjZSAqLwotI2RlZmluZSBDX1NUQVRFX0NPTkYgMiAvKiBDb25maWd1cmVkIGZvciBJU0lTICAgICovCi0jZGVmaW5lIENfU1RBVEVfVVAgICAzIC8qIENPTk4gfCBDT05GICAgICAgICAgICAgKi8gCisjZGVmaW5lIENfU1RBVEVfSU5JVCAxCQkvKiBDb25uZWN0ZWQgdG8gaW50ZXJmYWNlICovCisjZGVmaW5lIENfU1RBVEVfQ09ORiAyCQkvKiBDb25maWd1cmVkIGZvciBJU0lTICAgICovCisjZGVmaW5lIENfU1RBVEVfVVAgICAzCQkvKiBDT05OIHwgQ09ORiAgICAgICAgICAgICovCiAKIC8qCiAgKiBDaXJjdWl0IGV2ZW50cwpAQCAtNDAsOCArNDAsOCBAQAogI2RlZmluZSBJU0lTX0RJU0FCTEUgICAzCiAjZGVmaW5lIElGX0RPV05fRlJPTV9aIDQKIAotc3RydWN0IGlzaXNfY2lyY3VpdCAqaXNpc19jc21fc3RhdGVfY2hhbmdlIChpbnQgZXZlbnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKTsKK3N0cnVjdCBpc2lzX2NpcmN1aXQgKmlzaXNfY3NtX3N0YXRlX2NoYW5nZSAoaW50IGV2ZW50LAorCQkJCQkgICAgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwKKwkJCQkJICAgIHZvaWQgKmFyZyk7CiAKICNlbmRpZiAvKiBfWkVCUkFfSVNJU19DU01fSCAqLwpkaWZmIC0tZ2l0IGEvaXNpc2QvaXNpc19kci5jIGIvaXNpc2QvaXNpc19kci5jCmluZGV4IGEyZmRkY2MuLmI0NGQyMTIgMTAwNjQ0Ci0tLSBhL2lzaXNkL2lzaXNfZHIuYworKysgYi9pc2lzZC9pc2lzX2RyLmMKQEAgLTUxLDM3ICs1MSwzNyBAQAogZXh0ZXJuIHN0cnVjdCB0aHJlYWRfbWFzdGVyICptYXN0ZXI7CiAKIGNoYXIgKgotaXNpc19kaXNmbGFnMnN0cmluZyAoaW50IGRpc2ZsYWcpIHsKK2lzaXNfZGlzZmxhZzJzdHJpbmcgKGludCBkaXNmbGFnKQorewogCi0gIHN3aXRjaCAoZGlzZmxhZykgeworICBzd2l0Y2ggKGRpc2ZsYWcpCisgICAgewogICAgIGNhc2UgSVNJU19JU19OT1RfRElTOgogICAgICAgcmV0dXJuICJpcyBub3QgRElTIjsKICAgICBjYXNlIElTSVNfSVNfRElTOgogICAgICAgcmV0dXJuICJpcyBESVMiOwogICAgIGNhc2UgSVNJU19XQVNfRElTOgogICAgICAgcmV0dXJuICJ3YXMgRElTIjsKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gInVua25vd24gRElTIHN0YXRlIjsKLSAgfQotICByZXR1cm4gTlVMTDsgLyogbm90IHJlYWNoZWQgKi8KKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJ1bmtub3duIERJUyBzdGF0ZSI7CisgICAgfQorICByZXR1cm4gTlVMTDsJCQkvKiBub3QgcmVhY2hlZCAqLwogfQogCi0KLQogaW50CiBpc2lzX3J1bl9kcl9sMSAoc3RydWN0IHRocmVhZCAqdGhyZWFkKQogewogICBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0OwotICAKKwogICBjaXJjdWl0ID0gVEhSRUFEX0FSRyAodGhyZWFkKTsKICAgYXNzZXJ0IChjaXJjdWl0KTsKIAogICBpZiAoY2lyY3VpdC0+dS5iYy5ydW5fZHJfZWxlY3RbMF0pCiAgICAgemxvZ193YXJuICgiaXNpc19ydW5fZHIoKTogcnVuX2RyX2VsZWN0IGFscmVhZHkgc2V0IGZvciBsMSIpOwotICAKKwogICBjaXJjdWl0LT51LmJjLnRfcnVuX2RyWzBdID0gTlVMTDsKICAgY2lyY3VpdC0+dS5iYy5ydW5fZHJfZWxlY3RbMF0gPSAxOwotICAgIAorCiAgIHJldHVybiBJU0lTX09LOwogfQogCkBAIC04OSwxNyArODksMTcgQEAKIGlzaXNfcnVuX2RyX2wyIChzdHJ1Y3QgdGhyZWFkICp0aHJlYWQpCiB7CiAgIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQ7Ci0gIAorCiAgIGNpcmN1aXQgPSBUSFJFQURfQVJHICh0aHJlYWQpOwogICBhc3NlcnQgKGNpcmN1aXQpOwogCiAgIGlmIChjaXJjdWl0LT51LmJjLnJ1bl9kcl9lbGVjdFsxXSkKICAgICB6bG9nX3dhcm4gKCJpc2lzX3J1bl9kcigpOiBydW5fZHJfZWxlY3QgYWxyZWFkeSBzZXQgZm9yIGwyIik7Ci0gIAotICAKLSAgY2lyY3VpdC0+dS5iYy50X3J1bl9kclsxXSA9IE5VTEw7IAorCisKKyAgY2lyY3VpdC0+dS5iYy50X3J1bl9kclsxXSA9IE5VTEw7CiAgIGNpcmN1aXQtPnUuYmMucnVuX2RyX2VsZWN0WzFdID0gMTsKLSAgICAKKwogICByZXR1cm4gSVNJU19PSzsKIH0KIApAQCAtMTA4LDI0ICsxMDgsMjUgQEAKIHsKICAgaW50IGk7CiAKLSAgaWYgKCBhZGotPmRpc19yZWNvcmRbbGV2ZWwtMV0uZGlzICE9IAotICAgICAgIGFkai0+ZGlzX3JlY29yZFsoMSpJU0lTX0xFVkVMUykgKyBsZXZlbCAtIDFdLmRpcykgCi0gICAgLyogd2FzIHRoZXJlIGEgRElTIHN0YXRlIHRyYW5zaXRpb24gPyAqLyAKKyAgaWYgKGFkai0+ZGlzX3JlY29yZFtsZXZlbCAtIDFdLmRpcyAhPQorICAgICAgYWRqLT5kaXNfcmVjb3JkWygxICogSVNJU19MRVZFTFMpICsgbGV2ZWwgLSAxXS5kaXMpCisgICAgLyogd2FzIHRoZXJlIGEgRElTIHN0YXRlIHRyYW5zaXRpb24gPyAqLwogICAgIHsKLSAgICAgIGFkai0+ZGlzY2hhbmdlc1tsZXZlbC0xXSsrOworICAgICAgYWRqLT5kaXNjaGFuZ2VzW2xldmVsIC0gMV0rKzsKICAgICAgIC8qIG9rIHJvdGF0ZSB0aGUgaGlzdG9yeSBsaXN0IHRocm91Z2ggKi8KLSAgICAgIGZvciAoaSA9IERJU19SRUNPUkRTIC0gMTsgaSA+IDA7IGktLSkgCisgICAgICBmb3IgKGkgPSBESVNfUkVDT1JEUyAtIDE7IGkgPiAwOyBpLS0pCiAJewotCSAgYWRqLT5kaXNfcmVjb3JkWyhpICogSVNJU19MRVZFTFMpICsgbGV2ZWwgLSAxXS5kaXMgPSAKLSAgICAgICAgICAgIGFkai0+ZGlzX3JlY29yZFsoKGktMSkgKiBJU0lTX0xFVkVMUykgKyBsZXZlbCAtIDFdLmRpczsKLQkgIGFkai0+ZGlzX3JlY29yZFsoaSAqIElTSVNfTEVWRUxTKSArIGxldmVsIC0gMV0ubGFzdF9kaXNfY2hhbmdlID0gCi0gICAgICAgICAgICBhZGotPmRpc19yZWNvcmRbKChpLTEpICogSVNJU19MRVZFTFMpICsgbGV2ZWwgLSAxXS5sYXN0X2Rpc19jaGFuZ2U7CisJICBhZGotPmRpc19yZWNvcmRbKGkgKiBJU0lTX0xFVkVMUykgKyBsZXZlbCAtIDFdLmRpcyA9CisJICAgIGFkai0+ZGlzX3JlY29yZFsoKGkgLSAxKSAqIElTSVNfTEVWRUxTKSArIGxldmVsIC0gMV0uZGlzOworCSAgYWRqLT5kaXNfcmVjb3JkWyhpICogSVNJU19MRVZFTFMpICsgbGV2ZWwgLSAxXS5sYXN0X2Rpc19jaGFuZ2UgPQorCSAgICBhZGotPmRpc19yZWNvcmRbKChpIC0gMSkgKiBJU0lTX0xFVkVMUykgKyBsZXZlbCAtCisJCQkgICAgMV0ubGFzdF9kaXNfY2hhbmdlOwogCX0KICAgICB9CiAgIHJldHVybiBJU0lTX09LOwogfQogCi1pbnQgCitpbnQKIGlzaXNfZHJfZWxlY3QgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsIGludCBsZXZlbCkKIHsKICAgc3RydWN0IGxpc3QgKmFkamRiOwpAQCAtMTM1LDIxMyArMTM2LDI0MiBAQAogICB1X2NoYXIgb3duX3ByaW87CiAgIGludCBiaWdnZXN0X3ByaW8gPSAtMTsKICAgaW50IGNtcF9yZXMsIHJldHZhbCA9IElTSVNfT0s7Ci0gIAorCiAgIG93bl9wcmlvID0gY2lyY3VpdC0+dS5iYy5wcmlvcml0eVtsZXZlbCAtIDFdOwogICBhZGpkYiA9IGNpcmN1aXQtPnUuYmMuYWRqZGJbbGV2ZWwgLSAxXTsKIAotICBpZiAoIWFkamRiKSB7Ci0gICAgemxvZ193YXJuICgiaXNpc19kcl9lbGVjdCgpIGFkamRiID09IE5VTEwiKTsKLSAgICByZXR2YWwgPSBJU0lTX1dBUk5JTkc7Ci0gICAgbGlzdF9kZWxldGUgKGxpc3QpOwotICAgIGdvdG8gb3V0OwotICB9CisgIGlmICghYWRqZGIpCisgICAgeworICAgICAgemxvZ193YXJuICgiaXNpc19kcl9lbGVjdCgpIGFkamRiID09IE5VTEwiKTsKKyAgICAgIHJldHZhbCA9IElTSVNfV0FSTklORzsKKyAgICAgIGxpc3RfZGVsZXRlIChsaXN0KTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KICAgaXNpc19hZGpfYnVpbGRfdXBfbGlzdCAoYWRqZGIsIGxpc3QpOwogCiAgIC8qCiAgICAqIExvb3AgdGhlIGFkamFjZW5jaWVzIGFuZCBmaW5kIHRoZSBvbmUgd2l0aCB0aGUgYmlnZ2VzdCBwcmlvcml0eQogICAgKi8KLSAgZm9yIChub2RlID0gbGlzdGhlYWQgKGxpc3QpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICBhZGogPSBnZXRkYXRhIChub2RlKTsKLSAgICAvKiBjbGVhciBmbGFnIGZvciBzaG93IG91dHB1dCAqLwotICAgIGFkai0+ZGlzX3JlY29yZFtsZXZlbC0xXS5kaXMgPSBJU0lTX0lTX05PVF9ESVM7ICAKLSAgICBhZGotPmRpc19yZWNvcmRbbGV2ZWwtMV0ubGFzdF9kaXNfY2hhbmdlID0gdGltZSAoTlVMTCk7CisgIGZvciAobm9kZSA9IGxpc3RoZWFkIChsaXN0KTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorICAgIHsKKyAgICAgIGFkaiA9IGdldGRhdGEgKG5vZGUpOworICAgICAgLyogY2xlYXIgZmxhZyBmb3Igc2hvdyBvdXRwdXQgKi8KKyAgICAgIGFkai0+ZGlzX3JlY29yZFtsZXZlbCAtIDFdLmRpcyA9IElTSVNfSVNfTk9UX0RJUzsKKyAgICAgIGFkai0+ZGlzX3JlY29yZFtsZXZlbCAtIDFdLmxhc3RfZGlzX2NoYW5nZSA9IHRpbWUgKE5VTEwpOwogCi0gICAgaWYgKGFkai0+cHJpb1tsZXZlbC0xXSA+IGJpZ2dlc3RfcHJpbykgewotICAgICAgYmlnZ2VzdF9wcmlvID0gYWRqLT5wcmlvW2xldmVsLTFdOwotICAgICAgYWRqX2RyID0gYWRqOwotICAgIH0gZWxzZSBpZiAoYWRqLT5wcmlvW2xldmVsLTFdID09IGJpZ2dlc3RfcHJpbykgewotICAgICAgLyoKLSAgICAgICAqIENvbXBhcmlzb24gb2YgTUFDcyBicmVha3MgYSB0aWUKLSAgICAgICAqLwotICAgICAgaWYgKGFkal9kcikgewotICAgICAgICBjbXBfcmVzID0gbWVtY21wIChhZGpfZHItPnNucGEsIGFkai0+c25wYSwgRVRIX0FMRU4pOwotICAgICAgICBpZiAoY21wX3JlcyA8IDApIHsKLSAgICAgICAgICBhZGpfZHIgPSBhZGo7CisgICAgICBpZiAoYWRqLT5wcmlvW2xldmVsIC0gMV0gPiBiaWdnZXN0X3ByaW8pCisJeworCSAgYmlnZ2VzdF9wcmlvID0gYWRqLT5wcmlvW2xldmVsIC0gMV07CisJICBhZGpfZHIgPSBhZGo7CiAJfQotICAgICAgICBpZiAoY21wX3JlcyA9PSAwKQotICAgICAgICAgIHpsb2dfd2FybiAoImlzaXNfZHJfZWxlY3QoKTogbXVsdGlwbGUgYWRqYWNlbmNpZXMgd2l0aCBzYW1lIFNOUEEiKTsgCi0gICAgICB9IGVsc2UgewotICAgICAgICBhZGpfZHIgPSBhZGo7Ci0gICAgICB9CisgICAgICBlbHNlIGlmIChhZGotPnByaW9bbGV2ZWwgLSAxXSA9PSBiaWdnZXN0X3ByaW8pCisJeworCSAgLyoKKwkgICAqIENvbXBhcmlzb24gb2YgTUFDcyBicmVha3MgYSB0aWUKKwkgICAqLworCSAgaWYgKGFkal9kcikKKwkgICAgeworCSAgICAgIGNtcF9yZXMgPSBtZW1jbXAgKGFkal9kci0+c25wYSwgYWRqLT5zbnBhLCBFVEhfQUxFTik7CisJICAgICAgaWYgKGNtcF9yZXMgPCAwKQorCQl7CisJCSAgYWRqX2RyID0gYWRqOworCQl9CisJICAgICAgaWYgKGNtcF9yZXMgPT0gMCkKKwkJemxvZ193YXJuCisJCSAgKCJpc2lzX2RyX2VsZWN0KCk6IG11bHRpcGxlIGFkamFjZW5jaWVzIHdpdGggc2FtZSBTTlBBIik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGFkal9kciA9IGFkajsKKwkgICAgfQorCX0KICAgICB9Ci0gIH0KLSAgCi0gIGlmICghYWRqX2RyKSB7Ci0gICAgLyoKLSAgICAgKiBDb3VsZCBub3QgZmluZCB0aGUgRFIgLSBtZWFucyB3ZSBhcmUgYWxvbmUgYW5kIHRodXMgdGhlIERSCi0gICAgICovCi0gICAgaWYgKCAhY2lyY3VpdC0+dS5iYy5pc19kcltsZXZlbCAtIDFdKSB7Ci0gICAgICBsaXN0X2RlbGV0ZSAobGlzdCk7Ci0gICAgICBsaXN0ID0gTlVMTDsKLSAgICAgIHJldHVybiBpc2lzX2RyX2NvbW1lbmNlIChjaXJjdWl0LCBsZXZlbCk7CisKKyAgaWYgKCFhZGpfZHIpCisgICAgeworICAgICAgLyoKKyAgICAgICAqIENvdWxkIG5vdCBmaW5kIHRoZSBEUiAtIG1lYW5zIHdlIGFyZSBhbG9uZSBhbmQgdGh1cyB0aGUgRFIKKyAgICAgICAqLworICAgICAgaWYgKCFjaXJjdWl0LT51LmJjLmlzX2RyW2xldmVsIC0gMV0pCisJeworCSAgbGlzdF9kZWxldGUgKGxpc3QpOworCSAgbGlzdCA9IE5VTEw7CisJICByZXR1cm4gaXNpc19kcl9jb21tZW5jZSAoY2lyY3VpdCwgbGV2ZWwpOworCX0KKyAgICAgIGdvdG8gb3V0OwogICAgIH0KLSAgICBnb3RvIG91dDsKLSAgfQogCiAgIC8qCiAgICAqIE5vdyB3ZSBoYXZlIHRoZSBEUiBhZGphY2VuY3ksIGNvbXBhcmUgaXQgdG8gc2VsZgogICAgKi8KLSAgaWYgKGFkal9kci0+cHJpb1tsZXZlbC0xXSA8IG93bl9wcmlvIHx8IChhZGpfZHItPnByaW9bbGV2ZWwtMV0gPT0gb3duX3ByaW8gJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jbXAgKGFkal9kci0+c25wYSwgY2lyY3VpdC0+dS5iYy5zbnBhLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVUSF9BTEVOKSA8IDApKSB7Ci0gICAgaWYgKCFjaXJjdWl0LT51LmJjLmlzX2RyW2xldmVsIC0gMV0pIHsKLSAgICAgIC8qCi0gICAgICAgKiBXZSBhcmUgdGhlIERSIC0+IGNvbW1lbmNlCisgIGlmIChhZGpfZHItPnByaW9bbGV2ZWwgLSAxXSA8IG93bl9wcmlvCisgICAgICB8fCAoYWRqX2RyLT5wcmlvW2xldmVsIC0gMV0gPT0gb3duX3ByaW8KKwkgICYmIG1lbWNtcCAoYWRqX2RyLT5zbnBhLCBjaXJjdWl0LT51LmJjLnNucGEsIEVUSF9BTEVOKSA8IDApKQorICAgIHsKKyAgICAgIGlmICghY2lyY3VpdC0+dS5iYy5pc19kcltsZXZlbCAtIDFdKQorCXsKKwkgIC8qCisJICAgKiBXZSBhcmUgdGhlIERSIC0+IGNvbW1lbmNlCisJICAgKi8KKwkgIGxpc3RfZGVsZXRlIChsaXN0KTsKKwkgIHJldHVybiBpc2lzX2RyX2NvbW1lbmNlIChjaXJjdWl0LCBsZXZlbCk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKworICAgICAgLyogb2sgd2UgaGF2ZSBmb3VuZCB0aGUgRElTIC0gbGV0cyBtYXJrIHRoZSBhZGphY2VuY3kgKi8KKyAgICAgIC8qIHNldCBmbGFnIGZvciBzaG93IG91dHB1dCAqLworICAgICAgYWRqX2RyLT5kaXNfcmVjb3JkW2xldmVsIC0gMV0uZGlzID0gSVNJU19JU19ESVM7CisgICAgICBhZGpfZHItPmRpc19yZWNvcmRbbGV2ZWwgLSAxXS5sYXN0X2Rpc19jaGFuZ2UgPSB0aW1lIChOVUxMKTsKKworICAgICAgLyogbm93IGxvb3AgdGhyb3VnaCBhIHNlY29uZCB0aW1lIHRvIGNoZWNrIGlmIHRoZXJlIGhhcyBiZWVuIGEgRElTIGNoYW5nZQorICAgICAgICogaWYgeWVzIHJvdGF0ZSB0aGUgaGlzdG9yeSBsb2cKICAgICAgICAqLwotICAgICAgbGlzdF9kZWxldGUgKGxpc3QpOwotICAgICAgcmV0dXJuIGlzaXNfZHJfY29tbWVuY2UgKGNpcmN1aXQsIGxldmVsKTsKKworICAgICAgZm9yIChub2RlID0gbGlzdGhlYWQgKGxpc3QpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisJeworCSAgYWRqID0gZ2V0ZGF0YSAobm9kZSk7CisJICBpc2lzX2NoZWNrX2RyX2NoYW5nZSAoYWRqLCBsZXZlbCk7CisJfQorCisgICAgICAvKgorICAgICAgICogV2UgYXJlIG5vdCBEUiAtIGlmIHdlIHdlcmUgLT4gcmVzaWduCisgICAgICAgKi8KKworICAgICAgaWYgKGNpcmN1aXQtPnUuYmMuaXNfZHJbbGV2ZWwgLSAxXSkKKwl7CisJICBsaXN0X2RlbGV0ZSAobGlzdCk7CisJICByZXR1cm4gaXNpc19kcl9yZXNpZ24gKGNpcmN1aXQsIGxldmVsKTsKKwl9CiAgICAgfQotICB9IGVsc2UgewotCi0gICAgLyogb2sgd2UgaGF2ZSBmb3VuZCB0aGUgRElTIC0gbGV0cyBtYXJrIHRoZSBhZGphY2VuY3kgKi8KLSAgICAvKiBzZXQgZmxhZyBmb3Igc2hvdyBvdXRwdXQgKi8KLSAgICBhZGpfZHItPmRpc19yZWNvcmRbbGV2ZWwgLSAxXS5kaXMgPSBJU0lTX0lTX0RJUzsgCi0gICAgYWRqX2RyLT5kaXNfcmVjb3JkW2xldmVsIC0gMV0ubGFzdF9kaXNfY2hhbmdlID0gdGltZShOVUxMKTsKLQotICAgIC8qIG5vdyBsb29wIHRocm91Z2ggYSBzZWNvbmQgdGltZSB0byBjaGVjayBpZiB0aGVyZSBoYXMgYmVlbiBhIERJUyBjaGFuZ2UKLSAgICAgKiBpZiB5ZXMgcm90YXRlIHRoZSBoaXN0b3J5IGxvZwotICAgICAqLwotCi0gICAgZm9yIChub2RlID0gbGlzdGhlYWQgKGxpc3QpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICAgIGFkaiA9IGdldGRhdGEgKG5vZGUpOwotICAgICAgaXNpc19jaGVja19kcl9jaGFuZ2UoYWRqLCBsZXZlbCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBXZSBhcmUgbm90IERSIC0gaWYgd2Ugd2VyZSAtPiByZXNpZ24KLSAgICAgKi8KLQotICAgIGlmIChjaXJjdWl0LT51LmJjLmlzX2RyW2xldmVsIC0gMV0pIHsKLSAgICAgIGxpc3RfZGVsZXRlIChsaXN0KTsKLSAgICAgIHJldHVybiBpc2lzX2RyX3Jlc2lnbiAoY2lyY3VpdCwgbGV2ZWwpOwotICAgIH0KLSAgfQotIG91dDoKK291dDoKICAgaWYgKGxpc3QpCiAgICAgbGlzdF9kZWxldGUgKGxpc3QpOwogICByZXR1cm4gcmV0dmFsOwogfQogCi1pbnQgCitpbnQKIGlzaXNfZHJfcmVzaWduIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LCBpbnQgbGV2ZWwpCiB7CiAgIHVfY2hhciBpZFtJU0lTX1NZU19JRF9MRU4gKyAyXTsKLSAgICAgIAorCiAgIHpsb2dfaW5mbyAoImlzaXNfZHJfcmVzaWduIGwlZCIsIGxldmVsKTsKIAogICBjaXJjdWl0LT51LmJjLmlzX2RyW2xldmVsIC0gMV0gPSAwOwotICBjaXJjdWl0LT51LmJjLnJ1bl9kcl9lbGVjdFtsZXZlbCAtIDFdID0gMDsgCi0gIFRIUkVBRF9USU1FUl9PRkYoY2lyY3VpdC0+dS5iYy50X3J1bl9kcltsZXZlbCAtIDFdKTsKLSAgVEhSRUFEX1RJTUVSX09GRihjaXJjdWl0LT51LmJjLnRfcmVmcmVzaF9wc2V1ZG9fbHNwW2xldmVsIC0gMV0pOwotICAKKyAgY2lyY3VpdC0+dS5iYy5ydW5fZHJfZWxlY3RbbGV2ZWwgLSAxXSA9IDA7CisgIFRIUkVBRF9USU1FUl9PRkYgKGNpcmN1aXQtPnUuYmMudF9ydW5fZHJbbGV2ZWwgLSAxXSk7CisgIFRIUkVBRF9USU1FUl9PRkYgKGNpcmN1aXQtPnUuYmMudF9yZWZyZXNoX3BzZXVkb19sc3BbbGV2ZWwgLSAxXSk7CisKICAgbWVtY3B5IChpZCwgaXNpcy0+c3lzaWQsIElTSVNfU1lTX0lEX0xFTik7Ci0gIExTUF9QU0VVRE9fSUQoaWQpID0gY2lyY3VpdC0+Y2lyY3VpdF9pZDsKLSAgTFNQX0ZSQUdNRU5UKGlkKSA9IDA7CisgIExTUF9QU0VVRE9fSUQgKGlkKSA9IGNpcmN1aXQtPmNpcmN1aXRfaWQ7CisgIExTUF9GUkFHTUVOVCAoaWQpID0gMDsKICAgbHNwX3B1cmdlX2RyIChpZCwgY2lyY3VpdCwgbGV2ZWwpOwogCi0gIGlmIChsZXZlbCA9PSAxKSB7Ci0gICAgbWVtc2V0IChjaXJjdWl0LT51LmJjLmwxX2Rlc2lnX2lzLCAwLCBJU0lTX1NZU19JRF9MRU4gKyAxKTsKLSAgICAKLSAgICBUSFJFQURfVElNRVJfT0ZGKGNpcmN1aXQtPnRfc2VuZF9jc25wWzBdKTsKLSAgICAKLSAgICBUSFJFQURfVElNRVJfT04obWFzdGVyLCBjaXJjdWl0LT51LmJjLnRfcnVuX2RyWzBdLCBpc2lzX3J1bl9kcl9sMSwKLSAgICAgICAgY2lyY3VpdCwgMiAqIGNpcmN1aXQtPmhlbGxvX2ludGVydmFsWzFdKTsKLSAgICAKLSAgICBUSFJFQURfVElNRVJfT04obWFzdGVyLCBjaXJjdWl0LT50X3NlbmRfcHNucFswXSwgc2VuZF9sMV9wc25wLCBjaXJjdWl0LAotICAgICAgICBpc2lzX2ppdHRlciAoY2lyY3VpdC0+cHNucF9pbnRlcnZhbFtsZXZlbCAtIDFdLCBQU05QX0pJVFRFUikpOwotICB9IGVsc2UgewotICAgIG1lbXNldCAoY2lyY3VpdC0+dS5iYy5sMl9kZXNpZ19pcywgMCwgSVNJU19TWVNfSURfTEVOICsgMSk7CisgIGlmIChsZXZlbCA9PSAxKQorICAgIHsKKyAgICAgIG1lbXNldCAoY2lyY3VpdC0+dS5iYy5sMV9kZXNpZ19pcywgMCwgSVNJU19TWVNfSURfTEVOICsgMSk7CiAKLSAgICBUSFJFQURfVElNRVJfT0ZGKGNpcmN1aXQtPnRfc2VuZF9jc25wWzFdKTsKKyAgICAgIFRIUkVBRF9USU1FUl9PRkYgKGNpcmN1aXQtPnRfc2VuZF9jc25wWzBdKTsKIAotICAgIFRIUkVBRF9USU1FUl9PTihtYXN0ZXIsIGNpcmN1aXQtPnUuYmMudF9ydW5fZHJbMV0sIGlzaXNfcnVuX2RyX2wyLAotICAgICAgICBjaXJjdWl0LCAyICogY2lyY3VpdC0+aGVsbG9faW50ZXJ2YWxbMV0pOwotICAgIAotICAgIFRIUkVBRF9USU1FUl9PTihtYXN0ZXIsIGNpcmN1aXQtPnRfc2VuZF9wc25wWzFdLCBzZW5kX2wyX3BzbnAsIGNpcmN1aXQsCi0gICAgICAgIGlzaXNfaml0dGVyIChjaXJjdWl0LT5wc25wX2ludGVydmFsW2xldmVsIC0gMV0sIFBTTlBfSklUVEVSKSk7Ci0gIH0KLSAgCisgICAgICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgY2lyY3VpdC0+dS5iYy50X3J1bl9kclswXSwgaXNpc19ydW5fZHJfbDEsCisJCSAgICAgICBjaXJjdWl0LCAyICogY2lyY3VpdC0+aGVsbG9faW50ZXJ2YWxbMV0pOworCisgICAgICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgY2lyY3VpdC0+dF9zZW5kX3BzbnBbMF0sIHNlbmRfbDFfcHNucCwgY2lyY3VpdCwKKwkJICAgICAgIGlzaXNfaml0dGVyIChjaXJjdWl0LT5wc25wX2ludGVydmFsW2xldmVsIC0gMV0sCisJCQkJICAgIFBTTlBfSklUVEVSKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbWVtc2V0IChjaXJjdWl0LT51LmJjLmwyX2Rlc2lnX2lzLCAwLCBJU0lTX1NZU19JRF9MRU4gKyAxKTsKKworICAgICAgVEhSRUFEX1RJTUVSX09GRiAoY2lyY3VpdC0+dF9zZW5kX2NzbnBbMV0pOworCisgICAgICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgY2lyY3VpdC0+dS5iYy50X3J1bl9kclsxXSwgaXNpc19ydW5fZHJfbDIsCisJCSAgICAgICBjaXJjdWl0LCAyICogY2lyY3VpdC0+aGVsbG9faW50ZXJ2YWxbMV0pOworCisgICAgICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgY2lyY3VpdC0+dF9zZW5kX3BzbnBbMV0sIHNlbmRfbDJfcHNucCwgY2lyY3VpdCwKKwkJICAgICAgIGlzaXNfaml0dGVyIChjaXJjdWl0LT5wc25wX2ludGVydmFsW2xldmVsIC0gMV0sCisJCQkJICAgIFBTTlBfSklUVEVSKSk7CisgICAgfQorCiAgIHRocmVhZF9hZGRfZXZlbnQgKG1hc3RlciwgaXNpc19ldmVudF9kaXNfc3RhdHVzX2NoYW5nZSwgY2lyY3VpdCwgMCk7CiAKICAgcmV0dXJuIElTSVNfT0s7CiB9CiAKLWludCAKK2ludAogaXNpc19kcl9jb21tZW5jZSAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgaW50IGxldmVsKQogewogICB1X2NoYXIgb2xkX2RyW0lTSVNfU1lTX0lEX0xFTiArIDJdOwotICAKKwogICB6bG9nX2luZm8gKCJpc2lzX2RyX2NvbW1lbmNlIGwlZCIsIGxldmVsKTsKIAogICAvKiBMZXRzIGtlZXAgYSBwYXVzZSBpbiBEUiBlbGVjdGlvbiAqLwogICBjaXJjdWl0LT51LmJjLnJ1bl9kcl9lbGVjdFtsZXZlbCAtIDFdID0gMDsKLSAgaWYgKGxldmVsID09IDEpIAotICAgIFRIUkVBRF9USU1FUl9PTihtYXN0ZXIsIGNpcmN1aXQtPnUuYmMudF9ydW5fZHJbMF0sIGlzaXNfcnVuX2RyX2wxLAotICAgICAgICBjaXJjdWl0LCAyICogY2lyY3VpdC0+aGVsbG9fbXVsdGlwbGllclswXSAqIAotCQkJY2lyY3VpdC0+aGVsbG9faW50ZXJ2YWxbMF0pOyAKLSAgZWxzZSAKLSAgICBUSFJFQURfVElNRVJfT04obWFzdGVyLCBjaXJjdWl0LT51LmJjLnRfcnVuX2RyWzFdLCBpc2lzX3J1bl9kcl9sMiwKLSAgICAgICAgY2lyY3VpdCwgMiAqIGNpcmN1aXQtPmhlbGxvX211bHRpcGxpZXJbMV0gKgotCQkJY2lyY3VpdC0+aGVsbG9faW50ZXJ2YWxbMV0pOwkgICAgICAJCisgIGlmIChsZXZlbCA9PSAxKQorICAgIFRIUkVBRF9USU1FUl9PTiAobWFzdGVyLCBjaXJjdWl0LT51LmJjLnRfcnVuX2RyWzBdLCBpc2lzX3J1bl9kcl9sMSwKKwkJICAgICBjaXJjdWl0LCAyICogY2lyY3VpdC0+aGVsbG9fbXVsdGlwbGllclswXSAqCisJCSAgICAgY2lyY3VpdC0+aGVsbG9faW50ZXJ2YWxbMF0pOworICBlbHNlCisgICAgVEhSRUFEX1RJTUVSX09OIChtYXN0ZXIsIGNpcmN1aXQtPnUuYmMudF9ydW5fZHJbMV0sIGlzaXNfcnVuX2RyX2wyLAorCQkgICAgIGNpcmN1aXQsIDIgKiBjaXJjdWl0LT5oZWxsb19tdWx0aXBsaWVyWzFdICoKKwkJICAgICBjaXJjdWl0LT5oZWxsb19pbnRlcnZhbFsxXSk7CiAgIGNpcmN1aXQtPnUuYmMuaXNfZHJbbGV2ZWwgLSAxXSA9IDE7CiAKLSAgaWYgKGxldmVsID09IDEpIHsKLSAgICBtZW1jcHkgKG9sZF9kciwgY2lyY3VpdC0+dS5iYy5sMV9kZXNpZ19pcywgSVNJU19TWVNfSURfTEVOICsgMSk7Ci0gICAgTFNQX0ZSQUdNRU5UIChvbGRfZHIpID0gMDsKLSAgICBpZiAoTFNQX1BTRVVET19JRChvbGRfZHIpKSB7Ci0gICAgICAvKiB0aGVyZSB3YXMgYSBkciBlbGVjdGVkLCBwdXJnZSBpdHMgTFNQcyBmcm9tIHRoZSBkYiAqLwotICAgICAgbHNwX3B1cmdlX2RyIChvbGRfZHIsIGNpcmN1aXQsIGxldmVsKTsKLSAgICB9Ci0gICAgbWVtY3B5IChjaXJjdWl0LT51LmJjLmwxX2Rlc2lnX2lzLCBpc2lzLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOKTsKLSAgICAqKGNpcmN1aXQtPnUuYmMubDFfZGVzaWdfaXMgKyBJU0lTX1NZU19JRF9MRU4pID0gY2lyY3VpdC0+Y2lyY3VpdF9pZDsKLSAgICAKLSAgICBhc3NlcnQgKGNpcmN1aXQtPmNpcmN1aXRfaWQpOyAvKiBtdXN0IGJlIG5vbi16ZXJvICovCi0gICAgLyogICAgaWYgKGNpcmN1aXQtPnRfc2VuZF9sMV9wc25wKQotICAgICAgICAgIHRocmVhZF9jYW5jZWwgKGNpcmN1aXQtPnRfc2VuZF9sMV9wc25wKTsgKi8KLSAgICBsc3BfbDFfcHNldWRvX2dlbmVyYXRlIChjaXJjdWl0KTsKKyAgaWYgKGxldmVsID09IDEpCisgICAgeworICAgICAgbWVtY3B5IChvbGRfZHIsIGNpcmN1aXQtPnUuYmMubDFfZGVzaWdfaXMsIElTSVNfU1lTX0lEX0xFTiArIDEpOworICAgICAgTFNQX0ZSQUdNRU5UIChvbGRfZHIpID0gMDsKKyAgICAgIGlmIChMU1BfUFNFVURPX0lEIChvbGRfZHIpKQorCXsKKwkgIC8qIHRoZXJlIHdhcyBhIGRyIGVsZWN0ZWQsIHB1cmdlIGl0cyBMU1BzIGZyb20gdGhlIGRiICovCisJICBsc3BfcHVyZ2VfZHIgKG9sZF9kciwgY2lyY3VpdCwgbGV2ZWwpOworCX0KKyAgICAgIG1lbWNweSAoY2lyY3VpdC0+dS5iYy5sMV9kZXNpZ19pcywgaXNpcy0+c3lzaWQsIElTSVNfU1lTX0lEX0xFTik7CisgICAgICAqKGNpcmN1aXQtPnUuYmMubDFfZGVzaWdfaXMgKyBJU0lTX1NZU19JRF9MRU4pID0gY2lyY3VpdC0+Y2lyY3VpdF9pZDsKIAotICAgIFRIUkVBRF9USU1FUl9PRkYoY2lyY3VpdC0+dS5iYy50X3J1bl9kclswXSk7IAotICAgIFRIUkVBRF9USU1FUl9PTihtYXN0ZXIsIGNpcmN1aXQtPnUuYmMudF9ydW5fZHJbMF0sIGlzaXNfcnVuX2RyX2wxLAotICAgICAgICBjaXJjdWl0LCAyICogY2lyY3VpdC0+aGVsbG9faW50ZXJ2YWxbMF0pOwotICAgIAotICAgIFRIUkVBRF9USU1FUl9PTihtYXN0ZXIsIGNpcmN1aXQtPnRfc2VuZF9jc25wWzBdLCBzZW5kX2wxX2NzbnAsIGNpcmN1aXQsCi0gICAgICAgIGlzaXNfaml0dGVyKGNpcmN1aXQtPmNzbnBfaW50ZXJ2YWxbbGV2ZWwtMV0sIENTTlBfSklUVEVSKSk7Ci0gICAgCi0gIH0gZWxzZSB7Ci0gICAgbWVtY3B5IChvbGRfZHIsIGNpcmN1aXQtPnUuYmMubDJfZGVzaWdfaXMsIElTSVNfU1lTX0lEX0xFTiArIDEpOwotICAgIExTUF9GUkFHTUVOVCAob2xkX2RyKSA9IDA7Ci0gICAgaWYgKExTUF9QU0VVRE9fSUQob2xkX2RyKSkgewotICAgICAgLyogdGhlcmUgd2FzIGEgZHIgZWxlY3RlZCwgcHVyZ2UgaXRzIExTUHMgZnJvbSB0aGUgZGIgKi8KLSAgICAgIGxzcF9wdXJnZV9kciAob2xkX2RyLCBjaXJjdWl0LCBsZXZlbCk7Ci0gICAgfQotICAgIG1lbWNweSAoY2lyY3VpdC0+dS5iYy5sMl9kZXNpZ19pcywgaXNpcy0+c3lzaWQsIElTSVNfU1lTX0lEX0xFTik7Ci0gICAgKihjaXJjdWl0LT51LmJjLmwyX2Rlc2lnX2lzICsgSVNJU19TWVNfSURfTEVOKSA9IGNpcmN1aXQtPmNpcmN1aXRfaWQ7Ci0gICAgCi0gICAgYXNzZXJ0IChjaXJjdWl0LT5jaXJjdWl0X2lkKTsgLyogbXVzdCBiZSBub24temVybyAqLwotICAgIC8qICAgIGlmIChjaXJjdWl0LT50X3NlbmRfbDFfcHNucCkKLSAgICAgICAgICB0aHJlYWRfY2FuY2VsIChjaXJjdWl0LT50X3NlbmRfbDFfcHNucCk7ICovCi0gICAgbHNwX2wyX3BzZXVkb19nZW5lcmF0ZSAoY2lyY3VpdCk7CisgICAgICBhc3NlcnQgKGNpcmN1aXQtPmNpcmN1aXRfaWQpOwkvKiBtdXN0IGJlIG5vbi16ZXJvICovCisgICAgICAvKiAgICBpZiAoY2lyY3VpdC0+dF9zZW5kX2wxX3BzbnApCisgICAgICAgICB0aHJlYWRfY2FuY2VsIChjaXJjdWl0LT50X3NlbmRfbDFfcHNucCk7ICovCisgICAgICBsc3BfbDFfcHNldWRvX2dlbmVyYXRlIChjaXJjdWl0KTsKIAotICAgIFRIUkVBRF9USU1FUl9PRkYoY2lyY3VpdC0+dS5iYy50X3J1bl9kclsxXSk7Ci0gICAgVEhSRUFEX1RJTUVSX09OKG1hc3RlciwgY2lyY3VpdC0+dS5iYy50X3J1bl9kclsxXSwgaXNpc19ydW5fZHJfbDIsCi0gICAgICAgIGNpcmN1aXQsIDIgKiBjaXJjdWl0LT5oZWxsb19pbnRlcnZhbFsxXSk7Ci0gICAgICAgIAotICAgIFRIUkVBRF9USU1FUl9PTihtYXN0ZXIsIGNpcmN1aXQtPnRfc2VuZF9jc25wWzFdLCBzZW5kX2wyX2NzbnAsIGNpcmN1aXQsCi0gICAgICAgIGlzaXNfaml0dGVyIChjaXJjdWl0LT5jc25wX2ludGVydmFsW2xldmVsLTFdLCBDU05QX0pJVFRFUikpOwotICB9IAorICAgICAgVEhSRUFEX1RJTUVSX09GRiAoY2lyY3VpdC0+dS5iYy50X3J1bl9kclswXSk7CisgICAgICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgY2lyY3VpdC0+dS5iYy50X3J1bl9kclswXSwgaXNpc19ydW5fZHJfbDEsCisJCSAgICAgICBjaXJjdWl0LCAyICogY2lyY3VpdC0+aGVsbG9faW50ZXJ2YWxbMF0pOworCisgICAgICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgY2lyY3VpdC0+dF9zZW5kX2NzbnBbMF0sIHNlbmRfbDFfY3NucCwgY2lyY3VpdCwKKwkJICAgICAgIGlzaXNfaml0dGVyIChjaXJjdWl0LT5jc25wX2ludGVydmFsW2xldmVsIC0gMV0sCisJCQkJICAgIENTTlBfSklUVEVSKSk7CisKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtZW1jcHkgKG9sZF9kciwgY2lyY3VpdC0+dS5iYy5sMl9kZXNpZ19pcywgSVNJU19TWVNfSURfTEVOICsgMSk7CisgICAgICBMU1BfRlJBR01FTlQgKG9sZF9kcikgPSAwOworICAgICAgaWYgKExTUF9QU0VVRE9fSUQgKG9sZF9kcikpCisJeworCSAgLyogdGhlcmUgd2FzIGEgZHIgZWxlY3RlZCwgcHVyZ2UgaXRzIExTUHMgZnJvbSB0aGUgZGIgKi8KKwkgIGxzcF9wdXJnZV9kciAob2xkX2RyLCBjaXJjdWl0LCBsZXZlbCk7CisJfQorICAgICAgbWVtY3B5IChjaXJjdWl0LT51LmJjLmwyX2Rlc2lnX2lzLCBpc2lzLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOKTsKKyAgICAgICooY2lyY3VpdC0+dS5iYy5sMl9kZXNpZ19pcyArIElTSVNfU1lTX0lEX0xFTikgPSBjaXJjdWl0LT5jaXJjdWl0X2lkOworCisgICAgICBhc3NlcnQgKGNpcmN1aXQtPmNpcmN1aXRfaWQpOwkvKiBtdXN0IGJlIG5vbi16ZXJvICovCisgICAgICAvKiAgICBpZiAoY2lyY3VpdC0+dF9zZW5kX2wxX3BzbnApCisgICAgICAgICB0aHJlYWRfY2FuY2VsIChjaXJjdWl0LT50X3NlbmRfbDFfcHNucCk7ICovCisgICAgICBsc3BfbDJfcHNldWRvX2dlbmVyYXRlIChjaXJjdWl0KTsKKworICAgICAgVEhSRUFEX1RJTUVSX09GRiAoY2lyY3VpdC0+dS5iYy50X3J1bl9kclsxXSk7CisgICAgICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgY2lyY3VpdC0+dS5iYy50X3J1bl9kclsxXSwgaXNpc19ydW5fZHJfbDIsCisJCSAgICAgICBjaXJjdWl0LCAyICogY2lyY3VpdC0+aGVsbG9faW50ZXJ2YWxbMV0pOworCisgICAgICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgY2lyY3VpdC0+dF9zZW5kX2NzbnBbMV0sIHNlbmRfbDJfY3NucCwgY2lyY3VpdCwKKwkJICAgICAgIGlzaXNfaml0dGVyIChjaXJjdWl0LT5jc25wX2ludGVydmFsW2xldmVsIC0gMV0sCisJCQkJICAgIENTTlBfSklUVEVSKSk7CisgICAgfQogCiAgIHRocmVhZF9hZGRfZXZlbnQgKG1hc3RlciwgaXNpc19ldmVudF9kaXNfc3RhdHVzX2NoYW5nZSwgY2lyY3VpdCwgMCk7Ci0gIAorCiAgIHJldHVybiBJU0lTX09LOwogfQotCmRpZmYgLS1naXQgYS9pc2lzZC9pc2lzX2RyLmggYi9pc2lzZC9pc2lzX2RyLmgKaW5kZXggNzNkOWNkMy4uYjAzODZkNCAxMDA2NDQKLS0tIGEvaXNpc2QvaXNpc19kci5oCisrKyBiL2lzaXNkL2lzaXNfZHIuaApAQCAtMzEsNyArMzEsOCBAQAogaW50IGlzaXNfZHJfY29tbWVuY2UgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsIGludCBsZXZlbCk7CiBjaGFyICppc2lzX2Rpc2ZsYWcyc3RyaW5nIChpbnQgZGlzZmxhZyk7CiAKLWVudW0gaXNpc19kaXNfc3RhdGUgeyAgICAgCitlbnVtIGlzaXNfZGlzX3N0YXRlCit7CiAgIElTSVNfSVNfTk9UX0RJUywKICAgSVNJU19JU19ESVMsCiAgIElTSVNfV0FTX0RJUywKQEAgLTM5LDQgKzQwLDMgQEAKIH07CiAKICNlbmRpZiAvKiBfWkVCUkFfSVNJU19EUl9IICovCi0KZGlmZiAtLWdpdCBhL2lzaXNkL2lzaXNfZHluaG4uYyBiL2lzaXNkL2lzaXNfZHluaG4uYwppbmRleCA2YjFkMjdiLi40MWMzNjM3IDEwMDY0NAotLS0gYS9pc2lzZC9pc2lzX2R5bmhuLmMKKysrIGIvaXNpc2QvaXNpc19keW5obi5jCkBAIC01MCw0OCArNTAsNTIgQEAKIGR5bl9jYWNoZV9pbml0ICh2b2lkKQogewogICBkeW5fY2FjaGUgPSBsaXN0X25ldyAoKTsKLSAgCisKICAgcmV0dXJuOwogfQogCi1zdHJ1Y3QgaXNpc19keW5obiAqZHluaG5fZmluZF9ieV9pZCAodV9jaGFyICogaWQpCitzdHJ1Y3QgaXNpc19keW5obiAqCitkeW5obl9maW5kX2J5X2lkICh1X2NoYXIgKiBpZCkKIHsKICAgc3RydWN0IGxpc3Rub2RlICpub2RlID0gTlVMTDsKICAgc3RydWN0IGlzaXNfZHluaG4gKmR5biA9IE5VTEw7CiAKLSAgZm9yIChub2RlID0gbGlzdGhlYWQgKGR5bl9jYWNoZSk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgewotICAgIGR5biA9IGdldGRhdGEgKG5vZGUpOwotICAgIGlmIChtZW1jbXAgKGR5bi0+aWQsIGlkLCBJU0lTX1NZU19JRF9MRU4pID09IDApCi0gICAgICByZXR1cm4gZHluOwotICB9Ci0gIAorICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoZHluX2NhY2hlKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorICAgIHsKKyAgICAgIGR5biA9IGdldGRhdGEgKG5vZGUpOworICAgICAgaWYgKG1lbWNtcCAoZHluLT5pZCwgaWQsIElTSVNfU1lTX0lEX0xFTikgPT0gMCkKKwlyZXR1cm4gZHluOworICAgIH0KKwogICByZXR1cm4gTlVMTDsKIH0KIAogdm9pZAotaXNpc19keW5obl9pbnNlcnQgKHVfY2hhciAqaWQsIHN0cnVjdCBob3N0bmFtZSAqaG9zdG5hbWUsIGludCBsZXZlbCkKK2lzaXNfZHluaG5faW5zZXJ0ICh1X2NoYXIgKiBpZCwgc3RydWN0IGhvc3RuYW1lICpob3N0bmFtZSwgaW50IGxldmVsKQogewogICBzdHJ1Y3QgaXNpc19keW5obiAqZHluOwogCiAgIGR5biA9IGR5bmhuX2ZpbmRfYnlfaWQgKGlkKTsKLSAgaWYgKGR5bikgewotICAgIG1lbWNweSAoJmR5bi0+bmFtZSwgaG9zdG5hbWUsIGhvc3RuYW1lLT5uYW1lbGVuICsgMSk7Ci0gICAgbWVtY3B5IChkeW4tPmlkLCBpZCwgSVNJU19TWVNfSURfTEVOKTsKLSAgICBkeW4tPnJlZnJlc2ggPSB0aW1lIChOVUxMKTsKLSAgICByZXR1cm47Ci0gIH0KKyAgaWYgKGR5bikKKyAgICB7CisgICAgICBtZW1jcHkgKCZkeW4tPm5hbWUsIGhvc3RuYW1lLCBob3N0bmFtZS0+bmFtZWxlbiArIDEpOworICAgICAgbWVtY3B5IChkeW4tPmlkLCBpZCwgSVNJU19TWVNfSURfTEVOKTsKKyAgICAgIGR5bi0+cmVmcmVzaCA9IHRpbWUgKE5VTEwpOworICAgICAgcmV0dXJuOworICAgIH0KICAgZHluID0gWE1BTExPQyAoTVRZUEVfSVNJU19EWU5ITiwgc2l6ZW9mIChzdHJ1Y3QgaXNpc19keW5obikpOwotICBpZiAoIWR5bikgewotICAgIHpsb2dfd2FybiAoImlzaXNfZHluaG5faW5zZXJ0KCk6IG91dCBvZiBtZW1vcnkhIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIG1lbXNldCAoZHluLDAsc2l6ZW9mKHN0cnVjdCBpc2lzX2R5bmhuKSk7CisgIGlmICghZHluKQorICAgIHsKKyAgICAgIHpsb2dfd2FybiAoImlzaXNfZHluaG5faW5zZXJ0KCk6IG91dCBvZiBtZW1vcnkhIik7CisgICAgICByZXR1cm47CisgICAgfQorICBtZW1zZXQgKGR5biwgMCwgc2l6ZW9mIChzdHJ1Y3QgaXNpc19keW5obikpOwogICAvKiB3ZSBhbHNvIGNvcHkgdGhlIGxlbmd0aCAqLwotICBtZW1jcHkgKCZkeW4tPm5hbWUsIGhvc3RuYW1lLCBob3N0bmFtZS0+bmFtZWxlbiArIDEpOyAKKyAgbWVtY3B5ICgmZHluLT5uYW1lLCBob3N0bmFtZSwgaG9zdG5hbWUtPm5hbWVsZW4gKyAxKTsKICAgbWVtY3B5IChkeW4tPmlkLCBpZCwgSVNJU19TWVNfSURfTEVOKTsKICAgZHluLT5yZWZyZXNoID0gdGltZSAoTlVMTCk7CiAgIGR5bi0+bGV2ZWwgPSBsZXZlbDsKLSAgCisKICAgbGlzdG5vZGVfYWRkIChkeW5fY2FjaGUsIGR5bik7CiAKICAgcmV0dXJuOwpAQCAtMTAzLDIxICsxMDcsMjIgQEAKICAqICAyICAgICAwMDAwLjAwMDAuMDAwMiBiYXItZ3cKICAqICAgICAgKiAwMDAwLjAwMDAuMDAwNCB0aGlzLWd3CiAgKi8KLXZvaWQgIGR5bmhuX3ByaW50X2FsbCAoc3RydWN0IHZ0eSAqdnR5KSAKK3ZvaWQKK2R5bmhuX3ByaW50X2FsbCAoc3RydWN0IHZ0eSAqdnR5KQogewogICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgIHN0cnVjdCBpc2lzX2R5bmhuICpkeW47CiAKICAgdnR5X291dCAodnR5LCAiTGV2ZWwgIFN5c3RlbSBJRCAgICAgIER5bmFtaWMgSG9zdG5hbWUlcyIsIFZUWV9ORVdMSU5FKTsKLSAgZm9yIChub2RlID0gbGlzdGhlYWQgKGR5bl9jYWNoZSk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgewotICAgIGR5biA9IGdldGRhdGEgKG5vZGUpOwotICAgIHZ0eV9vdXQgKHZ0eSwgIiUtN2QiLCBkeW4tPmxldmVsKTsKLSAgICB2dHlfb3V0ICh2dHksICIlLTE1cyUtMTVzJXMiLCBzeXNpZF9wcmludCAoZHluLT5pZCksIGR5bi0+bmFtZS5uYW1lLCAKLQkgICAgIFZUWV9ORVdMSU5FKTsKLSAgfQotICAKLSAgdnR5X291dCAodnR5LCAgIiAgICAgKiAlcyAlcyVzIiwgc3lzaWRfcHJpbnQgKGlzaXMtPnN5c2lkKSwgdW5peF9ob3N0bmFtZSgpLCAKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGR5bl9jYWNoZSk7IG5vZGU7IG5leHRub2RlIChub2RlKSkKKyAgICB7CisgICAgICBkeW4gPSBnZXRkYXRhIChub2RlKTsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIiUtN2QiLCBkeW4tPmxldmVsKTsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIiUtMTVzJS0xNXMlcyIsIHN5c2lkX3ByaW50IChkeW4tPmlkKSwgZHluLT5uYW1lLm5hbWUsCisJICAgICAgIFZUWV9ORVdMSU5FKTsKKyAgICB9CisKKyAgdnR5X291dCAodnR5LCAiICAgICAqICVzICVzJXMiLCBzeXNpZF9wcmludCAoaXNpcy0+c3lzaWQpLCB1bml4X2hvc3RuYW1lICgpLAogCSAgIFZUWV9ORVdMSU5FKTsKICAgcmV0dXJuOwogfQotCmRpZmYgLS1naXQgYS9pc2lzZC9pc2lzX2R5bmhuLmggYi9pc2lzZC9pc2lzX2R5bmhuLmgKaW5kZXggMmE3ZjNlYy4uMzdhN2IwMyAxMDA2NDQKLS0tIGEvaXNpc2QvaXNpc19keW5obi5oCisrKyBiL2lzaXNkL2lzaXNfZHluaG4uaApAQCAtMjMsNyArMjMsOCBAQAogI2lmbmRlZiBfWkVCUkFfSVNJU19EWU5ITl9ICiAjZGVmaW5lIF9aRUJSQV9JU0lTX0RZTkhOX0gKIAotc3RydWN0IGlzaXNfZHluaG4geworc3RydWN0IGlzaXNfZHluaG4KK3sKICAgdV9jaGFyIGlkW0lTSVNfU1lTX0lEX0xFTl07CiAgIHN0cnVjdCBob3N0bmFtZSBuYW1lOwogICB0aW1lX3QgcmVmcmVzaDsKQEAgLTMxLDEyICszMiw4IEBACiB9OwogCiB2b2lkIGR5bl9jYWNoZV9pbml0ICh2b2lkKTsKLXZvaWQgaXNpc19keW5obl9pbnNlcnQgKHVfY2hhciAqaWQsIHN0cnVjdCBob3N0bmFtZSAqaG9zdG5hbWUsIGludCBsZXZlbCk7Cit2b2lkIGlzaXNfZHluaG5faW5zZXJ0ICh1X2NoYXIgKiBpZCwgc3RydWN0IGhvc3RuYW1lICpob3N0bmFtZSwgaW50IGxldmVsKTsKIHN0cnVjdCBpc2lzX2R5bmhuICpkeW5obl9maW5kX2J5X2lkICh1X2NoYXIgKiBpZCk7Ci12b2lkICBkeW5obl9wcmludF9hbGwgKHN0cnVjdCB2dHkgKnZ0eSk7Cit2b2lkIGR5bmhuX3ByaW50X2FsbCAoc3RydWN0IHZ0eSAqdnR5KTsKIAogI2VuZGlmIC8qIF9aRUJSQV9JU0lTX0RZTkhOX0ggKi8KLQotCi0KLQpkaWZmIC0tZ2l0IGEvaXNpc2QvaXNpc19ldmVudHMuYyBiL2lzaXNkL2lzaXNfZXZlbnRzLmMKaW5kZXggYmUxMzZlMi4uYTk5ODY5YiAxMDA2NDQKLS0tIGEvaXNpc2QvaXNpc19ldmVudHMuYworKysgYi9pc2lzZC9pc2lzX2V2ZW50cy5jCkBAIC02NCwxOSArNjQsMTkgQEAKICA0dzVkOiBJU0lTLVNwZiAodGx0KTogTDIgU1BGIG5lZWRlZCwgcGVyaW9kaWMgU1BGLCBmcm9tIDB4NjA5MUM4NDQKICovCiAKLXZvaWQgCit2b2lkCiBpc2lzX2V2ZW50X2NpcmN1aXRfc3RhdGVfY2hhbmdlIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LCBpbnQgdXApCiB7CiAgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWE7Ci0gIAorCiAgIGFyZWEgPSBjaXJjdWl0LT5hcmVhOwogICBhc3NlcnQgKGFyZWEpOwogICBhcmVhLT5jaXJjdWl0X3N0YXRlX2NoYW5nZXMrKzsKLSAgCi0gIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19FVkVOVFMpIAotICAgIHpsb2dfaW5mbyAoIklTSVMtRXZ0ICglcykgY2lyY3VpdCAlcyIsIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLCAKKworICBpZiAoaXNpcy0+ZGVidWdzICYgREVCVUdfRVZFTlRTKQorICAgIHpsb2dfaW5mbyAoIklTSVMtRXZ0ICglcykgY2lyY3VpdCAlcyIsIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLAogCSAgICAgICB1cCA/ICJ1cCIgOiAiZG93biIpOwotICAKKwogICAvKgogICAgKiBSZWdlbmVyYXRlIExTUHMgdGhpcyBhZmZlY3RzCiAgICAqLwpAQCAtODUsNDcgKzg1LDUxIEBACiAgIHJldHVybjsKIH0KIAotdm9pZCAKK3ZvaWQKIGlzaXNfZXZlbnRfc3lzdGVtX3R5cGVfY2hhbmdlIChzdHJ1Y3QgaXNpc19hcmVhICphcmVhLCBpbnQgbmV3dHlwZSkKIHsKICAgc3RydWN0IGxpc3Rub2RlICpub2RlOwogICBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0OwogCi0gIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19FVkVOVFMpIAotICAgIHpsb2dfaW5mbyAoIklTSVMtRXZ0ICglcykgc3lzdGVtIHR5cGUgY2hhbmdlICVzIC0+ICVzIiwgYXJlYS0+YXJlYV90YWcsIAorICBpZiAoaXNpcy0+ZGVidWdzICYgREVCVUdfRVZFTlRTKQorICAgIHpsb2dfaW5mbyAoIklTSVMtRXZ0ICglcykgc3lzdGVtIHR5cGUgY2hhbmdlICVzIC0+ICVzIiwgYXJlYS0+YXJlYV90YWcsCiAJICAgICAgIGNpcmN1aXRfdDJzdHJpbmcgKGFyZWEtPmlzX3R5cGUpLCBjaXJjdWl0X3Qyc3RyaW5nIChuZXd0eXBlKSk7Ci0gIAorCiAgIGlmIChhcmVhLT5pc190eXBlID09IG5ld3R5cGUpCi0gICAgcmV0dXJuOyAvKiBObyBjaGFuZ2UgKi8KLSAgCi0gIHN3aXRjaCAoYXJlYS0+aXNfdHlwZSkgewotICBjYXNlIElTX0xFVkVMXzE6Ci0gICAgaWYgKGFyZWEtPmxzcGRiWzFdID09IE5VTEwpCi0gICAgICBhcmVhLT5sc3BkYlsxXSA9IGxzcF9kYl9pbml0ICgpOyAKLSAgICBsc3BfbDJfZ2VuZXJhdGUgKGFyZWEpOwotICAgIGJyZWFrOwotICBjYXNlIElTX0xFVkVMXzFfQU5EXzI6Ci0gICAgaWYgKG5ld3R5cGUgPT0gSVNfTEVWRUxfMSkgewotICAgICAgbHNwX2RiX2Rlc3Ryb3kgKGFyZWEtPmxzcGRiWzFdKTsKLSAgICB9IAotICAgIGVsc2UgewotICAgICAgbHNwX2RiX2Rlc3Ryb3kgKGFyZWEtPmxzcGRiWzBdKTsKLSAgICB9IAotICAgIGJyZWFrOwotICBjYXNlIElTX0xFVkVMXzI6Ci0gICAgaWYgKGFyZWEtPmxzcGRiWzBdID09IE5VTEwpCi0gICAgICBhcmVhLT5sc3BkYlswXSA9IGxzcF9kYl9pbml0ICgpOyAKLSAgICBsc3BfbDFfZ2VuZXJhdGUgKGFyZWEpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIGJyZWFrOwotICB9Ci0gIAorICAgIHJldHVybjsJCQkvKiBObyBjaGFuZ2UgKi8KKworICBzd2l0Y2ggKGFyZWEtPmlzX3R5cGUpCisgICAgeworICAgIGNhc2UgSVNfTEVWRUxfMToKKyAgICAgIGlmIChhcmVhLT5sc3BkYlsxXSA9PSBOVUxMKQorCWFyZWEtPmxzcGRiWzFdID0gbHNwX2RiX2luaXQgKCk7CisgICAgICBsc3BfbDJfZ2VuZXJhdGUgKGFyZWEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJU19MRVZFTF8xX0FORF8yOgorICAgICAgaWYgKG5ld3R5cGUgPT0gSVNfTEVWRUxfMSkKKwl7CisJICBsc3BfZGJfZGVzdHJveSAoYXJlYS0+bHNwZGJbMV0pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBsc3BfZGJfZGVzdHJveSAoYXJlYS0+bHNwZGJbMF0pOworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVNfTEVWRUxfMjoKKyAgICAgIGlmIChhcmVhLT5sc3BkYlswXSA9PSBOVUxMKQorCWFyZWEtPmxzcGRiWzBdID0gbHNwX2RiX2luaXQgKCk7CisgICAgICBsc3BfbDFfZ2VuZXJhdGUgKGFyZWEpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKwogICBhcmVhLT5pc190eXBlID0gbmV3dHlwZTsKLSAgZm9yIChub2RlID0gbGlzdGhlYWQgKGFyZWEtPmNpcmN1aXRfbGlzdCk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgewotICAgIGNpcmN1aXQgPSBnZXRkYXRhIChub2RlKTsKLSAgICBpc2lzX2V2ZW50X2NpcmN1aXRfdHlwZV9jaGFuZ2UgKGNpcmN1aXQsIG5ld3R5cGUpOwotICB9CisgIGZvciAobm9kZSA9IGxpc3RoZWFkIChhcmVhLT5jaXJjdWl0X2xpc3QpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisgICAgeworICAgICAgY2lyY3VpdCA9IGdldGRhdGEgKG5vZGUpOworICAgICAgaXNpc19ldmVudF9jaXJjdWl0X3R5cGVfY2hhbmdlIChjaXJjdWl0LCBuZXd0eXBlKTsKKyAgICB9CiAKICAgc3BmdHJlZV9hcmVhX2luaXQgKGFyZWEpOwogICBsc3BfcmVnZW5lcmF0ZV9zY2hlZHVsZSAoYXJlYSk7CkBAIC0xMzMsOSArMTM3LDcgQEAKICAgcmV0dXJuOwogfQogCi0KLQotdm9pZCAKK3ZvaWQKIGlzaXNfZXZlbnRfYXJlYV9hZGRyX2NoYW5nZSAoc3RydWN0IGlzaXNfYXJlYSAqYXJlYSkKIHsKIApAQCAtMTQ2LDQwICsxNDgsNDkgQEAKIHsKICAgdWludDMyX3QgaW50ZXJ2YWw7CiAKLSAgaWYgKGxldmVsID09IDEpIHsKLSAgICBUSFJFQURfVElNRVJfT04obWFzdGVyLCBjaXJjdWl0LT50X3NlbmRfcHNucFswXSwgc2VuZF9sMV9wc25wLCBjaXJjdWl0LAotICAgICAgICBpc2lzX2ppdHRlcihjaXJjdWl0LT5wc25wX2ludGVydmFsWzBdLCBQU05QX0pJVFRFUikpOworICBpZiAobGV2ZWwgPT0gMSkKKyAgICB7CisgICAgICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgY2lyY3VpdC0+dF9zZW5kX3BzbnBbMF0sIHNlbmRfbDFfcHNucCwgY2lyY3VpdCwKKwkJICAgICAgIGlzaXNfaml0dGVyIChjaXJjdWl0LT5wc25wX2ludGVydmFsWzBdLCBQU05QX0pJVFRFUikpOwogCi0gICAgaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSA9PSBDSVJDVUlUX1RfQlJPQURDQVNUKSB7Ci0gICAgICBpbnRlcnZhbCA9IGNpcmN1aXQtPmhlbGxvX211bHRpcGxpZXJbMF0gKiAoY2lyY3VpdC0+aGVsbG9faW50ZXJ2YWxbMF0pOyAKLSAgICAgIAotICAgICAgVEhSRUFEX1RJTUVSX09OKG1hc3RlciwgY2lyY3VpdC0+dS5iYy50X3J1bl9kclswXSwgaXNpc19ydW5fZHJfbDEsCi0JCQkJCQkgICAgIGNpcmN1aXQsIGludGVydmFsKTsKLSAgICAgIAotICAgICAgVEhSRUFEX1RJTUVSX09OKG1hc3RlciwgY2lyY3VpdC0+dS5iYy50X3NlbmRfbGFuX2hlbGxvWzBdLAotICAgICAgICAgIHNlbmRfbGFuX2wxX2hlbGxvLCBjaXJjdWl0LAotICAgICAgICAgIGlzaXNfaml0dGVyKGNpcmN1aXQtPmhlbGxvX2ludGVydmFsWzBdLCBJSUhfSklUVEVSKSk7Ci0gICAgICAKLSAgICAgIGNpcmN1aXQtPnUuYmMubGFuX25laWdoc1swXSA9IGxpc3RfbmV3ICgpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBUSFJFQURfVElNRVJfT04obWFzdGVyLCBjaXJjdWl0LT50X3NlbmRfcHNucFsxXSwgc2VuZF9sMl9wc25wLCBjaXJjdWl0LAotICAgICAgICBpc2lzX2ppdHRlcihjaXJjdWl0LT5wc25wX2ludGVydmFsWzFdLCBQU05QX0pJVFRFUikpOworICAgICAgaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSA9PSBDSVJDVUlUX1RfQlJPQURDQVNUKQorCXsKKwkgIGludGVydmFsID0KKwkgICAgY2lyY3VpdC0+aGVsbG9fbXVsdGlwbGllclswXSAqIChjaXJjdWl0LT5oZWxsb19pbnRlcnZhbFswXSk7CiAKLSAgICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QpIHsKLSAgICAgIGludGVydmFsID0gY2lyY3VpdC0+aGVsbG9fbXVsdGlwbGllclsxXSAqIChjaXJjdWl0LT5oZWxsb19pbnRlcnZhbFsxXSk7IAotICAgICAgCi0gICAgICBUSFJFQURfVElNRVJfT04obWFzdGVyLCBjaXJjdWl0LT51LmJjLnRfcnVuX2RyWzFdLCBpc2lzX3J1bl9kcl9sMiwKLQkJCQkJCSAgICAgY2lyY3VpdCwgaW50ZXJ2YWwpOwotICAgICAgCi0gICAgICBUSFJFQURfVElNRVJfT04obWFzdGVyLCBjaXJjdWl0LT51LmJjLnRfc2VuZF9sYW5faGVsbG9bMV0sCi0gICAgICAgICAgc2VuZF9sYW5fbDJfaGVsbG8sIGNpcmN1aXQsCi0gICAgICAgICAgaXNpc19qaXR0ZXIoY2lyY3VpdC0+aGVsbG9faW50ZXJ2YWxbMV0sIElJSF9KSVRURVIpKTsKLSAgICAgIAotICAgICAgY2lyY3VpdC0+dS5iYy5sYW5fbmVpZ2hzWzFdID0gbGlzdF9uZXcgKCk7CisJICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgY2lyY3VpdC0+dS5iYy50X3J1bl9kclswXSwgaXNpc19ydW5fZHJfbDEsCisJCQkgICBjaXJjdWl0LCBpbnRlcnZhbCk7CisKKwkgIFRIUkVBRF9USU1FUl9PTiAobWFzdGVyLCBjaXJjdWl0LT51LmJjLnRfc2VuZF9sYW5faGVsbG9bMF0sCisJCQkgICBzZW5kX2xhbl9sMV9oZWxsbywgY2lyY3VpdCwKKwkJCSAgIGlzaXNfaml0dGVyIChjaXJjdWl0LT5oZWxsb19pbnRlcnZhbFswXSwKKwkJCQkJSUlIX0pJVFRFUikpOworCisJICBjaXJjdWl0LT51LmJjLmxhbl9uZWlnaHNbMF0gPSBsaXN0X25ldyAoKTsKKwl9CiAgICAgfQotICB9Ci0gIAorICBlbHNlCisgICAgeworICAgICAgVEhSRUFEX1RJTUVSX09OIChtYXN0ZXIsIGNpcmN1aXQtPnRfc2VuZF9wc25wWzFdLCBzZW5kX2wyX3BzbnAsIGNpcmN1aXQsCisJCSAgICAgICBpc2lzX2ppdHRlciAoY2lyY3VpdC0+cHNucF9pbnRlcnZhbFsxXSwgUFNOUF9KSVRURVIpKTsKKworICAgICAgaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSA9PSBDSVJDVUlUX1RfQlJPQURDQVNUKQorCXsKKwkgIGludGVydmFsID0KKwkgICAgY2lyY3VpdC0+aGVsbG9fbXVsdGlwbGllclsxXSAqIChjaXJjdWl0LT5oZWxsb19pbnRlcnZhbFsxXSk7CisKKwkgIFRIUkVBRF9USU1FUl9PTiAobWFzdGVyLCBjaXJjdWl0LT51LmJjLnRfcnVuX2RyWzFdLCBpc2lzX3J1bl9kcl9sMiwKKwkJCSAgIGNpcmN1aXQsIGludGVydmFsKTsKKworCSAgVEhSRUFEX1RJTUVSX09OIChtYXN0ZXIsIGNpcmN1aXQtPnUuYmMudF9zZW5kX2xhbl9oZWxsb1sxXSwKKwkJCSAgIHNlbmRfbGFuX2wyX2hlbGxvLCBjaXJjdWl0LAorCQkJICAgaXNpc19qaXR0ZXIgKGNpcmN1aXQtPmhlbGxvX2ludGVydmFsWzFdLAorCQkJCQlJSUhfSklUVEVSKSk7CisKKwkgIGNpcmN1aXQtPnUuYmMubGFuX25laWdoc1sxXSA9IGxpc3RfbmV3ICgpOworCX0KKyAgICB9CisKICAgcmV0dXJuOwogfQogCkBAIC0xODcsNjEgKzE5OCw2NCBAQAogY2lyY3VpdF9yZXNpZ25fbGV2ZWwgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsIGludCBsZXZlbCkKIHsKICAgaW50IGlkeCA9IGxldmVsIC0gMTsKLSAKLSAgVEhSRUFEX1RJTUVSX09GRihjaXJjdWl0LT50X3NlbmRfY3NucFtpZHhdKTsKLSAgVEhSRUFEX1RJTUVSX09GRihjaXJjdWl0LT50X3NlbmRfcHNucFtpZHhdKTsKIAotICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QpIHsKLSAgICBUSFJFQURfVElNRVJfT0ZGKGNpcmN1aXQtPnUuYmMudF9zZW5kX2xhbl9oZWxsb1tpZHhdKTsKLSAgICBUSFJFQURfVElNRVJfT0ZGKGNpcmN1aXQtPnUuYmMudF9ydW5fZHJbaWR4XSk7Ci0gICAgY2lyY3VpdC0+dS5iYy5ydW5fZHJfZWxlY3RbaWR4XSA9IDA7Ci0gIH0KLSAgCisgIFRIUkVBRF9USU1FUl9PRkYgKGNpcmN1aXQtPnRfc2VuZF9jc25wW2lkeF0pOworICBUSFJFQURfVElNRVJfT0ZGIChjaXJjdWl0LT50X3NlbmRfcHNucFtpZHhdKTsKKworICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QpCisgICAgeworICAgICAgVEhSRUFEX1RJTUVSX09GRiAoY2lyY3VpdC0+dS5iYy50X3NlbmRfbGFuX2hlbGxvW2lkeF0pOworICAgICAgVEhSRUFEX1RJTUVSX09GRiAoY2lyY3VpdC0+dS5iYy50X3J1bl9kcltpZHhdKTsKKyAgICAgIGNpcmN1aXQtPnUuYmMucnVuX2RyX2VsZWN0W2lkeF0gPSAwOworICAgIH0KKwogICByZXR1cm47CiB9CiAKLXZvaWQgCi1pc2lzX2V2ZW50X2NpcmN1aXRfdHlwZV9jaGFuZ2UgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsIGludCBuZXd0eXBlKSAKK3ZvaWQKK2lzaXNfZXZlbnRfY2lyY3VpdF90eXBlX2NoYW5nZSAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgaW50IG5ld3R5cGUpCiB7Ci0gIAotICBpZiAoaXNpcy0+ZGVidWdzICYgREVCVUdfRVZFTlRTKSAKLSAgICB6bG9nX2luZm8gKCJJU0lTLUV2dCAoJXMpIGNpcmN1aXQgdHlwZSBjaGFuZ2UgJXMgLT4gJXMiLCAKLQkgICAgICAgY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsIAotCSAgICAgICBjaXJjdWl0X3Qyc3RyaW5nIChjaXJjdWl0LT5jaXJjdWl0X2lzX3R5cGUpLCAKKworICBpZiAoaXNpcy0+ZGVidWdzICYgREVCVUdfRVZFTlRTKQorICAgIHpsb2dfaW5mbyAoIklTSVMtRXZ0ICglcykgY2lyY3VpdCB0eXBlIGNoYW5nZSAlcyAtPiAlcyIsCisJICAgICAgIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLAorCSAgICAgICBjaXJjdWl0X3Qyc3RyaW5nIChjaXJjdWl0LT5jaXJjdWl0X2lzX3R5cGUpLAogCSAgICAgICBjaXJjdWl0X3Qyc3RyaW5nIChuZXd0eXBlKSk7CiAKICAgaWYgKGNpcmN1aXQtPmNpcmN1aXRfaXNfdHlwZSA9PSBuZXd0eXBlKQotICAgIHJldHVybjsgLyogTm8gY2hhbmdlICovCisgICAgcmV0dXJuOwkJCS8qIE5vIGNoYW5nZSAqLwogCi0gIGlmICghKG5ld3R5cGUgJiBjaXJjdWl0LT5hcmVhLT5pc190eXBlKSkgewotICAgIHpsb2dfZXJyICgiSVNJUy1FdnQgKCVzKSBjaXJjdWl0IHR5cGUgY2hhbmdlIC0gaW52YWxpZCBsZXZlbCAlcyBiZWNhdXNlIgotCSAgICAgICIgYXJlYSBpcyAlcyIsIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLCAKLQkgICAgICBjaXJjdWl0X3Qyc3RyaW5nIChuZXd0eXBlKSwgCi0JICAgICAgY2lyY3VpdF90MnN0cmluZyAoY2lyY3VpdC0+YXJlYS0+aXNfdHlwZSkpOwotICAgIHJldHVybjsKLSAgfQotICAgIAotICBzd2l0Y2ggKGNpcmN1aXQtPmNpcmN1aXRfaXNfdHlwZSkgewotICBjYXNlIElTX0xFVkVMXzE6Ci0gICAgaWYgKG5ld3R5cGUgPT0gSVNfTEVWRUxfMikKLSAgICAgIGNpcmN1aXRfcmVzaWduX2xldmVsIChjaXJjdWl0LCAxKTsKLSAgICBjaXJjdWl0X2NvbW1lbmNlX2xldmVsIChjaXJjdWl0LCAyKTsKLSAgICBicmVhazsKLSAgY2FzZSBJU19MRVZFTF8xX0FORF8yOgotICAgIGlmIChuZXd0eXBlID09IElTX0xFVkVMXzEpCi0gICAgICBjaXJjdWl0X3Jlc2lnbl9sZXZlbCAoY2lyY3VpdCwgMik7Ci0gICAgZWxzZSAKLSAgICAgIGNpcmN1aXRfcmVzaWduX2xldmVsIChjaXJjdWl0LCAxKTsKLSAgICBicmVhazsKLSAgY2FzZSBJU19MRVZFTF8yOgotICAgIGlmIChuZXd0eXBlID09IElTX0xFVkVMXzEpCi0gICAgICBjaXJjdWl0X3Jlc2lnbl9sZXZlbCAoY2lyY3VpdCwgMik7Ci0gICAgY2lyY3VpdF9jb21tZW5jZV9sZXZlbCAoY2lyY3VpdCwgMSk7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgYnJlYWs7Ci0gIH0KLSAgCisgIGlmICghKG5ld3R5cGUgJiBjaXJjdWl0LT5hcmVhLT5pc190eXBlKSkKKyAgICB7CisgICAgICB6bG9nX2VyciAoIklTSVMtRXZ0ICglcykgY2lyY3VpdCB0eXBlIGNoYW5nZSAtIGludmFsaWQgbGV2ZWwgJXMgYmVjYXVzZSIKKwkJIiBhcmVhIGlzICVzIiwgY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsCisJCWNpcmN1aXRfdDJzdHJpbmcgKG5ld3R5cGUpLAorCQljaXJjdWl0X3Qyc3RyaW5nIChjaXJjdWl0LT5hcmVhLT5pc190eXBlKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHN3aXRjaCAoY2lyY3VpdC0+Y2lyY3VpdF9pc190eXBlKQorICAgIHsKKyAgICBjYXNlIElTX0xFVkVMXzE6CisgICAgICBpZiAobmV3dHlwZSA9PSBJU19MRVZFTF8yKQorCWNpcmN1aXRfcmVzaWduX2xldmVsIChjaXJjdWl0LCAxKTsKKyAgICAgIGNpcmN1aXRfY29tbWVuY2VfbGV2ZWwgKGNpcmN1aXQsIDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJU19MRVZFTF8xX0FORF8yOgorICAgICAgaWYgKG5ld3R5cGUgPT0gSVNfTEVWRUxfMSkKKwljaXJjdWl0X3Jlc2lnbl9sZXZlbCAoY2lyY3VpdCwgMik7CisgICAgICBlbHNlCisJY2lyY3VpdF9yZXNpZ25fbGV2ZWwgKGNpcmN1aXQsIDEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJU19MRVZFTF8yOgorICAgICAgaWYgKG5ld3R5cGUgPT0gSVNfTEVWRUxfMSkKKwljaXJjdWl0X3Jlc2lnbl9sZXZlbCAoY2lyY3VpdCwgMik7CisgICAgICBjaXJjdWl0X2NvbW1lbmNlX2xldmVsIChjaXJjdWl0LCAxKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisKICAgY2lyY3VpdC0+Y2lyY3VpdF9pc190eXBlID0gbmV3dHlwZTsKICAgbHNwX3JlZ2VuZXJhdGVfc2NoZWR1bGUgKGNpcmN1aXQtPmFyZWEpOwogCkBAIC0yNzAsMTggKzI4NCwxOSBAQAogICAqCiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgCit2b2lkCiBpc2lzX2V2ZW50X2FkamFjZW5jeV9zdGF0ZV9jaGFuZ2UgKHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqLCBpbnQgbmV3c3RhdGUpCiB7CiAgIC8qIGFkamFjZW5jeSBzdGF0ZSBjaGFuZ2UgZXZlbnQuIAogICAgKiAtIHRoZSBvbmx5IHByb3RvLXR5cGUgd2FzIHN1cHBvcnRlZCAqLwotICAKLSAgLyogaW52YWxpZCBhcmd1bWVudHMgKi8gCi0gIGlmICggIWFkaiB8fCAhYWRqLT5jaXJjdWl0IHx8ICFhZGotPmNpcmN1aXQtPmFyZWEgKSByZXR1cm47ICAgICAKLSAgCi0gIHpsb2dfaW5mbyAoIklTSVMtRXZ0ICglcykgQWRqYWNlbmN5IFN0YXRlIGNoYW5nZSIsIAotCSAgICAgYWRqLT5jaXJjdWl0LT5hcmVhLT5hcmVhX3RhZyApOwotICAKKworICAvKiBpbnZhbGlkIGFyZ3VtZW50cyAqLworICBpZiAoIWFkaiB8fCAhYWRqLT5jaXJjdWl0IHx8ICFhZGotPmNpcmN1aXQtPmFyZWEpCisgICAgcmV0dXJuOworCisgIHpsb2dfaW5mbyAoIklTSVMtRXZ0ICglcykgQWRqYWNlbmN5IFN0YXRlIGNoYW5nZSIsCisJICAgICBhZGotPmNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnKTsKKwogICAvKiBMU1AgZ2VuZXJhdGlvbiBhZ2FpbiAqLwogICBsc3BfcmVnZW5lcmF0ZV9zY2hlZHVsZSAoYWRqLT5jaXJjdWl0LT5hcmVhKTsKIApAQCAtMjk0LDI3ICszMDksMjYgQEAKIGlzaXNfZXZlbnRfZGlzX3N0YXR1c19jaGFuZ2UgKHN0cnVjdCB0aHJlYWQgKnRocmVhZCkKIHsKICAgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdDsKLSAgCisKICAgY2lyY3VpdCA9IFRIUkVBRF9BUkcgKHRocmVhZCk7Ci0gIAorCiAgIC8qIGludmFsaWQgYXJndW1lbnRzICovCi0gIGlmICghY2lyY3VpdCB8fCAhY2lyY3VpdC0+YXJlYSkgcmV0dXJuIDA7Ci0gIAorICBpZiAoIWNpcmN1aXQgfHwgIWNpcmN1aXQtPmFyZWEpCisgICAgcmV0dXJuIDA7CisKICAgemxvZ19pbmZvICgiSVNJUy1FdnQgKCVzKSBESVMgc3RhdHVzIGNoYW5nZSIsIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnKTsKIAogICAvKiBMU1AgZ2VuZXJhdGlvbiBhZ2FpbiAqLwogICBsc3BfcmVnZW5lcmF0ZV9zY2hlZHVsZSAoY2lyY3VpdC0+YXJlYSk7Ci0gIAorCiAgIHJldHVybiAwOwogfQogCi0KLXZvaWQgCi1pc2lzX2V2ZW50X2F1dGhfZmFpbHVyZSAoY2hhciAqYXJlYV90YWcsIGNoYXIgKmVycm9yX3N0cmluZywgY2hhciAqc3lzaWQpIAordm9pZAoraXNpc19ldmVudF9hdXRoX2ZhaWx1cmUgKGNoYXIgKmFyZWFfdGFnLCBjaGFyICplcnJvcl9zdHJpbmcsIGNoYXIgKnN5c2lkKQogewogICB6bG9nX2luZm8gKCJJU0lTLUV2dCAoJXMpIEF1dGhlbnRpY2F0aW9uIGZhaWx1cmUgJXMgZnJvbSAlcyIsCiAJICAgICBhcmVhX3RhZywgZXJyb3Jfc3RyaW5nLCBzeXNpZF9wcmludCAoc3lzaWQpKTsKLSAgCisKICAgcmV0dXJuOwogfQotCmRpZmYgLS1naXQgYS9pc2lzZC9pc2lzX2V2ZW50cy5oIGIvaXNpc2QvaXNpc19ldmVudHMuaAppbmRleCA3NWRkOTJlLi5hNmVjMmU4IDEwMDY0NAotLS0gYS9pc2lzZC9pc2lzX2V2ZW50cy5oCisrKyBiL2lzaXNkL2lzaXNfZXZlbnRzLmgKQEAgLTMxLDE0ICszMSwxNSBAQAogLyoKICAqIEV2ZW50cyByZWxhdGVkIHRvIGNpcmN1aXQKICAqLwotdm9pZCBpc2lzX2V2ZW50X2NpcmN1aXRfc3RhdGVfY2hhbmdlIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LCBpbnQgc3RhdGUpOwotdm9pZCBpc2lzX2V2ZW50X2NpcmN1aXRfdHlwZV9jaGFuZ2UgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXd0eXBlKTsKK3ZvaWQgaXNpc19ldmVudF9jaXJjdWl0X3N0YXRlX2NoYW5nZSAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwKKwkJCQkgICAgICBpbnQgc3RhdGUpOwordm9pZCBpc2lzX2V2ZW50X2NpcmN1aXRfdHlwZV9jaGFuZ2UgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsCisJCQkJICAgICBpbnQgbmV3dHlwZSk7CiAvKgogICogRXZlbnRzIHJlbGF0ZWQgdG8gYWRqYWNlbmNpZXMKICAqLwotdm9pZCBpc2lzX2V2ZW50X2FkamFjZW5jeV9zdGF0ZV9jaGFuZ2Uoc3RydWN0IGlzaXNfYWRqYWNlbmN5ICphZGosIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld3N0YXRlKTsKK3ZvaWQgaXNpc19ldmVudF9hZGphY2VuY3lfc3RhdGVfY2hhbmdlIChzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKmFkaiwKKwkJCQkJaW50IG5ld3N0YXRlKTsKIAogaW50IGlzaXNfZXZlbnRfZGlzX3N0YXR1c19jaGFuZ2UgKHN0cnVjdCB0aHJlYWQgKnRocmVhZCk7CiAKQEAgLTQ4LDcgKzQ5LDcgQEAKICNkZWZpbmUgQVVUSF9FUlJPUl9UWVBFX0xTUCAgIDMKICNkZWZpbmUgQVVUSF9FUlJPUl9UWVBFX1NOUCAgIDIKICNkZWZpbmUgQVVUSF9FUlJPUl9UWVBFX0hFTExPIDEKLXZvaWQgaXNpc19ldmVudF9hdXRoX2ZhaWx1cmUgKGNoYXIgKmFyZWFfdGFnLCBjaGFyICplcnJvcl9zdHJpbmcsIGNoYXIgKnN5c2lkKTsKK3ZvaWQgaXNpc19ldmVudF9hdXRoX2ZhaWx1cmUgKGNoYXIgKmFyZWFfdGFnLCBjaGFyICplcnJvcl9zdHJpbmcsCisJCQkgICAgICBjaGFyICpzeXNpZCk7CiAKICNlbmRpZiAvKiBfWkVCUkFfSVNJU19FVkVOVFNfSCAqLwotCmRpZmYgLS1naXQgYS9pc2lzZC9pc2lzX2ZsYWdzLmMgYi9pc2lzZC9pc2lzX2ZsYWdzLmMKaW5kZXggNzE2YmVlMC4uMGVmMDQ4ZSAxMDA2NDQKLS0tIGEvaXNpc2QvaXNpc19mbGFncy5jCisrKyBiL2lzaXNkL2lzaXNfZmxhZ3MuYwpAQCAtMjEsNyArMjEsNiBAQAogICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCiAgKi8KIAotCiAjaW5jbHVkZSA8emVicmEuaD4KICNpbmNsdWRlICJsb2cuaCIKICNpbmNsdWRlICJsaW5rbGlzdC5oIgpAQCAtMzEsNDEgKzMwLDQ0IEBACiAjaW5jbHVkZSAiaXNpc2QvaXNpc19mbGFncy5oIgogCiBpbnQKLWZsYWdzX2dldF9pbmRleCAoc3RydWN0IGZsYWdzICpmbGFncykgCitmbGFnc19nZXRfaW5kZXggKHN0cnVjdCBmbGFncyAqZmxhZ3MpCiB7CiAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKICAgaW50IGluZGV4OwogCi0gIGlmIChmbGFncy0+ZnJlZV9pZGNzID09IE5VTEwgfHwgZmxhZ3MtPmZyZWVfaWRjcy0+Y291bnQgPT0gMCkgewotICAgIGZsYWdzLT5tYXhpbmRleCsrOwotICAgIGluZGV4ID0gZmxhZ3MtPm1heGluZGV4OwotICB9IGVsc2UgewotICAgIG5vZGUgPSBsaXN0aGVhZCAoZmxhZ3MtPmZyZWVfaWRjcyk7Ci0gICAgaW5kZXggPSAoaW50KSBnZXRkYXRhIChub2RlKTsKLSAgICBsaXN0bm9kZV9kZWxldGUgKGZsYWdzLT5mcmVlX2lkY3MsICh2b2lkICopaW5kZXgpOwotICB9Ci0gIAorICBpZiAoZmxhZ3MtPmZyZWVfaWRjcyA9PSBOVUxMIHx8IGZsYWdzLT5mcmVlX2lkY3MtPmNvdW50ID09IDApCisgICAgeworICAgICAgZmxhZ3MtPm1heGluZGV4Kys7CisgICAgICBpbmRleCA9IGZsYWdzLT5tYXhpbmRleDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBub2RlID0gbGlzdGhlYWQgKGZsYWdzLT5mcmVlX2lkY3MpOworICAgICAgaW5kZXggPSAoaW50KSBnZXRkYXRhIChub2RlKTsKKyAgICAgIGxpc3Rub2RlX2RlbGV0ZSAoZmxhZ3MtPmZyZWVfaWRjcywgKHZvaWQgKikgaW5kZXgpOworICAgIH0KKwogICByZXR1cm4gaW5kZXg7CiB9CiAKLXZvaWQgCi1mbGFnc19mcmVlX2luZGV4IChzdHJ1Y3QgZmxhZ3MgKmZsYWdzLCBpbnQgaW5kZXgpIAordm9pZAorZmxhZ3NfZnJlZV9pbmRleCAoc3RydWN0IGZsYWdzICpmbGFncywgaW50IGluZGV4KQogewotICBpZiAoZmxhZ3MtPmZyZWVfaWRjcyA9PSBOVUxMKSB7Ci0gICAgZmxhZ3MtPmZyZWVfaWRjcyA9IGxpc3RfbmV3ICgpOwotICB9Ci0gIAotICBsaXN0bm9kZV9hZGQgKGZsYWdzLT5mcmVlX2lkY3MsICh2b2lkICopaW5kZXgpOwotICAKKyAgaWYgKGZsYWdzLT5mcmVlX2lkY3MgPT0gTlVMTCkKKyAgICB7CisgICAgICBmbGFncy0+ZnJlZV9pZGNzID0gbGlzdF9uZXcgKCk7CisgICAgfQorCisgIGxpc3Rub2RlX2FkZCAoZmxhZ3MtPmZyZWVfaWRjcywgKHZvaWQgKikgaW5kZXgpOworCiAgIHJldHVybjsKIH0KIAotaW50ICAKLWZsYWdzX2FueV9zZXQgKHVfaW50MzJfdCAqZmxhZ3MpCitpbnQKK2ZsYWdzX2FueV9zZXQgKHVfaW50MzJfdCAqIGZsYWdzKQogeworICB1X2ludDMyX3QgemVyb1tJU0lTX01BWF9DSVJDVUlUU107CisgIG1lbXNldCAoemVybywgMHgwMCwgSVNJU19NQVhfQ0lSQ1VJVFMgKiA0KTsKIAotICB1X2ludDMyX3QgemVyb1tJU0lTX01BWF9DSVJDVUlUU107IAotICBtZW1zZXQgKHplcm8sIDB4MDAsIElTSVNfTUFYX0NJUkNVSVRTKjQpOyAKLQotICByZXR1cm4gYmNtcChmbGFncywgemVybywgSVNJU19NQVhfQ0lSQ1VJVFMqNCk7CisgIHJldHVybiBiY21wIChmbGFncywgemVybywgSVNJU19NQVhfQ0lSQ1VJVFMgKiA0KTsKIH0KZGlmZiAtLWdpdCBhL2lzaXNkL2lzaXNfZmxhZ3MuaCBiL2lzaXNkL2lzaXNfZmxhZ3MuaAppbmRleCA2NmI5NDg0Li5mMjQyMWYyIDEwMDY0NAotLS0gYS9pc2lzZC9pc2lzX2ZsYWdzLmgKKysrIGIvaXNpc2QvaXNpc19mbGFncy5oCkBAIC0yNiwxMyArMjYsMTMgQEAKIAogLyogVGhlIGdyYW5kIHBsYW4gaXMgdG8gc3VwcG9ydCAxMDI0IGNpcmN1aXRzIHNvIHdlIGhhdmUgMzIqMzIgYml0IGZsYWdzCiAgKiB0aGUgc3VwcG9ydCB3aWxsIGJlIGFjaGl2ZWQgdXNpbmcgdGhlIG5ld2VzdCBkcmFmdHMgKi8KLSNkZWZpbmUgSVNJU19NQVhfQ0lSQ1VJVFMgMzIgLyogPSAxMDI0ICovIC8qRklYTUU6ZGVmaW5lZCBpbiBsc3AuaCBhcyB3ZWxsKi8KKyNkZWZpbmUgSVNJU19NQVhfQ0lSQ1VJVFMgMzIgLyogPSAxMDI0ICovCS8qRklYTUU6ZGVmaW5lZCBpbiBsc3AuaCBhcyB3ZWxsICovCiAKLXN0cnVjdCBmbGFncyAqbmV3X2ZsYWdzICAgICAgICAoaW50IHNpemUpOwotaW50ICAgICAgICAgICBmbGFnc19nZXRfaW5kZXggIChzdHJ1Y3QgZmxhZ3MgKmZsYWdzKTsKLXZvaWQgICAgICAgICAgZmxhZ3NfZnJlZV9pbmRleCAoc3RydWN0IGZsYWdzICpmbGFncywgaW50IGluZGV4KTsKK3N0cnVjdCBmbGFncyAqbmV3X2ZsYWdzIChpbnQgc2l6ZSk7CitpbnQgZmxhZ3NfZ2V0X2luZGV4IChzdHJ1Y3QgZmxhZ3MgKmZsYWdzKTsKK3ZvaWQgZmxhZ3NfZnJlZV9pbmRleCAoc3RydWN0IGZsYWdzICpmbGFncywgaW50IGluZGV4KTsKIAotaW50ICBmbGFnc19hbnlfc2V0ICh1X2ludDMyX3QgKmZsYWdzKTsKK2ludCBmbGFnc19hbnlfc2V0ICh1X2ludDMyX3QgKiBmbGFncyk7CiAKICNkZWZpbmUgSVNJU19TRVRfRkxBRyhGLEMpIFwKICAgICAgICAgRltDLT5pZHg+PjVdIHw9ICgxPDwoQy0+aWR4ICYgMHgxRikpOwpAQCAtNTAsOSArNTAsMyBAQAogICAgICAgICBtZW1zZXQoRkxBR1MsMHgwMCxJU0lTX01BWF9DSVJDVUlUUyo0KTsKIAogI2VuZGlmIC8qIF9aRUJSQV9JU0lTX0ZMQUdTX0ggKi8KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2lzaXNkL2lzaXNfbHNwLmMgYi9pc2lzZC9pc2lzX2xzcC5jCmluZGV4IGEyOWJhODAuLjIxNGI0MzggMTAwNjQ0Ci0tLSBhL2lzaXNkL2lzaXNfbHNwLmMKKysrIGIvaXNpc2QvaXNpc19sc3AuYwpAQCAtNTUsNDYgKzU1LDQ3IEBACiAjaW5jbHVkZSAic3BncmlkLmgiCiAjZW5kaWYKIAotI2RlZmluZSBMU1BfTUVNT1JZX1BSRUFTU0lHTiAKKyNkZWZpbmUgTFNQX01FTU9SWV9QUkVBU1NJR04KIAogZXh0ZXJuIHN0cnVjdCBpc2lzICppc2lzOwogZXh0ZXJuIHN0cnVjdCB0aHJlYWRfbWFzdGVyICptYXN0ZXI7CiAKLWludCAKLWxzcF9pZF9jbXAgKHVfY2hhciAqaWQxLCB1X2NoYXIgKmlkMikKLXsgIAoraW50Citsc3BfaWRfY21wICh1X2NoYXIgKiBpZDEsIHVfY2hhciAqIGlkMikKK3sKICAgcmV0dXJuIG1lbWNtcCAoaWQxLCBpZDIsIElTSVNfU1lTX0lEX0xFTiArIDIpOwogfQogCiBkaWN0X3QgKgotbHNwX2RiX2luaXQgKHZvaWQpIAorbHNwX2RiX2luaXQgKHZvaWQpCiB7CiAgIGRpY3RfdCAqZGljdDsKLSAgCi0gIGRpY3QgPSBkaWN0X2NyZWF0ZSAoRElDVENPVU5UX1RfTUFYLCAoZGljdF9jb21wX3QpbHNwX2lkX2NtcCk7Ci0gIAorCisgIGRpY3QgPSBkaWN0X2NyZWF0ZSAoRElDVENPVU5UX1RfTUFYLCAoZGljdF9jb21wX3QpIGxzcF9pZF9jbXApOworCiAgIHJldHVybiBkaWN0OwogfQogCiBzdHJ1Y3QgaXNpc19sc3AgKgotbHNwX3NlYXJjaCAodV9jaGFyICppZCwgZGljdF90ICpsc3BkYikKK2xzcF9zZWFyY2ggKHVfY2hhciAqIGlkLCBkaWN0X3QgKiBsc3BkYikKIHsKICAgZG5vZGVfdCAqbm9kZTsKIAotI2lmZGVmIEVYVFJFTUVfREVCVUcgCisjaWZkZWYgRVhUUkVNRV9ERUJVRwogICBkbm9kZV90ICpkbjsKIAotICB6bG9nX3dhcm4oInNlYXJjaGluZyBkYiIpOwotICBmb3IgKGRuID0gZGljdF9maXJzdChsc3BkYik7IGRuOyBkbiA9IGRpY3RfbmV4dChsc3BkYiwgZG4pKSB7Ci0gICAgemxvZ193YXJuKCIlc1x0JXBYIiwgcmF3bHNwaWRfcHJpbnQoKGNoYXIgKikgZG5vZGVfZ2V0a2V5KGRuKSksIAotICAgICAgICAgICAgICBkbm9kZV9nZXQoZG4pKTsKLSAgfQorICB6bG9nX3dhcm4gKCJzZWFyY2hpbmcgZGIiKTsKKyAgZm9yIChkbiA9IGRpY3RfZmlyc3QgKGxzcGRiKTsgZG47IGRuID0gZGljdF9uZXh0IChsc3BkYiwgZG4pKQorICAgIHsKKyAgICAgIHpsb2dfd2FybiAoIiVzXHQlcFgiLCByYXdsc3BpZF9wcmludCAoKGNoYXIgKikgZG5vZGVfZ2V0a2V5IChkbikpLAorCQkgZG5vZGVfZ2V0IChkbikpOworICAgIH0KICNlbmRpZiAvKiBFWFRSRU1FIERFQlVHICovCiAKICAgbm9kZSA9IGRpY3RfbG9va3VwIChsc3BkYiwgaWQpOwotICAKKwogICBpZiAobm9kZSkKLSAgICByZXR1cm4gKHN0cnVjdCBpc2lzX2xzcCAqKWRub2RlX2dldCAobm9kZSk7CisgICAgcmV0dXJuIChzdHJ1Y3QgaXNpc19sc3AgKikgZG5vZGVfZ2V0IChub2RlKTsKIAogICByZXR1cm4gTlVMTDsKIH0KQEAgLTEwNCwxMyArMTA1LDE0IEBACiB7CiAgIGlmICghbHNwKQogICAgIHJldHVybjsKLSAKLSAgaWYgKGxzcC0+b3duX2xzcCkgewotICAgIGlmIChsc3AtPnRsdl9kYXRhLm5scGlkcykKLSAgICAgIFhGUkVFIChNVFlQRV9JU0lTX1RMViwgbHNwLT50bHZfZGF0YS5ubHBpZHMpOwotICAgIGlmIChsc3AtPnRsdl9kYXRhLmhvc3RuYW1lKQotICAgICAgWEZSRUUgKE1UWVBFX0lTSVNfVExWLCBsc3AtPnRsdl9kYXRhLmhvc3RuYW1lKTsKLSAgfQorCisgIGlmIChsc3AtPm93bl9sc3ApCisgICAgeworICAgICAgaWYgKGxzcC0+dGx2X2RhdGEubmxwaWRzKQorCVhGUkVFIChNVFlQRV9JU0lTX1RMViwgbHNwLT50bHZfZGF0YS5ubHBpZHMpOworICAgICAgaWYgKGxzcC0+dGx2X2RhdGEuaG9zdG5hbWUpCisJWEZSRUUgKE1UWVBFX0lTSVNfVExWLCBsc3AtPnRsdl9kYXRhLmhvc3RuYW1lKTsKKyAgICB9CiAgIGlmIChsc3AtPnRsdl9kYXRhLmlzX25laWdocykKICAgICBsaXN0X2RlbGV0ZSAobHNwLT50bHZfZGF0YS5pc19uZWlnaHMpOwogICBpZiAobHNwLT50bHZfZGF0YS5hcmVhX2FkZHJzKQpAQCAtMTQwLDM1ICsxNDIsMzcgQEAKIHsKICAgaWYgKCFsc3ApCiAgICAgcmV0dXJuOwotICAKKwogICBsc3BfY2xlYXJfZGF0YSAobHNwKTsKLSAgCi0gIGlmIChMU1BfRlJBR01FTlQgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkKSA9PSAwICYmIGxzcC0+bHNwdS5mcmFncykgeworCisgIGlmIChMU1BfRlJBR01FTlQgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkKSA9PSAwICYmIGxzcC0+bHNwdS5mcmFncykKKyAgICB7CiAgICAgICBsaXN0X2RlbGV0ZSAobHNwLT5sc3B1LmZyYWdzKTsKLSAgfQotICAKKyAgICB9CisKICAgaWYgKGxzcC0+cGR1KQogICAgIHN0cmVhbV9mcmVlIChsc3AtPnBkdSk7CiAgIFhGUkVFIChNVFlQRV9JU0lTX0xTUCwgbHNwKTsKIH0KIAotdm9pZCAKLWxzcF9kYl9kZXN0cm95IChkaWN0X3QgKmxzcGRiKQordm9pZAorbHNwX2RiX2Rlc3Ryb3kgKGRpY3RfdCAqIGxzcGRiKQogewogICBkbm9kZV90ICpkbm9kZSwgKm5leHQ7CiAgIHN0cnVjdCBpc2lzX2xzcCAqbHNwOwotICAKKwogICBkbm9kZSA9IGRpY3RfZmlyc3QgKGxzcGRiKTsKLSAgd2hpbGUgKGRub2RlKSB7Ci0gICAgbmV4dCA9IGRpY3RfbmV4dCAobHNwZGIsIGRub2RlKTsKLSAgICBsc3AgPSBkbm9kZV9nZXQgKGRub2RlKTsKLSAgICBsc3BfZGVzdHJveSAobHNwKTsKLSAgICBkaWN0X2RlbGV0ZV9mcmVlIChsc3BkYiwgZG5vZGUpOwotICAgIGRub2RlID0gbmV4dDsKLSAgfQotICAKKyAgd2hpbGUgKGRub2RlKQorICAgIHsKKyAgICAgIG5leHQgPSBkaWN0X25leHQgKGxzcGRiLCBkbm9kZSk7CisgICAgICBsc3AgPSBkbm9kZV9nZXQgKGRub2RlKTsKKyAgICAgIGxzcF9kZXN0cm95IChsc3ApOworICAgICAgZGljdF9kZWxldGVfZnJlZSAobHNwZGIsIGRub2RlKTsKKyAgICAgIGRub2RlID0gbmV4dDsKKyAgICB9CisKICAgZGljdF9mcmVlIChsc3BkYik7Ci0gIAorCiAgIHJldHVybjsKIH0KIApAQCAtMTc2LDEzMyArMTgwLDEzNiBAQAogICogUmVtb3ZlIGFsbCB0aGUgZnJhZ3MgYmVsb25naW5nIHRvIHRoZSBnaXZlbiBsc3AKICAqLwogdm9pZAotbHNwX3JlbW92ZV9mcmFncyAoc3RydWN0IGxpc3QgKmZyYWdzLCBkaWN0X3QgKmxzcGRiKQorbHNwX3JlbW92ZV9mcmFncyAoc3RydWN0IGxpc3QgKmZyYWdzLCBkaWN0X3QgKiBsc3BkYikKIHsKICAgZG5vZGVfdCAqZG5vZGU7CiAgIHN0cnVjdCBsaXN0bm9kZSAqbG5vZGU7CiAgIHN0cnVjdCBpc2lzX2xzcCAqbHNwOwogCi0gIGZvciAobG5vZGUgPSBsaXN0aGVhZCAoZnJhZ3MpOyBsbm9kZTsgbmV4dG5vZGUgKGxub2RlKSkgewotICAgIGxzcCA9IGdldGRhdGEgKGxub2RlKTsKLSAgICBkbm9kZSA9IGRpY3RfbG9va3VwIChsc3BkYiwgbHNwLT5sc3BfaGVhZGVyLT5sc3BfaWQpOwotICAgIGxzcF9kZXN0cm95IChsc3ApOwotICAgIGRub2RlX2Rlc3Ryb3kgKGRpY3RfZGVsZXRlKGxzcGRiLCBkbm9kZSkpOwotICB9Ci0gIAorICBmb3IgKGxub2RlID0gbGlzdGhlYWQgKGZyYWdzKTsgbG5vZGU7IG5leHRub2RlIChsbm9kZSkpCisgICAgeworICAgICAgbHNwID0gZ2V0ZGF0YSAobG5vZGUpOworICAgICAgZG5vZGUgPSBkaWN0X2xvb2t1cCAobHNwZGIsIGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkKTsKKyAgICAgIGxzcF9kZXN0cm95IChsc3ApOworICAgICAgZG5vZGVfZGVzdHJveSAoZGljdF9kZWxldGUgKGxzcGRiLCBkbm9kZSkpOworICAgIH0KKwogICBsaXN0X2RlbGV0ZV9hbGxfbm9kZSAoZnJhZ3MpOwotICAKKwogICByZXR1cm47CiB9CiAKIHZvaWQKLWxzcF9zZWFyY2hfYW5kX2Rlc3Ryb3kgKHVfY2hhciAqaWQsIGRpY3RfdCAqbHNwZGIpCitsc3Bfc2VhcmNoX2FuZF9kZXN0cm95ICh1X2NoYXIgKiBpZCwgZGljdF90ICogbHNwZGIpCiB7CiAgIGRub2RlX3QgKm5vZGU7CiAgIHN0cnVjdCBpc2lzX2xzcCAqbHNwOwogCiAgIG5vZGUgPSBkaWN0X2xvb2t1cCAobHNwZGIsIGlkKTsKLSAgaWYgKG5vZGUpIHsKLSAgICBub2RlID0gZGljdF9kZWxldGUgKGxzcGRiLCBub2RlKTsKLSAgICBsc3AgPSBkbm9kZV9nZXQgKG5vZGUpOwotICAgIC8qCi0gICAgICogSWYgdGhpcyBpcyBhIHplcm8gbHNwLCByZW1vdmUgYWxsIHRoZSBmcmFncyBub3cgCi0gICAgICovCi0gICAgaWYgKExTUF9GUkFHTUVOVChsc3AtPmxzcF9oZWFkZXItPmxzcF9pZCkgPT0gMCkgewotICAgICAgaWYgKGxzcC0+bHNwdS5mcmFncykKLSAgICAgICAgbHNwX3JlbW92ZV9mcmFncyAobHNwLT5sc3B1LmZyYWdzLCBsc3BkYik7Ci0gICAgfSBlbHNlIHsKLSAgICAvKiAKLSAgICAgKiBlbHNlIGp1c3QgcmVtb3ZlIHRoaXMgZnJhZywgZnJvbSB0aGUgemVybyBsc3BzJyBmcmFnIGxpc3QKLSAgICAgKi8KLSAgICAgIGlmIChsc3AtPmxzcHUuemVyb19sc3AgJiYgbHNwLT5sc3B1Lnplcm9fbHNwLT5sc3B1LmZyYWdzKQotICAgICAgICBsaXN0bm9kZV9kZWxldGUgKGxzcC0+bHNwdS56ZXJvX2xzcC0+bHNwdS5mcmFncywgbHNwKTsKKyAgaWYgKG5vZGUpCisgICAgeworICAgICAgbm9kZSA9IGRpY3RfZGVsZXRlIChsc3BkYiwgbm9kZSk7CisgICAgICBsc3AgPSBkbm9kZV9nZXQgKG5vZGUpOworICAgICAgLyoKKyAgICAgICAqIElmIHRoaXMgaXMgYSB6ZXJvIGxzcCwgcmVtb3ZlIGFsbCB0aGUgZnJhZ3Mgbm93IAorICAgICAgICovCisgICAgICBpZiAoTFNQX0ZSQUdNRU5UIChsc3AtPmxzcF9oZWFkZXItPmxzcF9pZCkgPT0gMCkKKwl7CisJICBpZiAobHNwLT5sc3B1LmZyYWdzKQorCSAgICBsc3BfcmVtb3ZlX2ZyYWdzIChsc3AtPmxzcHUuZnJhZ3MsIGxzcGRiKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogCisJICAgKiBlbHNlIGp1c3QgcmVtb3ZlIHRoaXMgZnJhZywgZnJvbSB0aGUgemVybyBsc3BzJyBmcmFnIGxpc3QKKwkgICAqLworCSAgaWYgKGxzcC0+bHNwdS56ZXJvX2xzcCAmJiBsc3AtPmxzcHUuemVyb19sc3AtPmxzcHUuZnJhZ3MpCisJICAgIGxpc3Rub2RlX2RlbGV0ZSAobHNwLT5sc3B1Lnplcm9fbHNwLT5sc3B1LmZyYWdzLCBsc3ApOworCX0KKyAgICAgIGxzcF9kZXN0cm95IChsc3ApOworICAgICAgZG5vZGVfZGVzdHJveSAobm9kZSk7CiAgICAgfQotICAgIGxzcF9kZXN0cm95IChsc3ApOwotICAgIGRub2RlX2Rlc3Ryb3kgKG5vZGUpOwotICB9CiB9CiAKIC8qCiAgKiBDb21wYXJlcyBhIExTUCB0byBnaXZlbiB2YWx1ZXMKICAqIFBhcmFtcyBhcmUgZ2l2ZW4gaW4gbmV0IG9yZGVyCiAgKi8KLWludCAKLWxzcF9jb21wYXJlIChjaGFyICphcmVhdGFnLCBzdHJ1Y3QgaXNpc19sc3AgKmxzcCwgdV9pbnQzMl90IHNlcV9udW0sIAoraW50Citsc3BfY29tcGFyZSAoY2hhciAqYXJlYXRhZywgc3RydWN0IGlzaXNfbHNwICpsc3AsIHVfaW50MzJfdCBzZXFfbnVtLAogCSAgICAgdV9pbnQxNl90IGNoZWNrc3VtLCB1X2ludDE2X3QgcmVtX2xpZmV0aW1lKQogewotICAgICAgLyogbm8gcG9pbnQgaW4gZG91YmxlIG50b2hsIG9uIHNlcW51bSAqLwotICBpZiAobHNwLT5sc3BfaGVhZGVyLT5zZXFfbnVtID09IHNlcV9udW0gJiYgCisgIC8qIG5vIHBvaW50IGluIGRvdWJsZSBudG9obCBvbiBzZXFudW0gKi8KKyAgaWYgKGxzcC0+bHNwX2hlYWRlci0+c2VxX251bSA9PSBzZXFfbnVtICYmCiAgICAgICBsc3AtPmxzcF9oZWFkZXItPmNoZWNrc3VtID09IGNoZWNrc3VtICYmCiAgICAgICAvKmNvbXBhcmluZyB3aXRoIDAsIG5vIG5lZWQgdG8gZG8gbnRvaGwgKi8KICAgICAgICgobHNwLT5sc3BfaGVhZGVyLT5yZW1fbGlmZXRpbWUgPT0gMCAmJiByZW1fbGlmZXRpbWUgPT0gMCkgfHwKLSAgICAgICAobHNwLT5sc3BfaGVhZGVyLT5yZW1fbGlmZXRpbWUgIT0gMCAmJiByZW1fbGlmZXRpbWUgIT0gMCkpKSB7IAotICAgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19TTlBfUEFDS0VUUykgewotICAgICAgemxvZ19pbmZvICgiSVNJUy1TbnAgKCVzKTogTFNQICVzIHNlcSAweCUwOHgsIGNrc3VtIDB4JTA0eCwiCi0gICAgICAgICAgICAgICAgICIgbGlmZXRpbWUgJXVzIiwKLSAgICAgICAgICAgICAgICAgYXJlYXRhZywKLSAgICAgICAgICAgICAgICAgcmF3bHNwaWRfcHJpbnQgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkKSwKLSAgICAgICAgICAgICAgICAgbnRvaGwobHNwLT5sc3BfaGVhZGVyLT5zZXFfbnVtKSwKLSAgICAgICAgICAgICAgICAgbnRvaHMobHNwLT5sc3BfaGVhZGVyLT5jaGVja3N1bSksCi0gICAgICAgICAgICAgICAgIG50b2hzKGxzcC0+bHNwX2hlYWRlci0+cmVtX2xpZmV0aW1lKSApOwotICAgICAgemxvZ19pbmZvICgiSVNJUy1TbnAgKCVzKTogICAgICAgICBpcyBlcXVhbCB0byBvdXJzIHNlcSAweCUwOHgsIgotICAgICAgICAgICAgICAgICAiIGNrc3VtIDB4JTA0eCwgbGlmZXRpbWUgJXVzIiwKLSAgICAgICAgICAgICAgICAgYXJlYXRhZywKLSAgICAgICAgICAgICAgICAgbnRvaGwoc2VxX251bSksCi0gICAgICAgICAgICAgICAgIG50b2hzKGNoZWNrc3VtKSwKLSAgICAgICAgICAgICAgICAgbnRvaHMocmVtX2xpZmV0aW1lKSk7CisgICAgICAgKGxzcC0+bHNwX2hlYWRlci0+cmVtX2xpZmV0aW1lICE9IDAgJiYgcmVtX2xpZmV0aW1lICE9IDApKSkKKyAgICB7CisgICAgICBpZiAoaXNpcy0+ZGVidWdzICYgREVCVUdfU05QX1BBQ0tFVFMpCisJeworCSAgemxvZ19pbmZvICgiSVNJUy1TbnAgKCVzKTogTFNQICVzIHNlcSAweCUwOHgsIGNrc3VtIDB4JTA0eCwiCisJCSAgICAgIiBsaWZldGltZSAldXMiLAorCQkgICAgIGFyZWF0YWcsCisJCSAgICAgcmF3bHNwaWRfcHJpbnQgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkKSwKKwkJICAgICBudG9obCAobHNwLT5sc3BfaGVhZGVyLT5zZXFfbnVtKSwKKwkJICAgICBudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5jaGVja3N1bSksCisJCSAgICAgbnRvaHMgKGxzcC0+bHNwX2hlYWRlci0+cmVtX2xpZmV0aW1lKSk7CisJICB6bG9nX2luZm8gKCJJU0lTLVNucCAoJXMpOiAgICAgICAgIGlzIGVxdWFsIHRvIG91cnMgc2VxIDB4JTA4eCwiCisJCSAgICAgIiBja3N1bSAweCUwNHgsIGxpZmV0aW1lICV1cyIsCisJCSAgICAgYXJlYXRhZywKKwkJICAgICBudG9obCAoc2VxX251bSksIG50b2hzIChjaGVja3N1bSksIG50b2hzIChyZW1fbGlmZXRpbWUpKTsKKwl9CisgICAgICByZXR1cm4gTFNQX0VRVUFMOwogICAgIH0KLSAgICByZXR1cm4gTFNQX0VRVUFMOwotICB9CiAKLSAgaWYgKG50b2hsKHNlcV9udW0pID49IG50b2hsKGxzcC0+bHNwX2hlYWRlci0+c2VxX251bSkpIHsKLSAgICBpZiAoaXNpcy0+ZGVidWdzICYgREVCVUdfU05QX1BBQ0tFVFMpIHsKLSAgICAgIHpsb2dfaW5mbyAoIklTSVMtU25wICglcyk6IExTUCAlcyBzZXEgMHglMDh4LCBja3N1bSAweCUwNHgsIgotICAgICAgICAgICAgICAgICAiIGxpZmV0aW1lICV1cyIsCi0gICAgICAgICAgICAgICAgIGFyZWF0YWcsCi0gICAgICAgICAgICAgICAgIHJhd2xzcGlkX3ByaW50IChsc3AtPmxzcF9oZWFkZXItPmxzcF9pZCksCi0gICAgICAgICAgICAgICAgIG50b2hsKHNlcV9udW0pLAotICAgICAgICAgICAgICAgICBudG9ocyhjaGVja3N1bSksCi0gICAgICAgICAgICAgICAgIG50b2hzKHJlbV9saWZldGltZSApKTsKLSAgICAgIHpsb2dfaW5mbyAoIklTSVMtU25wICglcyk6ICAgICAgIGlzIG5ld2VyIHRoYW4gb3VycyBzZXEgMHglMDh4LCAiCi0gICAgICAgICAgICAgICAgICJja3N1bSAweCUwNHgsIGxpZmV0aW1lICV1cyIsCi0gICAgICAgICAgICAgICAgIGFyZWF0YWcsCi0gICAgICAgICAgICAgICAgIG50b2hsKGxzcC0+bHNwX2hlYWRlci0+c2VxX251bSksCi0gICAgICAgICAgICAgICAgIG50b2hzKGxzcC0+bHNwX2hlYWRlci0+Y2hlY2tzdW0pLAotICAgICAgICAgICAgICAgICBudG9ocyhsc3AtPmxzcF9oZWFkZXItPnJlbV9saWZldGltZSkgKTsKKyAgaWYgKG50b2hsIChzZXFfbnVtKSA+PSBudG9obCAobHNwLT5sc3BfaGVhZGVyLT5zZXFfbnVtKSkKKyAgICB7CisgICAgICBpZiAoaXNpcy0+ZGVidWdzICYgREVCVUdfU05QX1BBQ0tFVFMpCisJeworCSAgemxvZ19pbmZvICgiSVNJUy1TbnAgKCVzKTogTFNQICVzIHNlcSAweCUwOHgsIGNrc3VtIDB4JTA0eCwiCisJCSAgICAgIiBsaWZldGltZSAldXMiLAorCQkgICAgIGFyZWF0YWcsCisJCSAgICAgcmF3bHNwaWRfcHJpbnQgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkKSwKKwkJICAgICBudG9obCAoc2VxX251bSksIG50b2hzIChjaGVja3N1bSksIG50b2hzIChyZW1fbGlmZXRpbWUpKTsKKwkgIHpsb2dfaW5mbyAoIklTSVMtU25wICglcyk6ICAgICAgIGlzIG5ld2VyIHRoYW4gb3VycyBzZXEgMHglMDh4LCAiCisJCSAgICAgImNrc3VtIDB4JTA0eCwgbGlmZXRpbWUgJXVzIiwKKwkJICAgICBhcmVhdGFnLAorCQkgICAgIG50b2hsIChsc3AtPmxzcF9oZWFkZXItPnNlcV9udW0pLAorCQkgICAgIG50b2hzIChsc3AtPmxzcF9oZWFkZXItPmNoZWNrc3VtKSwKKwkJICAgICBudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5yZW1fbGlmZXRpbWUpKTsKKwl9CisgICAgICByZXR1cm4gTFNQX05FV0VSOwogICAgIH0KLSAgICByZXR1cm4gTFNQX05FV0VSOwotICB9Ci0gIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19TTlBfUEFDS0VUUykgewotICAgIHpsb2dfaW5mbyAoIklTSVMtU25wICglcyk6IExTUCAlcyBzZXEgMHglMDh4LCBja3N1bSAweCUwNHgsIGxpZmV0aW1lICV1cyIsCi0JICAgICAgIGFyZWF0YWcsCi0JICAgICAgIHJhd2xzcGlkX3ByaW50IChsc3AtPmxzcF9oZWFkZXItPmxzcF9pZCksCi0JICAgICAgIG50b2hsKHNlcV9udW0pLAotCSAgICAgICBudG9ocyhjaGVja3N1bSksCi0JICAgICAgIG50b2hzKHJlbV9saWZldGltZSApKTsKLSAgICB6bG9nX2luZm8gKCJJU0lTLVNucCAoJXMpOiAgICAgICBpcyBvbGRlciB0aGFuIG91cnMgc2VxIDB4JTA4eCwiCi0gICAgICAgICAgICAgICAiIGNrc3VtIDB4JTA0eCwgbGlmZXRpbWUgJXVzIiwKLQkgICAgICAgYXJlYXRhZywKLQkgICAgICAgbnRvaGwobHNwLT5sc3BfaGVhZGVyLT5zZXFfbnVtKSwKLQkgICAgICAgbnRvaHMobHNwLT5sc3BfaGVhZGVyLT5jaGVja3N1bSksCi0JICAgICAgIG50b2hzKGxzcC0+bHNwX2hlYWRlci0+cmVtX2xpZmV0aW1lKSApOwotICB9CisgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19TTlBfUEFDS0VUUykKKyAgICB7CisgICAgICB6bG9nX2luZm8KKwkoIklTSVMtU25wICglcyk6IExTUCAlcyBzZXEgMHglMDh4LCBja3N1bSAweCUwNHgsIGxpZmV0aW1lICV1cyIsCisJIGFyZWF0YWcsIHJhd2xzcGlkX3ByaW50IChsc3AtPmxzcF9oZWFkZXItPmxzcF9pZCksIG50b2hsIChzZXFfbnVtKSwKKwkgbnRvaHMgKGNoZWNrc3VtKSwgbnRvaHMgKHJlbV9saWZldGltZSkpOworICAgICAgemxvZ19pbmZvICgiSVNJUy1TbnAgKCVzKTogICAgICAgaXMgb2xkZXIgdGhhbiBvdXJzIHNlcSAweCUwOHgsIgorCQkgIiBja3N1bSAweCUwNHgsIGxpZmV0aW1lICV1cyIsIGFyZWF0YWcsCisJCSBudG9obCAobHNwLT5sc3BfaGVhZGVyLT5zZXFfbnVtKSwKKwkJIG50b2hzIChsc3AtPmxzcF9oZWFkZXItPmNoZWNrc3VtKSwKKwkJIG50b2hzIChsc3AtPmxzcF9oZWFkZXItPnJlbV9saWZldGltZSkpOworICAgIH0KIAogICByZXR1cm4gTFNQX09MREVSOwogfQogCi12b2lkIAordm9pZAogbHNwX2luY19zZXFudW0gKHN0cnVjdCBpc2lzX2xzcCAqbHNwLCB1X2ludDMyX3Qgc2VxX251bSkKIHsKICAgdV9pbnQzMl90IG5ld3NlcTsKLSAgCisKICAgaWYgKHNlcV9udW0gPT0gMCB8fCBudG9obCAobHNwLT5sc3BfaGVhZGVyLT5zZXFfbnVtKSA+IHNlcV9udW0pCiAgICAgbmV3c2VxID0gbnRvaGwgKGxzcC0+bHNwX2hlYWRlci0+c2VxX251bSkgKyAxOwogICBlbHNlCi0gICAgbmV3c2VxID0gc2VxX251bSArKzsKLSAgCisgICAgbmV3c2VxID0gc2VxX251bSsrOworCiAgIGxzcC0+bHNwX2hlYWRlci0+c2VxX251bSA9IGh0b25sIChuZXdzZXEpOwotICBpc29fY3N1bV9jcmVhdGUgKFNUUkVBTV9EQVRBIChsc3AtPnBkdSkgKyAxMiwgCi0gICAgICAgICAgICAgICAgICAgbnRvaHMobHNwLT5sc3BfaGVhZGVyLT5wZHVfbGVuKSAtIDEyLCAxMik7CisgIGlzb19jc3VtX2NyZWF0ZSAoU1RSRUFNX0RBVEEgKGxzcC0+cGR1KSArIDEyLAorCQkgICBudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5wZHVfbGVuKSAtIDEyLCAxMik7CiAKICAgcmV0dXJuOwogfQpAQCAtMzE1LDIzICszMjIsMjQgQEAKIHsKICAgc3RydWN0IGlzaXNfbHNwICpsc3A7CiAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKLSAgCisKICAgbHNwX2luY19zZXFudW0gKGxzcDAsIDApOwogCiAgIGlmICghbHNwMC0+bHNwdS5mcmFncykKICAgICByZXR1cm47CiAKLSAgZm9yIChub2RlID0gbGlzdGhlYWQgKGxzcDAtPmxzcHUuZnJhZ3MpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICBsc3AgPSBnZXRkYXRhIChub2RlKTsKLSAgICBsc3BfaW5jX3NlcW51bShsc3AsIDApOwotICB9Ci0gIAorICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAobHNwMC0+bHNwdS5mcmFncyk7IG5vZGU7IG5leHRub2RlIChub2RlKSkKKyAgICB7CisgICAgICBsc3AgPSBnZXRkYXRhIChub2RlKTsKKyAgICAgIGxzcF9pbmNfc2VxbnVtIChsc3AsIDApOworICAgIH0KKwogICByZXR1cm47CiB9CiAKLWludCAKK2ludAogaXNpc19sc3BfYXV0aGluZm9fY2hlY2sgKHN0cnVjdCBzdHJlYW0gKnN0cmVhbSwgc3RydWN0IGlzaXNfYXJlYSAqYXJlYSwKLQkJCSBpbnQgIHBkdWxlbiwgc3RydWN0IGlzaXNfcGFzc3dkICpwYXNzd2QpCisJCQkgaW50IHBkdWxlbiwgc3RydWN0IGlzaXNfcGFzc3dkICpwYXNzd2QpCiB7CiAgIHVpbnQzMl90IGV4cGVjdGVkID0gMCwgZm91bmQ7CiAgIHN0cnVjdCB0bHZzIHRsdnM7CkBAIC0zMzksMjMgKzM0NywyMiBAQAogCiAgIGV4cGVjdGVkIHw9IFRMVkZMQUdfQVVUSF9JTkZPOwogICByZXR2YWwgPSBwYXJzZV90bHZzIChhcmVhLT5hcmVhX3RhZywgc3RyZWFtLT5kYXRhICsKLSAgICAgICAgICAgICAgICAgICAgICAgSVNJU19GSVhFRF9IRFJfTEVOICsgSVNJU19MU1BfSERSX0xFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgcGR1bGVuIC0gSVNJU19GSVhFRF9IRFJfTEVOIAotICAgICAgICAgICAgICAgICAgICAgICAtIElTSVNfTFNQX0hEUl9MRU4sIAotCQkgICAgICAgJmV4cGVjdGVkLCAmZm91bmQsICZ0bHZzKTsKKwkJICAgICAgIElTSVNfRklYRURfSERSX0xFTiArIElTSVNfTFNQX0hEUl9MRU4sCisJCSAgICAgICBwZHVsZW4gLSBJU0lTX0ZJWEVEX0hEUl9MRU4KKwkJICAgICAgIC0gSVNJU19MU1BfSERSX0xFTiwgJmV4cGVjdGVkLCAmZm91bmQsICZ0bHZzKTsKICAgaWYgKHJldHZhbCB8fCAhKGZvdW5kICYgVExWRkxBR19BVVRIX0lORk8pKQotICAgIHJldHVybiAxOyAvKiBBdXRoIGZhaWwgKHBhcnNpbmcgZmFpbGVkIG9yIG5vIGF1dGgtdGx2KSovCisgICAgcmV0dXJuIDE7CQkJLyogQXV0aCBmYWlsIChwYXJzaW5nIGZhaWxlZCBvciBubyBhdXRoLXRsdikgKi8KIAogICByZXR1cm4gYXV0aGVudGljYXRpb25fY2hlY2sgKHBhc3N3ZCwgJnRsdnMuYXV0aF9pbmZvKTsKIH0KIAogdm9pZAotbHNwX3VwZGF0ZV9kYXRhIChzdHJ1Y3QgaXNpc19sc3AgKmxzcCwgc3RydWN0IHN0cmVhbSAqc3RyZWFtLCAKLSAgICAgICAgICAgICAgICAgc3RydWN0IGlzaXNfYXJlYSAqYXJlYSkKK2xzcF91cGRhdGVfZGF0YSAoc3RydWN0IGlzaXNfbHNwICpsc3AsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSwKKwkJIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWEpCiB7Ci0gIHVpbnQzMl90IGV4cGVjdGVkID0gMCxmb3VuZDsKKyAgdWludDMyX3QgZXhwZWN0ZWQgPSAwLCBmb3VuZDsKICAgaW50IHJldHZhbDsKLSAgCisKICAgLyogY29weWluZyBvbmx5IHRoZSByZWxldmFudCBwYXJ0IG9mIG91ciBzdHJlYW0gKi8KICAgbHNwLT5wZHUgPSBzdHJlYW1fbmV3IChzdHJlYW0tPmVuZHApOwogICBsc3AtPnBkdS0+cHV0cCA9IHN0cmVhbS0+cHV0cDsKQEAgLTM2NCwyNyArMzcxLDI4IEBACiAgIG1lbWNweSAobHNwLT5wZHUtPmRhdGEsIHN0cmVhbS0+ZGF0YSwgc3RyZWFtLT5lbmRwKTsKIAogICAvKiBzZXR0aW5nIHBvaW50ZXJzIHRvIHRoZSBjb3JyZWN0IHBsYWNlICovCi0gIGxzcC0+aXNpc19oZWFkZXIgPSAoc3RydWN0IGlzaXNfZml4ZWRfaGRyICopKFNUUkVBTV9EQVRBKGxzcC0+cGR1KSk7Ci0gIGxzcC0+bHNwX2hlYWRlciA9IChzdHJ1Y3QgaXNpc19saW5rX3N0YXRlX2hkciAqKShTVFJFQU1fREFUQShsc3AtPnBkdSkgKyAKLQkJCQkJCSAgIElTSVNfRklYRURfSERSX0xFTik7CisgIGxzcC0+aXNpc19oZWFkZXIgPSAoc3RydWN0IGlzaXNfZml4ZWRfaGRyICopIChTVFJFQU1fREFUQSAobHNwLT5wZHUpKTsKKyAgbHNwLT5sc3BfaGVhZGVyID0gKHN0cnVjdCBpc2lzX2xpbmtfc3RhdGVfaGRyICopIChTVFJFQU1fREFUQSAobHNwLT5wZHUpICsKKwkJCQkJCSAgICBJU0lTX0ZJWEVEX0hEUl9MRU4pOwogICBsc3AtPmFnZV9vdXQgPSBaRVJPX0FHRV9MSUZFVElNRTsKLSAgbHNwLT5pbnN0YWxsZWQgPSB0aW1lKE5VTEwpOworICBsc3AtPmluc3RhbGxlZCA9IHRpbWUgKE5VTEwpOwogICAvKgogICAgKiBHZXQgTFNQIGRhdGEgaS5lLiBUTFZzCiAgICAqLwogICBleHBlY3RlZCB8PSBUTFZGTEFHX0FVVEhfSU5GTzsKICAgZXhwZWN0ZWQgfD0gVExWRkxBR19BUkVBX0FERFJTOwogICBleHBlY3RlZCB8PSBUTFZGTEFHX0lTX05FSUdIUzsKLSAgaWYgKChsc3AtPmxzcF9oZWFkZXItPmxzcF9iaXRzICYgMykgPT0gMykgLyogYSBsZXZlbCAyIExTUCAqLworICBpZiAoKGxzcC0+bHNwX2hlYWRlci0+bHNwX2JpdHMgJiAzKSA9PSAzKQkvKiBhIGxldmVsIDIgTFNQICovCiAgICAgZXhwZWN0ZWQgfD0gVExWRkxBR19QQVJUSVRJT05fREVTSUdfTEVWRUwyX0lTOwogICBleHBlY3RlZCB8PSBUTFZGTEFHX05MUElEOwogICBpZiAoYXJlYS0+ZHluaG9zdG5hbWUpCiAgICAgZXhwZWN0ZWQgfD0gVExWRkxBR19EWU5fSE9TVE5BTUU7Ci0gIGlmIChhcmVhLT5uZXdtZXRyaWMpIHsKLSAgICBleHBlY3RlZCB8PSBUTFZGTEFHX1RFX0lTX05FSUdIUzsKLSAgICBleHBlY3RlZCB8PSBUTFZGTEFHX1RFX0lQVjRfUkVBQ0hBQklMSVRZOwotICAgIGV4cGVjdGVkIHw9IFRMVkZMQUdfVEVfUk9VVEVSX0lEOwotICB9CisgIGlmIChhcmVhLT5uZXdtZXRyaWMpCisgICAgeworICAgICAgZXhwZWN0ZWQgfD0gVExWRkxBR19URV9JU19ORUlHSFM7CisgICAgICBleHBlY3RlZCB8PSBUTFZGTEFHX1RFX0lQVjRfUkVBQ0hBQklMSVRZOworICAgICAgZXhwZWN0ZWQgfD0gVExWRkxBR19URV9ST1VURVJfSUQ7CisgICAgfQogICBleHBlY3RlZCB8PSBUTFZGTEFHX0lQVjRfQUREUjsKICAgZXhwZWN0ZWQgfD0gVExWRkxBR19JUFY0X0lOVF9SRUFDSEFCSUxJVFk7CiAgIGV4cGVjdGVkIHw9IFRMVkZMQUdfSVBWNF9FWFRfUkVBQ0hBQklMSVRZOwpAQCAtMzk0LDEwMSArNDAyLDEwMyBAQAogI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwogCiAgIHJldHZhbCA9IHBhcnNlX3RsdnMgKGFyZWEtPmFyZWFfdGFnLCBsc3AtPnBkdS0+ZGF0YSArCi0gICAgICAgICAgICAgICAgICAgICAgIElTSVNfRklYRURfSERSX0xFTiArIElTSVNfTFNQX0hEUl9MRU4sCi0gICAgICAgICAgICAgICAgICAgICAgIG50b2hzKGxzcC0+bHNwX2hlYWRlci0+cGR1X2xlbikgLSBJU0lTX0ZJWEVEX0hEUl9MRU4gCi0gICAgICAgICAgICAgICAgICAgICAgIC0gSVNJU19MU1BfSERSX0xFTiwgJmV4cGVjdGVkLCAmZm91bmQsICZsc3AtPnRsdl9kYXRhKTsKKwkJICAgICAgIElTSVNfRklYRURfSERSX0xFTiArIElTSVNfTFNQX0hEUl9MRU4sCisJCSAgICAgICBudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5wZHVfbGVuKSAtIElTSVNfRklYRURfSERSX0xFTgorCQkgICAgICAgLSBJU0lTX0xTUF9IRFJfTEVOLCAmZXhwZWN0ZWQsICZmb3VuZCwgJmxzcC0+dGx2X2RhdGEpOwogCi0gIGlmIChmb3VuZCAmIFRMVkZMQUdfRFlOX0hPU1ROQU1FKSB7Ci0gICAgaWYgKGFyZWEtPmR5bmhvc3RuYW1lKQotICAgICAgaXNpc19keW5obl9pbnNlcnQgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkLCBsc3AtPnRsdl9kYXRhLmhvc3RuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIChsc3AtPmxzcF9oZWFkZXItPmxzcF9iaXRzICYgTFNQQklUX0lTVCkgPT0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgSVNfTEVWRUxfMV9BTkRfMiA/IElTX0xFVkVMXzIgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAobHNwLT5sc3BfaGVhZGVyLT5sc3BfYml0cyAmIExTUEJJVF9JU1QpKTsKLSAgfQorICBpZiAoZm91bmQgJiBUTFZGTEFHX0RZTl9IT1NUTkFNRSkKKyAgICB7CisgICAgICBpZiAoYXJlYS0+ZHluaG9zdG5hbWUpCisJaXNpc19keW5obl9pbnNlcnQgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkLCBsc3AtPnRsdl9kYXRhLmhvc3RuYW1lLAorCQkJICAgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2JpdHMgJiBMU1BCSVRfSVNUKSA9PQorCQkJICAgSVNfTEVWRUxfMV9BTkRfMiA/IElTX0xFVkVMXzIgOgorCQkJICAgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2JpdHMgJiBMU1BCSVRfSVNUKSk7CisgICAgfQogCiB9CiAKIHZvaWQKIGxzcF91cGRhdGUgKHN0cnVjdCBpc2lzX2xzcCAqbHNwLCBzdHJ1Y3QgaXNpc19saW5rX3N0YXRlX2hkciAqbHNwX2hkciwKLSAgICAgICAgICAgIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSwgc3RydWN0IGlzaXNfYXJlYSAqYXJlYSkKKwkgICAgc3RydWN0IHN0cmVhbSAqc3RyZWFtLCBzdHJ1Y3QgaXNpc19hcmVhICphcmVhKQogewotCi0gIC8qIGZyZWUgdGhlIG9sZCBsc3AgZGF0YSovCisgIC8qIGZyZWUgdGhlIG9sZCBsc3AgZGF0YSAqLwogICBYRlJFRSAoTVRZUEVfU1RSRUFNX0RBVEEsIGxzcC0+cGR1KTsKICAgbHNwX2NsZWFyX2RhdGEgKGxzcCk7CiAKICAgLyogcmVidWlsZCB0aGUgbHNwIGRhdGEgKi8KICAgbHNwX3VwZGF0ZV9kYXRhIChsc3AsIHN0cmVhbSwgYXJlYSk7CiAKLSAgLyogc2V0IHRoZSBuZXcgdmFsdWVzIGZvciBsc3AgaGVhZGVyICovIAorICAvKiBzZXQgdGhlIG5ldyB2YWx1ZXMgZm9yIGxzcCBoZWFkZXIgKi8KICAgbWVtY3B5IChsc3AtPmxzcF9oZWFkZXIsIGxzcF9oZHIsIElTSVNfTFNQX0hEUl9MRU4pOwotCiB9CiAKLQogLyogY3JlYXRpb24gb2YgTFNQIGRpcmVjdGx5IGZyb20gd2hhdCB3ZSByZWNlaXZlZCAqLwogc3RydWN0IGlzaXNfbHNwICoKLWxzcF9uZXdfZnJvbV9zdHJlYW1fcHRyIChzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0sIAotICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50MTZfdCBwZHVfbGVuLCBzdHJ1Y3QgaXNpc19sc3AgKmxzcDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlzaXNfYXJlYSAqYXJlYSkKK2xzcF9uZXdfZnJvbV9zdHJlYW1fcHRyIChzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0sCisJCQkgdV9pbnQxNl90IHBkdV9sZW4sIHN0cnVjdCBpc2lzX2xzcCAqbHNwMCwKKwkJCSBzdHJ1Y3QgaXNpc19hcmVhICphcmVhKQogewogICBzdHJ1Y3QgaXNpc19sc3AgKmxzcDsKIAogICBsc3AgPSBYTUFMTE9DIChNVFlQRV9JU0lTX0xTUCwgc2l6ZW9mIChzdHJ1Y3QgaXNpc19sc3ApKTsKICAgbWVtc2V0IChsc3AsIDAsIHNpemVvZiAoc3RydWN0IGlzaXNfbHNwKSk7Ci0gIAorCiAgIGxzcF91cGRhdGVfZGF0YSAobHNwLCBzdHJlYW0sIGFyZWEpOwotICAKLSAgaWYgKGxzcDAgPT0gTlVMTCkgewotICAgIC8qCi0gICAgICogemVybyBsc3AgLT4gY3JlYXRlIHRoZSBsaXN0IGZvciBmcmFnbWVudHMKLSAgICAgKi8KLSAgICBsc3AtPmxzcHUuZnJhZ3MgPSBsaXN0X25ldyAoKTsKLSAgfSBlbHNlIHsKLSAgICAvKgotICAgICAqIGEgZnJhZ21lbnQgLT4gc2V0IHRoZSBiYWNrcG9pbnRlciBhbmQgYWRkIHRoaXMgdG8gemVybyBsc3BzIGZyYWcgbGlzdAotICAgICAqLwotICAgIGxzcC0+bHNwdS56ZXJvX2xzcCA9IGxzcDA7Ci0gICAgbGlzdG5vZGVfYWRkIChsc3AwLT5sc3B1LmZyYWdzLCBsc3ApOwotICB9Ci0gIAorCisgIGlmIChsc3AwID09IE5VTEwpCisgICAgeworICAgICAgLyoKKyAgICAgICAqIHplcm8gbHNwIC0+IGNyZWF0ZSB0aGUgbGlzdCBmb3IgZnJhZ21lbnRzCisgICAgICAgKi8KKyAgICAgIGxzcC0+bHNwdS5mcmFncyA9IGxpc3RfbmV3ICgpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBhIGZyYWdtZW50IC0+IHNldCB0aGUgYmFja3BvaW50ZXIgYW5kIGFkZCB0aGlzIHRvIHplcm8gbHNwcyBmcmFnIGxpc3QKKyAgICAgICAqLworICAgICAgbHNwLT5sc3B1Lnplcm9fbHNwID0gbHNwMDsKKyAgICAgIGxpc3Rub2RlX2FkZCAobHNwMC0+bHNwdS5mcmFncywgbHNwKTsKKyAgICB9CisKICAgcmV0dXJuIGxzcDsKIH0KIAogc3RydWN0IGlzaXNfbHNwICoKLWxzcF9uZXcgKHVfY2hhciAqbHNwX2lkLCB1X2ludDE2X3QgcmVtX2xpZmV0aW1lLCB1X2ludDMyX3Qgc2VxX251bSwgCi0gICAgICAgICB1X2ludDhfdCBsc3BfYml0cywgdV9pbnQxNl90IGNoZWNrc3VtLCBpbnQgbGV2ZWwpCitsc3BfbmV3ICh1X2NoYXIgKiBsc3BfaWQsIHVfaW50MTZfdCByZW1fbGlmZXRpbWUsIHVfaW50MzJfdCBzZXFfbnVtLAorCSB1X2ludDhfdCBsc3BfYml0cywgdV9pbnQxNl90IGNoZWNrc3VtLCBpbnQgbGV2ZWwpCiB7CiAgIHN0cnVjdCBpc2lzX2xzcCAqbHNwOwogCiAgIGxzcCA9IFhNQUxMT0MgKE1UWVBFX0lTSVNfTFNQLCBzaXplb2YgKHN0cnVjdCBpc2lzX2xzcCkpOwotICBpZiAoIWxzcCkgewotICAgIC8qIEZJWE1FOiBzZXQgbHNwZGJvbCBiaXQgKi8KLSAgICB6bG9nX3dhcm4gKCJsc3BfbmV3KCk6IG91dCBvZiBtZW1vcnkiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQorICBpZiAoIWxzcCkKKyAgICB7CisgICAgICAvKiBGSVhNRTogc2V0IGxzcGRib2wgYml0ICovCisgICAgICB6bG9nX3dhcm4gKCJsc3BfbmV3KCk6IG91dCBvZiBtZW1vcnkiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgbWVtc2V0IChsc3AsIDAsIHNpemVvZiAoc3RydWN0IGlzaXNfbHNwKSk7CiAjaWZkZWYgTFNQX01FTU9SWV9QUkVBU1NJR04KLSAgbHNwLT5wZHUgPSBzdHJlYW1fbmV3ICgxNTE0KTsgLypTaG91bGQgYmUgbWluaW1hbCBtdHU/IHl1cC4uLiovCisgIGxzcC0+cGR1ID0gc3RyZWFtX25ldyAoMTUxNCk7CS8qU2hvdWxkIGJlIG1pbmltYWwgbXR1PyB5dXAuLi4gKi8KICNlbHNlCi0gIC8qIFdlIG5lZWQgdG8gZG8gcmVhbGxvYyBvbiBUTFZzIGFkZGl0aW9ucyovCi0gIGxzcC0+cGR1ID0gbWFsbG9jIChJU0lTX0ZJWEVEX0hEUl9MRU4gKyBJU0lTX0xTUF9IRFJfTEVOKTsgCisgIC8qIFdlIG5lZWQgdG8gZG8gcmVhbGxvYyBvbiBUTFZzIGFkZGl0aW9ucyAqLworICBsc3AtPnBkdSA9IG1hbGxvYyAoSVNJU19GSVhFRF9IRFJfTEVOICsgSVNJU19MU1BfSERSX0xFTik7CiAjZW5kaWYgLyogTFNQX01FTU9SWV9QUkVBU1NJR04gKi8KICAgaWYgKExTUF9GUkFHTUVOVCAobHNwX2lkKSA9PSAwKQogICAgIGxzcC0+bHNwdS5mcmFncyA9IGxpc3RfbmV3ICgpOwotICBsc3AtPmlzaXNfaGVhZGVyID0gKHN0cnVjdCBpc2lzX2ZpeGVkX2hkciopKFNUUkVBTV9EQVRBKGxzcC0+cGR1KSk7Ci0gIGxzcC0+bHNwX2hlYWRlciA9IChzdHJ1Y3QgaXNpc19saW5rX3N0YXRlX2hkciopCi0gICAgICAgICAgICAgICAgICAgIChTVFJFQU1fREFUQShsc3AtPnBkdSkgKyBJU0lTX0ZJWEVEX0hEUl9MRU4pOwotICAKKyAgbHNwLT5pc2lzX2hlYWRlciA9IChzdHJ1Y3QgaXNpc19maXhlZF9oZHIgKikgKFNUUkVBTV9EQVRBIChsc3AtPnBkdSkpOworICBsc3AtPmxzcF9oZWFkZXIgPSAoc3RydWN0IGlzaXNfbGlua19zdGF0ZV9oZHIgKikKKyAgICAoU1RSRUFNX0RBVEEgKGxzcC0+cGR1KSArIElTSVNfRklYRURfSERSX0xFTik7CisKICAgLyogYXQgZmlyc3Qgd2UgZmlsbCB0aGUgRklYRUQgSEVBREVSICovCi0gIChsZXZlbCA9PSAxKSA/IGZpbGxfZml4ZWRfaGRyIChsc3AtPmlzaXNfaGVhZGVyLCBMMV9MSU5LX1NUQVRFKToKLSAgICAgICAgICAgICAgICAgZmlsbF9maXhlZF9oZHIgKGxzcC0+aXNpc19oZWFkZXIsIEwyX0xJTktfU1RBVEUpOwotICAKKyAgKGxldmVsID09IDEpID8gZmlsbF9maXhlZF9oZHIgKGxzcC0+aXNpc19oZWFkZXIsIEwxX0xJTktfU1RBVEUpIDoKKyAgICBmaWxsX2ZpeGVkX2hkciAobHNwLT5pc2lzX2hlYWRlciwgTDJfTElOS19TVEFURSk7CisKICAgLyogbm93IGZvciB0aGUgTFNQIEhFQURFUiAqLwogICAvKiBNaW5pbWFsIExTUCBQRFUgc2l6ZSAqLwotICBsc3AtPmxzcF9oZWFkZXItPnBkdV9sZW4gPSBodG9ucyAoSVNJU19GSVhFRF9IRFJfTEVOICsgSVNJU19MU1BfSERSX0xFTik7IAorICBsc3AtPmxzcF9oZWFkZXItPnBkdV9sZW4gPSBodG9ucyAoSVNJU19GSVhFRF9IRFJfTEVOICsgSVNJU19MU1BfSERSX0xFTik7CiAgIG1lbWNweSAobHNwLT5sc3BfaGVhZGVyLT5sc3BfaWQsIGxzcF9pZCwgSVNJU19TWVNfSURfTEVOICsgMik7Ci0gIGxzcC0+bHNwX2hlYWRlci0+Y2hlY2tzdW0gPSBjaGVja3N1bTsgLyogUHJvdmlkZWQgaW4gbmV0d29yayBvcmRlciAqLworICBsc3AtPmxzcF9oZWFkZXItPmNoZWNrc3VtID0gY2hlY2tzdW07CS8qIFByb3ZpZGVkIGluIG5ldHdvcmsgb3JkZXIgKi8KICAgbHNwLT5sc3BfaGVhZGVyLT5zZXFfbnVtID0gaHRvbmwgKHNlcV9udW0pOwogICBsc3AtPmxzcF9oZWFkZXItPnJlbV9saWZldGltZSA9IGh0b25zIChyZW1fbGlmZXRpbWUpOwogICBsc3AtPmxzcF9oZWFkZXItPmxzcF9iaXRzID0gbHNwX2JpdHM7CkBAIC01MDAsMTYgKzUxMCwxNiBAQAogICAvKiAjaWZkZWYgRVhUUkVNRV9ERUJVRyAqLwogICAvKiBsb2dnaW5nICovCiAgIHpsb2dfaW5mbyAoIk5ldyBMU1Agd2l0aCBJRCAlcy0lMDJ4LSUwMnggc2VxbnVtICUwOHgiLCBzeXNpZF9wcmludCAobHNwX2lkKSwKLSAgICAgICAgICAgICBMU1BfUFNFVURPX0lEIChsc3AtPmxzcF9oZWFkZXItPmxzcF9pZCksCi0gICAgICAgICAgICAgTFNQX0ZSQUdNRU5UIChsc3AtPmxzcF9oZWFkZXItPmxzcF9pZCksCi0gICAgICAgICAgICAgbnRvaGwgKGxzcC0+bHNwX2hlYWRlci0+c2VxX251bSkpOworCSAgICAgTFNQX1BTRVVET19JRCAobHNwLT5sc3BfaGVhZGVyLT5sc3BfaWQpLAorCSAgICAgTFNQX0ZSQUdNRU5UIChsc3AtPmxzcF9oZWFkZXItPmxzcF9pZCksCisJICAgICBudG9obCAobHNwLT5sc3BfaGVhZGVyLT5zZXFfbnVtKSk7CiAgIC8qICNlbmRpZiAgRVhUUkVNRSBERUJVRyAqLwogCiAgIHJldHVybiBsc3A7CiB9CiAKIHZvaWQKLWxzcF9pbnNlcnQgKHN0cnVjdCBpc2lzX2xzcCAqbHNwLCBkaWN0X3QgKmxzcGRiKQorbHNwX2luc2VydCAoc3RydWN0IGlzaXNfbHNwICpsc3AsIGRpY3RfdCAqIGxzcGRiKQogewogICBkaWN0X2FsbG9jX2luc2VydCAobHNwZGIsIGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkLCBsc3ApOwogfQpAQCAtNTE3LDYyICs1MjcsNjQgQEAKIC8qCiAgKiBCdWlsZCBhIGxpc3Qgb2YgTFNQcyB3aXRoIG5vbi16ZXJvIGh0IGJvdW5kZWQgYnkgc3RhcnQgYW5kIHN0b3AgaWRzCiAgKi8KLXZvaWQgCi1sc3BfYnVpbGRfbGlzdF9ub256ZXJvX2h0ICh1X2NoYXIgKnN0YXJ0X2lkLCB1X2NoYXIgKnN0b3BfaWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxpc3QgKmxpc3QsIGRpY3RfdCAqbHNwZGIpCit2b2lkCitsc3BfYnVpbGRfbGlzdF9ub256ZXJvX2h0ICh1X2NoYXIgKiBzdGFydF9pZCwgdV9jaGFyICogc3RvcF9pZCwKKwkJCSAgIHN0cnVjdCBsaXN0ICpsaXN0LCBkaWN0X3QgKiBsc3BkYikKIHsKICAgZG5vZGVfdCAqZmlyc3QsICpsYXN0LCAqY3VycjsKIAogICBmaXJzdCA9IGRpY3RfbG93ZXJfYm91bmQgKGxzcGRiLCBzdGFydF9pZCk7CiAgIGlmICghZmlyc3QpCiAgICAgcmV0dXJuOwotICAKKwogICBsYXN0ID0gZGljdF91cHBlcl9ib3VuZCAobHNwZGIsIHN0b3BfaWQpOwotICAKKwogICBjdXJyID0gZmlyc3Q7Ci0gIAotICBpZiAoKChzdHJ1Y3QgaXNpc19sc3AgKikoY3Vyci0+ZGljdF9kYXRhKSktPmxzcF9oZWFkZXItPnJlbV9saWZldGltZSkKKworICBpZiAoKChzdHJ1Y3QgaXNpc19sc3AgKikgKGN1cnItPmRpY3RfZGF0YSkpLT5sc3BfaGVhZGVyLT5yZW1fbGlmZXRpbWUpCiAgICAgbGlzdG5vZGVfYWRkIChsaXN0LCBmaXJzdC0+ZGljdF9kYXRhKTsKIAotICB3aGlsZSAoY3VycikgewotICAgIGN1cnIgPSBkaWN0X25leHQgKGxzcGRiLCBjdXJyKTsKLSAgICBpZiAoY3VyciAmJiAKLSAgICAgICAgKChzdHJ1Y3QgaXNpc19sc3AgKikoY3Vyci0+ZGljdF9kYXRhKSktPmxzcF9oZWFkZXItPnJlbV9saWZldGltZSkKLSAgICAgIGxpc3Rub2RlX2FkZCAobGlzdCwgY3Vyci0+ZGljdF9kYXRhKTsKLSAgICBpZiAoY3VyciA9PSBsYXN0KQotICAgICAgYnJlYWs7Ci0gIH0KLSAgCisgIHdoaWxlIChjdXJyKQorICAgIHsKKyAgICAgIGN1cnIgPSBkaWN0X25leHQgKGxzcGRiLCBjdXJyKTsKKyAgICAgIGlmIChjdXJyICYmCisJICAoKHN0cnVjdCBpc2lzX2xzcCAqKSAoY3Vyci0+ZGljdF9kYXRhKSktPmxzcF9oZWFkZXItPnJlbV9saWZldGltZSkKKwlsaXN0bm9kZV9hZGQgKGxpc3QsIGN1cnItPmRpY3RfZGF0YSk7CisgICAgICBpZiAoY3VyciA9PSBsYXN0KQorCWJyZWFrOworICAgIH0KKwogICByZXR1cm47CiB9CiAKIC8qCiAgKiBCdWlsZCBhIGxpc3Qgb2YgYWxsIExTUHMgYm91bmRlZCBieSBzdGFydCBhbmQgc3RvcCBpZHMKICAqLwotdm9pZCAKLWxzcF9idWlsZF9saXN0ICh1X2NoYXIgKnN0YXJ0X2lkLCB1X2NoYXIgKnN0b3BfaWQsIAotICAgICAgICAgICAgICAgIHN0cnVjdCBsaXN0ICpsaXN0LCBkaWN0X3QgKmxzcGRiKQordm9pZAorbHNwX2J1aWxkX2xpc3QgKHVfY2hhciAqIHN0YXJ0X2lkLCB1X2NoYXIgKiBzdG9wX2lkLAorCQlzdHJ1Y3QgbGlzdCAqbGlzdCwgZGljdF90ICogbHNwZGIpCiB7CiAgIGRub2RlX3QgKmZpcnN0LCAqbGFzdCwgKmN1cnI7CiAKICAgZmlyc3QgPSBkaWN0X2xvd2VyX2JvdW5kIChsc3BkYiwgc3RhcnRfaWQpOwogICBpZiAoIWZpcnN0KQogICAgIHJldHVybjsKLSAgCisKICAgbGFzdCA9IGRpY3RfdXBwZXJfYm91bmQgKGxzcGRiLCBzdG9wX2lkKTsKLSAgCisKICAgY3VyciA9IGZpcnN0OwotICAKKwogICBsaXN0bm9kZV9hZGQgKGxpc3QsIGZpcnN0LT5kaWN0X2RhdGEpOwogCi0gIHdoaWxlIChjdXJyKSB7Ci0gICAgY3VyciA9IGRpY3RfbmV4dCAobHNwZGIsIGN1cnIpOwotICAgIGlmIChjdXJyKQotICAgICAgbGlzdG5vZGVfYWRkIChsaXN0LCBjdXJyLT5kaWN0X2RhdGEpOwotICAgIGlmIChjdXJyID09IGxhc3QpCi0gICAgICBicmVhazsKLSAgfQotICAKKyAgd2hpbGUgKGN1cnIpCisgICAgeworICAgICAgY3VyciA9IGRpY3RfbmV4dCAobHNwZGIsIGN1cnIpOworICAgICAgaWYgKGN1cnIpCisJbGlzdG5vZGVfYWRkIChsaXN0LCBjdXJyLT5kaWN0X2RhdGEpOworICAgICAgaWYgKGN1cnIgPT0gbGFzdCkKKwlicmVhazsKKyAgICB9CisKICAgcmV0dXJuOwogfQogCkBAIC01ODAsMjEgKzU5MiwyMiBAQAogICogQnVpbGQgYSBsaXN0IG9mIExTUHMgd2l0aCBTU04gZmxhZyBzZXQgZm9yIHRoZSBnaXZlbiBjaXJjdWl0CiAgKi8KIHZvaWQKLWxzcF9idWlsZF9saXN0X3NzbiAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgc3RydWN0IGxpc3QgKmxpc3QsIAotICAgICAgICAgICAgICAgICAgICBkaWN0X3QgKmxzcGRiKQorbHNwX2J1aWxkX2xpc3Rfc3NuIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LCBzdHJ1Y3QgbGlzdCAqbGlzdCwKKwkJICAgIGRpY3RfdCAqIGxzcGRiKQogewogICBkbm9kZV90ICpkbm9kZSwgKm5leHQ7CiAgIHN0cnVjdCBpc2lzX2xzcCAqbHNwOwotICAKKwogICBkbm9kZSA9IGRpY3RfZmlyc3QgKGxzcGRiKTsKLSAgd2hpbGUgKGRub2RlICE9IE5VTEwpIHsKLSAgICBuZXh0ID0gZGljdF9uZXh0IChsc3BkYiwgZG5vZGUpOwotICAgIGxzcCA9IGRub2RlX2dldCAoZG5vZGUpOwotICAgIGlmIChJU0lTX0NIRUNLX0ZMQUcgKGxzcC0+U1NOZmxhZ3MsIGNpcmN1aXQpKQotICAgICAgbGlzdG5vZGVfYWRkIChsaXN0LCBsc3ApOwotICAgIGRub2RlID0gbmV4dDsKLSAgfQotICAKKyAgd2hpbGUgKGRub2RlICE9IE5VTEwpCisgICAgeworICAgICAgbmV4dCA9IGRpY3RfbmV4dCAobHNwZGIsIGRub2RlKTsKKyAgICAgIGxzcCA9IGRub2RlX2dldCAoZG5vZGUpOworICAgICAgaWYgKElTSVNfQ0hFQ0tfRkxBRyAobHNwLT5TU05mbGFncywgY2lyY3VpdCkpCisJbGlzdG5vZGVfYWRkIChsaXN0LCBsc3ApOworICAgICAgZG5vZGUgPSBuZXh0OworICAgIH0KKwogICByZXR1cm47CiB9CiAKQEAgLTYwMiwzMSArNjE1LDM0IEBACiBsc3Bfc2V0X3RpbWUgKHN0cnVjdCBpc2lzX2xzcCAqbHNwKQogewogICBhc3NlcnQgKGxzcCk7Ci0gIAotICBpZiAobHNwLT5sc3BfaGVhZGVyLT5yZW1fbGlmZXRpbWUgPT0gMCkgewotICAgIGlmIChsc3AtPmFnZV9vdXQgIT0gMCkgbHNwLT5hZ2Vfb3V0LS07Ci0gICAgcmV0dXJuOwotICB9CisKKyAgaWYgKGxzcC0+bHNwX2hlYWRlci0+cmVtX2xpZmV0aW1lID09IDApCisgICAgeworICAgICAgaWYgKGxzcC0+YWdlX291dCAhPSAwKQorCWxzcC0+YWdlX291dC0tOworICAgICAgcmV0dXJuOworICAgIH0KIAogICAvKiBJZiB3ZSBhcmUgdHVybmluZyAwICovCiAgIC8qIElTTyAxMDU4OSAtIDcuMy4xNi40IGZpcnN0IHBhcmFncmFwaCAqLwogCi0gIGlmIChudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5yZW1fbGlmZXRpbWUpID09IDEpIHsKLSAgICAvKiA3LjMuMTYuNCBhKSBzZXQgU1JNIGZsYWdzIG9uIGFsbCAqLwotICAgIElTSVNfRkxBR1NfU0VUX0FMTCAobHNwLT5TUk1mbGFncyk7Ci0gICAgLyogNy4zLjE2LjQgYikgcmV0YWluIG9ubHkgdGhlIGhlYWRlciBGSVhNRSAgKi8KLSAgICAvKiA3LjMuMTYuNCBjKSByZWNvcmQgdGhlIHRpbWUgdG8gcHVyZ2UgRklYTUUgKG90aGVyIHdheSB0byBkbyBpdCkqLwotICB9CisgIGlmIChudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5yZW1fbGlmZXRpbWUpID09IDEpCisgICAgeworICAgICAgLyogNy4zLjE2LjQgYSkgc2V0IFNSTSBmbGFncyBvbiBhbGwgKi8KKyAgICAgIElTSVNfRkxBR1NfU0VUX0FMTCAobHNwLT5TUk1mbGFncyk7CisgICAgICAvKiA3LjMuMTYuNCBiKSByZXRhaW4gb25seSB0aGUgaGVhZGVyIEZJWE1FICAqLworICAgICAgLyogNy4zLjE2LjQgYykgcmVjb3JkIHRoZSB0aW1lIHRvIHB1cmdlIEZJWE1FIChvdGhlciB3YXkgdG8gZG8gaXQpICovCisgICAgfQogCi0gIGxzcC0+bHNwX2hlYWRlci0+cmVtX2xpZmV0aW1lID0gCisgIGxzcC0+bHNwX2hlYWRlci0+cmVtX2xpZmV0aW1lID0KICAgICBodG9ucyAobnRvaHMgKGxzcC0+bHNwX2hlYWRlci0+cmVtX2xpZmV0aW1lKSAtIDEpOwogfQogCiB2b2lkCi1sc3BpZF9wcmludCAodV9jaGFyICpsc3BfaWQsIHVfY2hhciAqdHJnLCBjaGFyIGR5bmhvc3QsIGNoYXIgZnJhZykKK2xzcGlkX3ByaW50ICh1X2NoYXIgKiBsc3BfaWQsIHVfY2hhciAqIHRyZywgY2hhciBkeW5ob3N0LCBjaGFyIGZyYWcpCiB7CiAgIHN0cnVjdCBpc2lzX2R5bmhuICpkeW4gPSBOVUxMOwotICB1X2NoYXIgaWQgW1NZU0lEX1NUUkxFTl07CisgIHVfY2hhciBpZFtTWVNJRF9TVFJMRU5dOwogCiAgIGlmIChkeW5ob3N0KQogICAgIGR5biA9IGR5bmhuX2ZpbmRfYnlfaWQgKGxzcF9pZCk7CkBAIC02MzYsNzQgKzY1Miw2OSBAQAogICBpZiAoZHluKQogICAgIHNwcmludGYgKGlkLCAiJS4xNHMiLCBkeW4tPm5hbWUubmFtZSk7CiAgIGVsc2UgaWYgKCFtZW1jbXAgKGlzaXMtPnN5c2lkLCBsc3BfaWQsIElTSVNfU1lTX0lEX0xFTikgJiBkeW5ob3N0KQotICAgIHNwcmludGYgKGlkLCAiJS4xNHMiLCB1bml4X2hvc3RuYW1lKCkpOwotICAgZWxzZSB7Ci0gICAgbWVtY3B5KGlkLCBzeXNpZF9wcmludCAobHNwX2lkKSwgMTUpOwotICB9Ci0gIGlmIChmcmFnKQotICAgIHNwcmludGYgKHRyZywgIiVzLiUwMngtJTAyeCIsIGlkLCBMU1BfUFNFVURPX0lEKGxzcF9pZCksIAotICAgICAgICAgICAgIExTUF9GUkFHTUVOVChsc3BfaWQpKTsKKyAgICBzcHJpbnRmIChpZCwgIiUuMTRzIiwgdW5peF9ob3N0bmFtZSAoKSk7CiAgIGVsc2UKLSAgICBzcHJpbnRmICh0cmcsICIlcy4lMDJ4IiwgaWQsIExTUF9QU0VVRE9fSUQobHNwX2lkKSk7CisgICAgeworICAgICAgbWVtY3B5IChpZCwgc3lzaWRfcHJpbnQgKGxzcF9pZCksIDE1KTsKKyAgICB9CisgIGlmIChmcmFnKQorICAgIHNwcmludGYgKHRyZywgIiVzLiUwMngtJTAyeCIsIGlkLCBMU1BfUFNFVURPX0lEIChsc3BfaWQpLAorCSAgICAgTFNQX0ZSQUdNRU5UIChsc3BfaWQpKTsKKyAgZWxzZQorICAgIHNwcmludGYgKHRyZywgIiVzLiUwMngiLCBpZCwgTFNQX1BTRVVET19JRCAobHNwX2lkKSk7CiB9CiAKLS8qIENvbnZlcnQgdGhlIGxzcCBhdHRyaWJ1dGUgYml0cyB0byBhdHRyaWJ1dGUgc3RyaW5nICovIAotY2hhciAqIAotbHNwX2JpdHMyc3RyaW5nICh1X2NoYXIgKmxzcF9iaXRzKSB7CisvKiBDb252ZXJ0IHRoZSBsc3AgYXR0cmlidXRlIGJpdHMgdG8gYXR0cmlidXRlIHN0cmluZyAqLworY2hhciAqCitsc3BfYml0czJzdHJpbmcgKHVfY2hhciAqIGxzcF9iaXRzKQoreworICBjaGFyICpwb3MgPSBsc3BfYml0c19zdHJpbmc7CiAKLSAgY2hhciAqcG9zID0gbHNwX2JpdHNfc3RyaW5nOyAKLQotICBpZighKmxzcF9iaXRzKQorICBpZiAoISpsc3BfYml0cykKICAgICByZXR1cm4gIiBub25lIjsKIAogICAvKiB3ZSBvbmx5IGZvY3VzIG9uIHRoZSBkZWZhdWx0IG1ldHJpYyAqLwogICBwb3MgKz0gc3ByaW50ZiAocG9zLCAiJWQvIiwKLSAgICAgICAgICAgSVNJU19NQVNLX0xTUF9BVFRfREVGQVVMVF9CSVQoKmxzcF9iaXRzKSA/Ci0gICAgICAgICAgIDEgOiAwKTsKKwkJICBJU0lTX01BU0tfTFNQX0FUVF9ERUZBVUxUX0JJVCAoKmxzcF9iaXRzKSA/IDEgOiAwKTsKIAogICBwb3MgKz0gc3ByaW50ZiAocG9zLCAiJWQvIiwKLSAgICAgICAgICAgSVNJU19NQVNLX0xTUF9QQVJUSVRJT05fQklUKCpsc3BfYml0cykgPwotICAgICAgICAgICAxIDogMCk7CisJCSAgSVNJU19NQVNLX0xTUF9QQVJUSVRJT05fQklUICgqbHNwX2JpdHMpID8gMSA6IDApOwogCi0gIHBvcyArPSBzcHJpbnRmIChwb3MsICIlZCIsCi0gICAgICAgICAgIElTSVNfTUFTS19MU1BfT0xfQklUKCpsc3BfYml0cykgPwotICAgICAgICAgICAxIDogMCk7Ci0gIAorICBwb3MgKz0gc3ByaW50ZiAocG9zLCAiJWQiLCBJU0lTX01BU0tfTFNQX09MX0JJVCAoKmxzcF9iaXRzKSA/IDEgOiAwKTsKKwogICAqKHBvcykgPSAnXDAnOwotICAKLSAgcmV0dXJuIGxzcF9iaXRzX3N0cmluZzsKIAorICByZXR1cm4gbHNwX2JpdHNfc3RyaW5nOwogfQogCiAvKiB0aGlzIGZ1bmN0aW9uIHByaW50cyB0aGUgbHNwIG9uIHNob3cgaXNpcyBkYXRhYmFzZSAqLwogdm9pZAotbHNwX3ByaW50IChkbm9kZV90ICpub2RlLCBzdHJ1Y3QgdnR5ICp2dHksIGNoYXIgZHluaG9zdCkKK2xzcF9wcmludCAoZG5vZGVfdCAqIG5vZGUsIHN0cnVjdCB2dHkgKnZ0eSwgY2hhciBkeW5ob3N0KQogewotICBzdHJ1Y3QgaXNpc19sc3AgKmxzcCA9IGRub2RlX2dldChub2RlKTsKKyAgc3RydWN0IGlzaXNfbHNwICpsc3AgPSBkbm9kZV9nZXQgKG5vZGUpOwogICB1X2NoYXIgTFNQaWRbMjU1XTsKIAogICBsc3BpZF9wcmludCAobHNwLT5sc3BfaGVhZGVyLT5sc3BfaWQsIExTUGlkLCBkeW5ob3N0LCAxKTsKLSAgdnR5X291dCAodnR5LCAiJS0yMXMlYyAgICIsIExTUGlkLGxzcC0+b3duX2xzcD8nKic6JyAnKTsKLSAgdnR5X291dCAodnR5LCAiMHglMDh4ICAgIiwgbnRvaGwobHNwLT5sc3BfaGVhZGVyLT5zZXFfbnVtKSk7Ci0gIHZ0eV9vdXQgKHZ0eSwgIjB4JTA0eCAgICAgICIsIG50b2hzKGxzcC0+bHNwX2hlYWRlci0+Y2hlY2tzdW0pKTsKKyAgdnR5X291dCAodnR5LCAiJS0yMXMlYyAgICIsIExTUGlkLCBsc3AtPm93bl9sc3AgPyAnKicgOiAnICcpOworICB2dHlfb3V0ICh2dHksICIweCUwOHggICAiLCBudG9obCAobHNwLT5sc3BfaGVhZGVyLT5zZXFfbnVtKSk7CisgIHZ0eV9vdXQgKHZ0eSwgIjB4JTA0eCAgICAgICIsIG50b2hzIChsc3AtPmxzcF9oZWFkZXItPmNoZWNrc3VtKSk7CiAKLSAgaWYgKG50b2hzKGxzcC0+bHNwX2hlYWRlci0+cmVtX2xpZmV0aW1lKSA9PSAwKQotICAgIHZ0eV9vdXQgKHZ0eSwgIiAoJTJ1KSIsbHNwLT5hZ2Vfb3V0KTsKKyAgaWYgKG50b2hzIChsc3AtPmxzcF9oZWFkZXItPnJlbV9saWZldGltZSkgPT0gMCkKKyAgICB2dHlfb3V0ICh2dHksICIgKCUydSkiLCBsc3AtPmFnZV9vdXQpOwogICBlbHNlCi0gICAgdnR5X291dCAodnR5LCAiJTV1IiwgbnRvaHMobHNwLT5sc3BfaGVhZGVyLT5yZW1fbGlmZXRpbWUpKTsKKyAgICB2dHlfb3V0ICh2dHksICIlNXUiLCBudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5yZW1fbGlmZXRpbWUpKTsKIAogICB2dHlfb3V0ICh2dHksICIgICAgICAgICAlcyVzIiwKLSAgICBsc3BfYml0czJzdHJpbmcoJmxzcC0+bHNwX2hlYWRlci0+bHNwX2JpdHMpLAkgICAKLSAgICBWVFlfTkVXTElORSk7CisJICAgbHNwX2JpdHMyc3RyaW5nICgmbHNwLT5sc3BfaGVhZGVyLT5sc3BfYml0cyksIFZUWV9ORVdMSU5FKTsKIH0KIAogdm9pZAotbHNwX3ByaW50X2RldGFpbCAoZG5vZGVfdCAqbm9kZSwgc3RydWN0IHZ0eSAqdnR5LCBjaGFyIGR5bmhvc3QpCitsc3BfcHJpbnRfZGV0YWlsIChkbm9kZV90ICogbm9kZSwgc3RydWN0IHZ0eSAqdnR5LCBjaGFyIGR5bmhvc3QpCiB7CiAgIHN0cnVjdCBpc2lzX2xzcCAqbHNwID0gZG5vZGVfZ2V0IChub2RlKTsKICAgc3RydWN0IGFyZWFfYWRkciAqYXJlYV9hZGRyOwotICBjaGFyICAgbmxwaWRzdHJbMl07Ci0gIGludCAgICBpOworICBjaGFyIG5scGlkc3RyWzJdOworICBpbnQgaTsKICAgc3RydWN0IGxpc3Rub2RlICpsbm9kZTsKICAgc3RydWN0IGlzX25laWdoICppc19uZWlnaDsKICAgc3RydWN0IHRlX2lzX25laWdoICp0ZV9pc19uZWlnaDsKQEAgLTcxNywxMjQgKzcyOCwxMjQgQEAKICAgdV9jaGFyIExTUGlkWzI1NV07CiAgIHVfY2hhciBob3N0bmFtZVsyNTVdOwogICB1X2NoYXIgYnVmZltCVUZTSVpdOwotICB1X2ludDMyX3Qgbm93LGhlbHBlcjsKKyAgdV9pbnQzMl90IG5vdywgaGVscGVyOwogICB1X2NoYXIgaXB2NF9yZWFjaF9wcmVmaXhbMjBdOwogICB1X2NoYXIgaXB2NF9yZWFjaF9tYXNrWzIwXTsKICAgdV9jaGFyIGlwdjRfYWRkcmVzc1syMF07CiAKICAgbHNwaWRfcHJpbnQgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkLCBMU1BpZCwgZHluaG9zdCwgMSk7Ci0gIGxzcF9wcmludChub2RlLCB2dHksIGR5bmhvc3QpOworICBsc3BfcHJpbnQgKG5vZGUsIHZ0eSwgZHluaG9zdCk7CiAKICAgLyogZm9yIGFsbCBhcmVhIGFkZHJlc3MgKi8KLSAgaWYgKGxzcC0+dGx2X2RhdGEuYXJlYV9hZGRycykgewotICAgIExJU1RfTE9PUCAobHNwLT50bHZfZGF0YS5hcmVhX2FkZHJzLCBhcmVhX2FkZHIsIGxub2RlKSB7Ci0gICAgdnR5X291dCAodnR5LCAiICBBcmVhIEFkZHJlc3M6ICAlcyVzIiwgCi0JCSAgIGlzb25ldF9wcmludCAoYXJlYV9hZGRyLT5hcmVhX2FkZHIsIGFyZWFfYWRkci0+YWRkcl9sZW4pLCAKLQkJICAgVlRZX05FV0xJTkUpOworICBpZiAobHNwLT50bHZfZGF0YS5hcmVhX2FkZHJzKQorICAgIHsKKyAgICAgIExJU1RfTE9PUCAobHNwLT50bHZfZGF0YS5hcmVhX2FkZHJzLCBhcmVhX2FkZHIsIGxub2RlKQorICAgICAgeworCXZ0eV9vdXQgKHZ0eSwgIiAgQXJlYSBBZGRyZXNzOiAgJXMlcyIsCisJCSBpc29uZXRfcHJpbnQgKGFyZWFfYWRkci0+YXJlYV9hZGRyLCBhcmVhX2FkZHItPmFkZHJfbGVuKSwKKwkJIFZUWV9ORVdMSU5FKTsKKyAgICAgIH0KICAgICB9Ci0gIH0KIAogICAvKiBmb3IgdGhlIG5scGlkIHRsdiAqLwotICBpZiAobHNwLT50bHZfZGF0YS5ubHBpZHMpIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbHNwLT50bHZfZGF0YS5ubHBpZHMtPmNvdW50OyBpKyspIHsKLSAgICAgIHN3aXRjaCAobHNwLT50bHZfZGF0YS5ubHBpZHMtPm5scGlkc1tpXSkgewotICAgICAgY2FzZSBOTFBJRF9JUDoKLSAgICAgIGNhc2UgTkxQSURfSVBWNjoKLSAgICAgICAgdnR5X291dCAodnR5LCAiICBOTFBJRDogICAgICAgICAweCVYJXMiLAotICAgICAgICAgICAgICAgbHNwLT50bHZfZGF0YS5ubHBpZHMtPm5scGlkc1tpXSwKLSAgICAgICAgICAgICAgIFZUWV9ORVdMSU5FKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB2dHlfb3V0ICh2dHksICIgIE5MUElEOiAgICAgICAgICVzJXMiLAotICAgICAgICAgICAgICAgInVua25vd24iLAotICAgICAgICAgICAgICAgVlRZX05FV0xJTkUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IAotICB9CisgIGlmIChsc3AtPnRsdl9kYXRhLm5scGlkcykKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbHNwLT50bHZfZGF0YS5ubHBpZHMtPmNvdW50OyBpKyspCisJeworCSAgc3dpdGNoIChsc3AtPnRsdl9kYXRhLm5scGlkcy0+bmxwaWRzW2ldKQorCSAgICB7CisJICAgIGNhc2UgTkxQSURfSVA6CisJICAgIGNhc2UgTkxQSURfSVBWNjoKKwkgICAgICB2dHlfb3V0ICh2dHksICIgIE5MUElEOiAgICAgICAgIDB4JVglcyIsCisJCSAgICAgICBsc3AtPnRsdl9kYXRhLm5scGlkcy0+bmxwaWRzW2ldLCBWVFlfTkVXTElORSk7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgdnR5X291dCAodnR5LCAiICBOTFBJRDogICAgICAgICAlcyVzIiwgInVua25vd24iLCBWVFlfTkVXTElORSk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQogCiAgIC8qIGZvciB0aGUgaG9zdG5hbWUgdGx2ICovCi0gIGlmIChsc3AtPnRsdl9kYXRhLmhvc3RuYW1lKSB7Ci0gICAgYnplcm8gKGhvc3RuYW1lLCBzaXplb2YgKGhvc3RuYW1lKSk7Ci0gICAgbWVtY3B5IChob3N0bmFtZSwgbHNwLT50bHZfZGF0YS5ob3N0bmFtZS0+bmFtZSwKLSAgICAgICAgICAgIGxzcC0+dGx2X2RhdGEuaG9zdG5hbWUtPm5hbWVsZW4pOwotICAgIHZ0eV9vdXQgKHZ0eSwgIiAgSG9zdG5hbWU6ICVzJXMiLCBob3N0bmFtZSwgVlRZX05FV0xJTkUpOwotICB9Ci0KLSAgaWYgKGxzcC0+dGx2X2RhdGEuaXB2NF9hZGRycykgewotICAgIExJU1RfTE9PUChsc3AtPnRsdl9kYXRhLmlwdjRfYWRkcnMsIGlwdjRfYWRkciwgbG5vZGUpIHsKLSAgICAgIG1lbWNweSAoaXB2NF9hZGRyZXNzLCBpbmV0X250b2EgKCppcHY0X2FkZHIpLCBzaXplb2YgKGlwdjRfYWRkcmVzcykpOwotICAgICAgdnR5X291dCAodnR5LCAiICBJUDogICAgICAgICVzJXMiLAotICAgICAgICAgICAgICAgaXB2NF9hZGRyZXNzLAotICAgICAgICAgICAgICAgVlRZX05FV0xJTkUpOworICBpZiAobHNwLT50bHZfZGF0YS5ob3N0bmFtZSkKKyAgICB7CisgICAgICBiemVybyAoaG9zdG5hbWUsIHNpemVvZiAoaG9zdG5hbWUpKTsKKyAgICAgIG1lbWNweSAoaG9zdG5hbWUsIGxzcC0+dGx2X2RhdGEuaG9zdG5hbWUtPm5hbWUsCisJICAgICAgbHNwLT50bHZfZGF0YS5ob3N0bmFtZS0+bmFtZWxlbik7CisgICAgICB2dHlfb3V0ICh2dHksICIgIEhvc3RuYW1lOiAlcyVzIiwgaG9zdG5hbWUsIFZUWV9ORVdMSU5FKTsKICAgICB9Ci0gIH0KLSAgCisKKyAgaWYgKGxzcC0+dGx2X2RhdGEuaXB2NF9hZGRycykKKyAgICB7CisgICAgICBMSVNUX0xPT1AgKGxzcC0+dGx2X2RhdGEuaXB2NF9hZGRycywgaXB2NF9hZGRyLCBsbm9kZSkKKyAgICAgIHsKKwltZW1jcHkgKGlwdjRfYWRkcmVzcywgaW5ldF9udG9hICgqaXB2NF9hZGRyKSwgc2l6ZW9mIChpcHY0X2FkZHJlc3MpKTsKKwl2dHlfb3V0ICh2dHksICIgIElQOiAgICAgICAgJXMlcyIsIGlwdjRfYWRkcmVzcywgVlRZX05FV0xJTkUpOworICAgICAgfQorICAgIH0KKwogICAvKiBmb3IgdGhlIGludGVybmFsIHJlYWNoYWJsZSB0bHYgKi8KICAgaWYgKGxzcC0+dGx2X2RhdGEuaXB2NF9pbnRfcmVhY2hzKQotICAgIExJU1RfTE9PUChsc3AtPnRsdl9kYXRhLmlwdjRfaW50X3JlYWNocywgaXB2NF9yZWFjaCwgbG5vZGUpIHsKLSAgICAgIG1lbWNweSAoaXB2NF9yZWFjaF9wcmVmaXgsIGluZXRfbnRvYSAoaXB2NF9yZWFjaC0+cHJlZml4KSwgc2l6ZW9mIChpcHY0X3JlYWNoX3ByZWZpeCkpOwotICAgICAgbWVtY3B5IChpcHY0X3JlYWNoX21hc2ssIGluZXRfbnRvYSAoaXB2NF9yZWFjaC0+bWFzayksIHNpemVvZiAoaXB2NF9yZWFjaF9tYXNrKSk7CisgICAgTElTVF9MT09QIChsc3AtPnRsdl9kYXRhLmlwdjRfaW50X3JlYWNocywgaXB2NF9yZWFjaCwgbG5vZGUpCisgICAgeworICAgICAgbWVtY3B5IChpcHY0X3JlYWNoX3ByZWZpeCwgaW5ldF9udG9hIChpcHY0X3JlYWNoLT5wcmVmaXgpLAorCSAgICAgIHNpemVvZiAoaXB2NF9yZWFjaF9wcmVmaXgpKTsKKyAgICAgIG1lbWNweSAoaXB2NF9yZWFjaF9tYXNrLCBpbmV0X250b2EgKGlwdjRfcmVhY2gtPm1hc2spLAorCSAgICAgIHNpemVvZiAoaXB2NF9yZWFjaF9tYXNrKSk7CiAgICAgICB2dHlfb3V0ICh2dHksICIgIE1ldHJpYzogJWQgSVAgJXMgJXMlcyIsCi0gICAgICAgICAgICAgaXB2NF9yZWFjaC0+bWV0cmljcy5tZXRyaWNfZGVmYXVsdCwKLSAgICAgICAgICAgICBpcHY0X3JlYWNoX3ByZWZpeCwKLSAgICAgICAgICAgICBpcHY0X3JlYWNoX21hc2ssCi0gICAgICAgICAgICAgVlRZX05FV0xJTkUpOwotICB9CisJICAgICAgIGlwdjRfcmVhY2gtPm1ldHJpY3MubWV0cmljX2RlZmF1bHQsIGlwdjRfcmVhY2hfcHJlZml4LAorCSAgICAgICBpcHY0X3JlYWNoX21hc2ssIFZUWV9ORVdMSU5FKTsKKyAgICB9CiAKICAgLyogZm9yIHRoZSBleHRlcm5hbCByZWFjaGFibGUgdGx2ICovCiAgIGlmIChsc3AtPnRsdl9kYXRhLmlwdjRfZXh0X3JlYWNocykKLSAgICBMSVNUX0xPT1AobHNwLT50bHZfZGF0YS5pcHY0X2V4dF9yZWFjaHMsIGlwdjRfcmVhY2gsIGxub2RlKSB7Ci0gICAgICBtZW1jcHkgKGlwdjRfcmVhY2hfcHJlZml4LCBpbmV0X250b2EgKGlwdjRfcmVhY2gtPnByZWZpeCksIHNpemVvZiAoaXB2NF9yZWFjaF9wcmVmaXgpKTsKLSAgICAgIG1lbWNweSAoaXB2NF9yZWFjaF9tYXNrLCBpbmV0X250b2EgKGlwdjRfcmVhY2gtPm1hc2spLCBzaXplb2YgKGlwdjRfcmVhY2hfbWFzaykpOworICAgIExJU1RfTE9PUCAobHNwLT50bHZfZGF0YS5pcHY0X2V4dF9yZWFjaHMsIGlwdjRfcmVhY2gsIGxub2RlKQorICAgIHsKKyAgICAgIG1lbWNweSAoaXB2NF9yZWFjaF9wcmVmaXgsIGluZXRfbnRvYSAoaXB2NF9yZWFjaC0+cHJlZml4KSwKKwkgICAgICBzaXplb2YgKGlwdjRfcmVhY2hfcHJlZml4KSk7CisgICAgICBtZW1jcHkgKGlwdjRfcmVhY2hfbWFzaywgaW5ldF9udG9hIChpcHY0X3JlYWNoLT5tYXNrKSwKKwkgICAgICBzaXplb2YgKGlwdjRfcmVhY2hfbWFzaykpOwogICAgICAgdnR5X291dCAodnR5LCAiICBNZXRyaWM6ICVkIElQLUV4dGVybmFsICVzICVzJXMiLAotICAgICAgICAgICAgIGlwdjRfcmVhY2gtPm1ldHJpY3MubWV0cmljX2RlZmF1bHQsCi0gICAgICAgICAgICAgaXB2NF9yZWFjaF9wcmVmaXgsCi0gICAgICAgICAgICAgaXB2NF9yZWFjaF9tYXNrLAotICAgICAgICAgICAgIFZUWV9ORVdMSU5FKTsKLSAgfQorCSAgICAgICBpcHY0X3JlYWNoLT5tZXRyaWNzLm1ldHJpY19kZWZhdWx0LCBpcHY0X3JlYWNoX3ByZWZpeCwKKwkgICAgICAgaXB2NF9yZWFjaF9tYXNrLCBWVFlfTkVXTElORSk7CisgICAgfQogCiAgIC8qIGZvciB0aGUgSVMgbmVpZ2hib3IgdGx2ICovCi0gIGlmIChsc3AtPnRsdl9kYXRhLmlzX25laWdocykgewotICAgIExJU1RfTE9PUChsc3AtPnRsdl9kYXRhLmlzX25laWdocyxpc19uZWlnaCxsbm9kZSkgewotICAgICAgbHNwaWRfcHJpbnQgKGlzX25laWdoLT5uZWlnaF9pZCwgTFNQaWQsIGR5bmhvc3QsIDApOwotICAgICAgdnR5X291dCAodnR5LCAiICBNZXRyaWM6ICVkIElTICVzJXMiLAotICAgICAgICAgICAgICBpc19uZWlnaC0+bWV0cmljcy5tZXRyaWNfZGVmYXVsdCwKLSAgICAgICAgICAgICAgTFNQaWQsCi0gICAgICAgICAgICAgIFZUWV9ORVdMSU5FKTsKKyAgaWYgKGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzKQorICAgIHsKKyAgICAgIExJU1RfTE9PUCAobHNwLT50bHZfZGF0YS5pc19uZWlnaHMsIGlzX25laWdoLCBsbm9kZSkKKyAgICAgIHsKKwlsc3BpZF9wcmludCAoaXNfbmVpZ2gtPm5laWdoX2lkLCBMU1BpZCwgZHluaG9zdCwgMCk7CisJdnR5X291dCAodnR5LCAiICBNZXRyaWM6ICVkIElTICVzJXMiLAorCQkgaXNfbmVpZ2gtPm1ldHJpY3MubWV0cmljX2RlZmF1bHQsIExTUGlkLCBWVFlfTkVXTElORSk7CisgICAgICB9CiAgICAgfQotICB9CiAKICAgLyogSVB2NiB0bHYgKi8KICNpZmRlZiBIQVZFX0lQVjYKICAgaWYgKGxzcC0+dGx2X2RhdGEuaXB2Nl9yZWFjaHMpCi0gICAgTElTVF9MT09QKGxzcC0+dGx2X2RhdGEuaXB2Nl9yZWFjaHMsIGlwdjZfcmVhY2gsIGxub2RlKSB7Ci0gICAgICBtZW1zZXQoJmluNiwgMCwgc2l6ZW9mKGluNikpOwotICAgICAgbWVtY3B5IChpbjYuczZfYWRkciwgaXB2Nl9yZWFjaC0+cHJlZml4LCBQU0laRShpcHY2X3JlYWNoLT5wcmVmaXhfbGVuKSk7CisgICAgTElTVF9MT09QIChsc3AtPnRsdl9kYXRhLmlwdjZfcmVhY2hzLCBpcHY2X3JlYWNoLCBsbm9kZSkKKyAgICB7CisgICAgICBtZW1zZXQgKCZpbjYsIDAsIHNpemVvZiAoaW42KSk7CisgICAgICBtZW1jcHkgKGluNi5zNl9hZGRyLCBpcHY2X3JlYWNoLT5wcmVmaXgsCisJICAgICAgUFNJWkUgKGlwdjZfcmVhY2gtPnByZWZpeF9sZW4pKTsKICAgICAgIGluZXRfbnRvcCAoQUZfSU5FVDYsICZpbjYsIGJ1ZmYsIEJVRlNJWik7CiAgICAgICBpZiAoKGlwdjZfcmVhY2gtPmNvbnRyb2xfaW5mbyAmJgotICAgICAgICAgICAgQ1RSTF9JTkZPX0RJU1RSSUJVVElPTikgPT0gRElTVFJJQlVUSU9OX0lOVEVSTkFMKQotICAgICAgICB2dHlfb3V0ICh2dHksICIgIE1ldHJpYzogJWQgSVB2Ni1JbnRlcm4gJXMvJWQlcyIsCi0gICAgICAgICAgICAgICBudG9obCAoaXB2Nl9yZWFjaC0+bWV0cmljKSwKLSAgICAgICAgICAgICAgIGJ1ZmYsCi0gICAgICAgICAgICAgICBpcHY2X3JlYWNoLT5wcmVmaXhfbGVuLAotICAgICAgICAgICAgICAgVlRZX05FV0xJTkUpOworCSAgIENUUkxfSU5GT19ESVNUUklCVVRJT04pID09IERJU1RSSUJVVElPTl9JTlRFUk5BTCkKKwl2dHlfb3V0ICh2dHksICIgIE1ldHJpYzogJWQgSVB2Ni1JbnRlcm4gJXMvJWQlcyIsCisJCSBudG9obCAoaXB2Nl9yZWFjaC0+bWV0cmljKSwKKwkJIGJ1ZmYsIGlwdjZfcmVhY2gtPnByZWZpeF9sZW4sIFZUWV9ORVdMSU5FKTsKICAgICAgIGVsc2UKLSAgICAgICAgdnR5X291dCAodnR5LCAiICBNZXRyaWM6ICVkIElQdjYtRXh0ZXJuICVzLyVkJXMiLAotICAgICAgICAgICAgICAgbnRvaGwgKGlwdjZfcmVhY2gtPm1ldHJpYyksCi0gICAgICAgICAgICAgICBidWZmLAotICAgICAgICAgICAgICAgaXB2Nl9yZWFjaC0+cHJlZml4X2xlbiwKLSAgICAgICAgICAgICAgIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0ICh2dHksICIgIE1ldHJpYzogJWQgSVB2Ni1FeHRlcm4gJXMvJWQlcyIsCisJCSBudG9obCAoaXB2Nl9yZWFjaC0+bWV0cmljKSwKKwkJIGJ1ZmYsIGlwdjZfcmVhY2gtPnByZWZpeF9sZW4sIFZUWV9ORVdMSU5FKTsKICAgICB9CiAjZW5kaWYKIAogLyogRklYTUU6IE90aGVyIHRsdnMgc3VjaCBhcyB0ZSBvciBleHRlcm5hbCB0bHYgd2lsbCBiZSBhZGRlZCBsYXRlciAqLwotI2lmIDAgIAorI2lmIDAKICAgdnR5X291dCAodnR5LCAiJXMgICVzICVjJXMiLAotCSAgIFZUWV9ORVdMSU5FLAotCSAgIExTUGlkLAotCSAgIGxzcC0+b3duX2xzcCA/ICcqJyA6ICcgJywKLQkgICBWVFlfTkVXTElORSk7CisJICAgVlRZX05FV0xJTkUsIExTUGlkLCBsc3AtPm93bl9sc3AgPyAnKicgOiAnICcsIFZUWV9ORVdMSU5FKTsKIAogICB2dHlfb3V0ICh2dHksICIgICAgU2VxdWVuY2U6IDB4JTA4eCBDaGVja3N1bTogMHglMDR4IExpZmV0aW1lOiAiLAogCSAgIG50b2hsIChsc3AtPmxzcF9oZWFkZXItPnNlcV9udW0pLApAQCAtODQ2LDggKzg1Nyw3IEBACiAgICAgdnR5X291dCAodnR5LCAiJTV1ICIsIG50b2hzIChsc3AtPmxzcF9oZWFkZXItPnJlbV9saWZldGltZSkpOwogCiAgIHZ0eV9vdXQgKHZ0eSwgIiVzICAgIEF0dHJpYnV0ZXM6JXMiLAotCSAgIFZUWV9ORVdMSU5FLAotCSAgIGxzcF9iaXRzMnN0cmluZyAoJmxzcC0+bHNwX2hlYWRlci0+bHNwX2JpdHMpKTsKKwkgICBWVFlfTkVXTElORSwgbHNwX2JpdHMyc3RyaW5nICgmbHNwLT5sc3BfaGVhZGVyLT5sc3BfYml0cykpOwogCiAgIC8qIGlmIHRoaXMgaXMgYSBzZWxmIG9yaWdpbmF0ZWQgTFNQIHRoZW4gcHJpbnQKICAgICogdGhlIGdlbmVyYXRpb24gdGltZSBwbHVzIHdoZW4gd2Ugc2VudCBpdCBsYXN0CkBAIC04NTUsMTUyICs4NjUsMTU4IEBACiAgICAqIHRpbWUgd2hlbiB0aGUgTFNQIGhhcyBiZWVuIGluc3RhbGxlZAogICAgKi8KIAotICBpZiAobHNwLT5vd25fbHNwKSB7CisgIGlmIChsc3AtPm93bl9sc3ApCisgICAgewogCi0gICAgbm93ID0gdGltZSAoTlVMTCk7Ci0gICAgaGVscGVyID0gbm93IC0gbHNwLT5sYXN0X2dlbmVyYXRlZDsKLSAgICBpZiAoIWxzcC0+bGFzdF9nZW5lcmF0ZWQpCi0gICAgICBoZWxwZXIgPSAwOworICAgICAgbm93ID0gdGltZSAoTlVMTCk7CisgICAgICBoZWxwZXIgPSBub3cgLSBsc3AtPmxhc3RfZ2VuZXJhdGVkOworICAgICAgaWYgKCFsc3AtPmxhc3RfZ2VuZXJhdGVkKQorCWhlbHBlciA9IDA7CiAKLSAgICB2dHlfb3V0ICh2dHksICIsIEdlbmVyYXRlZDogJXMgYWdvIiwKLQkgICAgIHRpbWUyc3RyaW5nIChoZWxwZXIpKTsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIiwgR2VuZXJhdGVkOiAlcyBhZ28iLCB0aW1lMnN0cmluZyAoaGVscGVyKSk7CiAKLSAgICBub3cgPSB0aW1lIChOVUxMKTsKLSAgICBoZWxwZXIgPSBub3cgLSBsc3AtPmxhc3Rfc2VudDsKLSAgICBpZiAoIWxzcC0+bGFzdF9zZW50KQotICAgICAgaGVscGVyID0gMDsKKyAgICAgIG5vdyA9IHRpbWUgKE5VTEwpOworICAgICAgaGVscGVyID0gbm93IC0gbHNwLT5sYXN0X3NlbnQ7CisgICAgICBpZiAoIWxzcC0+bGFzdF9zZW50KQorCWhlbHBlciA9IDA7CiAKLSAgICB2dHlfb3V0ICh2dHksICIsIExhc3Qgc2VudDogJXMgYWdvIiwKLQkgICAgIHRpbWUyc3RyaW5nIChoZWxwZXIpKTsKLSAgfSBlbHNlIHsKLSAgICBub3cgPSB0aW1lIChOVUxMKTsKLSAgICBoZWxwZXIgPSBub3cgLSBsc3AtPmluc3RhbGxlZDsKLSAgICBpZiAoIWxzcC0+aW5zdGFsbGVkKQotICAgICAgaGVscGVyID0gMDsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIiwgTGFzdCBzZW50OiAlcyBhZ28iLCB0aW1lMnN0cmluZyAoaGVscGVyKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbm93ID0gdGltZSAoTlVMTCk7CisgICAgICBoZWxwZXIgPSBub3cgLSBsc3AtPmluc3RhbGxlZDsKKyAgICAgIGlmICghbHNwLT5pbnN0YWxsZWQpCisJaGVscGVyID0gMDsKIAotICAgIHZ0eV9vdXQgKHZ0eSwgIiwgSW5zdGFsbGVkOiAlcyBhZ28iLAotCSAgICAgdGltZTJzdHJpbmcgKGhlbHBlcikpOworICAgICAgdnR5X291dCAodnR5LCAiLCBJbnN0YWxsZWQ6ICVzIGFnbyIsIHRpbWUyc3RyaW5nIChoZWxwZXIpKTsKIAotICB9CisgICAgfQogCiAgIHZ0eV9vdXQgKHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOwogCi0gIGlmIChsc3AtPnRsdl9kYXRhLm5scGlkcykgIHsKLSAgICB2dHlfb3V0ICh2dHksICIgICAgU3BlYWtzOiAlcyVzIiwgbmxwaWQyc3RyaW5nIChsc3AtPnRsdl9kYXRhLm5scGlkcyksIAotICAgICAgICAgICAgIFZUWV9ORVdMSU5FKTsKLSAgfQorICBpZiAobHNwLT50bHZfZGF0YS5ubHBpZHMpCisgICAgeworICAgICAgdnR5X291dCAodnR5LCAiICAgIFNwZWFrczogJXMlcyIsIG5scGlkMnN0cmluZyAobHNwLT50bHZfZGF0YS5ubHBpZHMpLAorCSAgICAgICBWVFlfTkVXTElORSk7CisgICAgfQogCi0gIGlmIChsc3AtPnRsdl9kYXRhLnJvdXRlcl9pZCkgIHsKLSAgICB2dHlfb3V0ICh2dHksICIgICAgIFJvdXRlciBJRDogJXMlcyIsIAotICAgICAgICAgICAgIGluZXRfbnRvYSAobHNwLT50bHZfZGF0YS5yb3V0ZXJfaWQtPmlkKSwgVlRZX05FV0xJTkUpOwotICB9CisgIGlmIChsc3AtPnRsdl9kYXRhLnJvdXRlcl9pZCkKKyAgICB7CisgICAgICB2dHlfb3V0ICh2dHksICIgICAgIFJvdXRlciBJRDogJXMlcyIsCisJICAgICAgIGluZXRfbnRvYSAobHNwLT50bHZfZGF0YS5yb3V0ZXJfaWQtPmlkKSwgVlRZX05FV0xJTkUpOworICAgIH0KIAogICBpZiAobHNwLT50bHZfZGF0YS5pc19uZWlnaHMpCi0gIExJU1RfTE9PUChsc3AtPnRsdl9kYXRhLmlzX25laWdocyxpc19uZWlnaCxsbm9kZSkgewotICAgIGxzcGlkX3ByaW50IChpc19uZWlnaC0+bmVpZ2hfaWQsIExTUGlkLCBkeW5ob3N0LCAwKTsKLSAgICB2dHlfb3V0ICh2dHksICIgICAgIElTICAgICAgJXMsIE1ldHJpYzogJWQlcyIsCi0gICAgICAgICAgICAgTFNQaWQsCi0JICAgICBpc19uZWlnaC0+bWV0cmljcy5tZXRyaWNfZGVmYXVsdCwKLQkgICAgIFZUWV9ORVdMSU5FKTsKLSAgfQorICAgIExJU1RfTE9PUCAobHNwLT50bHZfZGF0YS5pc19uZWlnaHMsIGlzX25laWdoLCBsbm9kZSkKKyAgICB7CisgICAgICBsc3BpZF9wcmludCAoaXNfbmVpZ2gtPm5laWdoX2lkLCBMU1BpZCwgZHluaG9zdCwgMCk7CisgICAgICB2dHlfb3V0ICh2dHksICIgICAgIElTICAgICAgJXMsIE1ldHJpYzogJWQlcyIsCisJICAgICAgIExTUGlkLCBpc19uZWlnaC0+bWV0cmljcy5tZXRyaWNfZGVmYXVsdCwgVlRZX05FV0xJTkUpOworICAgIH0KIAogICBpZiAobHNwLT50bHZfZGF0YS50ZV9pc19uZWlnaHMpCi0gICAgTElTVF9MT09QKGxzcC0+dGx2X2RhdGEudGVfaXNfbmVpZ2hzLHRlX2lzX25laWdoLGxub2RlKSB7Ci0gICAgLyogRklYTUU6IG1ldHJpYyBkaXNwbGF5IGlzIHdyb25nICovCi0gICAgbHNwaWRfcHJpbnQgKHRlX2lzX25laWdoLT5uZWlnaF9pZCwgTFNQaWQsIGR5bmhvc3QsIDApOwotICAgIHZ0eV9vdXQgKHZ0eSwgIiAgICAgZXh0ZC1JUyAlcywgTWV0cmljOiAlZCVzIiwKLSAgICAgICAgICAgICBMU1BpZCwJICAgICAKLQkgICAgIHRlX2lzX25laWdoLT50ZV9tZXRyaWNbMF0sCi0JICAgICBWVFlfTkVXTElORSk7Ci0gIH0KKyAgICBMSVNUX0xPT1AgKGxzcC0+dGx2X2RhdGEudGVfaXNfbmVpZ2hzLCB0ZV9pc19uZWlnaCwgbG5vZGUpCisgICAgeworICAgICAgLyogRklYTUU6IG1ldHJpYyBkaXNwbGF5IGlzIHdyb25nICovCisgICAgICBsc3BpZF9wcmludCAodGVfaXNfbmVpZ2gtPm5laWdoX2lkLCBMU1BpZCwgZHluaG9zdCwgMCk7CisgICAgICB2dHlfb3V0ICh2dHksICIgICAgIGV4dGQtSVMgJXMsIE1ldHJpYzogJWQlcyIsCisJICAgICAgIExTUGlkLCB0ZV9pc19uZWlnaC0+dGVfbWV0cmljWzBdLCBWVFlfTkVXTElORSk7CisgICAgfQogCiAgIGlmIChsc3AtPnRsdl9kYXRhLmlwdjRfaW50X3JlYWNocykKLSAgICBMSVNUX0xPT1AobHNwLT50bHZfZGF0YS5pcHY0X2ludF9yZWFjaHMsIGlwdjRfcmVhY2gsIGxub2RlKSB7Ci0gICAgdnR5X291dCAodnR5LCAiICAgICBpbnQtSVAgICVzLyVkLCBNZXRyaWM6ICVkJXMiLAotICAgICAgICAgICAgIGluZXRfbnRvYSAoaXB2NF9yZWFjaC0+cHJlZml4KSwKLQkgICAgIGlwX21hc2tsZW4gKGlwdjRfcmVhY2gtPm1hc2spLAotCSAgICAgaXB2NF9yZWFjaC0+bWV0cmljcy5tZXRyaWNfZGVmYXVsdCwKLQkgICAgIFZUWV9ORVdMSU5FKTsKLSAgfQorICAgIExJU1RfTE9PUCAobHNwLT50bHZfZGF0YS5pcHY0X2ludF9yZWFjaHMsIGlwdjRfcmVhY2gsIGxub2RlKQorICAgIHsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIiAgICAgaW50LUlQICAlcy8lZCwgTWV0cmljOiAlZCVzIiwKKwkgICAgICAgaW5ldF9udG9hIChpcHY0X3JlYWNoLT5wcmVmaXgpLAorCSAgICAgICBpcF9tYXNrbGVuIChpcHY0X3JlYWNoLT5tYXNrKSwKKwkgICAgICAgaXB2NF9yZWFjaC0+bWV0cmljcy5tZXRyaWNfZGVmYXVsdCwgVlRZX05FV0xJTkUpOworICAgIH0KIAogICBpZiAobHNwLT50bHZfZGF0YS5pcHY0X2V4dF9yZWFjaHMpCi0gICAgTElTVF9MT09QKGxzcC0+dGx2X2RhdGEuaXB2NF9leHRfcmVhY2hzLGlwdjRfcmVhY2gsbG5vZGUpIHsKLSAgICB2dHlfb3V0ICh2dHksICIgICAgIGV4dC1JUCAgJXMvJWQsIE1ldHJpYzogJWQlcyIsCi0gICAgICAgICAgICAgaW5ldF9udG9hKGlwdjRfcmVhY2gtPnByZWZpeCksCi0JICAgICBpcF9tYXNrbGVuKGlwdjRfcmVhY2gtPm1hc2spLAotCSAgICAgaXB2NF9yZWFjaC0+bWV0cmljcy5tZXRyaWNfZGVmYXVsdCwKLQkgICAgIFZUWV9ORVdMSU5FKTsKLSAgfQorICAgIExJU1RfTE9PUCAobHNwLT50bHZfZGF0YS5pcHY0X2V4dF9yZWFjaHMsIGlwdjRfcmVhY2gsIGxub2RlKQorICAgIHsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIiAgICAgZXh0LUlQICAlcy8lZCwgTWV0cmljOiAlZCVzIiwKKwkgICAgICAgaW5ldF9udG9hIChpcHY0X3JlYWNoLT5wcmVmaXgpLAorCSAgICAgICBpcF9tYXNrbGVuIChpcHY0X3JlYWNoLT5tYXNrKSwKKwkgICAgICAgaXB2NF9yZWFjaC0+bWV0cmljcy5tZXRyaWNfZGVmYXVsdCwgVlRZX05FV0xJTkUpOworICAgIH0KIAogICBpZiAobHNwLT50bHZfZGF0YS50ZV9pcHY0X3JlYWNocykKLSAgICBMSVNUX0xPT1AobHNwLT50bHZfZGF0YS50ZV9pcHY0X3JlYWNocyx0ZV9pcHY0X3JlYWNoLGxub2RlKSB7Ci0gICAgdnR5X291dCAodnR5LCAiICAgICBleHRkLUlQICVzLyVkLCBNZXRyaWM6ICVkJXMiLAotICAgICAgICAgICAgIGluZXRfbnRvYSAoIG5ld3ByZWZpeDJpbmFkZHIgKCZ0ZV9pcHY0X3JlYWNoLT5wcmVmaXhfc3RhcnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlX2lwdjRfcmVhY2gtPmNvbnRyb2wpKSwKLSAgICAgICAgICAgICB0ZV9pcHY0X3JlYWNoLT5jb250cm9sICYgMHgzRiwKLQkgICAgIG50b2hsICh0ZV9pcHY0X3JlYWNoLT50ZV9tZXRyaWMpLAotCSAgICAgVlRZX05FV0xJTkUpOwotICB9CisgICAgTElTVF9MT09QIChsc3AtPnRsdl9kYXRhLnRlX2lwdjRfcmVhY2hzLCB0ZV9pcHY0X3JlYWNoLCBsbm9kZSkKKyAgICB7CisgICAgICB2dHlfb3V0ICh2dHksICIgICAgIGV4dGQtSVAgJXMvJWQsIE1ldHJpYzogJWQlcyIsCisJICAgICAgIGluZXRfbnRvYSAobmV3cHJlZml4MmluYWRkciAoJnRlX2lwdjRfcmVhY2gtPnByZWZpeF9zdGFydCwKKwkJCQkJICAgIHRlX2lwdjRfcmVhY2gtPmNvbnRyb2wpKSwKKwkgICAgICAgdGVfaXB2NF9yZWFjaC0+Y29udHJvbCAmIDB4M0YsCisJICAgICAgIG50b2hsICh0ZV9pcHY0X3JlYWNoLT50ZV9tZXRyaWMpLCBWVFlfTkVXTElORSk7CisgICAgfQogCiAjaWZkZWYgSEFWRV9JUFY2CiAgIGlmIChsc3AtPnRsdl9kYXRhLmlwdjZfcmVhY2hzKQotICAgIExJU1RfTE9PUChsc3AtPnRsdl9kYXRhLmlwdjZfcmVhY2hzLCBpcHY2X3JlYWNoLCBsbm9kZSkgewotICAgIG1lbWNweSAoaW42LnM2X2FkZHIsIGlwdjZfcmVhY2gtPnByZWZpeCwgMTYpOwotICAgIGluZXRfbnRvcCAoQUZfSU5FVDYsICZpbjYsIGJ1ZmYsIEJVRlNJWik7Ci0gICAgaWYgKChpcHY2X3JlYWNoLT5jb250cm9sX2luZm8gJiYgIAotICAgICAgICBDVFJMX0lORk9fRElTVFJJQlVUSU9OKSA9PSBESVNUUklCVVRJT05fSU5URVJOQUwpCi0gICAgICB2dHlfb3V0ICh2dHksICIgICAgIGludC1JUHY2ICVzLyVkLCBNZXRyaWM6ICVkJXMiLAotICAgICAgICAgICAgICAgYnVmZiwKLSAgICAgICAgICAgICAgIGlwdjZfcmVhY2gtPnByZWZpeF9sZW4sCi0gICAgICAgICAgICAgICBudG9obCAoaXB2Nl9yZWFjaC0+bWV0cmljKSwKLSAgICAgICAgICAgICAgIFZUWV9ORVdMSU5FKTsKLSAgICBlbHNlCi0gICAgICB2dHlfb3V0ICh2dHksICIgICAgIGV4dC1JUHY2ICVzLyVkLCBNZXRyaWM6ICVkJXMiLAotICAgICAgICAgICAgICAgYnVmZiwKLSAgICAgICAgICAgICAgIGlwdjZfcmVhY2gtPnByZWZpeF9sZW4sCi0gICAgICAgICAgICAgICBudG9obCAoaXB2Nl9yZWFjaC0+bWV0cmljKSwKLSAgICAgICAgICAgICAgIFZUWV9ORVdMSU5FKTsKLSAgICAKLSAgfQorICAgIExJU1RfTE9PUCAobHNwLT50bHZfZGF0YS5pcHY2X3JlYWNocywgaXB2Nl9yZWFjaCwgbG5vZGUpCisgICAgeworICAgICAgbWVtY3B5IChpbjYuczZfYWRkciwgaXB2Nl9yZWFjaC0+cHJlZml4LCAxNik7CisgICAgICBpbmV0X250b3AgKEFGX0lORVQ2LCAmaW42LCBidWZmLCBCVUZTSVopOworICAgICAgaWYgKChpcHY2X3JlYWNoLT5jb250cm9sX2luZm8gJiYKKwkgICBDVFJMX0lORk9fRElTVFJJQlVUSU9OKSA9PSBESVNUUklCVVRJT05fSU5URVJOQUwpCisJdnR5X291dCAodnR5LCAiICAgICBpbnQtSVB2NiAlcy8lZCwgTWV0cmljOiAlZCVzIiwKKwkJIGJ1ZmYsCisJCSBpcHY2X3JlYWNoLT5wcmVmaXhfbGVuLAorCQkgbnRvaGwgKGlwdjZfcmVhY2gtPm1ldHJpYyksIFZUWV9ORVdMSU5FKTsKKyAgICAgIGVsc2UKKwl2dHlfb3V0ICh2dHksICIgICAgIGV4dC1JUHY2ICVzLyVkLCBNZXRyaWM6ICVkJXMiLAorCQkgYnVmZiwKKwkJIGlwdjZfcmVhY2gtPnByZWZpeF9sZW4sCisJCSBudG9obCAoaXB2Nl9yZWFjaC0+bWV0cmljKSwgVlRZX05FV0xJTkUpOworCisgICAgfQogI2VuZGlmCi0gIGlmIChsc3AtPnRsdl9kYXRhLmhvc3RuYW1lKSB7Ci0gICAgbWVtc2V0IChob3N0bmFtZSwgMCwgc2l6ZW9mIChob3N0bmFtZSkpOwotICAgIG1lbWNweSAoaG9zdG5hbWUsIGxzcC0+dGx2X2RhdGEuaG9zdG5hbWUtPm5hbWUsCi0gICAgICAgICAgICBsc3AtPnRsdl9kYXRhLmhvc3RuYW1lLT5uYW1lbGVuKTsKLSAgICB2dHlfb3V0ICh2dHksICIgICAgSG9zdG5hbWU6ICVzJXMiLCBob3N0bmFtZSwgVlRZX05FV0xJTkUpOwotICB9CisgIGlmIChsc3AtPnRsdl9kYXRhLmhvc3RuYW1lKQorICAgIHsKKyAgICAgIG1lbXNldCAoaG9zdG5hbWUsIDAsIHNpemVvZiAoaG9zdG5hbWUpKTsKKyAgICAgIG1lbWNweSAoaG9zdG5hbWUsIGxzcC0+dGx2X2RhdGEuaG9zdG5hbWUtPm5hbWUsCisJICAgICAgbHNwLT50bHZfZGF0YS5ob3N0bmFtZS0+bmFtZWxlbik7CisgICAgICB2dHlfb3V0ICh2dHksICIgICAgSG9zdG5hbWU6ICVzJXMiLCBob3N0bmFtZSwgVlRZX05FV0xJTkUpOworICAgIH0KICNlbmRpZgotIHJldHVybjsKKyAgcmV0dXJuOwogfQogCiAvKiBwcmludCBhbGwgdGhlIGxzcHMgaW5mbyBpbiB0aGUgbG9jYWwgbHNwZGIgKi8KLWludCAKLWxzcF9wcmludF9hbGwgKHN0cnVjdCB2dHkgKnZ0eSwgZGljdF90ICpsc3BkYiwgY2hhciBkZXRhaWwsIGNoYXIgZHluaG9zdCkKK2ludAorbHNwX3ByaW50X2FsbCAoc3RydWN0IHZ0eSAqdnR5LCBkaWN0X3QgKiBsc3BkYiwgY2hhciBkZXRhaWwsIGNoYXIgZHluaG9zdCkKIHsKIAotICBkbm9kZV90ICpub2RlID0gZGljdF9maXJzdChsc3BkYiksICpuZXh0OworICBkbm9kZV90ICpub2RlID0gZGljdF9maXJzdCAobHNwZGIpLCAqbmV4dDsKICAgaW50IGxzcF9jb3VudCA9IDA7CiAKICAgLyogcHJpbnQgdGhlIHRpdGxlLCBmb3IgYm90aCBtb2RlcyAqLwogICB2dHlfb3V0ICh2dHksICJMU1AgSUQgICAgICAgICAgICAgICAgICAgTFNQIFNlcSBOdW0gIExTUCBDaGVja3N1bSAiCi0gICAgICAgICAgICAgIkxTUCBIb2xkdGltZSBBVFQvUC9PTCVzIiwgVlRZX05FV0xJTkUpOwotICAgICAgICAgICAgIAotICBpZiAoZGV0YWlsID09IElTSVNfVUlfTEVWRUxfQlJJRUYpIHsKLSAgICB3aGlsZSAobm9kZSAhPSBOVUxMKSB7Ci0gICAgICAvKiBkaWN0X2NvbnRhaW5zIChsc3BkYiwgbm9kZSk7ICovIC8qIEkgdGhpbmsgaXQgaXMgdW5uZWNlc3NhcnksIHNvIEkgY29tbWVudCBpdCBvdXQgKi8KLSAgICAgIG5leHQgPSBkaWN0X25leHQgKGxzcGRiLCBub2RlKTsKLSAgICAgIGxzcF9wcmludCAobm9kZSwgdnR5LCBkeW5ob3N0KTsKLSAgICAgIG5vZGUgPSBuZXh0OwotICAgICAgbHNwX2NvdW50Kys7CisJICAgIkxTUCBIb2xkdGltZSBBVFQvUC9PTCVzIiwgVlRZX05FV0xJTkUpOworCisgIGlmIChkZXRhaWwgPT0gSVNJU19VSV9MRVZFTF9CUklFRikKKyAgICB7CisgICAgICB3aGlsZSAobm9kZSAhPSBOVUxMKQorCXsKKwkgIC8qIEkgdGhpbmsgaXQgaXMgdW5uZWNlc3NhcnksIHNvIEkgY29tbWVudCBpdCBvdXQgKi8KKwkgIC8qIGRpY3RfY29udGFpbnMgKGxzcGRiLCBub2RlKTsgKi8KKwkgIG5leHQgPSBkaWN0X25leHQgKGxzcGRiLCBub2RlKTsKKwkgIGxzcF9wcmludCAobm9kZSwgdnR5LCBkeW5ob3N0KTsKKwkgIG5vZGUgPSBuZXh0OworCSAgbHNwX2NvdW50Kys7CisJfQogICAgIH0KLSAgfSBlbHNlIGlmIChkZXRhaWwgPT0gSVNJU19VSV9MRVZFTF9ERVRBSUwpIHsKLSAgICB3aGlsZSAobm9kZSAhPSBOVUxMKSB7Ci0gICAgICBuZXh0ID0gZGljdF9uZXh0IChsc3BkYiwgbm9kZSk7Ci0gICAgICBsc3BfcHJpbnRfZGV0YWlsIChub2RlLCB2dHksIGR5bmhvc3QpOwotICAgICAgbm9kZSA9IG5leHQ7Ci0gICAgICBsc3BfY291bnQrKzsKKyAgZWxzZSBpZiAoZGV0YWlsID09IElTSVNfVUlfTEVWRUxfREVUQUlMKQorICAgIHsKKyAgICAgIHdoaWxlIChub2RlICE9IE5VTEwpCisJeworCSAgbmV4dCA9IGRpY3RfbmV4dCAobHNwZGIsIG5vZGUpOworCSAgbHNwX3ByaW50X2RldGFpbCAobm9kZSwgdnR5LCBkeW5ob3N0KTsKKwkgIG5vZGUgPSBuZXh0OworCSAgbHNwX2NvdW50Kys7CisJfQogICAgIH0KLSAgfQogCiAgIHJldHVybiBsc3BfY291bnQ7CiB9CkBAIC0xMDA5LDMxICsxMDI1LDMwIEBACiAgKiBzaXplIG9mIG1lbW9yeSwgaXQgc2NhbnMgdGhlIGxzcCBhbmQgbW92ZXMgYWxsIHBvaW50ZXJzIHRoZQogICogd2F5IHRoZXkgc2hvdWxkICovCiB1X2NoYXIgKgotbHNwcGR1X3JlYWxsb2MgKHN0cnVjdCBpc2lzX2xzcCAqbHNwLCBpbnQgbWVtb3J5dHlwZSwgaW50IHNpemUpCitsc3BwZHVfcmVhbGxvYyAoc3RydWN0IGlzaXNfbHNwICogbHNwLCBpbnQgbWVtb3J5dHlwZSwgaW50IHNpemUpCiB7CiAgIHVfY2hhciAqcmV0dmFsOwotICAKLSAgcmV0dmFsID0gU1RSRUFNX0RBVEEobHNwLT5wZHUpICsgbnRvaHMobHNwLT5sc3BfaGVhZGVyLT5wZHVfbGVuKTsKKworICByZXR2YWwgPSBTVFJFQU1fREFUQSAobHNwLT5wZHUpICsgbnRvaHMgKGxzcC0+bHNwX2hlYWRlci0+cGR1X2xlbik7CiAjaWZkZWYgICBMU1BfTUVNT1JZX1BSRUFTU0lHTgotICBsc3AtPmxzcF9oZWFkZXItPnBkdV9sZW4gPSBodG9ucyhudG9ocyhsc3AtPmxzcF9oZWFkZXItPnBkdV9sZW4pICsgc2l6ZSk7CisgIGxzcC0+bHNwX2hlYWRlci0+cGR1X2xlbiA9IGh0b25zIChudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5wZHVfbGVuKSArIHNpemUpOwogICByZXR1cm4gcmV0dmFsOwotI2Vsc2UgICAgLyogb3RoZXJ3aXNlIHdlIGhhdmUgdG8gbW92ZSBhbGwgcG9pbnRlcnMgKi8KKyNlbHNlIC8qIG90aGVyd2lzZSB3ZSBoYXZlIHRvIG1vdmUgYWxsIHBvaW50ZXJzICovCiAgIHVfY2hhciAqbmV3cGR1OwogICBuZXdwZHUgPSBzdHJlYW1fbmV3IChudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5wZHVfbGVuKSArIHNpemUpOwotICBtZW1jcHkgKFNUUkVBTV9EQVRBIChuZXdwZHUpLCBTVFJFQU1fREFUQShsc3AtPnBkdSksIAotICAgICAgICAgIG50b2hzIChsc3AtPmxzcF9oZWFkZXItPnBkdV9sZW4pKTsKKyAgbWVtY3B5IChTVFJFQU1fREFUQSAobmV3cGR1KSwgU1RSRUFNX0RBVEEgKGxzcC0+cGR1KSwKKwkgIG50b2hzIChsc3AtPmxzcF9oZWFkZXItPnBkdV9sZW4pKTsKICAgWEZSRUUgKG1lbW9yeXR5cGUsIGxzcC0+cGR1KTsKICAgbHNwLT5wZHUgPSBuZXdwZHU7Ci0gIGxzcC0+aXNpc19oZWFkZXIgPSAoc3RydWN0IGlzaXNfZml4ZWRfaGRyKilTVFJFQU1fREFUQShsc3AtPnBkdSk7Ci0gIGxzcC0+bHNwX2hlYWRlciA9IChzdHJ1Y3QgaXNpc19saW5rX3N0YXRlX2hkciopCi0gICAgICAgICAgICAgICAgICAgIChTVFJFQU1fREFUQShsc3AtPnBkdSkgKyBJU0lTX0ZJWEVEX0hEUl9MRU4pOworICBsc3AtPmlzaXNfaGVhZGVyID0gKHN0cnVjdCBpc2lzX2ZpeGVkX2hkciAqKSBTVFJFQU1fREFUQSAobHNwLT5wZHUpOworICBsc3AtPmxzcF9oZWFkZXIgPSAoc3RydWN0IGlzaXNfbGlua19zdGF0ZV9oZHIgKikKKyAgICAoU1RSRUFNX0RBVEEgKGxzcC0+cGR1KSArIElTSVNfRklYRURfSERSX0xFTik7CiAgIGh0b25zIChudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5wZHVfbGVuKSArPSBzaXplKTsKLSAgcmV0dXJuIFNUUkVBTV9EQVRBKGxzcC0+cGR1KSArIChsc3AtPmxzcF9oZWFkZXItPnBkdV9sZW4gLSBzaXplKTsKKyAgcmV0dXJuIFNUUkVBTV9EQVRBIChsc3AtPnBkdSkgKyAobHNwLT5sc3BfaGVhZGVyLT5wZHVfbGVuIC0gc2l6ZSk7CiAjZW5kaWYgLyogTFNQX01FTU9SWV9QUkVBU1NJR04gKi8KIH0KIAotCi0jaWYgMCAvKiBTYXZpbmcgdGhlIG9sZCBvbmUganVzdCBpbiBjYXNlIDopICovCisjaWYgMAkJCQkvKiBTYXZpbmcgdGhlIG9sZCBvbmUganVzdCBpbiBjYXNlIDopICovCiAvKgogICogQnVpbGRzIHRoZSBsc3AtPnRsdl9kYXRhCiAgKiBhbmQgd3JpdGVzIHRoZSB0bHZzIGludG8gbHNwLT5wZHUgCkBAIC0xMDUyLDE4MSArMTA2NywyMDAgQEAKICAgc3RydWN0IHByZWZpeF9pcHY2ICppcHY2OwogICBzdHJ1Y3QgaXB2Nl9yZWFjaGFiaWxpdHkgKmlwNnJlYWNoOwogI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwotICAKKwogICAvKgogICAgKiBGaXJzdCBhZGQgdGhlIHRsdnMgcmVsYXRlZCB0byBhcmVhCiAgICAqLwotICAKKwogICAvKiBBcmVhIGFkZHJlc3NlcyAqLwogICBpZiAobHNwLT50bHZfZGF0YS5hcmVhX2FkZHJzID09IE5VTEwpCiAgICAgbHNwLT50bHZfZGF0YS5hcmVhX2FkZHJzID0gbGlzdF9uZXcgKCk7CiAgIGxpc3RfYWRkX2xpc3QgKGxzcC0+dGx2X2RhdGEuYXJlYV9hZGRycywgYXJlYS0+YXJlYV9hZGRycyk7CiAgIC8qIFByb3RvY29scyBTdXBwb3J0ZWQgKi8KLSAgaWYgKGFyZWEtPmlwX2NpcmN1aXRzID4gMCAKKyAgaWYgKGFyZWEtPmlwX2NpcmN1aXRzID4gMAogI2lmZGVmIEhBVkVfSVBWNgogICAgICAgfHwgYXJlYS0+aXB2Nl9jaXJjdWl0cyA+IDAKICNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KLSAgICAgICkKKyAgICApCiAgICAgewogICAgICAgbHNwLT50bHZfZGF0YS5ubHBpZHMgPSBYTUFMTE9DIChNVFlQRV9JU0lTX1RMViwgc2l6ZW9mIChzdHJ1Y3QgbmxwaWRzKSk7CiAgICAgICBsc3AtPnRsdl9kYXRhLm5scGlkcy0+Y291bnQgPSAwOwotICAgICAgaWYgKGFyZWEtPmlwX2NpcmN1aXRzID4gMCkgeyAKLSAgICAgICAgbHNwLT50bHZfZGF0YS5ubHBpZHMtPmNvdW50Kys7Ci0gICAgICAgIGxzcC0+dGx2X2RhdGEubmxwaWRzLT5ubHBpZHNbMF0gPSBOTFBJRF9JUDsKLSAgICAgIH0gIAorICAgICAgaWYgKGFyZWEtPmlwX2NpcmN1aXRzID4gMCkKKwl7CisJICBsc3AtPnRsdl9kYXRhLm5scGlkcy0+Y291bnQrKzsKKwkgIGxzcC0+dGx2X2RhdGEubmxwaWRzLT5ubHBpZHNbMF0gPSBOTFBJRF9JUDsKKwl9CiAjaWZkZWYgSEFWRV9JUFY2Ci0gICAgICBpZiAoYXJlYS0+aXB2Nl9jaXJjdWl0cyA+IDApIHsgIAotICAgICAgICBsc3AtPnRsdl9kYXRhLm5scGlkcy0+Y291bnQrKzsKLSAgICAgICAgbHNwLT50bHZfZGF0YS5ubHBpZHMtPm5scGlkc1tsc3AtPnRsdl9kYXRhLm5scGlkcy0+Y291bnQgLSAxXSA9IAotICAgICAgICBOTFBJRF9JUFY2OwotICAgICAgfSAKKyAgICAgIGlmIChhcmVhLT5pcHY2X2NpcmN1aXRzID4gMCkKKwl7CisJICBsc3AtPnRsdl9kYXRhLm5scGlkcy0+Y291bnQrKzsKKwkgIGxzcC0+dGx2X2RhdGEubmxwaWRzLT5ubHBpZHNbbHNwLT50bHZfZGF0YS5ubHBpZHMtPmNvdW50IC0gMV0gPQorCSAgICBOTFBJRF9JUFY2OworCX0KICNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KICAgICB9CiAgIC8qIER5bmFtaWMgSG9zdG5hbWUgKi8KLSAgaWYgKGFyZWEtPmR5bmhvc3RuYW1lKSB7Ci0gICAgbHNwLT50bHZfZGF0YS5ob3N0bmFtZSA9IFhNQUxMT0MgKE1UWVBFX0lTSVNfVExWLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgaG9zdG5hbWUpKTsKLSAgICBtZW1jcHkgKCZsc3AtPnRsdl9kYXRhLmhvc3RuYW1lLT5uYW1lLCB1bml4X2hvc3RuYW1lKCksCi0gICAgICAgICAgICBzdHJsZW4odW5peF9ob3N0bmFtZSgpKSk7Ci0gICAgbHNwLT50bHZfZGF0YS5ob3N0bmFtZS0+bmFtZWxlbiA9IHN0cmxlbiAodW5peF9ob3N0bmFtZSgpKTsKLSAgfQorICBpZiAoYXJlYS0+ZHluaG9zdG5hbWUpCisgICAgeworICAgICAgbHNwLT50bHZfZGF0YS5ob3N0bmFtZSA9IFhNQUxMT0MgKE1UWVBFX0lTSVNfVExWLAorCQkJCQlzaXplb2YgKHN0cnVjdCBob3N0bmFtZSkpOworICAgICAgbWVtY3B5ICgmbHNwLT50bHZfZGF0YS5ob3N0bmFtZS0+bmFtZSwgdW5peF9ob3N0bmFtZSAoKSwKKwkgICAgICBzdHJsZW4gKHVuaXhfaG9zdG5hbWUgKCkpKTsKKyAgICAgIGxzcC0+dGx2X2RhdGEuaG9zdG5hbWUtPm5hbWVsZW4gPSBzdHJsZW4gKHVuaXhfaG9zdG5hbWUgKCkpOworICAgIH0KICNpZmRlZiBUT1BPTE9HWV9HRU5FUkFURQogICAvKgogICAgKiBJZiB3ZSBoYXZlIGEgdG9wb2xvZ3kgaW4gdGhpcyBhcmVhLCB3ZSBuZWVkIHRvIGNvbm5lY3QgdGhpcyBsc3AgdG8KICAgICogdGhlIGZpcnN0IHRvcG9sb2d5IGxzcAogICAgKi8KLSAgaWYgKChhcmVhLT50b3BvbG9neSkgJiYgKGxldmVsID09IDEpKSB7Ci0gICAgaWYgKGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzID09IE5VTEwpCi0gICAgICBsc3AtPnRsdl9kYXRhLmlzX25laWdocyA9IGxpc3RfbmV3ICgpOwotICAgIGlzX25laWdoID0gWE1BTExPQyAoTVRZUEVfSVNJU19UTFYsIHNpemVvZiAoc3RydWN0IGlzX25laWdoKSk7Ci0gICAgbWVtc2V0IChpc19uZWlnaCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaXNfbmVpZ2gpKTsKLSAgICBtZW1jcHkgKCZpc19uZWlnaC0+bmVpZ2hfaWQsIGFyZWEtPnRvcG9sb2d5X2Jhc2VpcywgSVNJU19TWVNfSURfTEVOKTsKLSAgICAvKiBjb25uZWN0ZWQgdG8gdGhlIGZpcnN0ICovCi0gICAgaXNfbmVpZ2gtPm5laWdoX2lkW0lTSVNfU1lTX0lEX0xFTi0xXSA9ICgweDAxKTsgCi0gICAgLyogdGhpcyBpcyBhY3R1YWxseSB0aGUgc2FtZSBzeXN0ZW0sIHdoeSBtZXNzIHRoZSBTUFQgKi8KLSAgICBpc19uZWlnaC0+bWV0cmljcy5tZXRyaWNfZGVmYXVsdCA9IDA7IAotICAgIGlzX25laWdoLT5tZXRyaWNzLm1ldHJpY19kZWxheSA9IE1FVFJJQ1NfVU5TVVBQT1JURUQ7Ci0gICAgaXNfbmVpZ2gtPm1ldHJpY3MubWV0cmljX2V4cGVuc2UgPSBNRVRSSUNTX1VOU1VQUE9SVEVEOwotICAgIGlzX25laWdoLT5tZXRyaWNzLm1ldHJpY19lcnJvciA9IE1FVFJJQ1NfVU5TVVBQT1JURUQ7Ci0gICAgbGlzdG5vZGVfYWRkIChsc3AtPnRsdl9kYXRhLmlzX25laWdocywgaXNfbmVpZ2gpOworICBpZiAoKGFyZWEtPnRvcG9sb2d5KSAmJiAobGV2ZWwgPT0gMSkpCisgICAgeworICAgICAgaWYgKGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzID09IE5VTEwpCisJbHNwLT50bHZfZGF0YS5pc19uZWlnaHMgPSBsaXN0X25ldyAoKTsKKyAgICAgIGlzX25laWdoID0gWE1BTExPQyAoTVRZUEVfSVNJU19UTFYsIHNpemVvZiAoc3RydWN0IGlzX25laWdoKSk7CisgICAgICBtZW1zZXQgKGlzX25laWdoLCAwLCBzaXplb2YgKHN0cnVjdCBpc19uZWlnaCkpOworICAgICAgbWVtY3B5ICgmaXNfbmVpZ2gtPm5laWdoX2lkLCBhcmVhLT50b3BvbG9neV9iYXNlaXMsIElTSVNfU1lTX0lEX0xFTik7CisgICAgICAvKiBjb25uZWN0ZWQgdG8gdGhlIGZpcnN0ICovCisgICAgICBpc19uZWlnaC0+bmVpZ2hfaWRbSVNJU19TWVNfSURfTEVOIC0gMV0gPSAoMHgwMSk7CisgICAgICAvKiB0aGlzIGlzIGFjdHVhbGx5IHRoZSBzYW1lIHN5c3RlbSwgd2h5IG1lc3MgdGhlIFNQVCAqLworICAgICAgaXNfbmVpZ2gtPm1ldHJpY3MubWV0cmljX2RlZmF1bHQgPSAwOworICAgICAgaXNfbmVpZ2gtPm1ldHJpY3MubWV0cmljX2RlbGF5ID0gTUVUUklDU19VTlNVUFBPUlRFRDsKKyAgICAgIGlzX25laWdoLT5tZXRyaWNzLm1ldHJpY19leHBlbnNlID0gTUVUUklDU19VTlNVUFBPUlRFRDsKKyAgICAgIGlzX25laWdoLT5tZXRyaWNzLm1ldHJpY19lcnJvciA9IE1FVFJJQ1NfVU5TVVBQT1JURUQ7CisgICAgICBsaXN0bm9kZV9hZGQgKGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzLCBpc19uZWlnaCk7CiAKLSAgfQorICAgIH0KICNlbmRpZgogCiAgIC8qCiAgICAqIFRoZW4gYWRkIHRsdnMgcmVsYXRlZCB0byBjaXJjdWl0cwogICAgKi8KLSAgZm9yIChub2RlID0gbGlzdGhlYWQgKGFyZWEtPmNpcmN1aXRfbGlzdCk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgewotICAgIGNpcmN1aXQgPSBnZXRkYXRhIChub2RlKTsKLSAgICBpZiAoY2lyY3VpdC0+c3RhdGUgIT0gQ19TVEFURV9VUCkKLSAgICAgIGNvbnRpbnVlOwotICAgIAotICAgIC8qCi0gICAgICogQWRkIElQdjQgaW50ZXJuYWwgcmVhY2hhYmlsaXR5IG9mIHRoaXMgY2lyY3VpdAotICAgICAqLwotICAgIGlmIChjaXJjdWl0LT5pcF9yb3V0ZXIgJiYgY2lyY3VpdC0+aXBfYWRkcnMgJiYgCi0gICAgICAgIGNpcmN1aXQtPmlwX2FkZHJzLT5jb3VudCA+IDApIHsKLSAgICAgIGlmIChsc3AtPnRsdl9kYXRhLmlwdjRfaW50X3JlYWNocyA9PSBOVUxMKSB7IAotICAgICAgICBsc3AtPnRsdl9kYXRhLmlwdjRfaW50X3JlYWNocyA9IGxpc3RfbmV3ICgpOwotICAgICAgICBsc3AtPnRsdl9kYXRhLmlwdjRfaW50X3JlYWNocy0+ZGVsID0gZnJlZV90bHY7Ci0gICAgICB9Ci0gICAgICBmb3IgKGlwbm9kZSA9IGxpc3RoZWFkIChjaXJjdWl0LT5pcF9hZGRycyk7IGlwbm9kZTsgbmV4dG5vZGUgKGlwbm9kZSkpIHsKLSAgICAgICAgaXB2NCA9IGdldGRhdGEgKGlwbm9kZSk7Ci0gICAgICAgIGlwcmVhY2ggPSBYTUFMTE9DIChNVFlQRV9JU0lTX1RMViwgc2l6ZW9mIChzdHJ1Y3QgaXB2NF9yZWFjaGFiaWxpdHkpKTsKLSAgICAgICAgaXByZWFjaC0+bWV0cmljcyA9IGNpcmN1aXQtPm1ldHJpY3NbbGV2ZWwgLSAxXTsKLSAgICAgICAgaXByZWFjaC0+cHJlZml4ID0gaXB2NC0+cHJlZml4OwotICAgICAgICBtYXNrbGVuMmlwIChpcHY0LT5wcmVmaXhsZW4sICZpcHJlYWNoLT5tYXNrKTsgCi0gICAgICAgIGxpc3Rub2RlX2FkZCAobHNwLT50bHZfZGF0YS5pcHY0X2ludF9yZWFjaHMsIGlwcmVhY2gpOwotICAgICAgfQotICAgIH0KKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGFyZWEtPmNpcmN1aXRfbGlzdCk7IG5vZGU7IG5leHRub2RlIChub2RlKSkKKyAgICB7CisgICAgICBjaXJjdWl0ID0gZ2V0ZGF0YSAobm9kZSk7CisgICAgICBpZiAoY2lyY3VpdC0+c3RhdGUgIT0gQ19TVEFURV9VUCkKKwljb250aW51ZTsKKworICAgICAgLyoKKyAgICAgICAqIEFkZCBJUHY0IGludGVybmFsIHJlYWNoYWJpbGl0eSBvZiB0aGlzIGNpcmN1aXQKKyAgICAgICAqLworICAgICAgaWYgKGNpcmN1aXQtPmlwX3JvdXRlciAmJiBjaXJjdWl0LT5pcF9hZGRycyAmJgorCSAgY2lyY3VpdC0+aXBfYWRkcnMtPmNvdW50ID4gMCkKKwl7CisJICBpZiAobHNwLT50bHZfZGF0YS5pcHY0X2ludF9yZWFjaHMgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGxzcC0+dGx2X2RhdGEuaXB2NF9pbnRfcmVhY2hzID0gbGlzdF9uZXcgKCk7CisJICAgICAgbHNwLT50bHZfZGF0YS5pcHY0X2ludF9yZWFjaHMtPmRlbCA9IGZyZWVfdGx2OworCSAgICB9CisJICBmb3IgKGlwbm9kZSA9IGxpc3RoZWFkIChjaXJjdWl0LT5pcF9hZGRycyk7IGlwbm9kZTsKKwkgICAgICAgbmV4dG5vZGUgKGlwbm9kZSkpCisJICAgIHsKKwkgICAgICBpcHY0ID0gZ2V0ZGF0YSAoaXBub2RlKTsKKwkgICAgICBpcHJlYWNoID0KKwkJWE1BTExPQyAoTVRZUEVfSVNJU19UTFYsIHNpemVvZiAoc3RydWN0IGlwdjRfcmVhY2hhYmlsaXR5KSk7CisJICAgICAgaXByZWFjaC0+bWV0cmljcyA9IGNpcmN1aXQtPm1ldHJpY3NbbGV2ZWwgLSAxXTsKKwkgICAgICBpcHJlYWNoLT5wcmVmaXggPSBpcHY0LT5wcmVmaXg7CisJICAgICAgbWFza2xlbjJpcCAoaXB2NC0+cHJlZml4bGVuLCAmaXByZWFjaC0+bWFzayk7CisJICAgICAgbGlzdG5vZGVfYWRkIChsc3AtPnRsdl9kYXRhLmlwdjRfaW50X3JlYWNocywgaXByZWFjaCk7CisJICAgIH0KKwl9CiAjaWZkZWYgSEFWRV9JUFY2Ci0gICAgLyoKLSAgICAgKiBBZGQgSVB2NiByZWFjaGFiaWxpdHkgb2YgdGhpcyBjaXJjdWl0Ci0gICAgICovCi0gICAgaWYgKGNpcmN1aXQtPmlwdjZfcm91dGVyICYmIGNpcmN1aXQtPmlwdjZfbm9uX2xpbmsgJiYgCi0gICAgICAgIGNpcmN1aXQtPmlwdjZfbm9uX2xpbmstPmNvdW50ID4gMCkgewotICAgICAgICBpZiAobHNwLT50bHZfZGF0YS5pcHY2X3JlYWNocyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBsc3AtPnRsdl9kYXRhLmlwdjZfcmVhY2hzID0gbGlzdF9uZXcgKCk7Ci0gICAgICAgICAgICBsc3AtPnRsdl9kYXRhLmlwdjZfcmVhY2hzLT5kZWwgPSBmcmVlX3RsdjsKLSAgICAgICAgfQotICAgICAgZm9yIChpcG5vZGUgPSBsaXN0aGVhZCAoY2lyY3VpdC0+aXB2Nl9ub25fbGluayk7IGlwbm9kZTsgCi0gICAgICAgICAgIG5leHRub2RlIChpcG5vZGUpKSB7Ci0gICAgICAgIGlwdjYgPSBnZXRkYXRhIChpcG5vZGUpOwotICAgICAgICBpcDZyZWFjaCA9IFhNQUxMT0MgKE1UWVBFX0lTSVNfVExWLCBzaXplb2YgKHN0cnVjdCBpcHY2X3JlYWNoYWJpbGl0eSkpOwotICAgICAgICBtZW1zZXQgKGlwNnJlYWNoLCAwLCBzaXplb2YgKHN0cnVjdCBpcHY2X3JlYWNoYWJpbGl0eSkpOwotICAgICAgICBpcDZyZWFjaC0+bWV0cmljID0gaHRvbmwoY2lyY3VpdC0+bWV0cmljc1tsZXZlbCAtIDFdLm1ldHJpY19kZWZhdWx0KTsKLSAgICAgICAgaXA2cmVhY2gtPmNvbnRyb2xfaW5mbyA9IDA7Ci0gICAgICAgIGlwNnJlYWNoLT5wcmVmaXhfbGVuID0gaXB2Ni0+cHJlZml4bGVuOwotICAgICAgICBtZW1jcHkgKCZpcDZyZWFjaC0+cHJlZml4LCBpcHY2LT5wcmVmaXguczZfYWRkciwgCi0gICAgICAgICAgICAgICAgKGlwdjYtPnByZWZpeGxlbiArIDcpIC8gOCk7Ci0gICAgICAgIGxpc3Rub2RlX2FkZCAobHNwLT50bHZfZGF0YS5pcHY2X3JlYWNocywgaXA2cmVhY2gpOwotICAgICAgfQotICAgIH0KKyAgICAgIC8qCisgICAgICAgKiBBZGQgSVB2NiByZWFjaGFiaWxpdHkgb2YgdGhpcyBjaXJjdWl0CisgICAgICAgKi8KKyAgICAgIGlmIChjaXJjdWl0LT5pcHY2X3JvdXRlciAmJiBjaXJjdWl0LT5pcHY2X25vbl9saW5rICYmCisJICBjaXJjdWl0LT5pcHY2X25vbl9saW5rLT5jb3VudCA+IDApCisJeworCSAgaWYgKGxzcC0+dGx2X2RhdGEuaXB2Nl9yZWFjaHMgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGxzcC0+dGx2X2RhdGEuaXB2Nl9yZWFjaHMgPSBsaXN0X25ldyAoKTsKKwkgICAgICBsc3AtPnRsdl9kYXRhLmlwdjZfcmVhY2hzLT5kZWwgPSBmcmVlX3RsdjsKKwkgICAgfQorCSAgZm9yIChpcG5vZGUgPSBsaXN0aGVhZCAoY2lyY3VpdC0+aXB2Nl9ub25fbGluayk7IGlwbm9kZTsKKwkgICAgICAgbmV4dG5vZGUgKGlwbm9kZSkpCisJICAgIHsKKwkgICAgICBpcHY2ID0gZ2V0ZGF0YSAoaXBub2RlKTsKKwkgICAgICBpcDZyZWFjaCA9CisJCVhNQUxMT0MgKE1UWVBFX0lTSVNfVExWLCBzaXplb2YgKHN0cnVjdCBpcHY2X3JlYWNoYWJpbGl0eSkpOworCSAgICAgIG1lbXNldCAoaXA2cmVhY2gsIDAsIHNpemVvZiAoc3RydWN0IGlwdjZfcmVhY2hhYmlsaXR5KSk7CisJICAgICAgaXA2cmVhY2gtPm1ldHJpYyA9CisJCWh0b25sIChjaXJjdWl0LT5tZXRyaWNzW2xldmVsIC0gMV0ubWV0cmljX2RlZmF1bHQpOworCSAgICAgIGlwNnJlYWNoLT5jb250cm9sX2luZm8gPSAwOworCSAgICAgIGlwNnJlYWNoLT5wcmVmaXhfbGVuID0gaXB2Ni0+cHJlZml4bGVuOworCSAgICAgIG1lbWNweSAoJmlwNnJlYWNoLT5wcmVmaXgsIGlwdjYtPnByZWZpeC5zNl9hZGRyLAorCQkgICAgICAoaXB2Ni0+cHJlZml4bGVuICsgNykgLyA4KTsKKwkgICAgICBsaXN0bm9kZV9hZGQgKGxzcC0+dGx2X2RhdGEuaXB2Nl9yZWFjaHMsIGlwNnJlYWNoKTsKKwkgICAgfQorCX0KICNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KLSAgICAKLSAgICBzd2l0Y2ggKGNpcmN1aXQtPmNpcmNfdHlwZSkgewotICAgIGNhc2UgQ0lSQ1VJVF9UX0JST0FEQ0FTVDoKLSAgICAgIGlmIChsZXZlbCAmIGNpcmN1aXQtPmNpcmN1aXRfaXNfdHlwZSkgewotICAgICAgICBpZiAobHNwLT50bHZfZGF0YS5pc19uZWlnaHMgPT0gTlVMTCkgewotICAgICAgICAgIGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzID0gbGlzdF9uZXcgKCk7Ci0gICAgICAgICAgbHNwLT50bHZfZGF0YS5pc19uZWlnaHMtPmRlbCA9IGZyZWVfdGx2OwotICAgICAgICB9Ci0gICAgICAgIGlzX25laWdoID0gWE1BTExPQyAoTVRZUEVfSVNJU19UTFYsIHNpemVvZiAoc3RydWN0IGlzX25laWdoKSk7Ci0gICAgICAgIG1lbXNldCAoaXNfbmVpZ2gsIDAsIHNpemVvZiAoc3RydWN0IGlzX25laWdoKSk7Ci0gICAgICAgIGlmIChsZXZlbCA9PSAxKQotICAgICAgICAgIG1lbWNweSAoJmlzX25laWdoLT5uZWlnaF9pZCwgCi0gICAgICAgICAgICAgICAgICBjaXJjdWl0LT51LmJjLmwxX2Rlc2lnX2lzLCBJU0lTX1NZU19JRF9MRU4gKyAxKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG1lbWNweSAoJmlzX25laWdoLT5uZWlnaF9pZCwgCi0gICAgICAgICAgICAgICAgICBjaXJjdWl0LT51LmJjLmwyX2Rlc2lnX2lzLCBJU0lTX1NZU19JRF9MRU4gKyAxKTsKLSAgICAgICAgICAgIGlzX25laWdoLT5tZXRyaWNzID0gY2lyY3VpdC0+bWV0cmljc1tsZXZlbCAtIDFdOwotICAgICAgICBsaXN0bm9kZV9hZGQgKGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzLCBpc19uZWlnaCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENJUkNVSVRfVF9QMlA6Ci0gICAgICBuZWkgPSBjaXJjdWl0LT51LnAycC5uZWlnaGJvcjsgCi0gICAgICAgIGlmIChuZWkgJiYgKGxldmVsICYgbmVpLT5jaXJjdWl0X3QpKSB7Ci0gICAgICAgICAgaWYgKGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzID09IE5VTEwpIHsKLSAgICAgICAgICAgIGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzID0gbGlzdF9uZXcgKCk7Ci0gICAgICAgICAgICBsc3AtPnRsdl9kYXRhLmlzX25laWdocy0+ZGVsID0gZnJlZV90bHY7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlzX25laWdoID0gWE1BTExPQyAoTVRZUEVfSVNJU19UTFYsIHNpemVvZiAoc3RydWN0IGlzX25laWdoKSk7Ci0gICAgICAgICAgbWVtc2V0IChpc19uZWlnaCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaXNfbmVpZ2gpKTsKLSAgICAgICAgICBtZW1jcHkgKCZpc19uZWlnaC0+bmVpZ2hfaWQsIG5laS0+c3lzaWQsIElTSVNfU1lTX0lEX0xFTik7Ci0gICAgICAgICAgaXNfbmVpZ2gtPm1ldHJpY3MgPSBjaXJjdWl0LT5tZXRyaWNzW2xldmVsIC0gMV07Ci0gICAgICAgICAgbGlzdG5vZGVfYWRkIChsc3AtPnRsdl9kYXRhLmlzX25laWdocywgaXNfbmVpZ2gpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAgQ0lSQ1VJVF9UX1NUQVRJQ19JTjoKLSAgICAgIHpsb2dfd2FybiAoImxzcF9hcmVhX2NyZWF0ZTogdW5zdXBwb3J0ZWQgY2lyY3VpdCB0eXBlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICBDSVJDVUlUX1RfU1RBVElDX09VVDoKLSAgICAgIHpsb2dfd2FybiAoImxzcF9hcmVhX2NyZWF0ZTogdW5zdXBwb3J0ZWQgY2lyY3VpdCB0eXBlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENJUkNVSVRfVF9EQToKLSAgICAgIHpsb2dfd2FybiAoImxzcF9hcmVhX2NyZWF0ZTogdW5zdXBwb3J0ZWQgY2lyY3VpdCB0eXBlIik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgemxvZ193YXJuICgibHNwX2FyZWFfY3JlYXRlOiB1bmtub3duIGNpcmN1aXQgdHlwZSIpOworCisgICAgICBzd2l0Y2ggKGNpcmN1aXQtPmNpcmNfdHlwZSkKKwl7CisJY2FzZSBDSVJDVUlUX1RfQlJPQURDQVNUOgorCSAgaWYgKGxldmVsICYgY2lyY3VpdC0+Y2lyY3VpdF9pc190eXBlKQorCSAgICB7CisJICAgICAgaWYgKGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzID09IE5VTEwpCisJCXsKKwkJICBsc3AtPnRsdl9kYXRhLmlzX25laWdocyA9IGxpc3RfbmV3ICgpOworCQkgIGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzLT5kZWwgPSBmcmVlX3RsdjsKKwkJfQorCSAgICAgIGlzX25laWdoID0gWE1BTExPQyAoTVRZUEVfSVNJU19UTFYsIHNpemVvZiAoc3RydWN0IGlzX25laWdoKSk7CisJICAgICAgbWVtc2V0IChpc19uZWlnaCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaXNfbmVpZ2gpKTsKKwkgICAgICBpZiAobGV2ZWwgPT0gMSkKKwkJbWVtY3B5ICgmaXNfbmVpZ2gtPm5laWdoX2lkLAorCQkJY2lyY3VpdC0+dS5iYy5sMV9kZXNpZ19pcywgSVNJU19TWVNfSURfTEVOICsgMSk7CisJICAgICAgZWxzZQorCQltZW1jcHkgKCZpc19uZWlnaC0+bmVpZ2hfaWQsCisJCQljaXJjdWl0LT51LmJjLmwyX2Rlc2lnX2lzLCBJU0lTX1NZU19JRF9MRU4gKyAxKTsKKwkgICAgICBpc19uZWlnaC0+bWV0cmljcyA9IGNpcmN1aXQtPm1ldHJpY3NbbGV2ZWwgLSAxXTsKKwkgICAgICBsaXN0bm9kZV9hZGQgKGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzLCBpc19uZWlnaCk7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgQ0lSQ1VJVF9UX1AyUDoKKwkgIG5laSA9IGNpcmN1aXQtPnUucDJwLm5laWdoYm9yOworCSAgaWYgKG5laSAmJiAobGV2ZWwgJiBuZWktPmNpcmN1aXRfdCkpCisJICAgIHsKKwkgICAgICBpZiAobHNwLT50bHZfZGF0YS5pc19uZWlnaHMgPT0gTlVMTCkKKwkJeworCQkgIGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzID0gbGlzdF9uZXcgKCk7CisJCSAgbHNwLT50bHZfZGF0YS5pc19uZWlnaHMtPmRlbCA9IGZyZWVfdGx2OworCQl9CisJICAgICAgaXNfbmVpZ2ggPSBYTUFMTE9DIChNVFlQRV9JU0lTX1RMViwgc2l6ZW9mIChzdHJ1Y3QgaXNfbmVpZ2gpKTsKKwkgICAgICBtZW1zZXQgKGlzX25laWdoLCAwLCBzaXplb2YgKHN0cnVjdCBpc19uZWlnaCkpOworCSAgICAgIG1lbWNweSAoJmlzX25laWdoLT5uZWlnaF9pZCwgbmVpLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOKTsKKwkgICAgICBpc19uZWlnaC0+bWV0cmljcyA9IGNpcmN1aXQtPm1ldHJpY3NbbGV2ZWwgLSAxXTsKKwkgICAgICBsaXN0bm9kZV9hZGQgKGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzLCBpc19uZWlnaCk7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgQ0lSQ1VJVF9UX1NUQVRJQ19JTjoKKwkgIHpsb2dfd2FybiAoImxzcF9hcmVhX2NyZWF0ZTogdW5zdXBwb3J0ZWQgY2lyY3VpdCB0eXBlIik7CisJICBicmVhazsKKwljYXNlIENJUkNVSVRfVF9TVEFUSUNfT1VUOgorCSAgemxvZ193YXJuICgibHNwX2FyZWFfY3JlYXRlOiB1bnN1cHBvcnRlZCBjaXJjdWl0IHR5cGUiKTsKKwkgIGJyZWFrOworCWNhc2UgQ0lSQ1VJVF9UX0RBOgorCSAgemxvZ193YXJuICgibHNwX2FyZWFfY3JlYXRlOiB1bnN1cHBvcnRlZCBjaXJjdWl0IHR5cGUiKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICB6bG9nX3dhcm4gKCJsc3BfYXJlYV9jcmVhdGU6IHVua25vd24gY2lyY3VpdCB0eXBlIik7CisJfQogICAgIH0KLSAgfQotICAKKwogICBzdHJlYW1fc2V0X3B1dHAgKGxzcC0+cGR1LCBJU0lTX0ZJWEVEX0hEUl9MRU4gKyBJU0lTX0xTUF9IRFJfTEVOKTsKLSAgCisKICAgaWYgKGxzcC0+dGx2X2RhdGEubmxwaWRzKQogICAgIHRsdl9hZGRfbmxwaWQgKGxzcC0+dGx2X2RhdGEubmxwaWRzLCBsc3AtPnBkdSk7CiAgIGlmIChsc3AtPnRsdl9kYXRhLmhvc3RuYW1lKQogICAgIHRsdl9hZGRfZHluYW1pY19ob3N0bmFtZSAobHNwLT50bHZfZGF0YS5ob3N0bmFtZSwgbHNwLT5wZHUpOwotICBpZiAobHNwLT50bHZfZGF0YS5hcmVhX2FkZHJzICYmIGxpc3Rjb3VudCAobHNwLT50bHZfZGF0YS5hcmVhX2FkZHJzKSA+IDAgKQorICBpZiAobHNwLT50bHZfZGF0YS5hcmVhX2FkZHJzICYmIGxpc3Rjb3VudCAobHNwLT50bHZfZGF0YS5hcmVhX2FkZHJzKSA+IDApCiAgICAgdGx2X2FkZF9hcmVhX2FkZHJzIChsc3AtPnRsdl9kYXRhLmFyZWFfYWRkcnMsIGxzcC0+cGR1KTsKICAgaWYgKGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzICYmIGxpc3Rjb3VudCAobHNwLT50bHZfZGF0YS5pc19uZWlnaHMpID4gMCkKICAgICB0bHZfYWRkX2lzX25laWdocyAobHNwLT50bHZfZGF0YS5pc19uZWlnaHMsIGxzcC0+cGR1KTsKLSAgaWYgKGxzcC0+dGx2X2RhdGEuaXB2NF9pbnRfcmVhY2hzICAmJiAKKyAgaWYgKGxzcC0+dGx2X2RhdGEuaXB2NF9pbnRfcmVhY2hzICYmCiAgICAgICBsaXN0Y291bnQgKGxzcC0+dGx2X2RhdGEuaXB2NF9pbnRfcmVhY2hzKSA+IDApCiAgICAgdGx2X2FkZF9pcHY0X3JlYWNocyAobHNwLT50bHZfZGF0YS5pcHY0X2ludF9yZWFjaHMsIGxzcC0+cGR1KTsKLSNpZmRlZiAgSEFWRV9JUFY2IAotICBpZiAobHNwLT50bHZfZGF0YS5pcHY2X3JlYWNocyAmJiAKLSAgICAgIGxpc3Rjb3VudCAobHNwLT50bHZfZGF0YS5pcHY2X3JlYWNocykgPiAwKQorI2lmZGVmICBIQVZFX0lQVjYKKyAgaWYgKGxzcC0+dGx2X2RhdGEuaXB2Nl9yZWFjaHMgJiYgbGlzdGNvdW50IChsc3AtPnRsdl9kYXRhLmlwdjZfcmVhY2hzKSA+IDApCiAgICAgdGx2X2FkZF9pcHY2X3JlYWNocyAobHNwLT50bHZfZGF0YS5pcHY2X3JlYWNocywgbHNwLT5wZHUpOwogI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwogCkBAIC0xMjQ1LDczICsxMjc5LDc5IEBACiAKIHZvaWQKIGxzcF90bHZfZml0IChzdHJ1Y3QgaXNpc19sc3AgKmxzcCwgc3RydWN0IGxpc3QgKipmcm9tLCBzdHJ1Y3QgbGlzdCAqKnRvLAotICAgICAgICAgICAgIGludCB0bHZzaXplLCBpbnQgZnJhZ190aG9sZCwgCi0gICAgICAgICAgICAgaW50IHRsdl9idWlsZF9mdW5jKHN0cnVjdCBsaXN0ICosIHN0cnVjdCBzdHJlYW0gKikpCisJICAgICBpbnQgdGx2c2l6ZSwgaW50IGZyYWdfdGhvbGQsCisJICAgICBpbnQgdGx2X2J1aWxkX2Z1bmMgKHN0cnVjdCBsaXN0ICosIHN0cnVjdCBzdHJlYW0gKikpCiB7CiAgIGludCBjb3VudCwgaTsKLSAgCisKICAgLyogY2FuIHdlIGZpdCBhbGwgPyAqLwotICBpZiAoIUZSQUdfTkVFREVEKGxzcC0+cGR1LCBmcmFnX3Rob2xkLAotICAgICAgICAgICAgICAgICAgIGxpc3Rjb3VudCgqZnJvbSkgKiB0bHZzaXplICsgMikpIHsKLSAgICB0bHZfYnVpbGRfZnVuYyAoKmZyb20sIGxzcC0+cGR1KTsKLSAgICAqdG8gPSAqZnJvbTsKLSAgICAqZnJvbSA9IE5VTEw7Ci0gIH0gZWxzZSBpZiAoIUZSQUdfTkVFREVEKGxzcC0+cGR1LCBmcmFnX3Rob2xkLCB0bHZzaXplICsgMikpIHsKLSAgICAvKiBmaXQgYWxsIHdlIGNhbiAqLwotICAgIGNvdW50ID0gRlJBR19USE9MRChsc3AtPnBkdSxmcmFnX3Rob2xkKSAtIDIgLSAKLSAgICAgIChTVFJFQU1fU0laRShsc3AtPnBkdSkgLSBTVFJFQU1fUkVNQUlOKGxzcC0+cGR1KSk7Ci0gICAgaWYgKGNvdW50KQotICAgICAgY291bnQgPSBjb3VudCAvIHRsdnNpemU7Ci0gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgIGxpc3Rub2RlX2FkZCAoKnRvLCBnZXRkYXRhKGxpc3RoZWFkKCpmcm9tKSkpOwotICAgICAgbGlzdG5vZGVfZGVsZXRlKCpmcm9tLCBnZXRkYXRhKGxpc3RoZWFkKCpmcm9tKSkpOworICBpZiAoIUZSQUdfTkVFREVEIChsc3AtPnBkdSwgZnJhZ190aG9sZCwgbGlzdGNvdW50ICgqZnJvbSkgKiB0bHZzaXplICsgMikpCisgICAgeworICAgICAgdGx2X2J1aWxkX2Z1bmMgKCpmcm9tLCBsc3AtPnBkdSk7CisgICAgICAqdG8gPSAqZnJvbTsKKyAgICAgICpmcm9tID0gTlVMTDsKICAgICB9Ci0gICAgdGx2X2J1aWxkX2Z1bmMgKCp0bywgbHNwLT5wZHUpOwotICB9Ci0gIGxzcC0+bHNwX2hlYWRlci0+cGR1X2xlbiA9IGh0b25zIChzdHJlYW1fZ2V0X3B1dHAgKGxzcC0+cGR1KSk7ICAKKyAgZWxzZSBpZiAoIUZSQUdfTkVFREVEIChsc3AtPnBkdSwgZnJhZ190aG9sZCwgdGx2c2l6ZSArIDIpKQorICAgIHsKKyAgICAgIC8qIGZpdCBhbGwgd2UgY2FuICovCisgICAgICBjb3VudCA9IEZSQUdfVEhPTEQgKGxzcC0+cGR1LCBmcmFnX3Rob2xkKSAtIDIgLQorCShTVFJFQU1fU0laRSAobHNwLT5wZHUpIC0gU1RSRUFNX1JFTUFJTiAobHNwLT5wZHUpKTsKKyAgICAgIGlmIChjb3VudCkKKwljb3VudCA9IGNvdW50IC8gdGx2c2l6ZTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCXsKKwkgIGxpc3Rub2RlX2FkZCAoKnRvLCBnZXRkYXRhIChsaXN0aGVhZCAoKmZyb20pKSk7CisJICBsaXN0bm9kZV9kZWxldGUgKCpmcm9tLCBnZXRkYXRhIChsaXN0aGVhZCAoKmZyb20pKSk7CisJfQorICAgICAgdGx2X2J1aWxkX2Z1bmMgKCp0bywgbHNwLT5wZHUpOworICAgIH0KKyAgbHNwLT5sc3BfaGVhZGVyLT5wZHVfbGVuID0gaHRvbnMgKHN0cmVhbV9nZXRfcHV0cCAobHNwLT5wZHUpKTsKICAgcmV0dXJuOwogfQogCi1zdHJ1Y3QgaXNpc19sc3AgICoKLWxzcF9uZXh0X2ZyYWcgKHVfY2hhciBmcmFnX251bSwgc3RydWN0IGlzaXNfbHNwICpsc3AwLCBzdHJ1Y3QgaXNpc19hcmVhICphcmVhLCAKLSAgICAgICAgICAgICAgIGludCBsZXZlbCApCitzdHJ1Y3QgaXNpc19sc3AgKgorbHNwX25leHRfZnJhZyAodV9jaGFyIGZyYWdfbnVtLCBzdHJ1Y3QgaXNpc19sc3AgKmxzcDAsIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWEsCisJICAgICAgIGludCBsZXZlbCkKIHsKICAgc3RydWN0IGlzaXNfbHNwICpsc3A7Ci0gIHVfY2hhciBmcmFnX2lkW0lTSVNfU1lTX0lEX0xFTiArIDJdOyAKLSAgCisgIHVfY2hhciBmcmFnX2lkW0lTSVNfU1lTX0lEX0xFTiArIDJdOworCiAgIG1lbWNweSAoZnJhZ19pZCwgbHNwMC0+bHNwX2hlYWRlci0+bHNwX2lkLCBJU0lTX1NZU19JRF9MRU4gKyAxKTsKICAgTFNQX0ZSQUdNRU5UIChmcmFnX2lkKSA9IGZyYWdfbnVtOwogICBsc3AgPSBsc3Bfc2VhcmNoIChmcmFnX2lkLCBhcmVhLT5sc3BkYltsZXZlbCAtIDFdKTsKLSAgaWYgKGxzcCkgewotICAgIC8qCi0gICAgICogQ2xlYXIgdGhlIFRMVnMsIGJ1dCBpbmhlcml0IHRoZSBhdXRoaW5mbwotICAgICAqLwotICAgIGxzcF9jbGVhcl9kYXRhIChsc3ApOwotICAgIGlmIChsc3AwLT50bHZfZGF0YS5hdXRoX2luZm8udHlwZSkgewotICAgICAgbWVtY3B5ICgmbHNwLT50bHZfZGF0YS5hdXRoX2luZm8sICZsc3AtPnRsdl9kYXRhLmF1dGhfaW5mbywgCi0JICAgICAgc2l6ZW9mIChzdHJ1Y3QgaXNpc19wYXNzd2QpKTsKLSAgICAgIHRsdl9hZGRfYXV0aGluZm8gKGxzcC0+dGx2X2RhdGEuYXV0aF9pbmZvLnR5cGUsIAotCQkJbHNwLT50bHZfZGF0YS5hdXRoX2luZm8ubGVuLCAKLQkJICAgICAgbHNwLT50bHZfZGF0YS5hdXRoX2luZm8ucGFzc3dkLCBsc3AtPnBkdSk7CisgIGlmIChsc3ApCisgICAgeworICAgICAgLyoKKyAgICAgICAqIENsZWFyIHRoZSBUTFZzLCBidXQgaW5oZXJpdCB0aGUgYXV0aGluZm8KKyAgICAgICAqLworICAgICAgbHNwX2NsZWFyX2RhdGEgKGxzcCk7CisgICAgICBpZiAobHNwMC0+dGx2X2RhdGEuYXV0aF9pbmZvLnR5cGUpCisJeworCSAgbWVtY3B5ICgmbHNwLT50bHZfZGF0YS5hdXRoX2luZm8sICZsc3AtPnRsdl9kYXRhLmF1dGhfaW5mbywKKwkJICBzaXplb2YgKHN0cnVjdCBpc2lzX3Bhc3N3ZCkpOworCSAgdGx2X2FkZF9hdXRoaW5mbyAobHNwLT50bHZfZGF0YS5hdXRoX2luZm8udHlwZSwKKwkJCSAgICBsc3AtPnRsdl9kYXRhLmF1dGhfaW5mby5sZW4sCisJCQkgICAgbHNwLT50bHZfZGF0YS5hdXRoX2luZm8ucGFzc3dkLCBsc3AtPnBkdSk7CisJfQorICAgICAgcmV0dXJuIGxzcDsKICAgICB9Ci0gICAgcmV0dXJuIGxzcDsKLSAgfSAKICAgbHNwID0gbHNwX25ldyAoZnJhZ19pZCwgYXJlYS0+bWF4X2xzcF9saWZldGltZVtsZXZlbCAtIDFdLCAwLCBhcmVhLT5pc190eXBlLAotICAgICAgICAgICAgICAgICAwLCBsZXZlbCk7CisJCSAwLCBsZXZlbCk7CiAgIGxzcC0+b3duX2xzcCA9IDE7Ci0gIGxzcF9pbnNlcnQgKGxzcCwgYXJlYS0+bHNwZGJbbGV2ZWwtMV0pOworICBsc3BfaW5zZXJ0IChsc3AsIGFyZWEtPmxzcGRiW2xldmVsIC0gMV0pOwogICBsaXN0bm9kZV9hZGQgKGxzcDAtPmxzcHUuZnJhZ3MsIGxzcCk7CiAgIGxzcC0+bHNwdS56ZXJvX2xzcCA9IGxzcDA7CiAgIC8qCiAgICAqIENvcHkgdGhlIGF1dGhpbmZvIGZyb20gemVybyBMU1AKICAgICovCi0gIGlmIChsc3AwLT50bHZfZGF0YS5hdXRoX2luZm8udHlwZSkgewotICAgIG1lbWNweSAoJmxzcC0+dGx2X2RhdGEuYXV0aF9pbmZvLCAmbHNwLT50bHZfZGF0YS5hdXRoX2luZm8sIAotCSAgICBzaXplb2YgKHN0cnVjdCBpc2lzX3Bhc3N3ZCkpOwotICAgIHRsdl9hZGRfYXV0aGluZm8gKGxzcC0+dGx2X2RhdGEuYXV0aF9pbmZvLnR5cGUsIAotCQkgICAgICBsc3AtPnRsdl9kYXRhLmF1dGhfaW5mby5sZW4sIAotCQkgICAgICBsc3AtPnRsdl9kYXRhLmF1dGhfaW5mby5wYXNzd2QsIGxzcC0+cGR1KTsKLSAgfQorICBpZiAobHNwMC0+dGx2X2RhdGEuYXV0aF9pbmZvLnR5cGUpCisgICAgeworICAgICAgbWVtY3B5ICgmbHNwLT50bHZfZGF0YS5hdXRoX2luZm8sICZsc3AtPnRsdl9kYXRhLmF1dGhfaW5mbywKKwkgICAgICBzaXplb2YgKHN0cnVjdCBpc2lzX3Bhc3N3ZCkpOworICAgICAgdGx2X2FkZF9hdXRoaW5mbyAobHNwLT50bHZfZGF0YS5hdXRoX2luZm8udHlwZSwKKwkJCWxzcC0+dGx2X2RhdGEuYXV0aF9pbmZvLmxlbiwKKwkJCWxzcC0+dGx2X2RhdGEuYXV0aF9pbmZvLnBhc3N3ZCwgbHNwLT5wZHUpOworICAgIH0KICAgcmV0dXJuIGxzcDsKIH0KIApAQCAtMTM0MSwyMDAgKzEzODEsMjIxIEBACiAgIC8qCiAgICAqIEZpcnN0IGFkZCB0aGUgdGx2cyByZWxhdGVkIHRvIGFyZWEKICAgICovCi0gIAorCiAgIC8qIEFyZWEgYWRkcmVzc2VzICovCiAgIGlmIChsc3AtPnRsdl9kYXRhLmFyZWFfYWRkcnMgPT0gTlVMTCkKICAgICBsc3AtPnRsdl9kYXRhLmFyZWFfYWRkcnMgPSBsaXN0X25ldyAoKTsKICAgbGlzdF9hZGRfbGlzdCAobHNwLT50bHZfZGF0YS5hcmVhX2FkZHJzLCBhcmVhLT5hcmVhX2FkZHJzKTsKICAgLyogUHJvdG9jb2xzIFN1cHBvcnRlZCAqLwotICBpZiAoYXJlYS0+aXBfY2lyY3VpdHMgPiAwIAorICBpZiAoYXJlYS0+aXBfY2lyY3VpdHMgPiAwCiAjaWZkZWYgSEFWRV9JUFY2CiAgICAgICB8fCBhcmVhLT5pcHY2X2NpcmN1aXRzID4gMAogI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwotICAgICAgKQorICAgICkKICAgICB7CiAgICAgICBsc3AtPnRsdl9kYXRhLm5scGlkcyA9IFhNQUxMT0MgKE1UWVBFX0lTSVNfVExWLCBzaXplb2YgKHN0cnVjdCBubHBpZHMpKTsKICAgICAgIGxzcC0+dGx2X2RhdGEubmxwaWRzLT5jb3VudCA9IDA7Ci0gICAgICBpZiAoYXJlYS0+aXBfY2lyY3VpdHMgPiAwKSB7IAotICAgICAgICBsc3AtPnRsdl9kYXRhLm5scGlkcy0+Y291bnQrKzsKLSAgICAgICAgbHNwLT50bHZfZGF0YS5ubHBpZHMtPm5scGlkc1swXSA9IE5MUElEX0lQOwotICAgICAgfSAgCisgICAgICBpZiAoYXJlYS0+aXBfY2lyY3VpdHMgPiAwKQorCXsKKwkgIGxzcC0+dGx2X2RhdGEubmxwaWRzLT5jb3VudCsrOworCSAgbHNwLT50bHZfZGF0YS5ubHBpZHMtPm5scGlkc1swXSA9IE5MUElEX0lQOworCX0KICNpZmRlZiBIQVZFX0lQVjYKLSAgICAgIGlmIChhcmVhLT5pcHY2X2NpcmN1aXRzID4gMCkgeyAgCi0gICAgICAgIGxzcC0+dGx2X2RhdGEubmxwaWRzLT5jb3VudCsrOwotICAgICAgICBsc3AtPnRsdl9kYXRhLm5scGlkcy0+bmxwaWRzW2xzcC0+dGx2X2RhdGEubmxwaWRzLT5jb3VudCAtIDFdID0gCi0gICAgICAgIE5MUElEX0lQVjY7Ci0gICAgICB9IAorICAgICAgaWYgKGFyZWEtPmlwdjZfY2lyY3VpdHMgPiAwKQorCXsKKwkgIGxzcC0+dGx2X2RhdGEubmxwaWRzLT5jb3VudCsrOworCSAgbHNwLT50bHZfZGF0YS5ubHBpZHMtPm5scGlkc1tsc3AtPnRsdl9kYXRhLm5scGlkcy0+Y291bnQgLSAxXSA9CisJICAgIE5MUElEX0lQVjY7CisJfQogI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwogICAgIH0KICAgLyogRHluYW1pYyBIb3N0bmFtZSAqLwotICBpZiAoYXJlYS0+ZHluaG9zdG5hbWUpIHsKLSAgICBsc3AtPnRsdl9kYXRhLmhvc3RuYW1lID0gWE1BTExPQyAoTVRZUEVfSVNJU19UTFYsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN0cnVjdCBob3N0bmFtZSkpOworICBpZiAoYXJlYS0+ZHluaG9zdG5hbWUpCisgICAgeworICAgICAgbHNwLT50bHZfZGF0YS5ob3N0bmFtZSA9IFhNQUxMT0MgKE1UWVBFX0lTSVNfVExWLAorCQkJCQlzaXplb2YgKHN0cnVjdCBob3N0bmFtZSkpOwogCi0gICAgbWVtY3B5IChsc3AtPnRsdl9kYXRhLmhvc3RuYW1lLT5uYW1lLCB1bml4X2hvc3RuYW1lKCksCi0gICAgICAgICAgICBzdHJsZW4gKHVuaXhfaG9zdG5hbWUoKSkpOwotICAgIGxzcC0+dGx2X2RhdGEuaG9zdG5hbWUtPm5hbWVsZW4gPSBzdHJsZW4gKHVuaXhfaG9zdG5hbWUoKSk7Ci0gIH0KKyAgICAgIG1lbWNweSAobHNwLT50bHZfZGF0YS5ob3N0bmFtZS0+bmFtZSwgdW5peF9ob3N0bmFtZSAoKSwKKwkgICAgICBzdHJsZW4gKHVuaXhfaG9zdG5hbWUgKCkpKTsKKyAgICAgIGxzcC0+dGx2X2RhdGEuaG9zdG5hbWUtPm5hbWVsZW4gPSBzdHJsZW4gKHVuaXhfaG9zdG5hbWUgKCkpOworICAgIH0KIAogICAvKgogICAgKiBCdWlsZGluZyB0aGUgemVybyBsc3AKICAgICovCi0gIHN0cmVhbV9zZXRfcHV0cCAobHNwLT5wZHUsIElTSVNfRklYRURfSERSX0xFTiArIElTSVNfTFNQX0hEUl9MRU4pOyAgCisgIHN0cmVhbV9zZXRfcHV0cCAobHNwLT5wZHUsIElTSVNfRklYRURfSERSX0xFTiArIElTSVNfTFNQX0hEUl9MRU4pOwogICAvKgogICAgKiBBZGQgdGhlIGF1dGhlbnRpY2F0aW9uIGluZm8gaWYgaXRzIHByZXNlbnQKICAgICovCi0gIChsZXZlbCA9PSAxKSA/IChwYXNzd2QgPSAmYXJlYS0+YXJlYV9wYXNzd2QpIDogCi0gICAgICAgICAgICAgICAgIChwYXNzd2QgPSAmYXJlYS0+ZG9tYWluX3Bhc3N3ZCk7Ci0gIGlmIChwYXNzd2QtPnR5cGUpIHsKLSAgICBtZW1jcHkgKCZsc3AtPnRsdl9kYXRhLmF1dGhfaW5mbywgcGFzc3dkLCBzaXplb2YgKHN0cnVjdCBpc2lzX3Bhc3N3ZCkpOwotICAgIHRsdl9hZGRfYXV0aGluZm8gKHBhc3N3ZC0+dHlwZSwgcGFzc3dkLT5sZW4sCi0JCSAgICAgIHBhc3N3ZC0+cGFzc3dkLCBsc3AtPnBkdSk7Ci0gIH0KKyAgKGxldmVsID09IDEpID8gKHBhc3N3ZCA9ICZhcmVhLT5hcmVhX3Bhc3N3ZCkgOgorICAgIChwYXNzd2QgPSAmYXJlYS0+ZG9tYWluX3Bhc3N3ZCk7CisgIGlmIChwYXNzd2QtPnR5cGUpCisgICAgeworICAgICAgbWVtY3B5ICgmbHNwLT50bHZfZGF0YS5hdXRoX2luZm8sIHBhc3N3ZCwgc2l6ZW9mIChzdHJ1Y3QgaXNpc19wYXNzd2QpKTsKKyAgICAgIHRsdl9hZGRfYXV0aGluZm8gKHBhc3N3ZC0+dHlwZSwgcGFzc3dkLT5sZW4sIHBhc3N3ZC0+cGFzc3dkLCBsc3AtPnBkdSk7CisgICAgfQogICBpZiAobHNwLT50bHZfZGF0YS5ubHBpZHMpCiAgICAgdGx2X2FkZF9ubHBpZCAobHNwLT50bHZfZGF0YS5ubHBpZHMsIGxzcC0+cGR1KTsKICAgaWYgKGxzcC0+dGx2X2RhdGEuaG9zdG5hbWUpCiAgICAgdGx2X2FkZF9keW5hbWljX2hvc3RuYW1lIChsc3AtPnRsdl9kYXRhLmhvc3RuYW1lLCBsc3AtPnBkdSk7Ci0gIGlmIChsc3AtPnRsdl9kYXRhLmFyZWFfYWRkcnMgJiYgbGlzdGNvdW50IChsc3AtPnRsdl9kYXRhLmFyZWFfYWRkcnMpID4gMCApCisgIGlmIChsc3AtPnRsdl9kYXRhLmFyZWFfYWRkcnMgJiYgbGlzdGNvdW50IChsc3AtPnRsdl9kYXRhLmFyZWFfYWRkcnMpID4gMCkKICAgICB0bHZfYWRkX2FyZWFfYWRkcnMgKGxzcC0+dGx2X2RhdGEuYXJlYV9hZGRycywgbHNwLT5wZHUpOwotIAorCiAgIG1lbXNldCAoJnRsdl9kYXRhLCAwLCBzaXplb2YgKHN0cnVjdCB0bHZzKSk7CiAgIC8qCiAgICAqIFRoZW4gYnVpbGQgbGlzdHMgb2YgdGx2cyByZWxhdGVkIHRvIGNpcmN1aXRzCiAgICAqLwotICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoYXJlYS0+Y2lyY3VpdF9saXN0KTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7Ci0gICAgY2lyY3VpdCA9IGdldGRhdGEgKG5vZGUpOwotICAgIGlmIChjaXJjdWl0LT5zdGF0ZSAhPSBDX1NUQVRFX1VQKQotICAgICAgY29udGludWU7Ci0gICAgCi0gICAgLyoKLSAgICAgKiBBZGQgSVB2NCBpbnRlcm5hbCByZWFjaGFiaWxpdHkgb2YgdGhpcyBjaXJjdWl0Ci0gICAgICovCi0gICAgaWYgKGNpcmN1aXQtPmlwX3JvdXRlciAmJiBjaXJjdWl0LT5pcF9hZGRycyAmJiAKLSAgICAgICAgY2lyY3VpdC0+aXBfYWRkcnMtPmNvdW50ID4gMCkgewotICAgICAgaWYgKHRsdl9kYXRhLmlwdjRfaW50X3JlYWNocyA9PSBOVUxMKSB7IAotICAgICAgICB0bHZfZGF0YS5pcHY0X2ludF9yZWFjaHMgPSBsaXN0X25ldyAoKTsKLSAgICAgIH0KLSAgICAgIGZvciAoaXBub2RlID0gbGlzdGhlYWQgKGNpcmN1aXQtPmlwX2FkZHJzKTsgaXBub2RlOyBuZXh0bm9kZSAoaXBub2RlKSkgewotICAgICAgICBpcHY0ID0gZ2V0ZGF0YSAoaXBub2RlKTsKLSAgICAgICAgaXByZWFjaCA9IFhNQUxMT0MgKE1UWVBFX0lTSVNfVExWLCBzaXplb2YgKHN0cnVjdCBpcHY0X3JlYWNoYWJpbGl0eSkpOwotICAgICAgICBpcHJlYWNoLT5tZXRyaWNzID0gY2lyY3VpdC0+bWV0cmljc1tsZXZlbCAtIDFdOwotICAgICAgICBpcHJlYWNoLT5wcmVmaXggPSBpcHY0LT5wcmVmaXg7Ci0gICAgICAgIG1hc2tsZW4yaXAgKGlwdjQtPnByZWZpeGxlbiwgJmlwcmVhY2gtPm1hc2spOyAKLSAgICAgICAgbGlzdG5vZGVfYWRkICh0bHZfZGF0YS5pcHY0X2ludF9yZWFjaHMsIGlwcmVhY2gpOwotICAgICAgfQorICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoYXJlYS0+Y2lyY3VpdF9saXN0KTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorICAgIHsKKyAgICAgIGNpcmN1aXQgPSBnZXRkYXRhIChub2RlKTsKKyAgICAgIGlmIChjaXJjdWl0LT5zdGF0ZSAhPSBDX1NUQVRFX1VQKQorCWNvbnRpbnVlOwogCi0gICAgfQorICAgICAgLyoKKyAgICAgICAqIEFkZCBJUHY0IGludGVybmFsIHJlYWNoYWJpbGl0eSBvZiB0aGlzIGNpcmN1aXQKKyAgICAgICAqLworICAgICAgaWYgKGNpcmN1aXQtPmlwX3JvdXRlciAmJiBjaXJjdWl0LT5pcF9hZGRycyAmJgorCSAgY2lyY3VpdC0+aXBfYWRkcnMtPmNvdW50ID4gMCkKKwl7CisJICBpZiAodGx2X2RhdGEuaXB2NF9pbnRfcmVhY2hzID09IE5VTEwpCisJICAgIHsKKwkgICAgICB0bHZfZGF0YS5pcHY0X2ludF9yZWFjaHMgPSBsaXN0X25ldyAoKTsKKwkgICAgfQorCSAgZm9yIChpcG5vZGUgPSBsaXN0aGVhZCAoY2lyY3VpdC0+aXBfYWRkcnMpOyBpcG5vZGU7CisJICAgICAgIG5leHRub2RlIChpcG5vZGUpKQorCSAgICB7CisJICAgICAgaXB2NCA9IGdldGRhdGEgKGlwbm9kZSk7CisJICAgICAgaXByZWFjaCA9CisJCVhNQUxMT0MgKE1UWVBFX0lTSVNfVExWLCBzaXplb2YgKHN0cnVjdCBpcHY0X3JlYWNoYWJpbGl0eSkpOworCSAgICAgIGlwcmVhY2gtPm1ldHJpY3MgPSBjaXJjdWl0LT5tZXRyaWNzW2xldmVsIC0gMV07CisJICAgICAgaXByZWFjaC0+cHJlZml4ID0gaXB2NC0+cHJlZml4OworCSAgICAgIG1hc2tsZW4yaXAgKGlwdjQtPnByZWZpeGxlbiwgJmlwcmVhY2gtPm1hc2spOworCSAgICAgIGxpc3Rub2RlX2FkZCAodGx2X2RhdGEuaXB2NF9pbnRfcmVhY2hzLCBpcHJlYWNoKTsKKwkgICAgfQorCisJfQogI2lmZGVmIEhBVkVfSVBWNgotICAgIC8qCi0gICAgICogQWRkIElQdjYgcmVhY2hhYmlsaXR5IG9mIHRoaXMgY2lyY3VpdAotICAgICAqLwotICAgIGlmIChjaXJjdWl0LT5pcHY2X3JvdXRlciAmJiBjaXJjdWl0LT5pcHY2X25vbl9saW5rICYmIAotICAgICAgICBjaXJjdWl0LT5pcHY2X25vbl9saW5rLT5jb3VudCA+IDApIHsKLSAgICAgIAotICAgICAgaWYgKHRsdl9kYXRhLmlwdjZfcmVhY2hzID09IE5VTEwpIHsKLSAgICAgICAgdGx2X2RhdGEuaXB2Nl9yZWFjaHMgPSBsaXN0X25ldyAoKTsKLSAgICAgIH0KLSAgICAgIGZvciAoaXBub2RlID0gbGlzdGhlYWQgKGNpcmN1aXQtPmlwdjZfbm9uX2xpbmspOyBpcG5vZGU7IAotICAgICAgICAgICBuZXh0bm9kZSAoaXBub2RlKSkgewotICAgICAgICBpcHY2ID0gZ2V0ZGF0YSAoaXBub2RlKTsKLSAgICAgICAgaXA2cmVhY2ggPSBYTUFMTE9DIChNVFlQRV9JU0lTX1RMViwgc2l6ZW9mIChzdHJ1Y3QgaXB2Nl9yZWFjaGFiaWxpdHkpKTsKLSAgICAgICAgbWVtc2V0IChpcDZyZWFjaCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaXB2Nl9yZWFjaGFiaWxpdHkpKTsKLSAgICAgICAgaXA2cmVhY2gtPm1ldHJpYyA9IGh0b25sKGNpcmN1aXQtPm1ldHJpY3NbbGV2ZWwgLSAxXS5tZXRyaWNfZGVmYXVsdCk7Ci0gICAgICAgIGlwNnJlYWNoLT5jb250cm9sX2luZm8gPSAwOwotICAgICAgICBpcDZyZWFjaC0+cHJlZml4X2xlbiA9IGlwdjYtPnByZWZpeGxlbjsKLSAgICAgICAgbWVtY3B5IChpcDZyZWFjaC0+cHJlZml4LCBpcHY2LT5wcmVmaXguczZfYWRkciwgCi0gICAgICAgICAgICAgICAgKGlwdjYtPnByZWZpeGxlbiArIDcpIC8gOCk7Ci0gICAgICAgIGxpc3Rub2RlX2FkZCAodGx2X2RhdGEuaXB2Nl9yZWFjaHMsIGlwNnJlYWNoKTsKLSAgICAgIH0KKyAgICAgIC8qCisgICAgICAgKiBBZGQgSVB2NiByZWFjaGFiaWxpdHkgb2YgdGhpcyBjaXJjdWl0CisgICAgICAgKi8KKyAgICAgIGlmIChjaXJjdWl0LT5pcHY2X3JvdXRlciAmJiBjaXJjdWl0LT5pcHY2X25vbl9saW5rICYmCisJICBjaXJjdWl0LT5pcHY2X25vbl9saW5rLT5jb3VudCA+IDApCisJeworCisJICBpZiAodGx2X2RhdGEuaXB2Nl9yZWFjaHMgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHRsdl9kYXRhLmlwdjZfcmVhY2hzID0gbGlzdF9uZXcgKCk7CisJICAgIH0KKwkgIGZvciAoaXBub2RlID0gbGlzdGhlYWQgKGNpcmN1aXQtPmlwdjZfbm9uX2xpbmspOyBpcG5vZGU7CisJICAgICAgIG5leHRub2RlIChpcG5vZGUpKQorCSAgICB7CisJICAgICAgaXB2NiA9IGdldGRhdGEgKGlwbm9kZSk7CisJICAgICAgaXA2cmVhY2ggPQorCQlYTUFMTE9DIChNVFlQRV9JU0lTX1RMViwgc2l6ZW9mIChzdHJ1Y3QgaXB2Nl9yZWFjaGFiaWxpdHkpKTsKKwkgICAgICBtZW1zZXQgKGlwNnJlYWNoLCAwLCBzaXplb2YgKHN0cnVjdCBpcHY2X3JlYWNoYWJpbGl0eSkpOworCSAgICAgIGlwNnJlYWNoLT5tZXRyaWMgPQorCQlodG9ubCAoY2lyY3VpdC0+bWV0cmljc1tsZXZlbCAtIDFdLm1ldHJpY19kZWZhdWx0KTsKKwkgICAgICBpcDZyZWFjaC0+Y29udHJvbF9pbmZvID0gMDsKKwkgICAgICBpcDZyZWFjaC0+cHJlZml4X2xlbiA9IGlwdjYtPnByZWZpeGxlbjsKKwkgICAgICBtZW1jcHkgKGlwNnJlYWNoLT5wcmVmaXgsIGlwdjYtPnByZWZpeC5zNl9hZGRyLAorCQkgICAgICAoaXB2Ni0+cHJlZml4bGVuICsgNykgLyA4KTsKKwkgICAgICBsaXN0bm9kZV9hZGQgKHRsdl9kYXRhLmlwdjZfcmVhY2hzLCBpcDZyZWFjaCk7CisJICAgIH0KKwl9CisjZW5kaWYgLyogSEFWRV9JUFY2ICovCisKKyAgICAgIHN3aXRjaCAoY2lyY3VpdC0+Y2lyY190eXBlKQorCXsKKwljYXNlIENJUkNVSVRfVF9CUk9BRENBU1Q6CisJICBpZiAobGV2ZWwgJiBjaXJjdWl0LT5jaXJjdWl0X2lzX3R5cGUpCisJICAgIHsKKwkgICAgICBpZiAodGx2X2RhdGEuaXNfbmVpZ2hzID09IE5VTEwpCisJCXsKKwkJICB0bHZfZGF0YS5pc19uZWlnaHMgPSBsaXN0X25ldyAoKTsKKwkJfQorCSAgICAgIGlzX25laWdoID0gWE1BTExPQyAoTVRZUEVfSVNJU19UTFYsIHNpemVvZiAoc3RydWN0IGlzX25laWdoKSk7CisJICAgICAgbWVtc2V0IChpc19uZWlnaCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaXNfbmVpZ2gpKTsKKwkgICAgICBpZiAobGV2ZWwgPT0gMSkKKwkJbWVtY3B5IChpc19uZWlnaC0+bmVpZ2hfaWQsCisJCQljaXJjdWl0LT51LmJjLmwxX2Rlc2lnX2lzLCBJU0lTX1NZU19JRF9MRU4gKyAxKTsKKwkgICAgICBlbHNlCisJCW1lbWNweSAoaXNfbmVpZ2gtPm5laWdoX2lkLAorCQkJY2lyY3VpdC0+dS5iYy5sMl9kZXNpZ19pcywgSVNJU19TWVNfSURfTEVOICsgMSk7CisJICAgICAgaXNfbmVpZ2gtPm1ldHJpY3MgPSBjaXJjdWl0LT5tZXRyaWNzW2xldmVsIC0gMV07CisJICAgICAgbGlzdG5vZGVfYWRkICh0bHZfZGF0YS5pc19uZWlnaHMsIGlzX25laWdoKTsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSBDSVJDVUlUX1RfUDJQOgorCSAgbmVpID0gY2lyY3VpdC0+dS5wMnAubmVpZ2hib3I7CisJICBpZiAobmVpICYmIChsZXZlbCAmIG5laS0+Y2lyY3VpdF90KSkKKwkgICAgeworCSAgICAgIGlmICh0bHZfZGF0YS5pc19uZWlnaHMgPT0gTlVMTCkKKwkJeworCQkgIHRsdl9kYXRhLmlzX25laWdocyA9IGxpc3RfbmV3ICgpOworCQkgIHRsdl9kYXRhLmlzX25laWdocy0+ZGVsID0gZnJlZV90bHY7CisJCX0KKwkgICAgICBpc19uZWlnaCA9IFhNQUxMT0MgKE1UWVBFX0lTSVNfVExWLCBzaXplb2YgKHN0cnVjdCBpc19uZWlnaCkpOworCSAgICAgIG1lbXNldCAoaXNfbmVpZ2gsIDAsIHNpemVvZiAoc3RydWN0IGlzX25laWdoKSk7CisJICAgICAgbWVtY3B5IChpc19uZWlnaC0+bmVpZ2hfaWQsIG5laS0+c3lzaWQsIElTSVNfU1lTX0lEX0xFTik7CisJICAgICAgaXNfbmVpZ2gtPm1ldHJpY3MgPSBjaXJjdWl0LT5tZXRyaWNzW2xldmVsIC0gMV07CisJICAgICAgbGlzdG5vZGVfYWRkICh0bHZfZGF0YS5pc19uZWlnaHMsIGlzX25laWdoKTsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSBDSVJDVUlUX1RfU1RBVElDX0lOOgorCSAgemxvZ193YXJuICgibHNwX2FyZWFfY3JlYXRlOiB1bnN1cHBvcnRlZCBjaXJjdWl0IHR5cGUiKTsKKwkgIGJyZWFrOworCWNhc2UgQ0lSQ1VJVF9UX1NUQVRJQ19PVVQ6CisJICB6bG9nX3dhcm4gKCJsc3BfYXJlYV9jcmVhdGU6IHVuc3VwcG9ydGVkIGNpcmN1aXQgdHlwZSIpOworCSAgYnJlYWs7CisJY2FzZSBDSVJDVUlUX1RfREE6CisJICB6bG9nX3dhcm4gKCJsc3BfYXJlYV9jcmVhdGU6IHVuc3VwcG9ydGVkIGNpcmN1aXQgdHlwZSIpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHpsb2dfd2FybiAoImxzcF9hcmVhX2NyZWF0ZTogdW5rbm93biBjaXJjdWl0IHR5cGUiKTsKKwl9CisgICAgfQorCisgIHdoaWxlICh0bHZfZGF0YS5pcHY0X2ludF9yZWFjaHMgJiYgbGlzdGNvdW50ICh0bHZfZGF0YS5pcHY0X2ludF9yZWFjaHMpKQorICAgIHsKKyAgICAgIGlmIChsc3AtPnRsdl9kYXRhLmlwdjRfaW50X3JlYWNocyA9PSBOVUxMKQorCWxzcC0+dGx2X2RhdGEuaXB2NF9pbnRfcmVhY2hzID0gbGlzdF9uZXcgKCk7CisgICAgICBsc3BfdGx2X2ZpdCAobHNwLCAmdGx2X2RhdGEuaXB2NF9pbnRfcmVhY2hzLAorCQkgICAmbHNwLT50bHZfZGF0YS5pcHY0X2ludF9yZWFjaHMsCisJCSAgIElQVjRfUkVBQ0hfTEVOLCBhcmVhLT5sc3BfZnJhZ190aHJlc2hvbGQsCisJCSAgIHRsdl9hZGRfaXB2NF9yZWFjaHMpOworICAgICAgaWYgKHRsdl9kYXRhLmlwdjRfaW50X3JlYWNocyAmJiBsaXN0Y291bnQgKHRsdl9kYXRhLmlwdjRfaW50X3JlYWNocykpCisJbHNwID0gbHNwX25leHRfZnJhZyAoTFNQX0ZSQUdNRU5UIChsc3AtPmxzcF9oZWFkZXItPmxzcF9pZCkgKyAxLAorCQkJICAgICBsc3AwLCBhcmVhLCBsZXZlbCk7CisgICAgfQorCisjaWZkZWYgIEhBVkVfSVBWNgorICB3aGlsZSAodGx2X2RhdGEuaXB2Nl9yZWFjaHMgJiYgbGlzdGNvdW50ICh0bHZfZGF0YS5pcHY2X3JlYWNocykpCisgICAgeworICAgICAgaWYgKGxzcC0+dGx2X2RhdGEuaXB2Nl9yZWFjaHMgPT0gTlVMTCkKKwlsc3AtPnRsdl9kYXRhLmlwdjZfcmVhY2hzID0gbGlzdF9uZXcgKCk7CisgICAgICBsc3BfdGx2X2ZpdCAobHNwLCAmdGx2X2RhdGEuaXB2Nl9yZWFjaHMsCisJCSAgICZsc3AtPnRsdl9kYXRhLmlwdjZfcmVhY2hzLAorCQkgICBJUFY2X1JFQUNIX0xFTiwgYXJlYS0+bHNwX2ZyYWdfdGhyZXNob2xkLAorCQkgICB0bHZfYWRkX2lwdjZfcmVhY2hzKTsKKyAgICAgIGlmICh0bHZfZGF0YS5pcHY2X3JlYWNocyAmJiBsaXN0Y291bnQgKHRsdl9kYXRhLmlwdjZfcmVhY2hzKSkKKwlsc3AgPSBsc3BfbmV4dF9mcmFnIChMU1BfRlJBR01FTlQgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkKSArIDEsCisJCQkgICAgIGxzcDAsIGFyZWEsIGxldmVsKTsKICAgICB9CiAjZW5kaWYgLyogSEFWRV9JUFY2ICovCi0gICAgCi0gICAgc3dpdGNoIChjaXJjdWl0LT5jaXJjX3R5cGUpIHsKLSAgICBjYXNlIENJUkNVSVRfVF9CUk9BRENBU1Q6Ci0gICAgICBpZiAobGV2ZWwgJiBjaXJjdWl0LT5jaXJjdWl0X2lzX3R5cGUpIHsKLSAgICAgICAgaWYgKHRsdl9kYXRhLmlzX25laWdocyA9PSBOVUxMKSB7Ci0gICAgICAgICAgdGx2X2RhdGEuaXNfbmVpZ2hzID0gbGlzdF9uZXcgKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaXNfbmVpZ2ggPSBYTUFMTE9DIChNVFlQRV9JU0lTX1RMViwgc2l6ZW9mIChzdHJ1Y3QgaXNfbmVpZ2gpKTsKLSAgICAgICAgbWVtc2V0IChpc19uZWlnaCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaXNfbmVpZ2gpKTsKLSAgICAgICAgaWYgKGxldmVsID09IDEpCi0gICAgICAgICAgbWVtY3B5IChpc19uZWlnaC0+bmVpZ2hfaWQsIAotICAgICAgICAgICAgICAgICAgY2lyY3VpdC0+dS5iYy5sMV9kZXNpZ19pcywgSVNJU19TWVNfSURfTEVOICsgMSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBtZW1jcHkgKGlzX25laWdoLT5uZWlnaF9pZCwgCi0gICAgICAgICAgICAgICAgICBjaXJjdWl0LT51LmJjLmwyX2Rlc2lnX2lzLCBJU0lTX1NZU19JRF9MRU4gKyAxKTsKLSAgICAgICAgICAgIGlzX25laWdoLT5tZXRyaWNzID0gY2lyY3VpdC0+bWV0cmljc1tsZXZlbCAtIDFdOwotICAgICAgICBsaXN0bm9kZV9hZGQgKHRsdl9kYXRhLmlzX25laWdocywgaXNfbmVpZ2gpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSVJDVUlUX1RfUDJQOgotICAgICAgbmVpID0gY2lyY3VpdC0+dS5wMnAubmVpZ2hib3I7IAotICAgICAgICBpZiAobmVpICYmIChsZXZlbCAmIG5laS0+Y2lyY3VpdF90KSkgewotICAgICAgICAgIGlmICh0bHZfZGF0YS5pc19uZWlnaHMgPT0gTlVMTCkgewotICAgICAgICAgICAgdGx2X2RhdGEuaXNfbmVpZ2hzID0gbGlzdF9uZXcgKCk7Ci0gICAgICAgICAgICB0bHZfZGF0YS5pc19uZWlnaHMtPmRlbCA9IGZyZWVfdGx2OwotICAgICAgICAgIH0KLSAgICAgICAgICBpc19uZWlnaCA9IFhNQUxMT0MgKE1UWVBFX0lTSVNfVExWLCBzaXplb2YgKHN0cnVjdCBpc19uZWlnaCkpOwotICAgICAgICAgIG1lbXNldCAoaXNfbmVpZ2gsIDAsIHNpemVvZiAoc3RydWN0IGlzX25laWdoKSk7Ci0gICAgICAgICAgbWVtY3B5IChpc19uZWlnaC0+bmVpZ2hfaWQsIG5laS0+c3lzaWQsIElTSVNfU1lTX0lEX0xFTik7Ci0gICAgICAgICAgaXNfbmVpZ2gtPm1ldHJpY3MgPSBjaXJjdWl0LT5tZXRyaWNzW2xldmVsIC0gMV07Ci0gICAgICAgICAgbGlzdG5vZGVfYWRkICh0bHZfZGF0YS5pc19uZWlnaHMsIGlzX25laWdoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgIENJUkNVSVRfVF9TVEFUSUNfSU46Ci0gICAgICB6bG9nX3dhcm4gKCJsc3BfYXJlYV9jcmVhdGU6IHVuc3VwcG9ydGVkIGNpcmN1aXQgdHlwZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAgQ0lSQ1VJVF9UX1NUQVRJQ19PVVQ6Ci0gICAgICB6bG9nX3dhcm4gKCJsc3BfYXJlYV9jcmVhdGU6IHVuc3VwcG9ydGVkIGNpcmN1aXQgdHlwZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSVJDVUlUX1RfREE6Ci0gICAgICB6bG9nX3dhcm4gKCJsc3BfYXJlYV9jcmVhdGU6IHVuc3VwcG9ydGVkIGNpcmN1aXQgdHlwZSIpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHpsb2dfd2FybiAoImxzcF9hcmVhX2NyZWF0ZTogdW5rbm93biBjaXJjdWl0IHR5cGUiKTsKKworICB3aGlsZSAodGx2X2RhdGEuaXNfbmVpZ2hzICYmIGxpc3Rjb3VudCAodGx2X2RhdGEuaXNfbmVpZ2hzKSkKKyAgICB7CisgICAgICBpZiAobHNwLT50bHZfZGF0YS5pc19uZWlnaHMgPT0gTlVMTCkKKwlsc3AtPnRsdl9kYXRhLmlzX25laWdocyA9IGxpc3RfbmV3ICgpOworICAgICAgbHNwX3Rsdl9maXQgKGxzcCwgJnRsdl9kYXRhLmlzX25laWdocywKKwkJICAgJmxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzLAorCQkgICBJU19ORUlHSEJPVVJTX0xFTiwgYXJlYS0+bHNwX2ZyYWdfdGhyZXNob2xkLAorCQkgICB0bHZfYWRkX2lzX25laWdocyk7CisgICAgICBpZiAodGx2X2RhdGEuaXNfbmVpZ2hzICYmIGxpc3Rjb3VudCAodGx2X2RhdGEuaXNfbmVpZ2hzKSkKKwlsc3AgPSBsc3BfbmV4dF9mcmFnIChMU1BfRlJBR01FTlQgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkKSArIDEsCisJCQkgICAgIGxzcDAsIGFyZWEsIGxldmVsKTsKICAgICB9Ci0gIH0KLSAgCi0gIHdoaWxlICh0bHZfZGF0YS5pcHY0X2ludF9yZWFjaHMgJiYgbGlzdGNvdW50KHRsdl9kYXRhLmlwdjRfaW50X3JlYWNocykpIHsKLSAgICBpZiAobHNwLT50bHZfZGF0YS5pcHY0X2ludF9yZWFjaHMgPT0gTlVMTCkKLSAgICAgIGxzcC0+dGx2X2RhdGEuaXB2NF9pbnRfcmVhY2hzID0gbGlzdF9uZXcgKCk7Ci0gICAgbHNwX3Rsdl9maXQgKGxzcCwgJnRsdl9kYXRhLmlwdjRfaW50X3JlYWNocywgCi0gICAgICAgICAgICAgICAgICZsc3AtPnRsdl9kYXRhLmlwdjRfaW50X3JlYWNocywKLSAgICAgICAgICAgICAgICAgSVBWNF9SRUFDSF9MRU4sIGFyZWEtPmxzcF9mcmFnX3RocmVzaG9sZCwgCi0gICAgICAgICAgICAgICAgIHRsdl9hZGRfaXB2NF9yZWFjaHMpOwotICAgIGlmICh0bHZfZGF0YS5pcHY0X2ludF9yZWFjaHMgJiYgbGlzdGNvdW50KHRsdl9kYXRhLmlwdjRfaW50X3JlYWNocykpCi0gICAgICBsc3AgPSBsc3BfbmV4dF9mcmFnIChMU1BfRlJBR01FTlQobHNwLT5sc3BfaGVhZGVyLT5sc3BfaWQpICsgMSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsc3AwLCBhcmVhLCBsZXZlbCk7Ci0gIH0KIAotI2lmZGVmICBIQVZFX0lQVjYgICAKLSAgd2hpbGUgKHRsdl9kYXRhLmlwdjZfcmVhY2hzICYmIGxpc3Rjb3VudCh0bHZfZGF0YS5pcHY2X3JlYWNocykpIHsKLSAgICBpZiAobHNwLT50bHZfZGF0YS5pcHY2X3JlYWNocyA9PSBOVUxMKQotICAgICAgbHNwLT50bHZfZGF0YS5pcHY2X3JlYWNocyA9IGxpc3RfbmV3ICgpOwotICAgIGxzcF90bHZfZml0IChsc3AsICZ0bHZfZGF0YS5pcHY2X3JlYWNocywgCi0gICAgICAgICAgICAgICAgICZsc3AtPnRsdl9kYXRhLmlwdjZfcmVhY2hzLAotICAgICAgICAgICAgICAgICBJUFY2X1JFQUNIX0xFTiwgYXJlYS0+bHNwX2ZyYWdfdGhyZXNob2xkLCAKLSAgICAgICAgICAgICAgICAgdGx2X2FkZF9pcHY2X3JlYWNocyk7Ci0gICAgaWYgKHRsdl9kYXRhLmlwdjZfcmVhY2hzICYmIGxpc3Rjb3VudCh0bHZfZGF0YS5pcHY2X3JlYWNocykpCi0gICAgICBsc3AgPSBsc3BfbmV4dF9mcmFnIChMU1BfRlJBR01FTlQobHNwLT5sc3BfaGVhZGVyLT5sc3BfaWQpICsgIDEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbHNwMCwgYXJlYSwgbGV2ZWwpOwotICB9Ci0jZW5kaWYgLyogSEFWRV9JUFY2ICovICAgCi0KLSAgd2hpbGUgKHRsdl9kYXRhLmlzX25laWdocyAmJiBsaXN0Y291bnQodGx2X2RhdGEuaXNfbmVpZ2hzKSkgewotICAgIGlmIChsc3AtPnRsdl9kYXRhLmlzX25laWdocyA9PSBOVUxMKQotICAgICAgbHNwLT50bHZfZGF0YS5pc19uZWlnaHMgPSBsaXN0X25ldyAoKTsKLSAgICBsc3BfdGx2X2ZpdCAobHNwLCAmdGx2X2RhdGEuaXNfbmVpZ2hzLCAKLSAgICAgICAgICAgICAgICAgJmxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzLAotICAgICAgICAgICAgICAgICBJU19ORUlHSEJPVVJTX0xFTiwgYXJlYS0+bHNwX2ZyYWdfdGhyZXNob2xkLCAKLSAgICAgICAgICAgICAgICAgdGx2X2FkZF9pc19uZWlnaHMpOwotICAgIGlmICh0bHZfZGF0YS5pc19uZWlnaHMgJiYgbGlzdGNvdW50KHRsdl9kYXRhLmlzX25laWdocykpCi0gICAgICBsc3AgPSBsc3BfbmV4dF9mcmFnIChMU1BfRlJBR01FTlQobHNwLT5sc3BfaGVhZGVyLT5sc3BfaWQpICsgMSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsc3AwLCBhcmVhLCBsZXZlbCk7Ci0gIH0KLSAgCi0gIAogICByZXR1cm47CiB9CiAjZW5kaWYKQEAgLTE1NDcsNTcgKzE2MDgsNTggQEAKICAgdV9jaGFyICp0bHZfcHRyOwogICBzdHJ1Y3QgaXNfbmVpZ2ggKmlzX25laWdoOwogCi0gICAKKwogICAvKiBhZGQgb3VyIG5scGlkcyAqLwotICAvKiB0aGUgMiBpcyBmb3IgdGhlIFRMIHBsdXMgMSBmb3IgdGhlIG5scGlkKi8KLSAgdGx2X3B0ciA9IGxzcHBkdV9yZWFsbG9jIChsc3AsTVRZUEVfSVNJU19UTFYsIDMpOwotICAqdGx2X3B0ciA9IFBST1RPQ09MU19TVVBQT1JURUQ7IC8qIFR5cGUgKi8KLSAgKih0bHZfcHRyKzEpID0gMTsgLyogb25lIHByb3RvY29sICovCi0jaWZkZWYgSEFWRV9JUFY2IC8qZHVubm8gaWYgaXRzIHJpZ2h0Ki8KLSAgKih0bHZfcHRyKzIpID0gIE5MUElEX0lQVjY7CisgIC8qIHRoZSAyIGlzIGZvciB0aGUgVEwgcGx1cyAxIGZvciB0aGUgbmxwaWQgKi8KKyAgdGx2X3B0ciA9IGxzcHBkdV9yZWFsbG9jIChsc3AsIE1UWVBFX0lTSVNfVExWLCAzKTsKKyAgKnRsdl9wdHIgPSBQUk9UT0NPTFNfU1VQUE9SVEVEOwkvKiBUeXBlICovCisgICoodGx2X3B0ciArIDEpID0gMTsJCS8qIG9uZSBwcm90b2NvbCAqLworI2lmZGVmIEhBVkVfSVBWNgkJLypkdW5ubyBpZiBpdHMgcmlnaHQgKi8KKyAgKih0bHZfcHRyICsgMikgPSBOTFBJRF9JUFY2OwogI2Vsc2UKLSAgKih0bHZfcHRyKzIpID0gIE5MUElEX0lQOworICAqKHRsdl9wdHIgKyAyKSA9IE5MUElEX0lQOwogI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwogCiAgIC8qIHdlIHNob3VsZCBhZGQgb3VyIGFyZWFzIGhlcmUKICAgICogRklYTUU6IHdlIG5lZWQgdG8gZmlndXJlIG91dCB3aGljaCBzaG91bGQgYmUgYWRkZWQ/IEFkaj8gQWxsPyBGaXJzdD8gKi8KIAogICAvKiBmaXJzdCwgbGV0cyBhZGQgb3Vyc2VsdmVzIHRvIHRoZSBJUyBuZWlnaGJvdXJzIGluZm8gKi8KLSAgLyogdGhlIDIgaXMgZm9yIHRoZSBUTCBwbHVzIDEgZm9yIHRoZSB2aXJ0dWFsIGZpZWxkKi8KLSAgdGx2X3B0ciA9IGxzcHBkdV9yZWFsbG9jKGxzcCxNVFlQRV9JU0lTX1RMViwgMyk7Ci0gICp0bHZfcHRyID0gSVNfTkVJR0hCT1VSUzsgLyogVHlwZSAqLwotICAqKHRsdl9wdHIrMikgPSAwOyAvKiB2aXJ0dWFsIGlzIHplcm8gKi8KLSAgbHNwLT50bHZfZGF0YS5pc19uZWlnaHMgPSBsaXN0X25ldyAoKTsgLyogbmV3IGxpc3Qgb2YgaXNfbmVpZ2hib3VycyAqLworICAvKiB0aGUgMiBpcyBmb3IgdGhlIFRMIHBsdXMgMSBmb3IgdGhlIHZpcnR1YWwgZmllbGQgKi8KKyAgdGx2X3B0ciA9IGxzcHBkdV9yZWFsbG9jIChsc3AsIE1UWVBFX0lTSVNfVExWLCAzKTsKKyAgKnRsdl9wdHIgPSBJU19ORUlHSEJPVVJTOwkvKiBUeXBlICovCisgICoodGx2X3B0ciArIDIpID0gMDsJCS8qIHZpcnR1YWwgaXMgemVybyAqLworICBsc3AtPnRsdl9kYXRhLmlzX25laWdocyA9IGxpc3RfbmV3ICgpOwkvKiBuZXcgbGlzdCBvZiBpc19uZWlnaGJvdXJzICovCiAgIC8qIGFzc2lnbiBzcGFjZSBmb3IgdGhlIGlzX25laWdoIGF0IHRoZSBwZHUgZW5kICovCi0gIGlzX25laWdoID0gKHN0cnVjdCBpc19uZWlnaCopIGxzcHBkdV9yZWFsbG9jKGxzcCxNVFlQRV9JU0lTX1RMViwgCi0JCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGlzX25laWdoKSk7IAorICBpc19uZWlnaCA9IChzdHJ1Y3QgaXNfbmVpZ2ggKikgbHNwcGR1X3JlYWxsb2MgKGxzcCwgTVRZUEVfSVNJU19UTFYsCisJCQkJCQkgc2l6ZW9mIChzdHJ1Y3QgaXNfbmVpZ2gpKTsKICAgLyogYWRkIHRoaXMgbm9kZSB0byBvdXIgbGlzdCAqLwotICBsaXN0bm9kZV9hZGQgKGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzLCBpc19uZWlnaCk7IAorICBsaXN0bm9kZV9hZGQgKGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzLCBpc19uZWlnaCk7CiAgIC8qIEZJWE1FOiBEbyB3ZSBuZWVkIG91ciBkZXNpZ25hdGVkIGFkZHJlc3MgaGVyZT8gKi8KLSAgbWVtY3B5ICgmaXNfbmVpZ2gtPm5laWdoX2lkLCBpc2lzLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOICsgMSk7IAorICBtZW1jcHkgKCZpc19uZWlnaC0+bmVpZ2hfaWQsIGlzaXMtPnN5c2lkLCBJU0lTX1NZU19JRF9MRU4gKyAxKTsKICAgLyogRklYTUU6IFdoZXJlIHNob3VsZCB3ZSByZWFsbHkgZ2V0IG91ciBvd24gTFNQcyBtZXRyaWNzIGZyb20/ICovCi0gIGNpcmN1aXQgPSAoc3RydWN0IGlzaXNfY2lyY3VpdCopbGlzdGhlYWQoY2lyY3VpdF9saXN0KTsKLSAgLyogaXNfbmVpZ2gtPm1ldHJpY3MgPSBjaXJjdWl0LT5tZXRyaWNzW2xzcC0+bGV2ZWwgLTFdOyovCisgIGNpcmN1aXQgPSAoc3RydWN0IGlzaXNfY2lyY3VpdCAqKSBsaXN0aGVhZCAoY2lyY3VpdF9saXN0KTsKKyAgLyogaXNfbmVpZ2gtPm1ldHJpY3MgPSBjaXJjdWl0LT5tZXRyaWNzW2xzcC0+bGV2ZWwgLTFdOyAqLwogICAvKiBMZW5ndGggKi8KLSAgKih0bHZfcHRyKzEpPShsc3AtPnRsdl9kYXRhLmlzX25laWdocy0+Y291bnQgKiBzaXplb2Yoc3RydWN0IGlzX25laWdoKSArMSk7IAorICAqKHRsdl9wdHIgKyAxKSA9CisgICAgKGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzLT5jb3VudCAqIHNpemVvZiAoc3RydWN0IGlzX25laWdoKSArIDEpOwogCiAgIC8qIEZJWE1FOiBzY2FuIGZvciBhZGplbmNlY2llcyBhbmQgYWRkIHRoZW0gKi8KIAogICAvKiBGSVhNRTogYWRkIHJlYWNoYWJpbGl0eSBpbmZvICovCiAKLSAgLyogYWRkaW5nIGR5bmFtaWMgaG9zdG5hbWUgaWYgbmVlZGVkKi8KLSAgaWYgKGFyZWEtPmR5bmhvc3RuYW1lKSB7Ci0gICAgdGx2X3B0ciA9IGxzcHBkdV9yZWFsbG9jIChsc3AsTVRZUEVfSVNJU19UTFYsIDIpOyAvKiB0aGUgMiBpcyBmb3IgdGhlIFRMICovCi0gICAgKnRsdl9wdHIgPSBEWU5BTUlDX0hPU1ROQU1FOyAvKiBUeXBlICovCi0gICAgKih0bHZfcHRyKzEpID0gc3RybGVuICh1bml4X2hvc3RuYW1lKCkpOyAvKiBMZW5ndGggKi8KLSAgICBsc3AtPnRsdl9kYXRhLmhvc3RuYW1lID0gKHN0cnVjdCBob3N0bmFtZSAqKQotICAgICAgKGxzcHBkdV9yZWFsbG9jKGxzcCwKLQkJICAgICAgTVRZUEVfSVNJU19UTFYsCi0JCSAgICAgIC8qIHRoZSAtMSBpcyB0byBmaXQgdGhlIGxlbmd0aCBpbiB0aGUgc3RydWN0ICovCi0JCSAgICAgIHN0cmxlbiAodW5peF9ob3N0bmFtZSgpKSkgLSAxKTsgCi0gICAgbWVtY3B5IChsc3AtPnRsdl9kYXRhLmhvc3RuYW1lLT5uYW1lLCB1bml4X2hvc3RuYW1lKCksCi0gICAgICAgICAgICBzdHJsZW4odW5peF9ob3N0bmFtZSgpKSk7Ci0gIH0KKyAgLyogYWRkaW5nIGR5bmFtaWMgaG9zdG5hbWUgaWYgbmVlZGVkICovCisgIGlmIChhcmVhLT5keW5ob3N0bmFtZSkKKyAgICB7CisgICAgICB0bHZfcHRyID0gbHNwcGR1X3JlYWxsb2MgKGxzcCwgTVRZUEVfSVNJU19UTFYsIDIpOwkvKiB0aGUgMiBpcyBmb3IgdGhlIFRMICovCisgICAgICAqdGx2X3B0ciA9IERZTkFNSUNfSE9TVE5BTUU7CS8qIFR5cGUgKi8KKyAgICAgICoodGx2X3B0ciArIDEpID0gc3RybGVuICh1bml4X2hvc3RuYW1lICgpKTsJLyogTGVuZ3RoICovCisgICAgICBsc3AtPnRsdl9kYXRhLmhvc3RuYW1lID0gKHN0cnVjdCBob3N0bmFtZSAqKQorCShsc3BwZHVfcmVhbGxvYyAobHNwLCBNVFlQRV9JU0lTX1RMViwKKwkJCSAvKiB0aGUgLTEgaXMgdG8gZml0IHRoZSBsZW5ndGggaW4gdGhlIHN0cnVjdCAqLworCQkJIHN0cmxlbiAodW5peF9ob3N0bmFtZSAoKSkpIC0gMSk7CisgICAgICBtZW1jcHkgKGxzcC0+dGx2X2RhdGEuaG9zdG5hbWUtPm5hbWUsIHVuaXhfaG9zdG5hbWUgKCksCisJICAgICAgc3RybGVuICh1bml4X2hvc3RuYW1lICgpKSk7CisgICAgfQogCiB9CiAKQEAgLTE2MDUsOCArMTY2Nyw4IEBACiAgKiA3LjMuNyBHZW5lcmF0aW9uIG9uIG5vbi1wc2V1ZG9ub2RlIExTUHMKICAqLwogaW50Ci1sc3BfZ2VuZXJhdGVfbm9uX3BzZXVkbyAoc3RydWN0IGlzaXNfYXJlYSAqYXJlYSwgaW50IGxldmVsKSB7Ci0KK2xzcF9nZW5lcmF0ZV9ub25fcHNldWRvIChzdHJ1Y3QgaXNpc19hcmVhICphcmVhLCBpbnQgbGV2ZWwpCit7CiAgIHN0cnVjdCBpc2lzX2xzcCAqb2xkbHNwLCAqbmV3bHNwOwogICB1X2ludDMyX3Qgc2VxX251bSA9IDA7CiAgIHVfY2hhciBsc3BpZFtJU0lTX1NZU19JRF9MRU4gKyAyXTsKQEAgLTE2MTUsMzIgKzE2NzcsMzMgQEAKICAgbWVtY3B5ICgmbHNwaWQsIGlzaXMtPnN5c2lkLCBJU0lTX1NZU19JRF9MRU4pOwogCiAgIC8qIG9ubHkgYnVpbGRzIHRoZSBsc3AgaWYgdGhlIGFyZWEgc2hhcmVzIHRoZSBsZXZlbCAqLwotICBpZiAoKGFyZWEtPmlzX3R5cGUgJiBsZXZlbCkgPT0gbGV2ZWwpIHsgCi0gICAgb2xkbHNwID0gbHNwX3NlYXJjaCAobHNwaWQsIGFyZWEtPmxzcGRiW2xldmVsLTFdKTsKLSAgICBpZiAob2xkbHNwKSB7Ci0gICAgICBzZXFfbnVtID0gbnRvaGwgKG9sZGxzcC0+bHNwX2hlYWRlci0+c2VxX251bSk7Ci0gICAgICBsc3Bfc2VhcmNoX2FuZF9kZXN0cm95IChvbGRsc3AtPmxzcF9oZWFkZXItPmxzcF9pZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhLT5sc3BkYltsZXZlbC0xXSk7Ci0gICAgICAvKiBGSVhNRTogd2Ugc2hvdWxkIGFjdHVhbGx5IGluaXRpYXRlIGEgcHVyZ2UgKi8KLSAgICB9Ci0gICAgbmV3bHNwID0gbHNwX25ldyAobHNwaWQsIGFyZWEtPm1heF9sc3BfbGlmZXRpbWVbbGV2ZWwtMV0sIHNlcV9udW0sIAotICAgICAgICAgICAgICAgICAgICAgIGFyZWEtPmlzX3R5cGUsIDAsIGxldmVsKTsKLSAgICBuZXdsc3AtPm93bl9sc3AgPSAxOwotICAgIAotICAgIGxzcF9pbnNlcnQgKG5ld2xzcCwgYXJlYS0+bHNwZGJbbGV2ZWwtMV0pOwotICAgIC8qIGJ1aWxkX2xzcF9kYXRhIChuZXdsc3AsIGFyZWEpOyAqLwotICAgIGxzcF9idWlsZF9ub25wc2V1ZG8gKG5ld2xzcCwgYXJlYSk7Ci0gICAgLyogdGltZSB0byBjYWxjdWxhdGUgb3VyIGNoZWNrc3VtICovCi0gICAgbHNwX3NlcW51bV91cGRhdGUgKG5ld2xzcCk7Ci0gIH0KKyAgaWYgKChhcmVhLT5pc190eXBlICYgbGV2ZWwpID09IGxldmVsKQorICAgIHsKKyAgICAgIG9sZGxzcCA9IGxzcF9zZWFyY2ggKGxzcGlkLCBhcmVhLT5sc3BkYltsZXZlbCAtIDFdKTsKKyAgICAgIGlmIChvbGRsc3ApCisJeworCSAgc2VxX251bSA9IG50b2hsIChvbGRsc3AtPmxzcF9oZWFkZXItPnNlcV9udW0pOworCSAgbHNwX3NlYXJjaF9hbmRfZGVzdHJveSAob2xkbHNwLT5sc3BfaGVhZGVyLT5sc3BfaWQsCisJCQkJICBhcmVhLT5sc3BkYltsZXZlbCAtIDFdKTsKKwkgIC8qIEZJWE1FOiB3ZSBzaG91bGQgYWN0dWFsbHkgaW5pdGlhdGUgYSBwdXJnZSAqLworCX0KKyAgICAgIG5ld2xzcCA9IGxzcF9uZXcgKGxzcGlkLCBhcmVhLT5tYXhfbHNwX2xpZmV0aW1lW2xldmVsIC0gMV0sIHNlcV9udW0sCisJCQlhcmVhLT5pc190eXBlLCAwLCBsZXZlbCk7CisgICAgICBuZXdsc3AtPm93bl9sc3AgPSAxOwogCisgICAgICBsc3BfaW5zZXJ0IChuZXdsc3AsIGFyZWEtPmxzcGRiW2xldmVsIC0gMV0pOworICAgICAgLyogYnVpbGRfbHNwX2RhdGEgKG5ld2xzcCwgYXJlYSk7ICovCisgICAgICBsc3BfYnVpbGRfbm9ucHNldWRvIChuZXdsc3AsIGFyZWEpOworICAgICAgLyogdGltZSB0byBjYWxjdWxhdGUgb3VyIGNoZWNrc3VtICovCisgICAgICBsc3Bfc2VxbnVtX3VwZGF0ZSAobmV3bHNwKTsKKyAgICB9CiAKICAgLyogREVCVUdfQURKX1BBQ0tFVFMgKi8KLSAgaWYgKGlzaXMtPmRlYnVncyAmIERFQlVHX0FESl9QQUNLRVRTKSB7Ci0gICAgLyogRklYTUU6IGlzIHRoaXMgcGxhY2UgcmlnaHQ/IGZpeCBtaXNzaW5nIGluZm8gKi8KLSAgICB6bG9nX2luZm8gKCJJU0lTLVVwZCAoJXMpOiBCdWlsZGluZyBMJWQgTFNQIiwKLSAgICAgICAgICAgICAgIGFyZWEtPmFyZWFfdGFnLCBsZXZlbCk7Ci0gIH0KKyAgaWYgKGlzaXMtPmRlYnVncyAmIERFQlVHX0FESl9QQUNLRVRTKQorICAgIHsKKyAgICAgIC8qIEZJWE1FOiBpcyB0aGlzIHBsYWNlIHJpZ2h0PyBmaXggbWlzc2luZyBpbmZvICovCisgICAgICB6bG9nX2luZm8gKCJJU0lTLVVwZCAoJXMpOiBCdWlsZGluZyBMJWQgTFNQIiwgYXJlYS0+YXJlYV90YWcsIGxldmVsKTsKKyAgICB9CiAKICAgcmV0dXJuIElTSVNfT0s7CiB9CkBAIC0xNjUxLDIxICsxNzE0LDIwIEBACiBpbnQKIGxzcF9sMV9nZW5lcmF0ZSAoc3RydWN0IGlzaXNfYXJlYSAqYXJlYSkKIHsKLSAgVEhSRUFEX1RJTUVSX09OKG1hc3RlciwgYXJlYS0+dF9sc3BfcmVmcmVzaFswXSwgbHNwX3JlZnJlc2hfbDEsIGFyZWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfTFNQX0dFTl9JTlRFUlZBTCk7CisgIFRIUkVBRF9USU1FUl9PTiAobWFzdGVyLCBhcmVhLT50X2xzcF9yZWZyZXNoWzBdLCBsc3BfcmVmcmVzaF9sMSwgYXJlYSwKKwkJICAgTUFYX0xTUF9HRU5fSU5URVJWQUwpOwogCiAgIHJldHVybiBsc3BfZ2VuZXJhdGVfbm9uX3BzZXVkbyAoYXJlYSwgMSk7CiB9CiAKLQogLyoKICAqIDcuMy45IEdlbmVyYXRpb24gb2YgbGV2ZWwgMiBMU1BzIChub24tcHNldWRvbm9kZSkKICAqLwogaW50CiBsc3BfbDJfZ2VuZXJhdGUgKHN0cnVjdCBpc2lzX2FyZWEgKmFyZWEpCiB7Ci0gIFRIUkVBRF9USU1FUl9PTihtYXN0ZXIsIGFyZWEtPnRfbHNwX3JlZnJlc2hbMV0sIGxzcF9yZWZyZXNoX2wyLCBhcmVhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0xTUF9HRU5fSU5URVJWQUwpOworICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgYXJlYS0+dF9sc3BfcmVmcmVzaFsxXSwgbHNwX3JlZnJlc2hfbDIsIGFyZWEsCisJCSAgIE1BWF9MU1BfR0VOX0lOVEVSVkFMKTsKIAogICByZXR1cm4gbHNwX2dlbmVyYXRlX25vbl9wc2V1ZG8gKGFyZWEsIDIpOwogfQpAQCAtMTY4MCw0NSArMTc0Miw0OSBAQAogCiAgIG1lbXNldCAobHNwaWQsIDAsIElTSVNfU1lTX0lEX0xFTiArIDIpOwogICBtZW1jcHkgKGxzcGlkLCBpc2lzLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOKTsKLSAgCisKICAgbHNwID0gbHNwX3NlYXJjaCAobHNwaWQsIGxzcGRiKTsKLSAgCi0gIGlmICghbHNwKSB7Ci0gICAgemxvZ19lcnIgKCJJU0lTLVVwZCAoJXMpOiBsc3Bfbm9uX3BzZXVkb19yZWdlbmVyYXRlKCk6IG5vIEwlZCBMU1AgZm91bmQhIiwKLSAgICAgICAgICAgICAgYXJlYS0+YXJlYV90YWcsCSAgICAgIAotCSAgICAgIGxldmVsKTsKIAotICAgIHJldHVybiBJU0lTX0VSUk9SOwotICB9CisgIGlmICghbHNwKQorICAgIHsKKyAgICAgIHpsb2dfZXJyCisJKCJJU0lTLVVwZCAoJXMpOiBsc3Bfbm9uX3BzZXVkb19yZWdlbmVyYXRlKCk6IG5vIEwlZCBMU1AgZm91bmQhIiwKKwkgYXJlYS0+YXJlYV90YWcsIGxldmVsKTsKIAotICBsc3BfY2xlYXJfZGF0YSAobHNwKTsgIAorICAgICAgcmV0dXJuIElTSVNfRVJST1I7CisgICAgfQorCisgIGxzcF9jbGVhcl9kYXRhIChsc3ApOwogICBsc3BfYnVpbGRfbm9ucHNldWRvIChsc3AsIGFyZWEpOwotICBsc3AtPmxzcF9oZWFkZXItPnJlbV9saWZldGltZSA9IGh0b25zIChpc2lzX2ppdHRlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFyZWEtPm1heF9sc3BfbGlmZXRpbWVbbGV2ZWwtMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfQUdFX0pJVFRFUikpOworICBsc3AtPmxzcF9oZWFkZXItPnJlbV9saWZldGltZSA9IGh0b25zIChpc2lzX2ppdHRlcgorCQkJCQkgKGFyZWEtPm1heF9sc3BfbGlmZXRpbWVbbGV2ZWwgLSAxXSwKKwkJCQkJICBNQVhfQUdFX0pJVFRFUikpOwogICBsc3Bfc2VxbnVtX3VwZGF0ZSAobHNwKTsKLSAgICAKLSAgaWYgKGlzaXMtPmRlYnVncyAmIERFQlVHX1VQREFURV9QQUNLRVRTKSB7Ci0gICAgemxvZ19pbmZvICgiSVNJUy1VcGQgKCVzKTogcmVmcmVzaGluZyBvdXIgTCVkIExTUCAlcywgIgotCSAgICAgICAic2VxIDB4JTA4eCwgY2tzdW0gMHglMDR4IGxpZmV0aW1lICV1cyIsCi0JICAgICAgIGFyZWEtPmFyZWFfdGFnLAotCSAgICAgICBsZXZlbCwKLSAgICAgICAgICAgICAgIHJhd2xzcGlkX3ByaW50IChsc3AtPmxzcF9oZWFkZXItPmxzcF9pZCksCi0JICAgICAgIG50b2hsKGxzcC0+bHNwX2hlYWRlci0+c2VxX251bSksCi0JICAgICAgIG50b2hzKGxzcC0+bHNwX2hlYWRlci0+Y2hlY2tzdW0pLAotCSAgICAgICBudG9ocyhsc3AtPmxzcF9oZWFkZXItPnJlbV9saWZldGltZSkpOyAKLSAgfQorCisgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19VUERBVEVfUEFDS0VUUykKKyAgICB7CisgICAgICB6bG9nX2luZm8gKCJJU0lTLVVwZCAoJXMpOiByZWZyZXNoaW5nIG91ciBMJWQgTFNQICVzLCAiCisJCSAic2VxIDB4JTA4eCwgY2tzdW0gMHglMDR4IGxpZmV0aW1lICV1cyIsCisJCSBhcmVhLT5hcmVhX3RhZywKKwkJIGxldmVsLAorCQkgcmF3bHNwaWRfcHJpbnQgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkKSwKKwkJIG50b2hsIChsc3AtPmxzcF9oZWFkZXItPnNlcV9udW0pLAorCQkgbnRvaHMgKGxzcC0+bHNwX2hlYWRlci0+Y2hlY2tzdW0pLAorCQkgbnRvaHMgKGxzcC0+bHNwX2hlYWRlci0+cmVtX2xpZmV0aW1lKSk7CisgICAgfQogCiAgIGxzcC0+bGFzdF9nZW5lcmF0ZWQgPSB0aW1lIChOVUxMKTsKICAgYXJlYS0+bHNwX3JlZ2VuZXJhdGVfcGVuZGluZ1tsZXZlbCAtIDFdID0gMDsKICAgSVNJU19GTEFHU19TRVRfQUxMIChsc3AtPlNSTWZsYWdzKTsKLSAgZm9yIChub2RlID0gbGlzdGhlYWQgKGxzcC0+bHNwdS5mcmFncyk7IG5vZGU7IG5leHRub2RlKG5vZGUpKSB7Ci0gICAgZnJhZyA9IGdldGRhdGEgKG5vZGUpOwotICAgIGZyYWctPmxzcF9oZWFkZXItPnJlbV9saWZldGltZSA9IGh0b25zIChpc2lzX2ppdHRlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFyZWEtPm1heF9sc3BfbGlmZXRpbWVbbGV2ZWwtMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfQUdFX0pJVFRFUikpOwotICAgIElTSVNfRkxBR1NfU0VUX0FMTCAoZnJhZy0+U1JNZmxhZ3MpOwotICB9CisgIGZvciAobm9kZSA9IGxpc3RoZWFkIChsc3AtPmxzcHUuZnJhZ3MpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisgICAgeworICAgICAgZnJhZyA9IGdldGRhdGEgKG5vZGUpOworICAgICAgZnJhZy0+bHNwX2hlYWRlci0+cmVtX2xpZmV0aW1lID0gaHRvbnMgKGlzaXNfaml0dGVyCisJCQkJCSAgICAgIChhcmVhLT4KKwkJCQkJICAgICAgIG1heF9sc3BfbGlmZXRpbWVbbGV2ZWwgLSAxXSwKKwkJCQkJICAgICAgIE1BWF9BR0VfSklUVEVSKSk7CisgICAgICBJU0lTX0ZMQUdTX1NFVF9BTEwgKGZyYWctPlNSTWZsYWdzKTsKKyAgICB9CiAKICAgaWYgKGFyZWEtPmlwX2NpcmN1aXRzKQogICAgIGlzaXNfc3BmX3NjaGVkdWxlIChhcmVhLCBsZXZlbCk7CkBAIC0xNzI5LDEyICsxNzk1LDExIEBACiAgIHJldHVybiBJU0lTX09LOwogfQogCi0KIC8qCiAgKiBEb25lIGF0IGxlYXN0IGV2ZXJ5IE1BWF9MU1BfR0VOX0lOVEVSVkFMLiBTZWFyY2ggb3duIExTUHMsIHVwZGF0ZSBob2xkaW5nCiAgKiB0aW1lIGFuZCBzZXQgU1JNCiAgKi8KLWludCAKK2ludAogbHNwX3JlZnJlc2hfbDEgKHN0cnVjdCB0aHJlYWQgKnRocmVhZCkKIHsKICAgc3RydWN0IGlzaXNfYXJlYSAqYXJlYTsKQEAgLTE3NDIsMjEgKzE4MDcsMjEgQEAKIAogICBhcmVhID0gVEhSRUFEX0FSRyAodGhyZWFkKTsKICAgYXNzZXJ0IChhcmVhKTsKLSAgCisKICAgYXJlYS0+dF9sc3BfcmVmcmVzaFswXSA9IE5VTEw7Ci0gIGlmIChhcmVhLT5pc190eXBlICYgSVNfTEVWRUxfMSkgCisgIGlmIChhcmVhLT5pc190eXBlICYgSVNfTEVWRUxfMSkKICAgICBsc3Bfbm9uX3BzZXVkb19yZWdlbmVyYXRlIChhcmVhLCAxKTsKLSAgCi0gIHJlZl90aW1lID0gIGFyZWEtPmxzcF9yZWZyZXNoWzBdID4gTUFYX0xTUF9HRU5fSU5URVJWQUwgPyAKKworICByZWZfdGltZSA9IGFyZWEtPmxzcF9yZWZyZXNoWzBdID4gTUFYX0xTUF9HRU5fSU5URVJWQUwgPwogICAgIE1BWF9MU1BfR0VOX0lOVEVSVkFMIDogYXJlYS0+bHNwX3JlZnJlc2hbMF07CiAKLSAgVEhSRUFEX1RJTUVSX09OKG1hc3RlciwgYXJlYS0+dF9sc3BfcmVmcmVzaFswXSwgbHNwX3JlZnJlc2hfbDEsIGFyZWEsCi0gICAgICBpc2lzX2ppdHRlcihyZWZfdGltZSwgTUFYX0FHRV9KSVRURVIpKTsKKyAgVEhSRUFEX1RJTUVSX09OIChtYXN0ZXIsIGFyZWEtPnRfbHNwX3JlZnJlc2hbMF0sIGxzcF9yZWZyZXNoX2wxLCBhcmVhLAorCQkgICBpc2lzX2ppdHRlciAocmVmX3RpbWUsIE1BWF9BR0VfSklUVEVSKSk7CiAKICAgcmV0dXJuIElTSVNfT0s7CiB9CiAKLWludCAKK2ludAogbHNwX3JlZnJlc2hfbDIgKHN0cnVjdCB0aHJlYWQgKnRocmVhZCkKIHsKICAgc3RydWN0IGlzaXNfYXJlYSAqYXJlYTsKQEAgLTE3NjQsMjEgKzE4MjksMjAgQEAKIAogICBhcmVhID0gVEhSRUFEX0FSRyAodGhyZWFkKTsKICAgYXNzZXJ0IChhcmVhKTsKLSAgCisKICAgYXJlYS0+dF9sc3BfcmVmcmVzaFsxXSA9IE5VTEw7Ci0gIGlmIChhcmVhLT5pc190eXBlICYgSVNfTEVWRUxfMikgCisgIGlmIChhcmVhLT5pc190eXBlICYgSVNfTEVWRUxfMikKICAgICBsc3Bfbm9uX3BzZXVkb19yZWdlbmVyYXRlIChhcmVhLCAyKTsKIAotICByZWZfdGltZSA9ICBhcmVhLT5sc3BfcmVmcmVzaFsxXSA+IE1BWF9MU1BfR0VOX0lOVEVSVkFMID8gCisgIHJlZl90aW1lID0gYXJlYS0+bHNwX3JlZnJlc2hbMV0gPiBNQVhfTFNQX0dFTl9JTlRFUlZBTCA/CiAgICAgTUFYX0xTUF9HRU5fSU5URVJWQUwgOiBhcmVhLT5sc3BfcmVmcmVzaFsxXTsKIAotICBUSFJFQURfVElNRVJfT04obWFzdGVyLCBhcmVhLT50X2xzcF9yZWZyZXNoWzFdLCBsc3BfcmVmcmVzaF9sMiwgYXJlYSwKLSAgICAgIGlzaXNfaml0dGVyKHJlZl90aW1lLCBNQVhfQUdFX0pJVFRFUikpOworICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgYXJlYS0+dF9sc3BfcmVmcmVzaFsxXSwgbHNwX3JlZnJlc2hfbDIsIGFyZWEsCisJCSAgIGlzaXNfaml0dGVyIChyZWZfdGltZSwgTUFYX0FHRV9KSVRURVIpKTsKIAogICByZXR1cm4gSVNJU19PSzsKIH0KIAotCiAvKgogICogU29tZXRoaW5nIGhhcyBjaGFuZ2VkIC0+IHJlZ2VuZXJhdGUgTFNQCiAgKi8KQEAgLTE4MDEsNjAgKzE4NjUsNjYgQEAKIAogICBhcmVhID0gVEhSRUFEX0FSRyAodGhyZWFkKTsKICAgYXJlYS0+bHNwX3JlZ2VuZXJhdGVfcGVuZGluZ1sxXSA9IDA7Ci0gIAorCiAgIHJldHVybiBsc3Bfbm9uX3BzZXVkb19yZWdlbmVyYXRlIChhcmVhLCAyKTsKIH0KIAotaW50IAoraW50CiBsc3BfcmVnZW5lcmF0ZV9zY2hlZHVsZSAoc3RydWN0IGlzaXNfYXJlYSAqYXJlYSkKIHsKICAgc3RydWN0IGlzaXNfbHNwICpsc3A7CiAgIHVfY2hhciBpZFtJU0lTX1NZU19JRF9MRU4gKyAyXTsKICAgdGltZV90IG5vdywgZGlmZjsKLSAgbWVtY3B5KGlkLCBpc2lzLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOKTsKLSAgTFNQX1BTRVVET19JRChpZCkgPSBMU1BfRlJBR01FTlQoaWQpID0gMDsKKyAgbWVtY3B5IChpZCwgaXNpcy0+c3lzaWQsIElTSVNfU1lTX0lEX0xFTik7CisgIExTUF9QU0VVRE9fSUQgKGlkKSA9IExTUF9GUkFHTUVOVCAoaWQpID0gMDsKICAgbm93ID0gdGltZSAoTlVMTCk7CiAgIC8qCiAgICAqIEZpcnN0IGxldmVsIDEKICAgICovCi0gIGlmIChhcmVhLT5pc190eXBlICYgSVNfTEVWRUxfMSkgewotICAgIGxzcCA9IGxzcF9zZWFyY2ggKGlkLCBhcmVhLT5sc3BkYlswXSk7Ci0gICAgaWYgKCFsc3AgfHwgYXJlYS0+bHNwX3JlZ2VuZXJhdGVfcGVuZGluZ1swXSkKLSAgICAgIGdvdG8gTDI7Ci0gICAgLyoKLSAgICAgKiBUaHJvdHRsZSBhdm9pZGFuY2UKLSAgICAgKi8KLSAgICBkaWZmID0gbm93IC0gbHNwLT5sYXN0X2dlbmVyYXRlZDsKLSAgICBpZiAoZGlmZiA8IE1JTl9MU1BfR0VOX0lOVEVSVkFMKSB7Ci0gICAgICBhcmVhLT5sc3BfcmVnZW5lcmF0ZV9wZW5kaW5nWzBdID0gMTsKLSAgICAgIHRocmVhZF9hZGRfdGltZXIgKG1hc3RlciwgbHNwX2wxX3JlZ2VuZXJhdGUsIGFyZWEsIAotICAgICAgICAgICAgICAgICAgICAgICAgTUlOX0xTUF9HRU5fSU5URVJWQUwgLSBkaWZmKTsKLSAgICAgIHJldHVybiBJU0lTX09LOwotICAgIH0gZWxzZQotICAgICAgbHNwX25vbl9wc2V1ZG9fcmVnZW5lcmF0ZSAoYXJlYSwgMSk7Ci0gIH0KKyAgaWYgKGFyZWEtPmlzX3R5cGUgJiBJU19MRVZFTF8xKQorICAgIHsKKyAgICAgIGxzcCA9IGxzcF9zZWFyY2ggKGlkLCBhcmVhLT5sc3BkYlswXSk7CisgICAgICBpZiAoIWxzcCB8fCBhcmVhLT5sc3BfcmVnZW5lcmF0ZV9wZW5kaW5nWzBdKQorCWdvdG8gTDI7CisgICAgICAvKgorICAgICAgICogVGhyb3R0bGUgYXZvaWRhbmNlCisgICAgICAgKi8KKyAgICAgIGRpZmYgPSBub3cgLSBsc3AtPmxhc3RfZ2VuZXJhdGVkOworICAgICAgaWYgKGRpZmYgPCBNSU5fTFNQX0dFTl9JTlRFUlZBTCkKKwl7CisJICBhcmVhLT5sc3BfcmVnZW5lcmF0ZV9wZW5kaW5nWzBdID0gMTsKKwkgIHRocmVhZF9hZGRfdGltZXIgKG1hc3RlciwgbHNwX2wxX3JlZ2VuZXJhdGUsIGFyZWEsCisJCQkgICAgTUlOX0xTUF9HRU5fSU5URVJWQUwgLSBkaWZmKTsKKwkgIHJldHVybiBJU0lTX09LOworCX0KKyAgICAgIGVsc2UKKwlsc3Bfbm9uX3BzZXVkb19yZWdlbmVyYXRlIChhcmVhLCAxKTsKKyAgICB9CiAgIC8qCiAgICAqIHRoZW4gMgogICAgKi8KLSBMMjoKLSAgaWYgKGFyZWEtPmlzX3R5cGUgJiBJU19MRVZFTF8yKSB7Ci0gICAgbHNwID0gbHNwX3NlYXJjaCAoaWQsIGFyZWEtPmxzcGRiWzFdKTsKLSAgICBpZiAoIWxzcCB8fCBhcmVhLT5sc3BfcmVnZW5lcmF0ZV9wZW5kaW5nWzFdKQotICAgICAgcmV0dXJuIElTSVNfT0s7Ci0gICAgLyoKLSAgICAgKiBUaHJvdHRsZSBhdm9pZGFuY2UKLSAgICAgKi8KLSAgICBkaWZmID0gbm93IC0gbHNwLT5sYXN0X2dlbmVyYXRlZDsKLSAgICBpZiAoZGlmZiA8IE1JTl9MU1BfR0VOX0lOVEVSVkFMKSB7Ci0gICAgICBhcmVhLT5sc3BfcmVnZW5lcmF0ZV9wZW5kaW5nWzFdID0gMTsKLSAgICAgIHRocmVhZF9hZGRfdGltZXIgKG1hc3RlciwgbHNwX2wyX3JlZ2VuZXJhdGUsIGFyZWEsIAotICAgICAgICAgICAgICAgICAgICAgICAgTUlOX0xTUF9HRU5fSU5URVJWQUwgLSBkaWZmKTsKLSAgICAgIHJldHVybiBJU0lTX09LOwotICAgIH0gZWxzZQotICAgICAgbHNwX25vbl9wc2V1ZG9fcmVnZW5lcmF0ZSAoYXJlYSwgMik7IAotICB9Ci0gICAgCi0gIHJldHVybiBJU0lTX09LOyAKK0wyOgorICBpZiAoYXJlYS0+aXNfdHlwZSAmIElTX0xFVkVMXzIpCisgICAgeworICAgICAgbHNwID0gbHNwX3NlYXJjaCAoaWQsIGFyZWEtPmxzcGRiWzFdKTsKKyAgICAgIGlmICghbHNwIHx8IGFyZWEtPmxzcF9yZWdlbmVyYXRlX3BlbmRpbmdbMV0pCisJcmV0dXJuIElTSVNfT0s7CisgICAgICAvKgorICAgICAgICogVGhyb3R0bGUgYXZvaWRhbmNlCisgICAgICAgKi8KKyAgICAgIGRpZmYgPSBub3cgLSBsc3AtPmxhc3RfZ2VuZXJhdGVkOworICAgICAgaWYgKGRpZmYgPCBNSU5fTFNQX0dFTl9JTlRFUlZBTCkKKwl7CisJICBhcmVhLT5sc3BfcmVnZW5lcmF0ZV9wZW5kaW5nWzFdID0gMTsKKwkgIHRocmVhZF9hZGRfdGltZXIgKG1hc3RlciwgbHNwX2wyX3JlZ2VuZXJhdGUsIGFyZWEsCisJCQkgICAgTUlOX0xTUF9HRU5fSU5URVJWQUwgLSBkaWZmKTsKKwkgIHJldHVybiBJU0lTX09LOworCX0KKyAgICAgIGVsc2UKKwlsc3Bfbm9uX3BzZXVkb19yZWdlbmVyYXRlIChhcmVhLCAyKTsKKyAgICB9CisKKyAgcmV0dXJuIElTSVNfT0s7CiB9CiAKIC8qCkBAIC0xODY1LDggKzE5MzUsOCBAQAogICogNy4zLjggYW5kIDcuMy4xMCBHZW5lcmF0aW9uIG9mIGxldmVsIDEgYW5kIDIgcHNldWRvbm9kZSBMU1BzIAogICovCiB2b2lkCi1sc3BfYnVpbGRfcHNldWRvIChzdHJ1Y3QgaXNpc19sc3AgKmxzcCwgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgCi0gICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpCitsc3BfYnVpbGRfcHNldWRvIChzdHJ1Y3QgaXNpc19sc3AgKmxzcCwgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwKKwkJICBpbnQgbGV2ZWwpCiB7CiAgIHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqOwogICBzdHJ1Y3QgaXNfbmVpZ2ggKmlzX25laWdoOwpAQCAtMTg3NywxMCArMTk0NywxMCBAQAogCiAgIGFzc2VydCAoY2lyY3VpdCk7CiAgIGFzc2VydCAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QpOwotICAKKwogICBpZiAoIWNpcmN1aXQtPnUuYmMuaXNfZHJbbGV2ZWwgLSAxXSkKLSAgICByZXR1cm47IC8qIHdlIGFyZSBub3QgRElTIG9uIHRoaXMgY2lyY3VpdCAqLwotICAKKyAgICByZXR1cm47CQkJLyogd2UgYXJlIG5vdCBESVMgb24gdGhpcyBjaXJjdWl0ICovCisKICAgbHNwLT5sZXZlbCA9IGxldmVsOwogICBpZiAobGV2ZWwgPT0gMSkKICAgICBsc3AtPmxzcF9oZWFkZXItPmxzcF9iaXRzIHw9IElTX0xFVkVMXzE7CkBAIC0xODkwLDU2ICsxOTYwLDYzIEBACiAgIC8qCiAgICAqIGFkZCBzZWxmIHRvIElTIG5laWdoYm91cnMgCiAgICAqLwotICBpZiAobHNwLT50bHZfZGF0YS5pc19uZWlnaHMgPT0gTlVMTCkgewotICAgIGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzID0gbGlzdF9uZXcgKCk7Ci0gICAgbHNwLT50bHZfZGF0YS5pc19uZWlnaHMtPmRlbCA9IGZyZWVfdGx2OwotICB9CisgIGlmIChsc3AtPnRsdl9kYXRhLmlzX25laWdocyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzID0gbGlzdF9uZXcgKCk7CisgICAgICBsc3AtPnRsdl9kYXRhLmlzX25laWdocy0+ZGVsID0gZnJlZV90bHY7CisgICAgfQogICBpc19uZWlnaCA9IFhNQUxMT0MgKE1UWVBFX0lTSVNfVExWLCBzaXplb2YgKHN0cnVjdCBpc19uZWlnaCkpOwogICBtZW1zZXQgKGlzX25laWdoLCAwLCBzaXplb2YgKHN0cnVjdCBpc19uZWlnaCkpOwogICBtZW1jcHkgKCZpc19uZWlnaC0+bmVpZ2hfaWQsIGlzaXMtPnN5c2lkLCBJU0lTX1NZU19JRF9MRU4pOwogICBsaXN0bm9kZV9hZGQgKGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzLCBpc19uZWlnaCk7Ci0gIAotICBhZGpfbGlzdCA9IGxpc3RfbmV3KCk7Ci0gIGlzaXNfYWRqX2J1aWxkX3VwX2xpc3QgKGNpcmN1aXQtPnUuYmMuYWRqZGJbbGV2ZWwtMV0sIGFkal9saXN0KTsKLSAgCi0gIGZvciAobm9kZSA9IGxpc3RoZWFkIChhZGpfbGlzdCk7IG5vZGU7IG5leHRub2RlIChub2RlKSl7Ci0gICAgYWRqID0gZ2V0ZGF0YSAobm9kZSk7Ci0gICAgaWYgKGFkai0+Y2lyY3VpdF90ICYgbGV2ZWwpIHsKLSAgICAgIGlmICgobGV2ZWwgPT0gMSAmJiBhZGotPnN5c190eXBlID09IElTSVNfU1lTVFlQRV9MMV9JUykgfHwKLSAgICAgICAgICAobGV2ZWwgPT0gMSAmJiBhZGotPnN5c190eXBlID09IElTSVNfU1lTVFlQRV9MMl9JUyAmJgotICAgICAgICAgICBhZGotPmFkal91c2FnZSA9PSBJU0lTX0FESl9MRVZFTDFBTkQyKSB8fAotICAgICAgICAgIChsZXZlbCA9PSAyICYmIGFkai0+c3lzX3R5cGUgPT0gSVNJU19TWVNUWVBFX0wyX0lTKSkgewotICAgICAgICAvKiBhbiBJUyBuZWlnaGJvdXIgLT4gYWRkIGl0ICovCi0gICAgICAgIGlzX25laWdoID0gWE1BTExPQyAoTVRZUEVfSVNJU19UTFYsIHNpemVvZiAoc3RydWN0IGlzX25laWdoKSk7Ci0gICAgICAgIG1lbXNldCAoaXNfbmVpZ2gsIDAsIHNpemVvZiAoc3RydWN0IGlzX25laWdoKSk7Ci0gICAgICAgIG1lbWNweSAoJmlzX25laWdoLT5uZWlnaF9pZCwgYWRqLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOKTsKLSAgICAgICAgbGlzdG5vZGVfYWRkIChsc3AtPnRsdl9kYXRhLmlzX25laWdocywgaXNfbmVpZ2gpOwotICAgICAgfSBlbHNlIGlmIChsZXZlbCA9PSAxICYmIGFkai0+c3lzX3R5cGUgPT0gSVNJU19TWVNUWVBFX0VTKSB7Ci0gICAgICAgIC8qIGFuIEVTIG5laWdib3VyIGFkZCBpdCwgaWYgd2UgYXJlIGJ1aWxkaW5nIGxldmVsIDEgTFNQICovCi0gICAgICAgIC8qIEZJWE1FOiB0aGUgdGx2LWZvcm1hdCBpcyBoYXJkIHRvIHVzZSBoZXJlICovCi0gICAgICAgIGlmIChsc3AtPnRsdl9kYXRhLmVzX25laWdocyA9PSBOVUxMKSB7Ci0gICAgICAgICAgbHNwLT50bHZfZGF0YS5lc19uZWlnaHMgPSBsaXN0X25ldyAoKTsKLSAgICAgICAgICBsc3AtPnRsdl9kYXRhLmVzX25laWdocy0+ZGVsID0gZnJlZV90bHY7Ci0gICAgICAgIH0KLSAgICAgICAgZXNfbmVpZ2ggPSBYTUFMTE9DIChNVFlQRV9JU0lTX1RMViwgc2l6ZW9mIChzdHJ1Y3QgZXNfbmVpZ2gpKTsKLSAgICAgICAgbWVtc2V0IChlc19uZWlnaCwgMCwgc2l6ZW9mIChzdHJ1Y3QgZXNfbmVpZ2gpKTsKLSAgICAgICAgbWVtY3B5ICgmZXNfbmVpZ2gtPmZpcnN0X2VzX25laWdoLCBhZGotPnN5c2lkLCBJU0lTX1NZU19JRF9MRU4pOwotICAgICAgICBsaXN0bm9kZV9hZGQgKGxzcC0+dGx2X2RhdGEuZXNfbmVpZ2hzLCBpc19uZWlnaCk7Ci0gICAgICB9CisKKyAgYWRqX2xpc3QgPSBsaXN0X25ldyAoKTsKKyAgaXNpc19hZGpfYnVpbGRfdXBfbGlzdCAoY2lyY3VpdC0+dS5iYy5hZGpkYltsZXZlbCAtIDFdLCBhZGpfbGlzdCk7CisKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGFkal9saXN0KTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorICAgIHsKKyAgICAgIGFkaiA9IGdldGRhdGEgKG5vZGUpOworICAgICAgaWYgKGFkai0+Y2lyY3VpdF90ICYgbGV2ZWwpCisJeworCSAgaWYgKChsZXZlbCA9PSAxICYmIGFkai0+c3lzX3R5cGUgPT0gSVNJU19TWVNUWVBFX0wxX0lTKSB8fAorCSAgICAgIChsZXZlbCA9PSAxICYmIGFkai0+c3lzX3R5cGUgPT0gSVNJU19TWVNUWVBFX0wyX0lTICYmCisJICAgICAgIGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMUFORDIpIHx8CisJICAgICAgKGxldmVsID09IDIgJiYgYWRqLT5zeXNfdHlwZSA9PSBJU0lTX1NZU1RZUEVfTDJfSVMpKQorCSAgICB7CisJICAgICAgLyogYW4gSVMgbmVpZ2hib3VyIC0+IGFkZCBpdCAqLworCSAgICAgIGlzX25laWdoID0gWE1BTExPQyAoTVRZUEVfSVNJU19UTFYsIHNpemVvZiAoc3RydWN0IGlzX25laWdoKSk7CisJICAgICAgbWVtc2V0IChpc19uZWlnaCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaXNfbmVpZ2gpKTsKKwkgICAgICBtZW1jcHkgKCZpc19uZWlnaC0+bmVpZ2hfaWQsIGFkai0+c3lzaWQsIElTSVNfU1lTX0lEX0xFTik7CisJICAgICAgbGlzdG5vZGVfYWRkIChsc3AtPnRsdl9kYXRhLmlzX25laWdocywgaXNfbmVpZ2gpOworCSAgICB9CisJICBlbHNlIGlmIChsZXZlbCA9PSAxICYmIGFkai0+c3lzX3R5cGUgPT0gSVNJU19TWVNUWVBFX0VTKQorCSAgICB7CisJICAgICAgLyogYW4gRVMgbmVpZ2JvdXIgYWRkIGl0LCBpZiB3ZSBhcmUgYnVpbGRpbmcgbGV2ZWwgMSBMU1AgKi8KKwkgICAgICAvKiBGSVhNRTogdGhlIHRsdi1mb3JtYXQgaXMgaGFyZCB0byB1c2UgaGVyZSAqLworCSAgICAgIGlmIChsc3AtPnRsdl9kYXRhLmVzX25laWdocyA9PSBOVUxMKQorCQl7CisJCSAgbHNwLT50bHZfZGF0YS5lc19uZWlnaHMgPSBsaXN0X25ldyAoKTsKKwkJICBsc3AtPnRsdl9kYXRhLmVzX25laWdocy0+ZGVsID0gZnJlZV90bHY7CisJCX0KKwkgICAgICBlc19uZWlnaCA9IFhNQUxMT0MgKE1UWVBFX0lTSVNfVExWLCBzaXplb2YgKHN0cnVjdCBlc19uZWlnaCkpOworCSAgICAgIG1lbXNldCAoZXNfbmVpZ2gsIDAsIHNpemVvZiAoc3RydWN0IGVzX25laWdoKSk7CisJICAgICAgbWVtY3B5ICgmZXNfbmVpZ2gtPmZpcnN0X2VzX25laWdoLCBhZGotPnN5c2lkLCBJU0lTX1NZU19JRF9MRU4pOworCSAgICAgIGxpc3Rub2RlX2FkZCAobHNwLT50bHZfZGF0YS5lc19uZWlnaHMsIGlzX25laWdoKTsKKwkgICAgfQorCX0KICAgICB9Ci0gIH0KLSAgCisKICAgc3RyZWFtX3NldF9wdXRwIChsc3AtPnBkdSwgSVNJU19GSVhFRF9IRFJfTEVOICsgSVNJU19MU1BfSERSX0xFTik7CiAgIC8qCiAgICAqIEFkZCB0aGUgYXV0aGVudGljYXRpb24gaW5mbyBpZiBpdCdzIHByZXNlbnQKICAgICovCi0gIChsZXZlbCA9PSAxKSA/IChwYXNzd2QgPSAmY2lyY3VpdC0+YXJlYS0+YXJlYV9wYXNzd2QpIDogCi0gICAgICAgICAgICAgICAgIChwYXNzd2QgPSAmY2lyY3VpdC0+YXJlYS0+ZG9tYWluX3Bhc3N3ZCk7Ci0gIGlmIChwYXNzd2QtPnR5cGUpIHsKLSAgICBtZW1jcHkgKCZsc3AtPnRsdl9kYXRhLmF1dGhfaW5mbywgcGFzc3dkLCBzaXplb2YgKHN0cnVjdCBpc2lzX3Bhc3N3ZCkpOwotICAgIHRsdl9hZGRfYXV0aGluZm8gKHBhc3N3ZC0+dHlwZSwgcGFzc3dkLT5sZW4sCi0JCSAgICAgIHBhc3N3ZC0+cGFzc3dkLCBsc3AtPnBkdSk7Ci0gIH0KKyAgKGxldmVsID09IDEpID8gKHBhc3N3ZCA9ICZjaXJjdWl0LT5hcmVhLT5hcmVhX3Bhc3N3ZCkgOgorICAgIChwYXNzd2QgPSAmY2lyY3VpdC0+YXJlYS0+ZG9tYWluX3Bhc3N3ZCk7CisgIGlmIChwYXNzd2QtPnR5cGUpCisgICAgeworICAgICAgbWVtY3B5ICgmbHNwLT50bHZfZGF0YS5hdXRoX2luZm8sIHBhc3N3ZCwgc2l6ZW9mIChzdHJ1Y3QgaXNpc19wYXNzd2QpKTsKKyAgICAgIHRsdl9hZGRfYXV0aGluZm8gKHBhc3N3ZC0+dHlwZSwgcGFzc3dkLT5sZW4sIHBhc3N3ZC0+cGFzc3dkLCBsc3AtPnBkdSk7CisgICAgfQogCiAgIGlmIChsc3AtPnRsdl9kYXRhLmlzX25laWdocyAmJiBsaXN0Y291bnQgKGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzKSA+IDApCiAgICAgdGx2X2FkZF9pc19uZWlnaHMgKGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzLCBsc3AtPnBkdSk7CkBAIC0xOTQ4LDkgKzIwMjUsOSBAQAogICAgIHRsdl9hZGRfaXNfbmVpZ2hzIChsc3AtPnRsdl9kYXRhLmVzX25laWdocywgbHNwLT5wZHUpOwogCiAgIGxzcC0+bHNwX2hlYWRlci0+cGR1X2xlbiA9IGh0b25zIChzdHJlYW1fZ2V0X3B1dHAgKGxzcC0+cGR1KSk7Ci0gIGlzb19jc3VtX2NyZWF0ZSAoU1RSRUFNX0RBVEEgKGxzcC0+cGR1KSArIDEyLCAKLSAgICAgICAgICAgICAgICAgICBudG9ocyhsc3AtPmxzcF9oZWFkZXItPnBkdV9sZW4pIC0gMTIsIDEyKTsKLSAgCisgIGlzb19jc3VtX2NyZWF0ZSAoU1RSRUFNX0RBVEEgKGxzcC0+cGR1KSArIDEyLAorCQkgICBudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5wZHVfbGVuKSAtIDEyLCAxMik7CisKICAgbGlzdF9kZWxldGUgKGFkal9saXN0KTsKIAogICByZXR1cm47CkBAIC0xOTYyLDQxICsyMDM5LDQyIEBACiAgIGRpY3RfdCAqbHNwZGIgPSBjaXJjdWl0LT5hcmVhLT5sc3BkYltsZXZlbCAtIDFdOwogICBzdHJ1Y3QgaXNpc19sc3AgKmxzcDsKICAgdV9jaGFyIGxzcF9pZFtJU0lTX1NZU19JRF9MRU4gKyAyXTsKLSAgCisKICAgbWVtY3B5IChsc3BfaWQsIGlzaXMtPnN5c2lkLCBJU0lTX1NZU19JRF9MRU4pOwotICBMU1BfUFNFVURPX0lEKGxzcF9pZCkgPSBjaXJjdWl0LT5jaXJjdWl0X2lkOwotICBMU1BfRlJBR01FTlQobHNwX2lkKSA9IDA7Ci0gIAorICBMU1BfUFNFVURPX0lEIChsc3BfaWQpID0gY2lyY3VpdC0+Y2lyY3VpdF9pZDsKKyAgTFNQX0ZSQUdNRU5UIChsc3BfaWQpID0gMDsKKwogICBsc3AgPSBsc3Bfc2VhcmNoIChsc3BfaWQsIGxzcGRiKTsKLSAgCi0gIGlmICghbHNwKSB7Ci0gICAgemxvZ19lcnIgKCJsc3BfcHNldWRvX3JlZ2VuZXJhdGUoKTogbm8gbCVkIExTUCAlcyBmb3VuZCEiLCBsZXZlbCwKLSAgICAgICAgICAgICAgcmF3bHNwaWRfcHJpbnQobHNwX2lkKSk7Ci0gICAgcmV0dXJuIElTSVNfRVJST1I7Ci0gIH0KLSAgbHNwX2NsZWFyX2RhdGEgKGxzcCk7ICAKKworICBpZiAoIWxzcCkKKyAgICB7CisgICAgICB6bG9nX2VyciAoImxzcF9wc2V1ZG9fcmVnZW5lcmF0ZSgpOiBubyBsJWQgTFNQICVzIGZvdW5kISIsIGxldmVsLAorCQlyYXdsc3BpZF9wcmludCAobHNwX2lkKSk7CisgICAgICByZXR1cm4gSVNJU19FUlJPUjsKKyAgICB9CisgIGxzcF9jbGVhcl9kYXRhIChsc3ApOwogCiAgIGxzcF9idWlsZF9wc2V1ZG8gKGxzcCwgY2lyY3VpdCwgbGV2ZWwpOwogCi0gIGxzcC0+bHNwX2hlYWRlci0+cmVtX2xpZmV0aW1lID0gCisgIGxzcC0+bHNwX2hlYWRlci0+cmVtX2xpZmV0aW1lID0KICAgICBodG9ucyAoaXNpc19qaXR0ZXIgKGNpcmN1aXQtPmFyZWEtPm1heF9sc3BfbGlmZXRpbWVbbGV2ZWwgLSAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9BR0VfSklUVEVSKSk7CisJCQlNQVhfQUdFX0pJVFRFUikpOwogCiAgIGxzcF9pbmNfc2VxbnVtIChsc3AsIDApOwotICAgIAotICBpZiAoaXNpcy0+ZGVidWdzICYgREVCVUdfVVBEQVRFX1BBQ0tFVFMpIHsKLSAgICB6bG9nX2luZm8gKCJJU0lTLVVwZCAoJXMpOiByZWZyZXNoaW5nIHBzZXVkbyBMU1AgTCVkICVzIiwgCi0gICAgICAgICAgICAgICBjaXJjdWl0LT5hcmVhLT5hcmVhX3RhZywgbGV2ZWwsCi0gICAgICAgICAgICAgICByYXdsc3BpZF9wcmludCAobHNwLT5sc3BfaGVhZGVyLT5sc3BfaWQpKTsgCi0gIH0KKworICBpZiAoaXNpcy0+ZGVidWdzICYgREVCVUdfVVBEQVRFX1BBQ0tFVFMpCisgICAgeworICAgICAgemxvZ19pbmZvICgiSVNJUy1VcGQgKCVzKTogcmVmcmVzaGluZyBwc2V1ZG8gTFNQIEwlZCAlcyIsCisJCSBjaXJjdWl0LT5hcmVhLT5hcmVhX3RhZywgbGV2ZWwsCisJCSByYXdsc3BpZF9wcmludCAobHNwLT5sc3BfaGVhZGVyLT5sc3BfaWQpKTsKKyAgICB9CiAKICAgbHNwLT5sYXN0X2dlbmVyYXRlZCA9IHRpbWUgKE5VTEwpOwogICBJU0lTX0ZMQUdTX1NFVF9BTEwgKGxzcC0+U1JNZmxhZ3MpOwotICAgIAorCiAgIHJldHVybiBJU0lTX09LOwogfQogCi0KIGludAogbHNwX2wxX3JlZnJlc2hfcHNldWRvIChzdHJ1Y3QgdGhyZWFkICp0aHJlYWQpCiB7CkBAIC0yMDA0LDMyICsyMDgyLDMzIEBACiAgIGludCByZXR2YWw7CiAgIHVuc2lnbmVkIGxvbmcgcmVmX3RpbWU7CiAKLSAgY2lyY3VpdCA9IFRIUkVBRF9BUkcodGhyZWFkKTsKLSAgCisgIGNpcmN1aXQgPSBUSFJFQURfQVJHICh0aHJlYWQpOworCiAgIGlmICghY2lyY3VpdC0+dS5iYy5pc19kclswXSkKLSAgICByZXR1cm4gSVNJU19FUlJPUjsgLyogRklYTUU6IHB1cmdlIGFuZCBzdWNoICovCi0gIAorICAgIHJldHVybiBJU0lTX0VSUk9SOwkJLyogRklYTUU6IHB1cmdlIGFuZCBzdWNoICovCisKICAgcmV0dmFsID0gbHNwX3BzZXVkb19yZWdlbmVyYXRlIChjaXJjdWl0LCAxKTsKLSAgCi0gIHJlZl90aW1lID0gIGNpcmN1aXQtPmFyZWEtPmxzcF9yZWZyZXNoWzBdID4gTUFYX0xTUF9HRU5fSU5URVJWQUwgPyAKKworICByZWZfdGltZSA9IGNpcmN1aXQtPmFyZWEtPmxzcF9yZWZyZXNoWzBdID4gTUFYX0xTUF9HRU5fSU5URVJWQUwgPwogICAgIE1BWF9MU1BfR0VOX0lOVEVSVkFMIDogY2lyY3VpdC0+YXJlYS0+bHNwX3JlZnJlc2hbMF07CiAKLSAgVEhSRUFEX1RJTUVSX09OKG1hc3RlciwgY2lyY3VpdC0+dS5iYy50X3JlZnJlc2hfcHNldWRvX2xzcFswXSwKLSAgICAgIGxzcF9sMV9yZWZyZXNoX3BzZXVkbywgY2lyY3VpdCwgaXNpc19qaXR0ZXIgKHJlZl90aW1lLCBNQVhfQUdFX0pJVFRFUikpOwotICAKKyAgVEhSRUFEX1RJTUVSX09OIChtYXN0ZXIsIGNpcmN1aXQtPnUuYmMudF9yZWZyZXNoX3BzZXVkb19sc3BbMF0sCisJCSAgIGxzcF9sMV9yZWZyZXNoX3BzZXVkbywgY2lyY3VpdCwKKwkJICAgaXNpc19qaXR0ZXIgKHJlZl90aW1lLCBNQVhfQUdFX0pJVFRFUikpOworCiAgIHJldHVybiByZXR2YWw7CiB9CiAKLWludCAKK2ludAogbHNwX2wxX3BzZXVkb19nZW5lcmF0ZSAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCkKIHsKICAgc3RydWN0IGlzaXNfbHNwICpsc3A7CiAgIHVfY2hhciBpZFtJU0lTX1NZU19JRF9MRU4gKyAyXTsKICAgdW5zaWduZWQgbG9uZyByZWZfdGltZTsKIAotICBtZW1jcHkoaWQsIGlzaXMtPnN5c2lkLCBJU0lTX1NZU19JRF9MRU4pOwotICBMU1BfRlJBR01FTlQoaWQpID0gMDsKLSAgTFNQX1BTRVVET19JRChpZCkgPSBjaXJjdWl0LT5jaXJjdWl0X2lkOworICBtZW1jcHkgKGlkLCBpc2lzLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOKTsKKyAgTFNQX0ZSQUdNRU5UIChpZCkgPSAwOworICBMU1BfUFNFVURPX0lEIChpZCkgPSBjaXJjdWl0LT5jaXJjdWl0X2lkOwogCiAgIC8qCiAgICAqIElmIGZvciBzb21lIHJlYXNvbiBoYXZlIGEgcHNldWRvIExTUCBpbiB0aGUgZGIgYWxyZWFkeSAtPiByZWdlbmVyYXRlCkBAIC0yMDM3LDE5ICsyMTE2LDIwIEBACiAgIGlmIChsc3Bfc2VhcmNoIChpZCwgY2lyY3VpdC0+YXJlYS0+bHNwZGJbMF0pKQogICAgIHJldHVybiBsc3BfcHNldWRvX3JlZ2VuZXJhdGUgKGNpcmN1aXQsIDEpOwogICBsc3AgPSBsc3BfbmV3IChpZCwgY2lyY3VpdC0+YXJlYS0+bWF4X2xzcF9saWZldGltZVswXSwKLSAgICAgICAgICAgICAgICAgMSwgY2lyY3VpdC0+YXJlYS0+aXNfdHlwZSwgMCwgMSk7Ci0gIAorCQkgMSwgY2lyY3VpdC0+YXJlYS0+aXNfdHlwZSwgMCwgMSk7CisKICAgbHNwX2J1aWxkX3BzZXVkbyAobHNwLCBjaXJjdWl0LCAxKTsKLSAgCisKICAgbHNwLT5vd25fbHNwID0gMTsKICAgbHNwX2luc2VydCAobHNwLCBjaXJjdWl0LT5hcmVhLT5sc3BkYlswXSk7CiAgIElTSVNfRkxBR1NfU0VUX0FMTCAobHNwLT5TUk1mbGFncyk7CiAKLSAgcmVmX3RpbWUgPSAgY2lyY3VpdC0+YXJlYS0+bHNwX3JlZnJlc2hbMF0gPiBNQVhfTFNQX0dFTl9JTlRFUlZBTCA/IAorICByZWZfdGltZSA9IGNpcmN1aXQtPmFyZWEtPmxzcF9yZWZyZXNoWzBdID4gTUFYX0xTUF9HRU5fSU5URVJWQUwgPwogICAgIE1BWF9MU1BfR0VOX0lOVEVSVkFMIDogY2lyY3VpdC0+YXJlYS0+bHNwX3JlZnJlc2hbMF07CiAKLSAgVEhSRUFEX1RJTUVSX09OKG1hc3RlciwgY2lyY3VpdC0+dS5iYy50X3JlZnJlc2hfcHNldWRvX2xzcFswXSwKLSAgICAgIGxzcF9sMV9yZWZyZXNoX3BzZXVkbywgY2lyY3VpdCwgaXNpc19qaXR0ZXIgKHJlZl90aW1lLCBNQVhfQUdFX0pJVFRFUikpOworICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgY2lyY3VpdC0+dS5iYy50X3JlZnJlc2hfcHNldWRvX2xzcFswXSwKKwkJICAgbHNwX2wxX3JlZnJlc2hfcHNldWRvLCBjaXJjdWl0LAorCQkgICBpc2lzX2ppdHRlciAocmVmX3RpbWUsIE1BWF9BR0VfSklUVEVSKSk7CiAKICAgcmV0dXJuIGxzcF9yZWdlbmVyYXRlX3NjaGVkdWxlIChjaXJjdWl0LT5hcmVhKTsKIH0KQEAgLTIwNjAsNjQgKzIxNDAsNjMgQEAKICAgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdDsKICAgaW50IHJldHZhbDsKICAgdW5zaWduZWQgbG9uZyByZWZfdGltZTsKLSAgY2lyY3VpdCA9IFRIUkVBRF9BUkcodGhyZWFkKTsKLSAgCisgIGNpcmN1aXQgPSBUSFJFQURfQVJHICh0aHJlYWQpOworCiAgIGlmICghY2lyY3VpdC0+dS5iYy5pc19kclsxXSkKLSAgICByZXR1cm4gSVNJU19FUlJPUjsgLyogRklYTUU6IHB1cmdlIGFuZCBzdWNoICovCi0gIAorICAgIHJldHVybiBJU0lTX0VSUk9SOwkJLyogRklYTUU6IHB1cmdlIGFuZCBzdWNoICovCisKICAgcmV0dmFsID0gbHNwX3BzZXVkb19yZWdlbmVyYXRlIChjaXJjdWl0LCAyKTsKIAotICByZWZfdGltZSA9ICBjaXJjdWl0LT5hcmVhLT5sc3BfcmVmcmVzaFsxXSA+IE1BWF9MU1BfR0VOX0lOVEVSVkFMID8gCisgIHJlZl90aW1lID0gY2lyY3VpdC0+YXJlYS0+bHNwX3JlZnJlc2hbMV0gPiBNQVhfTFNQX0dFTl9JTlRFUlZBTCA/CiAgICAgTUFYX0xTUF9HRU5fSU5URVJWQUwgOiBjaXJjdWl0LT5hcmVhLT5sc3BfcmVmcmVzaFsxXTsKIAotICBUSFJFQURfVElNRVJfT04obWFzdGVyLCBjaXJjdWl0LT51LmJjLnRfcmVmcmVzaF9wc2V1ZG9fbHNwWzFdLAotICAgICAgbHNwX2wyX3JlZnJlc2hfcHNldWRvLCBjaXJjdWl0LCBpc2lzX2ppdHRlciAocmVmX3RpbWUsIE1BWF9BR0VfSklUVEVSKSk7CisgIFRIUkVBRF9USU1FUl9PTiAobWFzdGVyLCBjaXJjdWl0LT51LmJjLnRfcmVmcmVzaF9wc2V1ZG9fbHNwWzFdLAorCQkgICBsc3BfbDJfcmVmcmVzaF9wc2V1ZG8sIGNpcmN1aXQsCisJCSAgIGlzaXNfaml0dGVyIChyZWZfdGltZSwgTUFYX0FHRV9KSVRURVIpKTsKIAogICByZXR1cm4gcmV0dmFsOwogfQogCi0KLWludCAKK2ludAogbHNwX2wyX3BzZXVkb19nZW5lcmF0ZSAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCkKIHsKICAgc3RydWN0IGlzaXNfbHNwICpsc3A7CiAgIHVfY2hhciBpZFtJU0lTX1NZU19JRF9MRU4gKyAyXTsKICAgdW5zaWduZWQgbG9uZyByZWZfdGltZTsKIAotICBtZW1jcHkoaWQsIGlzaXMtPnN5c2lkLCBJU0lTX1NZU19JRF9MRU4pOwotICBMU1BfRlJBR01FTlQoaWQpID0gMDsKLSAgTFNQX1BTRVVET19JRChpZCkgPSBjaXJjdWl0LT5jaXJjdWl0X2lkOworICBtZW1jcHkgKGlkLCBpc2lzLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOKTsKKyAgTFNQX0ZSQUdNRU5UIChpZCkgPSAwOworICBMU1BfUFNFVURPX0lEIChpZCkgPSBjaXJjdWl0LT5jaXJjdWl0X2lkOwogCiAgIGlmIChsc3Bfc2VhcmNoIChpZCwgY2lyY3VpdC0+YXJlYS0+bHNwZGJbMV0pKQogICAgIHJldHVybiBsc3BfcHNldWRvX3JlZ2VuZXJhdGUgKGNpcmN1aXQsIDIpOwogCiAgIGxzcCA9IGxzcF9uZXcgKGlkLCBjaXJjdWl0LT5hcmVhLT5tYXhfbHNwX2xpZmV0aW1lWzFdLAotICAgICAgICAgICAgICAgICAxLCBjaXJjdWl0LT5hcmVhLT5pc190eXBlLCAwLCAyKTsKKwkJIDEsIGNpcmN1aXQtPmFyZWEtPmlzX3R5cGUsIDAsIDIpOwogCiAgIGxzcF9idWlsZF9wc2V1ZG8gKGxzcCwgY2lyY3VpdCwgMik7Ci0gIAotICByZWZfdGltZSA9ICBjaXJjdWl0LT5hcmVhLT5sc3BfcmVmcmVzaFsxXSA+IE1BWF9MU1BfR0VOX0lOVEVSVkFMID8gCisKKyAgcmVmX3RpbWUgPSBjaXJjdWl0LT5hcmVhLT5sc3BfcmVmcmVzaFsxXSA+IE1BWF9MU1BfR0VOX0lOVEVSVkFMID8KICAgICBNQVhfTFNQX0dFTl9JTlRFUlZBTCA6IGNpcmN1aXQtPmFyZWEtPmxzcF9yZWZyZXNoWzFdOwogCiAKICAgbHNwLT5vd25fbHNwID0gMTsKICAgbHNwX2luc2VydCAobHNwLCBjaXJjdWl0LT5hcmVhLT5sc3BkYlsxXSk7CiAgIElTSVNfRkxBR1NfU0VUX0FMTCAobHNwLT5TUk1mbGFncyk7Ci0gICAgICAKLSAgVEhSRUFEX1RJTUVSX09OKG1hc3RlciwgY2lyY3VpdC0+dS5iYy50X3JlZnJlc2hfcHNldWRvX2xzcFsxXSwKLSAgICAgIGxzcF9sMl9yZWZyZXNoX3BzZXVkbywgY2lyY3VpdCwgaXNpc19qaXR0ZXIgKHJlZl90aW1lLCBNQVhfQUdFX0pJVFRFUikpOwotICAKKworICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgY2lyY3VpdC0+dS5iYy50X3JlZnJlc2hfcHNldWRvX2xzcFsxXSwKKwkJICAgbHNwX2wyX3JlZnJlc2hfcHNldWRvLCBjaXJjdWl0LAorCQkgICBpc2lzX2ppdHRlciAocmVmX3RpbWUsIE1BWF9BR0VfSklUVEVSKSk7CisKICAgcmV0dXJuIGxzcF9yZWdlbmVyYXRlX3NjaGVkdWxlIChjaXJjdWl0LT5hcmVhKTsKIH0KIAotCi0KIC8qCiAgKiBXYWxrIHRocm91Z2ggTFNQcyBmb3IgYW4gYXJlYQogICogIC0gc2V0IHJlbWFpbmluZyBsaWZldGltZQogICogIC0gc2V0IExTUHMgd2l0aCBTUk1mbGFnIHNldCBmb3Igc2VuZGluZwogICovCi1pbnQgCitpbnQKIGxzcF90aWNrIChzdHJ1Y3QgdGhyZWFkICp0aHJlYWQpCiB7CiAgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWE7CkBAIC0yMTI5LDgwICsyMjA4LDkyIEBACiAgIGludCBsZXZlbDsKIAogICBsc3BfbGlzdCA9IGxpc3RfbmV3ICgpOwotICAKKwogICBhcmVhID0gVEhSRUFEX0FSRyAodGhyZWFkKTsKICAgYXNzZXJ0IChhcmVhKTsKLSAgVEhSRUFEX1RJTUVSX09OKG1hc3RlciwgYXJlYS0+dF90aWNrLCBsc3BfdGljaywgYXJlYSwgMSk7CisgIFRIUkVBRF9USU1FUl9PTiAobWFzdGVyLCBhcmVhLT50X3RpY2ssIGxzcF90aWNrLCBhcmVhLCAxKTsKIAogICAvKgogICAgKiBCdWlsZCBhIGxpc3Qgb2YgTFNQcyB3aXRoIChhbnkpIFNSTWZsYWcgc2V0CiAgICAqIGFuZCByZW1vdmVkIHRoZSBvbmVzIHRoYXQgaGF2ZSBhZ2VkIG91dAogICAgKi8KLSAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgSVNJU19MRVZFTFM7IGxldmVsKyspIHsKLSAgICBpZiAoYXJlYS0+bHNwZGJbbGV2ZWxdICYmIGRpY3RfY291bnQgKGFyZWEtPmxzcGRiW2xldmVsXSkgPiAwKSB7Ci0gICAgICBkbm9kZSA9IGRpY3RfZmlyc3QgKGFyZWEtPmxzcGRiW2xldmVsXSk7Ci0gICAgICB3aGlsZSAoZG5vZGUgIT0gTlVMTCkgewotICAgICAgICBkbm9kZV9uZXh0ID0gZGljdF9uZXh0IChhcmVhLT5sc3BkYltsZXZlbF0sIGRub2RlKTsKLSAgICAgICAgbHNwID0gZG5vZGVfZ2V0IChkbm9kZSk7Ci0gICAgICAgIGxzcF9zZXRfdGltZSAobHNwKTsKLSAgICAgICAgaWYgKGxzcC0+YWdlX291dCA9PSAwKSB7CisgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IElTSVNfTEVWRUxTOyBsZXZlbCsrKQorICAgIHsKKyAgICAgIGlmIChhcmVhLT5sc3BkYltsZXZlbF0gJiYgZGljdF9jb3VudCAoYXJlYS0+bHNwZGJbbGV2ZWxdKSA+IDApCisJeworCSAgZG5vZGUgPSBkaWN0X2ZpcnN0IChhcmVhLT5sc3BkYltsZXZlbF0pOworCSAgd2hpbGUgKGRub2RlICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBkbm9kZV9uZXh0ID0gZGljdF9uZXh0IChhcmVhLT5sc3BkYltsZXZlbF0sIGRub2RlKTsKKwkgICAgICBsc3AgPSBkbm9kZV9nZXQgKGRub2RlKTsKKwkgICAgICBsc3Bfc2V0X3RpbWUgKGxzcCk7CisJICAgICAgaWYgKGxzcC0+YWdlX291dCA9PSAwKQorCQl7CiAKLSAgICAgICAgICB6bG9nX2luZm8gKCJJU0lTLVVwZCAoJXMpOiBMJXUgTFNQICVzIHNlcSAweCUwOHggYWdlZCBvdXQiLAotCQkgICAgIGFyZWEtPmFyZWFfdGFnLAotCQkgICAgIGxzcC0+bGV2ZWwsCi0JCSAgICAgcmF3bHNwaWRfcHJpbnQgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkKSwKLQkJICAgICBudG9obChsc3AtPmxzcF9oZWFkZXItPnNlcV9udW0pKTsKKwkJICB6bG9nX2luZm8gKCJJU0lTLVVwZCAoJXMpOiBMJXUgTFNQICVzIHNlcSAweCUwOHggYWdlZCBvdXQiLAorCQkJICAgICBhcmVhLT5hcmVhX3RhZywKKwkJCSAgICAgbHNwLT5sZXZlbCwKKwkJCSAgICAgcmF3bHNwaWRfcHJpbnQgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkKSwKKwkJCSAgICAgbnRvaGwgKGxzcC0+bHNwX2hlYWRlci0+c2VxX251bSkpOwogCi0gICAgICAgICAgbHNwX2Rlc3Ryb3kgKGxzcCk7Ci0gICAgICAgICAgZGljdF9kZWxldGUgKGFyZWEtPmxzcGRiW2xldmVsXSwgZG5vZGUpOwotICAgICAgICB9IGVsc2UgaWYgKGZsYWdzX2FueV9zZXQgKGxzcC0+U1JNZmxhZ3MpKQotICAgICAgICAgIGxpc3Rub2RlX2FkZCAobHNwX2xpc3QsIGxzcCk7Ci0gICAgICAgIGRub2RlID0gZG5vZGVfbmV4dDsKLSAgICAgIH0KKwkJICBsc3BfZGVzdHJveSAobHNwKTsKKwkJICBkaWN0X2RlbGV0ZSAoYXJlYS0+bHNwZGJbbGV2ZWxdLCBkbm9kZSk7CisJCX0KKwkgICAgICBlbHNlIGlmIChmbGFnc19hbnlfc2V0IChsc3AtPlNSTWZsYWdzKSkKKwkJbGlzdG5vZGVfYWRkIChsc3BfbGlzdCwgbHNwKTsKKwkgICAgICBkbm9kZSA9IGRub2RlX25leHQ7CisJICAgIH0KIAotICAgICAgLyoKLSAgICAgICAqIFNlbmQgTFNQcyBvbiBjaXJjdWl0cyBpbmRpY2F0ZWQgYnkgdGhlIFNSTWZsYWdzCi0gICAgICAgKi8KLSAgICAgIGlmIChsaXN0Y291bnQgKGxzcF9saXN0KSA+IDApIHsKLSAgICAgICAgZm9yIChjbm9kZSA9IGxpc3RoZWFkIChhcmVhLT5jaXJjdWl0X2xpc3QpOyBjbm9kZTsgbmV4dG5vZGUgKGNub2RlKSkgewotICAgICAgICAgIGNpcmN1aXQgPSBnZXRkYXRhIChjbm9kZSk7Ci0gICAgICAgICAgZm9yIChsc3Bub2RlID0gbGlzdGhlYWQgKGxzcF9saXN0KTsgbHNwbm9kZTsgbmV4dG5vZGUgKGxzcG5vZGUpKSB7Ci0gICAgICAgICAgICBsc3AgPSBnZXRkYXRhIChsc3Bub2RlKTsKLSAgICAgICAgICAgIGlmIChJU0lTX0NIRUNLX0ZMQUcgKGxzcC0+U1JNZmxhZ3MsIGNpcmN1aXQpKSB7Ci0JCQkJCQkJLyogRklYTUU6IGlmIHNhbWUgb3IgZWxkZXIgbHNwIGlzIGFscmVhZHkgaW4gbHNwIHF1ZXVlICovCi0JCQkJCQkJbGlzdG5vZGVfYWRkIChjaXJjdWl0LT5sc3BfcXVldWUsIGxzcCk7CQkJCi0gICAgICAgICAgICAgIHRocmVhZF9hZGRfZXZlbnQgKG1hc3Rlciwgc2VuZF9sc3AsIGNpcmN1aXQsIDApOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgbGlzdF9kZWxldGVfYWxsX25vZGUgKGxzcF9saXN0KTsKKwkgIC8qCisJICAgKiBTZW5kIExTUHMgb24gY2lyY3VpdHMgaW5kaWNhdGVkIGJ5IHRoZSBTUk1mbGFncworCSAgICovCisJICBpZiAobGlzdGNvdW50IChsc3BfbGlzdCkgPiAwKQorCSAgICB7CisJICAgICAgZm9yIChjbm9kZSA9IGxpc3RoZWFkIChhcmVhLT5jaXJjdWl0X2xpc3QpOyBjbm9kZTsKKwkJICAgbmV4dG5vZGUgKGNub2RlKSkKKwkJeworCQkgIGNpcmN1aXQgPSBnZXRkYXRhIChjbm9kZSk7CisJCSAgZm9yIChsc3Bub2RlID0gbGlzdGhlYWQgKGxzcF9saXN0KTsgbHNwbm9kZTsKKwkJICAgICAgIG5leHRub2RlIChsc3Bub2RlKSkKKwkJICAgIHsKKwkJICAgICAgbHNwID0gZ2V0ZGF0YSAobHNwbm9kZSk7CisJCSAgICAgIGlmIChJU0lTX0NIRUNLX0ZMQUcgKGxzcC0+U1JNZmxhZ3MsIGNpcmN1aXQpKQorCQkJeworCQkJICAvKiBGSVhNRTogaWYgc2FtZSBvciBlbGRlciBsc3AgaXMgYWxyZWFkeSBpbiBsc3AKKwkJCSAgICogcXVldWUgKi8KKwkJCSAgbGlzdG5vZGVfYWRkIChjaXJjdWl0LT5sc3BfcXVldWUsIGxzcCk7CisJCQkgIHRocmVhZF9hZGRfZXZlbnQgKG1hc3Rlciwgc2VuZF9sc3AsIGNpcmN1aXQsIDApOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0KKwkgIGxpc3RfZGVsZXRlX2FsbF9ub2RlIChsc3BfbGlzdCk7CisJfQogICAgIH0KLSAgfQogCiAgIGxpc3RfZGVsZXRlIChsc3BfbGlzdCk7CiAKICAgcmV0dXJuIElTSVNfT0s7CiB9CiAKLQogdm9pZAotbHNwX3B1cmdlX2RyICh1X2NoYXIgKmlkLCBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LCBpbnQgbGV2ZWwpCitsc3BfcHVyZ2VfZHIgKHVfY2hhciAqIGlkLCBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LCBpbnQgbGV2ZWwpCiB7CiAgIHN0cnVjdCBpc2lzX2xzcCAqbHNwOwotICAKKwogICBsc3AgPSBsc3Bfc2VhcmNoIChpZCwgY2lyY3VpdC0+YXJlYS0+bHNwZGJbbGV2ZWwgLSAxXSk7Ci0gIAotICBpZiAobHNwICYmIGxzcC0+cHVyZ2VkID09IDApIHsKLSAgICBsc3AtPmxzcF9oZWFkZXItPnJlbV9saWZldGltZSA9IGh0b25zICgwKTsKLSAgICBsc3AtPmxzcF9oZWFkZXItPnBkdV9sZW4gPSBodG9ucyAoSVNJU19GSVhFRF9IRFJfTEVOICsgSVNJU19MU1BfSERSX0xFTik7Ci0gICAgbHNwLT5wdXJnZWQgPSAwOwotICAgIGlzb19jc3VtX2NyZWF0ZSAoU1RSRUFNX0RBVEEgKGxzcC0+cGR1KSArIDEyLCAKLSAgICAgICAgICAgICAgICAgICAgIG50b2hzKGxzcC0+bHNwX2hlYWRlci0+cGR1X2xlbikgLSAxMiwgMTIpOwotICAgIElTSVNfRkxBR1NfU0VUX0FMTChsc3AtPlNSTWZsYWdzKTsKLSAgfSAKLSAgICAKLSAgICAKKworICBpZiAobHNwICYmIGxzcC0+cHVyZ2VkID09IDApCisgICAgeworICAgICAgbHNwLT5sc3BfaGVhZGVyLT5yZW1fbGlmZXRpbWUgPSBodG9ucyAoMCk7CisgICAgICBsc3AtPmxzcF9oZWFkZXItPnBkdV9sZW4gPQorCWh0b25zIChJU0lTX0ZJWEVEX0hEUl9MRU4gKyBJU0lTX0xTUF9IRFJfTEVOKTsKKyAgICAgIGxzcC0+cHVyZ2VkID0gMDsKKyAgICAgIGlzb19jc3VtX2NyZWF0ZSAoU1RSRUFNX0RBVEEgKGxzcC0+cGR1KSArIDEyLAorCQkgICAgICAgbnRvaHMgKGxzcC0+bHNwX2hlYWRlci0+cGR1X2xlbikgLSAxMiwgMTIpOworICAgICAgSVNJU19GTEFHU19TRVRfQUxMIChsc3AtPlNSTWZsYWdzKTsKKyAgICB9CisKICAgcmV0dXJuOwogfQogCkBAIC0yMjExLDggKzIzMDIsOCBAQAogICogLT4gRG8gYXMgaW4gNy4zLjE2LjQKICAqLwogdm9pZAotbHNwX3B1cmdlX25vbl9leGlzdCAoc3RydWN0IGlzaXNfbGlua19zdGF0ZV9oZHIgKmxzcF9oZHIsIAotICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlzaXNfYXJlYSAqYXJlYSkKK2xzcF9wdXJnZV9ub25fZXhpc3QgKHN0cnVjdCBpc2lzX2xpbmtfc3RhdGVfaGRyICpsc3BfaGRyLAorCQkgICAgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWEpCiB7CiAgIHN0cnVjdCBpc2lzX2xzcCAqbHNwOwogCkBAIC0yMjIyLDE3ICsyMzEzLDE3IEBACiAgIHpsb2dfaW5mbyAoIkxTUCBQVVJHRSBOT04gRVhJU1QiKTsKICAgbHNwID0gWE1BTExPQyAoTVRZUEVfSVNJU19MU1AsIHNpemVvZiAoc3RydWN0IGlzaXNfbHNwKSk7CiAgIG1lbXNldCAobHNwLCAwLCBzaXplb2YgKHN0cnVjdCBpc2lzX2xzcCkpOwotICAvKkZJWE1FOiBCVUcgQlVHIEJVRyEgdGhlIGxzcCBkb2Vzbid0IGV4aXN0IGhlcmUhKi8KLSAgLypkaWQgc210IGhlcmUsIG1heWJlIGdvb2QgcHJvYmFibHkgbm90Ki8KKyAgLypGSVhNRTogQlVHIEJVRyBCVUchIHRoZSBsc3AgZG9lc24ndCBleGlzdCBoZXJlISAqLworICAvKmRpZCBzbXQgaGVyZSwgbWF5YmUgZ29vZCBwcm9iYWJseSBub3QgKi8KICAgbHNwLT5sZXZlbCA9ICgobHNwX2hkci0+bHNwX2JpdHMgJiBMU1BCSVRfSVNUKSA9PSBJU19MRVZFTF8xKSA/IDEgOiAyOwogICBsc3AtPnBkdSA9IHN0cmVhbV9uZXcgKElTSVNfRklYRURfSERSX0xFTiArIElTSVNfTFNQX0hEUl9MRU4pOwotICBsc3AtPmlzaXNfaGVhZGVyID0gKHN0cnVjdCBpc2lzX2ZpeGVkX2hkciopU1RSRUFNX0RBVEEobHNwLT5wZHUpOworICBsc3AtPmlzaXNfaGVhZGVyID0gKHN0cnVjdCBpc2lzX2ZpeGVkX2hkciAqKSBTVFJFQU1fREFUQSAobHNwLT5wZHUpOwogICBmaWxsX2ZpeGVkX2hkciAobHNwLT5pc2lzX2hlYWRlciwgKGxzcC0+bGV2ZWwgPT0gMSkgPyBMMV9MSU5LX1NUQVRFCi0gICAgICAgICAgICAgICAgICA6IEwyX0xJTktfU1RBVEUpOwotICBsc3AtPmxzcF9oZWFkZXIgPSAoc3RydWN0IGlzaXNfbGlua19zdGF0ZV9oZHIqKShTVFJFQU1fREFUQShsc3AtPnBkdSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0lTX0ZJWEVEX0hEUl9MRU4pOyAgCisJCSAgOiBMMl9MSU5LX1NUQVRFKTsKKyAgbHNwLT5sc3BfaGVhZGVyID0gKHN0cnVjdCBpc2lzX2xpbmtfc3RhdGVfaGRyICopIChTVFJFQU1fREFUQSAobHNwLT5wZHUpICsKKwkJCQkJCSAgICBJU0lTX0ZJWEVEX0hEUl9MRU4pOwogICBtZW1jcHkgKGxzcC0+bHNwX2hlYWRlciwgbHNwX2hkciwgSVNJU19MU1BfSERSX0xFTik7Ci0gIAorCiAgIC8qCiAgICAqIFJldGFpbiBvbmx5IExTUCBoZWFkZXIKICAgICovCkBAIC0yMjQ0LDEzICsyMzM1LDEzIEBACiAgIC8qCiAgICAqIFB1dCB0aGUgbHNwIGludG8gTFNQZGIKICAgICovCi0gIGxzcF9pbnNlcnQgKGxzcCwgYXJlYS0+bHNwZGJbbHNwLT5sZXZlbC0xXSk7CisgIGxzcF9pbnNlcnQgKGxzcCwgYXJlYS0+bHNwZGJbbHNwLT5sZXZlbCAtIDFdKTsKIAogICAvKgogICAgKiBTZW5kIGluIHRvIHdob2xlIGFyZWEKICAgICovCiAgIElTSVNfRkxBR1NfU0VUX0FMTCAobHNwLT5TUk1mbGFncyk7Ci0gIAorCiAgIHJldHVybjsKIH0KIApAQCAtMjI1OCwyNyArMjM0OSwyOSBAQAogaW50CiB0b3BfbHNwX3JlZnJlc2ggKHN0cnVjdCB0aHJlYWQgKnRocmVhZCkKIHsKLSAgc3RydWN0IGlzaXNfbHNwICAqbHNwOworICBzdHJ1Y3QgaXNpc19sc3AgKmxzcDsKIAogICBsc3AgPSBUSFJFQURfQVJHICh0aHJlYWQpOwogICBhc3NlcnQgKGxzcCk7CiAKICAgbHNwLT50X2xzcF90b3BfcmVmID0gTlVMTDsKIAotICBsc3AtPmxzcF9oZWFkZXItPnJlbV9saWZldGltZSA9IGh0b25zIChpc2lzX2ppdHRlcihNQVhfQUdFLE1BWF9BR0VfSklUVEVSKSk7Ci0gIGxzcC0+bHNwX2hlYWRlci0+c2VxX251bSA9IGh0b25sKG50b2hsKGxzcC0+bHNwX2hlYWRlci0+c2VxX251bSkgKzEpOworICBsc3AtPmxzcF9oZWFkZXItPnJlbV9saWZldGltZSA9CisgICAgaHRvbnMgKGlzaXNfaml0dGVyIChNQVhfQUdFLCBNQVhfQUdFX0pJVFRFUikpOworICBsc3AtPmxzcF9oZWFkZXItPnNlcV9udW0gPSBodG9ubCAobnRvaGwgKGxzcC0+bHNwX2hlYWRlci0+c2VxX251bSkgKyAxKTsKIAogICBJU0lTX0ZMQUdTX1NFVF9BTEwgKGxzcC0+U1JNZmxhZ3MpOwotICBpZiAoaXNpcy0+ZGVidWdzICYgREVCVUdfVVBEQVRFX1BBQ0tFVFMpIHsKLSAgICB6bG9nX2luZm8gKCJJU0lTLVVwZCAoKTogcmVmcmVzaGluZyBUb3BvbG9neSBMMSAlcyIsIAotICAgICAgICAgICAgICAgcmF3bHNwaWRfcHJpbnQgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkKSk7Ci0gIH0KKyAgaWYgKGlzaXMtPmRlYnVncyAmIERFQlVHX1VQREFURV9QQUNLRVRTKQorICAgIHsKKyAgICAgIHpsb2dfaW5mbyAoIklTSVMtVXBkICgpOiByZWZyZXNoaW5nIFRvcG9sb2d5IEwxICVzIiwKKwkJIHJhd2xzcGlkX3ByaW50IChsc3AtPmxzcF9oZWFkZXItPmxzcF9pZCkpOworICAgIH0KIAogICAvKiB0aW1lIHRvIGNhbGN1bGF0ZSBvdXIgY2hlY2tzdW0gKi8KICAgaXNvX2NzdW1fY3JlYXRlIChTVFJFQU1fREFUQSAobHNwLT5wZHUpICsgMTIsCi0gICAgICAgICAgICAgICAgICAgbnRvaHMobHNwLT5sc3BfaGVhZGVyLT5wZHVfbGVuKSAtIDEyLCAxMik7Ci0gIFRIUkVBRF9USU1FUl9PTihtYXN0ZXIsIGxzcC0+dF9sc3BfdG9wX3JlZiwgdG9wX2xzcF9yZWZyZXNoLCBsc3AsCi0gICAgICBpc2lzX2ppdHRlciAoTUFYX0xTUF9HRU5fSU5URVJWQUwsIE1BWF9MU1BfR0VOX0pJVFRFUikpOworCQkgICBudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5wZHVfbGVuKSAtIDEyLCAxMik7CisgIFRIUkVBRF9USU1FUl9PTiAobWFzdGVyLCBsc3AtPnRfbHNwX3RvcF9yZWYsIHRvcF9sc3BfcmVmcmVzaCwgbHNwLAorCQkgICBpc2lzX2ppdHRlciAoTUFYX0xTUF9HRU5fSU5URVJWQUwsIE1BWF9MU1BfR0VOX0pJVFRFUikpOwogCiAgIHJldHVybiBJU0lTX09LOwogfQpAQCAtMjI5MywzNCArMjM4NiwzOSBAQAogICBzdHJ1Y3QgaXNpc19sc3AgKmxzcDsKIAogICAvKiBmaXJzdCB3ZSBmaW5kIHRoZSBtYXhpbWFsIG5vZGUgKi8KLSAgTElTVF9MT09QIChhcmVhLT50b3BvbG9neSwgYXJjLCBub2RlKSB7Ci0gICAgaWYgKGFyYy0+ZnJvbV9ub2RlID4gbWF4KSBtYXggPSBhcmMtPmZyb21fbm9kZTsKLSAgICBpZiAoYXJjLT50b19ub2RlID4gbWF4KSBtYXggPSBhcmMtPnRvX25vZGU7CisgIExJU1RfTE9PUCAoYXJlYS0+dG9wb2xvZ3ksIGFyYywgbm9kZSkKKyAgeworICAgIGlmIChhcmMtPmZyb21fbm9kZSA+IG1heCkKKyAgICAgIG1heCA9IGFyYy0+ZnJvbV9ub2RlOworICAgIGlmIChhcmMtPnRvX25vZGUgPiBtYXgpCisgICAgICBtYXggPSBhcmMtPnRvX25vZGU7CiAgIH0KIAorICBmb3IgKGkgPSAxOyBpIDwgKG1heCArIDEpOyBpKyspCisgICAgeworICAgICAgbWVtY3B5IChsc3BpZCwgYXJlYS0+dG9wb2xvZ3lfYmFzZWlzLCBJU0lTX1NZU19JRF9MRU4pOworICAgICAgTFNQX1BTRVVET19JRCAobHNwaWQpID0gMHgwMDsKKyAgICAgIExTUF9GUkFHTUVOVCAobHNwaWQpID0gMHgwMDsKKyAgICAgIGxzcGlkW0lTSVNfU1lTX0lEX0xFTiAtIDFdID0gKGkgJiAweEZGKTsKKyAgICAgIGxzcGlkW0lTSVNfU1lTX0lEX0xFTiAtIDJdID0gKChpID4+IDgpICYgMHhGRik7CiAKLSAgZm9yIChpID0gMTsgaSA8IChtYXgrMSk7IGkrKykgewotICAgIG1lbWNweSAobHNwaWQsYXJlYS0+dG9wb2xvZ3lfYmFzZWlzLElTSVNfU1lTX0lEX0xFTik7Ci0gICAgTFNQX1BTRVVET19JRCAobHNwaWQpID0gMHgwMDsKLSAgICBMU1BfRlJBR01FTlQgKGxzcGlkKSA9IDB4MDA7Ci0gICAgbHNwaWRbSVNJU19TWVNfSURfTEVOLTFdID0gKGkgJiAweEZGKTsKLSAgICBsc3BpZFtJU0lTX1NZU19JRF9MRU4tMl0gPSAoKGkgPj4gOCkgJiAweEZGKTsKKyAgICAgIGxzcCA9IGxzcF9uZXcgKGxzcGlkLCBpc2lzX2ppdHRlciAoYXJlYS0+bWF4X2xzcF9saWZldGltZVswXSwKKwkJCQkJIE1BWF9BR0VfSklUVEVSKSwgMSwgSVNfTEVWRUxfMSwgMCwKKwkJICAgICAxKTsKKyAgICAgIGxzcC0+ZnJvbV90b3BvbG9neSA9IDE7CisgICAgICAvKiBjcmVhdGluZyBkYXRhIGJhc2VkIG9uIHRvcG9sb2d5ICovCisgICAgICBidWlsZF90b3BvbG9neV9sc3BfZGF0YSAobHNwLCBhcmVhLCBpKTsKKyAgICAgIC8qIHRpbWUgdG8gY2FsY3VsYXRlIG91ciBjaGVja3N1bSAqLworICAgICAgaXNvX2NzdW1fY3JlYXRlIChTVFJFQU1fREFUQSAobHNwLT5wZHUpICsgMTIsCisJCSAgICAgICBudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5wZHVfbGVuKSAtIDEyLCAxMik7CisgICAgICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgbHNwLT50X2xzcF90b3BfcmVmLCB0b3BfbHNwX3JlZnJlc2gsIGxzcCwKKwkJICAgICAgIGlzaXNfaml0dGVyIChNQVhfTFNQX0dFTl9JTlRFUlZBTCwKKwkJCQkgICAgTUFYX0xTUF9HRU5fSklUVEVSKSk7CiAKLSAgICBsc3AgPSBsc3BfbmV3IChsc3BpZCwgaXNpc19qaXR0ZXIgKGFyZWEtPm1heF9sc3BfbGlmZXRpbWVbMF0sCi0JCQkJICAgICAgIE1BWF9BR0VfSklUVEVSKSwgMSwgSVNfTEVWRUxfMSwgMCwgMSk7Ci0gICAgbHNwLT5mcm9tX3RvcG9sb2d5ID0gMTsKLSAgICAvKiBjcmVhdGluZyBkYXRhIGJhc2VkIG9uIHRvcG9sb2d5ICovCi0gICAgYnVpbGRfdG9wb2xvZ3lfbHNwX2RhdGEgKGxzcCxhcmVhLGkpOwotICAgIC8qIHRpbWUgdG8gY2FsY3VsYXRlIG91ciBjaGVja3N1bSAqLwotICAgIGlzb19jc3VtX2NyZWF0ZSAoU1RSRUFNX0RBVEEgKGxzcC0+cGR1KSArIDEyLAotCQkgICAgIG50b2hzKGxzcC0+bHNwX2hlYWRlci0+cGR1X2xlbikgLSAxMiwgMTIpOwotICAgIFRIUkVBRF9USU1FUl9PTihtYXN0ZXIsIGxzcC0+dF9sc3BfdG9wX3JlZiwgdG9wX2xzcF9yZWZyZXNoLCBsc3AsCi0gICAgICAgIGlzaXNfaml0dGVyKE1BWF9MU1BfR0VOX0lOVEVSVkFMLCBNQVhfTFNQX0dFTl9KSVRURVIpKTsKKyAgICAgIElTSVNfRkxBR1NfU0VUX0FMTCAobHNwLT5TUk1mbGFncyk7CisgICAgICBsc3BfaW5zZXJ0IChsc3AsIGFyZWEtPmxzcGRiWzBdKTsKIAotICAgIElTSVNfRkxBR1NfU0VUX0FMTChsc3AtPlNSTWZsYWdzKTsKLSAgICBsc3BfaW5zZXJ0IChsc3AsYXJlYS0+bHNwZGJbMF0pOwotCi0gIH0KKyAgICB9CiB9CiAKIHZvaWQKQEAgLTIzMzAsMjAgKzI0MjgsMjIgQEAKICAgZG5vZGVfdCAqZG5vZGUsICpkbm9kZV9uZXh0OwogCiAgIGRub2RlID0gZGljdF9maXJzdCAoYXJlYS0+bHNwZGJbMF0pOwotICB3aGlsZSAoZG5vZGUgIT0gTlVMTCkgewotICAgIGRub2RlX25leHQgPSBkaWN0X25leHQgKGFyZWEtPmxzcGRiWzBdLCBkbm9kZSk7Ci0gICAgbHNwID0gZG5vZGVfZ2V0IChkbm9kZSk7Ci0gICAgaWYgKGxzcC0+ZnJvbV90b3BvbG9neSkgewotICAgICAgVEhSRUFEX1RJTUVSX09GRihsc3AtPnRfbHNwX3RvcF9yZWYpOwotICAgICAgbHNwX2Rlc3Ryb3kgKGxzcCk7Ci0gICAgICBkaWN0X2RlbGV0ZSAoYXJlYS0+bHNwZGJbMF0sIGRub2RlKTsKKyAgd2hpbGUgKGRub2RlICE9IE5VTEwpCisgICAgeworICAgICAgZG5vZGVfbmV4dCA9IGRpY3RfbmV4dCAoYXJlYS0+bHNwZGJbMF0sIGRub2RlKTsKKyAgICAgIGxzcCA9IGRub2RlX2dldCAoZG5vZGUpOworICAgICAgaWYgKGxzcC0+ZnJvbV90b3BvbG9neSkKKwl7CisJICBUSFJFQURfVElNRVJfT0ZGIChsc3AtPnRfbHNwX3RvcF9yZWYpOworCSAgbHNwX2Rlc3Ryb3kgKGxzcCk7CisJICBkaWN0X2RlbGV0ZSAoYXJlYS0+bHNwZGJbMF0sIGRub2RlKTsKKwl9CisgICAgICBkbm9kZSA9IGRub2RlX25leHQ7CiAgICAgfQotICAgIGRub2RlID0gZG5vZGVfbmV4dDsKLSAgfQogfQogCiB2b2lkCi1idWlsZF90b3BvbG9neV9sc3BfZGF0YSAoc3RydWN0IGlzaXNfbHNwICpsc3AsIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWEsIAorYnVpbGRfdG9wb2xvZ3lfbHNwX2RhdGEgKHN0cnVjdCBpc2lzX2xzcCAqbHNwLCBzdHJ1Y3QgaXNpc19hcmVhICphcmVhLAogCQkJIGludCBsc3BfdG9wX251bSkKIHsKICAgc3RydWN0IGxpc3Rub2RlICpub2RlOwpAQCAtMjM1NCw4OSArMjQ1NCw5OCBAQAogICBjaGFyIGJ1ZmZbMjAwXTsKIAogICAvKiBhZGQgb3VyIG5scGlkcyAqLwotICAvKiB0aGUgMiBpcyBmb3IgdGhlIFRMIHBsdXMgMSBmb3IgdGhlIG5scGlkKi8KLSAgdGx2X3B0ciA9IGxzcHBkdV9yZWFsbG9jIChsc3AsTVRZUEVfSVNJU19UTFYsIDMpOyAKLSAgKnRsdl9wdHIgPSBQUk9UT0NPTFNfU1VQUE9SVEVEOyAvKiBUeXBlICovCi0gICoodGx2X3B0cisxKSA9IDE7IC8qIG9uZSBwcm90b2NvbCAqLwotICAqKHRsdl9wdHIrMikgPSAgTkxQSURfSVA7Ci0gIGxzcC0+dGx2X2RhdGEubmxwaWRzID0gKHN0cnVjdCBubHBpZHMqKSh0bHZfcHRyKzEpOyAKKyAgLyogdGhlIDIgaXMgZm9yIHRoZSBUTCBwbHVzIDEgZm9yIHRoZSBubHBpZCAqLworICB0bHZfcHRyID0gbHNwcGR1X3JlYWxsb2MgKGxzcCwgTVRZUEVfSVNJU19UTFYsIDMpOworICAqdGx2X3B0ciA9IFBST1RPQ09MU19TVVBQT1JURUQ7CS8qIFR5cGUgKi8KKyAgKih0bHZfcHRyICsgMSkgPSAxOwkJLyogb25lIHByb3RvY29sICovCisgICoodGx2X3B0ciArIDIpID0gTkxQSURfSVA7CisgIGxzcC0+dGx2X2RhdGEubmxwaWRzID0gKHN0cnVjdCBubHBpZHMgKikgKHRsdl9wdHIgKyAxKTsKIAogICAvKiBmaXJzdCwgbGV0cyBhZGQgdGhlIHRvcHMgKi8KLSAgLyogdGhlIDIgaXMgZm9yIHRoZSBUTCBwbHVzIDEgZm9yIHRoZSB2aXJ0dWFsIGZpZWxkKi8KLSAgdGx2X3B0ciA9IGxzcHBkdV9yZWFsbG9jIChsc3AgLE1UWVBFX0lTSVNfVExWLCAzKTsKLSAgKnRsdl9wdHIgPSBJU19ORUlHSEJPVVJTOyAvKiBUeXBlICovCi0gICoodGx2X3B0cisxKSA9IDE7IC8qIHRoaXMgaXMgdGhlIHZpcnR1YWwgY2hhciBsZW4qLwotICAqKHRsdl9wdHIrMikgPSAwOyAvKiB2aXJ0dWFsIGlzIHplcm8gKi8KLSAgbHNwLT50bHZfZGF0YS5pc19uZWlnaHMgPSBsaXN0X25ldyAoKTsgLyogbmV3IGxpc3Qgb2YgaXNfbmVpZ2hib3VycyAqLworICAvKiB0aGUgMiBpcyBmb3IgdGhlIFRMIHBsdXMgMSBmb3IgdGhlIHZpcnR1YWwgZmllbGQgKi8KKyAgdGx2X3B0ciA9IGxzcHBkdV9yZWFsbG9jIChsc3AsIE1UWVBFX0lTSVNfVExWLCAzKTsKKyAgKnRsdl9wdHIgPSBJU19ORUlHSEJPVVJTOwkvKiBUeXBlICovCisgICoodGx2X3B0ciArIDEpID0gMTsJCS8qIHRoaXMgaXMgdGhlIHZpcnR1YWwgY2hhciBsZW4gKi8KKyAgKih0bHZfcHRyICsgMikgPSAwOwkJLyogdmlydHVhbCBpcyB6ZXJvICovCisgIGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzID0gbGlzdF9uZXcgKCk7CS8qIG5ldyBsaXN0IG9mIGlzX25laWdoYm91cnMgKi8KIAogICAvKiBhZGQgcmVhY2hhYmlsaXR5IGZvciB0aGlzIElTIGZvciBzaW11bGF0ZWQgMSAqLwotICBpZiAobHNwX3RvcF9udW0gPT0gMSkgewotICAgIC8qIGFzc2lnbiBzcGFjZSBmb3IgdGhlIGlzX25laWdoIGF0IHRoZSBwZHUgZW5kICovCi0gICAgaXNfbmVpZ2ggPSAoc3RydWN0IGlzX25laWdoKikgbHNwcGR1X3JlYWxsb2MobHNwLCBNVFlQRV9JU0lTX1RMViwgCi0JCQkJCQkgc2l6ZW9mKHN0cnVjdCBpc19uZWlnaCkpOyAKLSAgICAvKiBhZGQgdGhpcyBub2RlIHRvIG91ciBsaXN0ICovCi0gICAgbGlzdG5vZGVfYWRkIChsc3AtPnRsdl9kYXRhLmlzX25laWdocywgaXNfbmVpZ2gpOyAKLSAgICBtZW1jcHkgKCZpc19uZWlnaC0+bmVpZ2hfaWQsIGlzaXMtPnN5c2lkLCBJU0lTX1NZU19JRF9MRU4pOwotICAgIExTUF9QU0VVRE9fSUQgKGlzX25laWdoLT5uZWlnaF9pZCkgPSAweDAwOwotICAgIGlzX25laWdoLT5tZXRyaWNzLm1ldHJpY19kZWZhdWx0ID0gMHgwMDsgLyogbm8gc3BlY2lhbCByZWFzb24gKi8KLSAgICBpc19uZWlnaC0+bWV0cmljcy5tZXRyaWNfZGVsYXkgPSBNRVRSSUNTX1VOU1VQUE9SVEVEOwotICAgIGlzX25laWdoLT5tZXRyaWNzLm1ldHJpY19leHBlbnNlID0gTUVUUklDU19VTlNVUFBPUlRFRDsKLSAgICBpc19uZWlnaC0+bWV0cmljcy5tZXRyaWNfZXJyb3IgPSBNRVRSSUNTX1VOU1VQUE9SVEVEOwotICAgIC8qIGRvbid0IGZvcmdldCB0aGUgbGVuZ3RoICovCi0gICAgKih0bHZfcHRyKzEpICs9IElTX05FSUdIQk9VUlNfTEVOOyAvKiB0aGUgLTEgaXMgdGhlIHZpcnR1YWwgKi8KLSAgICAvKiBubyBuZWVkIHRvIGNoZWNrIGZvciBmcmFnZ2luZyBoZXJlLCBpdCBpcyBhIGxvbmVseSBpc19yZWFjaCAqLwotICB9Ci0KLSAgLyogYWRkZGluZyBpcyByZWFjaGFiaWxpdGllcyAqLwotICBMSVNUX0xPT1AgKGFyZWEtPnRvcG9sb2d5LCBhcmMsIG5vZGUpIHsKLSAgICBpZiAoKGFyYy0+ZnJvbV9ub2RlID09IGxzcF90b3BfbnVtKSB8fAotICAgICAgICAoYXJjLT50b19ub2RlICAgPT0gbHNwX3RvcF9udW0pKSB7Ci0gICAgICBpZiAoYXJjLT50b19ub2RlICAgPT0gbHNwX3RvcF9udW0pIHRvX2xzcCA9IGFyYy0+ZnJvbV9ub2RlOwotICAgICAgaWYgKGFyYy0+ZnJvbV9ub2RlID09IGxzcF90b3BfbnVtKSB0b19sc3AgPSBhcmMtPnRvX25vZGU7Ci0KLSAgICAgIC8qIGlmIHRoZSBsZW5ndGggaGVyZSBpcyBhYm91dCB0byBjcm9zcyB0aGUgRkYgbGltaXQsIHdlIHJlVExWICovCi0gICAgICBpZiAoKih0bHZfcHRyKzEpID49ICgweEZGIC0gSVNfTkVJR0hCT1VSU19MRU4pKSB7Ci0gICAgICAgIC8qIHJldGx2ICovCi0JLyogdGhlIDIgaXMgZm9yIHRoZSBUTCBwbHVzIDEgZm9yIHRoZSB2aXJ0dWFsIGZpZWxkKi8KLSAgICAgICAgdGx2X3B0ciA9IGxzcHBkdV9yZWFsbG9jKGxzcCxNVFlQRV9JU0lTX1RMViwgMyk7IAotICAgICAgICAqdGx2X3B0ciA9IElTX05FSUdIQk9VUlM7IC8qIFR5cGUgKi8KLSAgICAgICAgKih0bHZfcHRyKzEpID0gMTsgLyogdGhpcyBpcyB0aGUgdmlydHVhbCBjaGFyIGxlbiovCi0gICAgICAgICoodGx2X3B0cisyKSA9IDA7IC8qIHZpcnR1YWwgaXMgemVybyAqLwotICAgICAgfQotICAgICAgLyogZG9pbmcgdGhpcyBoZXJlIGFzc3VyZXMgdXMgdGhhdCB3ZSB3b24ndCBhZGQgYW4gImVtcHR5IiB0bHYgKi8KKyAgaWYgKGxzcF90b3BfbnVtID09IDEpCisgICAgewogICAgICAgLyogYXNzaWduIHNwYWNlIGZvciB0aGUgaXNfbmVpZ2ggYXQgdGhlIHBkdSBlbmQgKi8KLSAgICAgIGlzX25laWdoID0gKHN0cnVjdCBpc19uZWlnaCopIGxzcHBkdV9yZWFsbG9jIChsc3AsIE1UWVBFX0lTSVNfVExWLCAKLQkJCQkJCSAgICBzaXplb2Yoc3RydWN0IGlzX25laWdoKSk7CisgICAgICBpc19uZWlnaCA9IChzdHJ1Y3QgaXNfbmVpZ2ggKikgbHNwcGR1X3JlYWxsb2MgKGxzcCwgTVRZUEVfSVNJU19UTFYsCisJCQkJCQkgICAgIHNpemVvZiAoc3RydWN0CisJCQkJCQkJICAgICBpc19uZWlnaCkpOwogICAgICAgLyogYWRkIHRoaXMgbm9kZSB0byBvdXIgbGlzdCAqLwotICAgICAgbGlzdG5vZGVfYWRkIChsc3AtPnRsdl9kYXRhLmlzX25laWdocywgaXNfbmVpZ2gpOyAKLSAgICAgIG1lbWNweSAoJmlzX25laWdoLT5uZWlnaF9pZCwgYXJlYS0+dG9wb2xvZ3lfYmFzZWlzLCBJU0lTX1NZU19JRF9MRU4pOworICAgICAgbGlzdG5vZGVfYWRkIChsc3AtPnRsdl9kYXRhLmlzX25laWdocywgaXNfbmVpZ2gpOworICAgICAgbWVtY3B5ICgmaXNfbmVpZ2gtPm5laWdoX2lkLCBpc2lzLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOKTsKICAgICAgIExTUF9QU0VVRE9fSUQgKGlzX25laWdoLT5uZWlnaF9pZCkgPSAweDAwOwotICAgICAgaXNfbmVpZ2gtPm5laWdoX2lkW0lTSVNfU1lTX0lEX0xFTi0xXSA9ICh0b19sc3AgJiAweEZGKTsKLSAgICAgIGlzX25laWdoLT5uZWlnaF9pZFtJU0lTX1NZU19JRF9MRU4tMl0gPSAoKHRvX2xzcCA+PiA4KSAmIDB4RkYpOwotICAgICAgaXNfbmVpZ2gtPm1ldHJpY3MubWV0cmljX2RlZmF1bHQgPSBhcmMtPmRpc3RhbmNlOworICAgICAgaXNfbmVpZ2gtPm1ldHJpY3MubWV0cmljX2RlZmF1bHQgPSAweDAwOwkvKiBubyBzcGVjaWFsIHJlYXNvbiAqLwogICAgICAgaXNfbmVpZ2gtPm1ldHJpY3MubWV0cmljX2RlbGF5ID0gTUVUUklDU19VTlNVUFBPUlRFRDsKICAgICAgIGlzX25laWdoLT5tZXRyaWNzLm1ldHJpY19leHBlbnNlID0gTUVUUklDU19VTlNVUFBPUlRFRDsKICAgICAgIGlzX25laWdoLT5tZXRyaWNzLm1ldHJpY19lcnJvciA9IE1FVFJJQ1NfVU5TVVBQT1JURUQ7CiAgICAgICAvKiBkb24ndCBmb3JnZXQgdGhlIGxlbmd0aCAqLwotICAgICAgKih0bHZfcHRyKzEpICs9IElTX05FSUdIQk9VUlNfTEVOOyAvKiB0aGUgLTEgaXMgdGhlIHZpcnR1YWwgKi8KKyAgICAgICoodGx2X3B0ciArIDEpICs9IElTX05FSUdIQk9VUlNfTEVOOwkvKiB0aGUgLTEgaXMgdGhlIHZpcnR1YWwgKi8KKyAgICAgIC8qIG5vIG5lZWQgdG8gY2hlY2sgZm9yIGZyYWdnaW5nIGhlcmUsIGl0IGlzIGEgbG9uZWx5IGlzX3JlYWNoICovCiAgICAgfQorCisgIC8qIGFkZGRpbmcgaXMgcmVhY2hhYmlsaXRpZXMgKi8KKyAgTElTVF9MT09QIChhcmVhLT50b3BvbG9neSwgYXJjLCBub2RlKQorICB7CisgICAgaWYgKChhcmMtPmZyb21fbm9kZSA9PSBsc3BfdG9wX251bSkgfHwgKGFyYy0+dG9fbm9kZSA9PSBsc3BfdG9wX251bSkpCisgICAgICB7CisJaWYgKGFyYy0+dG9fbm9kZSA9PSBsc3BfdG9wX251bSkKKwkgIHRvX2xzcCA9IGFyYy0+ZnJvbV9ub2RlOworCWlmIChhcmMtPmZyb21fbm9kZSA9PSBsc3BfdG9wX251bSkKKwkgIHRvX2xzcCA9IGFyYy0+dG9fbm9kZTsKKworCS8qIGlmIHRoZSBsZW5ndGggaGVyZSBpcyBhYm91dCB0byBjcm9zcyB0aGUgRkYgbGltaXQsIHdlIHJlVExWICovCisJaWYgKCoodGx2X3B0ciArIDEpID49ICgweEZGIC0gSVNfTkVJR0hCT1VSU19MRU4pKQorCSAgeworCSAgICAvKiByZXRsdiAqLworCSAgICAvKiB0aGUgMiBpcyBmb3IgdGhlIFRMIHBsdXMgMSBmb3IgdGhlIHZpcnR1YWwgZmllbGQgKi8KKwkgICAgdGx2X3B0ciA9IGxzcHBkdV9yZWFsbG9jIChsc3AsIE1UWVBFX0lTSVNfVExWLCAzKTsKKwkgICAgKnRsdl9wdHIgPSBJU19ORUlHSEJPVVJTOwkvKiBUeXBlICovCisJICAgICoodGx2X3B0ciArIDEpID0gMTsJLyogdGhpcyBpcyB0aGUgdmlydHVhbCBjaGFyIGxlbiAqLworCSAgICAqKHRsdl9wdHIgKyAyKSA9IDA7CS8qIHZpcnR1YWwgaXMgemVybyAqLworCSAgfQorCS8qIGRvaW5nIHRoaXMgaGVyZSBhc3N1cmVzIHVzIHRoYXQgd2Ugd29uJ3QgYWRkIGFuICJlbXB0eSIgdGx2ICovCisJLyogYXNzaWduIHNwYWNlIGZvciB0aGUgaXNfbmVpZ2ggYXQgdGhlIHBkdSBlbmQgKi8KKwlpc19uZWlnaCA9IChzdHJ1Y3QgaXNfbmVpZ2ggKikgbHNwcGR1X3JlYWxsb2MgKGxzcCwgTVRZUEVfSVNJU19UTFYsCisJCQkJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QKKwkJCQkJCQkgICAgICAgaXNfbmVpZ2gpKTsKKwkvKiBhZGQgdGhpcyBub2RlIHRvIG91ciBsaXN0ICovCisJbGlzdG5vZGVfYWRkIChsc3AtPnRsdl9kYXRhLmlzX25laWdocywgaXNfbmVpZ2gpOworCW1lbWNweSAoJmlzX25laWdoLT5uZWlnaF9pZCwgYXJlYS0+dG9wb2xvZ3lfYmFzZWlzLCBJU0lTX1NZU19JRF9MRU4pOworCUxTUF9QU0VVRE9fSUQgKGlzX25laWdoLT5uZWlnaF9pZCkgPSAweDAwOworCWlzX25laWdoLT5uZWlnaF9pZFtJU0lTX1NZU19JRF9MRU4gLSAxXSA9ICh0b19sc3AgJiAweEZGKTsKKwlpc19uZWlnaC0+bmVpZ2hfaWRbSVNJU19TWVNfSURfTEVOIC0gMl0gPSAoKHRvX2xzcCA+PiA4KSAmIDB4RkYpOworCWlzX25laWdoLT5tZXRyaWNzLm1ldHJpY19kZWZhdWx0ID0gYXJjLT5kaXN0YW5jZTsKKwlpc19uZWlnaC0+bWV0cmljcy5tZXRyaWNfZGVsYXkgPSBNRVRSSUNTX1VOU1VQUE9SVEVEOworCWlzX25laWdoLT5tZXRyaWNzLm1ldHJpY19leHBlbnNlID0gTUVUUklDU19VTlNVUFBPUlRFRDsKKwlpc19uZWlnaC0+bWV0cmljcy5tZXRyaWNfZXJyb3IgPSBNRVRSSUNTX1VOU1VQUE9SVEVEOworCS8qIGRvbid0IGZvcmdldCB0aGUgbGVuZ3RoICovCisJKih0bHZfcHRyICsgMSkgKz0gSVNfTkVJR0hCT1VSU19MRU47CS8qIHRoZSAtMSBpcyB0aGUgdmlydHVhbCAqLworICAgICAgfQogICB9CiAKLSAgLyogYWRkaW5nIGR5bmFtaWMgaG9zdG5hbWUgaWYgbmVlZGVkKi8KLSAgaWYgKGFyZWEtPmR5bmhvc3RuYW1lKSB7Ci0gICAgbWVtc2V0IChidWZmLDB4MDAsMjAwKTsKLSAgICBzcHJpbnRmIChidWZmLCJmZWVkbWUlZCIsbHNwX3RvcF9udW0pOwotICAgIHRsdl9wdHIgPSBsc3BwZHVfcmVhbGxvYyAobHNwLE1UWVBFX0lTSVNfVExWLCAyKTsgLyogdGhlIDIgaXMgZm9yIHRoZSBUTCAqLwotICAgICp0bHZfcHRyID0gRFlOQU1JQ19IT1NUTkFNRTsgLyogVHlwZSAqLwotICAgICoodGx2X3B0cisxKSA9IHN0cmxlbiAoYnVmZik7IC8qIExlbmd0aCAqLwotICAgIC8qIHRoZSAtMSBpcyB0byBmaXQgdGhlIGxlbmd0aCBpbiB0aGUgc3RydWN0ICovCi0gICAgbHNwLT50bHZfZGF0YS5ob3N0bmFtZSA9IChzdHJ1Y3QgaG9zdG5hbWUgKikKLSAgICAgIChsc3BwZHVfcmVhbGxvYyAobHNwLCBNVFlQRV9JU0lTX1RMViwgc3RybGVuKGJ1ZmYpKSAtIDEpOwotICAgIG1lbWNweSAobHNwLT50bHZfZGF0YS5ob3N0bmFtZS0+bmFtZSwgYnVmZiwgc3RybGVuKGJ1ZmYpKTsKLSAgfQorICAvKiBhZGRpbmcgZHluYW1pYyBob3N0bmFtZSBpZiBuZWVkZWQgKi8KKyAgaWYgKGFyZWEtPmR5bmhvc3RuYW1lKQorICAgIHsKKyAgICAgIG1lbXNldCAoYnVmZiwgMHgwMCwgMjAwKTsKKyAgICAgIHNwcmludGYgKGJ1ZmYsICJmZWVkbWUlZCIsIGxzcF90b3BfbnVtKTsKKyAgICAgIC8qIHRoZSAyIGlzIGZvciB0aGUgVEwgKi8KKyAgICAgIHRsdl9wdHIgPSBsc3BwZHVfcmVhbGxvYyAobHNwLCBNVFlQRV9JU0lTX1RMViwgMik7CisgICAgICAqdGx2X3B0ciA9IERZTkFNSUNfSE9TVE5BTUU7CS8qIFR5cGUgKi8KKyAgICAgICoodGx2X3B0ciArIDEpID0gc3RybGVuIChidWZmKTsJLyogTGVuZ3RoICovCisgICAgICAvKiB0aGUgLTEgaXMgdG8gZml0IHRoZSBsZW5ndGggaW4gdGhlIHN0cnVjdCAqLworICAgICAgbHNwLT50bHZfZGF0YS5ob3N0bmFtZSA9IChzdHJ1Y3QgaG9zdG5hbWUgKikKKwkobHNwcGR1X3JlYWxsb2MgKGxzcCwgTVRZUEVfSVNJU19UTFYsIHN0cmxlbiAoYnVmZikpIC0gMSk7CisgICAgICBtZW1jcHkgKGxzcC0+dGx2X2RhdGEuaG9zdG5hbWUtPm5hbWUsIGJ1ZmYsIHN0cmxlbiAoYnVmZikpOworICAgIH0KIAogICAvKiB0aGFua3MgdG8gaGFubmVzLCBhbm90aGVyIGJ1ZyBiaXRlcyB0aGUgZHVzdCAqLwotICBsc3AtPnBkdS0+cHV0cCA9IG50b2hzKGxzcC0+bHNwX2hlYWRlci0+cGR1X2xlbik7Ci0gIGxzcC0+cGR1LT5lbmRwID0gbnRvaHMobHNwLT5sc3BfaGVhZGVyLT5wZHVfbGVuKTsKKyAgbHNwLT5wZHUtPnB1dHAgPSBudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5wZHVfbGVuKTsKKyAgbHNwLT5wZHUtPmVuZHAgPSBudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5wZHVfbGVuKTsKIH0KICNlbmRpZiAvKiBUT1BPTE9HWV9HRU5FUkFURSAqLwpkaWZmIC0tZ2l0IGEvaXNpc2QvaXNpc19sc3AuaCBiL2lzaXNkL2lzaXNfbHNwLmgKaW5kZXggNzFhNzUwOC4uYzZlYjdjMiAxMDA2NDQKLS0tIGEvaXNpc2QvaXNpc19sc3AuaAorKysgYi9pc2lzZC9pc2lzX2xzcC5oCkBAIC0yNiw3ICsyNiw3IEBACiAKIC8qIFRoZSBncmFuZCBwbGFuIGlzIHRvIHN1cHBvcnQgMTAyNCBjaXJjdWl0cyBzbyB3ZSBoYXZlIDMyKjMyIGJpdCBmbGFncwogICogdGhlIHN1cHBvcnQgd2lsbCBiZSBhY2hpdmVkIHVzaW5nIHRoZSBuZXdlc3QgZHJhZnRzICovCi0jZGVmaW5lIElTSVNfTUFYX0NJUkNVSVRTIDMyIC8qID0gMTAyNCAqLyAvKkZJWE1FOmRlZmluZWQgaW4gZmxhZ3MuaCBhcyB3ZWxsKi8KKyNkZWZpbmUgSVNJU19NQVhfQ0lSQ1VJVFMgMzIgLyogPSAxMDI0IC0gRklYTUU6ZGVmaW5lZCBpbiBmbGFncy5oIGFzIHdlbGwgKi8KIAogLyogU3RydWN0dXJlIGZvciBpc2lzX2xzcCwgdGhpcyBzdHJ1Y3R1cmUgd2lsbCBvbmx5IHN1cHBvcnQgdGhlIGZpeGVkCiAgKiBTeXN0ZW0gSUQgKEN1cnJlbnRseSA2KSAoYXRsZWFzdCBmb3Igbm93KS4gSW4gb3JkZXIgdG8gc3VwcG9ydCBtb3JlCkBAIC0zNCwxOSArMzQsMjAgQEAKICAqIHNha2UgaXQgc2hvdWxkIGJldHRlciBiZSBhdm9pZGVkICovCiBzdHJ1Y3QgaXNpc19sc3AKIHsKLSAgc3RydWN0IGlzaXNfZml4ZWRfaGRyICppc2lzX2hlYWRlcjsgICAgICAgLyogbm9ybWFsbHkgZXF1YWxzIHBkdSAqLwotICBzdHJ1Y3QgaXNpc19saW5rX3N0YXRlX2hkciAqbHNwX2hlYWRlcjsgICAvKiBwZHUgKyBpc2lzX2hlYWRlcl9sZW4gKi8KLSAgc3RydWN0IHN0cmVhbSAqcGR1OyAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbCBwZHUgbHNwICovCi0gIHVuaW9uIHsKKyAgc3RydWN0IGlzaXNfZml4ZWRfaGRyICppc2lzX2hlYWRlcjsJCS8qIG5vcm1hbGx5IGVxdWFscyBwZHUgKi8KKyAgc3RydWN0IGlzaXNfbGlua19zdGF0ZV9oZHIgKmxzcF9oZWFkZXI7CS8qIHBkdSArIGlzaXNfaGVhZGVyX2xlbiAqLworICBzdHJ1Y3Qgc3RyZWFtICpwZHU7CQkJCS8qIGZ1bGwgcGR1IGxzcCAqLworICB1bmlvbgorICB7CiAgICAgc3RydWN0IGxpc3QgKmZyYWdzOwogICAgIHN0cnVjdCBpc2lzX2xzcCAqemVyb19sc3A7CiAgIH0gbHNwdTsKICAgdV9pbnQzMl90IFNSTWZsYWdzW0lTSVNfTUFYX0NJUkNVSVRTXTsKICAgdV9pbnQzMl90IFNTTmZsYWdzW0lTSVNfTUFYX0NJUkNVSVRTXTsKICAgdV9pbnQzMl90IHJleG1pdF9xdWV1ZVtJU0lTX01BWF9DSVJDVUlUU107Ci0gIGludCBsZXZlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEwxIG9yIEwyPyAqLwotICBpbnQgcHVyZ2VkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoYXZlIHB1cmdlZCB0aGlzIG9uZSAqLwotICBpbnQgc2NoZWR1bGVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2hlZHVsZWQgZm9yIHNlbmRpbmcgKi8KKyAgaW50IGxldmVsOwkJCS8qIEwxIG9yIEwyPyAqLworICBpbnQgcHVyZ2VkOwkJCS8qIGhhdmUgcHVyZ2VkIHRoaXMgb25lICovCisgIGludCBzY2hlZHVsZWQ7CQkvKiBzY2hlZHVsZWQgZm9yIHNlbmRpbmcgKi8KICAgdGltZV90IGluc3RhbGxlZDsKICAgdGltZV90IGxhc3RfZ2VuZXJhdGVkOwogICB0aW1lX3QgbGFzdF9zZW50OwpAQCAtNTYsMTMgKzU3LDEzIEBACiAgIHN0cnVjdCB0aHJlYWQgKnRfbHNwX3RvcF9yZWY7CiAjZW5kaWYKICAgLyogdXNlZCBmb3IgNjAgc2Vjb25kIGNvdW50aW5nIHdoZW4gcmVtX2xpZmV0aW1lIGlzIHplcm8gKi8KLSAgaW50IGFnZV9vdXQ7IAorICBpbnQgYWdlX291dDsKICAgc3RydWN0IGlzaXNfYWRqYWNlbmN5ICphZGo7Ci0gIHN0cnVjdCB0bHZzIHRsdl9kYXRhOyAgICAgICAgICAgICAgICAgICAgIC8qIFNpbXBsaWZpZXMgVExWIGFjY2VzcyAqLworICBzdHJ1Y3QgdGx2cyB0bHZfZGF0YTsJCS8qIFNpbXBsaWZpZXMgVExWIGFjY2VzcyAqLwogfTsKIAogZGljdF90ICpsc3BfZGJfaW5pdCAodm9pZCk7Ci12b2lkIGxzcF9kYl9kZXN0cm95IChkaWN0X3QgKmxzcGRiKTsKK3ZvaWQgbHNwX2RiX2Rlc3Ryb3kgKGRpY3RfdCAqIGxzcGRiKTsKIGludCBsc3BfdGljayAoc3RydWN0IHRocmVhZCAqdGhyZWFkKTsKIAogaW50IGxzcF9sMV9nZW5lcmF0ZSAoc3RydWN0IGlzaXNfYXJlYSAqYXJlYSk7CkBAIC03MywzMSArNzQsMzEgQEAKIAogaW50IGxzcF9sMV9wc2V1ZG9fZ2VuZXJhdGUgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQpOwogaW50IGxzcF9sMl9wc2V1ZG9fZ2VuZXJhdGUgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQpOwotaW50IGxzcF9sMV9yZWZyZXNoX3BzZXVkbyAgKHN0cnVjdCB0aHJlYWQgKnRocmVhZCk7Ci1pbnQgbHNwX2wyX3JlZnJlc2hfcHNldWRvICAoc3RydWN0IHRocmVhZCAqdGhyZWFkKTsKK2ludCBsc3BfbDFfcmVmcmVzaF9wc2V1ZG8gKHN0cnVjdCB0aHJlYWQgKnRocmVhZCk7CitpbnQgbHNwX2wyX3JlZnJlc2hfcHNldWRvIChzdHJ1Y3QgdGhyZWFkICp0aHJlYWQpOwogaW50IGlzaXNfbHNwX2F1dGhpbmZvX2NoZWNrIChzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0sIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWEsCi0JCQkgICAgIGludCAgcGR1bGVuLCBzdHJ1Y3QgaXNpc19wYXNzd2QgKnBhc3N3ZCk7Ci1zdHJ1Y3QgaXNpc19sc3AgKmxzcF9uZXcgKHVfY2hhciAqbHNwX2lkLCB1X2ludDE2X3QgcmVtX2xpZmV0aW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQzMl90IHNlcV9udW0sIHVfaW50OF90IGxzcF9iaXRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQxNl90IGNoZWNrc3VtLCBpbnQgbGV2ZWwpOwotc3RydWN0IGlzaXNfbHNwICpsc3BfbmV3X2Zyb21fc3RyZWFtX3B0ciAoc3RydWN0IHN0cmVhbSAqc3RyZWFtLCAKLQkJCQkJICB1X2ludDE2X3QgcGR1X2xlbiwgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlzaXNfbHNwICpsc3AwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWEpOwotdm9pZCBsc3BfaW5zZXJ0IChzdHJ1Y3QgaXNpc19sc3AgKmxzcCwgZGljdF90ICpsc3BkYik7Ci1zdHJ1Y3QgaXNpc19sc3AgKmxzcF9zZWFyY2ggKHVfY2hhciAqaWQsIGRpY3RfdCAqbHNwZGIpOworCQkJICAgICBpbnQgcGR1bGVuLCBzdHJ1Y3QgaXNpc19wYXNzd2QgKnBhc3N3ZCk7CitzdHJ1Y3QgaXNpc19sc3AgKmxzcF9uZXcgKHVfY2hhciAqIGxzcF9pZCwgdV9pbnQxNl90IHJlbV9saWZldGltZSwKKwkJCSAgdV9pbnQzMl90IHNlcV9udW0sIHVfaW50OF90IGxzcF9iaXRzLAorCQkJICB1X2ludDE2X3QgY2hlY2tzdW0sIGludCBsZXZlbCk7CitzdHJ1Y3QgaXNpc19sc3AgKmxzcF9uZXdfZnJvbV9zdHJlYW1fcHRyIChzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0sCisJCQkJCSAgdV9pbnQxNl90IHBkdV9sZW4sCisJCQkJCSAgc3RydWN0IGlzaXNfbHNwICpsc3AwLAorCQkJCQkgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWEpOwordm9pZCBsc3BfaW5zZXJ0IChzdHJ1Y3QgaXNpc19sc3AgKmxzcCwgZGljdF90ICogbHNwZGIpOworc3RydWN0IGlzaXNfbHNwICpsc3Bfc2VhcmNoICh1X2NoYXIgKiBpZCwgZGljdF90ICogbHNwZGIpOwogCi12b2lkIGxzcF9idWlsZF9saXN0ICh1X2NoYXIgKnN0YXJ0X2lkLCB1X2NoYXIgKnN0b3BfaWQsIAotICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxpc3QgKmxpc3QsIGRpY3RfdCAqbHNwZGIpOwotdm9pZCBsc3BfYnVpbGRfbGlzdF9ub256ZXJvX2h0ICh1X2NoYXIgKnN0YXJ0X2lkLCB1X2NoYXIgKnN0b3BfaWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbGlzdCAqbGlzdCwgZGljdF90ICpsc3BkYik7Ci12b2lkIGxzcF9idWlsZF9saXN0X3NzbiAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgc3RydWN0IGxpc3QgKmxpc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3RfdCAqbHNwZGIpOwordm9pZCBsc3BfYnVpbGRfbGlzdCAodV9jaGFyICogc3RhcnRfaWQsIHVfY2hhciAqIHN0b3BfaWQsCisJCSAgICAgc3RydWN0IGxpc3QgKmxpc3QsIGRpY3RfdCAqIGxzcGRiKTsKK3ZvaWQgbHNwX2J1aWxkX2xpc3Rfbm9uemVyb19odCAodV9jaGFyICogc3RhcnRfaWQsIHVfY2hhciAqIHN0b3BfaWQsCisJCQkJc3RydWN0IGxpc3QgKmxpc3QsIGRpY3RfdCAqIGxzcGRiKTsKK3ZvaWQgbHNwX2J1aWxkX2xpc3Rfc3NuIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LCBzdHJ1Y3QgbGlzdCAqbGlzdCwKKwkJCSBkaWN0X3QgKiBsc3BkYik7CiAKLXZvaWQgbHNwX3NlYXJjaF9hbmRfZGVzdHJveSAodV9jaGFyICppZCwgZGljdF90ICpsc3BkYik7Ci12b2lkIGxzcF9wdXJnZV9kciAodV9jaGFyICppZCwgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgaW50IGxldmVsKTsKLXZvaWQgbHNwX3B1cmdlX25vbl9leGlzdCAoc3RydWN0IGlzaXNfbGlua19zdGF0ZV9oZHIgKmxzcF9oZHIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhKTsKK3ZvaWQgbHNwX3NlYXJjaF9hbmRfZGVzdHJveSAodV9jaGFyICogaWQsIGRpY3RfdCAqIGxzcGRiKTsKK3ZvaWQgbHNwX3B1cmdlX2RyICh1X2NoYXIgKiBpZCwgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgaW50IGxldmVsKTsKK3ZvaWQgbHNwX3B1cmdlX25vbl9leGlzdCAoc3RydWN0IGlzaXNfbGlua19zdGF0ZV9oZHIgKmxzcF9oZHIsCisJCQkgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWEpOwogCiAjZGVmaW5lIExTUF9FUVVBTCAxCiAjZGVmaW5lIExTUF9ORVdFUiAyCkBAIC0xMDksMjQgKzExMCwyNCBAQAogICAgICAgICBtZW1jcHkgKChJKSwgaXNpcy0+c3lzaWQsIElTSVNfU1lTX0lEX0xFTik7XAogICAgICAgICAoSSlbSVNJU19TWVNfSURfTEVOXSA9IDA7XAogICAgICAgICAoSSlbSVNJU19TWVNfSURfTEVOICsgMV0gPSAwCi1pbnQgbHNwX2lkX2NtcCAodV9jaGFyICppZDEsIHVfY2hhciAqaWQyKTsKLWludCBsc3BfY29tcGFyZSAoY2hhciAqYXJlYXRhZywgc3RydWN0IGlzaXNfbHNwICpsc3AsIHVfaW50MzJfdCBzZXFfbnVtLCAKLSAgICAgICAgICAgICAgICAgdV9pbnQxNl90IGNoZWNrc3VtLCB1X2ludDE2X3QgcmVtX2xpZmV0aW1lKTsKK2ludCBsc3BfaWRfY21wICh1X2NoYXIgKiBpZDEsIHVfY2hhciAqIGlkMik7CitpbnQgbHNwX2NvbXBhcmUgKGNoYXIgKmFyZWF0YWcsIHN0cnVjdCBpc2lzX2xzcCAqbHNwLCB1X2ludDMyX3Qgc2VxX251bSwKKwkJIHVfaW50MTZfdCBjaGVja3N1bSwgdV9pbnQxNl90IHJlbV9saWZldGltZSk7CiB2b2lkIGxzcF91cGRhdGUgKHN0cnVjdCBpc2lzX2xzcCAqbHNwLCBzdHJ1Y3QgaXNpc19saW5rX3N0YXRlX2hkciAqbHNwX2hkciwKLSAgICAgICAgICAgICAgICAgc3RydWN0IHN0cmVhbSAqc3RyZWFtLCBzdHJ1Y3QgaXNpc19hcmVhICphcmVhKTsKKwkJIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSwgc3RydWN0IGlzaXNfYXJlYSAqYXJlYSk7CiB2b2lkIGxzcF9pbmNfc2VxbnVtIChzdHJ1Y3QgaXNpc19sc3AgKmxzcCwgdV9pbnQzMl90IHNlcV9udW0pOwotaW50IGxzcF9wcmludF9hbGwgKHN0cnVjdCB2dHkgKnZ0eSwgZGljdF90ICpsc3BkYiwgY2hhciBkZXRhaWwsIGNoYXIgZHluaG9zdCk7CitpbnQgbHNwX3ByaW50X2FsbCAoc3RydWN0IHZ0eSAqdnR5LCBkaWN0X3QgKiBsc3BkYiwgY2hhciBkZXRhaWwsCisJCSAgIGNoYXIgZHluaG9zdCk7CiBjaGFyICpsc3BfYml0czJzdHJpbmcgKHVfY2hhciAqKTsKIAogLyogc3RhdGljbHkgYXNzaWduZWQgdmFycyBmb3IgcHJpbnRpbmcgcHVycG9zZXMgKi8KLWNoYXIgbHNwX2JpdHNfc3RyaW5nWzIwMF07IC8qIEZJWE1FOiBlbm91Z2ggPyAqLworY2hhciBsc3BfYml0c19zdHJpbmdbMjAwXTsJLyogRklYTUU6IGVub3VnaCA/ICovCiAKICNpZmRlZiBUT1BPTE9HWV9HRU5FUkFURQogdm9pZCBnZW5lcmF0ZV90b3BvbG9neV9sc3BzIChzdHJ1Y3QgaXNpc19hcmVhICphcmVhKTsKIHZvaWQgcmVtb3ZlX3RvcG9sb2d5X2xzcHMgKHN0cnVjdCBpc2lzX2FyZWEgKmFyZWEpOwogdm9pZCBidWlsZF90b3BvbG9neV9sc3BfZGF0YSAoc3RydWN0IGlzaXNfbHNwICpsc3AsCi0gICAgICAgICAgICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhLCBpbnQgbHNwX3RvcF9udW0pOworCQkJICAgICAgc3RydWN0IGlzaXNfYXJlYSAqYXJlYSwgaW50IGxzcF90b3BfbnVtKTsKICNlbmRpZiAvKiBUT1BPTE9HWV9HRU5FUkFURSAqLwogCiAjZW5kaWYgLyogSVNJU19MU1AgKi8KLQpkaWZmIC0tZ2l0IGEvaXNpc2QvaXNpc19tYWluLmMgYi9pc2lzZC9pc2lzX21haW4uYwppbmRleCBhMmE3ZTUxLi5kOWJkZDQ3IDEwMDY0NAotLS0gYS9pc2lzZC9pc2lzX21haW4uYworKysgYi9pc2lzZC9pc2lzX21haW4uYwpAQCAtNTAsMTQgKzUwLDEyIEBACiAjZGVmaW5lIElTSVNEX1ZUWV9QT1JUICAgICAgIDI2MDgKIAogLyogaXNpc2QgcHJpdmlsZWdlcyAqLwotemVicmFfY2FwYWJpbGl0aWVzX3QgX2NhcHNfcCBbXSA9IAoteworemVicmFfY2FwYWJpbGl0aWVzX3QgX2NhcHNfcFtdID0gewogICBaQ0FQX1JBVywKICAgWkNBUF9CSU5ECiB9OwogCi1zdHJ1Y3QgemVicmFfcHJpdnNfdCBpc2lzZF9wcml2cyA9Ci17CitzdHJ1Y3QgemVicmFfcHJpdnNfdCBpc2lzZF9wcml2cyA9IHsKICNpZiBkZWZpbmVkKFFVQUdHQV9VU0VSKQogICAudXNlciA9IFFVQUdHQV9VU0VSLAogI2VuZGlmCkBAIC03MywxNyArNzEsMTYgQEAKIH07CiAKIC8qIGlzaXNkIG9wdGlvbnMgKi8KLXN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9IAotewotICB7ICJkYWVtb24iLCAgICAgIG5vX2FyZ3VtZW50LCAgICAgICBOVUxMLCAnZCd9LAotICB7ICJjb25maWdfZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZid9LAotICB7ICJwaWRfZmlsZSIsICAgIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnaSd9LAotICB7ICJ2dHlfYWRkciIsICAgIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnQSd9LAotICB7ICJ2dHlfcG9ydCIsICAgIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnUCd9LAotICB7ICJ1c2VyIiwgICAgICAgIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAndSd9LAotICB7ICJ2ZXJzaW9uIiwgICAgIG5vX2FyZ3VtZW50LCAgICAgICBOVUxMLCAndid9LAotICB7ICJoZWxwIiwgICAgICAgIG5vX2FyZ3VtZW50LCAgICAgICBOVUxMLCAnaCd9LAotICB7IDAgfQorc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0geworICB7ImRhZW1vbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnZCd9LAorICB7ImNvbmZpZ19maWxlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdmJ30sCisgIHsicGlkX2ZpbGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2knfSwKKyAgeyJ2dHlfYWRkciIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnQSd9LAorICB7InZ0eV9wb3J0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdQJ30sCisgIHsidXNlciIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAndSd9LAorICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgTlVMTCwgJ3YnfSwKKyAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdoJ30sCisgIHswfQogfTsKIAogLyogQ29uZmlndXJhdGlvbiBmaWxlIGFuZCBkaXJlY3RvcnkuICovCkBAIC0xMDgsNyArMTA1LDYgQEAKIGNoYXIgKipfYXJndjsKIGNoYXIgKipfZW52cDsKIAotCiAvKiBIZWxwIGluZm9ybWF0aW9uIGRpc3BsYXkuICovCiBzdGF0aWMgdm9pZAogdXNhZ2UgKGludCBzdGF0dXMpCkBAIC0xMTYsNyArMTEyLDcgQEAKICAgaWYgKHN0YXR1cyAhPSAwKQogICAgIGZwcmludGYgKHN0ZGVyciwgIlRyeSBgJXMgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIsIHByb2duYW1lKTsKICAgZWxzZQotICAgIHsgICAgCisgICAgewogICAgICAgcHJpbnRmICgiVXNhZ2UgOiAlcyBbT1BUSU9OLi4uXVxuXG5cCiBEYWVtb24gd2hpY2ggbWFuYWdlcyBJUy1JUyByb3V0aW5nXG5cblwKIC1kLCAtLWRhZW1vbiAgICAgICBSdW5zIGluIGRhZW1vbiBtb2RlXG5cCkBAIC0xNTQsNyArMTUwLDcgQEAKICAqIFNpZ25hbCBoYW5kbGVycwogICovCiAKLXZvaWQgCit2b2lkCiBzaWdodXAgKHZvaWQpCiB7CiAgIHpsb2dfaW5mbyAoIlNJR0hVUCByZWNlaXZlZCIpOwpAQCAtMTY4LDcgKzE2NCw3IEBACiB7CiAgIHpsb2dfaW5mbyAoIlNJR0lOVCByZWNlaXZlZCIpOwogICB0ZXJtaW5hdGUgKDApOwotICAKKwogICByZXR1cm47CiB9CiAKQEAgLTE4NywyOSArMTgzLDI5IEBACiB9CiAKIHN0cnVjdCBxdWFnZ2Ffc2lnbmFsX3QgaXNpc2Rfc2lnbmFsc1tdID0KLXsgICAKLSAgeyAKLSAgICAuc2lnbmFsID0gU0lHSFVQLCAgCi0gICAgLmhhbmRsZXIgPSAmc2lnaHVwLAotICB9LAorewogICB7Ci0gICAgLnNpZ25hbCA9IFNJR1VTUjEsICAKLSAgICAuaGFuZGxlciA9ICZzaWd1c3IxLAotICB9LAorICAgLnNpZ25hbCA9IFNJR0hVUCwKKyAgIC5oYW5kbGVyID0gJnNpZ2h1cCwKKyAgIH0sCiAgIHsKLSAgICAuc2lnbmFsID0gU0lHSU5ULCAgCi0gICAgLmhhbmRsZXIgPSAmc2lnaW50LAotICB9LAorICAgLnNpZ25hbCA9IFNJR1VTUjEsCisgICAuaGFuZGxlciA9ICZzaWd1c3IxLAorICAgfSwKICAgewotICAgIC5zaWduYWwgPSBTSUdURVJNLAotICAgIC5oYW5kbGVyID0gJnNpZ3Rlcm0sCi0gIH0sCisgICAuc2lnbmFsID0gU0lHSU5ULAorICAgLmhhbmRsZXIgPSAmc2lnaW50LAorICAgfSwKKyAgeworICAgLnNpZ25hbCA9IFNJR1RFUk0sCisgICAuaGFuZGxlciA9ICZzaWd0ZXJtLAorICAgfSwKIH07CiAKIC8qCiAgKiBNYWluIHJvdXRpbmUgb2YgaXNpc2QuIFBhcnNlIGFyZ3VtZW50cyBhbmQgaGFuZGxlIElTLUlTIHN0YXRlIG1hY2hpbmUuCiAgKi8KLWludCAKK2ludAogbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCkKIHsKICAgY2hhciAqcDsKQEAgLTIyMiw5ICsyMTgsOCBAQAogICBwcm9nbmFtZSA9ICgocCA9IHN0cnJjaHIgKGFyZ3ZbMF0sICcvJykpID8gKytwIDogYXJndlswXSk7CiAKICAgemxvZ19kZWZhdWx0ID0gb3Blbnpsb2cgKHByb2duYW1lLCBaTE9HX05PTE9HLCBaTE9HX0lTSVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dfQ09OU3xMT0dfTkRFTEFZfExPR19QSUQsIExPR19EQUVNT04pOworCQkJICAgTE9HX0NPTlMgfCBMT0dfTkRFTEFZIHwgTE9HX1BJRCwgTE9HX0RBRU1PTik7CiAKLSAgCiAgIC8qIGZvciByZWxvYWQgKi8KICAgX2FyZ2MgPSBhcmdjOwogICBfYXJndiA9IGFyZ3Y7CkBAIC0yMzQsNzMgKzIyOSw3MyBAQAogICAgIHNucHJpbnRmIChfcHJvZ3BhdGgsIHNpemVvZiAoX3Byb2dwYXRoKSwgIiVzLyVzIiwgX2N3ZCwgX2FyZ3ZbMF0pOwogICBlbHNlCiAgICAgc25wcmludGYgKF9wcm9ncGF0aCwgc2l6ZW9mIChfcHJvZ3BhdGgpLCAiJXMiLCBhcmd2WzBdKTsKLSAgCisKICAgLyogQ29tbWFuZCBsaW5lIGFyZ3VtZW50IHRyZWF0bWVudC4gKi8KLSAgd2hpbGUgKDEpIAorICB3aGlsZSAoMSkKICAgICB7CiAgICAgICBvcHQgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImRmOmk6aEE6cDpQOnU6diIsIGxvbmdvcHRzLCAwKTsKLSAgICAKLSAgICAgIGlmIChvcHQgPT0gRU9GKQotICAgICAgICBicmVhazsKIAotICAgICAgc3dpdGNoIChvcHQpIAotICAgICAgICB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgZGFlbW9uX21vZGUgPSAxOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdmJzoKLSAgICAgICAgICBjb25maWdfZmlsZSA9IG9wdGFyZzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnaSc6Ci0gICAgICAgICAgcGlkX2ZpbGUgPSBvcHRhcmc7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0EnOgotICAgICAgICAgIHZ0eV9hZGRyID0gb3B0YXJnOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdQJzoKLSAgICAgICAgIC8qIERlYWwgd2l0aCBhdG9pKCkgcmV0dXJuaW5nIDAgb24gZmFpbHVyZSwgYW5kIGlzaXNkIG5vdAotICAgICAgICAgICAgIGxpc3RlbmluZyBvbiBpc2lzZCBwb3J0Li4uICovCi0gICAgICAgICAgaWYgKHN0cmNtcChvcHRhcmcsICIwIikgPT0gMCkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHZ0eV9wb3J0ID0gMDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IAotICAgICAgICAgIHZ0eV9wb3J0ID0gYXRvaSAob3B0YXJnKTsKLSAgICAgICAgICB2dHlfcG9ydCA9ICh2dHlfcG9ydCA/IHZ0eV9wb3J0IDogSVNJU0RfVlRZX1BPUlQpOworICAgICAgaWYgKG9wdCA9PSBFT0YpCisJYnJlYWs7CisKKyAgICAgIHN3aXRjaCAob3B0KQorCXsKKwljYXNlIDA6CiAJICBicmVhazsKLSAgICAgICAgY2FzZSAndSc6Ci0gICAgICAgICAgaXNpc2RfcHJpdnMudXNlciA9IGlzaXNkX3ByaXZzLmdyb3VwID0gb3B0YXJnOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICd2JzoKLQkgIHByaW50ZigiSVNJU2QgdmVyc2lvbiAlc1xuIiwgSVNJU0RfVkVSU0lPTik7Ci0JICBwcmludGYoIkNvcHlyaWdodCAoYykgMjAwMS0yMDAyIFNhbXBvIFNhYXJpc3RvLCIKLQkJICIgT2ZlciBXYWxkIGFuZCBIYW5uZXMgR3JlZGxlclxuIik7Ci0gICAgICAgICAgcHJpbnRfdmVyc2lvbiAoIlplYnJhIik7Ci0gICAgICAgICAgZXhpdCAoMCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2gnOgotICAgICAgICAgIHVzYWdlICgwKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB1c2FnZSAoMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKwljYXNlICdkJzoKKwkgIGRhZW1vbl9tb2RlID0gMTsKKwkgIGJyZWFrOworCWNhc2UgJ2YnOgorCSAgY29uZmlnX2ZpbGUgPSBvcHRhcmc7CisJICBicmVhazsKKwljYXNlICdpJzoKKwkgIHBpZF9maWxlID0gb3B0YXJnOworCSAgYnJlYWs7CisJY2FzZSAnQSc6CisJICB2dHlfYWRkciA9IG9wdGFyZzsKKwkgIGJyZWFrOworCWNhc2UgJ1AnOgorCSAgLyogRGVhbCB3aXRoIGF0b2koKSByZXR1cm5pbmcgMCBvbiBmYWlsdXJlLCBhbmQgaXNpc2Qgbm90CisJICAgICBsaXN0ZW5pbmcgb24gaXNpc2QgcG9ydC4uLiAqLworCSAgaWYgKHN0cmNtcCAob3B0YXJnLCAiMCIpID09IDApCisJICAgIHsKKwkgICAgICB2dHlfcG9ydCA9IDA7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIHZ0eV9wb3J0ID0gYXRvaSAob3B0YXJnKTsKKwkgIHZ0eV9wb3J0ID0gKHZ0eV9wb3J0ID8gdnR5X3BvcnQgOiBJU0lTRF9WVFlfUE9SVCk7CisJICBicmVhazsKKwljYXNlICd1JzoKKwkgIGlzaXNkX3ByaXZzLnVzZXIgPSBpc2lzZF9wcml2cy5ncm91cCA9IG9wdGFyZzsKKwkgIGJyZWFrOworCSAgYnJlYWs7CisJY2FzZSAndic6CisJICBwcmludGYgKCJJU0lTZCB2ZXJzaW9uICVzXG4iLCBJU0lTRF9WRVJTSU9OKTsKKwkgIHByaW50ZiAoIkNvcHlyaWdodCAoYykgMjAwMS0yMDAyIFNhbXBvIFNhYXJpc3RvLCIKKwkJICAiIE9mZXIgV2FsZCBhbmQgSGFubmVzIEdyZWRsZXJcbiIpOworCSAgcHJpbnRfdmVyc2lvbiAoIlplYnJhIik7CisJICBleGl0ICgwKTsKKwkgIGJyZWFrOworCWNhc2UgJ2gnOgorCSAgdXNhZ2UgKDApOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHVzYWdlICgxKTsKKwkgIGJyZWFrOworCX0KICAgICB9Ci0gIAorCiAgIC8qIHRocmVhZCBtYXN0ZXIgKi8KICAgbWFzdGVyID0gdGhyZWFkX21hc3Rlcl9jcmVhdGUgKCk7CiAKICAgLyogcmFuZG9tIHNlZWQgZnJvbSB0aW1lICovCi0gIHNyYW5kKHRpbWUoTlVMTCkpOworICBzcmFuZCAodGltZSAoTlVMTCkpOwogCiAgIC8qCiAgICAqICBpbml0aWFsaXphdGlvbnMKICAgICovCiAgIHpwcml2c19pbml0ICgmaXNpc2RfcHJpdnMpOwotICBzaWduYWxfaW5pdCAobWFzdGVyLCBRX1NJR0MoaXNpc2Rfc2lnbmFscyksIGlzaXNkX3NpZ25hbHMpOworICBzaWduYWxfaW5pdCAobWFzdGVyLCBRX1NJR0MgKGlzaXNkX3NpZ25hbHMpLCBpc2lzZF9zaWduYWxzKTsKICAgY21kX2luaXQgKDEpOwogICB2dHlfaW5pdCAobWFzdGVyKTsKICAgbWVtb3J5X2luaXQgKCk7CkBAIC0zMDgsNyArMzAzLDcgQEAKICAgZHluX2NhY2hlX2luaXQgKCk7CiAgIHNvcnRfbm9kZSAoKTsKIAotICAvKiBwYXJzZSBjb25maWcgZmlsZSAqLyAKKyAgLyogcGFyc2UgY29uZmlnIGZpbGUgKi8KICAgLyogdGhpcyBpcyBuZWVkZWQgdGhyZWUgdGltZXMhIGJlY2F1c2Ugd2UgaGF2ZSBpbnRlcmZhY2VzIGJlZm9yZSB0aGUgYXJlYXMgKi8KICAgdnR5X3JlYWRfY29uZmlnIChjb25maWdfZmlsZSwgY29uZmlnX2RlZmF1bHQpOwogICB2dHlfcmVhZF9jb25maWcgKGNvbmZpZ19maWxlLCBjb25maWdfZGVmYXVsdCk7CkBAIC0zMjMsNyArMzE4LDcgQEAKIAogICAvKiBNYWtlIGlzaXMgdnR5IHNvY2tldC4gKi8KICAgdnR5X3NlcnZfc29jayAodnR5X2FkZHIsIHZ0eV9wb3J0LCBJU0lTX1ZUWVNIX1BBVEgpOwotICAKKwogICAvKiBQcmludCBiYW5uZXIuICovCiAjaWYgZGVmaW5lZChaRUJSQV9WRVJTSU9OKQogICB6bG9nX2luZm8gKCJJU0lTZCAlcyBzdGFydGluZzogdnR5QCVkIiwgWkVCUkFfVkVSU0lPTiwgdnR5X3BvcnQpOwpAQCAtMzQwLDEzICszMzUsMyBAQAogICAvKiBOb3QgcmVhY2hlZC4gKi8KICAgZXhpdCAoMCk7CiB9Ci0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2lzaXNkL2lzaXNfbWlzYy5jIGIvaXNpc2QvaXNpc19taXNjLmMKaW5kZXggNzA5ZGJlNC4uN2ZlNTI4NiAxMDA2NDQKLS0tIGEvaXNpc2QvaXNpc19taXNjLmMKKysrIGIvaXNpc2QvaXNpc19taXNjLmMKQEAgLTIxLDcgKzIxLDYgQEAKICAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgogICovCiAKLQogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8dGltZS5oPgpAQCAtNTAsMjggKzQ5LDM3IEBACiAvKgogICogVGhpcyBjb252ZXJ0cyB0aGUgaXNvbmV0IHRvIGl0cyBwcmludGFibGUgZm9ybWF0CiAgKi8KLWNoYXIgKiBpc29uZXRfcHJpbnQgKHVfY2hhciAqZnJvbSwgaW50IGxlbikgeworY2hhciAqCitpc29uZXRfcHJpbnQgKHVfY2hhciAqIGZyb20sIGludCBsZW4pCit7CiAgIGludCBpID0gMDsKICAgY2hhciAqcG9zID0gaXNvbmV0OwogCi0gIGlmKCFmcm9tKQorICBpZiAoIWZyb20pCiAgICAgcmV0dXJuICJ1bmtub3duIjsKIAotICB3aGlsZSAoaSA8IGxlbikgewotICAgIGlmIChpICYgMSkgewotICAgICAgc3ByaW50ZiAoIHBvcywgIiUwMngiLCAqKGZyb20gKyBpKSk7Ci0gICAgICBwb3MgKz0gMjsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKGkgPT0gKGxlbiAtIDEpKSB7IC8qIE5vIGRvdCBhdCB0aGUgZW5kIG9mIGFkZHJlc3MgKi8KLSAgICAgICAgc3ByaW50ZiAoIHBvcywgIiUwMngiLCAqKGZyb20gKyBpKSk7Ci0gICAgICAgIHBvcyArPSAyOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3ByaW50ZiAoIHBvcywgIiUwMnguIiwgKihmcm9tICsgaSkpOwotICAgICAgICBwb3MgKz0gMzsKLSAgICAgIH0KKyAgd2hpbGUgKGkgPCBsZW4pCisgICAgeworICAgICAgaWYgKGkgJiAxKQorCXsKKwkgIHNwcmludGYgKHBvcywgIiUwMngiLCAqKGZyb20gKyBpKSk7CisJICBwb3MgKz0gMjsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKGkgPT0gKGxlbiAtIDEpKQorCSAgICB7CQkJLyogTm8gZG90IGF0IHRoZSBlbmQgb2YgYWRkcmVzcyAqLworCSAgICAgIHNwcmludGYgKHBvcywgIiUwMngiLCAqKGZyb20gKyBpKSk7CisJICAgICAgcG9zICs9IDI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHNwcmludGYgKHBvcywgIiUwMnguIiwgKihmcm9tICsgaSkpOworCSAgICAgIHBvcyArPSAzOworCSAgICB9CisJfQorICAgICAgaSsrOwogICAgIH0KLSAgICBpKys7Ci0gIH0KICAgKihwb3MpID0gJ1wwJzsKICAgcmV0dXJuIGlzb25ldDsKIH0KQEAgLTgxLDcgKzg5LDcgQEAKICAqIGV4dHJhY3QgZG90IGZyb20gdGhlIGRvdHRlZCBzdHIsIGFuZCBpbnNlcnQgYWxsIHRoZSBudW1iZXIgaW4gYSBidWZmIAogICovCiBpbnQKLWRvdGZvcm1hdDJidWZmICh1X2NoYXIgKmJ1ZmYsIHVfY2hhciAqZG90dGVkKQorZG90Zm9ybWF0MmJ1ZmYgKHVfY2hhciAqIGJ1ZmYsIHVfY2hhciAqIGRvdHRlZCkKIHsKICAgaW50IGRvdGxlbiwgbGVuID0gMDsKICAgdV9jaGFyICpwb3MgPSBkb3R0ZWQ7CkBAIC04OSw4MCArOTcsOTYgQEAKICAgaW50IG5leHRkb3Rwb3MgPSAyOwogCiAgIG51bWJlclsyXSA9ICdcMCc7Ci0gIGRvdGxlbiA9IHN0cmxlbihkb3R0ZWQpOwotICBpZiAoZG90bGVuID4gNTApIHsKLSAgICAvKiB0aGlzIGNhbid0IGJlIGFuIGlzbyBuZXQsIGl0cyB0b28gbG9uZyAqLwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgd2hpbGUgKCAocG9zIC0gZG90dGVkKSA8IGRvdGxlbiAmJiBsZW4gPCAyMCApIHsKLSAgICBpZiAoKnBvcyA9PSAnLicpIHsKLSAgICAgIC8qIHdlIGV4cGVjdCB0aGUgLiBhdCAyLCBhbmQgdGhhbiBldmVyeSA1ICovCi0gICAgICBpZiAoKHBvcyAtIGRvdHRlZCkgIT0gbmV4dGRvdHBvcykgewotICAgICAgICBsZW4gPSAwOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIG5leHRkb3Rwb3MgKz0gNTsKLSAgICAgIHBvcysrOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIC8qIHdlIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gY2hhcnMgbGVmdCBoZXJlICovCi0gICAgaWYgKGRvdGxlbiAtIChwb3MgLSBkb3R0ZWQpIDwgMikgewotICAgICAgbGVuID0gMDsKLSAgICAgIGJyZWFrOworICBkb3RsZW4gPSBzdHJsZW4gKGRvdHRlZCk7CisgIGlmIChkb3RsZW4gPiA1MCkKKyAgICB7CisgICAgICAvKiB0aGlzIGNhbid0IGJlIGFuIGlzbyBuZXQsIGl0cyB0b28gbG9uZyAqLworICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgaWYgKChpc3hkaWdpdCgoaW50KSpwb3MpKSAmJiAoaXN4ZGlnaXQoKGludCkqKHBvcysxKSkpKXsKLSAgICAgIG1lbWNweSAobnVtYmVyLCBwb3MgLDIpOwotICAgICAgcG9zKz0yOwotICAgIH0gZWxzZSB7Ci0gICAgICBsZW4gPSAwOwotICAgICAgYnJlYWs7CisgIHdoaWxlICgocG9zIC0gZG90dGVkKSA8IGRvdGxlbiAmJiBsZW4gPCAyMCkKKyAgICB7CisgICAgICBpZiAoKnBvcyA9PSAnLicpCisJeworCSAgLyogd2UgZXhwZWN0IHRoZSAuIGF0IDIsIGFuZCB0aGFuIGV2ZXJ5IDUgKi8KKwkgIGlmICgocG9zIC0gZG90dGVkKSAhPSBuZXh0ZG90cG9zKQorCSAgICB7CisJICAgICAgbGVuID0gMDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgbmV4dGRvdHBvcyArPSA1OworCSAgcG9zKys7CisJICBjb250aW51ZTsKKwl9CisgICAgICAvKiB3ZSBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIGNoYXJzIGxlZnQgaGVyZSAqLworICAgICAgaWYgKGRvdGxlbiAtIChwb3MgLSBkb3R0ZWQpIDwgMikKKwl7CisJICBsZW4gPSAwOworCSAgYnJlYWs7CisJfQorCisgICAgICBpZiAoKGlzeGRpZ2l0ICgoaW50KSAqcG9zKSkgJiYgKGlzeGRpZ2l0ICgoaW50KSAqKHBvcyArIDEpKSkpCisJeworCSAgbWVtY3B5IChudW1iZXIsIHBvcywgMik7CisJICBwb3MgKz0gMjsKKwl9CisgICAgICBlbHNlCisJeworCSAgbGVuID0gMDsKKwkgIGJyZWFrOworCX0KKworICAgICAgKihidWZmICsgbGVuKSA9IChjaGFyKSBzdHJ0b2wgKG51bWJlciwgTlVMTCwgMTYpOworICAgICAgbGVuKys7CiAgICAgfQogCi0gICAgKihidWZmICsgbGVuKSA9IChjaGFyKXN0cnRvbChudW1iZXIsIE5VTEwsIDE2KTsKLSAgICBsZW4rKzsKLSAgfQotICAKICAgcmV0dXJuIGxlbjsKIH0KKwogLyoKICAqIGNvbnZlcnNpb24gb2YgWFhYWC5YWFhYLlhYWFggdG8gbWVtb3J5CiAgKi8KIGludAotc3lzaWQyYnVmZiAodV9jaGFyICpidWZmLCB1X2NoYXIgKmRvdHRlZCkKLSB7CitzeXNpZDJidWZmICh1X2NoYXIgKiBidWZmLCB1X2NoYXIgKiBkb3R0ZWQpCit7CiAgIGludCBsZW4gPSAwOwogICB1X2NoYXIgKnBvcyA9IGRvdHRlZDsKICAgdV9jaGFyIG51bWJlclszXTsKIAogICBudW1iZXJbMl0gPSAnXDAnOwogICAvLyBzdXJlbHkgbm90IGEgc3lzaWRfc3RyaW5nIGlmIG5vdCAxNCBsZW5ndGgKLSAgaWYgKHN0cmxlbihkb3R0ZWQpICE9IDE0KSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICB3aGlsZSAoIGxlbiA8IElTSVNfU1lTX0lEX0xFTiApIHsKLSAgICBpZiAoKnBvcyA9PSAnLicpIHsKLSAgICAgIC8qIHRoZSAuIGlzIG5vdCBwb3NpdGlvbmVkIGNvcnJlY3RseSAqLwotICAgICAgaWYgKCgocG9zIC0gZG90dGVkKSAhPTQpICYmICgocG9zIC0gZG90dGVkKSAhPSA5KSkgeyAKLSAgICAgICAgbGVuID0gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBwb3MrKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAoKGlzeGRpZ2l0KChpbnQpKnBvcykpICYmIChpc3hkaWdpdCgoaW50KSoocG9zKzEpKSkpewotICAgICAgbWVtY3B5IChudW1iZXIsIHBvcyAsMik7Ci0gICAgICBwb3MrPTI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGxlbiA9IDA7Ci0gICAgICBicmVhazsKKyAgaWYgKHN0cmxlbiAoZG90dGVkKSAhPSAxNCkKKyAgICB7CisgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICAqKGJ1ZmYgKyBsZW4pID0gKGNoYXIpc3RydG9sKG51bWJlciwgTlVMTCwgMTYpOwotICAgIGxlbisrOwotICB9CisgIHdoaWxlIChsZW4gPCBJU0lTX1NZU19JRF9MRU4pCisgICAgeworICAgICAgaWYgKCpwb3MgPT0gJy4nKQorCXsKKwkgIC8qIHRoZSAuIGlzIG5vdCBwb3NpdGlvbmVkIGNvcnJlY3RseSAqLworCSAgaWYgKCgocG9zIC0gZG90dGVkKSAhPSA0KSAmJiAoKHBvcyAtIGRvdHRlZCkgIT0gOSkpCisJICAgIHsKKwkgICAgICBsZW4gPSAwOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBwb3MrKzsKKwkgIGNvbnRpbnVlOworCX0KKyAgICAgIGlmICgoaXN4ZGlnaXQgKChpbnQpICpwb3MpKSAmJiAoaXN4ZGlnaXQgKChpbnQpICoocG9zICsgMSkpKSkKKwl7CisJICBtZW1jcHkgKG51bWJlciwgcG9zLCAyKTsKKwkgIHBvcyArPSAyOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBsZW4gPSAwOworCSAgYnJlYWs7CisJfQorCisgICAgICAqKGJ1ZmYgKyBsZW4pID0gKGNoYXIpIHN0cnRvbCAobnVtYmVyLCBOVUxMLCAxNik7CisgICAgICBsZW4rKzsKKyAgICB9CiAKICAgcmV0dXJuIGxlbjsKIApAQCAtMTc0LDc5ICsxOTgsODIgQEAKICAqLwogCiBjaGFyICoKLW5scGlkMnN0cmluZyAoc3RydWN0IG5scGlkcyAqbmxwaWRzKSB7CitubHBpZDJzdHJpbmcgKHN0cnVjdCBubHBpZHMgKm5scGlkcykKK3sKICAgY2hhciAqcG9zID0gbmxwaWRzdHJpbmc7CiAgIGludCBpOwogCi0gIGZvciAoaT0wO2k8bmxwaWRzLT5jb3VudDtpKyspIHsKLSAgICBzd2l0Y2ggKG5scGlkcy0+bmxwaWRzW2ldKSB7Ci0gICAgY2FzZSBOTFBJRF9JUDoKLSAgICAgIHBvcyArPSBzcHJpbnRmIChwb3MsICJJUHY0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5MUElEX0lQVjY6Ci0gICAgICBwb3MgKz0gc3ByaW50ZiAocG9zLCAiSVB2NiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOTFBJRF9TTkFQOgotICAgICAgcG9zICs9IHNwcmludGYgKHBvcywgIlNOQVAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTkxQSURfQ0xOUDoKLSAgICAgIHBvcyArPSBzcHJpbnRmIChwb3MsICJDTE5QIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5MUElEX0VTSVM6Ci0gICAgICBwb3MgKz0gc3ByaW50ZiAocG9zLCAiRVMtSVMiKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBwb3MgKz0gc3ByaW50ZiAocG9zLCAidW5rbm93biIpOwotICAgICAgYnJlYWs7CisgIGZvciAoaSA9IDA7IGkgPCBubHBpZHMtPmNvdW50OyBpKyspCisgICAgeworICAgICAgc3dpdGNoIChubHBpZHMtPm5scGlkc1tpXSkKKwl7CisJY2FzZSBOTFBJRF9JUDoKKwkgIHBvcyArPSBzcHJpbnRmIChwb3MsICJJUHY0Iik7CisJICBicmVhazsKKwljYXNlIE5MUElEX0lQVjY6CisJICBwb3MgKz0gc3ByaW50ZiAocG9zLCAiSVB2NiIpOworCSAgYnJlYWs7CisJY2FzZSBOTFBJRF9TTkFQOgorCSAgcG9zICs9IHNwcmludGYgKHBvcywgIlNOQVAiKTsKKwkgIGJyZWFrOworCWNhc2UgTkxQSURfQ0xOUDoKKwkgIHBvcyArPSBzcHJpbnRmIChwb3MsICJDTE5QIik7CisJICBicmVhazsKKwljYXNlIE5MUElEX0VTSVM6CisJICBwb3MgKz0gc3ByaW50ZiAocG9zLCAiRVMtSVMiKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBwb3MgKz0gc3ByaW50ZiAocG9zLCAidW5rbm93biIpOworCSAgYnJlYWs7CisJfQorICAgICAgaWYgKG5scGlkcy0+Y291bnQgLSBpID4gMSkKKwlwb3MgKz0gc3ByaW50ZiAocG9zLCAiLCAiKTsKKwogICAgIH0KLSAgICBpZiAobmxwaWRzLT5jb3VudC1pPjEpCi0gICAgICBwb3MgKz0gc3ByaW50ZiAocG9zLCAiLCAiKTsKLSAgICAKLSAgfQogCiAgICoocG9zKSA9ICdcMCc7Ci0gIAorCiAgIHJldHVybiBubHBpZHN0cmluZzsKIH0KIAogLyoKICAqICBzdXBwb3J0cyB0aGUgZ2l2ZW4gYWYgPwogICovCi1pbnQgCitpbnQKIHNwZWFrcyAoc3RydWN0IG5scGlkcyAqbmxwaWRzLCBpbnQgZmFtaWx5KQogewogICBpbnQgaSwgc3BlYWtzID0gMDsKLSAgCi0gIGlmIChubHBpZHMgPT0gKHN0cnVjdCBubHBpZHMqKU5VTEwpCisKKyAgaWYgKG5scGlkcyA9PSAoc3RydWN0IG5scGlkcyAqKSBOVUxMKQogICAgIHJldHVybiBzcGVha3M7Ci0gIGZvciAoaSA9IDA7aSA8IG5scGlkcy0+Y291bnQ7IGkrKykgewotICAgIGlmIChmYW1pbHkgPT0gQUZfSU5FVCAmJiBubHBpZHMtPm5scGlkc1tpXSA9PSBOTFBJRF9JUCkKLSAgICAgIHNwZWFrcyA9IDE7Ci0gICAgaWYgKGZhbWlseSA9PSBBRl9JTkVUNiAmJiBubHBpZHMtPm5scGlkc1tpXSA9PSBOTFBJRF9JUFY2KQotICAgICAgc3BlYWtzID0gMTsKLSAgfQorICBmb3IgKGkgPSAwOyBpIDwgbmxwaWRzLT5jb3VudDsgaSsrKQorICAgIHsKKyAgICAgIGlmIChmYW1pbHkgPT0gQUZfSU5FVCAmJiBubHBpZHMtPm5scGlkc1tpXSA9PSBOTFBJRF9JUCkKKwlzcGVha3MgPSAxOworICAgICAgaWYgKGZhbWlseSA9PSBBRl9JTkVUNiAmJiBubHBpZHMtPm5scGlkc1tpXSA9PSBOTFBJRF9JUFY2KQorCXNwZWFrcyA9IDE7CisgICAgfQogCiAgIHJldHVybiBzcGVha3M7CiB9CiAKLQogLyoKICAqIFJldHVybnMgMCBvbiBlcnJvciwgSVMtSVMgQ2lyY3VpdCBUeXBlIG9uIG9rCiAgKi8KLWludCAKLXN0cmluZzJjaXJjdWl0X3QgKHVfY2hhciAqc3RyKQoraW50CitzdHJpbmcyY2lyY3VpdF90ICh1X2NoYXIgKiBzdHIpCiB7Ci0gIAorCiAgIGlmICghc3RyKQogICAgIHJldHVybiAwOwotICAKLSAgaWYgKCFzdHJjbXAoc3RyLCJsZXZlbC0xIikpCisKKyAgaWYgKCFzdHJjbXAgKHN0ciwgImxldmVsLTEiKSkKICAgICByZXR1cm4gSVNfTEVWRUxfMTsKIAotICBpZiAoIXN0cmNtcChzdHIsImxldmVsLTItb25seSIpIHx8ICFzdHJjbXAoc3RyLCJsZXZlbC0yIikpCisgIGlmICghc3RyY21wIChzdHIsICJsZXZlbC0yLW9ubHkiKSB8fCAhc3RyY21wIChzdHIsICJsZXZlbC0yIikpCiAgICAgcmV0dXJuIElTX0xFVkVMXzI7Ci0gIAotICBpZiAoIXN0cmNtcChzdHIsImxldmVsLTEtMiIpKQorCisgIGlmICghc3RyY21wIChzdHIsICJsZXZlbC0xLTIiKSkKICAgICByZXR1cm4gSVNfTEVWRUxfMV9BTkRfMjsKIAogICByZXR1cm4gMDsKQEAgLTI1NSw2MiArMjgyLDY4IEBACiBjb25zdCBjaGFyICoKIGNpcmN1aXRfdDJzdHJpbmcgKGludCBjaXJjdWl0X3QpCiB7Ci0gIHN3aXRjaCAoY2lyY3VpdF90KSB7Ci0gIGNhc2UgSVNfTEVWRUxfMToKLSAgICByZXR1cm4gIkwxIjsKLSAgY2FzZSBJU19MRVZFTF8yOgotICAgIHJldHVybiAiTDIiOwotICBjYXNlIElTX0xFVkVMXzFfQU5EXzI6Ci0gICAgcmV0dXJuICJMMUwyIjsKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gIj8/IjsKLSAgfQorICBzd2l0Y2ggKGNpcmN1aXRfdCkKKyAgICB7CisgICAgY2FzZSBJU19MRVZFTF8xOgorICAgICAgcmV0dXJuICJMMSI7CisgICAgY2FzZSBJU19MRVZFTF8yOgorICAgICAgcmV0dXJuICJMMiI7CisgICAgY2FzZSBJU19MRVZFTF8xX0FORF8yOgorICAgICAgcmV0dXJuICJMMUwyIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICI/PyI7CisgICAgfQogCi0gIHJldHVybiBOVUxMOyAvKiBub3QgcmVhY2hlZCAqLworICByZXR1cm4gTlVMTDsJCQkvKiBub3QgcmVhY2hlZCAqLwogfQogCiBjb25zdCBjaGFyICoKIHN5c3Qyc3RyaW5nIChpbnQgdHlwZSkKIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gIGNhc2UgSVNJU19TWVNUWVBFX0VTOgotICAgIHJldHVybiAiRVMiOwotICBjYXNlIElTSVNfU1lTVFlQRV9JUzoKLSAgICByZXR1cm4gIklTIjsKLSAgY2FzZSBJU0lTX1NZU1RZUEVfTDFfSVM6Ci0gICAgcmV0dXJuICIxIjsKLSAgY2FzZSBJU0lTX1NZU1RZUEVfTDJfSVM6Ci0gICAgcmV0dXJuICIyIjsKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gIj8/IjsKLSAgfQorICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgSVNJU19TWVNUWVBFX0VTOgorICAgICAgcmV0dXJuICJFUyI7CisgICAgY2FzZSBJU0lTX1NZU1RZUEVfSVM6CisgICAgICByZXR1cm4gIklTIjsKKyAgICBjYXNlIElTSVNfU1lTVFlQRV9MMV9JUzoKKyAgICAgIHJldHVybiAiMSI7CisgICAgY2FzZSBJU0lTX1NZU1RZUEVfTDJfSVM6CisgICAgICByZXR1cm4gIjIiOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gIj8/IjsKKyAgICB9CiAKLSAgcmV0dXJuIE5VTEw7IC8qIG5vdCByZWFjaGVkICovCisgIHJldHVybiBOVUxMOwkJCS8qIG5vdCByZWFjaGVkICovCiB9CiAKIC8qCiAgKiBQcmludCBmdW5jdGlvbnMgLSB3ZSBwcmludCB0byBzdGF0aWMgdmFycwogICovCiBjaGFyICoKLXNucGFfcHJpbnQgKHVfY2hhciAqZnJvbSkKK3NucGFfcHJpbnQgKHVfY2hhciAqIGZyb20pCiB7CiAgIGludCBpID0gMDsKICAgdV9jaGFyICpwb3MgPSBzbnBhOwogCi0gIGlmKCFmcm9tKQorICBpZiAoIWZyb20pCiAgICAgcmV0dXJuICJ1bmtub3duIjsKLSAgCi0gIHdoaWxlIChpIDwgRVRIX0FMRU4gLSAxKSB7Ci0gICAgaWYgKGkgJiAxKSB7Ci0gICAgICBzcHJpbnRmICggcG9zLCAiJTAyeC4iLCAqKGZyb20gKyBpKSk7Ci0gICAgICBwb3MgKz0gMzsKLSAgICB9IGVsc2UgewotICAgICAgc3ByaW50ZiAoIHBvcywgIiUwMngiLCAqKGZyb20gKyBpKSk7Ci0gICAgICBwb3MgKz0gMjsKIAorICB3aGlsZSAoaSA8IEVUSF9BTEVOIC0gMSkKKyAgICB7CisgICAgICBpZiAoaSAmIDEpCisJeworCSAgc3ByaW50ZiAocG9zLCAiJTAyeC4iLCAqKGZyb20gKyBpKSk7CisJICBwb3MgKz0gMzsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3ByaW50ZiAocG9zLCAiJTAyeCIsICooZnJvbSArIGkpKTsKKwkgIHBvcyArPSAyOworCisJfQorICAgICAgaSsrOwogICAgIH0KLSAgICBpKys7Ci0gIH0KIAogICBzcHJpbnRmIChwb3MsICIlMDJ4IiwgKihmcm9tICsgKElTSVNfU1lTX0lEX0xFTiAtIDEpKSk7CiAgIHBvcyArPSAyOwpAQCAtMzIwLDQ0ICszNTMsNDggQEAKIH0KIAogY2hhciAqCi1zeXNpZF9wcmludCAodV9jaGFyICpmcm9tKQorc3lzaWRfcHJpbnQgKHVfY2hhciAqIGZyb20pCiB7CiAgIGludCBpID0gMDsKICAgY2hhciAqcG9zID0gc3lzaWQ7CiAKLSAgaWYoIWZyb20pCisgIGlmICghZnJvbSkKICAgICByZXR1cm4gInVua25vd24iOwogCi0gIHdoaWxlIChpIDwgSVNJU19TWVNfSURfTEVOIC0gMSkgewotICAgIGlmIChpICYgMSkgewotICAgICAgc3ByaW50ZiAoIHBvcywgIiUwMnguIiwgKihmcm9tICsgaSkpOwotICAgICAgcG9zICs9IDM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNwcmludGYgKCBwb3MsICIlMDJ4IiwgKihmcm9tICsgaSkpOwotICAgICAgcG9zICs9IDI7Ci0gICAgCi0gICAgfSAKLSAgICBpKys7Ci0gIH0KKyAgd2hpbGUgKGkgPCBJU0lTX1NZU19JRF9MRU4gLSAxKQorICAgIHsKKyAgICAgIGlmIChpICYgMSkKKwl7CisJICBzcHJpbnRmIChwb3MsICIlMDJ4LiIsICooZnJvbSArIGkpKTsKKwkgIHBvcyArPSAzOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzcHJpbnRmIChwb3MsICIlMDJ4IiwgKihmcm9tICsgaSkpOworCSAgcG9zICs9IDI7CisKKwl9CisgICAgICBpKys7CisgICAgfQogCiAgIHNwcmludGYgKHBvcywgIiUwMngiLCAqKGZyb20gKyAoSVNJU19TWVNfSURfTEVOIC0gMSkpKTsKICAgcG9zICs9IDI7CiAgICoocG9zKSA9ICdcMCc7Ci0gIAorCiAgIHJldHVybiBzeXNpZDsKIH0KIAogY2hhciAqCi1yYXdsc3BpZF9wcmludCAodV9jaGFyICpmcm9tKQorcmF3bHNwaWRfcHJpbnQgKHVfY2hhciAqIGZyb20pCiB7CiAgIGNoYXIgKnBvcyA9IGxzcGlkOwotICBpZighZnJvbSkKKyAgaWYgKCFmcm9tKQogICAgIHJldHVybiAidW5rbm93biI7Ci0gIG1lbWNweShwb3MsIHN5c2lkX3ByaW50KGZyb20pLCAxNSk7CisgIG1lbWNweSAocG9zLCBzeXNpZF9wcmludCAoZnJvbSksIDE1KTsKICAgcG9zICs9IDE0OwotICBzcHJpbnRmIChwb3MsICIuJTAyeCIsIExTUF9QU0VVRE9fSUQoZnJvbSkpOworICBzcHJpbnRmIChwb3MsICIuJTAyeCIsIExTUF9QU0VVRE9fSUQgKGZyb20pKTsKICAgcG9zICs9IDM7Ci0gIHNwcmludGYgKHBvcywgIi0lMDJ4IiwgTFNQX0ZSQUdNRU5UKGZyb20pKTsKKyAgc3ByaW50ZiAocG9zLCAiLSUwMngiLCBMU1BfRlJBR01FTlQgKGZyb20pKTsKICAgcG9zICs9IDM7CiAKICAgKihwb3MpID0gJ1wwJzsKQEAgLTM2NiwzNCArNDAzLDM1IEBACiB9CiAKIGNoYXIgKgotdGltZTJzdHJpbmcgKHVfaW50MzJfdCB0aW1lKSB7Ci0gIGNoYXIgKnBvcyA9IGRhdGVzdHJpbmc7IAordGltZTJzdHJpbmcgKHVfaW50MzJfdCB0aW1lKQoreworICBjaGFyICpwb3MgPSBkYXRlc3RyaW5nOwogICB1X2ludDMyX3QgcmVzdDsKIAotICBpZiAodGltZT09MCkKKyAgaWYgKHRpbWUgPT0gMCkKICAgICByZXR1cm4gIi0iOwogCi0gIGlmKHRpbWUvU0VDU19QRVJfWUVBUikKLSAgICBwb3MgKz0gc3ByaW50ZiAocG9zLCAiJXVZIix0aW1lL1NFQ1NfUEVSX1lFQVIpOwotICByZXN0PXRpbWUlU0VDU19QRVJfWUVBUjsgICAgCi0gIGlmKHJlc3QvU0VDU19QRVJfTU9OVEgpCi0gICAgcG9zICs9IHNwcmludGYgKHBvcywgIiV1TSIscmVzdC9TRUNTX1BFUl9NT05USCk7Ci0gIHJlc3Q9cmVzdCVTRUNTX1BFUl9NT05USDsgIAotICBpZihyZXN0L1NFQ1NfUEVSX1dFRUspCi0gICAgcG9zICs9IHNwcmludGYgKHBvcywgIiV1dyIscmVzdC9TRUNTX1BFUl9XRUVLKTsKLSAgcmVzdD1yZXN0JVNFQ1NfUEVSX1dFRUs7ICAgIAotICBpZihyZXN0L1NFQ1NfUEVSX0RBWSkKLSAgICBwb3MgKz0gc3ByaW50ZiAocG9zLCAiJXVkIixyZXN0L1NFQ1NfUEVSX0RBWSk7Ci0gIHJlc3Q9cmVzdCVTRUNTX1BFUl9EQVk7ICAgIAotICBpZihyZXN0L1NFQ1NfUEVSX0hPVVIpCi0gICAgcG9zICs9IHNwcmludGYgKHBvcywgIiV1aCIscmVzdC9TRUNTX1BFUl9IT1VSKTsKLSAgcmVzdD1yZXN0JVNFQ1NfUEVSX0hPVVI7ICAgIAotICBpZihyZXN0L1NFQ1NfUEVSX01JTlVURSkKLSAgICBwb3MgKz0gc3ByaW50ZiAocG9zLCAiJXVtIixyZXN0L1NFQ1NfUEVSX01JTlVURSk7Ci0gIHJlc3Q9cmVzdCVTRUNTX1BFUl9NSU5VVEU7ICAgIAotICBpZihyZXN0KQotICAgIHBvcyArPSBzcHJpbnRmIChwb3MsICIldXMiLHJlc3QpOyAgIAotIAorICBpZiAodGltZSAvIFNFQ1NfUEVSX1lFQVIpCisgICAgcG9zICs9IHNwcmludGYgKHBvcywgIiV1WSIsIHRpbWUgLyBTRUNTX1BFUl9ZRUFSKTsKKyAgcmVzdCA9IHRpbWUgJSBTRUNTX1BFUl9ZRUFSOworICBpZiAocmVzdCAvIFNFQ1NfUEVSX01PTlRIKQorICAgIHBvcyArPSBzcHJpbnRmIChwb3MsICIldU0iLCByZXN0IC8gU0VDU19QRVJfTU9OVEgpOworICByZXN0ID0gcmVzdCAlIFNFQ1NfUEVSX01PTlRIOworICBpZiAocmVzdCAvIFNFQ1NfUEVSX1dFRUspCisgICAgcG9zICs9IHNwcmludGYgKHBvcywgIiV1dyIsIHJlc3QgLyBTRUNTX1BFUl9XRUVLKTsKKyAgcmVzdCA9IHJlc3QgJSBTRUNTX1BFUl9XRUVLOworICBpZiAocmVzdCAvIFNFQ1NfUEVSX0RBWSkKKyAgICBwb3MgKz0gc3ByaW50ZiAocG9zLCAiJXVkIiwgcmVzdCAvIFNFQ1NfUEVSX0RBWSk7CisgIHJlc3QgPSByZXN0ICUgU0VDU19QRVJfREFZOworICBpZiAocmVzdCAvIFNFQ1NfUEVSX0hPVVIpCisgICAgcG9zICs9IHNwcmludGYgKHBvcywgIiV1aCIsIHJlc3QgLyBTRUNTX1BFUl9IT1VSKTsKKyAgcmVzdCA9IHJlc3QgJSBTRUNTX1BFUl9IT1VSOworICBpZiAocmVzdCAvIFNFQ1NfUEVSX01JTlVURSkKKyAgICBwb3MgKz0gc3ByaW50ZiAocG9zLCAiJXVtIiwgcmVzdCAvIFNFQ1NfUEVSX01JTlVURSk7CisgIHJlc3QgPSByZXN0ICUgU0VDU19QRVJfTUlOVVRFOworICBpZiAocmVzdCkKKyAgICBwb3MgKz0gc3ByaW50ZiAocG9zLCAiJXVzIiwgcmVzdCk7CisKICAgKihwb3MpID0gMDsKIAogICByZXR1cm4gZGF0ZXN0cmluZzsKQEAgLTQwNiwxMiArNDQ0LDEyIEBACiAgKiBmaXJzdCBhcmd1bWVudCBpcyB0aGUgdGltZXIgYW5kIHRoZSBzZWNvbmQgaXMKICAqIHRoZSBqaXR0ZXIKICAqLwotdW5zaWduZWQgbG9uZyAKK3Vuc2lnbmVkIGxvbmcKIGlzaXNfaml0dGVyICh1bnNpZ25lZCBsb25nIHRpbWVyLCB1bnNpZ25lZCBsb25nIGppdHRlcikKIHsKLSAgaW50IGosazsKKyAgaW50IGosIGs7CiAKLSAgaWYgKGppdHRlcj49MTAwKQorICBpZiAoaml0dGVyID49IDEwMCkKICAgICByZXR1cm4gdGltZXI7CiAKICAgaWYgKHRpbWVyID09IDEpCkBAIC00MjMsOSArNDYxLDkgQEAKICAgICogbW9zdCBJUy1JUyB0aW1lcnMgYXJlIG5vIGxvbmdlciB0aGFuIDE2IGJpdAogICAgKi8KIAotICBqID0gMSArIChpbnQpICgoUkFORE9NX1NQUkVBRCAqIHJhbmQoKSkgLyAoUkFORF9NQVggKyAxLjAgKSk7IAorICBqID0gMSArIChpbnQpICgoUkFORE9NX1NQUkVBRCAqIHJhbmQgKCkpIC8gKFJBTkRfTUFYICsgMS4wKSk7CiAKLSAgayA9IHRpbWVyIC0gKHRpbWVyICogKDEwMCAtIGppdHRlcikpLzEwMDsKKyAgayA9IHRpbWVyIC0gKHRpbWVyICogKDEwMCAtIGppdHRlcikpIC8gMTAwOwogCiAgIHRpbWVyID0gdGltZXIgLSAoayAqIGogLyBSQU5ET01fU1BSRUFEKTsKIApAQCAtNDMzLDExICs0NzEsMTEgQEAKIH0KIAogc3RydWN0IGluX2FkZHIKLW5ld3ByZWZpeDJpbmFkZHIgKHVfY2hhciAqcHJlZml4X3N0YXJ0LCB1X2NoYXIgcHJlZml4X21hc2tsZW4pIAorbmV3cHJlZml4MmluYWRkciAodV9jaGFyICogcHJlZml4X3N0YXJ0LCB1X2NoYXIgcHJlZml4X21hc2tsZW4pCiB7Ci0gIG1lbXNldCgmbmV3X3ByZWZpeCwgMCwgc2l6ZW9mIChuZXdfcHJlZml4KSk7Ci0gIG1lbWNweSgmbmV3X3ByZWZpeCwgcHJlZml4X3N0YXJ0LCAocHJlZml4X21hc2tsZW4gJiAweDNGKSA/IAotCSAoKCgocHJlZml4X21hc2tsZW4gJiAweDNGKS0xKT4+MykrMSkgOiAwKTsKKyAgbWVtc2V0ICgmbmV3X3ByZWZpeCwgMCwgc2l6ZW9mIChuZXdfcHJlZml4KSk7CisgIG1lbWNweSAoJm5ld19wcmVmaXgsIHByZWZpeF9zdGFydCwgKHByZWZpeF9tYXNrbGVuICYgMHgzRikgPworCSAgKCgoKHByZWZpeF9tYXNrbGVuICYgMHgzRikgLSAxKSA+PiAzKSArIDEpIDogMCk7CiAgIHJldHVybiBuZXdfcHJlZml4OwogfQogCkBAIC00NDYsMTcgKzQ4NCwxOCBAQAogICogaXQgcmV0dXJucyB0aGUgc3lzdGVtIGhvc3RuYW1lLgogICovCiBjb25zdCBjaGFyICoKLXVuaXhfaG9zdG5hbWUodm9pZCkKK3VuaXhfaG9zdG5hbWUgKHZvaWQpCiB7CiAgIHN0YXRpYyBzdHJ1Y3QgdXRzbmFtZSBuYW1lczsKICAgY29uc3QgY2hhciAqaG9zdG5hbWU7CiAgIGV4dGVybiBzdHJ1Y3QgaG9zdCBob3N0OwogCiAgIGhvc3RuYW1lID0gaG9zdC5uYW1lOwotICBpZiAoIWhvc3RuYW1lKSB7IAotICAgIHVuYW1lKCZuYW1lcyk7Ci0gICAgaG9zdG5hbWUgPSBuYW1lcy5ub2RlbmFtZTsKLSAgfQorICBpZiAoIWhvc3RuYW1lKQorICAgIHsKKyAgICAgIHVuYW1lICgmbmFtZXMpOworICAgICAgaG9zdG5hbWUgPSBuYW1lcy5ub2RlbmFtZTsKKyAgICB9CiAKICAgcmV0dXJuIGhvc3RuYW1lOwogfQpkaWZmIC0tZ2l0IGEvaXNpc2QvaXNpc19taXNjLmggYi9pc2lzZC9pc2lzX21pc2MuaAppbmRleCBjYTBjMGFlLi43NWM4ZDhiIDEwMDY0NAotLS0gYS9pc2lzZC9pc2lzX21pc2MuaAorKysgYi9pc2lzZC9pc2lzX21pc2MuaApAQCAtMjgsNyArMjgsOCBAQAogaW50IHN0cmluZzJjaXJjdWl0X3QgKHVfY2hhciAqKTsKIGNvbnN0IGNoYXIgKmNpcmN1aXRfdDJzdHJpbmcgKGludCk7CiBjb25zdCBjaGFyICpzeXN0MnN0cmluZyAoaW50KTsKLXN0cnVjdCBpbl9hZGRyIG5ld3ByZWZpeDJpbmFkZHIgKHVfY2hhciAqcHJlZml4X3N0YXJ0LCB1X2NoYXIgcHJlZml4X21hc2tsZW4pOworc3RydWN0IGluX2FkZHIgbmV3cHJlZml4MmluYWRkciAodV9jaGFyICogcHJlZml4X3N0YXJ0LAorCQkJCSB1X2NoYXIgcHJlZml4X21hc2tsZW4pOwogLyoKICAqIENvbnZlcnRpbmcgaW5wdXQgdG8gbWVtb3J5IHN0b3JlZCBmb3JtYXQKICAqIHJldHVybiB2YWx1ZSBvZiAwIGluZGljYXRlcyB3cm9uZyBpbnB1dApAQCAtNDEsNDEgKzQyLDM4IEBACiAgKi8KIGNoYXIgKmlzb25ldF9wcmludCAodV9jaGFyICosIGludCBsZW4pOwogY2hhciAqc3lzaWRfcHJpbnQgKHVfY2hhciAqKTsKLWNoYXIgKnNucGFfcHJpbnQgICh1X2NoYXIgKik7CitjaGFyICpzbnBhX3ByaW50ICh1X2NoYXIgKik7CiBjaGFyICpyYXdsc3BpZF9wcmludCAodV9jaGFyICopOwogY2hhciAqdGltZTJzdHJpbmcgKHVfaW50MzJfdCk7CiAvKiB0eXBlZGVmIHN0cnVjdCBubHBpZHMgbmxwaWRzOyAqLwogY2hhciAqbmxwaWQyc3RyaW5nIChzdHJ1Y3QgbmxwaWRzICopOwogCi0KIC8qCiAgKiBtaXNjIGZ1bmN0aW9ucwogICovCi1pbnQgIHNwZWFrcyAoc3RydWN0IG5scGlkcyAqbmxwaWRzLCBpbnQgZmFtaWx5KTsKK2ludCBzcGVha3MgKHN0cnVjdCBubHBpZHMgKm5scGlkcywgaW50IGZhbWlseSk7CiB1bnNpZ25lZCBsb25nIGlzaXNfaml0dGVyICh1bnNpZ25lZCBsb25nIHRpbWVyLCB1bnNpZ25lZCBsb25nIGppdHRlcik7Ci1jb25zdCBjaGFyICogdW5peF9ob3N0bmFtZSh2b2lkKTsKLQorY29uc3QgY2hhciAqdW5peF9ob3N0bmFtZSAodm9pZCk7CiAKIC8qCiAgKiBtYWNyb3MKICAqLwogI2RlZmluZSBHRVRTWVNJRChBLEwpIChBLT5hcmVhX2FkZHIgKyAoQS0+YWRkcl9sZW4gLSAoTCArIDEpKSkKIAotCiAvKiBzdGF0aWNseSBhc3NpZ25lZCB2YXJzIGZvciBwcmludGluZyBwdXJwb3NlcyAqLwotc3RydWN0IGluX2FkZHIgICAgICAgICAgICAgIG5ld19wcmVmaXg7IAorc3RydWN0IGluX2FkZHIgbmV3X3ByZWZpeDsKIC8qIGxlbiBvZiB4eHh4Lnh4eHgueHh4eCArIHBsYWNlIGZvciAjMCB0ZXJtaW5hdGlvbiAqLwotY2hhciAgICAgICAgICAgICAgICAgICAgICAgICBzeXNpZFsxNV07IAorY2hhciBzeXNpZFsxNV07CiAvKiBsZW4gb2YgeHh4eC54eHh4Lnh4eHggKyBwbGFjZSBmb3IgIzAgdGVybWluYXRpb24gKi8KLWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgIHNucGFbMTVdOyAKK2NoYXIgc25wYVsxNV07CiAvKiBsZW4gb2YgeHgueHh4eC54eHh4Lnh4eHgueHh4eC54eHh4Lnh4eHgueHh4eC54eHh4Lnh4eHgueHggKi8KLWNoYXIgICAgICAgICAgICAgICAgICAgICAgICBpc29uZXRbNTFdOyAKK2NoYXIgaXNvbmV0WzUxXTsKIC8qICsgcGxhY2UgZm9yICMwIHRlcm1pbmF0aW9uICovCiAvKiBsZW4gb2YgeHh4eC54eHh4Lnh4eHgueHgueHggKyBwbGFjZSBmb3IgIzAgdGVybWluYXRpb24gKi8KLWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgbHNwaWRbMjFdOyAKK2NoYXIgbHNwaWRbMjFdOwogLyogbGVuIG9mIHh4WXh4TXhXeGR4eGh4eG14eHMgKyBwbGFjZSBmb3IgIzAgdGVybWluYXRpb24gKi8KLWNoYXIgICAgICAgICAgICAgICAgICAgIGRhdGVzdHJpbmdbMjBdOyAKLWNoYXIgICAgICAgICAgICAgICAgICAgbmxwaWRzdHJpbmdbMzBdOworY2hhciBkYXRlc3RyaW5nWzIwXTsKK2NoYXIgbmxwaWRzdHJpbmdbMzBdOwogCiAvKiB1c2VkIGZvciBjYWxjdWxhdGluZyBuaWNlIHN0cmluZyByZXByZXNlbnRhdGlvbiBpbnN0ZWFkIG9mIHBsYWluIHNlY29uZHMgKi8KIApAQCAtODYsMTEgKzg0LDExIEBACiAjZGVmaW5lIFNFQ1NfUEVSX01PTlRIICAyNjI4MDAwCiAjZGVmaW5lIFNFQ1NfUEVSX1lFQVIgICAzMTUzNjAwMAogCi1lbnVtIHsgICAgIAorZW51bQorewogICBJU0lTX1VJX0xFVkVMX0JSSUVGLAogICBJU0lTX1VJX0xFVkVMX0RFVEFJTCwKICAgSVNJU19VSV9MRVZFTF9FWFRFTlNJVkUsCiB9OwogCi0KLSNlbmRpZiAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaXNpc2QvaXNpc19uZXR3b3JrLmMgYi9pc2lzZC9pc2lzX25ldHdvcmsuYwppbmRleCA0ZjlhZjYxLi4wODA4NjNiIDEwMDY0NAotLS0gYS9pc2lzZC9pc2lzX25ldHdvcmsuYworKysgYi9pc2lzZC9pc2lzX25ldHdvcmsuYwpAQCAtMjUsMTggKzI1LDE2IEBACiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDx6ZWJyYS5oPgogI2lmZGVmIEdOVV9MSU5VWAotI2luY2x1ZGUgPG5ldC9ldGhlcm5ldC5oPiAgICAgLyogdGhlIEwyIHByb3RvY29scyAqLworI2luY2x1ZGUgPG5ldC9ldGhlcm5ldC5oPgkvKiB0aGUgTDIgcHJvdG9jb2xzICovCiAjZWxzZQogI2luY2x1ZGUgPG5ldC9pZi5oPgogI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KICNlbmRpZgogCi0KICNpbmNsdWRlICJsb2cuaCIKICNpbmNsdWRlICJzdHJlYW0uaCIKICNpbmNsdWRlICJpZi5oIgogCi0KICNpbmNsdWRlICJpc2lzZC9kaWN0LmgiCiAjaW5jbHVkZSAiaXNpc2QvaW5jbHVkZS1uZXRic2QvaXNvLmgiCiAjaW5jbHVkZSAiaXNpc2QvaXNpc19jb25zdGFudHMuaCIKQEAgLTU5LDE5ICs1NywxOSBAQAogICovCiAjaWZkZWYgR05VX0xJTlVYCiAjaW5jbHVkZSA8bmV0cGFja2V0L3BhY2tldC5oPgotI2Vsc2UgCisjZWxzZQogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAjaW5jbHVkZSA8bmV0L2JwZi5oPgogc3RydWN0IGJwZl9pbnNuIGxsY2ZpbHRlcltdID0gewotICBCUEZfU1RNVChCUEZfTEQrQlBGX0IrQlBGX0FCUywgRVRIRVJfSERSX0xFTiksICAgLyogY2hlY2sgZmlyc3QgYnl0ZSAqLwotICBCUEZfSlVNUChCUEZfSk1QK0JQRl9KRVErQlBGX0ssIElTT19TQVAsIDAsIDUpLCAKLSAgQlBGX1NUTVQoQlBGX0xEK0JQRl9CK0JQRl9BQlMsIEVUSEVSX0hEUl9MRU4rMSksCi0gIEJQRl9KVU1QKEJQRl9KTVArQlBGX0pFUStCUEZfSywgSVNPX1NBUCwgMCwgMyksICAgIC8qIGNoZWNrIHNlY29uZCBieXRlICovCi0gIEJQRl9TVE1UKEJQRl9MRCtCUEZfQitCUEZfQUJTLCBFVEhFUl9IRFJfTEVOKzIpLAotICBCUEZfSlVNUChCUEZfSk1QK0JQRl9KRVErQlBGX0ssIDB4MDMsIDAsIDEpLCAgICAgICAvKiBjaGVjayB0aGlyZCBieXRlICovCi0gIEJQRl9TVE1UKEJQRl9SRVQrQlBGX0ssICh1X2ludCktMSksCi0gIEJQRl9TVE1UKEJQRl9SRVQrQlBGX0ssIDApCisgIEJQRl9TVE1UIChCUEZfTEQgKyBCUEZfQiArIEJQRl9BQlMsIEVUSEVSX0hEUl9MRU4pLAkvKiBjaGVjayBmaXJzdCBieXRlICovCisgIEJQRl9KVU1QIChCUEZfSk1QICsgQlBGX0pFUSArIEJQRl9LLCBJU09fU0FQLCAwLCA1KSwKKyAgQlBGX1NUTVQgKEJQRl9MRCArIEJQRl9CICsgQlBGX0FCUywgRVRIRVJfSERSX0xFTiArIDEpLAorICBCUEZfSlVNUCAoQlBGX0pNUCArIEJQRl9KRVEgKyBCUEZfSywgSVNPX1NBUCwgMCwgMyksCS8qIGNoZWNrIHNlY29uZCBieXRlICovCisgIEJQRl9TVE1UIChCUEZfTEQgKyBCUEZfQiArIEJQRl9BQlMsIEVUSEVSX0hEUl9MRU4gKyAyKSwKKyAgQlBGX0pVTVAgKEJQRl9KTVAgKyBCUEZfSkVRICsgQlBGX0ssIDB4MDMsIDAsIDEpLAkvKiBjaGVjayB0aGlyZCBieXRlICovCisgIEJQRl9TVE1UIChCUEZfUkVUICsgQlBGX0ssICh1X2ludCkgLSAxKSwKKyAgQlBGX1NUTVQgKEJQRl9SRVQgKyBCUEZfSywgMCkKIH07CiBpbnQgcmVhZGJsZW4gPSAwOwogdV9jaGFyICpyZWFkYnVmZiA9IE5VTEw7CkBAIC04MiwxMCArODAsMTAgQEAKICAqIElTTyAxMDU4OSAtIDguNC44CiAgKi8KIAotdV9jaGFyIEFMTF9MMV9JU1NbNl0gPSB7MHgwMSwgMHg4MCwgMHhDMiwgMHgwMCwgMHgwMCwgMHgxNH07Ci11X2NoYXIgQUxMX0wyX0lTU1s2XSA9IHsweDAxLCAweDgwLCAweEMyLCAweDAwLCAweDAwLCAweDE1fTsKLXVfY2hhciBBTExfSVNTWzZdICAgID0gezB4MDksIDB4MDAsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDV9OwotdV9jaGFyIEFMTF9FU1NbNl0gICAgPSB7MHgwOSwgMHgwMCwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwNH07Cit1X2NoYXIgQUxMX0wxX0lTU1s2XSA9IHsgMHgwMSwgMHg4MCwgMHhDMiwgMHgwMCwgMHgwMCwgMHgxNCB9OwordV9jaGFyIEFMTF9MMl9JU1NbNl0gPSB7IDB4MDEsIDB4ODAsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MTUgfTsKK3VfY2hhciBBTExfSVNTWzZdID0geyAweDA5LCAweDAwLCAweDJCLCAweDAwLCAweDAwLCAweDA1IH07Cit1X2NoYXIgQUxMX0VTU1s2XSA9IHsgMHgwOSwgMHgwMCwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwNCB9OwogCiAjaWZkZWYgR05VX0xJTlVYCiBzdGF0aWMgY2hhciBkaXNjYXJkX2J1ZmZbODE5Ml07CkBAIC0xMDIsODkgKzEwMCwxMDEgQEAKIHsKICAgc3RydWN0IHBhY2tldF9tcmVxIG1yZXE7CiAKLSAgbWVtc2V0KCZtcmVxLCAwLCBzaXplb2YobXJlcSkpOworICBtZW1zZXQgKCZtcmVxLCAwLCBzaXplb2YgKG1yZXEpKTsKICAgbXJlcS5tcl9pZmluZGV4ID0gaWZfbnVtOwotICBpZiAocmVnaXN0ZXJ0bykgewotICAgIG1yZXEubXJfdHlwZSA9IFBBQ0tFVF9NUl9NVUxUSUNBU1Q7Ci0gICAgbXJlcS5tcl9hbGVuID0gRVRIX0FMRU47Ci0gICAgaWYgKHJlZ2lzdGVydG8gPT0gMSkKLSAgICAgIG1lbWNweSAoJm1yZXEubXJfYWRkcmVzcywgQUxMX0wxX0lTUywgRVRIX0FMRU4pOwotICAgIGVsc2UgaWYgKHJlZ2lzdGVydG8gPT0gMikKLSAgICAgIG1lbWNweSAoJm1yZXEubXJfYWRkcmVzcywgQUxMX0wyX0lTUywgRVRIX0FMRU4pOwotICAgIGVsc2UgaWYgKHJlZ2lzdGVydG8gPT0gMykKLSAgICAgIG1lbWNweSAoJm1yZXEubXJfYWRkcmVzcywgQUxMX0lTUywgRVRIX0FMRU4pOwotICAgIGVsc2UKLSAgICAgIG1lbWNweSAoJm1yZXEubXJfYWRkcmVzcywgQUxMX0VTUywgRVRIX0FMRU4pOworICBpZiAocmVnaXN0ZXJ0bykKKyAgICB7CisgICAgICBtcmVxLm1yX3R5cGUgPSBQQUNLRVRfTVJfTVVMVElDQVNUOworICAgICAgbXJlcS5tcl9hbGVuID0gRVRIX0FMRU47CisgICAgICBpZiAocmVnaXN0ZXJ0byA9PSAxKQorCW1lbWNweSAoJm1yZXEubXJfYWRkcmVzcywgQUxMX0wxX0lTUywgRVRIX0FMRU4pOworICAgICAgZWxzZSBpZiAocmVnaXN0ZXJ0byA9PSAyKQorCW1lbWNweSAoJm1yZXEubXJfYWRkcmVzcywgQUxMX0wyX0lTUywgRVRIX0FMRU4pOworICAgICAgZWxzZSBpZiAocmVnaXN0ZXJ0byA9PSAzKQorCW1lbWNweSAoJm1yZXEubXJfYWRkcmVzcywgQUxMX0lTUywgRVRIX0FMRU4pOworICAgICAgZWxzZQorCW1lbWNweSAoJm1yZXEubXJfYWRkcmVzcywgQUxMX0VTUywgRVRIX0FMRU4pOwogCi0gIH0gZWxzZSB7Ci0gICAgbXJlcS5tcl90eXBlID0gUEFDS0VUX01SX0FMTE1VTFRJOwotICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXJlcS5tcl90eXBlID0gUEFDS0VUX01SX0FMTE1VTFRJOworICAgIH0KICNpZmRlZiBFWFRSRU1FX0RFQlVHCiAgIHpsb2dfaW5mbyAoImlzaXNfbXVsdGljYXN0X2pvaW4oKTogZmQ9JWQsIHJlZ190bz0lZCwgaWZfbnVtPSVkLCAiCi0gICAgICAgICAgICAgImFkZHJlc3MgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCi0gICAgICAgICAgICAgZmQsIHJlZ2lzdGVydG8sIGlmX251bSwgbXJlcS5tcl9hZGRyZXNzWzBdLCBtcmVxLm1yX2FkZHJlc3NbMV0sCi0gICAgICAgICAgICAgbXJlcS5tcl9hZGRyZXNzWzJdLCBtcmVxLm1yX2FkZHJlc3NbM10sbXJlcS5tcl9hZGRyZXNzWzRdLAotICAgICAgICAgICAgIG1yZXEubXJfYWRkcmVzc1s1XSk7CisJICAgICAiYWRkcmVzcyA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKwkgICAgIGZkLCByZWdpc3RlcnRvLCBpZl9udW0sIG1yZXEubXJfYWRkcmVzc1swXSwgbXJlcS5tcl9hZGRyZXNzWzFdLAorCSAgICAgbXJlcS5tcl9hZGRyZXNzWzJdLCBtcmVxLm1yX2FkZHJlc3NbM10sIG1yZXEubXJfYWRkcmVzc1s0XSwKKwkgICAgIG1yZXEubXJfYWRkcmVzc1s1XSk7CiAjZW5kaWYgLyogRVhUUkVNRV9ERUJVRyAqLwotICBpZiAoc2V0c29ja29wdCAoZmQsIFNPTF9QQUNLRVQsIFBBQ0tFVF9BRERfTUVNQkVSU0hJUCwgJm1yZXEsIAotICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcGFja2V0X21yZXEpKSkgewotICAgIHpsb2dfd2FybiAoImlzaXNfbXVsdGljYXN0X2pvaW4oKTogc2V0c29ja29wdCgpOiAlcyIsIHN0cmVycm9yIChlcnJubykpOwotICAgIHJldHVybiBJU0lTX1dBUk5JTkc7Ci0gIH0KLSAgCisgIGlmIChzZXRzb2Nrb3B0IChmZCwgU09MX1BBQ0tFVCwgUEFDS0VUX0FERF9NRU1CRVJTSElQLCAmbXJlcSwKKwkJICBzaXplb2YgKHN0cnVjdCBwYWNrZXRfbXJlcSkpKQorICAgIHsKKyAgICAgIHpsb2dfd2FybiAoImlzaXNfbXVsdGljYXN0X2pvaW4oKTogc2V0c29ja29wdCgpOiAlcyIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIElTSVNfV0FSTklORzsKKyAgICB9CisKICAgcmV0dXJuIElTSVNfT0s7CiB9CiAKLWludCAKK2ludAogb3Blbl9wYWNrZXRfc29ja2V0IChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0KQogewogICBzdHJ1Y3Qgc29ja2FkZHJfbGwgc19hZGRyOwogICBpbnQgZmQsIHJldHZhbCA9IElTSVNfT0s7Ci0gIAorCiAgIGZkID0gc29ja2V0IChQRl9QQUNLRVQsIFNPQ0tfREdSQU0sIGh0b25zIChFVEhfUF9BTEwpKTsKLSAgaWYgKGZkIDwgMCkgewotICAgIHpsb2dfd2FybiAoIm9wZW5fcGFja2V0X3NvY2tldCgpOiBzb2NrZXQoKSBmYWlsZWQgJXMiLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICByZXR1cm4gSVNJU19XQVJOSU5HOwotICB9CisgIGlmIChmZCA8IDApCisgICAgeworICAgICAgemxvZ193YXJuICgib3Blbl9wYWNrZXRfc29ja2V0KCk6IHNvY2tldCgpIGZhaWxlZCAlcyIsCisJCSBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBJU0lTX1dBUk5JTkc7CisgICAgfQogCiAgIC8qCiAgICAqIEJpbmQgdG8gdGhlIHBoeXNpY2FsIGludGVyZmFjZQogICAgKi8KLSAgbWVtc2V0KCZzX2FkZHIsIDAsIHNpemVvZiAoc3RydWN0IHNvY2thZGRyX2xsKSk7CisgIG1lbXNldCAoJnNfYWRkciwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfbGwpKTsKICAgc19hZGRyLnNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7CiAgIHNfYWRkci5zbGxfcHJvdG9jb2wgPSBodG9ucyAoRVRIX1BfQUxMKTsKICAgc19hZGRyLnNsbF9pZmluZGV4ID0gY2lyY3VpdC0+aW50ZXJmYWNlLT5pZmluZGV4OwotICAKLSAgaWYgKGJpbmQgKGZkLCAoc3RydWN0IHNvY2thZGRyKikgKCZzX2FkZHIpLCAKLSAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbGwpKSA8IDApIHsKLSAgICB6bG9nX3dhcm4gKCJvcGVuX3BhY2tldF9zb2NrZXQoKTogYmluZCgpIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBJU0lTX1dBUk5JTkc7Ci0gIH0KLSAgCisKKyAgaWYgKGJpbmQgKGZkLCAoc3RydWN0IHNvY2thZGRyICopICgmc19hZGRyKSwKKwkgICAgc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfbGwpKSA8IDApCisgICAgeworICAgICAgemxvZ193YXJuICgib3Blbl9wYWNrZXRfc29ja2V0KCk6IGJpbmQoKSBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gSVNJU19XQVJOSU5HOworICAgIH0KKwogICBjaXJjdWl0LT5mZCA9IGZkOwogCi0gIGlmIChjaXJjdWl0LT5jaXJjX3R5cGUgPT0gQ0lSQ1VJVF9UX0JST0FEQ0FTVCkgewotICAgIC8qCi0gICAgICogSm9pbiB0byBtdWx0aWNhc3QgZ3JvdXBzCi0gICAgICogYWNjb3JkaW5nIHRvCi0gICAgICogOC40LjIgLSBCcm9hZGNhc3Qgc3VibmV0d29yayBJSUggUERVcwotICAgICAqIEZJWE1FOiBpcyB0aGVyZSBhIGNhc2Ugb25seSBvbmUgd2lsbCBmYWlsPz8KLSAgICAgKi8KLSAgICBpZiAoY2lyY3VpdC0+Y2lyY3VpdF9pc190eXBlICYgSVNfTEVWRUxfMSkgewotICAgICAgLyogam9pbmluZyBBTExfTDFfSVNTICovCi0gICAgICByZXR2YWwgPSBpc2lzX211bHRpY2FzdF9qb2luIChjaXJjdWl0LT5mZCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpcmN1aXQtPmludGVyZmFjZS0+aWZpbmRleCk7Ci0gICAgICAvKiBqb2luaW5nIEFMTF9JU1MgKi8KLSAgICAgIHJldHZhbCA9IGlzaXNfbXVsdGljYXN0X2pvaW4gKGNpcmN1aXQtPmZkLCAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lyY3VpdC0+aW50ZXJmYWNlLT5pZmluZGV4KTsKKyAgaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSA9PSBDSVJDVUlUX1RfQlJPQURDQVNUKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBKb2luIHRvIG11bHRpY2FzdCBncm91cHMKKyAgICAgICAqIGFjY29yZGluZyB0bworICAgICAgICogOC40LjIgLSBCcm9hZGNhc3Qgc3VibmV0d29yayBJSUggUERVcworICAgICAgICogRklYTUU6IGlzIHRoZXJlIGEgY2FzZSBvbmx5IG9uZSB3aWxsIGZhaWw/PworICAgICAgICovCisgICAgICBpZiAoY2lyY3VpdC0+Y2lyY3VpdF9pc190eXBlICYgSVNfTEVWRUxfMSkKKwl7CisJICAvKiBqb2luaW5nIEFMTF9MMV9JU1MgKi8KKwkgIHJldHZhbCA9IGlzaXNfbXVsdGljYXN0X2pvaW4gKGNpcmN1aXQtPmZkLCAxLAorCQkJCQljaXJjdWl0LT5pbnRlcmZhY2UtPmlmaW5kZXgpOworCSAgLyogam9pbmluZyBBTExfSVNTICovCisJICByZXR2YWwgPSBpc2lzX211bHRpY2FzdF9qb2luIChjaXJjdWl0LT5mZCwgMywKKwkJCQkJY2lyY3VpdC0+aW50ZXJmYWNlLT5pZmluZGV4KTsKKwl9CisgICAgICBpZiAoY2lyY3VpdC0+Y2lyY3VpdF9pc190eXBlICYgSVNfTEVWRUxfMikKKwkvKiBqb2luaW5nIEFMTF9MMl9JU1MgKi8KKwlyZXR2YWwgPSBpc2lzX211bHRpY2FzdF9qb2luIChjaXJjdWl0LT5mZCwgMiwKKwkJCQkgICAgICBjaXJjdWl0LT5pbnRlcmZhY2UtPmlmaW5kZXgpOwogICAgIH0KLSAgICBpZiAoY2lyY3VpdC0+Y2lyY3VpdF9pc190eXBlICYgSVNfTEVWRUxfMikKLSAgICAgIC8qIGpvaW5pbmcgQUxMX0wyX0lTUyAqLwotICAgICAgcmV0dmFsID0gaXNpc19tdWx0aWNhc3Rfam9pbiAoY2lyY3VpdC0+ZmQsIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXJjdWl0LT5pbnRlcmZhY2UtPmlmaW5kZXgpOwotICB9IGVsc2UgewotICAgIHJldHZhbCA9IGlzaXNfbXVsdGljYXN0X2pvaW4gKGNpcmN1aXQtPmZkLCAwLCBjaXJjdWl0LT5pbnRlcmZhY2UtPmlmaW5kZXgpOwotICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR2YWwgPQorCWlzaXNfbXVsdGljYXN0X2pvaW4gKGNpcmN1aXQtPmZkLCAwLCBjaXJjdWl0LT5pbnRlcmZhY2UtPmlmaW5kZXgpOworICAgIH0KIAogICByZXR1cm4gcmV0dmFsOwogfQpAQCAtMjAxLDEwMSArMjExLDExMCBAQAogICBpbnQgdHJ1ZSA9IDEsIGZhbHNlID0gMDsKICAgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKICAgc3RydWN0IGJwZl9wcm9ncmFtIGJwZl9wcm9nOwotICAKLSAgZG8gewotICAgICh2b2lkKXNucHJpbnRmKGJwZmRldiwgc2l6ZW9mKGJwZmRldiksICIvZGV2L2JwZiVkIiwgaSsrKTsKLSAgICAgIGZkID0gb3BlbihicGZkZXYsIE9fUkRXUik7Ci0gIH0gd2hpbGUgKGZkIDwgMCAmJiBlcnJubyA9PSBFQlVTWSk7Ci0gIAotICBpZiAoZmQgPCAwKSB7Ci0gICAgemxvZ193YXJuICgib3Blbl9icGZfZGV2KCk6IGZhaWxlZCB0byBjcmVhdGUgYnBmIHNvY2tldDogJXMiLAotICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgcmV0dXJuIElTSVNfV0FSTklORzsKLSAgfQotICAKKworICBkbworICAgIHsKKyAgICAgICh2b2lkKSBzbnByaW50ZiAoYnBmZGV2LCBzaXplb2YgKGJwZmRldiksICIvZGV2L2JwZiVkIiwgaSsrKTsKKyAgICAgIGZkID0gb3BlbiAoYnBmZGV2LCBPX1JEV1IpOworICAgIH0KKyAgd2hpbGUgKGZkIDwgMCAmJiBlcnJubyA9PSBFQlVTWSk7CisKKyAgaWYgKGZkIDwgMCkKKyAgICB7CisgICAgICB6bG9nX3dhcm4gKCJvcGVuX2JwZl9kZXYoKTogZmFpbGVkIHRvIGNyZWF0ZSBicGYgc29ja2V0OiAlcyIsCisJCSBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBJU0lTX1dBUk5JTkc7CisgICAgfQorCiAgIHpsb2dfaW5mbyAoIk9wZW5lZCBCUEYgZGV2aWNlICVzIiwgYnBmZGV2KTsKIAotICBtZW1jcHkgKGlmci5pZnJfbmFtZSwgY2lyY3VpdC0+aW50ZXJmYWNlLT5uYW1lLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7Ci0gIGlmIChpb2N0bCAoZmQsIEJJT0NTRVRJRiwgKGNhZGRyX3QpJmlmcikgPCAwICkgewotICAgIHpsb2dfd2FybiAoIm9wZW5fYnBmX2RldigpOiBmYWlsZWQgdG8gYmluZCB0byBpbnRlcmZhY2U6ICVzIiwgCi0gICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKLSAgICByZXR1cm4gSVNJU19XQVJOSU5HOwotICB9CisgIG1lbWNweSAoaWZyLmlmcl9uYW1lLCBjaXJjdWl0LT5pbnRlcmZhY2UtPm5hbWUsIHNpemVvZiAoaWZyLmlmcl9uYW1lKSk7CisgIGlmIChpb2N0bCAoZmQsIEJJT0NTRVRJRiwgKGNhZGRyX3QpICYgaWZyKSA8IDApCisgICAgeworICAgICAgemxvZ193YXJuICgib3Blbl9icGZfZGV2KCk6IGZhaWxlZCB0byBiaW5kIHRvIGludGVyZmFjZTogJXMiLAorCQkgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gSVNJU19XQVJOSU5HOworICAgIH0KIAorICBpZiAoaW9jdGwgKGZkLCBCSU9DR0JMRU4sIChjYWRkcl90KSAmIGJsZW4pIDwgMCkKKyAgICB7CisgICAgICB6bG9nX3dhcm4gKCJmYWlsZWQgdG8gZ2V0IEJQRiBidWZmZXIgbGVuIik7CisgICAgICBibGVuID0gY2lyY3VpdC0+aW50ZXJmYWNlLT5tdHU7CisgICAgfQogCi0gIGlmIChpb2N0bCAoZmQsIEJJT0NHQkxFTiwgKGNhZGRyX3QpJmJsZW4pIDwgMCkgewotICAgIHpsb2dfd2FybiAoImZhaWxlZCB0byBnZXQgQlBGIGJ1ZmZlciBsZW4iKTsKLSAgICBibGVuID0gY2lyY3VpdC0+aW50ZXJmYWNlLT5tdHU7Ci0gIH0KLSAgCiAgIHJlYWRibGVuID0gYmxlbjsKIAogICBpZiAocmVhZGJ1ZmYgPT0gTlVMTCkKICAgICByZWFkYnVmZiA9IG1hbGxvYyAoYmxlbik7Ci0gIAorCiAgIHpsb2dfaW5mbyAoIkJQRiBidWZmZXIgbGVuID0gJXUiLCBibGVuKTsKIAogICAvKiAgQlBGKDQpOiByZWFkcyByZXR1cm4gaW1tZWRpYXRlbHkgdXBvbiBwYWNrZXQgcmVjZXB0aW9uLgogICAgKiAgT3RoZXJ3aXNlLCBhIHJlYWQgd2lsbCBibG9jayB1bnRpbCBlaXRoZXIgdGhlIGtlcm5lbAogICAgKiAgYnVmZmVyIGJlY29tZXMgZnVsbCBvciBhIHRpbWVvdXQgb2NjdXJzLiAKICAgICovCi0gIGlmIChpb2N0bCAoZmQsIEJJT0NJTU1FRElBVEUsIChjYWRkcl90KSZ0cnVlKSA8IDApIHsKLSAgICB6bG9nX3dhcm4gKCJmYWlsZWQgdG8gc2V0IEJQRiBkZXYgdG8gaW1tZWRpYXRlIG1vZGUiKTsKLSAgfQorICBpZiAoaW9jdGwgKGZkLCBCSU9DSU1NRURJQVRFLCAoY2FkZHJfdCkgJiB0cnVlKSA8IDApCisgICAgeworICAgICAgemxvZ193YXJuICgiZmFpbGVkIHRvIHNldCBCUEYgZGV2IHRvIGltbWVkaWF0ZSBtb2RlIik7CisgICAgfQogCiAjaWZkZWYgQklPQ1NTRUVTRU5UCiAgIC8qCiAgICAqIFdlIHdhbnQgdG8gc2VlIG9ubHkgaW5jb21pbmcgcGFja2V0cwogICAgKi8KLSAgaWYgKGlvY3RsIChmZCwgQklPQ1NTRUVTRU5ULCAoY2FkZHJfdCkmZmFsc2UpIDwgMCkgewotICAgIHpsb2dfd2FybiAoImZhaWxlZCB0byBzZXQgQlBGIGRldiB0byBpbmNvbWluZyBvbmx5IG1vZGUiKTsKLSAgfQorICBpZiAoaW9jdGwgKGZkLCBCSU9DU1NFRVNFTlQsIChjYWRkcl90KSAmIGZhbHNlKSA8IDApCisgICAgeworICAgICAgemxvZ193YXJuICgiZmFpbGVkIHRvIHNldCBCUEYgZGV2IHRvIGluY29taW5nIG9ubHkgbW9kZSIpOworICAgIH0KICNlbmRpZgogCiAgIC8qCiAgICAqIC4uLmJ1dCBhbGwgb2YgdGhlbQogICAgKi8KLSAgaWYgKGlvY3RsIChmZCwgQklPQ1BST01JU0MsIChjYWRkcl90KSZ0cnVlKSA8IDApIHsKLSAgICB6bG9nX3dhcm4gKCJmYWlsZWQgdG8gc2V0IEJQRiBkZXYgdG8gcHJvbWlzY3VvdXMgbW9kZSIpOwotICB9Ci0KKyAgaWYgKGlvY3RsIChmZCwgQklPQ1BST01JU0MsIChjYWRkcl90KSAmIHRydWUpIDwgMCkKKyAgICB7CisgICAgICB6bG9nX3dhcm4gKCJmYWlsZWQgdG8gc2V0IEJQRiBkZXYgdG8gcHJvbWlzY3VvdXMgbW9kZSIpOworICAgIH0KIAogICAvKgogICAgKiBJZiB0aGUgYnVmZmVyIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gb3VyIG10dSwgbGV0cyB0cnkgdG8gaW5jcmVhc2UgaXQKICAgICovCi0gIGlmIChibGVuIDwgY2lyY3VpdC0+aW50ZXJmYWNlLT5tdHUpIHsKLSAgICBpZiAoaW9jdGwgKGZkLCBCSU9DU0JMRU4sICZjaXJjdWl0LT5pbnRlcmZhY2UtPm10dSkgPCAwKSB7Ci0gICAgICB6bG9nX3dhcm4gKCJmYWlsZWQgdG8gc2V0IEJQRiBidWZmZXIgbGVuICgldSB0byAldSkiLCBibGVuLAotICAgICAgICAgICAgICAgICBjaXJjdWl0LT5pbnRlcmZhY2UtPm10dSk7CisgIGlmIChibGVuIDwgY2lyY3VpdC0+aW50ZXJmYWNlLT5tdHUpCisgICAgeworICAgICAgaWYgKGlvY3RsIChmZCwgQklPQ1NCTEVOLCAmY2lyY3VpdC0+aW50ZXJmYWNlLT5tdHUpIDwgMCkKKwl7CisJICB6bG9nX3dhcm4gKCJmYWlsZWQgdG8gc2V0IEJQRiBidWZmZXIgbGVuICgldSB0byAldSkiLCBibGVuLAorCQkgICAgIGNpcmN1aXQtPmludGVyZmFjZS0+bXR1KTsKKwl9CiAgICAgfQotICB9CiAKICAgLyoKICAgICogU2V0IGEgdGltZW91dCBwYXJhbWV0ZXIgLSBob3BlIHRoaXMgaGVscHMgc2VsZWN0KCkKICAgICovCiAgIHRpbWVvdXQudHZfc2VjID0gNjAwOwogICB0aW1lb3V0LnR2X3VzZWMgPSAwOwotICBpZiAoaW9jdGwgKGZkLCBCSU9DU1JUSU1FT1VULCAoY2FkZHJfdCkmdGltZW91dCkgPCAwKSB7Ci0gICAgemxvZ193YXJuICgiZmFpbGVkIHRvIHNldCBCUEYgZGV2aWNlIHRpbWVvdXQiKTsKLSAgfQotICAKKyAgaWYgKGlvY3RsIChmZCwgQklPQ1NSVElNRU9VVCwgKGNhZGRyX3QpICYgdGltZW91dCkgPCAwKQorICAgIHsKKyAgICAgIHpsb2dfd2FybiAoImZhaWxlZCB0byBzZXQgQlBGIGRldmljZSB0aW1lb3V0Iik7CisgICAgfQorCiAgIC8qCiAgICAqIEFuZCBzZXQgdGhlIGZpbHRlcgogICAgKi8KICAgbWVtc2V0ICgmYnBmX3Byb2csIDAsIHNpemVvZiAoc3RydWN0IGJwZl9wcm9ncmFtKSk7CiAgIGJwZl9wcm9nLmJmX2xlbiA9IDg7CiAgIGJwZl9wcm9nLmJmX2luc25zID0gJihsbGNmaWx0ZXJbMF0pOwotICBpZiAoaW9jdGwgKGZkLCBCSU9DU0VURiwgKGNhZGRyX3QpJmJwZl9wcm9nKSA8IDApIHsKLSAgICB6bG9nX3dhcm4gKCJvcGVuX2JwZl9kZXYoKTogZmFpbGVkIHRvIGluc3RhbGwgZmlsdGVyOiAlcyIsIAotICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgcmV0dXJuIElTSVNfV0FSTklORzsKLSAgfQotCisgIGlmIChpb2N0bCAoZmQsIEJJT0NTRVRGLCAoY2FkZHJfdCkgJiBicGZfcHJvZykgPCAwKQorICAgIHsKKyAgICAgIHpsb2dfd2FybiAoIm9wZW5fYnBmX2RldigpOiBmYWlsZWQgdG8gaW5zdGFsbCBmaWx0ZXI6ICVzIiwKKwkJIHN0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIElTSVNfV0FSTklORzsKKyAgICB9CiAKICAgYXNzZXJ0IChmZCA+IDApOwogCiAgIGNpcmN1aXQtPmZkID0gZmQ7Ci0gIAorCiAgIHJldHVybiBJU0lTX09LOwogfQogCkBAIC0zMDksOSArMzI4LDggQEAKIHsKICAgaW50IHJldHZhbCA9IElTSVNfT0s7CiAKLSAgaWYgKCBpc2lzZF9wcml2cy5jaGFuZ2UgKFpQUklWU19SQUlTRSkgKQotICAgIHpsb2dfZXJyICgiJXM6IGNvdWxkIG5vdCByYWlzZSBwcml2cywgJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykgKTsKKyAgaWYgKGlzaXNkX3ByaXZzLmNoYW5nZSAoWlBSSVZTX1JBSVNFKSkKKyAgICB6bG9nX2VyciAoIiVzOiBjb3VsZCBub3QgcmFpc2UgcHJpdnMsICVzIiwgX19mdW5jX18sIHN0cmVycm9yIChlcnJubykpOwogCiAjaWZkZWYgR05VX0xJTlVYCiAgIHJldHZhbCA9IG9wZW5fcGFja2V0X3NvY2tldCAoY2lyY3VpdCk7CkBAIC0zMTksNDYgKzMzNyw0OCBAQAogICByZXR2YWwgPSBvcGVuX2JwZl9kZXYgKGNpcmN1aXQpOwogI2VuZGlmCiAKLSAgaWYgKHJldHZhbCAhPSBJU0lTX09LKSB7Ci0gICAgemxvZ193YXJuKCIlczogY291bGQgbm90IGluaXRpYWxpemUgdGhlIHNvY2tldCIsCi0gICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotIAotICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QpIHsKLSAgICBjaXJjdWl0LT50eCA9IGlzaXNfc2VuZF9wZHVfYmNhc3Q7Ci0gICAgY2lyY3VpdC0+cnggPSBpc2lzX3JlY3ZfcGR1X2JjYXN0OwotICB9IGVsc2UgaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSA9PSBDSVJDVUlUX1RfUDJQKSB7Ci0gICAgY2lyY3VpdC0+dHggPSBpc2lzX3NlbmRfcGR1X3AycDsKLSAgICBjaXJjdWl0LT5yeCA9IGlzaXNfcmVjdl9wZHVfcDJwOwotICB9IGVsc2UgewotICAgIHpsb2dfd2FybiAoImlzaXNfc29ja19pbml0KCk6IHVua25vd24gY2lyY3VpdCB0eXBlIik7Ci0gICAgcmV0dmFsID0gSVNJU19XQVJOSU5HOwotICAgIGdvdG8gZW5kOwotICB9Ci0gCisgIGlmIChyZXR2YWwgIT0gSVNJU19PSykKKyAgICB7CisgICAgICB6bG9nX3dhcm4gKCIlczogY291bGQgbm90IGluaXRpYWxpemUgdGhlIHNvY2tldCIsIF9fZnVuY19fKTsKKyAgICAgIGdvdG8gZW5kOworICAgIH0KKworICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QpCisgICAgeworICAgICAgY2lyY3VpdC0+dHggPSBpc2lzX3NlbmRfcGR1X2JjYXN0OworICAgICAgY2lyY3VpdC0+cnggPSBpc2lzX3JlY3ZfcGR1X2JjYXN0OworICAgIH0KKyAgZWxzZSBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9QMlApCisgICAgeworICAgICAgY2lyY3VpdC0+dHggPSBpc2lzX3NlbmRfcGR1X3AycDsKKyAgICAgIGNpcmN1aXQtPnJ4ID0gaXNpc19yZWN2X3BkdV9wMnA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgemxvZ193YXJuICgiaXNpc19zb2NrX2luaXQoKTogdW5rbm93biBjaXJjdWl0IHR5cGUiKTsKKyAgICAgIHJldHZhbCA9IElTSVNfV0FSTklORzsKKyAgICAgIGdvdG8gZW5kOworICAgIH0KKwogZW5kOgotICBpZiAoIGlzaXNkX3ByaXZzLmNoYW5nZSAoWlBSSVZTX0xPV0VSKSApCi0gICAgemxvZ19lcnIgKCIlczogY291bGQgbm90IGxvd2VyIHByaXZzLCAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSApOworICBpZiAoaXNpc2RfcHJpdnMuY2hhbmdlIChaUFJJVlNfTE9XRVIpKQorICAgIHpsb2dfZXJyICgiJXM6IGNvdWxkIG5vdCBsb3dlciBwcml2cywgJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IgKGVycm5vKSk7CiAKICAgcmV0dXJuIHJldHZhbDsKIH0KIAotCi1zdGF0aWMgaW5saW5lIGludCAKLWxsY19jaGVjayAodV9jaGFyICpsbGMpCitzdGF0aWMgaW5saW5lIGludAorbGxjX2NoZWNrICh1X2NoYXIgKiBsbGMpCiB7Ci0KLSAgaWYoKmxsYyAhPSBJU09fU0FQIHx8ICoobGxjICsgMSkgIT0gSVNPX1NBUCB8fCAqKGxsYyArMikgIT0gMykKKyAgaWYgKCpsbGMgIT0gSVNPX1NBUCB8fCAqKGxsYyArIDEpICE9IElTT19TQVAgfHwgKihsbGMgKyAyKSAhPSAzKQogICAgIHJldHVybiAwOwotICAKKwogICByZXR1cm4gMTsKIH0KIAogI2lmZGVmIEdOVV9MSU5VWAogaW50Ci1pc2lzX3JlY3ZfcGR1X2JjYXN0IChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LCB1X2NoYXIgKnNzbnBhKQoraXNpc19yZWN2X3BkdV9iY2FzdCAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgdV9jaGFyICogc3NucGEpCiB7CiAgIGludCBieXRlc3JlYWQsIGFkZHJfbGVuOwogICBzdHJ1Y3Qgc29ja2FkZHJfbGwgc19hZGRyOwpAQCAtMzY4LDUwICszODgsNTEgQEAKIAogICBtZW1zZXQgKCZzX2FkZHIsIDAsIHNpemVvZiAoc3RydWN0IHNvY2thZGRyX2xsKSk7CiAKLSAgYnl0ZXNyZWFkID0gcmVjdmZyb20gKGNpcmN1aXQtPmZkLCAodm9pZCAqKSZsbGMsCi0gICAgICAgICAgICAgICAgICAgICAgICBMTENfTEVOLCBNU0dfUEVFSywKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmc19hZGRyLCAmYWRkcl9sZW4pOworICBieXRlc3JlYWQgPSByZWN2ZnJvbSAoY2lyY3VpdC0+ZmQsICh2b2lkICopICZsbGMsCisJCQlMTENfTEVOLCBNU0dfUEVFSywKKwkJCShzdHJ1Y3Qgc29ja2FkZHIgKikgJnNfYWRkciwgJmFkZHJfbGVuKTsKIAotICBpZiAoYnl0ZXNyZWFkIDwgMCkgewotICAgIHpsb2dfd2FybiAoImlzaXNfcmVjdl9wYWNrZXRfYmNhc3QoKTogZmQgJWQsIHJlY3Zmcm9tICgpOiAlcyIsIAotICAgICAgICAgICAgICAgY2lyY3VpdC0+ZmQsICBzdHJlcnJvciAoZXJybm8pKTsKLSAgICB6bG9nX3dhcm4gKCJjaXJjdWl0IGlzICVzIiwgY2lyY3VpdC0+aW50ZXJmYWNlLT5uYW1lKTsKLSAgICB6bG9nX3dhcm4gKCJjaXJjdWl0IGZkICVkIiwgY2lyY3VpdC0+ZmQpOwotICAgIHpsb2dfd2FybiAoImJ5dGVzcmVhZCAlZCIsIGJ5dGVzcmVhZCk7Ci0gICAgLyogZ2V0IHJpZCBvZiB0aGUgcGFja2V0ICovCi0gICAgYnl0ZXNyZWFkID0gcmVhZCAoY2lyY3VpdC0+ZmQsIGRpc2NhcmRfYnVmZiwgc2l6ZW9mIChkaXNjYXJkX2J1ZmYpKTsKLSAgICByZXR1cm4gSVNJU19XQVJOSU5HOwotICB9CisgIGlmIChieXRlc3JlYWQgPCAwKQorICAgIHsKKyAgICAgIHpsb2dfd2FybiAoImlzaXNfcmVjdl9wYWNrZXRfYmNhc3QoKTogZmQgJWQsIHJlY3Zmcm9tICgpOiAlcyIsCisJCSBjaXJjdWl0LT5mZCwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICB6bG9nX3dhcm4gKCJjaXJjdWl0IGlzICVzIiwgY2lyY3VpdC0+aW50ZXJmYWNlLT5uYW1lKTsKKyAgICAgIHpsb2dfd2FybiAoImNpcmN1aXQgZmQgJWQiLCBjaXJjdWl0LT5mZCk7CisgICAgICB6bG9nX3dhcm4gKCJieXRlc3JlYWQgJWQiLCBieXRlc3JlYWQpOworICAgICAgLyogZ2V0IHJpZCBvZiB0aGUgcGFja2V0ICovCisgICAgICBieXRlc3JlYWQgPSByZWFkIChjaXJjdWl0LT5mZCwgZGlzY2FyZF9idWZmLCBzaXplb2YgKGRpc2NhcmRfYnVmZikpOworICAgICAgcmV0dXJuIElTSVNfV0FSTklORzsKKyAgICB9CiAgIC8qCiAgICAqIEZpbHRlcmluZyBieSBsbGMgZmllbGQsIGRpc2NhcmQgcGFja2V0cyBzZW50IGJ5IHRoaXMgaG9zdCAob3RoZXIgY2lyY3VpdCkKICAgICovCi0gIGlmICghbGxjX2NoZWNrIChsbGMpIHx8IHNfYWRkci5zbGxfcGt0dHlwZSA9PSBQQUNLRVRfT1VUR09JTkcpIHsKLSAgICAvKiAgUmVhZCB0aGUgcGFja2V0IGludG8gZGlzY2FyZCBidWZmICovCi0gICAgYnl0ZXNyZWFkID0gcmVhZCAoY2lyY3VpdC0+ZmQsIGRpc2NhcmRfYnVmZiwgc2l6ZW9mIChkaXNjYXJkX2J1ZmYpKTsKLSAgICBpZiAoYnl0ZXNyZWFkIDwgMCkKLSAgICAgIHpsb2dfd2FybiAoImlzaXNfcmVjdl9wZHVfYmNhc3QoKTogcmVhZCgpIGZhaWxlZCIpOwotICAgIHJldHVybiBJU0lTX1dBUk5JTkc7Ci0gIH0KLSAgCisgIGlmICghbGxjX2NoZWNrIChsbGMpIHx8IHNfYWRkci5zbGxfcGt0dHlwZSA9PSBQQUNLRVRfT1VUR09JTkcpCisgICAgeworICAgICAgLyogIFJlYWQgdGhlIHBhY2tldCBpbnRvIGRpc2NhcmQgYnVmZiAqLworICAgICAgYnl0ZXNyZWFkID0gcmVhZCAoY2lyY3VpdC0+ZmQsIGRpc2NhcmRfYnVmZiwgc2l6ZW9mIChkaXNjYXJkX2J1ZmYpKTsKKyAgICAgIGlmIChieXRlc3JlYWQgPCAwKQorCXpsb2dfd2FybiAoImlzaXNfcmVjdl9wZHVfYmNhc3QoKTogcmVhZCgpIGZhaWxlZCIpOworICAgICAgcmV0dXJuIElTSVNfV0FSTklORzsKKyAgICB9CisKICAgLyogb24gbGFuIHdlIGhhdmUgdG8gcmVhZCB0byB0aGUgc3RhdGljIGJ1ZmYgZmlyc3QgKi8KICAgYnl0ZXNyZWFkID0gcmVjdmZyb20gKGNpcmN1aXQtPmZkLCBzb2NrX2J1ZmYsIGNpcmN1aXQtPmludGVyZmFjZS0+bXR1LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZzX2FkZHIsICZhZGRyX2xlbik7Ci0gIAorCQkJKHN0cnVjdCBzb2NrYWRkciAqKSAmc19hZGRyLCAmYWRkcl9sZW4pOworCiAgIC8qIHRoZW4gd2UgbG9zZSB0aGUgTExDICovCi0gIG1lbWNweSAoU1RSRUFNX0RBVEEgKGNpcmN1aXQtPnJjdl9zdHJlYW0pLCAKLSAgICAgICAgICBzb2NrX2J1ZmYgKyBMTENfTEVOLCBieXRlc3JlYWQgLSBMTENfTEVOKTsKKyAgbWVtY3B5IChTVFJFQU1fREFUQSAoY2lyY3VpdC0+cmN2X3N0cmVhbSksCisJICBzb2NrX2J1ZmYgKyBMTENfTEVOLCBieXRlc3JlYWQgLSBMTENfTEVOKTsKICAgY2lyY3VpdC0+cmN2X3N0cmVhbS0+cHV0cCA9IGJ5dGVzcmVhZCAtIExMQ19MRU47CiAgIGNpcmN1aXQtPnJjdl9zdHJlYW0tPmVuZHAgPSBieXRlc3JlYWQgLSBMTENfTEVOOwotICAKLSAgbWVtY3B5IChzc25wYSwgJnNfYWRkci5zbGxfYWRkciwgc19hZGRyLnNsbF9oYWxlbik7IAotICAgIAorCisgIG1lbWNweSAoc3NucGEsICZzX2FkZHIuc2xsX2FkZHIsIHNfYWRkci5zbGxfaGFsZW4pOworCiAgIHJldHVybiBJU0lTX09LOwogfQogCiBpbnQKLWlzaXNfcmVjdl9wZHVfcDJwIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LCB1X2NoYXIgKnNzbnBhKQoraXNpc19yZWN2X3BkdV9wMnAgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsIHVfY2hhciAqIHNzbnBhKQogewotCiAgIGludCBieXRlc3JlYWQsIGFkZHJfbGVuOwogICBzdHJ1Y3Qgc29ja2FkZHJfbGwgc19hZGRyOwogCkBAIC00MjAsMTYgKzQ0MSwxNyBAQAogCiAgIC8qIHdlIGNhbiByZWFkIGRpcmVjdGx5IHRvIHRoZSBzdHJlYW0gKi8KICAgYnl0ZXNyZWFkID0gcmVjdmZyb20gKGNpcmN1aXQtPmZkLCBTVFJFQU1fREFUQSAoY2lyY3VpdC0+cmN2X3N0cmVhbSksCi0gICAgICAgICAgICAgICAgICAgICAgICBjaXJjdWl0LT5pbnRlcmZhY2UtPm10dSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmc19hZGRyLCAmYWRkcl9sZW4pOworCQkJY2lyY3VpdC0+aW50ZXJmYWNlLT5tdHUsIDAsCisJCQkoc3RydWN0IHNvY2thZGRyICopICZzX2FkZHIsICZhZGRyX2xlbik7CiAKLSAgICBpZihzX2FkZHIuc2xsX3BrdHR5cGUgPT0gUEFDS0VUX09VVEdPSU5HKSB7Ci0gICAgLyogIFJlYWQgdGhlIHBhY2tldCBpbnRvIGRpc2NhcmQgYnVmZiAqLwotICAgIGJ5dGVzcmVhZCA9IHJlYWQgKGNpcmN1aXQtPmZkLCBkaXNjYXJkX2J1ZmYsIHNpemVvZiAoZGlzY2FyZF9idWZmKSk7Ci0gICAgaWYgKGJ5dGVzcmVhZCA8IDApCi0gICAgICB6bG9nX3dhcm4gKCJpc2lzX3JlY3ZfcGR1X3AycCgpOiByZWFkKCkgZmFpbGVkIik7Ci0gICAgcmV0dXJuIElTSVNfV0FSTklORzsKLSAgfQorICBpZiAoc19hZGRyLnNsbF9wa3R0eXBlID09IFBBQ0tFVF9PVVRHT0lORykKKyAgICB7CisgICAgICAvKiAgUmVhZCB0aGUgcGFja2V0IGludG8gZGlzY2FyZCBidWZmICovCisgICAgICBieXRlc3JlYWQgPSByZWFkIChjaXJjdWl0LT5mZCwgZGlzY2FyZF9idWZmLCBzaXplb2YgKGRpc2NhcmRfYnVmZikpOworICAgICAgaWYgKGJ5dGVzcmVhZCA8IDApCisJemxvZ193YXJuICgiaXNpc19yZWN2X3BkdV9wMnAoKTogcmVhZCgpIGZhaWxlZCIpOworICAgICAgcmV0dXJuIElTSVNfV0FSTklORzsKKyAgICB9CiAKICAgY2lyY3VpdC0+cmN2X3N0cmVhbS0+cHV0cCA9IGJ5dGVzcmVhZDsKICAgY2lyY3VpdC0+cmN2X3N0cmVhbS0+ZW5kcCA9IGJ5dGVzcmVhZDsKQEAgLTQzNywzMiArNDU5LDMxIEBACiAgIC8qIElmIHdlIGRvbid0IGhhdmUgcHJvdG9jb2wgdHlwZSAweDAwRkUgd2hpY2ggaXMKICAgICogSVNPIG92ZXIgR1JFIHdlIGV4aXQgd2l0aCBwYWluIDopCiAgICAqLwotICBpZiAobnRvaHMoc19hZGRyLnNsbF9wcm90b2NvbCkgIT0gMHgwMEZFKSB7Ci0gICAgemxvZ193YXJuICgiaXNpc19yZWN2X3BkdV9wMnAoKTogcHJvdG9jb2wgbWlzbWF0Y2goKTogJVgiLCAKLSAgICAgICAgICAgICAgIG50b2hzKHNfYWRkci5zbGxfcHJvdG9jb2wpKTsKLSAgICByZXR1cm4gSVNJU19XQVJOSU5HOwotICB9Ci0gIAotICBtZW1jcHkgKHNzbnBhLCAmc19hZGRyLnNsbF9hZGRyLCBzX2FkZHIuc2xsX2hhbGVuKTsgCi0gIAorICBpZiAobnRvaHMgKHNfYWRkci5zbGxfcHJvdG9jb2wpICE9IDB4MDBGRSkKKyAgICB7CisgICAgICB6bG9nX3dhcm4gKCJpc2lzX3JlY3ZfcGR1X3AycCgpOiBwcm90b2NvbCBtaXNtYXRjaCgpOiAlWCIsCisJCSBudG9ocyAoc19hZGRyLnNsbF9wcm90b2NvbCkpOworICAgICAgcmV0dXJuIElTSVNfV0FSTklORzsKKyAgICB9CisKKyAgbWVtY3B5IChzc25wYSwgJnNfYWRkci5zbGxfYWRkciwgc19hZGRyLnNsbF9oYWxlbik7CisKICAgcmV0dXJuIElTSVNfT0s7CiB9CiAKLQotICAKLWludCAKK2ludAogaXNpc19zZW5kX3BkdV9iY2FzdCAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgaW50IGxldmVsKQogewogICAvKiB3ZSBuZWVkIHRvIGRvIHRoZSBMTEMgaW4gaGVyZSBiZWNhdXNlIG9mIFAyUCBjaXJjdWl0cywgd2hpY2ggd2lsbAogICAgKiBub3QgbmVlZCBpdAogICAgKi8KLSAgaW50ICB3cml0dGVuID0gMTsKKyAgaW50IHdyaXR0ZW4gPSAxOwogICBzdHJ1Y3Qgc29ja2FkZHJfbGwgc2E7CiAKICAgc3RyZWFtX3NldF9nZXRwIChjaXJjdWl0LT5zbmRfc3RyZWFtLCAwKTsKICAgbWVtc2V0ICgmc2EsIDAsIHNpemVvZiAoc3RydWN0IHNvY2thZGRyX2xsKSk7CiAgIHNhLnNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7Ci0gIHNhLnNsbF9wcm90b2NvbCA9IGh0b25zIChzdHJlYW1fZ2V0X2VuZHAoY2lyY3VpdC0+c25kX3N0cmVhbSkrTExDX0xFTik7CisgIHNhLnNsbF9wcm90b2NvbCA9IGh0b25zIChzdHJlYW1fZ2V0X2VuZHAgKGNpcmN1aXQtPnNuZF9zdHJlYW0pICsgTExDX0xFTik7CiAgIHNhLnNsbF9pZmluZGV4ID0gY2lyY3VpdC0+aW50ZXJmYWNlLT5pZmluZGV4OwogICBzYS5zbGxfaGFsZW4gPSBFVEhfQUxFTjsKICAgaWYgKGxldmVsID09IDEpCkBAIC00NzcsMjkgKzQ5OCwyOCBAQAogICBzb2NrX2J1ZmZbMl0gPSAweDAzOwogCiAgIC8qIHRoZW4gd2UgY29weSB0aGUgZGF0YSAqLwotICBtZW1jcHkgKHNvY2tfYnVmZiArIExMQ19MRU4sIGNpcmN1aXQtPnNuZF9zdHJlYW0tPmRhdGEsIAotICAgICAgICAgIHN0cmVhbV9nZXRfZW5kcCAoY2lyY3VpdC0+c25kX3N0cmVhbSkpOworICBtZW1jcHkgKHNvY2tfYnVmZiArIExMQ19MRU4sIGNpcmN1aXQtPnNuZF9zdHJlYW0tPmRhdGEsCisJICBzdHJlYW1fZ2V0X2VuZHAgKGNpcmN1aXQtPnNuZF9zdHJlYW0pKTsKIAogICAvKiBub3cgd2UgY2FuIHNlbmQgdGhpcyAqLwogICB3cml0dGVuID0gc2VuZHRvIChjaXJjdWl0LT5mZCwgc29ja19idWZmLAotICAgICAgICAgICAgICAgICAgICBjaXJjdWl0LT5zbmRfc3RyZWFtLT5wdXRwICsgTExDX0xFTiwgMCwKLSAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZzYSwgc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfbGwpKTsKLQorCQkgICAgY2lyY3VpdC0+c25kX3N0cmVhbS0+cHV0cCArIExMQ19MRU4sIDAsCisJCSAgICAoc3RydWN0IHNvY2thZGRyICopICZzYSwgc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfbGwpKTsKIAogICByZXR1cm4gSVNJU19PSzsKIH0KIAotaW50IAoraW50CiBpc2lzX3NlbmRfcGR1X3AycCAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgaW50IGxldmVsKQogewogCi0gIGludCAgd3JpdHRlbiA9IDE7CisgIGludCB3cml0dGVuID0gMTsKICAgc3RydWN0IHNvY2thZGRyX2xsIHNhOwogCiAgIHN0cmVhbV9zZXRfZ2V0cCAoY2lyY3VpdC0+c25kX3N0cmVhbSwgMCk7CiAgIG1lbXNldCAoJnNhLCAwLCBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9sbCkpOwogICBzYS5zbGxfZmFtaWx5ID0gQUZfUEFDS0VUOwotICBzYS5zbGxfcHJvdG9jb2wgPSBodG9ucyAoc3RyZWFtX2dldF9lbmRwKGNpcmN1aXQtPnNuZF9zdHJlYW0pK0xMQ19MRU4pOworICBzYS5zbGxfcHJvdG9jb2wgPSBodG9ucyAoc3RyZWFtX2dldF9lbmRwIChjaXJjdWl0LT5zbmRfc3RyZWFtKSArIExMQ19MRU4pOwogICBzYS5zbGxfaWZpbmRleCA9IGNpcmN1aXQtPmludGVyZmFjZS0+aWZpbmRleDsKICAgc2Euc2xsX2hhbGVuID0gRVRIX0FMRU47CiAgIGlmIChsZXZlbCA9PSAxKQpAQCAtNTA5LDg2ICs1MjksODcgQEAKIAogCiAgIC8qIGxldHMgdHJ5IGNvcnJlY3RpbmcgdGhlIHByb3RvY29sICovCi0gIHNhLnNsbF9wcm90b2NvbCA9IGh0b25zKDB4MDBGRSk7Ci0gIHdyaXR0ZW4gPSBzZW5kdG8gKGNpcmN1aXQtPmZkLCBjaXJjdWl0LT5zbmRfc3RyZWFtLT5kYXRhLCAKLSAgICAgICAgICAgICAgICAgICAgY2lyY3VpdC0+c25kX3N0cmVhbS0+cHV0cCwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzYSwgCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IHNvY2thZGRyX2xsKSk7Ci0gICAgCisgIHNhLnNsbF9wcm90b2NvbCA9IGh0b25zICgweDAwRkUpOworICB3cml0dGVuID0gc2VuZHRvIChjaXJjdWl0LT5mZCwgY2lyY3VpdC0+c25kX3N0cmVhbS0+ZGF0YSwKKwkJICAgIGNpcmN1aXQtPnNuZF9zdHJlYW0tPnB1dHAsIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhLAorCQkgICAgc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfbGwpKTsKKwogICByZXR1cm4gSVNJU19PSzsKIH0KIAotCiAjZWxzZQogCiBpbnQKLWlzaXNfcmVjdl9wZHVfYmNhc3QgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsIHVfY2hhciAqc3NucGEpCitpc2lzX3JlY3ZfcGR1X2JjYXN0IChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LCB1X2NoYXIgKiBzc25wYSkKIHsKICAgaW50IGJ5dGVzcmVhZCA9IDAsIGJ5dGVzdG9yZWFkLCBvZmZzZXQsIG9uZSA9IDE7CiAgIHN0cnVjdCBicGZfaGRyICpicGZfaGRyOwogCiAgIGFzc2VydCAoY2lyY3VpdC0+ZmQgPiAwKTsKIAotICBpZiAoaW9jdGwgKGNpcmN1aXQtPmZkLCBGSU9OUkVBRCwgKGNhZGRyX3QpJmJ5dGVzdG9yZWFkKSA8IDAgKSB7Ci0gICAgemxvZ193YXJuICgiaW9jdGwoKSBGSU9OUkVBRCBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gIH0gCisgIGlmIChpb2N0bCAoY2lyY3VpdC0+ZmQsIEZJT05SRUFELCAoY2FkZHJfdCkgJiBieXRlc3RvcmVhZCkgPCAwKQorICAgIHsKKyAgICAgIHpsb2dfd2FybiAoImlvY3RsKCkgRklPTlJFQUQgZmFpbGVkOiAlcyIsIHN0cmVycm9yIChlcnJubykpOworICAgIH0KIAotICBpZiAoYnl0ZXN0b3JlYWQpIHsKLSAgICBieXRlc3JlYWQgPSByZWFkIChjaXJjdWl0LT5mZCwgcmVhZGJ1ZmYsIHJlYWRibGVuKTsKLSAgfQotICBpZiAoYnl0ZXNyZWFkIDwgMCkgewotICAgIHpsb2dfd2FybiAoImlzaXNfcmVjdl9wZHVfYmNhc3QoKTogcmVhZCgpIGZhaWxlZDogJXMiLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICByZXR1cm4gSVNJU19XQVJOSU5HOwotICB9CisgIGlmIChieXRlc3RvcmVhZCkKKyAgICB7CisgICAgICBieXRlc3JlYWQgPSByZWFkIChjaXJjdWl0LT5mZCwgcmVhZGJ1ZmYsIHJlYWRibGVuKTsKKyAgICB9CisgIGlmIChieXRlc3JlYWQgPCAwKQorICAgIHsKKyAgICAgIHpsb2dfd2FybiAoImlzaXNfcmVjdl9wZHVfYmNhc3QoKTogcmVhZCgpIGZhaWxlZDogJXMiLAorCQkgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gSVNJU19XQVJOSU5HOworICAgIH0KIAogICBpZiAoYnl0ZXNyZWFkID09IDApCiAgICAgcmV0dXJuIElTSVNfV0FSTklORzsKIAotICBicGZfaGRyID0gKHN0cnVjdCBicGZfaGRyKilyZWFkYnVmZjsKKyAgYnBmX2hkciA9IChzdHJ1Y3QgYnBmX2hkciAqKSByZWFkYnVmZjsKIAogICBhc3NlcnQgKGJwZl9oZHItPmJoX2NhcGxlbiA9PSBicGZfaGRyLT5iaF9kYXRhbGVuKTsKLSAgCisKICAgb2Zmc2V0ID0gYnBmX2hkci0+YmhfaGRybGVuICsgTExDX0xFTiArIEVUSEVSX0hEUl9MRU47Ci0gIAorCiAgIC8qIHRoZW4gd2UgbG9zZSB0aGUgQlBGLCBMTEMgYW5kIGV0aGVybmV0IGhlYWRlcnMgKi8KLSAgbWVtY3B5IChTVFJFQU1fREFUQSAoY2lyY3VpdC0+cmN2X3N0cmVhbSksIAotICAgICAgICAgIHJlYWRidWZmICsgb2Zmc2V0LCAKLSAgICAgICAgICBicGZfaGRyLT5iaF9jYXBsZW4gLSBMTENfTEVOIC0gRVRIRVJfSERSX0xFTik7CisgIG1lbWNweSAoU1RSRUFNX0RBVEEgKGNpcmN1aXQtPnJjdl9zdHJlYW0pLAorCSAgcmVhZGJ1ZmYgKyBvZmZzZXQsIGJwZl9oZHItPmJoX2NhcGxlbiAtIExMQ19MRU4gLSBFVEhFUl9IRFJfTEVOKTsKIAogICBjaXJjdWl0LT5yY3Zfc3RyZWFtLT5wdXRwID0gYnBmX2hkci0+YmhfY2FwbGVuIC0gTExDX0xFTiAtIEVUSEVSX0hEUl9MRU47CiAgIGNpcmN1aXQtPnJjdl9zdHJlYW0tPmVuZHAgPSBicGZfaGRyLT5iaF9jYXBsZW4gLSBMTENfTEVOIC0gRVRIRVJfSERSX0xFTjsKICAgY2lyY3VpdC0+cmN2X3N0cmVhbS0+Z2V0cCA9IDA7CiAKLSAgbWVtY3B5IChzc25wYSwgcmVhZGJ1ZmYgKyBicGZfaGRyLT5iaF9oZHJsZW4gKyBFVEhFUl9BRERSX0xFTiwgCi0gICAgICAgICAgRVRIRVJfQUREUl9MRU4pOwotICAKKyAgbWVtY3B5IChzc25wYSwgcmVhZGJ1ZmYgKyBicGZfaGRyLT5iaF9oZHJsZW4gKyBFVEhFUl9BRERSX0xFTiwKKwkgIEVUSEVSX0FERFJfTEVOKTsKKwogICBpZiAoaW9jdGwgKGNpcmN1aXQtPmZkLCBCSU9DRkxVU0gsICZvbmUpIDwgMCkKICAgICB6bG9nX3dhcm4gKCJGbHVzaGluZyBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gIAorCiAgIHJldHVybiBJU0lTX09LOwogfQogCiBpbnQKLWlzaXNfcmVjdl9wZHVfcDJwIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LCB1X2NoYXIgKnNzbnBhKQoraXNpc19yZWN2X3BkdV9wMnAgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsIHVfY2hhciAqIHNzbnBhKQogewogICBpbnQgYnl0ZXNyZWFkOwotICAKLSAgYnl0ZXNyZWFkID0gcmVhZCAoY2lyY3VpdC0+ZmQsIFNUUkVBTV9EQVRBKGNpcmN1aXQtPnJjdl9zdHJlYW0pLCAKLSAgICAgICAgICAgICAgICAgICAgY2lyY3VpdC0+aW50ZXJmYWNlLT5tdHUpOwogCi0gIGlmIChieXRlc3JlYWQgPCAwKSB7Ci0gICAgemxvZ193YXJuICgiaXNpc19yZWN2X3BkdV9wMnAoKTogcmVhZCAoKSBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgcmV0dXJuIElTSVNfV0FSTklORzsKLSAgfQorICBieXRlc3JlYWQgPSByZWFkIChjaXJjdWl0LT5mZCwgU1RSRUFNX0RBVEEgKGNpcmN1aXQtPnJjdl9zdHJlYW0pLAorCQkgICAgY2lyY3VpdC0+aW50ZXJmYWNlLT5tdHUpOworCisgIGlmIChieXRlc3JlYWQgPCAwKQorICAgIHsKKyAgICAgIHpsb2dfd2FybiAoImlzaXNfcmVjdl9wZHVfcDJwKCk6IHJlYWQgKCkgZmFpbGVkOiAlcyIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIElTSVNfV0FSTklORzsKKyAgICB9CiAKICAgY2lyY3VpdC0+cmN2X3N0cmVhbS0+cHV0cCA9IGJ5dGVzcmVhZDsKICAgY2lyY3VpdC0+cmN2X3N0cmVhbS0+ZW5kcCA9IGJ5dGVzcmVhZDsKLSAgCisKICAgcmV0dXJuIElTSVNfT0s7CiB9CiAKLQotICAKLWludCAKK2ludAogaXNpc19zZW5kX3BkdV9iY2FzdCAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgaW50IGxldmVsKQogewogICBzdHJ1Y3QgZXRoZXJfaGVhZGVyICpldGg7CkBAIC01OTksNyArNjIwLDcgQEAKICAgLyoKICAgICogRmlyc3QgdGhlIGV0aCBoZWFkZXIKICAgICovCi0gIGV0aCA9IChzdHJ1Y3QgZXRoZXJfaGVhZGVyICopc29ja19idWZmOworICBldGggPSAoc3RydWN0IGV0aGVyX2hlYWRlciAqKSBzb2NrX2J1ZmY7CiAgIGlmIChsZXZlbCA9PSAxKQogICAgIG1lbWNweSAoZXRoLT5ldGhlcl9kaG9zdCwgQUxMX0wxX0lTUywgRVRIRVJfQUREUl9MRU4pOwogICBlbHNlCkBAIC02MTAsMzYgKzYzMSwyNSBAQAogICAvKgogICAgKiBUaGVuIHRoZSBMTEMKICAgICovCi0gIHNvY2tfYnVmZltFVEhFUl9IRFJfTEVOXSAgICAgPSAgSVNPX1NBUDsKLSAgc29ja19idWZmW0VUSEVSX0hEUl9MRU4gKyAxXSA9ICBJU09fU0FQOwotICBzb2NrX2J1ZmZbRVRIRVJfSERSX0xFTiArIDJdID0gIDB4MDM7CisgIHNvY2tfYnVmZltFVEhFUl9IRFJfTEVOXSA9IElTT19TQVA7CisgIHNvY2tfYnVmZltFVEhFUl9IRFJfTEVOICsgMV0gPSBJU09fU0FQOworICBzb2NrX2J1ZmZbRVRIRVJfSERSX0xFTiArIDJdID0gMHgwMzsKIAogICAvKiB0aGVuIHdlIGNvcHkgdGhlIGRhdGEgKi8KLSAgbWVtY3B5IChzb2NrX2J1ZmYgKyAoTExDX0xFTiArIEVUSEVSX0hEUl9MRU4pLCBjaXJjdWl0LT5zbmRfc3RyZWFtLT5kYXRhLCAKLSAgICAgICAgICBzdHJlYW1fZ2V0X2VuZHAgKGNpcmN1aXQtPnNuZF9zdHJlYW0pKTsKKyAgbWVtY3B5IChzb2NrX2J1ZmYgKyAoTExDX0xFTiArIEVUSEVSX0hEUl9MRU4pLCBjaXJjdWl0LT5zbmRfc3RyZWFtLT5kYXRhLAorCSAgc3RyZWFtX2dldF9lbmRwIChjaXJjdWl0LT5zbmRfc3RyZWFtKSk7CiAKICAgLyogbm93IHdlIGNhbiBzZW5kIHRoaXMgKi8KICAgd3JpdHRlbiA9IHdyaXRlIChjaXJjdWl0LT5mZCwgc29ja19idWZmLAotICAgICAgICAgICAgICAgICAgIGNpcmN1aXQtPnNuZF9zdHJlYW0tPnB1dHAgKyBMTENfTEVOICsgRVRIRVJfSERSX0xFTik7Ci0KKwkJICAgY2lyY3VpdC0+c25kX3N0cmVhbS0+cHV0cCArIExMQ19MRU4gKyBFVEhFUl9IRFJfTEVOKTsKIAogICByZXR1cm4gSVNJU19PSzsKIH0KIAotaW50IAoraW50CiBpc2lzX3NlbmRfcGR1X3AycCAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgaW50IGxldmVsKQogewotICAKLSAgICAKICAgcmV0dXJuIElTSVNfT0s7CiB9CiAKLQotCi0KICNlbmRpZiAvKiBHTlVfTElOVVggKi8KLQotCi0KLQotCmRpZmYgLS1naXQgYS9pc2lzZC9pc2lzX25ldHdvcmsuaCBiL2lzaXNkL2lzaXNfbmV0d29yay5oCmluZGV4IDc2MzNmOWUuLmUxZTEwZGYgMTAwNjQ0Ci0tLSBhL2lzaXNkL2lzaXNfbmV0d29yay5oCisrKyBiL2lzaXNkL2lzaXNfbmV0d29yay5oCkBAIC0yOSw4ICsyOSw4IEBACiAKIGludCBpc2lzX3NvY2tfaW5pdCAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCk7CiAKLWludCBpc2lzX3JlY3ZfcGR1X2JjYXN0ICAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgdV9jaGFyICpzc25wYSk7Ci1pbnQgaXNpc19yZWN2X3BkdV9wMnAgIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LCB1X2NoYXIgKnNzbnBhKTsKK2ludCBpc2lzX3JlY3ZfcGR1X2JjYXN0IChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LCB1X2NoYXIgKiBzc25wYSk7CitpbnQgaXNpc19yZWN2X3BkdV9wMnAgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsIHVfY2hhciAqIHNzbnBhKTsKIGludCBpc2lzX3NlbmRfcGR1X2JjYXN0IChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LCBpbnQgbGV2ZWwpOwogaW50IGlzaXNfc2VuZF9wZHVfcDJwIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LCBpbnQgbGV2ZWwpOwogCmRpZmYgLS1naXQgYS9pc2lzZC9pc2lzX3BkdS5jIGIvaXNpc2QvaXNpc19wZHUuYwppbmRleCBmOTMwMjVkLi5jYWUzNDYxIDEwMDY0NAotLS0gYS9pc2lzZC9pc2lzX3BkdS5jCisrKyBiL2lzaXNkL2lzaXNfcGR1LmMKQEAgLTU4LDE1ICs1OCwxNCBAQAogZXh0ZXJuIHN0cnVjdCBpc2lzICppc2lzOwogCiAjZGVmaW5lIElTSVNfTUlOSU1VTV9GSVhFRF9IRFJfTEVOIDE1Ci0jZGVmaW5lIElTSVNfTUlOX1BEVV9MRU4gICAgICAgICAgIDEzIC8qIHBhcnRpYWwgc2VxbnVtIHBkdSB3aXRoIGlkX2xlbj0yICovCisjZGVmaW5lIElTSVNfTUlOX1BEVV9MRU4gICAgICAgICAgIDEzCS8qIHBhcnRpYWwgc2VxbnVtIHBkdSB3aXRoIGlkX2xlbj0yICovCiAKICNpZm5kZWYgUE5CQlkKICNkZWZpbmUgUE5CQlkgOAogI2VuZGlmIC8qIFBOQkJZICovCiAKIC8qIFV0aWxpdHkgbWFzayBhcnJheS4gKi8KLXN0YXRpYyB1X2NoYXIgbWFza2JpdFtdID0gCi17CitzdGF0aWMgdV9jaGFyIG1hc2tiaXRbXSA9IHsKICAgMHgwMCwgMHg4MCwgMHhjMCwgMHhlMCwgMHhmMCwgMHhmOCwgMHhmYywgMHhmZSwgMHhmZgogfTsKIApAQCAtNzcsMjEgKzc2LDIzIEBACiAvKgogICogQ29tcGFyZXMgdHdvIHNldHMgb2YgYXJlYSBhZGRyZXNzZXMKICAqLwotc3RhdGljIGludCAKK3N0YXRpYyBpbnQKIGFyZWFfbWF0Y2ggKHN0cnVjdCBsaXN0ICpsZWZ0LCBzdHJ1Y3QgbGlzdCAqcmlnaHQpCiB7CiAgIHN0cnVjdCBhcmVhX2FkZHIgKmFkZHIxLCAqYWRkcjI7CiAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTEsICpub2RlMjsKIAotICBMSVNUX0xPT1AgKGxlZnQsIGFkZHIxLCBub2RlMSkgewotICAgIExJU1RfTE9PUCAocmlnaHQsIGFkZHIyLCBub2RlMikgewotICAgICAgaWYgKGFkZHIxLT5hZGRyX2xlbiA9PSBhZGRyMi0+YWRkcl9sZW4gJiYgCi0gICAgICAgICFtZW1jbXAgKGFkZHIxLT5hcmVhX2FkZHIsIGFkZHIyLT5hcmVhX2FkZHIsIChpbnQpYWRkcjEtPmFkZHJfbGVuKSkKLSAgICAgICAgcmV0dXJuIDE7IC8qIG1hdGNoICovCisgIExJU1RfTE9PUCAobGVmdCwgYWRkcjEsIG5vZGUxKQorICB7CisgICAgTElTVF9MT09QIChyaWdodCwgYWRkcjIsIG5vZGUyKQorICAgIHsKKyAgICAgIGlmIChhZGRyMS0+YWRkcl9sZW4gPT0gYWRkcjItPmFkZHJfbGVuICYmCisJICAhbWVtY21wIChhZGRyMS0+YXJlYV9hZGRyLCBhZGRyMi0+YXJlYV9hZGRyLCAoaW50KSBhZGRyMS0+YWRkcl9sZW4pKQorCXJldHVybiAxOwkJLyogbWF0Y2ggKi8KICAgICB9CiAgIH0KIAotICByZXR1cm4gMDsgLyogbWlzbWF0Y2ggKi8KKyAgcmV0dXJuIDA7CQkJLyogbWlzbWF0Y2ggKi8KIH0KIAogLyoKQEAgLTEwMiwzNSArMTAzLDM4IEBACiAgKiAgICAgICAgIDEgICAgICAgICAgICB0aGUgSUlIJ3MgSVAgaXMgaW4gdGhlIElTJ3Mgc3VibmV0d29yawogICovCiBpbnQKLWlwX3NhbWVfc3VibmV0ICAoc3RydWN0IHByZWZpeF9pcHY0ICppcDEsIHN0cnVjdCBpbl9hZGRyICppcDIpCitpcF9zYW1lX3N1Ym5ldCAoc3RydWN0IHByZWZpeF9pcHY0ICppcDEsIHN0cnVjdCBpbl9hZGRyICppcDIpCiB7CiAgIHVfY2hhciAqYWRkcjEsICphZGRyMjsKICAgaW50IHNoaWZ0LCBvZmZzZXQ7CiAgIGludCBsZW47Ci0gICAgCi0gIGFkZHIxID0gKHVfY2hhciAqKSAmaXAxLT5wcmVmaXguc19hZGRyOwotICBhZGRyMiA9ICh1X2NoYXIgKikgJmlwMi0+c19hZGRyOworCisgIGFkZHIxID0gKHVfY2hhciAqKSAmIGlwMS0+cHJlZml4LnNfYWRkcjsKKyAgYWRkcjIgPSAodV9jaGFyICopICYgaXAyLT5zX2FkZHI7CiAgIGxlbiA9IGlwMS0+cHJlZml4bGVuOwogCiAgIHNoaWZ0ID0gbGVuICUgUE5CQlk7CiAgIG9mZnNldCA9IGxlbiAvIFBOQkJZOwogCi0gIHdoaWxlIChvZmZzZXQtLSkgewotICAgIGlmIChhZGRyMVtvZmZzZXRdICE9IGFkZHIyW29mZnNldF0pIHsKLSAgICAgIHJldHVybiAwOworICB3aGlsZSAob2Zmc2V0LS0pCisgICAgeworICAgICAgaWYgKGFkZHIxW29mZnNldF0gIT0gYWRkcjJbb2Zmc2V0XSkKKwl7CisJICByZXR1cm4gMDsKKwl9CiAgICAgfQotICB9CiAKLSAgaWYgKHNoaWZ0KSB7Ci0gICAgaWYgKG1hc2tiaXRbc2hpZnRdICYgKGFkZHIxW29mZnNldF0gXiBhZGRyMltvZmZzZXRdKSkgewotICAgICAgcmV0dXJuIDA7CisgIGlmIChzaGlmdCkKKyAgICB7CisgICAgICBpZiAobWFza2JpdFtzaGlmdF0gJiAoYWRkcjFbb2Zmc2V0XSBeIGFkZHIyW29mZnNldF0pKQorCXsKKwkgIHJldHVybiAwOworCX0KICAgICB9Ci0gIH0KLSAgICAKLSByZXR1cm4gMTsgLyogbWF0Y2ggICovCisKKyAgcmV0dXJuIDE7CQkJLyogbWF0Y2ggICovCiB9CiAKLQogLyoKICAqIENvbXBhcmVzIHR3byBzZXQgb2YgaXAgYWRkcmVzc2VzCiAgKiBwYXJhbSBsZWZ0ICAgICB0aGUgbG9jYWwgaW50ZXJmYWNlJ3MgaXAgYWRkcmVzc2VzCkBAIC0xMzgsMjAgKzE0MiwyMyBAQAogICogcmV0dXJuICAgICAgICAgMCAgIG5vIG1hdGNoOwogICogICAgICAgICAgICAgICAgMSAgIG1hdGNoOwogICovCi1zdGF0aWMgaW50IAorc3RhdGljIGludAogaXBfbWF0Y2ggKHN0cnVjdCBsaXN0ICpsZWZ0LCBzdHJ1Y3QgbGlzdCAqcmlnaHQpCiB7CiAgIHN0cnVjdCBwcmVmaXhfaXB2NCAqaXAxOwogICBzdHJ1Y3QgaW5fYWRkciAqaXAyOwogICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGUxLCAqbm9kZTI7CiAKLSAgTElTVF9MT09QIChsZWZ0LCBpcDEsIG5vZGUxKSB7Ci0gICAgTElTVF9MT09QIChyaWdodCwgaXAyLCBub2RlMikgewotICAgICAgaWYgKGlwX3NhbWVfc3VibmV0KGlwMSwgaXAyKSkgewotICAgICAgICByZXR1cm4gMTsgIC8qIG1hdGNoICovCi0gICAgICB9CisgIExJU1RfTE9PUCAobGVmdCwgaXAxLCBub2RlMSkKKyAgeworICAgIExJU1RfTE9PUCAocmlnaHQsIGlwMiwgbm9kZTIpCisgICAgeworICAgICAgaWYgKGlwX3NhbWVfc3VibmV0IChpcDEsIGlwMikpCisJeworCSAgcmV0dXJuIDE7CQkvKiBtYXRjaCAqLworCX0KICAgICB9Ci0gIAorCiAgIH0KICAgcmV0dXJuIDA7CiB9CkBAIC0xNjIsMTAzICsxNjksMTExIEBACiBzdGF0aWMgaW50CiBhY2NlcHRfbGV2ZWwgKGludCBsZXZlbCwgaW50IGNpcmN1aXRfdCkKIHsKLSAgaW50IHJldHZhbCA9ICgoY2lyY3VpdF90ICYgbGV2ZWwpID09IGxldmVsKTsgLyogc2ltcGxlIGFwcHJvYWNoICovCisgIGludCByZXR2YWwgPSAoKGNpcmN1aXRfdCAmIGxldmVsKSA9PSBsZXZlbCk7CS8qIHNpbXBsZSBhcHByb2FjaCAqLwogCiAgIHJldHVybiByZXR2YWw7CiB9CiAKLWludCAKK2ludAogYXV0aGVudGljYXRpb25fY2hlY2sgKHN0cnVjdCBpc2lzX3Bhc3N3ZCAqb25lLCBzdHJ1Y3QgaXNpc19wYXNzd2QgKnRoZW90aGVyKQogewotICBpZiAob25lLT50eXBlICE9IHRoZW90aGVyLT50eXBlKSB7Ci0gICAgemxvZ193YXJuICgiVW5zdXBwb3J0ZWQgYXV0aGVudGljYXRpb24gdHlwZSAlZCIsIHRoZW90aGVyLT50eXBlICk7Ci0gICAgcmV0dXJuIDE7IC8qIEF1dGggZmFpbCAoZGlmZmVyZW50IGF1dGhlbnRpY2F0aW9uIHR5cGVzKSovCi0gIH0KLSAgc3dpdGNoIChvbmUtPnR5cGUpIHsKLSAgY2FzZSBJU0lTX1BBU1NXRF9UWVBFX0NMRUFSVFhUOgotICAgIGlmIChvbmUtPmxlbiAhPSB0aGVvdGhlci0+bGVuKQotICAgICAgcmV0dXJuIDE7IC8qIEF1dGggZmFpbCAoKSAtIHBhc3N3ZCBsZW4gbWlzbWF0Y2ggKi8KLSAgICByZXR1cm4gbWVtY21wIChvbmUtPnBhc3N3ZCwgdGhlb3RoZXItPnBhc3N3ZCwgb25lLT5sZW4pOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIHpsb2dfd2FybiAoIlVuc3VwcG9ydGVkIGF1dGhlbnRpY2F0aW9uIHR5cGUiKTsKLSAgICBicmVhazsKLSAgfQotICByZXR1cm4gMDsgLyogQXV0aCBwYXNzICovIAorICBpZiAob25lLT50eXBlICE9IHRoZW90aGVyLT50eXBlKQorICAgIHsKKyAgICAgIHpsb2dfd2FybiAoIlVuc3VwcG9ydGVkIGF1dGhlbnRpY2F0aW9uIHR5cGUgJWQiLCB0aGVvdGhlci0+dHlwZSk7CisgICAgICByZXR1cm4gMTsJCQkvKiBBdXRoIGZhaWwgKGRpZmZlcmVudCBhdXRoZW50aWNhdGlvbiB0eXBlcykgKi8KKyAgICB9CisgIHN3aXRjaCAob25lLT50eXBlKQorICAgIHsKKyAgICBjYXNlIElTSVNfUEFTU1dEX1RZUEVfQ0xFQVJUWFQ6CisgICAgICBpZiAob25lLT5sZW4gIT0gdGhlb3RoZXItPmxlbikKKwlyZXR1cm4gMTsJCS8qIEF1dGggZmFpbCAoKSAtIHBhc3N3ZCBsZW4gbWlzbWF0Y2ggKi8KKyAgICAgIHJldHVybiBtZW1jbXAgKG9uZS0+cGFzc3dkLCB0aGVvdGhlci0+cGFzc3dkLCBvbmUtPmxlbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgemxvZ193YXJuICgiVW5zdXBwb3J0ZWQgYXV0aGVudGljYXRpb24gdHlwZSIpOworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gMDsJCQkvKiBBdXRoIHBhc3MgKi8KIH0KIAogLyoKICAqIFByb2Nlc3NpbmcgaGVscGVyIGZ1bmN0aW9ucwogICovCiB2b2lkCi10bHZzX3RvX2Fkal9ubHBpZHMgKHN0cnVjdCB0bHZzICp0bHZzLCBzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKmFkaikgCit0bHZzX3RvX2Fkal9ubHBpZHMgKHN0cnVjdCB0bHZzICp0bHZzLCBzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKmFkaikKIHsKICAgaW50IGk7CiAgIHN0cnVjdCBubHBpZHMgKnRsdl9ubHBpZHM7CiAKLSAgaWYgKHRsdnMtPm5scGlkcykgeworICBpZiAodGx2cy0+bmxwaWRzKQorICAgIHsKIAotICAgIHRsdl9ubHBpZHMgPSB0bHZzLT5ubHBpZHM7CisgICAgICB0bHZfbmxwaWRzID0gdGx2cy0+bmxwaWRzOwogCi0gICAgYWRqLT5ubHBpZHMuY291bnQgPSB0bHZfbmxwaWRzLT5jb3VudDsKKyAgICAgIGFkai0+bmxwaWRzLmNvdW50ID0gdGx2X25scGlkcy0+Y291bnQ7CiAKLSAgICBmb3IgKGk9MDtpPHRsdl9ubHBpZHMtPmNvdW50O2krKykgewotICAgICAgIGFkai0+bmxwaWRzLm5scGlkc1tpXSA9IHRsdl9ubHBpZHMtPm5scGlkc1tpXTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB0bHZfbmxwaWRzLT5jb3VudDsgaSsrKQorCXsKKwkgIGFkai0+bmxwaWRzLm5scGlkc1tpXSA9IHRsdl9ubHBpZHMtPm5scGlkc1tpXTsKKwl9CiAgICAgfQotICB9CiB9CiAKLXZvaWQgIAordm9pZAogZGVsX2lwX2FkZHIgKHZvaWQgKnZhbCkKIHsKICAgWEZSRUUgKE1UWVBFX0lTSVNfVE1QLCB2YWwpOwogfQogCiB2b2lkCi10bHZzX3RvX2Fkal9pcHY0X2FkZHJzIChzdHJ1Y3QgdGx2cyAqdGx2cywgc3RydWN0IGlzaXNfYWRqYWNlbmN5ICphZGopIAordGx2c190b19hZGpfaXB2NF9hZGRycyAoc3RydWN0IHRsdnMgKnRsdnMsIHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqKQogewogICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgIHN0cnVjdCBpbl9hZGRyICppcHY0X2FkZHIsICptYWxsb2NlZDsKIAotICBpZiAoYWRqLT5pcHY0X2FkZHJzKSB7Ci0gICAgYWRqLT5pcHY0X2FkZHJzLT5kZWwgPSBkZWxfaXBfYWRkcjsKLSAgICBsaXN0X2RlbGV0ZSAoYWRqLT5pcHY0X2FkZHJzKTsKLSAgfQotICBhZGotPmlwdjRfYWRkcnMgPSBsaXN0X25ldyAoKTsKLSAgaWYgKHRsdnMtPmlwdjRfYWRkcnMpIHsKLSAgICBMSVNUX0xPT1AgKHRsdnMtPmlwdjRfYWRkcnMsIGlwdjRfYWRkciwgbm9kZSkgewotICAgICAgbWFsbG9jZWQgPSBYTUFMTE9DIChNVFlQRV9JU0lTX1RNUCwgc2l6ZW9mIChzdHJ1Y3QgaW5fYWRkcikpOwotICAgICAgbWVtY3B5IChtYWxsb2NlZCwgaXB2NF9hZGRyLCBzaXplb2YgKHN0cnVjdCBpbl9hZGRyKSk7Ci0gICAgICBsaXN0bm9kZV9hZGQgKGFkai0+aXB2NF9hZGRycywgbWFsbG9jZWQpOworICBpZiAoYWRqLT5pcHY0X2FkZHJzKQorICAgIHsKKyAgICAgIGFkai0+aXB2NF9hZGRycy0+ZGVsID0gZGVsX2lwX2FkZHI7CisgICAgICBsaXN0X2RlbGV0ZSAoYWRqLT5pcHY0X2FkZHJzKTsKICAgICB9Ci0gIH0KKyAgYWRqLT5pcHY0X2FkZHJzID0gbGlzdF9uZXcgKCk7CisgIGlmICh0bHZzLT5pcHY0X2FkZHJzKQorICAgIHsKKyAgICAgIExJU1RfTE9PUCAodGx2cy0+aXB2NF9hZGRycywgaXB2NF9hZGRyLCBub2RlKQorICAgICAgeworCW1hbGxvY2VkID0gWE1BTExPQyAoTVRZUEVfSVNJU19UTVAsIHNpemVvZiAoc3RydWN0IGluX2FkZHIpKTsKKwltZW1jcHkgKG1hbGxvY2VkLCBpcHY0X2FkZHIsIHNpemVvZiAoc3RydWN0IGluX2FkZHIpKTsKKwlsaXN0bm9kZV9hZGQgKGFkai0+aXB2NF9hZGRycywgbWFsbG9jZWQpOworICAgICAgfQorICAgIH0KIH0KIAogI2lmZGVmIEhBVkVfSVBWNgogdm9pZAotdGx2c190b19hZGpfaXB2Nl9hZGRycyAoc3RydWN0IHRsdnMgKnRsdnMsIHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqKSAKK3RsdnNfdG9fYWRqX2lwdjZfYWRkcnMgKHN0cnVjdCB0bHZzICp0bHZzLCBzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKmFkaikKIHsKICAgc3RydWN0IGxpc3Rub2RlICpub2RlOwogICBzdHJ1Y3QgaW42X2FkZHIgKmlwdjZfYWRkciwgKm1hbGxvY2VkOwogCi0gIGlmIChhZGotPmlwdjZfYWRkcnMpIHsKLSAgICBhZGotPmlwdjZfYWRkcnMtPmRlbCA9IGRlbF9pcF9hZGRyOwotICAgIGxpc3RfZGVsZXRlIChhZGotPmlwdjZfYWRkcnMpOwotICB9Ci0gIGFkai0+aXB2Nl9hZGRycyA9IGxpc3RfbmV3ICgpOwotICBpZiAodGx2cy0+aXB2Nl9hZGRycykgewotICAgIExJU1RfTE9PUCAodGx2cy0+aXB2Nl9hZGRycywgaXB2Nl9hZGRyLCBub2RlKSB7Ci0gICAgICBtYWxsb2NlZCA9IFhNQUxMT0MgKE1UWVBFX0lTSVNfVE1QLCBzaXplb2YgKHN0cnVjdCBpbjZfYWRkcikpOwotICAgICAgbWVtY3B5IChtYWxsb2NlZCwgaXB2Nl9hZGRyLCBzaXplb2YgKHN0cnVjdCBpbjZfYWRkcikpOwotICAgICAgbGlzdG5vZGVfYWRkIChhZGotPmlwdjZfYWRkcnMsIG1hbGxvY2VkKTsKKyAgaWYgKGFkai0+aXB2Nl9hZGRycykKKyAgICB7CisgICAgICBhZGotPmlwdjZfYWRkcnMtPmRlbCA9IGRlbF9pcF9hZGRyOworICAgICAgbGlzdF9kZWxldGUgKGFkai0+aXB2Nl9hZGRycyk7CiAgICAgfQotICB9CisgIGFkai0+aXB2Nl9hZGRycyA9IGxpc3RfbmV3ICgpOworICBpZiAodGx2cy0+aXB2Nl9hZGRycykKKyAgICB7CisgICAgICBMSVNUX0xPT1AgKHRsdnMtPmlwdjZfYWRkcnMsIGlwdjZfYWRkciwgbm9kZSkKKyAgICAgIHsKKwltYWxsb2NlZCA9IFhNQUxMT0MgKE1UWVBFX0lTSVNfVE1QLCBzaXplb2YgKHN0cnVjdCBpbjZfYWRkcikpOworCW1lbWNweSAobWFsbG9jZWQsIGlwdjZfYWRkciwgc2l6ZW9mIChzdHJ1Y3QgaW42X2FkZHIpKTsKKwlsaXN0bm9kZV9hZGQgKGFkai0+aXB2Nl9hZGRycywgbWFsbG9jZWQpOworICAgICAgfQorICAgIH0KIAogfQogI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwogCi0KLQogLyoKICAqICBSRUNFSVZFIFNJREUgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqLwpAQCAtMjc4LDEyICsyOTMsMTIgQEAKICAgdV9pbnQzMl90IGV4cGVjdGVkID0gMCwgZm91bmQ7CiAgIHN0cnVjdCB0bHZzIHRsdnM7CiAKLSAgaWYgKChzdHJlYW1fZ2V0X2VuZHAgKGNpcmN1aXQtPnJjdl9zdHJlYW0pIC0gCi0gICAgICAgc3RyZWFtX2dldF9nZXRwIChjaXJjdWl0LT5yY3Zfc3RyZWFtKSkgPAotICAgICAgSVNJU19QMlBIRUxMT19IRFJMRU4pIHsKLSAgICB6bG9nX3dhcm4gKCJQYWNrZXQgdG9vIHNob3J0Iik7Ci0gICAgcmV0dXJuIElTSVNfV0FSTklORzsKLSAgfQorICBpZiAoKHN0cmVhbV9nZXRfZW5kcCAoY2lyY3VpdC0+cmN2X3N0cmVhbSkgLQorICAgICAgIHN0cmVhbV9nZXRfZ2V0cCAoY2lyY3VpdC0+cmN2X3N0cmVhbSkpIDwgSVNJU19QMlBIRUxMT19IRFJMRU4pCisgICAgeworICAgICAgemxvZ193YXJuICgiUGFja2V0IHRvbyBzaG9ydCIpOworICAgICAgcmV0dXJuIElTSVNfV0FSTklORzsKKyAgICB9CiAKICAgLyogOC4yLjUuMSBQRFUgYWNjZXB0YW5jZSB0ZXN0cyAqLwogCkBAIC0zMDEsNDEgKzMxNiw0MyBAQAogICAvKgogICAgKiBHZXQgdGhlIGhlYWRlcgogICAgKi8KLSAgaGRyID0gKHN0cnVjdCBpc2lzX3AycF9oZWxsb19oZHIqKSBTVFJFQU1fUE5UKGNpcmN1aXQtPnJjdl9zdHJlYW0pOworICBoZHIgPSAoc3RydWN0IGlzaXNfcDJwX2hlbGxvX2hkciAqKSBTVFJFQU1fUE5UIChjaXJjdWl0LT5yY3Zfc3RyZWFtKTsKICAgY2lyY3VpdC0+cmN2X3N0cmVhbS0+Z2V0cCArPSBJU0lTX1AyUEhFTExPX0hEUkxFTjsKIAogICAvKiAgaGRyLmNpcmN1aXRfdCA9IHN0cmVhbV9nZXRjIChzdHJlYW0pOwotICAgICAgc3RyZWFtX2dldCAoaGRyLnNvdXJjZV9pZCwgc3RyZWFtLCBJU0lTX1NZU19JRF9MRU4pOwotICAgICAgaGRyLmhvbGRfdGltZSA9IHN0cmVhbV9nZXR3IChzdHJlYW0pOwotICAgICAgaGRyLnBkdV9sZW4gICA9IHN0cmVhbV9nZXR3IChzdHJlYW0pOwotICAgICAgaGRyLmxvY2FsX2lkICA9IHN0cmVhbV9nZXRjIChzdHJlYW0pOyAqLworICAgICBzdHJlYW1fZ2V0IChoZHIuc291cmNlX2lkLCBzdHJlYW0sIElTSVNfU1lTX0lEX0xFTik7CisgICAgIGhkci5ob2xkX3RpbWUgPSBzdHJlYW1fZ2V0dyAoc3RyZWFtKTsKKyAgICAgaGRyLnBkdV9sZW4gICA9IHN0cmVhbV9nZXR3IChzdHJlYW0pOworICAgICBoZHIubG9jYWxfaWQgID0gc3RyZWFtX2dldGMgKHN0cmVhbSk7ICovCiAKICAgLyoKICAgICogTXkgaW50ZXJwZXJ0YXRpb24gb2YgdGhlIElTTywgaWYgbm8gYWRqIGV4aXN0cyB3ZSB3aWxsIGNyZWF0ZSBvbmUgZm9yIAogICAgKiB0aGUgY2lyY3VpdAogICAgKi8KIAotICBpZiAoaXNpcy0+ZGVidWdzICAmIERFQlVHX0FESl9QQUNLRVRTKSB7Ci0gICAgIHpsb2dfaW5mbygiSVNJUy1BZGogKCVzKTogUmN2ZCBQMlAgSUlIIGZyb20gKCVzKSwgY2lyIHR5cGUgJXMsIgotCSAgICAgICAiIGNpciBpZCAlMDJkLCBsZW5ndGggJWQiLAotCSAgICAgICBjaXJjdWl0LT5hcmVhLT5hcmVhX3RhZywgY2lyY3VpdC0+aW50ZXJmYWNlLT5uYW1lLCAKLQkgICAgICAgY2lyY3VpdF90MnN0cmluZyhjaXJjdWl0LT5jaXJjdWl0X2lzX3R5cGUpLAotCSAgICAgICBjaXJjdWl0LT5jaXJjdWl0X2lkLG50b2hzKGhkci0+cGR1X2xlbikpOwotICB9CisgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19BREpfUEFDS0VUUykKKyAgICB7CisgICAgICB6bG9nX2luZm8gKCJJU0lTLUFkaiAoJXMpOiBSY3ZkIFAyUCBJSUggZnJvbSAoJXMpLCBjaXIgdHlwZSAlcywiCisJCSAiIGNpciBpZCAlMDJkLCBsZW5ndGggJWQiLAorCQkgY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsIGNpcmN1aXQtPmludGVyZmFjZS0+bmFtZSwKKwkJIGNpcmN1aXRfdDJzdHJpbmcgKGNpcmN1aXQtPmNpcmN1aXRfaXNfdHlwZSksCisJCSBjaXJjdWl0LT5jaXJjdWl0X2lkLCBudG9ocyAoaGRyLT5wZHVfbGVuKSk7CisgICAgfQogCiAgIGFkaiA9IGNpcmN1aXQtPnUucDJwLm5laWdoYm9yOwotICBpZiAoICFhZGogKSB7Ci0gICAgYWRqID0gaXNpc19uZXdfYWRqIChoZHItPnNvdXJjZV9pZCwiICAgICAgIiwgMCwgY2lyY3VpdCk7Ci0gICAgaWYgKGFkaiA9PSBOVUxMKQotICAgICAgcmV0dXJuIElTSVNfRVJST1I7Ci0gICAgY2lyY3VpdC0+dS5wMnAubmVpZ2hib3IgPSBhZGo7Ci0gICAgaXNpc19hZGpfc3RhdGVfY2hhbmdlKGFkaiwgSVNJU19BREpfSU5JVElBTElaSU5HLCBOVUxMKTsKLSAgICBhZGotPnN5c190eXBlID0gSVNJU19TWVNUWVBFX1VOS05PV047Ci0gIH0KKyAgaWYgKCFhZGopCisgICAgeworICAgICAgYWRqID0gaXNpc19uZXdfYWRqIChoZHItPnNvdXJjZV9pZCwgIiAgICAgICIsIDAsIGNpcmN1aXQpOworICAgICAgaWYgKGFkaiA9PSBOVUxMKQorCXJldHVybiBJU0lTX0VSUk9SOworICAgICAgY2lyY3VpdC0+dS5wMnAubmVpZ2hib3IgPSBhZGo7CisgICAgICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfSU5JVElBTElaSU5HLCBOVUxMKTsKKyAgICAgIGFkai0+c3lzX3R5cGUgPSBJU0lTX1NZU1RZUEVfVU5LTk9XTjsKKyAgICB9CiAKICAgLyogOC4yLjYgTW9uaXRvcmluZyBwb2ludC10by1wb2ludCBhZGphY2VuY2llcyAqLwogICBhZGotPmhvbGRfdGltZSA9IG50b2hzIChoZHItPmhvbGRfdGltZSk7Ci0gIGFkai0+bGFzdF91cGQgID0gdGltZSAoTlVMTCk7CisgIGFkai0+bGFzdF91cGQgPSB0aW1lIChOVUxMKTsKIAogICAvKgogICAgKiBMZXRzIGdldCB0aGUgVExWUyBub3cKQEAgLTM0OCwyMTQgKzM2NSwyNzMgQEAKIAogICByZXR2YWwgPSBwYXJzZV90bHZzIChjaXJjdWl0LT5hcmVhLT5hcmVhX3RhZywKIAkJICAgICAgIFNUUkVBTV9QTlQgKGNpcmN1aXQtPnJjdl9zdHJlYW0pLAotCQkgICAgICAgbnRvaHMgKGhkci0+cGR1X2xlbikgLSBJU0lTX1AyUEhFTExPX0hEUkxFTiAKLQkJICAgICAgIC0gSVNJU19GSVhFRF9IRFJfTEVOLAotCQkgICAgICAgJmV4cGVjdGVkLAotCQkgICAgICAgJmZvdW5kLAotCQkgICAgICAgJnRsdnMpOworCQkgICAgICAgbnRvaHMgKGhkci0+cGR1X2xlbikgLSBJU0lTX1AyUEhFTExPX0hEUkxFTgorCQkgICAgICAgLSBJU0lTX0ZJWEVEX0hEUl9MRU4sICZleHBlY3RlZCwgJmZvdW5kLCAmdGx2cyk7CiAKLSAgaWYgKHJldHZhbCA+IElTSVNfV0FSTklORykgewotICAgIGZyZWVfdGx2cyAoJnRsdnMpOwotICAgIHJldHVybiByZXR2YWw7Ci0gIH07CisgIGlmIChyZXR2YWwgPiBJU0lTX1dBUk5JTkcpCisgICAgeworICAgICAgZnJlZV90bHZzICgmdGx2cyk7CisgICAgICByZXR1cm4gcmV0dmFsOworICAgIH07CiAKICAgLyogOC4yLjUuMSBjKSBBdXRoZW50aWNhdGlvbiAqLwotICBpZiAoY2lyY3VpdC0+cGFzc3dkLnR5cGUpIHsKLSAgICBpZiAoIShmb3VuZCAmIFRMVkZMQUdfQVVUSF9JTkZPKSB8fCAKLQlhdXRoZW50aWNhdGlvbl9jaGVjayAoJmNpcmN1aXQtPnBhc3N3ZCwgJnRsdnMuYXV0aF9pbmZvKSkgewotICAgICAgaXNpc19ldmVudF9hdXRoX2ZhaWx1cmUgKGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLCAKLQkJCSAgICAgICAiUDJQIGhlbGxvIGF1dGhlbnRpY2F0aW9uIGZhaWx1cmUiLCAKLQkJCSAgICAgICBoZHItPnNvdXJjZV9pZCk7Ci0gICAgICByZXR1cm4gSVNJU19PSzsKKyAgaWYgKGNpcmN1aXQtPnBhc3N3ZC50eXBlKQorICAgIHsKKyAgICAgIGlmICghKGZvdW5kICYgVExWRkxBR19BVVRIX0lORk8pIHx8CisJICBhdXRoZW50aWNhdGlvbl9jaGVjayAoJmNpcmN1aXQtPnBhc3N3ZCwgJnRsdnMuYXV0aF9pbmZvKSkKKwl7CisJICBpc2lzX2V2ZW50X2F1dGhfZmFpbHVyZSAoY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsCisJCQkJICAgIlAyUCBoZWxsbyBhdXRoZW50aWNhdGlvbiBmYWlsdXJlIiwKKwkJCQkgICBoZHItPnNvdXJjZV9pZCk7CisJICByZXR1cm4gSVNJU19PSzsKKwl9CiAgICAgfQotICB9CiAKICAgLyogd2UgZG8gdGhpcyBub3cgYmVjYXVzZSB0aGUgYWRqIG1heSBub3Qgc3Vydml2ZSB0aWxsIHRoZSBlbmQuLi4gKi8KIAogICAvKiB3ZSBuZWVkIHRvIGNvcHkgYWRkcmVzc2VzIHRvIHRoZSBhZGogKi8KLSAgdGx2c190b19hZGpfaXB2NF9hZGRycyAoJnRsdnMsYWRqKTsKKyAgdGx2c190b19hZGpfaXB2NF9hZGRycyAoJnRsdnMsIGFkaik7CiAKICNpZmRlZiBIQVZFX0lQVjYKLSAgdGx2c190b19hZGpfaXB2Nl9hZGRycyAoJnRsdnMsYWRqKTsKKyAgdGx2c190b19hZGpfaXB2Nl9hZGRycyAoJnRsdnMsIGFkaik7CiAjZW5kaWYgLyogSEFWRV9JUFY2ICovCiAKICAgLyogbGV0cyB0YWtlIGNhcmUgb2YgdGhlIGV4cGlyeSAqLwotICBUSFJFQURfVElNRVJfT0ZGKGFkai0+dF9leHBpcmUpOwotICBUSFJFQURfVElNRVJfT04obWFzdGVyLCBhZGotPnRfZXhwaXJlLCBpc2lzX2Fkal9leHBpcmUsIGFkaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKWFkai0+aG9sZF90aW1lKTsKKyAgVEhSRUFEX1RJTUVSX09GRiAoYWRqLT50X2V4cGlyZSk7CisgIFRIUkVBRF9USU1FUl9PTiAobWFzdGVyLCBhZGotPnRfZXhwaXJlLCBpc2lzX2Fkal9leHBpcmUsIGFkaiwKKwkJICAgKGxvbmcpIGFkai0+aG9sZF90aW1lKTsKIAogICAvKiA4LjIuNS4yIGEpIGEgbWF0Y2ggd2FzIGRldGVjdGVkICovCi0gIGlmIChhcmVhX21hdGNoIChjaXJjdWl0LT5hcmVhLT5hcmVhX2FkZHJzLCB0bHZzLmFyZWFfYWRkcnMpKSB7Ci0gICAgLyogOC4yLjUuMiBhKSAyKSBJZiB0aGUgc3lzdGVtIGlzIEwxIC0gdGFibGUgNSAqLwotICAgIGlmIChjaXJjdWl0LT5hcmVhLT5pc190eXBlID09IElTX0xFVkVMXzEpIHsKLSAgICAgIHN3aXRjaCAoaGRyLT5jaXJjdWl0X3QpIHsKLSAgICAgIGNhc2UgSVNfTEVWRUxfMToKLSAgICAgIGNhc2UgSVNfTEVWRUxfMV9BTkRfMjoKLSAgICAgICAgaWYgKGFkai0+YWRqX3N0YXRlICE9IElTSVNfQURKX1VQKSB7Ci0gICAgICAgICAgLyogKDQpIGFkaiBzdGF0ZSB1cCAqLwotICAgICAgICAgIGlzaXNfYWRqX3N0YXRlX2NoYW5nZSAoYWRqLCBJU0lTX0FESl9VUCwgTlVMTCk7Ci0gICAgICAgICAgLyogKDUpIGFkaiB1c2FnZSBsZXZlbCAxICovCi0gICAgICAgICAgYWRqLT5hZGpfdXNhZ2UgPSBJU0lTX0FESl9MRVZFTDE7Ci0gICAgICAgIH0gZWxzZSBpZiAoYWRqLT5hZGpfdXNhZ2UgPT0gSVNJU19BREpfTEVWRUwxKSB7Ci0gICAgICAgICAgOyAvKiBhY2NlcHQgKi8KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSVNfTEVWRUxfMjoKLSAgICAgICAgaWYgKGFkai0+YWRqX3N0YXRlICE9IElTSVNfQURKX1VQKSB7Ci0gICAgICAgICAgLyogKDcpIHJlamVjdCAtIHdyb25nIHN5c3RlbSB0eXBlIGV2ZW50ICovCi0gICAgICAgICAgemxvZ193YXJuICgid3JvbmdTeXN0ZW1UeXBlIik7Ci0gICAgICAgICAgcmV0dXJuIElTSVNfV0FSTklORzsgLyogUmVqZWN0ICovCi0gICAgICAgIH0gZWxzZSBpZiAoYWRqLT5hZGpfdXNhZ2UgPT0gSVNJU19BREpfTEVWRUwxKSB7Ci0gICAgICAgICAgLyogKDYpIGRvd24gLSB3cm9uZyBzeXN0ZW0gKi8KLSAgICAgICAgICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfRE9XTiwgIldyb25nIFN5c3RlbSIpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KKyAgaWYgKGFyZWFfbWF0Y2ggKGNpcmN1aXQtPmFyZWEtPmFyZWFfYWRkcnMsIHRsdnMuYXJlYV9hZGRycykpCisgICAgeworICAgICAgLyogOC4yLjUuMiBhKSAyKSBJZiB0aGUgc3lzdGVtIGlzIEwxIC0gdGFibGUgNSAqLworICAgICAgaWYgKGNpcmN1aXQtPmFyZWEtPmlzX3R5cGUgPT0gSVNfTEVWRUxfMSkKKwl7CisJICBzd2l0Y2ggKGhkci0+Y2lyY3VpdF90KQorCSAgICB7CisJICAgIGNhc2UgSVNfTEVWRUxfMToKKwkgICAgY2FzZSBJU19MRVZFTF8xX0FORF8yOgorCSAgICAgIGlmIChhZGotPmFkal9zdGF0ZSAhPSBJU0lTX0FESl9VUCkKKwkJeworCQkgIC8qICg0KSBhZGogc3RhdGUgdXAgKi8KKwkJICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfVVAsIE5VTEwpOworCQkgIC8qICg1KSBhZGogdXNhZ2UgbGV2ZWwgMSAqLworCQkgIGFkai0+YWRqX3VzYWdlID0gSVNJU19BREpfTEVWRUwxOworCQl9CisJICAgICAgZWxzZSBpZiAoYWRqLT5hZGpfdXNhZ2UgPT0gSVNJU19BREpfTEVWRUwxKQorCQl7CisJCSAgOwkJLyogYWNjZXB0ICovCisJCX0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBJU19MRVZFTF8yOgorCSAgICAgIGlmIChhZGotPmFkal9zdGF0ZSAhPSBJU0lTX0FESl9VUCkKKwkJeworCQkgIC8qICg3KSByZWplY3QgLSB3cm9uZyBzeXN0ZW0gdHlwZSBldmVudCAqLworCQkgIHpsb2dfd2FybiAoIndyb25nU3lzdGVtVHlwZSIpOworCQkgIHJldHVybiBJU0lTX1dBUk5JTkc7CS8qIFJlamVjdCAqLworCQl9CisJICAgICAgZWxzZSBpZiAoYWRqLT5hZGpfdXNhZ2UgPT0gSVNJU19BREpfTEVWRUwxKQorCQl7CisJCSAgLyogKDYpIGRvd24gLSB3cm9uZyBzeXN0ZW0gKi8KKwkJICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfRE9XTiwgIldyb25nIFN5c3RlbSIpOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CiAKLSAgICAvKiA4LjIuNS4yIGEpIDMpIElmIHRoZSBzeXN0ZW0gaXMgTDFMMiAtIHRhYmxlIDYgKi8KLSAgICBpZiAoY2lyY3VpdC0+YXJlYS0+aXNfdHlwZSA9PSBJU19MRVZFTF8xX0FORF8yKSB7Ci0gICAgICBzd2l0Y2ggKGhkci0+Y2lyY3VpdF90KSB7Ci0gICAgICBjYXNlIElTX0xFVkVMXzE6Ci0gICAgICAgIGlmIChhZGotPmFkal9zdGF0ZSAhPSBJU0lTX0FESl9VUCkgewotICAgICAgICAgIC8qICg2KSBhZGogc3RhdGUgdXAgKi8KLSAgICAgICAgICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfVVAsIE5VTEwpOwotICAgICAgICAgIC8qICg3KSBhZGogdXNhZ2UgbGV2ZWwgMSAqLwotICAgICAgICAgIGFkai0+YWRqX3VzYWdlID0gSVNJU19BREpfTEVWRUwxOwotICAgICAgICB9IGVsc2UgaWYgKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMSkgewotICAgICAgICAgIDsgLyogYWNjZXB0ICovCi0gICAgICAgIH0gZWxzZSBpZiAoKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMUFORDIpIHx8Ci0gICAgICAgICAgICAgICAgICAgKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMikpIHsKLSAgICAgICAgICAvKiAoOCkgZG93biAtIHdyb25nIHN5c3RlbSAqLwotICAgICAgICAgIGlzaXNfYWRqX3N0YXRlX2NoYW5nZSAoYWRqLCBJU0lTX0FESl9ET1dOLCAiV3JvbmcgU3lzdGVtIik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIElTX0xFVkVMXzI6Ci0gICAgICAgIGlmIChhZGotPmFkal9zdGF0ZSAhPSBJU0lTX0FESl9VUCkgewotICAgICAgICAgIC8qICg2KSBhZGogc3RhdGUgdXAgKi8KLSAgICAgICAgICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfVVAsIE5VTEwpOwotICAgICAgICAgIC8qICg5KSBhZGogdXNhZ2UgbGV2ZWwgMiAqLwotICAgICAgICAgIGFkai0+YWRqX3VzYWdlID0gSVNJU19BREpfTEVWRUwyOwotICAgICAgICB9IGVsc2UgaWYgKChhZGotPmFkal91c2FnZSA9PSBJU0lTX0FESl9MRVZFTDEpIHx8Ci0gICAgICAgICAgICAgICAgICAgKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMUFORDIpKSB7Ci0gICAgICAgICAgLyogKDgpIGRvd24gLSB3cm9uZyBzeXN0ZW0gKi8KLSAgICAgICAgICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfRE9XTiwgIldyb25nIFN5c3RlbSIpOwotICAgICAgICB9IGVsc2UgaWYgKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMikgewotICAgICAgICAgIDsgLyogQWNjZXB0ICovCi0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIElTX0xFVkVMXzFfQU5EXzI6Ci0gICAgICAgIGlmIChhZGotPmFkal9zdGF0ZSAhPSBJU0lTX0FESl9VUCkgewotICAgICAgICAgIC8qICg2KSBhZGogc3RhdGUgdXAgKi8KLSAgICAgICAgICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfVVAsIE5VTEwpOwotICAgICAgICAgIC8qICgxMCkgYWRqIHVzYWdlIGxldmVsIDEgKi8KLSAgICAgICAgICBhZGotPmFkal91c2FnZSA9IElTSVNfQURKX0xFVkVMMUFORDI7Ci0gICAgICAgIH0gZWxzZSBpZiAoKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMSkgfHwKLSAgICAgICAgICAgICAgICAgICAoYWRqLT5hZGpfdXNhZ2UgPT0gSVNJU19BREpfTEVWRUwyKSkgewotICAgICAgICAgIC8qICg4KSBkb3duIC0gd3Jvbmcgc3lzdGVtICovCi0gICAgICAgICAgaXNpc19hZGpfc3RhdGVfY2hhbmdlIChhZGosIElTSVNfQURKX0RPV04sICJXcm9uZyBTeXN0ZW0iKTsKLSAgICAgICAgfSBlbHNlIGlmIChhZGotPmFkal91c2FnZSA9PSBJU0lTX0FESl9MRVZFTDFBTkQyKSB7Ci0gICAgICAgICAgOyAvKiBBY2NlcHQgKi8KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9CisgICAgICAvKiA4LjIuNS4yIGEpIDMpIElmIHRoZSBzeXN0ZW0gaXMgTDFMMiAtIHRhYmxlIDYgKi8KKyAgICAgIGlmIChjaXJjdWl0LT5hcmVhLT5pc190eXBlID09IElTX0xFVkVMXzFfQU5EXzIpCisJeworCSAgc3dpdGNoIChoZHItPmNpcmN1aXRfdCkKKwkgICAgeworCSAgICBjYXNlIElTX0xFVkVMXzE6CisJICAgICAgaWYgKGFkai0+YWRqX3N0YXRlICE9IElTSVNfQURKX1VQKQorCQl7CisJCSAgLyogKDYpIGFkaiBzdGF0ZSB1cCAqLworCQkgIGlzaXNfYWRqX3N0YXRlX2NoYW5nZSAoYWRqLCBJU0lTX0FESl9VUCwgTlVMTCk7CisJCSAgLyogKDcpIGFkaiB1c2FnZSBsZXZlbCAxICovCisJCSAgYWRqLT5hZGpfdXNhZ2UgPSBJU0lTX0FESl9MRVZFTDE7CisJCX0KKwkgICAgICBlbHNlIGlmIChhZGotPmFkal91c2FnZSA9PSBJU0lTX0FESl9MRVZFTDEpCisJCXsKKwkJICA7CQkvKiBhY2NlcHQgKi8KKwkJfQorCSAgICAgIGVsc2UgaWYgKChhZGotPmFkal91c2FnZSA9PSBJU0lTX0FESl9MRVZFTDFBTkQyKSB8fAorCQkgICAgICAgKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMikpCisJCXsKKwkJICAvKiAoOCkgZG93biAtIHdyb25nIHN5c3RlbSAqLworCQkgIGlzaXNfYWRqX3N0YXRlX2NoYW5nZSAoYWRqLCBJU0lTX0FESl9ET1dOLCAiV3JvbmcgU3lzdGVtIik7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBJU19MRVZFTF8yOgorCSAgICAgIGlmIChhZGotPmFkal9zdGF0ZSAhPSBJU0lTX0FESl9VUCkKKwkJeworCQkgIC8qICg2KSBhZGogc3RhdGUgdXAgKi8KKwkJICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfVVAsIE5VTEwpOworCQkgIC8qICg5KSBhZGogdXNhZ2UgbGV2ZWwgMiAqLworCQkgIGFkai0+YWRqX3VzYWdlID0gSVNJU19BREpfTEVWRUwyOworCQl9CisJICAgICAgZWxzZSBpZiAoKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMSkgfHwKKwkJICAgICAgIChhZGotPmFkal91c2FnZSA9PSBJU0lTX0FESl9MRVZFTDFBTkQyKSkKKwkJeworCQkgIC8qICg4KSBkb3duIC0gd3Jvbmcgc3lzdGVtICovCisJCSAgaXNpc19hZGpfc3RhdGVfY2hhbmdlIChhZGosIElTSVNfQURKX0RPV04sICJXcm9uZyBTeXN0ZW0iKTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMikKKwkJeworCQkgIDsJCS8qIEFjY2VwdCAqLworCQl9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgSVNfTEVWRUxfMV9BTkRfMjoKKwkgICAgICBpZiAoYWRqLT5hZGpfc3RhdGUgIT0gSVNJU19BREpfVVApCisJCXsKKwkJICAvKiAoNikgYWRqIHN0YXRlIHVwICovCisJCSAgaXNpc19hZGpfc3RhdGVfY2hhbmdlIChhZGosIElTSVNfQURKX1VQLCBOVUxMKTsKKwkJICAvKiAoMTApIGFkaiB1c2FnZSBsZXZlbCAxICovCisJCSAgYWRqLT5hZGpfdXNhZ2UgPSBJU0lTX0FESl9MRVZFTDFBTkQyOworCQl9CisJICAgICAgZWxzZSBpZiAoKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMSkgfHwKKwkJICAgICAgIChhZGotPmFkal91c2FnZSA9PSBJU0lTX0FESl9MRVZFTDIpKQorCQl7CisJCSAgLyogKDgpIGRvd24gLSB3cm9uZyBzeXN0ZW0gKi8KKwkJICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfRE9XTiwgIldyb25nIFN5c3RlbSIpOworCQl9CisJICAgICAgZWxzZSBpZiAoYWRqLT5hZGpfdXNhZ2UgPT0gSVNJU19BREpfTEVWRUwxQU5EMikKKwkJeworCQkgIDsJCS8qIEFjY2VwdCAqLworCQl9CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CiAKLSAgICAvKiA4LjIuNS4yIGEpIDQpIElmIHRoZSBzeXN0ZW0gaXMgTDIgLSB0YWJsZSA3ICovCi0gICAgaWYgKGNpcmN1aXQtPmFyZWEtPmlzX3R5cGUgPT0gSVNfTEVWRUxfMikgewotICAgICAgc3dpdGNoIChoZHItPmNpcmN1aXRfdCkgewotICAgICAgY2FzZSBJU19MRVZFTF8xOgotICAgICAgICBpZiAoYWRqLT5hZGpfc3RhdGUgIT0gSVNJU19BREpfVVApIHsKLSAgICAgICAgICAvKiAoNSkgcmVqZWN0IC0gd3Jvbmcgc3lzdGVtIHR5cGUgZXZlbnQgKi8KLSAgICAgICAgICB6bG9nX3dhcm4gKCJ3cm9uZ1N5c3RlbVR5cGUiKTsKLSAgICAgICAgICByZXR1cm4gSVNJU19XQVJOSU5HOyAvKiBSZWplY3QgKi8KLSAgICAgICAgfSBlbHNlIGlmICgoYWRqLT5hZGpfdXNhZ2UgPT0gSVNJU19BREpfTEVWRUwxQU5EMikgfHwKLSAgICAgICAgICAgICAgICAgICAoYWRqLT5hZGpfdXNhZ2UgPT0gSVNJU19BREpfTEVWRUwyKSkgewotICAgICAgICAgIC8qICg2KSBkb3duIC0gd3Jvbmcgc3lzdGVtICovCi0gICAgICAgICAgaXNpc19hZGpfc3RhdGVfY2hhbmdlIChhZGosIElTSVNfQURKX0RPV04sICJXcm9uZyBTeXN0ZW0iKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSVNfTEVWRUxfMV9BTkRfMjoKLSAgICAgIGNhc2UgSVNfTEVWRUxfMjoKLSAgICAgICAgaWYgKGFkai0+YWRqX3N0YXRlICE9IElTSVNfQURKX1VQKSB7Ci0gICAgICAgICAgLyogKDcpIGFkaiBzdGF0ZSB1cCAqLwotICAgICAgICAgIGlzaXNfYWRqX3N0YXRlX2NoYW5nZSAoYWRqLCBJU0lTX0FESl9VUCwgTlVMTCk7Ci0gICAgICAgICAgLyogKDgpIGFkaiB1c2FnZSBsZXZlbCAyICovCi0gICAgICAgICAgYWRqLT5hZGpfdXNhZ2UgPSBJU0lTX0FESl9MRVZFTDI7Ci0gICAgICAgIH0gZWxzZSBpZiAoYWRqLT5hZGpfdXNhZ2UgPT0gSVNJU19BREpfTEVWRUwxQU5EMikgewotICAgICAgICAgIC8qICg2KSBkb3duIC0gd3Jvbmcgc3lzdGVtICovCi0gICAgICAgICAgaXNpc19hZGpfc3RhdGVfY2hhbmdlIChhZGosIElTSVNfQURKX0RPV04sICJXcm9uZyBTeXN0ZW0iKTsKLSAgICAgICAgfSBlbHNlIGlmIChhZGotPmFkal91c2FnZSA9PSBJU0lTX0FESl9MRVZFTDIpIHsKLSAgICAgICAgICA7IC8qIEFjY2VwdCAqLwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQorICAgICAgLyogOC4yLjUuMiBhKSA0KSBJZiB0aGUgc3lzdGVtIGlzIEwyIC0gdGFibGUgNyAqLworICAgICAgaWYgKGNpcmN1aXQtPmFyZWEtPmlzX3R5cGUgPT0gSVNfTEVWRUxfMikKKwl7CisJICBzd2l0Y2ggKGhkci0+Y2lyY3VpdF90KQorCSAgICB7CisJICAgIGNhc2UgSVNfTEVWRUxfMToKKwkgICAgICBpZiAoYWRqLT5hZGpfc3RhdGUgIT0gSVNJU19BREpfVVApCisJCXsKKwkJICAvKiAoNSkgcmVqZWN0IC0gd3Jvbmcgc3lzdGVtIHR5cGUgZXZlbnQgKi8KKwkJICB6bG9nX3dhcm4gKCJ3cm9uZ1N5c3RlbVR5cGUiKTsKKwkJICByZXR1cm4gSVNJU19XQVJOSU5HOwkvKiBSZWplY3QgKi8KKwkJfQorCSAgICAgIGVsc2UgaWYgKChhZGotPmFkal91c2FnZSA9PSBJU0lTX0FESl9MRVZFTDFBTkQyKSB8fAorCQkgICAgICAgKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMikpCisJCXsKKwkJICAvKiAoNikgZG93biAtIHdyb25nIHN5c3RlbSAqLworCQkgIGlzaXNfYWRqX3N0YXRlX2NoYW5nZSAoYWRqLCBJU0lTX0FESl9ET1dOLCAiV3JvbmcgU3lzdGVtIik7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBJU19MRVZFTF8xX0FORF8yOgorCSAgICBjYXNlIElTX0xFVkVMXzI6CisJICAgICAgaWYgKGFkai0+YWRqX3N0YXRlICE9IElTSVNfQURKX1VQKQorCQl7CisJCSAgLyogKDcpIGFkaiBzdGF0ZSB1cCAqLworCQkgIGlzaXNfYWRqX3N0YXRlX2NoYW5nZSAoYWRqLCBJU0lTX0FESl9VUCwgTlVMTCk7CisJCSAgLyogKDgpIGFkaiB1c2FnZSBsZXZlbCAyICovCisJCSAgYWRqLT5hZGpfdXNhZ2UgPSBJU0lTX0FESl9MRVZFTDI7CisJCX0KKwkgICAgICBlbHNlIGlmIChhZGotPmFkal91c2FnZSA9PSBJU0lTX0FESl9MRVZFTDFBTkQyKQorCQl7CisJCSAgLyogKDYpIGRvd24gLSB3cm9uZyBzeXN0ZW0gKi8KKwkJICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfRE9XTiwgIldyb25nIFN5c3RlbSIpOworCQl9CisJICAgICAgZWxzZSBpZiAoYWRqLT5hZGpfdXNhZ2UgPT0gSVNJU19BREpfTEVWRUwyKQorCQl7CisJCSAgOwkJLyogQWNjZXB0ICovCisJCX0KKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KICAgICB9Ci0gIH0KICAgLyogOC4yLjUuMiBiKSBpZiBubyBtYXRjaCB3YXMgZGV0ZWN0ZWQgKi8KICAgZWxzZQotICB7Ci0gICAgaWYgKGNpcmN1aXQtPmFyZWEtPmlzX3R5cGUgPT0gSVNfTEVWRUxfMSkgewotICAgICAgLyogOC4yLjUuMiBiKSAxKSBpc190eXBlIEwxIGFuZCBhZGogaXMgbm90IHVwICovCi0gICAgICBpZiAoYWRqLT5hZGpfc3RhdGUgIT0gSVNJU19BREpfVVApIHsKLSAgICAgICAgaXNpc19hZGpfc3RhdGVfY2hhbmdlIChhZGosIElTSVNfQURKX0RPV04sICJBcmVhIE1pc21hdGNoIik7Ci0gICAgICAvKiA4LjIuNS4yIGIpIDIpaXNfdHlwZSBMMSBhbmQgYWRqIGlzIHVwICovCi0gICAgICB9IGVsc2UgewotICAgICAgICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfRE9XTiwgIkRvd24gLSBBcmVhIE1pc21hdGNoIik7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIDguMi41LjIgYiAzIElmIHRoZSBzeXN0ZW0gaXMgTDIgb3IgTDFMMiAtIHRhYmxlIDggKi8KLSAgICBlbHNlCiAgICAgewotICAgICAgc3dpdGNoIChoZHItPmNpcmN1aXRfdCkgewotICAgICAgY2FzZSBJU19MRVZFTF8xOgotICAgICAgICBpZiAoYWRqLT5hZGpfc3RhdGUgIT0gSVNJU19BREpfVVApIHsKLSAgICAgICAgICAvKiAoNikgcmVqZWN0IC0gQXJlYSBNaXNtYXRjaCBldmVudCAqLwotICAgICAgICAgIHpsb2dfd2FybiAoIkFyZWFNaXNtYXRjaCIpOwotICAgICAgICAgIHJldHVybiBJU0lTX1dBUk5JTkc7IC8qIFJlamVjdCAqLwotICAgICAgICB9IGVsc2UgaWYgKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMSkgewotICAgICAgICAgIC8qICg3KSBkb3duIC0gYXJlYSBtaXNtYXRjaCAqLwotICAgICAgICAgIGlzaXNfYWRqX3N0YXRlX2NoYW5nZSAoYWRqLCBJU0lTX0FESl9ET1dOLCAiQXJlYSBNaXNtYXRjaCIpOworICAgICAgaWYgKGNpcmN1aXQtPmFyZWEtPmlzX3R5cGUgPT0gSVNfTEVWRUxfMSkKKwl7CisJICAvKiA4LjIuNS4yIGIpIDEpIGlzX3R5cGUgTDEgYW5kIGFkaiBpcyBub3QgdXAgKi8KKwkgIGlmIChhZGotPmFkal9zdGF0ZSAhPSBJU0lTX0FESl9VUCkKKwkgICAgeworCSAgICAgIGlzaXNfYWRqX3N0YXRlX2NoYW5nZSAoYWRqLCBJU0lTX0FESl9ET1dOLCAiQXJlYSBNaXNtYXRjaCIpOworCSAgICAgIC8qIDguMi41LjIgYikgMilpc190eXBlIEwxIGFuZCBhZGogaXMgdXAgKi8KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaXNpc19hZGpfc3RhdGVfY2hhbmdlIChhZGosIElTSVNfQURKX0RPV04sCisJCQkJICAgICAiRG93biAtIEFyZWEgTWlzbWF0Y2giKTsKKwkgICAgfQorCX0KKyAgICAgIC8qIDguMi41LjIgYiAzIElmIHRoZSBzeXN0ZW0gaXMgTDIgb3IgTDFMMiAtIHRhYmxlIDggKi8KKyAgICAgIGVsc2UKKwl7CisJICBzd2l0Y2ggKGhkci0+Y2lyY3VpdF90KQorCSAgICB7CisJICAgIGNhc2UgSVNfTEVWRUxfMToKKwkgICAgICBpZiAoYWRqLT5hZGpfc3RhdGUgIT0gSVNJU19BREpfVVApCisJCXsKKwkJICAvKiAoNikgcmVqZWN0IC0gQXJlYSBNaXNtYXRjaCBldmVudCAqLworCQkgIHpsb2dfd2FybiAoIkFyZWFNaXNtYXRjaCIpOworCQkgIHJldHVybiBJU0lTX1dBUk5JTkc7CS8qIFJlamVjdCAqLworCQl9CisJICAgICAgZWxzZSBpZiAoYWRqLT5hZGpfdXNhZ2UgPT0gSVNJU19BREpfTEVWRUwxKQorCQl7CisJCSAgLyogKDcpIGRvd24gLSBhcmVhIG1pc21hdGNoICovCisJCSAgaXNpc19hZGpfc3RhdGVfY2hhbmdlIChhZGosIElTSVNfQURKX0RPV04sICJBcmVhIE1pc21hdGNoIik7CiAKLSAgICAgICAgfSBlbHNlIGlmICgoYWRqLT5hZGpfdXNhZ2UgPT0gSVNJU19BREpfTEVWRUwxQU5EMikgfHwKLSAgICAgICAgICAgICAgICAgICAoYWRqLT5hZGpfdXNhZ2UgPT0gSVNJU19BREpfTEVWRUwyKSkgewotICAgICAgICAgIC8qICg3KSBkb3duIC0gd3Jvbmcgc3lzdGVtICovCi0gICAgICAgICAgaXNpc19hZGpfc3RhdGVfY2hhbmdlIChhZGosIElTSVNfQURKX0RPV04sICJXcm9uZyBTeXN0ZW0iKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSVNfTEVWRUxfMV9BTkRfMjoKLSAgICAgIGNhc2UgSVNfTEVWRUxfMjoKLSAgICAgICAgaWYgKGFkai0+YWRqX3N0YXRlICE9IElTSVNfQURKX1VQKSB7Ci0gICAgICAgICAgLyogKDgpIGFkaiBzdGF0ZSB1cCAqLwotICAgICAgICAgIGlzaXNfYWRqX3N0YXRlX2NoYW5nZSAoYWRqLCBJU0lTX0FESl9VUCwgTlVMTCk7Ci0gICAgICAgICAgLyogKDkpIGFkaiB1c2FnZSBsZXZlbCAyICovCi0gICAgICAgICAgYWRqLT5hZGpfdXNhZ2UgPSBJU0lTX0FESl9MRVZFTDI7Ci0gICAgICAgIH0gZWxzZSBpZiAoYWRqLT5hZGpfdXNhZ2UgPT0gSVNJU19BREpfTEVWRUwxKSB7Ci0gICAgICAgICAgLyogKDcpIGRvd24gLSB3cm9uZyBzeXN0ZW0gKi8KLSAgICAgICAgICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfRE9XTiwgIldyb25nIFN5c3RlbSIpOwotICAgICAgICB9IGVsc2UgaWYgKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMUFORDIpIHsKLSAgICAgICAgICBpZiAoaGRyLT5jaXJjdWl0X3QgPT0gSVNfTEVWRUxfMikgewotICAgICAgICAgICAgLyogKDcpIGRvd24gLSB3cm9uZyBzeXN0ZW0gKi8KLSAgICAgICAgICAgIGlzaXNfYWRqX3N0YXRlX2NoYW5nZSAoYWRqLCBJU0lTX0FESl9ET1dOLCAiV3JvbmcgU3lzdGVtIik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qICg3KSBkb3duIC0gYXJlYSBtaXNtYXRjaCAqLwotICAgICAgICAgICAgaXNpc19hZGpfc3RhdGVfY2hhbmdlIChhZGosIElTSVNfQURKX0RPV04sICJBcmVhIE1pc21hdGNoIik7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMikgewotICAgICAgICAgIDsgLyogQWNjZXB0ICovCi0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9CisJCX0KKwkgICAgICBlbHNlIGlmICgoYWRqLT5hZGpfdXNhZ2UgPT0gSVNJU19BREpfTEVWRUwxQU5EMikgfHwKKwkJICAgICAgIChhZGotPmFkal91c2FnZSA9PSBJU0lTX0FESl9MRVZFTDIpKQorCQl7CisJCSAgLyogKDcpIGRvd24gLSB3cm9uZyBzeXN0ZW0gKi8KKwkJICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfRE9XTiwgIldyb25nIFN5c3RlbSIpOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgSVNfTEVWRUxfMV9BTkRfMjoKKwkgICAgY2FzZSBJU19MRVZFTF8yOgorCSAgICAgIGlmIChhZGotPmFkal9zdGF0ZSAhPSBJU0lTX0FESl9VUCkKKwkJeworCQkgIC8qICg4KSBhZGogc3RhdGUgdXAgKi8KKwkJICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfVVAsIE5VTEwpOworCQkgIC8qICg5KSBhZGogdXNhZ2UgbGV2ZWwgMiAqLworCQkgIGFkai0+YWRqX3VzYWdlID0gSVNJU19BREpfTEVWRUwyOworCQl9CisJICAgICAgZWxzZSBpZiAoYWRqLT5hZGpfdXNhZ2UgPT0gSVNJU19BREpfTEVWRUwxKQorCQl7CisJCSAgLyogKDcpIGRvd24gLSB3cm9uZyBzeXN0ZW0gKi8KKwkJICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfRE9XTiwgIldyb25nIFN5c3RlbSIpOworCQl9CisJICAgICAgZWxzZSBpZiAoYWRqLT5hZGpfdXNhZ2UgPT0gSVNJU19BREpfTEVWRUwxQU5EMikKKwkJeworCQkgIGlmIChoZHItPmNpcmN1aXRfdCA9PSBJU19MRVZFTF8yKQorCQkgICAgeworCQkgICAgICAvKiAoNykgZG93biAtIHdyb25nIHN5c3RlbSAqLworCQkgICAgICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfRE9XTiwKKwkJCQkJICAgICAiV3JvbmcgU3lzdGVtIik7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAvKiAoNykgZG93biAtIGFyZWEgbWlzbWF0Y2ggKi8KKwkJICAgICAgaXNpc19hZGpfc3RhdGVfY2hhbmdlIChhZGosIElTSVNfQURKX0RPV04sCisJCQkJCSAgICAgIkFyZWEgTWlzbWF0Y2giKTsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UgaWYgKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMikKKwkJeworCQkgIDsJCS8qIEFjY2VwdCAqLworCQl9CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CiAgICAgfQotICB9CiAgIC8qIDguMi41LjIgYykgaWYgdGhlIGFjdGlvbiB3YXMgdXAgLSBjb21wYXJpbmcgY2lyY3VpdCBJRHMgKi8KICAgLyogRklYTUUgLSBNaXNzaW5nIHBhcnRzICovCiAKLQogICAvKiBzb21lIG9mIG15IG93biB1bmRlcnN0YW5kaW5nIG9mIHRoZSBJU08sIHdoeSB0aGUgaGVjayBkb2VzCiAgICAqIGl0IG5vdCBzYXkgd2hhdCBzaG91bGQgSSBjaGFuZ2UgdGhlIHN5c3RlbV90eXBlIHRvLi4uCiAgICAqLwotICBzd2l0Y2ggKGFkai0+YWRqX3VzYWdlKSB7CisgIHN3aXRjaCAoYWRqLT5hZGpfdXNhZ2UpCisgICAgewogICAgIGNhc2UgSVNJU19BREpfTEVWRUwxOgogICAgICAgYWRqLT5zeXNfdHlwZSA9IElTSVNfU1lTVFlQRV9MMV9JUzsKICAgICAgIGJyZWFrOwpAQCAtNTY4LDcgKzY0NCw3IEBACiAgICAgY2FzZSBJU0lTX0FESl9OT05FOgogICAgICAgYWRqLT5zeXNfdHlwZSA9IElTSVNfU1lTVFlQRV9VTktOT1dOOwogICAgICAgYnJlYWs7Ci0gIH0KKyAgICB9CiAKICAgYWRqLT5jaXJjdWl0X3QgPSBoZHItPmNpcmN1aXRfdDsKICAgYWRqLT5sZXZlbCA9IGhkci0+Y2lyY3VpdF90OwpAQCAtNTc4LDEyICs2NTQsMTEgQEAKICAgcmV0dXJuIHJldHZhbDsKIH0KIAotCiAvKgogICogUHJvY2VzcyBJUy1JUyBMQU4gTGV2ZWwgMS8yIEhlbGxvIFBEVQogICovCi1zdGF0aWMgaW50IAotcHJvY2Vzc19sYW5faGVsbG8gKGludCBsZXZlbCwgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgdV9jaGFyICpzc25wYSkKK3N0YXRpYyBpbnQKK3Byb2Nlc3NfbGFuX2hlbGxvIChpbnQgbGV2ZWwsIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsIHVfY2hhciAqIHNzbnBhKQogewogICBpbnQgcmV0dmFsID0gSVNJU19PSzsKICAgc3RydWN0IGlzaXNfbGFuX2hlbGxvX2hkciBoZHI7CkBAIC01OTMsMzUgKzY2OCw0MSBAQAogICB1X2NoYXIgKnNucGE7CiAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKIAotICBpZiAoKHN0cmVhbV9nZXRfZW5kcCAoY2lyY3VpdC0+cmN2X3N0cmVhbSkgLSAKLSAgICAgICBzdHJlYW1fZ2V0X2dldHAgKGNpcmN1aXQtPnJjdl9zdHJlYW0pKSA8IElTSVNfTEFOSEVMTE9fSERSTEVOKSB7Ci0gICAgemxvZ193YXJuICgiUGFja2V0IHRvbyBzaG9ydCIpOwotICAgIHJldHVybiBJU0lTX1dBUk5JTkc7Ci0gIH0KLQotICBpZiAoY2lyY3VpdC0+ZXh0X2RvbWFpbikgewotICAgIHpsb2dfaW5mbyAoImxldmVsICVkIExBTiBIZWxsbyByZWNlaXZlZCBvdmVyIGNpcmN1aXQgd2l0aCAiCi0JICAgICAgICJleHRlcm5hbERvbWFpbiA9IHRydWUiLCBsZXZlbCk7Ci0gICAgcmV0dXJuIElTSVNfV0FSTklORzsKLSAgfQotCi0gIGlmICghYWNjZXB0X2xldmVsIChsZXZlbCwgY2lyY3VpdC0+Y2lyY3VpdF9pc190eXBlKSkgewotICAgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19BREpfUEFDS0VUUykgewotICAgICAgemxvZ19pbmZvICgiSVNJUy1BZGogKCVzKTogSW50ZXJmYWNlIGxldmVsIG1pc21hdGNoLCAlcyIsCi0gICAgICAgICAgICAgICAgIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLCBjaXJjdWl0LT5pbnRlcmZhY2UtPm5hbWUpOworICBpZiAoKHN0cmVhbV9nZXRfZW5kcCAoY2lyY3VpdC0+cmN2X3N0cmVhbSkgLQorICAgICAgIHN0cmVhbV9nZXRfZ2V0cCAoY2lyY3VpdC0+cmN2X3N0cmVhbSkpIDwgSVNJU19MQU5IRUxMT19IRFJMRU4pCisgICAgeworICAgICAgemxvZ193YXJuICgiUGFja2V0IHRvbyBzaG9ydCIpOworICAgICAgcmV0dXJuIElTSVNfV0FSTklORzsKICAgICB9Ci0gICAgcmV0dXJuIElTSVNfV0FSTklORzsKLSAgfQorCisgIGlmIChjaXJjdWl0LT5leHRfZG9tYWluKQorICAgIHsKKyAgICAgIHpsb2dfaW5mbyAoImxldmVsICVkIExBTiBIZWxsbyByZWNlaXZlZCBvdmVyIGNpcmN1aXQgd2l0aCAiCisJCSAiZXh0ZXJuYWxEb21haW4gPSB0cnVlIiwgbGV2ZWwpOworICAgICAgcmV0dXJuIElTSVNfV0FSTklORzsKKyAgICB9CisKKyAgaWYgKCFhY2NlcHRfbGV2ZWwgKGxldmVsLCBjaXJjdWl0LT5jaXJjdWl0X2lzX3R5cGUpKQorICAgIHsKKyAgICAgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19BREpfUEFDS0VUUykKKwl7CisJICB6bG9nX2luZm8gKCJJU0lTLUFkaiAoJXMpOiBJbnRlcmZhY2UgbGV2ZWwgbWlzbWF0Y2gsICVzIiwKKwkJICAgICBjaXJjdWl0LT5hcmVhLT5hcmVhX3RhZywgY2lyY3VpdC0+aW50ZXJmYWNlLT5uYW1lKTsKKwl9CisgICAgICByZXR1cm4gSVNJU19XQVJOSU5HOworICAgIH0KIAogI2lmIDAKICAgLyogQ2lzY28ncyBkZWJ1ZyBtZXNzYWdlIGNvbXBhdGFiaWxpdHkgKi8KLSAgaWYgKCFhY2NlcHRfbGV2ZWwgKGxldmVsLCBjaXJjdWl0LT5hcmVhLT5pc190eXBlKSkgewotICAgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19BREpfUEFDS0VUUykgewotICAgICAgemxvZ19pbmZvICgiSVNJUy1BZGogKCVzKTogaXMgdHlwZSBtaXNtYXRjaCIsCi0gICAgICAgICAgICAgICAgIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnKTsKKyAgaWYgKCFhY2NlcHRfbGV2ZWwgKGxldmVsLCBjaXJjdWl0LT5hcmVhLT5pc190eXBlKSkKKyAgICB7CisgICAgICBpZiAoaXNpcy0+ZGVidWdzICYgREVCVUdfQURKX1BBQ0tFVFMpCisJeworCSAgemxvZ19pbmZvICgiSVNJUy1BZGogKCVzKTogaXMgdHlwZSBtaXNtYXRjaCIsCisJCSAgICAgY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcpOworCX0KKyAgICAgIHJldHVybiBJU0lTX1dBUk5JTkc7CiAgICAgfQotICAgIHJldHVybiBJU0lTX1dBUk5JTkc7Ci0gIH0KICNlbmRpZgogICAvKgogICAgKiBGaWxsIHRoZSBoZWFkZXIKQEAgLTYyOSwxNiArNzEwLDE3IEBACiAgIGhkci5jaXJjdWl0X3QgPSBzdHJlYW1fZ2V0YyAoY2lyY3VpdC0+cmN2X3N0cmVhbSk7CiAgIHN0cmVhbV9nZXQgKGhkci5zb3VyY2VfaWQsIGNpcmN1aXQtPnJjdl9zdHJlYW0sIElTSVNfU1lTX0lEX0xFTik7CiAgIGhkci5ob2xkX3RpbWUgPSBzdHJlYW1fZ2V0dyAoY2lyY3VpdC0+cmN2X3N0cmVhbSk7Ci0gIGhkci5wZHVfbGVuICAgPSBzdHJlYW1fZ2V0dyAoY2lyY3VpdC0+cmN2X3N0cmVhbSk7Ci0gIGhkci5wcmlvICAgICAgPSBzdHJlYW1fZ2V0YyAoY2lyY3VpdC0+cmN2X3N0cmVhbSk7CisgIGhkci5wZHVfbGVuID0gc3RyZWFtX2dldHcgKGNpcmN1aXQtPnJjdl9zdHJlYW0pOworICBoZHIucHJpbyA9IHN0cmVhbV9nZXRjIChjaXJjdWl0LT5yY3Zfc3RyZWFtKTsKICAgc3RyZWFtX2dldCAoaGRyLmxhbl9pZCwgY2lyY3VpdC0+cmN2X3N0cmVhbSwgSVNJU19TWVNfSURfTEVOICsgMSk7CiAKICAgaWYgKGhkci5jaXJjdWl0X3QgIT0gSVNfTEVWRUxfMSAmJiBoZHIuY2lyY3VpdF90ICE9IElTX0xFVkVMXzIgJiYKLSAgICAgIGhkci5jaXJjdWl0X3QgIT0gSVNfTEVWRUxfMV9BTkRfMiApIHsKLSAgICB6bG9nX3dhcm4gKCJMZXZlbCAlZCBMQU4gSGVsbG8gd2l0aCBDaXJjdWl0IFR5cGUgJWQiLCBsZXZlbCwgCi0JICAgICAgIGhkci5jaXJjdWl0X3QpOwotICAgIHJldHVybiBJU0lTX0VSUk9SOwotICB9CisgICAgICBoZHIuY2lyY3VpdF90ICE9IElTX0xFVkVMXzFfQU5EXzIpCisgICAgeworICAgICAgemxvZ193YXJuICgiTGV2ZWwgJWQgTEFOIEhlbGxvIHdpdGggQ2lyY3VpdCBUeXBlICVkIiwgbGV2ZWwsCisJCSBoZHIuY2lyY3VpdF90KTsKKyAgICAgIHJldHVybiBJU0lTX0VSUk9SOworICAgIH0KICAgLyoKICAgICogVGhlbiBnZXQgdGhlIHRsdnMKICAgICovCkBAIC02NTAsMTcxICs3MzIsMTk0IEBACiAgIGV4cGVjdGVkIHw9IFRMVkZMQUdfSVBWNl9BRERSOwogCiAgIHJldHZhbCA9IHBhcnNlX3RsdnMgKGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLAotICAgICAgICAgICAgICAgICAgICAgICBTVFJFQU1fUE5UIChjaXJjdWl0LT5yY3Zfc3RyZWFtKSwKLSAgICAgICAgICAgICAgICAgICAgICAgaGRyLnBkdV9sZW4gLSBJU0lTX0xBTkhFTExPX0hEUkxFTiAtIElTSVNfRklYRURfSERSX0xFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgJmV4cGVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAmZm91bmQsCi0gICAgICAgICAgICAgICAgICAgICAgICZ0bHZzKTsKKwkJICAgICAgIFNUUkVBTV9QTlQgKGNpcmN1aXQtPnJjdl9zdHJlYW0pLAorCQkgICAgICAgaGRyLnBkdV9sZW4gLSBJU0lTX0xBTkhFTExPX0hEUkxFTiAtCisJCSAgICAgICBJU0lTX0ZJWEVEX0hEUl9MRU4sICZleHBlY3RlZCwgJmZvdW5kLCAmdGx2cyk7CiAKLSAgaWYgKHJldHZhbCA+IElTSVNfV0FSTklORykgewotICAgIHpsb2dfd2FybiAoInBhcnNlX3RsdnMoKSBmYWlsZWQiKTsKLSAgICBnb3RvIG91dDsKLSAgfQorICBpZiAocmV0dmFsID4gSVNJU19XQVJOSU5HKQorICAgIHsKKyAgICAgIHpsb2dfd2FybiAoInBhcnNlX3RsdnMoKSBmYWlsZWQiKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KIAotICBpZiAoIShmb3VuZCAmIFRMVkZMQUdfQVJFQV9BRERSUykpIHsKLSAgICB6bG9nX3dhcm4gKCJObyBBcmVhIGFkZHJlc3NlcyBUTFYgaW4gTGV2ZWwgJWQgTEFOIElTIHRvIElTIGhlbGxvIiwgbGV2ZWwpOwotICAgIHJldHZhbCA9IElTSVNfV0FSTklORzsKLSAgICBnb3RvIG91dDsKLSAgfQotCi0gIGlmIChjaXJjdWl0LT5wYXNzd2QudHlwZSkgewotICAgIGlmICghKGZvdW5kICYgVExWRkxBR19BVVRIX0lORk8pIHx8IAotCWF1dGhlbnRpY2F0aW9uX2NoZWNrICgmY2lyY3VpdC0+cGFzc3dkLCAmdGx2cy5hdXRoX2luZm8pKSB7Ci0gICAgICBpc2lzX2V2ZW50X2F1dGhfZmFpbHVyZSAoY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsIAotCQkJICAgICAgICJMQU4gaGVsbG8gYXV0aGVudGljYXRpb24gZmFpbHVyZSIsIAotICAgICAgICBoZHIuc291cmNlX2lkKTsKKyAgaWYgKCEoZm91bmQgJiBUTFZGTEFHX0FSRUFfQUREUlMpKQorICAgIHsKKyAgICAgIHpsb2dfd2FybiAoIk5vIEFyZWEgYWRkcmVzc2VzIFRMViBpbiBMZXZlbCAlZCBMQU4gSVMgdG8gSVMgaGVsbG8iLAorCQkgbGV2ZWwpOwogICAgICAgcmV0dmFsID0gSVNJU19XQVJOSU5HOwogICAgICAgZ290byBvdXQ7CiAgICAgfQotICB9CisKKyAgaWYgKGNpcmN1aXQtPnBhc3N3ZC50eXBlKQorICAgIHsKKyAgICAgIGlmICghKGZvdW5kICYgVExWRkxBR19BVVRIX0lORk8pIHx8CisJICBhdXRoZW50aWNhdGlvbl9jaGVjayAoJmNpcmN1aXQtPnBhc3N3ZCwgJnRsdnMuYXV0aF9pbmZvKSkKKwl7CisJICBpc2lzX2V2ZW50X2F1dGhfZmFpbHVyZSAoY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsCisJCQkJICAgIkxBTiBoZWxsbyBhdXRoZW50aWNhdGlvbiBmYWlsdXJlIiwKKwkJCQkgICBoZHIuc291cmNlX2lkKTsKKwkgIHJldHZhbCA9IElTSVNfV0FSTklORzsKKwkgIGdvdG8gb3V0OworCX0KKyAgICB9CiAKICAgLyoKICAgICogQWNjZXB0IHRoZSBsZXZlbCAxIGFkamFjZW5jeSBvbmx5IGlmIGEgbWF0Y2ggYmV0d2VlbiBsb2NhbCBhbmQKICAgICogcmVtb3RlIGFyZWEgYWRkcmVzc2VzIGlzIGZvdW5kCiAgICAqLwotICBpZiAobGV2ZWwgPT0gMSAmJiAhYXJlYV9tYXRjaCAoY2lyY3VpdC0+YXJlYS0+YXJlYV9hZGRycywgdGx2cy5hcmVhX2FkZHJzKSkgewotICAgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19BREpfUEFDS0VUUykgewotICAgICAgemxvZ19pbmZvICgiSVNJUy1BZGogKCVzKTogQXJlYSBtaXNtYXRjaCwgbGV2ZWwgJWQgSUlIIG9uICVzIiwKLSAgICAgICAgICAgICAgICAgY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsIGxldmVsLGNpcmN1aXQtPmludGVyZmFjZS0+bmFtZSk7CisgIGlmIChsZXZlbCA9PSAxICYmICFhcmVhX21hdGNoIChjaXJjdWl0LT5hcmVhLT5hcmVhX2FkZHJzLCB0bHZzLmFyZWFfYWRkcnMpKQorICAgIHsKKyAgICAgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19BREpfUEFDS0VUUykKKwl7CisJICB6bG9nX2luZm8gKCJJU0lTLUFkaiAoJXMpOiBBcmVhIG1pc21hdGNoLCBsZXZlbCAlZCBJSUggb24gJXMiLAorCQkgICAgIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLCBsZXZlbCwKKwkJICAgICBjaXJjdWl0LT5pbnRlcmZhY2UtPm5hbWUpOworCX0KKyAgICAgIHJldHZhbCA9IElTSVNfT0s7CisgICAgICBnb3RvIG91dDsKICAgICB9Ci0gICAgcmV0dmFsID0gSVNJU19PSzsKLSAgICBnb3RvIG91dDsKLSAgfQogCiAgIC8qIAogICAgKiBpdCdzIG93biBJSUggUERVIC0gZGlzY2FyZCBzaWxlbnRseSAKLSAgICovIAotICBpZiAoIW1lbWNtcCAoY2lyY3VpdC0+dS5iYy5zbnBhLCBzc25wYSwgRVRIX0FMRU4pKSB7Ci0gICAgemxvZ19pbmZvICgiSVNJUy1BZGogKCVzKTogaXQncyBvd24gSUlIIFBEVSAtIGRpc2NhcmRlZCIsIAotCSAgICAgICBjaXJjdWl0LT5hcmVhLT5hcmVhX3RhZyk7CisgICAqLworICBpZiAoIW1lbWNtcCAoY2lyY3VpdC0+dS5iYy5zbnBhLCBzc25wYSwgRVRIX0FMRU4pKQorICAgIHsKKyAgICAgIHpsb2dfaW5mbyAoIklTSVMtQWRqICglcyk6IGl0J3Mgb3duIElJSCBQRFUgLSBkaXNjYXJkZWQiLAorCQkgY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcpOwogCi0gICAgcmV0dmFsID0gSVNJU19PSzsKLSAgICBnb3RvIG91dDsKLSAgfQorICAgICAgcmV0dmFsID0gSVNJU19PSzsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KIAogICAvKgogICAgKiBjaGVjayBpZiBpdCdzIG93biBpbnRlcmZhY2UgaXAgbWF0Y2ggaWloIGlwIGFkZHJzCiAgICAqLwotICBpZiAoIShmb3VuZCAmIFRMVkZMQUdfSVBWNF9BRERSKSB8fCAhaXBfbWF0Y2goY2lyY3VpdC0+aXBfYWRkcnMsIHRsdnMuaXB2NF9hZGRycykpIHsKLSAgICB6bG9nX2luZm8oIklTSVMtQWRqOiBObyB1c2FibGUgSVAgaW50ZXJmYWNlIGFkZHJlc3NlcyBpbiBMQU4gSUlIIGZyb20gJXNcbiIsCi0gICAJCWNpcmN1aXQtPmludGVyZmFjZS0+bmFtZSk7Ci0gICAgcmV0dmFsID0gSVNJU19XQVJOSU5HOwotICAgIGdvdG8gb3V0OwotICB9Ci0KKyAgaWYgKCEoZm91bmQgJiBUTFZGTEFHX0lQVjRfQUREUikKKyAgICAgIHx8ICFpcF9tYXRjaCAoY2lyY3VpdC0+aXBfYWRkcnMsIHRsdnMuaXB2NF9hZGRycykpCisgICAgeworICAgICAgemxvZ19pbmZvCisJKCJJU0lTLUFkajogTm8gdXNhYmxlIElQIGludGVyZmFjZSBhZGRyZXNzZXMgaW4gTEFOIElJSCBmcm9tICVzXG4iLAorCSBjaXJjdWl0LT5pbnRlcmZhY2UtPm5hbWUpOworICAgICAgcmV0dmFsID0gSVNJU19XQVJOSU5HOworICAgICAgZ290byBvdXQ7CisgICAgfQogCiAgIGFkaiA9IGlzaXNfYWRqX2xvb2t1cCAoaGRyLnNvdXJjZV9pZCwgY2lyY3VpdC0+dS5iYy5hZGpkYltsZXZlbCAtIDFdKTsKLSAgaWYgKCFhZGopIHsKLSAgICAvKgotICAgICAqIERvIGFzIGluIDguNC4yLjUKLSAgICAgKi8KLSAgICBhZGogPSBpc2lzX25ld19hZGogKGhkci5zb3VyY2VfaWQsIHNzbnBhLCBsZXZlbCwgY2lyY3VpdCk7Ci0gICAgaWYgKGFkaiA9PSBOVUxMKQotICAgICAgcmV0dmFsID0gSVNJU19FUlJPUjsKKyAgaWYgKCFhZGopCisgICAgeworICAgICAgLyoKKyAgICAgICAqIERvIGFzIGluIDguNC4yLjUKKyAgICAgICAqLworICAgICAgYWRqID0gaXNpc19uZXdfYWRqIChoZHIuc291cmNlX2lkLCBzc25wYSwgbGV2ZWwsIGNpcmN1aXQpOworICAgICAgaWYgKGFkaiA9PSBOVUxMKQorCXJldHZhbCA9IElTSVNfRVJST1I7CiAgICAgICBnb3RvIG91dDsKIAotICAgIGFkai0+bGV2ZWwgPSBsZXZlbDsKLSAgICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UoYWRqLCBJU0lTX0FESl9JTklUSUFMSVpJTkcsIE5VTEwpOworICAgICAgYWRqLT5sZXZlbCA9IGxldmVsOworICAgICAgaXNpc19hZGpfc3RhdGVfY2hhbmdlIChhZGosIElTSVNfQURKX0lOSVRJQUxJWklORywgTlVMTCk7CiAKLSAgICBpZiAobGV2ZWwgPT0gMSkgewotICAgICAgYWRqLT5zeXNfdHlwZSA9IElTSVNfU1lTVFlQRV9MMV9JUzsKLSAgICB9IGVsc2UgewotICAgICAgYWRqLT5zeXNfdHlwZSA9IElTSVNfU1lTVFlQRV9MMl9JUzsKKyAgICAgIGlmIChsZXZlbCA9PSAxKQorCXsKKwkgIGFkai0+c3lzX3R5cGUgPSBJU0lTX1NZU1RZUEVfTDFfSVM7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGFkai0+c3lzX3R5cGUgPSBJU0lTX1NZU1RZUEVfTDJfSVM7CisJfQorICAgICAgbGlzdF9kZWxldGVfYWxsX25vZGUgKGNpcmN1aXQtPnUuYmMubGFuX25laWdoc1tsZXZlbCAtIDFdKTsKKyAgICAgIGlzaXNfYWRqX2J1aWxkX25laWdoX2xpc3QgKGNpcmN1aXQtPnUuYmMuYWRqZGJbbGV2ZWwgLSAxXSwKKwkJCQkgY2lyY3VpdC0+dS5iYy5sYW5fbmVpZ2hzW2xldmVsIC0gMV0pOwogICAgIH0KLSAgICBsaXN0X2RlbGV0ZV9hbGxfbm9kZSAoY2lyY3VpdC0+dS5iYy5sYW5fbmVpZ2hzW2xldmVsIC0gMV0pOwotICAgIGlzaXNfYWRqX2J1aWxkX25laWdoX2xpc3QgKGNpcmN1aXQtPnUuYmMuYWRqZGJbbGV2ZWwgLSAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXJjdWl0LT51LmJjLmxhbl9uZWlnaHNbbGV2ZWwgLSAxXSk7IAotICB9CiAKLSAgc3dpdGNoIChsZXZlbCkgewotICBjYXNlIDEgOgotICAgIGlmIChtZW1jbXAoY2lyY3VpdC0+dS5iYy5sMV9kZXNpZ19pcywgaGRyLmxhbl9pZCwgSVNJU19TWVNfSURfTEVOICsgMSkpIHsKLSAgICAgIHRocmVhZF9hZGRfZXZlbnQgKG1hc3RlciwgaXNpc19ldmVudF9kaXNfc3RhdHVzX2NoYW5nZSwgY2lyY3VpdCwgMCk7Ci0gICAgICBtZW1jcHkgKCZjaXJjdWl0LT51LmJjLmwxX2Rlc2lnX2lzLCBoZHIubGFuX2lkLCBJU0lTX1NZU19JRF9MRU4gKyAxKTsKKyAgc3dpdGNoIChsZXZlbCkKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgaWYgKG1lbWNtcCAoY2lyY3VpdC0+dS5iYy5sMV9kZXNpZ19pcywgaGRyLmxhbl9pZCwgSVNJU19TWVNfSURfTEVOICsgMSkpCisJeworCSAgdGhyZWFkX2FkZF9ldmVudCAobWFzdGVyLCBpc2lzX2V2ZW50X2Rpc19zdGF0dXNfY2hhbmdlLCBjaXJjdWl0LCAwKTsKKwkgIG1lbWNweSAoJmNpcmN1aXQtPnUuYmMubDFfZGVzaWdfaXMsIGhkci5sYW5faWQsCisJCSAgSVNJU19TWVNfSURfTEVOICsgMSk7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgaWYgKG1lbWNtcCAoY2lyY3VpdC0+dS5iYy5sMl9kZXNpZ19pcywgaGRyLmxhbl9pZCwgSVNJU19TWVNfSURfTEVOICsgMSkpCisJeworCSAgdGhyZWFkX2FkZF9ldmVudCAobWFzdGVyLCBpc2lzX2V2ZW50X2Rpc19zdGF0dXNfY2hhbmdlLCBjaXJjdWl0LCAwKTsKKwkgIG1lbWNweSAoJmNpcmN1aXQtPnUuYmMubDJfZGVzaWdfaXMsIGhkci5sYW5faWQsCisJCSAgSVNJU19TWVNfSURfTEVOICsgMSk7CisJfQorICAgICAgYnJlYWs7CiAgICAgfQotICAgIGJyZWFrOwotICBjYXNlIDIgOiAKLSAgICBpZiAobWVtY21wIChjaXJjdWl0LT51LmJjLmwyX2Rlc2lnX2lzLCBoZHIubGFuX2lkLCBJU0lTX1NZU19JRF9MRU4gKyAxKSkgewotICAgICAgdGhyZWFkX2FkZF9ldmVudCAobWFzdGVyLCBpc2lzX2V2ZW50X2Rpc19zdGF0dXNfY2hhbmdlLCBjaXJjdWl0LCAwKTsKLSAgICAgIG1lbWNweSAoJmNpcmN1aXQtPnUuYmMubDJfZGVzaWdfaXMsIGhkci5sYW5faWQsIElTSVNfU1lTX0lEX0xFTiArIDEpOwotICAgIH0KLSAgICBicmVhazsKLSAgfQogCiAjaWYgMAotIC8qIE9sZCBzb2x1dGlvbjogYmVsaWV2ZSB0aGUgbGFuLWhlYWRlciBhbHdheXMKLSAgKi8KLSAgaWYgKGxldmVsID09IDEpIHsKLSAgICBtZW1jcHkoY2lyY3VpdC0+dS5iYy5sMV9kZXNpZ19pcywgaGRyLmxhbl9pZCwgSVNJU19TWVNfSURfTEVOICsgMSk7Ci0gIH0gZWxzZSBpZiAobGV2ZWwgPT0gMikgewotICAgIG1lbWNweShjaXJjdWl0LT51LmJjLmwyX2Rlc2lnX2lzLCBoZHIubGFuX2lkLCBJU0lTX1NZU19JRF9MRU4gKyAxKTsKLSAgfQorICAvKiBPbGQgc29sdXRpb246IGJlbGlldmUgdGhlIGxhbi1oZWFkZXIgYWx3YXlzCisgICAqLworICBpZiAobGV2ZWwgPT0gMSkKKyAgICB7CisgICAgICBtZW1jcHkgKGNpcmN1aXQtPnUuYmMubDFfZGVzaWdfaXMsIGhkci5sYW5faWQsIElTSVNfU1lTX0lEX0xFTiArIDEpOworICAgIH0KKyAgZWxzZSBpZiAobGV2ZWwgPT0gMikKKyAgICB7CisgICAgICBtZW1jcHkgKGNpcmN1aXQtPnUuYmMubDJfZGVzaWdfaXMsIGhkci5sYW5faWQsIElTSVNfU1lTX0lEX0xFTiArIDEpOworICAgIH0KICNlbmRpZgogCiAgIGFkai0+aG9sZF90aW1lID0gaGRyLmhvbGRfdGltZTsKLSAgYWRqLT5sYXN0X3VwZCAgPSB0aW1lIChOVUxMKTsKLSAgYWRqLT5wcmlvW2xldmVsLTFdID0gaGRyLnByaW87CisgIGFkai0+bGFzdF91cGQgPSB0aW1lIChOVUxMKTsKKyAgYWRqLT5wcmlvW2xldmVsIC0gMV0gPSBoZHIucHJpbzsKIAogICBtZW1jcHkgKGFkai0+bGFuaWQsIGhkci5sYW5faWQsIElTSVNfU1lTX0lEX0xFTiArIDEpOwogCiAgIC8qIHdoaWNoIHByb3RvY29sIGFyZSBzcG9rZW4gPz8/ICovCi0gIGlmIChmb3VuZCAmIFRMVkZMQUdfTkxQSUQpIAorICBpZiAoZm91bmQgJiBUTFZGTEFHX05MUElEKQogICAgIHRsdnNfdG9fYWRqX25scGlkcyAoJnRsdnMsIGFkaik7CiAKICAgLyogd2UgbmVlZCB0byBjb3B5IGFkZHJlc3NlcyB0byB0aGUgYWRqICovCi0gIGlmIChmb3VuZCAmIFRMVkZMQUdfSVBWNF9BRERSKSAKKyAgaWYgKGZvdW5kICYgVExWRkxBR19JUFY0X0FERFIpCiAgICAgdGx2c190b19hZGpfaXB2NF9hZGRycyAoJnRsdnMsIGFkaik7CiAKICNpZmRlZiBIQVZFX0lQVjYKLSAgaWYgKGZvdW5kICYgVExWRkxBR19JUFY2X0FERFIpIAorICBpZiAoZm91bmQgJiBUTFZGTEFHX0lQVjZfQUREUikKICAgICB0bHZzX3RvX2Fkal9pcHY2X2FkZHJzICgmdGx2cywgYWRqKTsKICNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KIAogICBhZGotPmNpcmN1aXRfdCA9IGhkci5jaXJjdWl0X3Q7CiAKICAgLyogbGV0cyB0YWtlIGNhcmUgb2YgdGhlIGV4cGlyeSAqLwotICBUSFJFQURfVElNRVJfT0ZGKGFkai0+dF9leHBpcmUpOwotICBUSFJFQURfVElNRVJfT04obWFzdGVyLCBhZGotPnRfZXhwaXJlLCBpc2lzX2Fkal9leHBpcmUsIGFkaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKWFkai0+aG9sZF90aW1lKTsKKyAgVEhSRUFEX1RJTUVSX09GRiAoYWRqLT50X2V4cGlyZSk7CisgIFRIUkVBRF9USU1FUl9PTiAobWFzdGVyLCBhZGotPnRfZXhwaXJlLCBpc2lzX2Fkal9leHBpcmUsIGFkaiwKKwkJICAgKGxvbmcpIGFkai0+aG9sZF90aW1lKTsKIAogICAvKgogICAgKiBJZiB0aGUgc25wYSBmb3IgdGhpcyBjaXJjdWl0IGlzIGZvdW5kIGZyb20gTEFOIE5laWdoYm91cnMgVExWCiAgICAqIHdlIGhhdmUgdHdvLXdheSBjb21tdW5pY2F0aW9uIC0+IGFkamFjZW5jeSBjYW4gYmUgcHV0IHRvIHN0YXRlICJ1cCIKICAgICovCiAKLSAgaWYgKGZvdW5kICYgVExWRkxBR19MQU5fTkVJR0hTKSB7Ci0gICAgaWYgKGFkai0+YWRqX3N0YXRlICE9IElTSVNfQURKX1VQKSB7Ci0gICAgICBMSVNUX0xPT1AgKHRsdnMubGFuX25laWdocywgc25wYSwgbm9kZSkKLSAgICAgICAgaWYgKCFtZW1jbXAgKHNucGEsIGNpcmN1aXQtPnUuYmMuc25wYSwgRVRIX0FMRU4pKSB7Ci0gICAgICAgICAgaXNpc19hZGpfc3RhdGVfY2hhbmdlIChhZGosIElTSVNfQURKX1VQLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvd24gU05QQSBmb3VuZCBpbiBMQU4gTmVpZ2hib3VycyBUTFYiKTsKLSAgICAgICAgfQorICBpZiAoZm91bmQgJiBUTFZGTEFHX0xBTl9ORUlHSFMpCisgICAgeworICAgICAgaWYgKGFkai0+YWRqX3N0YXRlICE9IElTSVNfQURKX1VQKQorCXsKKwkgIExJU1RfTE9PUCAodGx2cy5sYW5fbmVpZ2hzLCBzbnBhLCBub2RlKQorCSAgICBpZiAoIW1lbWNtcCAoc25wYSwgY2lyY3VpdC0+dS5iYy5zbnBhLCBFVEhfQUxFTikpCisJICAgIHsKKwkgICAgICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfVVAsCisJCQkJICAgICAib3duIFNOUEEgZm91bmQgaW4gTEFOIE5laWdoYm91cnMgVExWIik7CisJICAgIH0KKwl9CiAgICAgfQotICB9CiAKLSBvdXQ6CitvdXQ6CiAgIC8qIERFQlVHX0FESl9QQUNLRVRTICovCi0gIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19BREpfUEFDS0VUUykgewotICAgIC8qIEZJWE1FOiBpcyB0aGlzIHBsYWNlIHJpZ2h0PyBmaXggbWlzc2luZyBpbmZvICovCi0gICAgemxvZ19pbmZvICgiSVNJUy1BZGogKCVzKTogUmN2ZCBMJWQgTEFOIElJSCBmcm9tICVzIG9uICVzLCBjaXJUeXBlICVzLCAiCi0gICAgICAgICAgICAgICAiY2lySUQgJXUsIGxlbmd0aCAlbGQiLAotCSAgICAgICBjaXJjdWl0LT5hcmVhLT5hcmVhX3RhZywgCi0gICAgICAgICAgICAgICBsZXZlbCxzbnBhX3ByaW50KHNzbnBhKSwgY2lyY3VpdC0+aW50ZXJmYWNlLT5uYW1lLAotICAgICAgICAgICAgICAgY2lyY3VpdF90MnN0cmluZyhjaXJjdWl0LT5jaXJjdWl0X2lzX3R5cGUpLAotICAgICAgICAgICAgICAgY2lyY3VpdC0+Y2lyY3VpdF9pZCwKLSAgICAgICAgICAgICAgIHN0cmVhbV9nZXRfZW5kcCAoY2lyY3VpdC0+cmN2X3N0cmVhbSkpOwotICB9Ci0KKyAgaWYgKGlzaXMtPmRlYnVncyAmIERFQlVHX0FESl9QQUNLRVRTKQorICAgIHsKKyAgICAgIC8qIEZJWE1FOiBpcyB0aGlzIHBsYWNlIHJpZ2h0PyBmaXggbWlzc2luZyBpbmZvICovCisgICAgICB6bG9nX2luZm8gKCJJU0lTLUFkaiAoJXMpOiBSY3ZkIEwlZCBMQU4gSUlIIGZyb20gJXMgb24gJXMsIGNpclR5cGUgJXMsICIKKwkJICJjaXJJRCAldSwgbGVuZ3RoICVsZCIsCisJCSBjaXJjdWl0LT5hcmVhLT5hcmVhX3RhZywKKwkJIGxldmVsLCBzbnBhX3ByaW50IChzc25wYSksIGNpcmN1aXQtPmludGVyZmFjZS0+bmFtZSwKKwkJIGNpcmN1aXRfdDJzdHJpbmcgKGNpcmN1aXQtPmNpcmN1aXRfaXNfdHlwZSksCisJCSBjaXJjdWl0LT5jaXJjdWl0X2lkLCBzdHJlYW1fZ2V0X2VuZHAgKGNpcmN1aXQtPnJjdl9zdHJlYW0pKTsKKyAgICB9CiAKICAgZnJlZV90bHZzICgmdGx2cyk7CiAKQEAgLTgyNSw5ICs5MzAsOSBAQAogICogUHJvY2VzcyBMZXZlbCAxLzIgTGluayBTdGF0ZQogICogSVNPIC0gMTA1ODkKICAqIFNlY3Rpb24gNy4zLjE1LjEgLSBBY3Rpb24gb24gcmVjZWlwdCBvZiBhIGxpbmsgc3RhdGUgUERVCi0gKi8gCi1zdGF0aWMgaW50IAotcHJvY2Vzc19sc3AgKGludCBsZXZlbCwgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgdV9jaGFyICpzc25wYSkKKyAqLworc3RhdGljIGludAorcHJvY2Vzc19sc3AgKGludCBsZXZlbCwgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgdV9jaGFyICogc3NucGEpCiB7CiAgIHN0cnVjdCBpc2lzX2xpbmtfc3RhdGVfaGRyICpoZHI7CiAgIHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqID0gTlVMTDsKQEAgLTgzNyw2NCArOTQyLDY1IEBACiAgIHN0cnVjdCBpc2lzX3Bhc3N3ZCAqcGFzc3dkOwogCiAgIC8qIFNhbml0eSBjaGVjayAtIEZJWE1FOiBtb3ZlIHRvIGNvcnJlY3QgcGxhY2UgKi8KLSAgaWYgKChzdHJlYW1fZ2V0X2VuZHAgKGNpcmN1aXQtPnJjdl9zdHJlYW0pIC0gCi0gICAgICAgc3RyZWFtX2dldF9nZXRwIChjaXJjdWl0LT5yY3Zfc3RyZWFtKSkgPCBJU0lTX0xTUF9IRFJfTEVOICkgewotICAgIHpsb2dfd2FybiAoIlBhY2tldCB0b28gc2hvcnQiKTsKLSAgICByZXR1cm4gSVNJU19XQVJOSU5HOwotICB9CisgIGlmICgoc3RyZWFtX2dldF9lbmRwIChjaXJjdWl0LT5yY3Zfc3RyZWFtKSAtCisgICAgICAgc3RyZWFtX2dldF9nZXRwIChjaXJjdWl0LT5yY3Zfc3RyZWFtKSkgPCBJU0lTX0xTUF9IRFJfTEVOKQorICAgIHsKKyAgICAgIHpsb2dfd2FybiAoIlBhY2tldCB0b28gc2hvcnQiKTsKKyAgICAgIHJldHVybiBJU0lTX1dBUk5JTkc7CisgICAgfQogCiAgIC8qIFJlZmVyZW5jZSB0aGUgaGVhZGVyICAgKi8KLSAgaGRyID0gKHN0cnVjdCBpc2lzX2xpbmtfc3RhdGVfaGRyKilTVFJFQU1fUE5UIChjaXJjdWl0LT5yY3Zfc3RyZWFtKTsKKyAgaGRyID0gKHN0cnVjdCBpc2lzX2xpbmtfc3RhdGVfaGRyICopIFNUUkVBTV9QTlQgKGNpcmN1aXQtPnJjdl9zdHJlYW0pOwogCi0gIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19VUERBVEVfUEFDS0VUUykgewotICAgIHpsb2dfaW5mbyAoIklTSVMtVXBkICglcyk6IFJjdmQgTCVkIExTUCAlcywgc2VxIDB4JTA4eCwgY2tzdW0gMHglMDR4LCAiCi0gICAgICAgICAgICAgICAibGlmZXRpbWUgJXVzLCBsZW4gJWx1LCBvbiAlcyIsCi0JICAgICAgIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLAotCSAgICAgICBsZXZlbCwgCi0gICAgICAgICAgICAgICByYXdsc3BpZF9wcmludChoZHItPmxzcF9pZCksCi0JICAgICAgIG50b2hsKGhkci0+c2VxX251bSksCi0JICAgICAgIG50b2hzKGhkci0+Y2hlY2tzdW0pLAotCSAgICAgICBudG9ocyhoZHItPnJlbV9saWZldGltZSksCi0JICAgICAgIGNpcmN1aXQtPnJjdl9zdHJlYW0tPmVuZHAsCi0gICAgICAgICAgICAgICBjaXJjdWl0LT5pbnRlcmZhY2UtPm5hbWUpOwotICB9CisgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19VUERBVEVfUEFDS0VUUykKKyAgICB7CisgICAgICB6bG9nX2luZm8gKCJJU0lTLVVwZCAoJXMpOiBSY3ZkIEwlZCBMU1AgJXMsIHNlcSAweCUwOHgsIGNrc3VtIDB4JTA0eCwgIgorCQkgImxpZmV0aW1lICV1cywgbGVuICVsdSwgb24gJXMiLAorCQkgY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsCisJCSBsZXZlbCwKKwkJIHJhd2xzcGlkX3ByaW50IChoZHItPmxzcF9pZCksCisJCSBudG9obCAoaGRyLT5zZXFfbnVtKSwKKwkJIG50b2hzIChoZHItPmNoZWNrc3VtKSwKKwkJIG50b2hzIChoZHItPnJlbV9saWZldGltZSksCisJCSBjaXJjdWl0LT5yY3Zfc3RyZWFtLT5lbmRwLCBjaXJjdWl0LT5pbnRlcmZhY2UtPm5hbWUpOworICAgIH0KIAogICBhc3NlcnQgKG50b2hzIChoZHItPnBkdV9sZW4pID4gSVNJU19MU1BfSERSX0xFTik7CiAKICAgLyogQ2hlY2tzdW0gc2FuaXR5IGNoZWNrIC0gRklYTUU6IG1vdmUgdG8gY29ycmVjdCBwbGFjZSAqLwogICAvKiAxMiA9IHN5c2lkK3BkdStyZW10aW1lICovCi0gIGlmIChpc29fY3N1bV92ZXJpZnkgKFNUUkVBTV9QTlQgKGNpcmN1aXQtPnJjdl9zdHJlYW0pICsgNCwgCi0gICAgICBudG9ocyAoaGRyLT5wZHVfbGVuKSAtIDEyLCAmaGRyLT5jaGVja3N1bSkpIHsKLSAgICB6bG9nX2luZm8gKCJJU0lTLVVwZCAoJXMpOiBMU1AgJXMgaW52YWxpZCBMU1AgY2hlY2tzdW0gMHglMDR4IiwKLQkgICAgICAgY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsCi0JICAgICAgIHJhd2xzcGlkX3ByaW50IChoZHItPmxzcF9pZCksCi0JICAgICAgIG50b2hzKGhkci0+Y2hlY2tzdW0pKTsKKyAgaWYgKGlzb19jc3VtX3ZlcmlmeSAoU1RSRUFNX1BOVCAoY2lyY3VpdC0+cmN2X3N0cmVhbSkgKyA0LAorCQkgICAgICAgbnRvaHMgKGhkci0+cGR1X2xlbikgLSAxMiwgJmhkci0+Y2hlY2tzdW0pKQorICAgIHsKKyAgICAgIHpsb2dfaW5mbyAoIklTSVMtVXBkICglcyk6IExTUCAlcyBpbnZhbGlkIExTUCBjaGVja3N1bSAweCUwNHgiLAorCQkgY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsCisJCSByYXdsc3BpZF9wcmludCAoaGRyLT5sc3BfaWQpLCBudG9ocyAoaGRyLT5jaGVja3N1bSkpOwogCi0gICAgcmV0dXJuIElTSVNfV0FSTklORzsKLSAgfQorICAgICAgcmV0dXJuIElTSVNfV0FSTklORzsKKyAgICB9CiAKICAgLyogNy4zLjE1LjEgYSkgMSAtIGV4dGVybmFsIGRvbWFpbiBjaXJjdWl0IHdpbGwgZGlzY2FyZCBsc3BzICovCi0gIGlmIChjaXJjdWl0LT5leHRfZG9tYWluKSB7Ci0gICAgemxvZ19pbmZvICgiSVNJUy1VcGQgKCVzKTogTFNQICVzIHJlY2VpdmVkIGF0IGxldmVsICVkIG92ZXIgY2lyY3VpdCB3aXRoICIKLSAgICAgICAgICAgICAgICJleHRlcm5hbERvbWFpbiA9IHRydWUiLAotCSAgICAgICBjaXJjdWl0LT5hcmVhLT5hcmVhX3RhZywKLQkgICAgICAgcmF3bHNwaWRfcHJpbnQgKGhkci0+bHNwX2lkKSwJICAgICAgIAotCSAgICAgICBsZXZlbCk7CisgIGlmIChjaXJjdWl0LT5leHRfZG9tYWluKQorICAgIHsKKyAgICAgIHpsb2dfaW5mbworCSgiSVNJUy1VcGQgKCVzKTogTFNQICVzIHJlY2VpdmVkIGF0IGxldmVsICVkIG92ZXIgY2lyY3VpdCB3aXRoICIKKwkgImV4dGVybmFsRG9tYWluID0gdHJ1ZSIsIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLAorCSByYXdsc3BpZF9wcmludCAoaGRyLT5sc3BfaWQpLCBsZXZlbCk7CiAKLSAgICByZXR1cm4gSVNJU19XQVJOSU5HOwotICB9CisgICAgICByZXR1cm4gSVNJU19XQVJOSU5HOworICAgIH0KIAogICAvKiA3LjMuMTUuMSBhKSAyLDMgLSBtYW51YWxMMk9ubHlNb2RlIG5vdCBpbXBsZW1lbnRlZCAqLwotICBpZiAoIWFjY2VwdF9sZXZlbCAobGV2ZWwsIGNpcmN1aXQtPmNpcmN1aXRfaXNfdHlwZSkpIHsKLSAgICB6bG9nX2luZm8gKCJJU0lTLVVwZCAoJXMpOiBMU1AgJXMgcmVjZWl2ZWQgYXQgbGV2ZWwgJWQgb3ZlciBjaXJjdWl0IG9mIgotICAgICAgICAgICAgICAgIiB0eXBlICVzIiwgCi0JICAgICAgIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLAotCSAgICAgICByYXdsc3BpZF9wcmludChoZHItPmxzcF9pZCksCQotICAgICAgICAgICAgICAgbGV2ZWwsCi0JICAgICAgIGNpcmN1aXRfdDJzdHJpbmcgKGNpcmN1aXQtPmNpcmN1aXRfaXNfdHlwZSkpOworICBpZiAoIWFjY2VwdF9sZXZlbCAobGV2ZWwsIGNpcmN1aXQtPmNpcmN1aXRfaXNfdHlwZSkpCisgICAgeworICAgICAgemxvZ19pbmZvICgiSVNJUy1VcGQgKCVzKTogTFNQICVzIHJlY2VpdmVkIGF0IGxldmVsICVkIG92ZXIgY2lyY3VpdCBvZiIKKwkJICIgdHlwZSAlcyIsCisJCSBjaXJjdWl0LT5hcmVhLT5hcmVhX3RhZywKKwkJIHJhd2xzcGlkX3ByaW50IChoZHItPmxzcF9pZCksCisJCSBsZXZlbCwgY2lyY3VpdF90MnN0cmluZyAoY2lyY3VpdC0+Y2lyY3VpdF9pc190eXBlKSk7CiAKLSAgICByZXR1cm4gSVNJU19XQVJOSU5HOwotICB9CisgICAgICByZXR1cm4gSVNJU19XQVJOSU5HOworICAgIH0KIAogICAvKiA3LjMuMTUuMSBhKSA0IC0gbmVlZCB0byBtYWtlIHN1cmUgSURMZW5ndGggbWF0Y2hlcyAqLwogCkBAIC05MDMsMjIxICsxMDA5LDI1NCBAQAogICAvKiA3LjMuMTUuMSBhKSA3IC0gcGFzc3dvcmQgY2hlY2sgKi8KICAgKGxldmVsID09IElTSVNfTEVWRUwxKSA/IChwYXNzd2QgPSAmY2lyY3VpdC0+YXJlYS0+YXJlYV9wYXNzd2QpIDoKICAgICAocGFzc3dkID0gJmNpcmN1aXQtPmFyZWEtPmRvbWFpbl9wYXNzd2QpOwotICBpZiAocGFzc3dkLT50eXBlKSB7Ci0gICAgaWYgKGlzaXNfbHNwX2F1dGhpbmZvX2NoZWNrIChjaXJjdWl0LT5yY3Zfc3RyZWFtLCBjaXJjdWl0LT5hcmVhLAotCQkJCSBudG9ocyAoaGRyLT5wZHVfbGVuKSwgcGFzc3dkKSkgewotICAgICAgaXNpc19ldmVudF9hdXRoX2ZhaWx1cmUgKGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLAotCQkJICAgICAgICJMU1AgYXV0aGVudGljYXRpb24gZmFpbHVyZSIsCi0JCQkgICAgICAgaGRyLT5sc3BfaWQpOwotICAgICAgcmV0dXJuIElTSVNfV0FSTklORzsKKyAgaWYgKHBhc3N3ZC0+dHlwZSkKKyAgICB7CisgICAgICBpZiAoaXNpc19sc3BfYXV0aGluZm9fY2hlY2sgKGNpcmN1aXQtPnJjdl9zdHJlYW0sIGNpcmN1aXQtPmFyZWEsCisJCQkJICAgbnRvaHMgKGhkci0+cGR1X2xlbiksIHBhc3N3ZCkpCisJeworCSAgaXNpc19ldmVudF9hdXRoX2ZhaWx1cmUgKGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLAorCQkJCSAgICJMU1AgYXV0aGVudGljYXRpb24gZmFpbHVyZSIsIGhkci0+bHNwX2lkKTsKKwkgIHJldHVybiBJU0lTX1dBUk5JTkc7CisJfQogICAgIH0KLSAgfQogICAvKiBGaW5kIHRoZSBMU1AgaW4gb3VyIGRhdGFiYXNlIGFuZCBjb21wYXJlIGl0IHRvIHRoaXMgTGluayBTdGF0ZSBoZWFkZXIgKi8KICAgbHNwID0gbHNwX3NlYXJjaCAoaGRyLT5sc3BfaWQsIGNpcmN1aXQtPmFyZWEtPmxzcGRiW2xldmVsIC0gMV0pOwogICBpZiAobHNwKQotICAgIGNvbXAgPSBsc3BfY29tcGFyZSAoY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsIGxzcCwgaGRyLT5zZXFfbnVtLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGhkci0+Y2hlY2tzdW0sIGhkci0+cmVtX2xpZmV0aW1lKTsKLSAgaWYgKGxzcCAmJiAobHNwLT5vd25fbHNwIAorICAgIGNvbXAgPSBsc3BfY29tcGFyZSAoY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsIGxzcCwgaGRyLT5zZXFfbnVtLAorCQkJaGRyLT5jaGVja3N1bSwgaGRyLT5yZW1fbGlmZXRpbWUpOworICBpZiAobHNwICYmIChsc3AtPm93bl9sc3AKICNpZmRlZiBUT1BPTE9HWV9HRU5FUkFURQotICAgICAgICAgICAgICB8fCBsc3AtPmZyb21fdG9wb2xvZ3kKKwkgICAgICB8fCBsc3AtPmZyb21fdG9wb2xvZ3kKICNlbmRpZiAvKiBUT1BPTE9HWV9HRU5FUkFURSAqLwotICAgICAgICAgICAgICApKQorICAgICAgKSkKICAgICBnb3RvIGRvbnRjaGVja2FkajsKIAogICAvKiA3LjMuMTUuMSBhKSA2IC0gTXVzdCBjaGVjayB0aGF0IHdlIGhhdmUgYW4gYWRqYWNlbmN5IG9mIHRoZSBzYW1lIGxldmVsICAqLwogICAvKiBmb3IgYnJvYWRjYXN0IGNpcmN1aXRzLCBzbnBhIHNob3VsZCBiZSBjb21wYXJlZCAqLwogICAvKiBGSVhNRSA6IFBvaW50IFRvIFBvaW50ICovCiAKLSAgaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSA9PSBDSVJDVUlUX1RfQlJPQURDQVNUKSB7Ci0gICAgYWRqID0gaXNpc19hZGpfbG9va3VwX3NucGEgKHNzbnBhLCBjaXJjdWl0LT51LmJjLmFkamRiW2xldmVsIC0gMV0pOwotICAgIGlmICghYWRqKSB7Ci0gICAgICB6bG9nX2luZm8gKCIoJXMpOiBEUyA9PT09PT09IExTUCAlcywgc2VxIDB4JTA4eCwgY2tzdW0gMHglMDR4LCAiCi0JCSAibGlmZXRpbWUgJXVzIG9uICVzIiwKLQkJIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLAotCQkgcmF3bHNwaWRfcHJpbnQgKGhkci0+bHNwX2lkKSwKLQkJIG50b2hsIChoZHItPnNlcV9udW0pLAotCQkgbnRvaHMgKGhkci0+Y2hlY2tzdW0pLAotCQkgbnRvaHMgKGhkci0+cmVtX2xpZmV0aW1lKSwgCi0JCSBjaXJjdWl0LT5pbnRlcmZhY2UtPm5hbWUpOwotICAgICAgcmV0dXJuIElTSVNfV0FSTklORzsgLyogU2lsZW50bHkgZGlzY2FyZCAqLworICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QpCisgICAgeworICAgICAgYWRqID0gaXNpc19hZGpfbG9va3VwX3NucGEgKHNzbnBhLCBjaXJjdWl0LT51LmJjLmFkamRiW2xldmVsIC0gMV0pOworICAgICAgaWYgKCFhZGopCisJeworCSAgemxvZ19pbmZvICgiKCVzKTogRFMgPT09PT09PSBMU1AgJXMsIHNlcSAweCUwOHgsIGNrc3VtIDB4JTA0eCwgIgorCQkgICAgICJsaWZldGltZSAldXMgb24gJXMiLAorCQkgICAgIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLAorCQkgICAgIHJhd2xzcGlkX3ByaW50IChoZHItPmxzcF9pZCksCisJCSAgICAgbnRvaGwgKGhkci0+c2VxX251bSksCisJCSAgICAgbnRvaHMgKGhkci0+Y2hlY2tzdW0pLAorCQkgICAgIG50b2hzIChoZHItPnJlbV9saWZldGltZSksIGNpcmN1aXQtPmludGVyZmFjZS0+bmFtZSk7CisJICByZXR1cm4gSVNJU19XQVJOSU5HOwkvKiBTaWxlbnRseSBkaXNjYXJkICovCisJfQogICAgIH0KLSAgfQogCiAgIC8qIGZvciBub24gYnJvYWRjYXN0LCB3ZSBqdXN0IG5lZWQgdG8gZmluZCBzYW1lIGxldmVsIGFkaiAqLwotICBlbHNlIHsKLSAgICAvKiBJZiBubyBhZGosIG9yIG5vIHNoYXJpbmcgb2YgbGV2ZWwgKi8KLSAgICBpZiAoIWNpcmN1aXQtPnUucDJwLm5laWdoYm9yKSB7Ci0gICAgICByZXR1cm4gSVNJU19PSzsgLyogU2lsZW50bHkgZGlzY2FyZCAqLwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoKChsZXZlbCA9PSAxKSAmJiAKLSAgICAgICAgICAgKGNpcmN1aXQtPnUucDJwLm5laWdoYm9yLT5hZGpfdXNhZ2UgPT0gSVNJU19BREpfTEVWRUwyKSkgfHwKLSAgICAgICAgICAoKGxldmVsID09IDIpICYmIAotICAgICAgICAgICAoY2lyY3VpdC0+dS5wMnAubmVpZ2hib3ItPmFkal91c2FnZSA9PSBJU0lTX0FESl9MRVZFTDEpKSkKLSAgICAgIHJldHVybiBJU0lTX1dBUk5JTkc7IC8qIFNpbGVudGx5IGRpc2NhcmQgKi8KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIG5vIGFkaiwgb3Igbm8gc2hhcmluZyBvZiBsZXZlbCAqLworICAgICAgaWYgKCFjaXJjdWl0LT51LnAycC5uZWlnaGJvcikKKwl7CisJICByZXR1cm4gSVNJU19PSzsJLyogU2lsZW50bHkgZGlzY2FyZCAqLworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoKChsZXZlbCA9PSAxKSAmJgorCSAgICAgICAoY2lyY3VpdC0+dS5wMnAubmVpZ2hib3ItPmFkal91c2FnZSA9PSBJU0lTX0FESl9MRVZFTDIpKSB8fAorCSAgICAgICgobGV2ZWwgPT0gMikgJiYKKwkgICAgICAgKGNpcmN1aXQtPnUucDJwLm5laWdoYm9yLT5hZGpfdXNhZ2UgPT0gSVNJU19BREpfTEVWRUwxKSkpCisJICAgIHJldHVybiBJU0lTX1dBUk5JTkc7CS8qIFNpbGVudGx5IGRpc2NhcmQgKi8KKwl9CiAgICAgfQotICB9Ci0gZG9udGNoZWNrYWRqOgorZG9udGNoZWNrYWRqOgogICAvKiA3LjMuMTUuMSBhKSA3IC0gUGFzc3dvcmRzIGZvciBsZXZlbCAxIC0gbm90IGltcGxlbWVudGVkICAqLwogCiAgIC8qIDcuMy4xNS4xIGEpIDggLSBQYXNzd29yZHMgZm9yIGxldmVsIDIgLSBub3QgaW1wbGVtZW50ZWQgICovCiAKLSAgLyogNy4zLjE1LjEgYSkgOSAtIE9yaWdpbmF0aW5nTFNQQnVmZmVyU2l6ZSAtIG5vdCBpbXBsZW1lbnRlZCAgRklYTUU6IGRvIGl0Ki8KKyAgLyogNy4zLjE1LjEgYSkgOSAtIE9yaWdpbmF0aW5nTFNQQnVmZmVyU2l6ZSAtIG5vdCBpbXBsZW1lbnRlZCAgRklYTUU6IGRvIGl0ICovCiAKKyAgLyogNy4zLjE1LjEgYikgLSBJZiB0aGUgcmVtYWluaW5nIGxpZmUgdGltZSBpcyAwLCB3ZSBwZXJmb3JtIDcuMy4xNi40ICovCisgIGlmIChoZHItPnJlbV9saWZldGltZSA9PSAwKQorICAgIHsKKyAgICAgIGlmICghbHNwKQorCXsKKwkgIC8qIDcuMy4xNi40IGEpIDEpIE5vIExTUCBpbiBkYiAtPiBzZW5kIGFuIGFjaywgYnV0IGRvbid0IHNhdmUgKi8KKwkgIC8qIG9ubHkgbmVlZGVkIG9uIGV4cGxpY2l0IHVwZGF0ZSwgZWcgLSBwMnAgKi8KKwkgIGlmIChjaXJjdWl0LT5jaXJjX3R5cGUgPT0gQ0lSQ1VJVF9UX1AyUCkKKwkgICAgYWNrX2xzcCAoaGRyLCBjaXJjdWl0LCBsZXZlbCk7CisJICByZXR1cm4gcmV0dmFsOwkvKiBGSVhNRTogZG8gd2UgbmVlZCBhIHB1cmdlPyAqLworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAobWVtY21wIChoZHItPmxzcF9pZCwgaXNpcy0+c3lzaWQsIElTSVNfU1lTX0lEX0xFTikpCisJICAgIHsKKwkgICAgICAvKiBMU1AgYnkgc29tZSBvdGhlciBzeXN0ZW0gLT4gZG8gNy4zLjE2LjQgYikgKi8KKwkgICAgICAvKiA3LjMuMTYuNCBiKSAxKSAgKi8KKwkgICAgICBpZiAoY29tcCA9PSBMU1BfTkVXRVIpCisJCXsKKwkJICBsc3BfdXBkYXRlIChsc3AsIGhkciwgY2lyY3VpdC0+cmN2X3N0cmVhbSwgY2lyY3VpdC0+YXJlYSk7CisJCSAgLyogaWkgKi8KKwkJICBJU0lTX0ZMQUdTX1NFVF9BTEwgKGxzcC0+U1JNZmxhZ3MpOworCQkgIC8qIGlpaSAqLworCQkgIElTSVNfQ0xFQVJfRkxBRyAobHNwLT5TUk1mbGFncywgY2lyY3VpdCk7CisJCSAgLyogdiAqLworCQkgIElTSVNfRkxBR1NfQ0xFQVJfQUxMIChsc3AtPlNTTmZsYWdzKTsJLyogRklYTUU6IE9USEVSIHRoYW4gYyAqLworCQkgIC8qIGl2ICovCisJCSAgaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSAhPSBDSVJDVUlUX1RfQlJPQURDQVNUKQorCQkgICAgSVNJU19TRVRfRkxBRyAobHNwLT5TU05mbGFncywgY2lyY3VpdCk7CiAKLSAgLyogNy4zLjE1LjEgYikgLSBJZiB0aGUgcmVtYWluaW5nIGxpZmUgdGltZSBpcyAwLCB3ZSBwZXJmb3JtIDcuMy4xNi40Ki8KLSAgaWYgKGhkci0+cmVtX2xpZmV0aW1lID09IDApIHsKLSAgICBpZiAoIWxzcCkgewotICAgICAgLyogNy4zLjE2LjQgYSkgMSkgTm8gTFNQIGluIGRiIC0+IHNlbmQgYW4gYWNrLCBidXQgZG9uJ3Qgc2F2ZSAqLwotICAgICAgLyogb25seSBuZWVkZWQgb24gZXhwbGljaXQgdXBkYXRlLCBlZyAtIHAycCAqLwotICAgICAgaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSA9PSBDSVJDVUlUX1RfUDJQKQotICAgICAgICBhY2tfbHNwIChoZHIsIGNpcmN1aXQsIGxldmVsKTsKLSAgICAgIHJldHVybiByZXR2YWw7IC8qIEZJWE1FOiBkbyB3ZSBuZWVkIGEgcHVyZ2U/ICovCi0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChtZW1jbXAgKGhkci0+bHNwX2lkLCBpc2lzLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOICkpIHsKLSAgICAgICAgLyogTFNQIGJ5IHNvbWUgb3RoZXIgc3lzdGVtIC0+IGRvIDcuMy4xNi40IGIpICovCi0gICAgICAgIC8qIDcuMy4xNi40IGIpIDEpICAqLwotICAgICAgICBpZiAoY29tcCA9PSBMU1BfTkVXRVIpIHsKLSAgICAgICAgICBsc3BfdXBkYXRlIChsc3AsIGhkciwgY2lyY3VpdC0+cmN2X3N0cmVhbSwgY2lyY3VpdC0+YXJlYSk7Ci0gICAgICAgICAgLyogaWkgKi8KLSAgICAgICAgICBJU0lTX0ZMQUdTX1NFVF9BTEwgKGxzcC0+U1JNZmxhZ3MpOyAgIAotICAgICAgICAgIC8qIGlpaSAqLwotICAgICAgICAgIElTSVNfQ0xFQVJfRkxBRyAobHNwLT5TUk1mbGFncywgY2lyY3VpdCk7Ci0gICAgICAgICAgLyogdiAqLwotICAgICAgICAgIElTSVNfRkxBR1NfQ0xFQVJfQUxMKGxzcC0+U1NOZmxhZ3MpOyAvKiBGSVhNRTogT1RIRVIgdGhhbiBjICovCi0gICAgICAgICAgLyogaXYgKi8KLSAgICAgICAgICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlICE9IENJUkNVSVRfVF9CUk9BRENBU1QpCi0gICAgICAgICAgICBJU0lTX1NFVF9GTEFHKGxzcC0+U1NOZmxhZ3MsIGNpcmN1aXQpOwotCi0gICAgICAgIH0gLyogNy4zLjE2LjQgYikgMikgKi8KLSAgICAgICAgZWxzZSBpZiAoY29tcCA9PSBMU1BfRVFVQUwpIHsKLSAgICAgICAgICAvKiBpICovCi0gICAgICAgICAgSVNJU19DTEVBUl9GTEFHKGxzcC0+U1JNZmxhZ3MsIGNpcmN1aXQpOwotICAgICAgICAgIC8qIGlpKi8KLSAgICAgICAgICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlICE9IENJUkNVSVRfVF9CUk9BRENBU1QpCi0gICAgICAgICAgICBJU0lTX1NFVF9GTEFHKGxzcC0+U1NOZmxhZ3MsIGNpcmN1aXQpOwotICAgICAgICB9ICAvKiA3LjMuMTYuNCBiKSAzKSAqLwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBJU0lTX1NFVF9GTEFHKGxzcC0+U1JNZmxhZ3MsIGNpcmN1aXQpOwotICAgICAgICAgIElTSVNfQ0xFQVJfRkxBRyhsc3AtPlNTTmZsYWdzLCBjaXJjdWl0KTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogb3VyIG93biBMU1AgLT4gNy4zLjE2LjQgYykgKi8KLSAgICAgICAgaWYgKExTUF9QU0VVRE9fSUQobHNwLT5sc3BfaGVhZGVyLT5sc3BfaWQpICE9IGNpcmN1aXQtPmNpcmN1aXRfaWQgfHwKLSAgICAgICAgICAgIChMU1BfUFNFVURPX0lEKGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkKSA9PSBjaXJjdWl0LT5jaXJjdWl0X2lkICYmCi0gICAgICAgICAgICAgY2lyY3VpdC0+dS5iYy5pc19kcltsZXZlbCAtIDFdID09IDEpICkgeyAKLSAgICAgICAgICBsc3AtPmxzcF9oZWFkZXItPnNlcV9udW0gPSBodG9ubCAobnRvaGwgKGhkci0+c2VxX251bSkgKyAxKTsKLSAgICAgICAgICB6bG9nX2luZm8gKCJMU1AgTEVOOiAlZCIsIG50b2hzIChsc3AtPmxzcF9oZWFkZXItPnBkdV9sZW4pKTsKLSAgICAgICAgICBpc29fY3N1bV9jcmVhdGUgKFNUUkVBTV9EQVRBIChsc3AtPnBkdSkgKyAxMiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5wZHVfbGVuKSAtIDEyLCAxMik7Ci0gICAgICAgICAgSVNJU19GTEFHU19TRVRfQUxMIChsc3AtPlNSTWZsYWdzKTsKLSAgICAgICAgICB6bG9nX2luZm8gKCJJU0lTLVVwZCAoJXMpOiAoMSkgcmUtb3JpZ2luYXRpbmcgTFNQICVzIG5ldyBzZXEgMHglMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLAotICAgICAgICAgICAgICAgICAgICAgcmF3bHNwaWRfcHJpbnQgKGhkci0+bHNwX2lkKSwKLSAgICAgICAgICAgICAgICAgICAgIG50b2hsIChsc3AtPmxzcF9oZWFkZXItPnNlcV9udW0pKTsKLSAgICAgICAgICBsc3AtPmxzcF9oZWFkZXItPnJlbV9saWZldGltZSA9IGh0b25zIChpc2lzX2ppdHRlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2lyY3VpdC0+YXJlYS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9sc3BfbGlmZXRpbWVbbGV2ZWwtMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9BR0VfSklUVEVSKSk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvKiBHb3QgcHVyZ2UgZm9yIG93biBwc2V1ZG8tbHNwLCBhbmQgd2UgYXJlIG5vdCBEUiAgKi8KLSAgICAgICAgICAgIGxzcF9wdXJnZV9kciAobHNwLT5sc3BfaGVhZGVyLT5sc3BfaWQsIGNpcmN1aXQsIGxldmVsKTsKLSAgICAgICAgfSAKLSAgICAgIH0KKwkJfQkJLyogNy4zLjE2LjQgYikgMikgKi8KKwkgICAgICBlbHNlIGlmIChjb21wID09IExTUF9FUVVBTCkKKwkJeworCQkgIC8qIGkgKi8KKwkJICBJU0lTX0NMRUFSX0ZMQUcgKGxzcC0+U1JNZmxhZ3MsIGNpcmN1aXQpOworCQkgIC8qIGlpICovCisJCSAgaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSAhPSBDSVJDVUlUX1RfQlJPQURDQVNUKQorCQkgICAgSVNJU19TRVRfRkxBRyAobHNwLT5TU05mbGFncywgY2lyY3VpdCk7CisJCX0JCS8qIDcuMy4xNi40IGIpIDMpICovCisJICAgICAgZWxzZQorCQl7CisJCSAgSVNJU19TRVRfRkxBRyAobHNwLT5TUk1mbGFncywgY2lyY3VpdCk7CisJCSAgSVNJU19DTEVBUl9GTEFHIChsc3AtPlNTTmZsYWdzLCBjaXJjdWl0KTsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBvdXIgb3duIExTUCAtPiA3LjMuMTYuNCBjKSAqLworCSAgICAgIGlmIChMU1BfUFNFVURPX0lEIChsc3AtPmxzcF9oZWFkZXItPmxzcF9pZCkgIT0KKwkJICBjaXJjdWl0LT5jaXJjdWl0X2lkCisJCSAgfHwgKExTUF9QU0VVRE9fSUQgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkKSA9PQorCQkgICAgICBjaXJjdWl0LT5jaXJjdWl0X2lkCisJCSAgICAgICYmIGNpcmN1aXQtPnUuYmMuaXNfZHJbbGV2ZWwgLSAxXSA9PSAxKSkKKwkJeworCQkgIGxzcC0+bHNwX2hlYWRlci0+c2VxX251bSA9IGh0b25sIChudG9obCAoaGRyLT5zZXFfbnVtKSArIDEpOworCQkgIHpsb2dfaW5mbyAoIkxTUCBMRU46ICVkIiwgbnRvaHMgKGxzcC0+bHNwX2hlYWRlci0+cGR1X2xlbikpOworCQkgIGlzb19jc3VtX2NyZWF0ZSAoU1RSRUFNX0RBVEEgKGxzcC0+cGR1KSArIDEyLAorCQkJCSAgIG50b2hzIChsc3AtPmxzcF9oZWFkZXItPnBkdV9sZW4pIC0gMTIsIDEyKTsKKwkJICBJU0lTX0ZMQUdTX1NFVF9BTEwgKGxzcC0+U1JNZmxhZ3MpOworCQkgIHpsb2dfaW5mbworCQkgICAgKCJJU0lTLVVwZCAoJXMpOiAoMSkgcmUtb3JpZ2luYXRpbmcgTFNQICVzIG5ldyBzZXEgMHglMDh4IiwKKwkJICAgICBjaXJjdWl0LT5hcmVhLT5hcmVhX3RhZywgcmF3bHNwaWRfcHJpbnQgKGhkci0+bHNwX2lkKSwKKwkJICAgICBudG9obCAobHNwLT5sc3BfaGVhZGVyLT5zZXFfbnVtKSk7CisJCSAgbHNwLT5sc3BfaGVhZGVyLT5yZW1fbGlmZXRpbWUgPQorCQkgICAgaHRvbnMgKGlzaXNfaml0dGVyCisJCQkgICAoY2lyY3VpdC0+YXJlYS0+bWF4X2xzcF9saWZldGltZVtsZXZlbCAtIDFdLAorCQkJICAgIE1BWF9BR0VfSklUVEVSKSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICAvKiBHb3QgcHVyZ2UgZm9yIG93biBwc2V1ZG8tbHNwLCBhbmQgd2UgYXJlIG5vdCBEUiAgKi8KKwkJICBsc3BfcHVyZ2VfZHIgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkLCBjaXJjdWl0LCBsZXZlbCk7CisJCX0KKwkgICAgfQorCX0KKyAgICAgIHJldHVybiByZXR2YWw7CiAgICAgfQotICAgIHJldHVybiByZXR2YWw7Ci0gIH0KICAgLyogNy4zLjE1LjEgYykgLSBJZiB0aGlzIGlzIG91ciBvd24gbHNwIGFuZCB3ZSBkb24ndCBoYXZlIGl0IGluaXRpYXRlIGEgCiAgICAqIHB1cmdlICovCi0gIGlmIChtZW1jbXAgKGhkci0+bHNwX2lkLCBpc2lzLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOICkgPT0gMCkgewotICAgIGlmICghbHNwKSB7Ci0gICAgLyogNy4zLjE2LjQ6IGluaXRpYXRlIGEgcHVyZ2UgKi8KLSAgICAgIGxzcF9wdXJnZV9ub25fZXhpc3QgKGhkciwgY2lyY3VpdC0+YXJlYSk7Ci0gICAgICByZXR1cm4gSVNJU19PSzsKKyAgaWYgKG1lbWNtcCAoaGRyLT5sc3BfaWQsIGlzaXMtPnN5c2lkLCBJU0lTX1NZU19JRF9MRU4pID09IDApCisgICAgeworICAgICAgaWYgKCFsc3ApCisJeworCSAgLyogNy4zLjE2LjQ6IGluaXRpYXRlIGEgcHVyZ2UgKi8KKwkgIGxzcF9wdXJnZV9ub25fZXhpc3QgKGhkciwgY2lyY3VpdC0+YXJlYSk7CisJICByZXR1cm4gSVNJU19PSzsKKwl9CisgICAgICAvKiA3LjMuMTUuMSBkKSAtIElmIHRoaXMgaXMgb3VyIG93biBsc3AgYW5kIHdlIGhhdmUgaXQgKi8KKworICAgICAgLyogSW4gNy4zLjE2LjEsIElmIGFuIEludGVybWVkaWF0ZSBzeXN0ZW0gUiBzb21ld2hlcmUgaW4gdGhlIGRvbWFpbgorICAgICAgICogaGFzIGluZm9ybWF0aW9uIHRoYXQgdGhlIGN1cnJlbnQgc2VxdWVuY2UgbnVtYmVyIGZvciBzb3VyY2UgUyBpcworICAgICAgICogImdyZWF0ZXIiIHRoYW4gdGhhdCBoZWxkIGJ5IFMsIC4uLiAqLworCisgICAgICBlbHNlIGlmIChudG9obCAoaGRyLT5zZXFfbnVtKSA+IG50b2hsIChsc3AtPmxzcF9oZWFkZXItPnNlcV9udW0pKQorCXsKKwkgIC8qIDcuMy4xNi4xICAqLworCSAgbHNwLT5sc3BfaGVhZGVyLT5zZXFfbnVtID0gaHRvbmwgKG50b2hsIChoZHItPnNlcV9udW0pICsgMSk7CisKKwkgIGlzb19jc3VtX2NyZWF0ZSAoU1RSRUFNX0RBVEEgKGxzcC0+cGR1KSArIDEyLAorCQkJICAgbnRvaHMgKGxzcC0+bHNwX2hlYWRlci0+cGR1X2xlbikgLSAxMiwgMTIpOworCisJICBJU0lTX0ZMQUdTX1NFVF9BTEwgKGxzcC0+U1JNZmxhZ3MpOworCSAgemxvZ19pbmZvCisJICAgICgiSVNJUy1VcGQgKCVzKTogKDIpIHJlLW9yaWdpbmF0aW5nIExTUCAlcyBuZXcgc2VxIDB4JTA4eCIsCisJICAgICBjaXJjdWl0LT5hcmVhLT5hcmVhX3RhZywgcmF3bHNwaWRfcHJpbnQgKGhkci0+bHNwX2lkKSwKKwkgICAgIG50b2hsIChsc3AtPmxzcF9oZWFkZXItPnNlcV9udW0pKTsKKwkgIGxzcC0+bHNwX2hlYWRlci0+cmVtX2xpZmV0aW1lID0KKwkgICAgaHRvbnMgKGlzaXNfaml0dGVyCisJCSAgIChjaXJjdWl0LT5hcmVhLT5tYXhfbHNwX2xpZmV0aW1lW2xldmVsIC0gMV0sCisJCSAgICBNQVhfQUdFX0pJVFRFUikpOworCX0KICAgICB9Ci0gICAgLyogNy4zLjE1LjEgZCkgLSBJZiB0aGlzIGlzIG91ciBvd24gbHNwIGFuZCB3ZSBoYXZlIGl0ICovCisgIGVsc2UKKyAgICB7CisgICAgICAvKiA3LjMuMTUuMSBlKSAtIFRoaXMgbHNwIG9yaWdpbmF0ZWQgb24gYW5vdGhlciBzeXN0ZW0gKi8KIAotICAgIC8qIEluIDcuMy4xNi4xLCBJZiBhbiBJbnRlcm1lZGlhdGUgc3lzdGVtIFIgc29tZXdoZXJlIGluIHRoZSBkb21haW4KLSAgICAgKiBoYXMgaW5mb3JtYXRpb24gdGhhdCB0aGUgY3VycmVudCBzZXF1ZW5jZSBudW1iZXIgZm9yIHNvdXJjZSBTIGlzCi0gICAgICogImdyZWF0ZXIiIHRoYW4gdGhhdCBoZWxkIGJ5IFMsIC4uLiAqLwotCi0gICAgZWxzZSBpZiAobnRvaGwgKGhkci0+c2VxX251bSkgPiBudG9obCAobHNwLT5sc3BfaGVhZGVyLT5zZXFfbnVtKSkgewotICAgICAgLyogNy4zLjE2LjEgICovCi0gICAgICBsc3AtPmxzcF9oZWFkZXItPnNlcV9udW0gPSBodG9ubCAobnRvaGwgKGhkci0+c2VxX251bSkgKyAxKTsKLQotICAgICAgaXNvX2NzdW1fY3JlYXRlIChTVFJFQU1fREFUQSAobHNwLT5wZHUpICsgMTIsIAotICAgICAgICAgICAgICAgICAgICAgICBudG9ocyhsc3AtPmxzcF9oZWFkZXItPnBkdV9sZW4pIC0gMTIsIDEyKTsKLQotICAgICAgSVNJU19GTEFHU19TRVRfQUxMIChsc3AtPlNSTWZsYWdzKTsKLSAgICAgIHpsb2dfaW5mbyAoIklTSVMtVXBkICglcyk6ICgyKSByZS1vcmlnaW5hdGluZyBMU1AgJXMgbmV3IHNlcSAweCUwOHgiLAotICAgICAgICAgICAgICAgICBjaXJjdWl0LT5hcmVhLT5hcmVhX3RhZywKLSAgICAgICAgICAgICAgICAgcmF3bHNwaWRfcHJpbnQgKGhkci0+bHNwX2lkKSwKLSAgICAgICAgICAgICAgICAgbnRvaGwgKGxzcC0+bHNwX2hlYWRlci0+c2VxX251bSkpOwotICAgICAgbHNwLT5sc3BfaGVhZGVyLT5yZW1fbGlmZXRpbWUgPSBodG9ucyAoaXNpc19qaXR0ZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2lyY3VpdC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYS0+bWF4X2xzcF9saWZldGltZVtsZXZlbC0xXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfQUdFX0pJVFRFUikpOwotCi0gICAgfQotICB9IGVsc2UgewotICAvKiA3LjMuMTUuMSBlKSAtIFRoaXMgbHNwIG9yaWdpbmF0ZWQgb24gYW5vdGhlciBzeXN0ZW0gKi8KLQotICAgIC8qIDcuMy4xNS4xIGUpIDEpIExTUCBuZXdlciB0aGFuIHRoZSBvbmUgaW4gZGIgb3Igbm8gTFNQIGluIGRiICovCi0gICAgaWYgKCghbHNwIHx8IGNvbXAgPT0gTFNQX05FV0VSKSl7Ci0gICAgICAvKiBpICovCi0gICAgICBpZiAobHNwKSB7CisgICAgICAvKiA3LjMuMTUuMSBlKSAxKSBMU1AgbmV3ZXIgdGhhbiB0aGUgb25lIGluIGRiIG9yIG5vIExTUCBpbiBkYiAqLworICAgICAgaWYgKCghbHNwIHx8IGNvbXAgPT0gTFNQX05FV0VSKSkKKwl7CisJICAvKiBpICovCisJICBpZiAobHNwKQorCSAgICB7CiAjaWZkZWYgRVhUUkVNRV9ERUJVRwotICAgICAgICB6bG9nX2luZm8gKCJsZXZlbCAlZCBudW1iZXIgaXMgLSAlbGQiLCBsZXZlbCwgCi0gICAgICAgICAgICAgICAgICAgY2lyY3VpdC0+YXJlYS0+bHNwZGJbbGV2ZWwtMV0tPmRpY3Rfbm9kZWNvdW50KTsKKwkgICAgICB6bG9nX2luZm8gKCJsZXZlbCAlZCBudW1iZXIgaXMgLSAlbGQiLCBsZXZlbCwKKwkJCSBjaXJjdWl0LT5hcmVhLT5sc3BkYltsZXZlbCAtIDFdLT5kaWN0X25vZGVjb3VudCk7CiAjZW5kaWYgLyogRVhUUkVNRSBERUJVRyAqLwotICAgICAgICBsc3Bfc2VhcmNoX2FuZF9kZXN0cm95IChoZHItPmxzcF9pZCwgY2lyY3VpdC0+YXJlYS0+bHNwZGJbbGV2ZWwtMV0pOwotICAgICAgICAvKiBleGlzdHMsIHNvIHdlIG92ZXJ3cml0ZSAqLworCSAgICAgIGxzcF9zZWFyY2hfYW5kX2Rlc3Ryb3kgKGhkci0+bHNwX2lkLAorCQkJCSAgICAgIGNpcmN1aXQtPmFyZWEtPmxzcGRiW2xldmVsIC0gMV0pOworCSAgICAgIC8qIGV4aXN0cywgc28gd2Ugb3ZlcndyaXRlICovCiAjaWZkZWYgRVhUUkVNRV9ERUJVRwotICAgICAgICB6bG9nX2luZm8gKCJsZXZlbCAlZCBudW1iZXIgaXMgLSAlbGQiLGxldmVsLCAKLSAgICAgICAgICAgICAgICAgICBjaXJjdWl0LT5hcmVhLT5sc3BkYltsZXZlbC0xXS0+ZGljdF9ub2RlY291bnQpOworCSAgICAgIHpsb2dfaW5mbyAoImxldmVsICVkIG51bWJlciBpcyAtICVsZCIsIGxldmVsLAorCQkJIGNpcmN1aXQtPmFyZWEtPmxzcGRiW2xldmVsIC0gMV0tPmRpY3Rfbm9kZWNvdW50KTsKICNlbmRpZiAvKiBFWFRSRU1FIERFQlVHICovCi0gICAgICB9Ci0gICAgICAvKgotICAgICAgICogSWYgdGhpcyBsc3AgaXMgYSBmcmFnLCBuZWVkIHRvIHNlZSBpZiB3ZSBoYXZlIHplcm8gbHNwIHByZXNlbnQKLSAgICAgICAqLwotICAgICAgaWYgKExTUF9GUkFHTUVOVCAoaGRyLT5sc3BfaWQpICE9IDApIHsKLSAgICAgICAgbWVtY3B5IChsc3BpZCwgaGRyLT5sc3BfaWQsIElTSVNfU1lTX0lEX0xFTiArIDEpOwotICAgICAgICBMU1BfRlJBR01FTlQgKGxzcGlkKSA9IDA7Ci0gICAgICAgIGxzcDAgPSBsc3Bfc2VhcmNoIChsc3BpZCwgY2lyY3VpdC0+YXJlYS0+bHNwZGJbbGV2ZWwgLSAxXSk7Ci0gICAgICAgIGlmICghbHNwMCkgewotICAgICAgICAgIHpsb2dfaW5mbyAoIkdvdCBsc3AgZnJhZywgd2hpbGUgemVybyBsc3Agbm90IGRhdGFiYXNlIik7Ci0gICAgICAgICAgcmV0dXJuIElTSVNfT0s7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGxzcCA9IGxzcF9uZXdfZnJvbV9zdHJlYW1fcHRyIChjaXJjdWl0LT5yY3Zfc3RyZWFtLCBudG9ocyAoaGRyLT5wZHVfbGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsc3AwLCBjaXJjdWl0LT5hcmVhKTsKLSAgICAgIGxzcC0+bGV2ZWwgPSBsZXZlbDsKLSAgICAgIGxzcC0+YWRqID0gYWRqOwotICAgICAgbHNwX2luc2VydCAobHNwLCBjaXJjdWl0LT5hcmVhLT5sc3BkYltsZXZlbC0xXSk7Ci0gICAgICAvKiBpaSAqLwotICAgICAgSVNJU19GTEFHU19TRVRfQUxMIChsc3AtPlNSTWZsYWdzKTsKLSAgICAgIC8qIGlpaSAqLwotICAgICAgSVNJU19DTEVBUl9GTEFHIChsc3AtPlNSTWZsYWdzLCBjaXJjdWl0KTsKKwkgICAgfQorCSAgLyoKKwkgICAqIElmIHRoaXMgbHNwIGlzIGEgZnJhZywgbmVlZCB0byBzZWUgaWYgd2UgaGF2ZSB6ZXJvIGxzcCBwcmVzZW50CisJICAgKi8KKwkgIGlmIChMU1BfRlJBR01FTlQgKGhkci0+bHNwX2lkKSAhPSAwKQorCSAgICB7CisJICAgICAgbWVtY3B5IChsc3BpZCwgaGRyLT5sc3BfaWQsIElTSVNfU1lTX0lEX0xFTiArIDEpOworCSAgICAgIExTUF9GUkFHTUVOVCAobHNwaWQpID0gMDsKKwkgICAgICBsc3AwID0gbHNwX3NlYXJjaCAobHNwaWQsIGNpcmN1aXQtPmFyZWEtPmxzcGRiW2xldmVsIC0gMV0pOworCSAgICAgIGlmICghbHNwMCkKKwkJeworCQkgIHpsb2dfaW5mbyAoIkdvdCBsc3AgZnJhZywgd2hpbGUgemVybyBsc3Agbm90IGRhdGFiYXNlIik7CisJCSAgcmV0dXJuIElTSVNfT0s7CisJCX0KKwkgICAgfQorCSAgbHNwID0KKwkgICAgbHNwX25ld19mcm9tX3N0cmVhbV9wdHIgKGNpcmN1aXQtPnJjdl9zdHJlYW0sCisJCQkJICAgICBudG9ocyAoaGRyLT5wZHVfbGVuKSwgbHNwMCwKKwkJCQkgICAgIGNpcmN1aXQtPmFyZWEpOworCSAgbHNwLT5sZXZlbCA9IGxldmVsOworCSAgbHNwLT5hZGogPSBhZGo7CisJICBsc3BfaW5zZXJ0IChsc3AsIGNpcmN1aXQtPmFyZWEtPmxzcGRiW2xldmVsIC0gMV0pOworCSAgLyogaWkgKi8KKwkgIElTSVNfRkxBR1NfU0VUX0FMTCAobHNwLT5TUk1mbGFncyk7CisJICAvKiBpaWkgKi8KKwkgIElTSVNfQ0xFQVJfRkxBRyAobHNwLT5TUk1mbGFncywgY2lyY3VpdCk7CiAKLSAgICAgIC8qIGl2ICovCi0gICAgICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlICE9IENJUkNVSVRfVF9CUk9BRENBU1QpCi0gICAgICAgIElTSVNfU0VUX0ZMQUcgKGxzcC0+U1NOZmxhZ3MsIGNpcmN1aXQpOwotICAgICAgLyogRklYTUU6IHYpICovCisJICAvKiBpdiAqLworCSAgaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSAhPSBDSVJDVUlUX1RfQlJPQURDQVNUKQorCSAgICBJU0lTX1NFVF9GTEFHIChsc3AtPlNTTmZsYWdzLCBjaXJjdWl0KTsKKwkgIC8qIEZJWE1FOiB2KSAqLworCX0KKyAgICAgIC8qIDcuMy4xNS4xIGUpIDIpIExTUCBlcXVhbCB0byB0aGUgb25lIGluIGRiICovCisgICAgICBlbHNlIGlmIChjb21wID09IExTUF9FUVVBTCkKKwl7CisJICBJU0lTX0NMRUFSX0ZMQUcgKGxzcC0+U1JNZmxhZ3MsIGNpcmN1aXQpOworCSAgbHNwX3VwZGF0ZSAobHNwLCBoZHIsIGNpcmN1aXQtPnJjdl9zdHJlYW0sIGNpcmN1aXQtPmFyZWEpOworCSAgaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSAhPSBDSVJDVUlUX1RfQlJPQURDQVNUKQorCSAgICB7CisJICAgICAgSVNJU19TRVRfRkxBRyAobHNwLT5TU05mbGFncywgY2lyY3VpdCk7CisJICAgIH0KKwl9CisgICAgICAvKiA3LjMuMTUuMSBlKSAzKSBMU1Agb2xkZXIgdGhhbiB0aGUgb25lIGluIGRiICovCisgICAgICBlbHNlCisJeworCSAgSVNJU19TRVRfRkxBRyAobHNwLT5TUk1mbGFncywgY2lyY3VpdCk7CisJICBJU0lTX0NMRUFSX0ZMQUcgKGxzcC0+U1NOZmxhZ3MsIGNpcmN1aXQpOworCX0KICAgICB9Ci0gICAgLyogNy4zLjE1LjEgZSkgMikgTFNQIGVxdWFsIHRvIHRoZSBvbmUgaW4gZGIgKi8KLSAgICBlbHNlIGlmIChjb21wID09IExTUF9FUVVBTCkgewotICAgICAgSVNJU19DTEVBUl9GTEFHIChsc3AtPlNSTWZsYWdzLCBjaXJjdWl0KTsKLSAgICAgIGxzcF91cGRhdGUgKGxzcCwgaGRyLCBjaXJjdWl0LT5yY3Zfc3RyZWFtLCBjaXJjdWl0LT5hcmVhKTsKLSAgICAgIGlmIChjaXJjdWl0LT5jaXJjX3R5cGUgIT0gQ0lSQ1VJVF9UX0JST0FEQ0FTVCkgewotICAgICAgICBJU0lTX1NFVF9GTEFHIChsc3AtPlNTTmZsYWdzLCBjaXJjdWl0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogNy4zLjE1LjEgZSkgMykgTFNQIG9sZGVyIHRoYW4gdGhlIG9uZSBpbiBkYiAqLwotICAgIGVsc2UgewotICAgICAgSVNJU19TRVRfRkxBRyhsc3AtPlNSTWZsYWdzLCBjaXJjdWl0KTsKLSAgICAgIElTSVNfQ0xFQVJfRkxBRyhsc3AtPlNTTmZsYWdzLCBjaXJjdWl0KTsKLSAgICB9Ci0gIH0KICAgaWYgKGxzcCkKICAgICBsc3AtPmFkaiA9IGFkajsKICAgcmV0dXJuIHJldHZhbDsKQEAgLTExMzAsOCArMTI2OSw4IEBACiAgKi8KIAogaW50Ci1wcm9jZXNzX3NucCAoaW50IHNucF90eXBlLCBpbnQgbGV2ZWwsIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsIAotICAgICAgICAgICAgIHVfY2hhciAqc3NucGEpCitwcm9jZXNzX3NucCAoaW50IHNucF90eXBlLCBpbnQgbGV2ZWwsIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsCisJICAgICB1X2NoYXIgKiBzc25wYSkKIHsKICAgaW50IHJldHZhbCA9IElTSVNfT0s7CiAgIGludCBjbXAsIG93bl9sc3A7CkBAIC0xMTQzLDc2ICsxMjgyLDgyIEBACiAgIHVpbnQzMl90IGZvdW5kID0gMCwgZXhwZWN0ZWQgPSAwOwogICBzdHJ1Y3QgaXNpc19sc3AgKmxzcDsKICAgc3RydWN0IGxzcF9lbnRyeSAqZW50cnk7Ci0gIHN0cnVjdCBsaXN0bm9kZSAqbm9kZSwqbm9kZTI7CisgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZSwgKm5vZGUyOwogICBzdHJ1Y3QgdGx2cyB0bHZzOwogICBzdHJ1Y3QgbGlzdCAqbHNwX2xpc3QgPSBOVUxMOwogICBzdHJ1Y3QgaXNpc19wYXNzd2QgKnBhc3N3ZDsKIAotICBpZiAoc25wX3R5cGUgPT0gSVNJU19TTlBfQ1NOUF9GTEFHKSB7Ci0gIC8qIGdldHRpbmcgdGhlIGhlYWRlciBpbmZvICovCi0gICAgdHlwZWNoYXIgPSAnQyc7Ci0gICAgY2hkciA9IChzdHJ1Y3QgaXNpc19jb21wbGV0ZV9zZXFudW1faGRyKilTVFJFQU1fUE5UKGNpcmN1aXQtPnJjdl9zdHJlYW0pOwotICAgIGNpcmN1aXQtPnJjdl9zdHJlYW0tPmdldHAgKz0gSVNJU19DU05QX0hEUkxFTjsKLSAgICBsZW4gPSBudG9ocyhjaGRyLT5wZHVfbGVuKTsKLSAgICBpZiAobGVuIDwgSVNJU19DU05QX0hEUkxFTikgewotICAgICAgemxvZ193YXJuICgiUmVjZWl2ZWQgYSBDU05QIHdpdGggYm9ndXMgbGVuZ3RoISIpOwotICAgICAgcmV0dXJuIElTSVNfT0s7CisgIGlmIChzbnBfdHlwZSA9PSBJU0lTX1NOUF9DU05QX0ZMQUcpCisgICAgeworICAgICAgLyogZ2V0dGluZyB0aGUgaGVhZGVyIGluZm8gKi8KKyAgICAgIHR5cGVjaGFyID0gJ0MnOworICAgICAgY2hkciA9CisJKHN0cnVjdCBpc2lzX2NvbXBsZXRlX3NlcW51bV9oZHIgKikgU1RSRUFNX1BOVCAoY2lyY3VpdC0+cmN2X3N0cmVhbSk7CisgICAgICBjaXJjdWl0LT5yY3Zfc3RyZWFtLT5nZXRwICs9IElTSVNfQ1NOUF9IRFJMRU47CisgICAgICBsZW4gPSBudG9ocyAoY2hkci0+cGR1X2xlbik7CisgICAgICBpZiAobGVuIDwgSVNJU19DU05QX0hEUkxFTikKKwl7CisJICB6bG9nX3dhcm4gKCJSZWNlaXZlZCBhIENTTlAgd2l0aCBib2d1cyBsZW5ndGghIik7CisJICByZXR1cm4gSVNJU19PSzsKKwl9CiAgICAgfQotICB9IGVsc2UgewotICAgIHR5cGVjaGFyID0gJ1AnOwotICAgIHBoZHIgPSAoc3RydWN0IGlzaXNfcGFydGlhbF9zZXFudW1faGRyKilTVFJFQU1fUE5UKGNpcmN1aXQtPnJjdl9zdHJlYW0pOwotICAgIGNpcmN1aXQtPnJjdl9zdHJlYW0tPmdldHAgKz0gSVNJU19QU05QX0hEUkxFTjsKLSAgICBsZW4gPSBudG9ocyhwaGRyLT5wZHVfbGVuKTsKLSAgICBpZiAobGVuIDwgSVNJU19QU05QX0hEUkxFTikgewotICAgICAgemxvZ193YXJuICgiUmVjZWl2ZWQgYSBDU05QIHdpdGggYm9ndXMgbGVuZ3RoISIpOwotICAgICAgcmV0dXJuIElTSVNfT0s7CisgIGVsc2UKKyAgICB7CisgICAgICB0eXBlY2hhciA9ICdQJzsKKyAgICAgIHBoZHIgPQorCShzdHJ1Y3QgaXNpc19wYXJ0aWFsX3NlcW51bV9oZHIgKikgU1RSRUFNX1BOVCAoY2lyY3VpdC0+cmN2X3N0cmVhbSk7CisgICAgICBjaXJjdWl0LT5yY3Zfc3RyZWFtLT5nZXRwICs9IElTSVNfUFNOUF9IRFJMRU47CisgICAgICBsZW4gPSBudG9ocyAocGhkci0+cGR1X2xlbik7CisgICAgICBpZiAobGVuIDwgSVNJU19QU05QX0hEUkxFTikKKwl7CisJICB6bG9nX3dhcm4gKCJSZWNlaXZlZCBhIENTTlAgd2l0aCBib2d1cyBsZW5ndGghIik7CisJICByZXR1cm4gSVNJU19PSzsKKwl9CiAgICAgfQotICB9CiAKICAgLyogNy4zLjE1LjIgYSkgMSAtIGV4dGVybmFsIGRvbWFpbiBjaXJjdWl0IHdpbGwgZGlzY2FyZCBzbnAgcGR1ICovCi0gIGlmIChjaXJjdWl0LT5leHRfZG9tYWluKSB7CisgIGlmIChjaXJjdWl0LT5leHRfZG9tYWluKQorICAgIHsKIAotICAgIHpsb2dfaW5mbyAoIklTSVMtU25wICglcyk6IFJjdmQgTCVkICVjU05QIG9uICVzLCAiCi0JICAgICAgICJza2lwcGluZzogY2lyY3VpdCBleHRlcm5hbERvbWFpbiA9IHRydWUiLAotCSAgICAgICBjaXJjdWl0LT5hcmVhLT5hcmVhX3RhZywKLQkgICAgICAgbGV2ZWwsCi0JICAgICAgIHR5cGVjaGFyLAotCSAgICAgICBjaXJjdWl0LT5pbnRlcmZhY2UtPm5hbWUpOwotCi0gICAgcmV0dXJuIElTSVNfT0s7Ci0gIH0KLQotICAvKiA3LjMuMTUuMiBhKSAyLDMgLSBtYW51YWxMMk9ubHlNb2RlIG5vdCBpbXBsZW1lbnRlZCAqLwotICBpZiAoIWFjY2VwdF9sZXZlbCAobGV2ZWwsIGNpcmN1aXQtPmNpcmN1aXRfaXNfdHlwZSkpIHsKLQotICAgIHpsb2dfaW5mbyAoIklTSVMtU25wICglcyk6IFJjdmQgTCVkICVjU05QIG9uICVzLCAiCi0JICAgICAgICJza2lwcGluZzogY2lyY3VpdCB0eXBlICVzIGRvZXMgbm90IG1hdGNoIGxldmVsICVkIiwKLQkgICAgICAgY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsCi0JICAgICAgIGxldmVsLCAKLSAgICAgICAgICAgICAgIHR5cGVjaGFyLAotCSAgICAgICBjaXJjdWl0LT5pbnRlcmZhY2UtPm5hbWUsCi0JICAgICAgIGNpcmN1aXRfdDJzdHJpbmcgKGNpcmN1aXQtPmNpcmN1aXRfaXNfdHlwZSksCi0JICAgICAgIGxldmVsKTsKLQotICAgIHJldHVybiBJU0lTX09LOwotICB9Ci0KLSAgLyogNy4zLjE1LjIgYSkgNCAtIG5vdCBhcHBsaWNhYmxlIGZvciBDU05QICBvbmx5IFBTTlBzIG9uIGJyb2FkY2FzdCAqLwotICBpZiAoKHNucF90eXBlID09IElTSVNfU05QX1BTTlBfRkxBRykgJiYgCi0gICAgICAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QpKSB7Ci0gICAgaWYgKCFjaXJjdWl0LT51LmJjLmlzX2RyW2xldmVsLTFdKSB7Ci0KLSAgICAgIHpsb2dfaW5mbyAoIklTSVMtU25wICglcyk6IFJjdmQgTCVkICVjU05QIGZyb20gJXMgb24gJXMsICIKLQkJICJza2lwcGluZzogd2UgYXJlIG5vdCB0aGUgRElTIiwKKyAgICAgIHpsb2dfaW5mbyAoIklTSVMtU25wICglcyk6IFJjdmQgTCVkICVjU05QIG9uICVzLCAiCisJCSAic2tpcHBpbmc6IGNpcmN1aXQgZXh0ZXJuYWxEb21haW4gPSB0cnVlIiwKIAkJIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLAotICAgICAgICAgICAgICAgICBsZXZlbCwKLQkJIHR5cGVjaGFyLAotCQkgc25wYV9wcmludChzc25wYSksCi0JCSBjaXJjdWl0LT5pbnRlcmZhY2UtPm5hbWUpOworCQkgbGV2ZWwsIHR5cGVjaGFyLCBjaXJjdWl0LT5pbnRlcmZhY2UtPm5hbWUpOwogCiAgICAgICByZXR1cm4gSVNJU19PSzsKICAgICB9Ci0gIH0KKworICAvKiA3LjMuMTUuMiBhKSAyLDMgLSBtYW51YWxMMk9ubHlNb2RlIG5vdCBpbXBsZW1lbnRlZCAqLworICBpZiAoIWFjY2VwdF9sZXZlbCAobGV2ZWwsIGNpcmN1aXQtPmNpcmN1aXRfaXNfdHlwZSkpCisgICAgeworCisgICAgICB6bG9nX2luZm8gKCJJU0lTLVNucCAoJXMpOiBSY3ZkIEwlZCAlY1NOUCBvbiAlcywgIgorCQkgInNraXBwaW5nOiBjaXJjdWl0IHR5cGUgJXMgZG9lcyBub3QgbWF0Y2ggbGV2ZWwgJWQiLAorCQkgY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsCisJCSBsZXZlbCwKKwkJIHR5cGVjaGFyLAorCQkgY2lyY3VpdC0+aW50ZXJmYWNlLT5uYW1lLAorCQkgY2lyY3VpdF90MnN0cmluZyAoY2lyY3VpdC0+Y2lyY3VpdF9pc190eXBlKSwgbGV2ZWwpOworCisgICAgICByZXR1cm4gSVNJU19PSzsKKyAgICB9CisKKyAgLyogNy4zLjE1LjIgYSkgNCAtIG5vdCBhcHBsaWNhYmxlIGZvciBDU05QICBvbmx5IFBTTlBzIG9uIGJyb2FkY2FzdCAqLworICBpZiAoKHNucF90eXBlID09IElTSVNfU05QX1BTTlBfRkxBRykgJiYKKyAgICAgIChjaXJjdWl0LT5jaXJjX3R5cGUgPT0gQ0lSQ1VJVF9UX0JST0FEQ0FTVCkpCisgICAgeworICAgICAgaWYgKCFjaXJjdWl0LT51LmJjLmlzX2RyW2xldmVsIC0gMV0pCisJeworCisJICB6bG9nX2luZm8gKCJJU0lTLVNucCAoJXMpOiBSY3ZkIEwlZCAlY1NOUCBmcm9tICVzIG9uICVzLCAiCisJCSAgICAgInNraXBwaW5nOiB3ZSBhcmUgbm90IHRoZSBESVMiLAorCQkgICAgIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLAorCQkgICAgIGxldmVsLAorCQkgICAgIHR5cGVjaGFyLCBzbnBhX3ByaW50IChzc25wYSksIGNpcmN1aXQtPmludGVyZmFjZS0+bmFtZSk7CisKKwkgIHJldHVybiBJU0lTX09LOworCX0KKyAgICB9CiAKICAgLyogNy4zLjE1LjIgYSkgNSAtIG5lZWQgdG8gbWFrZSBzdXJlIElETGVuZ3RoIG1hdGNoZXMgLSBhbHJlYWR5IGNoZWNrZWQgKi8KIApAQCAtMTIyMiwxOSArMTM2NywyNyBAQAogICAvKiA3LjMuMTUuMiBhKSA3IC0gTXVzdCBjaGVjayB0aGF0IHdlIGhhdmUgYW4gYWRqYWNlbmN5IG9mIHRoZSBzYW1lIGxldmVsICAqLwogICAvKiBmb3IgYnJvYWRjYXN0IGNpcmN1aXRzLCBzbnBhIHNob3VsZCBiZSBjb21wYXJlZCAqLwogICAvKiBGSVhNRSA6IERvIHdlIG5lZWQgdG8gY2hlY2sgU05QQT8gKi8KLSAgaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSA9PSBDSVJDVUlUX1RfQlJPQURDQVNUKSB7Ci0gICAgaWYgKHNucF90eXBlID09IElTSVNfU05QX0NTTlBfRkxBRykgewotICAgICAgYWRqID0gaXNpc19hZGpfbG9va3VwIChjaGRyLT5zb3VyY2VfaWQsIGNpcmN1aXQtPnUuYmMuYWRqZGJbbGV2ZWwgLSAxXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIGEgcHNucCBvbiBhIGJyb2FkY2FzdCwgaG93IGxvdmVseSBvZiBKdW5pcGVyIDopICovCi0gICAgICBhZGogPSBpc2lzX2Fkal9sb29rdXAgKHBoZHItPnNvdXJjZV9pZCwgY2lyY3VpdC0+dS5iYy5hZGpkYltsZXZlbCAtIDFdKTsKKyAgaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSA9PSBDSVJDVUlUX1RfQlJPQURDQVNUKQorICAgIHsKKyAgICAgIGlmIChzbnBfdHlwZSA9PSBJU0lTX1NOUF9DU05QX0ZMQUcpCisJeworCSAgYWRqID0KKwkgICAgaXNpc19hZGpfbG9va3VwIChjaGRyLT5zb3VyY2VfaWQsIGNpcmN1aXQtPnUuYmMuYWRqZGJbbGV2ZWwgLSAxXSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIGEgcHNucCBvbiBhIGJyb2FkY2FzdCwgaG93IGxvdmVseSBvZiBKdW5pcGVyIDopICovCisJICBhZGogPQorCSAgICBpc2lzX2Fkal9sb29rdXAgKHBoZHItPnNvdXJjZV9pZCwgY2lyY3VpdC0+dS5iYy5hZGpkYltsZXZlbCAtIDFdKTsKKwl9CisgICAgICBpZiAoIWFkaikKKwlyZXR1cm4gSVNJU19PSzsJCS8qIFNpbGVudGx5IGRpc2NhcmQgKi8KICAgICB9Ci0gICAgaWYgKCFhZGopCi0gICAgICByZXR1cm4gSVNJU19PSzsgLyogU2lsZW50bHkgZGlzY2FyZCAqLwotICB9IGVsc2UgewotICAgIGlmICghY2lyY3VpdC0+dS5wMnAubmVpZ2hib3IpCi0gICAgICByZXR1cm4gSVNJU19PSzsgLyogU2lsZW50bHkgZGlzY2FyZCAqLwotICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIWNpcmN1aXQtPnUucDJwLm5laWdoYm9yKQorCXJldHVybiBJU0lTX09LOwkJLyogU2lsZW50bHkgZGlzY2FyZCAqLworICAgIH0KIAogICAvKiA3LjMuMTUuMiBhKSA4IC0gUGFzc3dvcmRzIGZvciBsZXZlbCAxIC0gbm90IGltcGxlbWVudGVkICAqLwogCkBAIC0xMjQ2LDE2MyArMTM5OSwxODMgQEAKICAgZXhwZWN0ZWQgfD0gVExWRkxBR19MU1BfRU5UUklFUzsKICAgZXhwZWN0ZWQgfD0gVExWRkxBR19BVVRIX0lORk87CiAgIHJldHZhbCA9IHBhcnNlX3RsdnMgKGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLAotCQkgICAgICAgU1RSRUFNX1BOVChjaXJjdWl0LT5yY3Zfc3RyZWFtKSwKKwkJICAgICAgIFNUUkVBTV9QTlQgKGNpcmN1aXQtPnJjdl9zdHJlYW0pLAogCQkgICAgICAgbGVuIC0gY2lyY3VpdC0+cmN2X3N0cmVhbS0+Z2V0cCwKLQkJICAgICAgICZleHBlY3RlZCwKLQkJICAgICAgICZmb3VuZCwKLQkJICAgICAgICZ0bHZzKTsKKwkJICAgICAgICZleHBlY3RlZCwgJmZvdW5kLCAmdGx2cyk7CiAKLSAgaWYgKHJldHZhbCA+IElTSVNfV0FSTklORykgewotICAgIHpsb2dfd2FybiAoInNvbWV0aGluZyB3ZW50IHZlcnkgd3JvbmcgcHJvY2Vzc2luZyBTTlAiKTsKLSAgICBmcmVlX3RsdnMgKCZ0bHZzKTsKLSAgICByZXR1cm4gcmV0dmFsOwotICB9CisgIGlmIChyZXR2YWwgPiBJU0lTX1dBUk5JTkcpCisgICAgeworICAgICAgemxvZ193YXJuICgic29tZXRoaW5nIHdlbnQgdmVyeSB3cm9uZyBwcm9jZXNzaW5nIFNOUCIpOworICAgICAgZnJlZV90bHZzICgmdGx2cyk7CisgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KIAogICAobGV2ZWwgPT0gMSkgPyAocGFzc3dkID0gJmNpcmN1aXQtPmFyZWEtPmFyZWFfcGFzc3dkKSA6Ci0JCSAgKHBhc3N3ZCA9ICZjaXJjdWl0LT5hcmVhLT5kb21haW5fcGFzc3dkKTsKLSAgaWYgKHBhc3N3ZC0+dHlwZSkgewotICAgIGlmICghKGZvdW5kICYgVExWRkxBR19BVVRIX0lORk8pIHx8Ci0JYXV0aGVudGljYXRpb25fY2hlY2sgKHBhc3N3ZCwgJnRsdnMuYXV0aF9pbmZvKSkgewotICAgICAgaXNpc19ldmVudF9hdXRoX2ZhaWx1cmUgKGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLCAiU05QIGF1dGhlbnRpY2F0aW9uIgotCQkJICAgICAgICIgZmFpbHVyZSIsIHBoZHIgPwotCQkJICAgICAgIHBoZHItPnNvdXJjZV9pZCA6IGNoZHItPnNvdXJjZV9pZCk7Ci0gICAgICByZXR1cm4gSVNJU19PSzsKLSAgICB9IAotICB9CisgICAgKHBhc3N3ZCA9ICZjaXJjdWl0LT5hcmVhLT5kb21haW5fcGFzc3dkKTsKKyAgaWYgKHBhc3N3ZC0+dHlwZSkKKyAgICB7CisgICAgICBpZiAoIShmb3VuZCAmIFRMVkZMQUdfQVVUSF9JTkZPKSB8fAorCSAgYXV0aGVudGljYXRpb25fY2hlY2sgKHBhc3N3ZCwgJnRsdnMuYXV0aF9pbmZvKSkKKwl7CisJICBpc2lzX2V2ZW50X2F1dGhfZmFpbHVyZSAoY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsCisJCQkJICAgIlNOUCBhdXRoZW50aWNhdGlvbiIgIiBmYWlsdXJlIiwKKwkJCQkgICBwaGRyID8gcGhkci0+c291cmNlX2lkIDogY2hkci0+c291cmNlX2lkKTsKKwkgIHJldHVybiBJU0lTX09LOworCX0KKyAgICB9CiAKICAgLyogZGVidWcgaXNpcyBzbnAtcGFja2V0cyAqLwotICBpZiAoaXNpcy0+ZGVidWdzICYgREVCVUdfU05QX1BBQ0tFVFMpIHsKLSAgICB6bG9nX2luZm8gKCJJU0lTLVNucCAoJXMpOiBSY3ZkIEwlZCAlY1NOUCBmcm9tICVzIG9uICVzIiwgCi0gICAgICAgICAgICAgICBjaXJjdWl0LT5hcmVhLT5hcmVhX3RhZywKLQkgICAgICAgbGV2ZWwsCi0JICAgICAgIHR5cGVjaGFyLAotCSAgICAgICBzbnBhX3ByaW50KHNzbnBhKSwKLSAgICAgICAgICAgICAgIGNpcmN1aXQtPmludGVyZmFjZS0+bmFtZSk7Ci0gICAgaWYgKHRsdnMubHNwX2VudHJpZXMpIHsKLSAgICAgIExJU1RfTE9PUCAodGx2cy5sc3BfZW50cmllcyxlbnRyeSxub2RlKSB7Ci0gICAgICAgIHpsb2dfaW5mbygiSVNJUy1TbnAgKCVzKTogICAgICAgICAlY1NOUCBlbnRyeSAlcywgc2VxIDB4JTA4eCwiCi0gICAgICAgICAgICAgICAgICAiIGNrc3VtIDB4JTA0eCwgbGlmZXRpbWUgJXVzIiwgCi0gICAgICAgICAgICAgICAgICBjaXJjdWl0LT5hcmVhLT5hcmVhX3RhZywKLSAgICAgICAgICAgICAgICAgIHR5cGVjaGFyLCAKLSAgICAgICAgICAgICAgICAgIHJhd2xzcGlkX3ByaW50IChlbnRyeS0+bHNwX2lkKSwKLSAgICAgICAgICAgICAgICAgIG50b2hsIChlbnRyeS0+c2VxX251bSksCi0gICAgICAgICAgICAgICAgICBudG9ocyAoZW50cnktPmNoZWNrc3VtKSwKLSAgICAgICAgICAgICAgICAgIG50b2hzIChlbnRyeS0+cmVtX2xpZmV0aW1lKSk7Ci0gICAgICB9CisgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19TTlBfUEFDS0VUUykKKyAgICB7CisgICAgICB6bG9nX2luZm8gKCJJU0lTLVNucCAoJXMpOiBSY3ZkIEwlZCAlY1NOUCBmcm9tICVzIG9uICVzIiwKKwkJIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLAorCQkgbGV2ZWwsCisJCSB0eXBlY2hhciwgc25wYV9wcmludCAoc3NucGEpLCBjaXJjdWl0LT5pbnRlcmZhY2UtPm5hbWUpOworICAgICAgaWYgKHRsdnMubHNwX2VudHJpZXMpCisJeworCSAgTElTVF9MT09QICh0bHZzLmxzcF9lbnRyaWVzLCBlbnRyeSwgbm9kZSkKKwkgIHsKKwkgICAgemxvZ19pbmZvICgiSVNJUy1TbnAgKCVzKTogICAgICAgICAlY1NOUCBlbnRyeSAlcywgc2VxIDB4JTA4eCwiCisJCSAgICAgICAiIGNrc3VtIDB4JTA0eCwgbGlmZXRpbWUgJXVzIiwKKwkJICAgICAgIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLAorCQkgICAgICAgdHlwZWNoYXIsCisJCSAgICAgICByYXdsc3BpZF9wcmludCAoZW50cnktPmxzcF9pZCksCisJCSAgICAgICBudG9obCAoZW50cnktPnNlcV9udW0pLAorCQkgICAgICAgbnRvaHMgKGVudHJ5LT5jaGVja3N1bSksIG50b2hzIChlbnRyeS0+cmVtX2xpZmV0aW1lKSk7CisJICB9CisJfQogICAgIH0KLSAgfQogCiAgIC8qIDcuMy4xNS4yIGIpIEFjdGlvbnMgb24gTFNQX0VOVFJJRVMgcmVwb3J0ZWQgKi8KLSAgaWYgKHRsdnMubHNwX2VudHJpZXMpIHsKLSAgICBMSVNUX0xPT1AgKHRsdnMubHNwX2VudHJpZXMsIGVudHJ5LCBub2RlKSB7Ci0gICAgICBsc3AgPSBsc3Bfc2VhcmNoIChlbnRyeS0+bHNwX2lkLCBjaXJjdWl0LT5hcmVhLT5sc3BkYltsZXZlbCAtIDFdKTsKLSAgICAgIG93bl9sc3AgPSAhbWVtY21wIChlbnRyeS0+bHNwX2lkLCBpc2lzLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOKTsKLSAgICAgIGlmIChsc3ApIHsKLSAgICAgICAgLyogNy4zLjE1LjIgYikgMSkgaXMgdGhpcyBMU1AgbmV3ZXIgKi8KLSAgICAgICAgY21wID0gbHNwX2NvbXBhcmUgKGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLCBsc3AsIGVudHJ5LT5zZXFfbnVtLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5jaGVja3N1bSwgZW50cnktPnJlbV9saWZldGltZSk7Ci0gICAgICAgIC8qIDcuMy4xNS4yIGIpIDIpIGlmIGl0IGVxdWFscywgY2xlYXIgU1JNIG9uIHAycCAqLwotICAgICAgICBpZiAoY21wID09IExTUF9FUVVBTCkgewotICAgICAgICAgIGlmIChjaXJjdWl0LT5jaXJjX3R5cGUgIT0gQ0lSQ1VJVF9UX0JST0FEQ0FTVCkgCi0gICAgICAgICAgICBJU0lTX0NMRUFSX0ZMQUcgKGxzcC0+U1JNZmxhZ3MsIGNpcmN1aXQpOwotICAgICAgICAgIC8qIDcuMy4xNS4yIGIpIDMpIGlmIGl0IGlzIG9sZGVyLCBjbGVhciBTU04gYW5kIHNldCBTUk0gKi8KLSAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gTFNQX09MREVSKSB7Ci0gICAgICAgICAgSVNJU19DTEVBUl9GTEFHIChsc3AtPlNTTmZsYWdzLCBjaXJjdWl0KTsKLSAgICAgICAgSVNJU19TRVRfRkxBRyAobHNwLT5TUk1mbGFncywgY2lyY3VpdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLyogNy4zLjE1LjIgYikgNCkgaWYgaXQgaXMgbmV3ZXIsIHNldCBTU04gYW5kIGNsZWFyIFNSTSBvbiBwMnAqLwotICAgICAgICAgIGlmIChvd25fbHNwKSB7Ci0gICAgICAgICAgICBsc3BfaW5jX3NlcW51bSAobHNwLCBudG9obCAoZW50cnktPnNlcV9udW0pKTsKLSAgICAgICAgICAgIElTSVNfU0VUX0ZMQUcgKGxzcC0+U1JNZmxhZ3MsIGNpcmN1aXQpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBJU0lTX1NFVF9GTEFHIChsc3AtPlNTTmZsYWdzLCBjaXJjdWl0KTsKLSAgICAgICAgICAgIGlmIChjaXJjdWl0LT5jaXJjX3R5cGUgIT0gQ0lSQ1VJVF9UX0JST0FEQ0FTVCkKLSAgICAgICAgICAgIElTSVNfQ0xFQVJfRkxBRyAobHNwLT5TUk1mbGFncywgY2lyY3VpdCk7IAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogNy4zLjE1LjIgYikgNSkgaWYgaXQgd2FzIG5vdCBmb3VuZCwgYW5kIGFsbCBvZiB0aG9zZSBhcmUgbm90IDAsIAotICAgICAgICAgKiBpbnNlcnQgaXQgYW5kIHNldCBTU04gb24gaXQgKi8KLSAgICAgICAgaWYgKGVudHJ5LT5yZW1fbGlmZXRpbWUgJiYgZW50cnktPmNoZWNrc3VtICYmIGVudHJ5LT5zZXFfbnVtICYmIAotICAgICAgICAgICAgbWVtY21wIChlbnRyeS0+bHNwX2lkLCBpc2lzLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOKSkgewotICAgICAgICAgIGxzcCA9IGxzcF9uZXcgKGVudHJ5LT5sc3BfaWQsIG50b2hzIChlbnRyeS0+cmVtX2xpZmV0aW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgZW50cnktPmNoZWNrc3VtLCBsZXZlbCk7Ci0gICAgICAgICAgbHNwX2luc2VydCAobHNwLCBjaXJjdWl0LT5hcmVhLT5sc3BkYltsZXZlbCAtIDFdKTsKLSAgICAgICAgICBJU0lTX1NFVF9GTEFHIChsc3AtPlNTTmZsYWdzLCBjaXJjdWl0KTsKLSAgICAgICAgfQorICBpZiAodGx2cy5sc3BfZW50cmllcykKKyAgICB7CisgICAgICBMSVNUX0xPT1AgKHRsdnMubHNwX2VudHJpZXMsIGVudHJ5LCBub2RlKQorICAgICAgeworCWxzcCA9IGxzcF9zZWFyY2ggKGVudHJ5LT5sc3BfaWQsIGNpcmN1aXQtPmFyZWEtPmxzcGRiW2xldmVsIC0gMV0pOworCW93bl9sc3AgPSAhbWVtY21wIChlbnRyeS0+bHNwX2lkLCBpc2lzLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOKTsKKwlpZiAobHNwKQorCSAgeworCSAgICAvKiA3LjMuMTUuMiBiKSAxKSBpcyB0aGlzIExTUCBuZXdlciAqLworCSAgICBjbXAgPSBsc3BfY29tcGFyZSAoY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsIGxzcCwgZW50cnktPnNlcV9udW0sCisJCQkgICAgICAgZW50cnktPmNoZWNrc3VtLCBlbnRyeS0+cmVtX2xpZmV0aW1lKTsKKwkgICAgLyogNy4zLjE1LjIgYikgMikgaWYgaXQgZXF1YWxzLCBjbGVhciBTUk0gb24gcDJwICovCisJICAgIGlmIChjbXAgPT0gTFNQX0VRVUFMKQorCSAgICAgIHsKKwkJaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSAhPSBDSVJDVUlUX1RfQlJPQURDQVNUKQorCQkgIElTSVNfQ0xFQVJfRkxBRyAobHNwLT5TUk1mbGFncywgY2lyY3VpdCk7CisJCS8qIDcuMy4xNS4yIGIpIDMpIGlmIGl0IGlzIG9sZGVyLCBjbGVhciBTU04gYW5kIHNldCBTUk0gKi8KKwkgICAgICB9CisJICAgIGVsc2UgaWYgKGNtcCA9PSBMU1BfT0xERVIpCisJICAgICAgeworCQlJU0lTX0NMRUFSX0ZMQUcgKGxzcC0+U1NOZmxhZ3MsIGNpcmN1aXQpOworCQlJU0lTX1NFVF9GTEFHIChsc3AtPlNSTWZsYWdzLCBjaXJjdWl0KTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCS8qIDcuMy4xNS4yIGIpIDQpIGlmIGl0IGlzIG5ld2VyLCBzZXQgU1NOIGFuZCBjbGVhciBTUk0KKwkJICogb24gcDJwICovCisJCWlmIChvd25fbHNwKQorCQkgIHsKKwkJICAgIGxzcF9pbmNfc2VxbnVtIChsc3AsIG50b2hsIChlbnRyeS0+c2VxX251bSkpOworCQkgICAgSVNJU19TRVRfRkxBRyAobHNwLT5TUk1mbGFncywgY2lyY3VpdCk7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgSVNJU19TRVRfRkxBRyAobHNwLT5TU05mbGFncywgY2lyY3VpdCk7CisJCSAgICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlICE9IENJUkNVSVRfVF9CUk9BRENBU1QpCisJCSAgICAgIElTSVNfQ0xFQVJfRkxBRyAobHNwLT5TUk1mbGFncywgY2lyY3VpdCk7CisJCSAgfQorCSAgICAgIH0KKwkgIH0KKwllbHNlCisJICB7CisJICAgIC8qIDcuMy4xNS4yIGIpIDUpIGlmIGl0IHdhcyBub3QgZm91bmQsIGFuZCBhbGwgb2YgdGhvc2UgYXJlIG5vdCAwLCAKKwkgICAgICogaW5zZXJ0IGl0IGFuZCBzZXQgU1NOIG9uIGl0ICovCisJICAgIGlmIChlbnRyeS0+cmVtX2xpZmV0aW1lICYmIGVudHJ5LT5jaGVja3N1bSAmJiBlbnRyeS0+c2VxX251bSAmJgorCQltZW1jbXAgKGVudHJ5LT5sc3BfaWQsIGlzaXMtPnN5c2lkLCBJU0lTX1NZU19JRF9MRU4pKQorCSAgICAgIHsKKwkJbHNwID0gbHNwX25ldyAoZW50cnktPmxzcF9pZCwgbnRvaHMgKGVudHJ5LT5yZW1fbGlmZXRpbWUpLAorCQkJICAgICAgIDAsIDAsIGVudHJ5LT5jaGVja3N1bSwgbGV2ZWwpOworCQlsc3BfaW5zZXJ0IChsc3AsIGNpcmN1aXQtPmFyZWEtPmxzcGRiW2xldmVsIC0gMV0pOworCQlJU0lTX1NFVF9GTEFHIChsc3AtPlNTTmZsYWdzLCBjaXJjdWl0KTsKKwkgICAgICB9CisJICB9CiAgICAgICB9CiAgICAgfQotICB9CiAKICAgLyogNy4zLjE1LjIgYykgb24gQ1NOUCBzZXQgU1JNIGZvciBhbGwgaW4gcmFuZ2Ugd2hpY2ggd2VyZSBub3QgcmVwb3J0ZWQgKi8KLSAgaWYgKHNucF90eXBlID09IElTSVNfU05QX0NTTlBfRkxBRykgewotICAgIC8qCi0gICAgICogQnVpbGQgYSBsaXN0IGZyb20gb3VyIG93biBMU1AgZGIgYm91bmRlZCB3aXRoIHN0YXJ0XyBhbmQgc3RvcF9sc3BfaWQKLSAgICAgKi8KLSAgICBsc3BfbGlzdCA9IGxpc3RfbmV3ICgpOwotICAgIGxzcF9idWlsZF9saXN0X25vbnplcm9faHQgKGNoZHItPnN0YXJ0X2xzcF9pZCwgY2hkci0+c3RvcF9sc3BfaWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzcF9saXN0LCBjaXJjdWl0LT5hcmVhLT5sc3BkYltsZXZlbCAtIDFdKTsKKyAgaWYgKHNucF90eXBlID09IElTSVNfU05QX0NTTlBfRkxBRykKKyAgICB7CisgICAgICAvKgorICAgICAgICogQnVpbGQgYSBsaXN0IGZyb20gb3VyIG93biBMU1AgZGIgYm91bmRlZCB3aXRoIHN0YXJ0XyBhbmQgc3RvcF9sc3BfaWQKKyAgICAgICAqLworICAgICAgbHNwX2xpc3QgPSBsaXN0X25ldyAoKTsKKyAgICAgIGxzcF9idWlsZF9saXN0X25vbnplcm9faHQgKGNoZHItPnN0YXJ0X2xzcF9pZCwgY2hkci0+c3RvcF9sc3BfaWQsCisJCQkJIGxzcF9saXN0LCBjaXJjdWl0LT5hcmVhLT5sc3BkYltsZXZlbCAtIDFdKTsKIAotICAgIC8qIEZpeG1lOiBGaW5kIGEgYmV0dGVyIHNvbHV0aW9uICovCi0gICAgaWYgKHRsdnMubHNwX2VudHJpZXMpIHsKLSAgICAgIExJU1RfTE9PUCAodGx2cy5sc3BfZW50cmllcywgZW50cnksIG5vZGUpIHsKLSAgICAgICAgTElTVF9MT09QIChsc3BfbGlzdCwgbHNwLCBub2RlMikgewotICAgICAgICAgIGlmIChsc3BfaWRfY21wIChsc3AtPmxzcF9oZWFkZXItPmxzcF9pZCwgZW50cnktPmxzcF9pZCkgPT0gMCkgewotICAgICAgICAgICAgbGlzdF9kZWxldGVfbm9kZSAobHNwX2xpc3QsIG5vZGUyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgIC8qIEZpeG1lOiBGaW5kIGEgYmV0dGVyIHNvbHV0aW9uICovCisgICAgICBpZiAodGx2cy5sc3BfZW50cmllcykKKwl7CisJICBMSVNUX0xPT1AgKHRsdnMubHNwX2VudHJpZXMsIGVudHJ5LCBub2RlKQorCSAgeworCSAgICBMSVNUX0xPT1AgKGxzcF9saXN0LCBsc3AsIG5vZGUyKQorCSAgICB7CisJICAgICAgaWYgKGxzcF9pZF9jbXAgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkLCBlbnRyeS0+bHNwX2lkKSA9PSAwKQorCQl7CisJCSAgbGlzdF9kZWxldGVfbm9kZSAobHNwX2xpc3QsIG5vZGUyKTsKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisJICB9CisJfQorICAgICAgLyogb24gcmVtYWluaW5nIExTUHMgd2Ugc2V0IFNSTSAobmVpZ2hib3Iga25ldyBub3Qgb2YpICovCisgICAgICBMSVNUX0xPT1AgKGxzcF9saXN0LCBsc3AsIG5vZGUyKQorICAgICAgeworCUlTSVNfU0VUX0ZMQUcgKGxzcC0+U1JNZmxhZ3MsIGNpcmN1aXQpOwogICAgICAgfQorICAgICAgLyogbGV0cyBmcmVlIGl0ICovCisgICAgICBsaXN0X2ZyZWUgKGxzcF9saXN0KTsKICAgICB9Ci0gICAgLyogb24gcmVtYWluaW5nIExTUHMgd2Ugc2V0IFNSTSAobmVpZ2hib3Iga25ldyBub3Qgb2YpICovCi0gICAgTElTVF9MT09QIChsc3BfbGlzdCwgbHNwLCBub2RlMikgewotICAgICAgSVNJU19TRVRfRkxBRyAobHNwLT5TUk1mbGFncywgY2lyY3VpdCk7Ci0gICAgfQotICAgIC8qIGxldHMgZnJlZSBpdCAqLwotICAgIGxpc3RfZnJlZSAobHNwX2xpc3QpOwotICB9CiAKICAgZnJlZV90bHZzICgmdGx2cyk7CiAgIHJldHVybiByZXR2YWw7CiB9CiAKIGludAotcHJvY2Vzc19jc25wIChpbnQgbGV2ZWwsIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsIHVfY2hhciAqc3NucGEpCitwcm9jZXNzX2NzbnAgKGludCBsZXZlbCwgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgdV9jaGFyICogc3NucGEpCiB7Ci0KICAgLyogU2FuaXR5IGNoZWNrIC0gRklYTUU6IG1vdmUgdG8gY29ycmVjdCBwbGFjZSAqLwotICBpZiAoKHN0cmVhbV9nZXRfZW5kcCAoY2lyY3VpdC0+cmN2X3N0cmVhbSkgLSAKLSAgICAgICBzdHJlYW1fZ2V0X2dldHAgKGNpcmN1aXQtPnJjdl9zdHJlYW0pKSA8IElTSVNfQ1NOUF9IRFJMRU4pIHsKLSAgICB6bG9nX3dhcm4gKCJQYWNrZXQgdG9vIHNob3J0ICggPCAlZCkiLCAgSVNJU19DU05QX0hEUkxFTik7Ci0gICAgcmV0dXJuIElTSVNfV0FSTklORzsKLSAgfQorICBpZiAoKHN0cmVhbV9nZXRfZW5kcCAoY2lyY3VpdC0+cmN2X3N0cmVhbSkgLQorICAgICAgIHN0cmVhbV9nZXRfZ2V0cCAoY2lyY3VpdC0+cmN2X3N0cmVhbSkpIDwgSVNJU19DU05QX0hEUkxFTikKKyAgICB7CisgICAgICB6bG9nX3dhcm4gKCJQYWNrZXQgdG9vIHNob3J0ICggPCAlZCkiLCBJU0lTX0NTTlBfSERSTEVOKTsKKyAgICAgIHJldHVybiBJU0lTX1dBUk5JTkc7CisgICAgfQogCiAgIHJldHVybiBwcm9jZXNzX3NucCAoSVNJU19TTlBfQ1NOUF9GTEFHLCBsZXZlbCwgY2lyY3VpdCwgc3NucGEpOwogfQogCi1pbnQgCi1wcm9jZXNzX3BzbnAgKGludCBsZXZlbCwgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgdV9jaGFyICpzc25wYSkKK2ludAorcHJvY2Vzc19wc25wIChpbnQgbGV2ZWwsIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsIHVfY2hhciAqIHNzbnBhKQogewotCi0gIGlmICgoc3RyZWFtX2dldF9lbmRwIChjaXJjdWl0LT5yY3Zfc3RyZWFtKSAtIAotICAgICAgIHN0cmVhbV9nZXRfZ2V0cCAoY2lyY3VpdC0+cmN2X3N0cmVhbSkpIDwgSVNJU19QU05QX0hEUkxFTikgewotICAgIHpsb2dfd2FybiAoIlBhY2tldCB0b28gc2hvcnQiKTsKLSAgICByZXR1cm4gSVNJU19XQVJOSU5HOwotICB9CisgIGlmICgoc3RyZWFtX2dldF9lbmRwIChjaXJjdWl0LT5yY3Zfc3RyZWFtKSAtCisgICAgICAgc3RyZWFtX2dldF9nZXRwIChjaXJjdWl0LT5yY3Zfc3RyZWFtKSkgPCBJU0lTX1BTTlBfSERSTEVOKQorICAgIHsKKyAgICAgIHpsb2dfd2FybiAoIlBhY2tldCB0b28gc2hvcnQiKTsKKyAgICAgIHJldHVybiBJU0lTX1dBUk5JTkc7CisgICAgfQogCiAgIHJldHVybiBwcm9jZXNzX3NucCAoSVNJU19TTlBfUFNOUF9GTEFHLCBsZXZlbCwgY2lyY3VpdCwgc3NucGEpOwogfQogCi0KLQogLyoKICAqIFByb2Nlc3MgSVNICiAgKiBJU08gLSAxMDU4OQogICogU2VjdGlvbiA4LjIuMiAtIFJlY2VpdmluZyBJU0ggUERVcyBieSBhbiBpbnRlcm1lZGlhdGUgc3lzdGVtCiAgKiBGSVhNRTogc2FtcGxlIHBhY2tldCBkdW1wLCBuZWVkIHRvIGZpZ3VyZSAweDgxIC0gbG9va3MgbGlrZSBOTFBpZAotICAgICAgICAgICAgMHg4MgkweDE1CTB4MDEJMHgwMAkweDA0CTB4MDEJMHgyYwkweDU5Ci0gICAgICAgICAgICAweDM4CTB4MDgJMHg0NwkweDAwCTB4MDEJMHgwMAkweDAyCTB4MDAKLSAgICAgICAgICAJMHgwMwkweDAwCTB4ODEJMHgwMQkweGNjCisgKiAgICAgICAgICAgMHg4MgkweDE1CTB4MDEJMHgwMAkweDA0CTB4MDEJMHgyYwkweDU5CisgKiAgICAgICAgICAgMHgzOAkweDA4CTB4NDcJMHgwMAkweDAxCTB4MDAJMHgwMgkweDAwCisgKiAgICAgICAgICAgMHgwMwkweDAwCTB4ODEJMHgwMQkweGNjCiAgKi8KIGludAogcHJvY2Vzc19pc19oZWxsbyAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCkKQEAgLTE0MTksMTcyICsxNTkyLDE4NSBAQAogICAgIHJldHVybiByZXR2YWw7CiAKICAgbmVpZ2hfbGVuID0gc3RyZWFtX2dldGMgKGNpcmN1aXQtPnJjdl9zdHJlYW0pOwotICBzeXNpZCA9IFNUUkVBTV9QTlQoY2lyY3VpdC0+cmN2X3N0cmVhbSkgKyBuZWlnaF9sZW4gLSAxIC0gSVNJU19TWVNfSURfTEVOOworICBzeXNpZCA9IFNUUkVBTV9QTlQgKGNpcmN1aXQtPnJjdl9zdHJlYW0pICsgbmVpZ2hfbGVuIC0gMSAtIElTSVNfU1lTX0lEX0xFTjsKICAgYWRqID0gY2lyY3VpdC0+dS5wMnAubmVpZ2hib3I7Ci0gIGlmICghYWRqKSB7Ci0gICAgLyogOC4yLjIgKi8KLSAgICBhZGogPSBpc2lzX25ld19hZGogKHN5c2lkLCAiICAgICAgIiwgMCwgY2lyY3VpdCk7Ci0gICAgaWYgKGFkaiA9PSBOVUxMKQotICAgICAgcmV0dXJuIElTSVNfRVJST1I7CisgIGlmICghYWRqKQorICAgIHsKKyAgICAgIC8qIDguMi4yICovCisgICAgICBhZGogPSBpc2lzX25ld19hZGogKHN5c2lkLCAiICAgICAgIiwgMCwgY2lyY3VpdCk7CisgICAgICBpZiAoYWRqID09IE5VTEwpCisJcmV0dXJuIElTSVNfRVJST1I7CiAKLSAgICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfSU5JVElBTElaSU5HLCBOVUxMKTsKLSAgICBhZGotPnN5c190eXBlID0gSVNJU19TWVNUWVBFX1VOS05PV047Ci0gICAgY2lyY3VpdC0+dS5wMnAubmVpZ2hib3IgPSBhZGo7Ci0gIH0KLSAgLyogOC4yLjIgYSkqLwotICBpZiAoKGFkai0+YWRqX3N0YXRlID09IElTSVNfQURKX1VQKSAmJiBtZW1jbXAgKGFkai0+c3lzaWQsc3lzaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNJU19TWVNfSURfTEVOKSkgewotICAgIC8qIDguMi4yIGEpIDEpIEZJWE1FOiBhZGpTdGF0ZUNoYW5nZShkb3duKSBldmVudCAqLwotICAgIC8qIDguMi4yIGEpIDIpIGRlbGV0ZSB0aGUgYWRqICovCi0gICAgWEZSRUUgKE1UWVBFX0lTSVNfQURKQUNFTkNZLCBhZGopOwotICAgIC8qIDguMi4yIGEpIDMpIGNyZWF0ZSBhIG5ldyBhZGogKi8KLSAgICBhZGogPSBpc2lzX25ld19hZGogKHN5c2lkLCAiICAgICAgIiwgMCwgY2lyY3VpdCk7Ci0gICAgaWYgKGFkaiA9PSBOVUxMKQotICAgICAgcmV0dXJuIElTSVNfRVJST1I7CisgICAgICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfSU5JVElBTElaSU5HLCBOVUxMKTsKKyAgICAgIGFkai0+c3lzX3R5cGUgPSBJU0lTX1NZU1RZUEVfVU5LTk9XTjsKKyAgICAgIGNpcmN1aXQtPnUucDJwLm5laWdoYm9yID0gYWRqOworICAgIH0KKyAgLyogOC4yLjIgYSkgKi8KKyAgaWYgKChhZGotPmFkal9zdGF0ZSA9PSBJU0lTX0FESl9VUCkgJiYgbWVtY21wIChhZGotPnN5c2lkLCBzeXNpZCwKKwkJCQkJCSBJU0lTX1NZU19JRF9MRU4pKQorICAgIHsKKyAgICAgIC8qIDguMi4yIGEpIDEpIEZJWE1FOiBhZGpTdGF0ZUNoYW5nZShkb3duKSBldmVudCAqLworICAgICAgLyogOC4yLjIgYSkgMikgZGVsZXRlIHRoZSBhZGogKi8KKyAgICAgIFhGUkVFIChNVFlQRV9JU0lTX0FESkFDRU5DWSwgYWRqKTsKKyAgICAgIC8qIDguMi4yIGEpIDMpIGNyZWF0ZSBhIG5ldyBhZGogKi8KKyAgICAgIGFkaiA9IGlzaXNfbmV3X2FkaiAoc3lzaWQsICIgICAgICAiLCAwLCBjaXJjdWl0KTsKKyAgICAgIGlmIChhZGogPT0gTlVMTCkKKwlyZXR1cm4gSVNJU19FUlJPUjsKIAotICAgIC8qIDguMi4yIGEpIDMpIGkgKi8KLSAgICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfSU5JVElBTElaSU5HLCBOVUxMKTsKLSAgICAvKiA4LjIuMiBhKSAzKSBpaSAqLwotICAgIGFkai0+c3lzX3R5cGUgPSBJU0lTX1NZU1RZUEVfVU5LTk9XTjsKLSAgICAvKiA4LjIuMiBhKSA0KSBxdWl0ZSBtZWFuaW5nbGVzcyAqLwotICB9CisgICAgICAvKiA4LjIuMiBhKSAzKSBpICovCisgICAgICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfSU5JVElBTElaSU5HLCBOVUxMKTsKKyAgICAgIC8qIDguMi4yIGEpIDMpIGlpICovCisgICAgICBhZGotPnN5c190eXBlID0gSVNJU19TWVNUWVBFX1VOS05PV047CisgICAgICAvKiA4LjIuMiBhKSA0KSBxdWl0ZSBtZWFuaW5nbGVzcyAqLworICAgIH0KICAgLyogOC4yLjIgYikgaWdub3JlIG9uIGNvbmRpdGlvbiAqLwotICBpZiAoKGFkai0+YWRqX3N0YXRlID09IElTSVNfQURKX0lOSVRJQUxJWklORykgJiYgCi0gICAgICAoYWRqLT5zeXNfdHlwZSA9PSBJU0lTX1NZU1RZUEVfSVMpKSB7Ci0gICAgLyogZG8gbm90aGluZyAqLwotICB9IGVsc2UgewotICAvKiA4LjIuMiBjKSByZXNwb25kIHdpdGggYSBwMnAgSUlIICovCi0gICAgc2VuZF9oZWxsbyAoY2lyY3VpdCwgMSk7Ci0gIH0KKyAgaWYgKChhZGotPmFkal9zdGF0ZSA9PSBJU0lTX0FESl9JTklUSUFMSVpJTkcpICYmCisgICAgICAoYWRqLT5zeXNfdHlwZSA9PSBJU0lTX1NZU1RZUEVfSVMpKQorICAgIHsKKyAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiA4LjIuMiBjKSByZXNwb25kIHdpdGggYSBwMnAgSUlIICovCisgICAgICBzZW5kX2hlbGxvIChjaXJjdWl0LCAxKTsKKyAgICB9CiAgIC8qIDguMi4yIGQpIHR5cGUgaXMgSVMgKi8KLSAgICBhZGotPnN5c190eXBlID0gSVNJU19TWVNUWVBFX0lTOworICBhZGotPnN5c190eXBlID0gSVNJU19TWVNUWVBFX0lTOwogICAvKiA4LjIuMiBlKSBGSVhNRTogQ2lyY3VpdCB0eXBlIG9mPyAqLwogCi0KICAgcmV0dXJuIHJldHZhbDsKIH0KIAotCiAvKgogICogUERVIERpc3BhdGNoZXIKICAqLwogCi1pbnQgCi1pc2lzX2hhbmRsZV9wZHUgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsIHVfY2hhciAqc3NucGEpCitpbnQKK2lzaXNfaGFuZGxlX3BkdSAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgdV9jaGFyICogc3NucGEpCiB7Ci0KICAgc3RydWN0IGlzaXNfZml4ZWRfaGRyICpoZHI7CiAgIHN0cnVjdCBlc2lzX2ZpeGVkX2hkciAqZXNpc19oZHI7CiAKLSAgaW50IHJldHZhbD1JU0lTX09LOworICBpbnQgcmV0dmFsID0gSVNJU19PSzsKIAogICAvKgogICAgKiBMZXQncyBmaXJzdCByZWFkIGRhdGEgZnJvbSBzdHJlYW0gdG8gdGhlIGhlYWRlcgogICAgKi8KLSAgaGRyID0gKHN0cnVjdCBpc2lzX2ZpeGVkX2hkciopU1RSRUFNX0RBVEEoY2lyY3VpdC0+cmN2X3N0cmVhbSk7CisgIGhkciA9IChzdHJ1Y3QgaXNpc19maXhlZF9oZHIgKikgU1RSRUFNX0RBVEEgKGNpcmN1aXQtPnJjdl9zdHJlYW0pOwogCi0gIGlmICgoaGRyLT5pZHJwICE9IElTTzEwNTg5X0lTSVMpICYmIChoZHItPmlkcnAgIT0gSVNPOTU0Ml9FU0lTKSl7Ci0gICAgemxvZ193YXJuICgiTm90IGFuIElTLUlTIG9yIEVTLUlTIHBhY2tldCBJRFJQPSUwMngiLCBoZHItPmlkcnApOwotICAgIHJldHVybiBJU0lTX0VSUk9SOwotICB9CisgIGlmICgoaGRyLT5pZHJwICE9IElTTzEwNTg5X0lTSVMpICYmIChoZHItPmlkcnAgIT0gSVNPOTU0Ml9FU0lTKSkKKyAgICB7CisgICAgICB6bG9nX3dhcm4gKCJOb3QgYW4gSVMtSVMgb3IgRVMtSVMgcGFja2V0IElEUlA9JTAyeCIsIGhkci0+aWRycCk7CisgICAgICByZXR1cm4gSVNJU19FUlJPUjsKKyAgICB9CiAKICAgLyogbm93IHdlIG5lZWQgdG8ga25vdyBpZiB0aGlzIGlzIGFuIElTTyA5NTQyIHBhY2tldCBhbmQKICAgICogdGFrZSByZWFsIGdvb2QgY2FyZSBvZiBpdCwgd2FhYSEKICAgICovCi0gIGlmIChoZHItPmlkcnAgPT0gSVNPOTU0Ml9FU0lTKXsKLSAgICBlc2lzX2hkciA9IChzdHJ1Y3QgZXNpc19maXhlZF9oZHIqKVNUUkVBTV9EQVRBKGNpcmN1aXQtPnJjdl9zdHJlYW0pOwotICAgIHN0cmVhbV9zZXRfZ2V0cCAoY2lyY3VpdC0+cmN2X3N0cmVhbSwgRVNJU19GSVhFRF9IRFJfTEVOKTsKLSAgICAvKiBGSVhNRTogTmVlZCB0byBkbyBzb21lIGFjY2VwdGVuY2UgdGVzdHMgKi8KLSAgICAvKiBleGFtcGxlIGxlbmd0aC4uLiAqLwotICAgIHN3aXRjaCAoZXNpc19oZHItPnBkdV90eXBlKSB7Ci0gICAgICBjYXNlIEVTSF9QRFU6Ci0gICAgICAgIC8qIEZJWE1FICovCi0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBJU0hfUERVOgotICAgICAgICB6bG9nX2luZm8gKCJBTiBJU0ggUERVISEiKTsKLSAgICAgICAgcmV0dmFsID0gcHJvY2Vzc19pc19oZWxsbyAoY2lyY3VpdCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIElTSVNfRVJST1I7Ci0gICAgICB9Ci0gICAgcmV0dXJuIHJldHZhbDsKLSAgfSBlbHNlIHsKLSAgICBzdHJlYW1fc2V0X2dldHAgKGNpcmN1aXQtPnJjdl9zdHJlYW0sIElTSVNfRklYRURfSERSX0xFTik7Ci0gIH0KKyAgaWYgKGhkci0+aWRycCA9PSBJU085NTQyX0VTSVMpCisgICAgeworICAgICAgZXNpc19oZHIgPSAoc3RydWN0IGVzaXNfZml4ZWRfaGRyICopIFNUUkVBTV9EQVRBIChjaXJjdWl0LT5yY3Zfc3RyZWFtKTsKKyAgICAgIHN0cmVhbV9zZXRfZ2V0cCAoY2lyY3VpdC0+cmN2X3N0cmVhbSwgRVNJU19GSVhFRF9IRFJfTEVOKTsKKyAgICAgIC8qIEZJWE1FOiBOZWVkIHRvIGRvIHNvbWUgYWNjZXB0ZW5jZSB0ZXN0cyAqLworICAgICAgLyogZXhhbXBsZSBsZW5ndGguLi4gKi8KKyAgICAgIHN3aXRjaCAoZXNpc19oZHItPnBkdV90eXBlKQorCXsKKwljYXNlIEVTSF9QRFU6CisJICAvKiBGSVhNRSAqLworCSAgYnJlYWs7CisJY2FzZSBJU0hfUERVOgorCSAgemxvZ19pbmZvICgiQU4gSVNIIFBEVSEhIik7CisJICByZXR2YWwgPSBwcm9jZXNzX2lzX2hlbGxvIChjaXJjdWl0KTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICByZXR1cm4gSVNJU19FUlJPUjsKKwl9CisgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN0cmVhbV9zZXRfZ2V0cCAoY2lyY3VpdC0+cmN2X3N0cmVhbSwgSVNJU19GSVhFRF9IRFJfTEVOKTsKKyAgICB9CiAgIC8qCiAgICAqIGFuZCB0aGVuIHByb2Nlc3MgaXQKICAgICovCiAKLSAgaWYgKGhkci0+bGVuZ3RoIDwgSVNJU19NSU5JTVVNX0ZJWEVEX0hEUl9MRU4pIHsKLSAgICB6bG9nX2VyciAoIkZpeGVkIGhlYWRlciBsZW5ndGggPSAlZCIsIGhkci0+bGVuZ3RoKTsKLSAgICByZXR1cm4gSVNJU19FUlJPUjsKLSAgfQorICBpZiAoaGRyLT5sZW5ndGggPCBJU0lTX01JTklNVU1fRklYRURfSERSX0xFTikKKyAgICB7CisgICAgICB6bG9nX2VyciAoIkZpeGVkIGhlYWRlciBsZW5ndGggPSAlZCIsIGhkci0+bGVuZ3RoKTsKKyAgICAgIHJldHVybiBJU0lTX0VSUk9SOworICAgIH0KIAotICBpZiAoaGRyLT52ZXJzaW9uMSAhPSAxKSB7Ci0gICAgemxvZ193YXJuICgiVW5zdXBwb3J0ZWQgSVNJUyB2ZXJzaW9uICV1IiwgaGRyLT52ZXJzaW9uMSk7Ci0gICAgcmV0dXJuIElTSVNfV0FSTklORzsKLSAgfQorICBpZiAoaGRyLT52ZXJzaW9uMSAhPSAxKQorICAgIHsKKyAgICAgIHpsb2dfd2FybiAoIlVuc3VwcG9ydGVkIElTSVMgdmVyc2lvbiAldSIsIGhkci0+dmVyc2lvbjEpOworICAgICAgcmV0dXJuIElTSVNfV0FSTklORzsKKyAgICB9CiAgIC8qIGVpdGhlciA2IG9yIDAgKi8KLSAgaWYgKChoZHItPmlkX2xlbiAhPSAwKSAmJiAoaGRyLT5pZF9sZW4gIT0gSVNJU19TWVNfSURfTEVOKSkgIHsgCi0gICAgemxvZ19lcnIgKCJJREZpZWxkTGVuZ3RoTWlzbWF0Y2g6IElEIExlbmd0aCBmaWVsZCBpbiBhIHJlY2VpdmVkIFBEVSAgJXUsICIKLSAgICAgICAgICAgICAgICAgICAgICAid2hpbGUgdGhlIHBhcmFtZXRlciBmb3IgdGhpcyBJUyBpcyAldSIsIGhkci0+aWRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICBJU0lTX1NZU19JRF9MRU4pOwotICAgIHJldHVybiBJU0lTX0VSUk9SOwotICB9CisgIGlmICgoaGRyLT5pZF9sZW4gIT0gMCkgJiYgKGhkci0+aWRfbGVuICE9IElTSVNfU1lTX0lEX0xFTikpCisgICAgeworICAgICAgemxvZ19lcnIKKwkoIklERmllbGRMZW5ndGhNaXNtYXRjaDogSUQgTGVuZ3RoIGZpZWxkIGluIGEgcmVjZWl2ZWQgUERVICAldSwgIgorCSAid2hpbGUgdGhlIHBhcmFtZXRlciBmb3IgdGhpcyBJUyBpcyAldSIsIGhkci0+aWRfbGVuLAorCSBJU0lTX1NZU19JRF9MRU4pOworICAgICAgcmV0dXJuIElTSVNfRVJST1I7CisgICAgfQogCi0gIGlmIChoZHItPnZlcnNpb24yICE9IDEpIHsKLSAgICB6bG9nX3dhcm4gKCJVbnN1cHBvcnRlZCBJU0lTIHZlcnNpb24gJXUiLCBoZHItPnZlcnNpb24yKTsKLSAgICByZXR1cm4gSVNJU19XQVJOSU5HOwotICB9CisgIGlmIChoZHItPnZlcnNpb24yICE9IDEpCisgICAgeworICAgICAgemxvZ193YXJuICgiVW5zdXBwb3J0ZWQgSVNJUyB2ZXJzaW9uICV1IiwgaGRyLT52ZXJzaW9uMik7CisgICAgICByZXR1cm4gSVNJU19XQVJOSU5HOworICAgIH0KICAgLyogZWl0aGVyIDMgb3IgMCAqLwotICBpZiAoKGhkci0+bWF4X2FyZWFfYWRkcnMgIT0gMCkgJiYgKGhkci0+bWF4X2FyZWFfYWRkcnMgIT0gaXNpcy0+bWF4X2FyZWFfYWRkcnMpKSB7IAotICAgIHpsb2dfZXJyICgibWF4aW11bUFyZWFBZGRyZXNzZXNNaXNtYXRjaDogbWF4aW11bUFyZWFBZHJlc3NlcyBpbiBhICIKLSAgICAgICAgICAgICAgICAgICAgICAicmVjZWl2ZWQgUERVICV1IHdoaWxlIHRoZSBwYXJhbWV0ZXIgZm9yIHRoaXMgSVMgaXMgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICBoZHItPm1heF9hcmVhX2FkZHJzLCBpc2lzLT5tYXhfYXJlYV9hZGRycyk7Ci0gICAgcmV0dXJuIElTSVNfRVJST1I7Ci0gIH0KKyAgaWYgKChoZHItPm1heF9hcmVhX2FkZHJzICE9IDApCisgICAgICAmJiAoaGRyLT5tYXhfYXJlYV9hZGRycyAhPSBpc2lzLT5tYXhfYXJlYV9hZGRycykpCisgICAgeworICAgICAgemxvZ19lcnIgKCJtYXhpbXVtQXJlYUFkZHJlc3Nlc01pc21hdGNoOiBtYXhpbXVtQXJlYUFkcmVzc2VzIGluIGEgIgorCQkicmVjZWl2ZWQgUERVICV1IHdoaWxlIHRoZSBwYXJhbWV0ZXIgZm9yIHRoaXMgSVMgaXMgJXUiLAorCQloZHItPm1heF9hcmVhX2FkZHJzLCBpc2lzLT5tYXhfYXJlYV9hZGRycyk7CisgICAgICByZXR1cm4gSVNJU19FUlJPUjsKKyAgICB9CiAKLSAgc3dpdGNoIChoZHItPnBkdV90eXBlKSB7Ci0gIGNhc2UgTDFfTEFOX0hFTExPOgotICAgIHJldHZhbCA9IHByb2Nlc3NfbGFuX2hlbGxvIChJU0lTX0xFVkVMMSwgY2lyY3VpdCwgc3NucGEpOwotICAgIGJyZWFrOwotICBjYXNlIEwyX0xBTl9IRUxMTzoKLSAgICByZXR2YWwgPSBwcm9jZXNzX2xhbl9oZWxsbyAoSVNJU19MRVZFTDIsIGNpcmN1aXQsIHNzbnBhKTsKLSAgICBicmVhazsKLSAgY2FzZSBQMlBfSEVMTE86Ci0gICAgcmV0dmFsID0gcHJvY2Vzc19wMnBfaGVsbG8gKGNpcmN1aXQpOwotICAgIGJyZWFrOwotICBjYXNlIEwxX0xJTktfU1RBVEU6Ci0gICAgcmV0dmFsID0gcHJvY2Vzc19sc3AgKElTSVNfTEVWRUwxLCBjaXJjdWl0LCBzc25wYSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgTDJfTElOS19TVEFURToKLSAgICByZXR2YWwgPSBwcm9jZXNzX2xzcCAoSVNJU19MRVZFTDIsIGNpcmN1aXQsIHNzbnBhKTsKLSAgICBicmVhazsKLSAgY2FzZSBMMV9DT01QTEVURV9TRVFfTlVNOgotICAgIHJldHZhbCA9IHByb2Nlc3NfY3NucCAoSVNJU19MRVZFTDEsIGNpcmN1aXQsIHNzbnBhKTsKLSAgICBicmVhazsKLSAgY2FzZSBMMl9DT01QTEVURV9TRVFfTlVNOgotICAgIHJldHZhbCA9IHByb2Nlc3NfY3NucCAoSVNJU19MRVZFTDIsIGNpcmN1aXQsIHNzbnBhKTsKLSAgICBicmVhazsKLSAgY2FzZSBMMV9QQVJUSUFMX1NFUV9OVU06Ci0gICAgcmV0dmFsID0gcHJvY2Vzc19wc25wIChJU0lTX0xFVkVMMSwgY2lyY3VpdCwgc3NucGEpOwotICAgIGJyZWFrOwotICBjYXNlIEwyX1BBUlRJQUxfU0VRX05VTToKLSAgICByZXR2YWwgPSBwcm9jZXNzX3BzbnAgKElTSVNfTEVWRUwyLCBjaXJjdWl0LCBzc25wYSk7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIElTSVNfRVJST1I7Ci0gIH0KKyAgc3dpdGNoIChoZHItPnBkdV90eXBlKQorICAgIHsKKyAgICBjYXNlIEwxX0xBTl9IRUxMTzoKKyAgICAgIHJldHZhbCA9IHByb2Nlc3NfbGFuX2hlbGxvIChJU0lTX0xFVkVMMSwgY2lyY3VpdCwgc3NucGEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMMl9MQU5fSEVMTE86CisgICAgICByZXR2YWwgPSBwcm9jZXNzX2xhbl9oZWxsbyAoSVNJU19MRVZFTDIsIGNpcmN1aXQsIHNzbnBhKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUDJQX0hFTExPOgorICAgICAgcmV0dmFsID0gcHJvY2Vzc19wMnBfaGVsbG8gKGNpcmN1aXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMMV9MSU5LX1NUQVRFOgorICAgICAgcmV0dmFsID0gcHJvY2Vzc19sc3AgKElTSVNfTEVWRUwxLCBjaXJjdWl0LCBzc25wYSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwyX0xJTktfU1RBVEU6CisgICAgICByZXR2YWwgPSBwcm9jZXNzX2xzcCAoSVNJU19MRVZFTDIsIGNpcmN1aXQsIHNzbnBhKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTDFfQ09NUExFVEVfU0VRX05VTToKKyAgICAgIHJldHZhbCA9IHByb2Nlc3NfY3NucCAoSVNJU19MRVZFTDEsIGNpcmN1aXQsIHNzbnBhKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTDJfQ09NUExFVEVfU0VRX05VTToKKyAgICAgIHJldHZhbCA9IHByb2Nlc3NfY3NucCAoSVNJU19MRVZFTDIsIGNpcmN1aXQsIHNzbnBhKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTDFfUEFSVElBTF9TRVFfTlVNOgorICAgICAgcmV0dmFsID0gcHJvY2Vzc19wc25wIChJU0lTX0xFVkVMMSwgY2lyY3VpdCwgc3NucGEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMMl9QQVJUSUFMX1NFUV9OVU06CisgICAgICByZXR2YWwgPSBwcm9jZXNzX3BzbnAgKElTSVNfTEVWRUwyLCBjaXJjdWl0LCBzc25wYSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIElTSVNfRVJST1I7CisgICAgfQogCiAgIHJldHVybiByZXR2YWw7CiB9CiAKLQogI2lmZGVmIEdOVV9MSU5VWAogaW50CiBpc2lzX3JlY2VpdmUgKHN0cnVjdCB0aHJlYWQgKnRocmVhZCkKIHsKLQogICBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0OwogICB1X2NoYXIgc3NucGFbRVRIX0FMRU5dOwogICBpbnQgcmV0dmFsOwpAQCAtMTU5NiwxMiArMTc4MiwxMiBAQAogICBhc3NlcnQgKGNpcmN1aXQpOwogCiAgIGlmIChjaXJjdWl0LT5yY3Zfc3RyZWFtID09IE5VTEwpCi0gICAgY2lyY3VpdC0+cmN2X3N0cmVhbSA9IHN0cmVhbV9uZXcgKElTT19NVFUoY2lyY3VpdCkpOworICAgIGNpcmN1aXQtPnJjdl9zdHJlYW0gPSBzdHJlYW1fbmV3IChJU09fTVRVIChjaXJjdWl0KSk7CiAgIGVsc2UKICAgICBzdHJlYW1fcmVzZXQgKGNpcmN1aXQtPnJjdl9zdHJlYW0pOwogCiAgIHJldHZhbCA9IGNpcmN1aXQtPnJ4IChjaXJjdWl0LCBzc25wYSk7Ci0gIGNpcmN1aXQtPnRfcmVhZCA9IE5VTEw7ICAKKyAgY2lyY3VpdC0+dF9yZWFkID0gTlVMTDsKIAogICBpZiAocmV0dmFsID09IElTSVNfT0spCiAgICAgcmV0dmFsID0gaXNpc19oYW5kbGVfcGR1IChjaXJjdWl0LCBzc25wYSk7CkBAIC0xNjA5LDcgKzE3OTUsOCBAQAogICAvKiAKICAgICogcHJlcGFyZSBmb3IgbmV4dCBwYWNrZXQuIAogICAgKi8KLSAgVEhSRUFEX1JFQURfT04obWFzdGVyLCBjaXJjdWl0LT50X3JlYWQsIGlzaXNfcmVjZWl2ZSwgY2lyY3VpdCwgY2lyY3VpdC0+ZmQpOworICBUSFJFQURfUkVBRF9PTiAobWFzdGVyLCBjaXJjdWl0LT50X3JlYWQsIGlzaXNfcmVjZWl2ZSwgY2lyY3VpdCwKKwkJICBjaXJjdWl0LT5mZCk7CiAKICAgcmV0dXJuIHJldHZhbDsKIH0KQEAgLTE2MTgsNyArMTgwNSw2IEBACiBpbnQKIGlzaXNfcmVjZWl2ZSAoc3RydWN0IHRocmVhZCAqdGhyZWFkKQogewotCiAgIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQ7CiAgIHVfY2hhciBzc25wYVtFVEhfQUxFTl07CiAgIGludCByZXR2YWw7CkBAIC0xNjI5LDEwICsxODE1LDEwIEBACiAgIGNpcmN1aXQgPSBUSFJFQURfQVJHICh0aHJlYWQpOwogICBhc3NlcnQgKGNpcmN1aXQpOwogCi0gIGNpcmN1aXQtPnRfcmVhZCA9IE5VTEw7ICAKKyAgY2lyY3VpdC0+dF9yZWFkID0gTlVMTDsKIAogICBpZiAoY2lyY3VpdC0+cmN2X3N0cmVhbSA9PSBOVUxMKQotICAgIGNpcmN1aXQtPnJjdl9zdHJlYW0gPSBzdHJlYW1fbmV3IChJU09fTVRVKGNpcmN1aXQpKTsKKyAgICBjaXJjdWl0LT5yY3Zfc3RyZWFtID0gc3RyZWFtX25ldyAoSVNPX01UVSAoY2lyY3VpdCkpOwogICBlbHNlCiAgICAgc3RyZWFtX3Jlc2V0IChjaXJjdWl0LT5yY3Zfc3RyZWFtKTsKIApAQCAtMTY0NCwxMCArMTgzMCwxMCBAQAogICAvKiAKICAgICogcHJlcGFyZSBmb3IgbmV4dCBwYWNrZXQuIAogICAgKi8KLSAgY2lyY3VpdC0+dF9yZWFkID0gdGhyZWFkX2FkZF90aW1lcl9tc2VjIChtYXN0ZXIsIGlzaXNfcmVjZWl2ZSwgY2lyY3VpdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGNvdW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNpcmN1aXQtPmFyZWEtPmNpcmN1aXRfbGlzdCkqMTAwKTsKLQorICBjaXJjdWl0LT50X3JlYWQgPSB0aHJlYWRfYWRkX3RpbWVyX21zZWMgKG1hc3RlciwgaXNpc19yZWNlaXZlLCBjaXJjdWl0LAorCQkJCQkgICBsaXN0Y291bnQKKwkJCQkJICAgKGNpcmN1aXQtPmFyZWEtPmNpcmN1aXRfbGlzdCkgKgorCQkJCQkgICAxMDApOwogCiAgIHJldHVybiByZXR2YWw7CiB9CkBAIC0xNjYyLDQ3ICsxODQ4LDQ3IEBACiAKICAgaGRyLT5pZHJwID0gSVNPMTA1ODlfSVNJUzsKIAotICBzd2l0Y2ggKHBkdV90eXBlKSB7Ci0gIGNhc2UgTDFfTEFOX0hFTExPOgotICBjYXNlIEwyX0xBTl9IRUxMTzoKLSAgICBoZHItPmxlbmd0aCA9IElTSVNfTEFOSEVMTE9fSERSTEVOOwotICAgIGJyZWFrOwotICBjYXNlIFAyUF9IRUxMTzoKLSAgICBoZHItPmxlbmd0aCA9IElTSVNfUDJQSEVMTE9fSERSTEVOOwotICAgIGJyZWFrOwotICBjYXNlIEwxX0xJTktfU1RBVEU6Ci0gIGNhc2UgTDJfTElOS19TVEFURToKLSAgICBoZHItPmxlbmd0aCA9IElTSVNfTFNQX0hEUl9MRU47Ci0gICAgYnJlYWs7Ci0gIGNhc2UgTDFfQ09NUExFVEVfU0VRX05VTToKLSAgY2FzZSBMMl9DT01QTEVURV9TRVFfTlVNOgotICAgIGhkci0+bGVuZ3RoID0gSVNJU19DU05QX0hEUkxFTjsKLSAgICBicmVhazsKLSAgY2FzZSBMMV9QQVJUSUFMX1NFUV9OVU06Ci0gIGNhc2UgTDJfUEFSVElBTF9TRVFfTlVNOgotICAgIGhkci0+bGVuZ3RoID0gSVNJU19QU05QX0hEUkxFTjsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICB6bG9nX3dhcm4gKCJmaWxsX2ZpeGVkX2hkcigpOiB1bmtub3duIHBkdSB0eXBlICVkIiwgcGR1X3R5cGUpOwotICAgIHJldHVybjsKLSAgfQorICBzd2l0Y2ggKHBkdV90eXBlKQorICAgIHsKKyAgICBjYXNlIEwxX0xBTl9IRUxMTzoKKyAgICBjYXNlIEwyX0xBTl9IRUxMTzoKKyAgICAgIGhkci0+bGVuZ3RoID0gSVNJU19MQU5IRUxMT19IRFJMRU47CisgICAgICBicmVhazsKKyAgICBjYXNlIFAyUF9IRUxMTzoKKyAgICAgIGhkci0+bGVuZ3RoID0gSVNJU19QMlBIRUxMT19IRFJMRU47CisgICAgICBicmVhazsKKyAgICBjYXNlIEwxX0xJTktfU1RBVEU6CisgICAgY2FzZSBMMl9MSU5LX1NUQVRFOgorICAgICAgaGRyLT5sZW5ndGggPSBJU0lTX0xTUF9IRFJfTEVOOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMMV9DT01QTEVURV9TRVFfTlVNOgorICAgIGNhc2UgTDJfQ09NUExFVEVfU0VRX05VTToKKyAgICAgIGhkci0+bGVuZ3RoID0gSVNJU19DU05QX0hEUkxFTjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTDFfUEFSVElBTF9TRVFfTlVNOgorICAgIGNhc2UgTDJfUEFSVElBTF9TRVFfTlVNOgorICAgICAgaGRyLT5sZW5ndGggPSBJU0lTX1BTTlBfSERSTEVOOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHpsb2dfd2FybiAoImZpbGxfZml4ZWRfaGRyKCk6IHVua25vd24gcGR1IHR5cGUgJWQiLCBwZHVfdHlwZSk7CisgICAgICByZXR1cm47CisgICAgfQogICBoZHItPmxlbmd0aCArPSBJU0lTX0ZJWEVEX0hEUl9MRU47CiAgIGhkci0+cGR1X3R5cGUgPSBwZHVfdHlwZTsKICAgaGRyLT52ZXJzaW9uMSA9IDE7Ci0gIGhkci0+aWRfbGVuID0gMDsgLyogSVNJU19TWVNfSURfTEVOIC0gIDA9PTYgKi8KKyAgaGRyLT5pZF9sZW4gPSAwOwkJLyogSVNJU19TWVNfSURfTEVOIC0gIDA9PTYgKi8KICAgaGRyLT52ZXJzaW9uMiA9IDE7Ci0gIGhkci0+bWF4X2FyZWFfYWRkcnMgPSAwOyAvKiBpc2lzLT5tYXhfYXJlYV9hZGRycyAtICAwPT0zICovCisgIGhkci0+bWF4X2FyZWFfYWRkcnMgPSAwOwkvKiBpc2lzLT5tYXhfYXJlYV9hZGRycyAtICAwPT0zICovCiB9CiAKLQogLyoKICAqIFNFTkQgU0lERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKi8KIHZvaWQKIGZpbGxfZml4ZWRfaGRyX2FuZHN0cmVhbSAoc3RydWN0IGlzaXNfZml4ZWRfaGRyICpoZHIsIHVfY2hhciBwZHVfdHlwZSwKLQkJc3RydWN0IHN0cmVhbSAqc3RyZWFtKQorCQkJICBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCiB7Ci0gIGZpbGxfZml4ZWRfaGRyIChoZHIscGR1X3R5cGUpOworICBmaWxsX2ZpeGVkX2hkciAoaGRyLCBwZHVfdHlwZSk7CiAKICAgc3RyZWFtX3B1dGMgKHN0cmVhbSwgaGRyLT5pZHJwKTsKICAgc3RyZWFtX3B1dGMgKHN0cmVhbSwgaGRyLT5sZW5ndGgpOwpAQCAtMTcxNiw3ICsxOTAyLDYgQEAKICAgcmV0dXJuOwogfQogCi0KIGludAogc2VuZF9oZWxsbyAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgaW50IGxldmVsKQogewpAQCAtMTcyOCw1NSArMTkxMyw2NSBAQAogICB1bnNpZ25lZCBsb25nIGxlbl9wb2ludGVyLCBsZW5ndGg7CiAgIGludCByZXR2YWw7CiAKLSAgaWYgKGNpcmN1aXQtPmludGVyZmFjZS0+bXR1ID09IDApIHsKLSAgICB6bG9nX3dhcm4gKCJjaXJjdWl0IGhhcyB6ZXJvIE1UVSIpOwotICAgIHJldHVybiBJU0lTX1dBUk5JTkc7Ci0gIH0KKyAgaWYgKGNpcmN1aXQtPmludGVyZmFjZS0+bXR1ID09IDApCisgICAgeworICAgICAgemxvZ193YXJuICgiY2lyY3VpdCBoYXMgemVybyBNVFUiKTsKKyAgICAgIHJldHVybiBJU0lTX1dBUk5JTkc7CisgICAgfQogCiAgIGlmICghY2lyY3VpdC0+c25kX3N0cmVhbSkKLSAgICBjaXJjdWl0LT5zbmRfc3RyZWFtID0gc3RyZWFtX25ldyAoSVNPX01UVShjaXJjdWl0KSk7CisgICAgY2lyY3VpdC0+c25kX3N0cmVhbSA9IHN0cmVhbV9uZXcgKElTT19NVFUgKGNpcmN1aXQpKTsKICAgZWxzZQogICAgIHN0cmVhbV9yZXNldCAoY2lyY3VpdC0+c25kX3N0cmVhbSk7CiAKICAgaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSA9PSBDSVJDVUlUX1RfQlJPQURDQVNUKQogICAgIGlmIChsZXZlbCA9PSAxKQotICAgICAgZmlsbF9maXhlZF9oZHJfYW5kc3RyZWFtKCZmaXhlZF9oZHIsIEwxX0xBTl9IRUxMTywgY2lyY3VpdC0+c25kX3N0cmVhbSk7CisgICAgICBmaWxsX2ZpeGVkX2hkcl9hbmRzdHJlYW0gKCZmaXhlZF9oZHIsIEwxX0xBTl9IRUxMTywKKwkJCQljaXJjdWl0LT5zbmRfc3RyZWFtKTsKICAgICBlbHNlCi0gICAgICBmaWxsX2ZpeGVkX2hkcl9hbmRzdHJlYW0oJmZpeGVkX2hkciwgTDJfTEFOX0hFTExPLCBjaXJjdWl0LT5zbmRfc3RyZWFtKTsKKyAgICAgIGZpbGxfZml4ZWRfaGRyX2FuZHN0cmVhbSAoJmZpeGVkX2hkciwgTDJfTEFOX0hFTExPLAorCQkJCWNpcmN1aXQtPnNuZF9zdHJlYW0pOwogICBlbHNlCi0gICAgICBmaWxsX2ZpeGVkX2hkcl9hbmRzdHJlYW0oJmZpeGVkX2hkciwgUDJQX0hFTExPLCBjaXJjdWl0LT5zbmRfc3RyZWFtKTsKKyAgICBmaWxsX2ZpeGVkX2hkcl9hbmRzdHJlYW0gKCZmaXhlZF9oZHIsIFAyUF9IRUxMTywgY2lyY3VpdC0+c25kX3N0cmVhbSk7CiAKICAgLyoKICAgICogRmlsbCBMQU4gTGV2ZWwgMSBvciAyIEhlbGxvIFBEVSBoZWFkZXIKICAgICovCiAgIG1lbXNldCAoJmhlbGxvX2hkciwgMCwgc2l6ZW9mIChzdHJ1Y3QgaXNpc19sYW5faGVsbG9faGRyKSk7Ci0gIGludGVydmFsID0gY2lyY3VpdC0+aGVsbG9fbXVsdGlwbGllcltsZXZlbCAtIDFdICogCisgIGludGVydmFsID0gY2lyY3VpdC0+aGVsbG9fbXVsdGlwbGllcltsZXZlbCAtIDFdICoKICAgICBjaXJjdWl0LT5oZWxsb19pbnRlcnZhbFtsZXZlbCAtIDFdOwogICBpZiAoaW50ZXJ2YWwgPiBVU0hSVF9NQVgpCiAgICAgaW50ZXJ2YWwgPSBVU0hSVF9NQVg7CiAgIGhlbGxvX2hkci5jaXJjdWl0X3QgPSBjaXJjdWl0LT5jaXJjdWl0X2lzX3R5cGU7CiAgIG1lbWNweSAoaGVsbG9faGRyLnNvdXJjZV9pZCwgaXNpcy0+c3lzaWQsIElTSVNfU1lTX0lEX0xFTik7Ci0gIGhlbGxvX2hkci5ob2xkX3RpbWUgPSBodG9ucygodV9pbnQxNl90KWludGVydmFsKTsKKyAgaGVsbG9faGRyLmhvbGRfdGltZSA9IGh0b25zICgodV9pbnQxNl90KSBpbnRlcnZhbCk7CiAKLSAgaGVsbG9faGRyLnBkdV9sZW4gICA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgUERVIExlbmd0aCBsYXRlciAqLwotICBsZW5fcG9pbnRlciA9IHN0cmVhbV9nZXRfcHV0cCAoY2lyY3VpdC0+c25kX3N0cmVhbSkgKyAzICsgSVNJU19TWVNfSURfTEVOOyAgIAotCisgIGhlbGxvX2hkci5wZHVfbGVuID0gMDsJLyogVXBkYXRlIHRoZSBQRFUgTGVuZ3RoIGxhdGVyICovCisgIGxlbl9wb2ludGVyID0gc3RyZWFtX2dldF9wdXRwIChjaXJjdWl0LT5zbmRfc3RyZWFtKSArIDMgKyBJU0lTX1NZU19JRF9MRU47CiAKICAgLyogY29weSB0aGUgc2hhcmVkIHBhcnQgb2YgdGhlIGhlbGxvIHRvIHRoZSBwMnAgaGVsbG8gaWYgbmVlZGVkICovCi0gIGlmIChjaXJjdWl0LT5jaXJjX3R5cGUgPT0gQ0lSQ1VJVF9UX1AyUCkgewotICAgIG1lbWNweSAoJnAycF9oZWxsb19oZHIsICZoZWxsb19oZHIsIDUgKyBJU0lTX1NZU19JRF9MRU4pOwotICAgIHAycF9oZWxsb19oZHIubG9jYWxfaWQgPSBjaXJjdWl0LT5jaXJjdWl0X2lkOyAKLSAgICAvKiBGSVhNRTogbmVlZCBiZXR0ZXIgdW5kZXJzdGFuZGluZyAqLwotICAgIHN0cmVhbV9wdXQgIChjaXJjdWl0LT5zbmRfc3RyZWFtLCAmcDJwX2hlbGxvX2hkciwgSVNJU19QMlBIRUxMT19IRFJMRU4pOwotICB9IGVsc2UgewotICAgIGhlbGxvX2hkci5wcmlvID0gY2lyY3VpdC0+dS5iYy5wcmlvcml0eVtsZXZlbCAtIDFdOwotICAgIGlmKGxldmVsID09IDEgJiYgY2lyY3VpdC0+dS5iYy5sMV9kZXNpZ19pcykgewotICAgICAgbWVtY3B5KGhlbGxvX2hkci5sYW5faWQsIGNpcmN1aXQtPnUuYmMubDFfZGVzaWdfaXMsIElTSVNfU1lTX0lEX0xFTiArIDEpOwotICAgIH0gZWxzZSBpZiAobGV2ZWwgPT0gMiAmJiBjaXJjdWl0LT51LmJjLmwyX2Rlc2lnX2lzKXsKLSAgICAgIG1lbWNweShoZWxsb19oZHIubGFuX2lkLCBjaXJjdWl0LT51LmJjLmwyX2Rlc2lnX2lzLCBJU0lTX1NZU19JRF9MRU4gKyAxKTsKKyAgaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSA9PSBDSVJDVUlUX1RfUDJQKQorICAgIHsKKyAgICAgIG1lbWNweSAoJnAycF9oZWxsb19oZHIsICZoZWxsb19oZHIsIDUgKyBJU0lTX1NZU19JRF9MRU4pOworICAgICAgcDJwX2hlbGxvX2hkci5sb2NhbF9pZCA9IGNpcmN1aXQtPmNpcmN1aXRfaWQ7CisgICAgICAvKiBGSVhNRTogbmVlZCBiZXR0ZXIgdW5kZXJzdGFuZGluZyAqLworICAgICAgc3RyZWFtX3B1dCAoY2lyY3VpdC0+c25kX3N0cmVhbSwgJnAycF9oZWxsb19oZHIsIElTSVNfUDJQSEVMTE9fSERSTEVOKTsKICAgICB9Ci0gICAgc3RyZWFtX3B1dCAgKGNpcmN1aXQtPnNuZF9zdHJlYW0sICZoZWxsb19oZHIsIElTSVNfTEFOSEVMTE9fSERSTEVOKTsKLSAgfQorICBlbHNlCisgICAgeworICAgICAgaGVsbG9faGRyLnByaW8gPSBjaXJjdWl0LT51LmJjLnByaW9yaXR5W2xldmVsIC0gMV07CisgICAgICBpZiAobGV2ZWwgPT0gMSAmJiBjaXJjdWl0LT51LmJjLmwxX2Rlc2lnX2lzKQorCXsKKwkgIG1lbWNweSAoaGVsbG9faGRyLmxhbl9pZCwgY2lyY3VpdC0+dS5iYy5sMV9kZXNpZ19pcywKKwkJICBJU0lTX1NZU19JRF9MRU4gKyAxKTsKKwl9CisgICAgICBlbHNlIGlmIChsZXZlbCA9PSAyICYmIGNpcmN1aXQtPnUuYmMubDJfZGVzaWdfaXMpCisJeworCSAgbWVtY3B5IChoZWxsb19oZHIubGFuX2lkLCBjaXJjdWl0LT51LmJjLmwyX2Rlc2lnX2lzLAorCQkgIElTSVNfU1lTX0lEX0xFTiArIDEpOworCX0KKyAgICAgIHN0cmVhbV9wdXQgKGNpcmN1aXQtPnNuZF9zdHJlYW0sICZoZWxsb19oZHIsIElTSVNfTEFOSEVMTE9fSERSTEVOKTsKKyAgICB9CiAKICAgLyoKICAgICogVGhlbiB0aGUgdmFyaWFibGUgbGVuZ3RoIHBhcnQgCkBAIC0xNzkzLDE5ICsxOTg4LDIwIEBACiAgICAgICByZXR1cm4gSVNJU19XQVJOSU5HOwogCiAgIC8qICBMQU4gTmVpZ2hib3JzIFRMViAqLwotICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QpIHsKLSAgICBpZiAobGV2ZWwgPT0gMSAmJiBjaXJjdWl0LT51LmJjLmxhbl9uZWlnaHNbMF0tPmNvdW50ID4gMCkKLSAgICAgIGlmICh0bHZfYWRkX2xhbl9uZWlnaHMgKGNpcmN1aXQtPnUuYmMubGFuX25laWdoc1swXSwgCi0gICAgICAgICAgY2lyY3VpdC0+c25kX3N0cmVhbSkpCi0gICAgICAgIHJldHVybiBJU0lTX1dBUk5JTkc7Ci0gICAgaWYgKGxldmVsID09IDIgJiYgY2lyY3VpdC0+dS5iYy5sYW5fbmVpZ2hzWzFdLT5jb3VudCA+IDApCi0gICAgICBpZiAodGx2X2FkZF9sYW5fbmVpZ2hzIChjaXJjdWl0LT51LmJjLmxhbl9uZWlnaHNbMV0sIAotICAgICAgICAgIGNpcmN1aXQtPnNuZF9zdHJlYW0pKQotICAgICAgICByZXR1cm4gSVNJU19XQVJOSU5HOwotICB9CisgIGlmIChjaXJjdWl0LT5jaXJjX3R5cGUgPT0gQ0lSQ1VJVF9UX0JST0FEQ0FTVCkKKyAgICB7CisgICAgICBpZiAobGV2ZWwgPT0gMSAmJiBjaXJjdWl0LT51LmJjLmxhbl9uZWlnaHNbMF0tPmNvdW50ID4gMCkKKwlpZiAodGx2X2FkZF9sYW5fbmVpZ2hzIChjaXJjdWl0LT51LmJjLmxhbl9uZWlnaHNbMF0sCisJCQkJY2lyY3VpdC0+c25kX3N0cmVhbSkpCisJICByZXR1cm4gSVNJU19XQVJOSU5HOworICAgICAgaWYgKGxldmVsID09IDIgJiYgY2lyY3VpdC0+dS5iYy5sYW5fbmVpZ2hzWzFdLT5jb3VudCA+IDApCisJaWYgKHRsdl9hZGRfbGFuX25laWdocyAoY2lyY3VpdC0+dS5iYy5sYW5fbmVpZ2hzWzFdLAorCQkJCWNpcmN1aXQtPnNuZF9zdHJlYW0pKQorCSAgcmV0dXJuIElTSVNfV0FSTklORzsKKyAgICB9CiAKICAgLyogUHJvdG9jb2xzIFN1cHBvcnRlZCBUTFYgKi8KLSAgaWYgKGNpcmN1aXQtPm5scGlkcy5jb3VudCA+IDApIAorICBpZiAoY2lyY3VpdC0+bmxwaWRzLmNvdW50ID4gMCkKICAgICBpZiAodGx2X2FkZF9ubHBpZCAoJmNpcmN1aXQtPm5scGlkcywgY2lyY3VpdC0+c25kX3N0cmVhbSkpCiAgICAgICByZXR1cm4gSVNJU19XQVJOSU5HOwogICAvKiBJUCBpbnRlcmZhY2UgQWRkcmVzcyBUTFYgKi8KQEAgLTE4MTMsOSArMjAwOSw5IEBACiAgICAgaWYgKHRsdl9hZGRfaXBfYWRkcnMgKGNpcmN1aXQtPmlwX2FkZHJzLCBjaXJjdWl0LT5zbmRfc3RyZWFtKSkKICAgICAgIHJldHVybiBJU0lTX1dBUk5JTkc7CiAKLSNpZmRlZiBIQVZFX0lQVjYgCisjaWZkZWYgSEFWRV9JUFY2CiAgIC8qIElQdjYgSW50ZXJmYWNlIEFkZHJlc3MgVExWICovCi0gIGlmIChjaXJjdWl0LT5pcHY2X3JvdXRlciAmJiBjaXJjdWl0LT5pcHY2X2xpbmsgJiYgCisgIGlmIChjaXJjdWl0LT5pcHY2X3JvdXRlciAmJiBjaXJjdWl0LT5pcHY2X2xpbmsgJiYKICAgICAgIGNpcmN1aXQtPmlwdjZfbGluay0+Y291bnQgPiAwKQogICAgIGlmICh0bHZfYWRkX2lwdjZfYWRkcnMgKGNpcmN1aXQtPmlwdjZfbGluaywgY2lyY3VpdC0+c25kX3N0cmVhbSkpCiAgICAgICByZXR1cm4gSVNJU19XQVJOSU5HOwpAQCAtMTgyNywyNSArMjAyMywyOCBAQAogCiAgIGxlbmd0aCA9IHN0cmVhbV9nZXRfcHV0cCAoY2lyY3VpdC0+c25kX3N0cmVhbSk7CiAgIC8qIFVwZGF0ZSBQRFUgbGVuZ3RoICovCi0gIHN0cmVhbV9wdXR3X2F0IChjaXJjdWl0LT5zbmRfc3RyZWFtLCBsZW5fcG9pbnRlciwgKHVfaW50MTZfdClsZW5ndGgpOworICBzdHJlYW1fcHV0d19hdCAoY2lyY3VpdC0+c25kX3N0cmVhbSwgbGVuX3BvaW50ZXIsICh1X2ludDE2X3QpIGxlbmd0aCk7CiAKICAgcmV0dmFsID0gY2lyY3VpdC0+dHggKGNpcmN1aXQsIGxldmVsKTsKICAgaWYgKHJldHZhbCkKICAgICB6bG9nX3dhcm4gKCJzZW5kaW5nIG9mIExBTiBMZXZlbCAlZCBIZWxsbyBmYWlsZWQiLCBsZXZlbCk7CiAKICAgLyogREVCVUdfQURKX1BBQ0tFVFMgKi8KLSAgaWYgKGlzaXMtPmRlYnVncyAmIERFQlVHX0FESl9QQUNLRVRTKSB7Ci0gICAgaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSA9PSBDSVJDVUlUX1RfQlJPQURDQVNUKSB7Ci0gICAgICB6bG9nX2luZm8gKCJJU0lTLUFkaiAoJXMpOiBTZW50IEwlZCBMQU4gSUlIIG9uICVzLCBsZW5ndGggJWxkIiwKLSAgICAgICAgICAgICAgICAgY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsIGxldmVsLCBjaXJjdWl0LT5pbnRlcmZhY2UtPm5hbWUsCi0gICAgICAgICAgICAgICAgIFNUUkVBTV9TSVpFKGNpcmN1aXQtPnNuZF9zdHJlYW0pKTsKLSAgICB9IGVsc2UgewotICAgICAgemxvZ19pbmZvICgiSVNJUy1BZGogKCVzKTogU2VudCBQMlAgSUlIIG9uICVzLCBsZW5ndGggJWxkIiwKLSAgICAgICAgICAgICAgICAgY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsIGNpcmN1aXQtPmludGVyZmFjZS0+bmFtZSwKLSAgICAgICAgICAgICAgICAgU1RSRUFNX1NJWkUoY2lyY3VpdC0+c25kX3N0cmVhbSkpOworICBpZiAoaXNpcy0+ZGVidWdzICYgREVCVUdfQURKX1BBQ0tFVFMpCisgICAgeworICAgICAgaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSA9PSBDSVJDVUlUX1RfQlJPQURDQVNUKQorCXsKKwkgIHpsb2dfaW5mbyAoIklTSVMtQWRqICglcyk6IFNlbnQgTCVkIExBTiBJSUggb24gJXMsIGxlbmd0aCAlbGQiLAorCQkgICAgIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLCBsZXZlbCwgY2lyY3VpdC0+aW50ZXJmYWNlLT5uYW1lLAorCQkgICAgIFNUUkVBTV9TSVpFIChjaXJjdWl0LT5zbmRfc3RyZWFtKSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHpsb2dfaW5mbyAoIklTSVMtQWRqICglcyk6IFNlbnQgUDJQIElJSCBvbiAlcywgbGVuZ3RoICVsZCIsCisJCSAgICAgY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsIGNpcmN1aXQtPmludGVyZmFjZS0+bmFtZSwKKwkJICAgICBTVFJFQU1fU0laRSAoY2lyY3VpdC0+c25kX3N0cmVhbSkpOworCX0KICAgICB9Ci0gIH0KLQogCiAgIHJldHVybiByZXR2YWw7CiB9CkBAIC0xODUzLDEzICsyMDUyLDEyIEBACiBpbnQKIHNlbmRfbGFuX2hlbGxvIChzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LCBpbnQgbGV2ZWwpCiB7Ci0gIHJldHVybiBzZW5kX2hlbGxvIChjaXJjdWl0LGxldmVsKTsKKyAgcmV0dXJuIHNlbmRfaGVsbG8gKGNpcmN1aXQsIGxldmVsKTsKIH0KIAogaW50CiBzZW5kX2xhbl9sMV9oZWxsbyAoc3RydWN0IHRocmVhZCAqdGhyZWFkKQogewotCiAgIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQ7CiAgIGludCByZXR2YWw7CiAKQEAgLTE4NjgsMTMgKzIwNjYsMTQgQEAKICAgY2lyY3VpdC0+dS5iYy50X3NlbmRfbGFuX2hlbGxvWzBdID0gTlVMTDsKIAogICBpZiAoY2lyY3VpdC0+dS5iYy5ydW5fZHJfZWxlY3RbMF0pCi0gICAgcmV0dmFsID0gaXNpc19kcl9lbGVjdCAoY2lyY3VpdCwgMSk7IAorICAgIHJldHZhbCA9IGlzaXNfZHJfZWxlY3QgKGNpcmN1aXQsIDEpOwogCiAgIHJldHZhbCA9IHNlbmRfbGFuX2hlbGxvIChjaXJjdWl0LCAxKTsKIAogICAvKiBzZXQgbmV4dCB0aW1lciB0aHJlYWQgKi8KLSAgVEhSRUFEX1RJTUVSX09OKG1hc3RlciwgY2lyY3VpdC0+dS5iYy50X3NlbmRfbGFuX2hlbGxvWzBdLCBzZW5kX2xhbl9sMV9oZWxsbywKLSAgICAgIGNpcmN1aXQsIGlzaXNfaml0dGVyIChjaXJjdWl0LT5oZWxsb19pbnRlcnZhbFswXSwgSUlIX0pJVFRFUikpOworICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgY2lyY3VpdC0+dS5iYy50X3NlbmRfbGFuX2hlbGxvWzBdLAorCQkgICBzZW5kX2xhbl9sMV9oZWxsbywgY2lyY3VpdCwKKwkJICAgaXNpc19qaXR0ZXIgKGNpcmN1aXQtPmhlbGxvX2ludGVydmFsWzBdLCBJSUhfSklUVEVSKSk7CiAKICAgcmV0dXJuIHJldHZhbDsKIH0KQEAgLTE4OTQsOSArMjA5MywxMCBAQAogCiAgIHJldHZhbCA9IHNlbmRfbGFuX2hlbGxvIChjaXJjdWl0LCAyKTsKIAotICAvKiBzZXQgbmV4dCB0aW1lciB0aHJlYWQqLwotICBUSFJFQURfVElNRVJfT04obWFzdGVyLCBjaXJjdWl0LT51LmJjLnRfc2VuZF9sYW5faGVsbG9bMV0sIHNlbmRfbGFuX2wyX2hlbGxvLAotICAgICAgY2lyY3VpdCwgaXNpc19qaXR0ZXIgKGNpcmN1aXQtPmhlbGxvX2ludGVydmFsWzFdLCBJSUhfSklUVEVSKSk7CisgIC8qIHNldCBuZXh0IHRpbWVyIHRocmVhZCAqLworICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgY2lyY3VpdC0+dS5iYy50X3NlbmRfbGFuX2hlbGxvWzFdLAorCQkgICBzZW5kX2xhbl9sMl9oZWxsbywgY2lyY3VpdCwKKwkJICAgaXNpc19qaXR0ZXIgKGNpcmN1aXQtPmhlbGxvX2ludGVydmFsWzFdLCBJSUhfSklUVEVSKSk7CiAKICAgcmV0dXJuIHJldHZhbDsKIH0KQEAgLTE5MTAsMTggKzIxMTAsMTkgQEAKICAgYXNzZXJ0IChjaXJjdWl0KTsKICAgY2lyY3VpdC0+dS5wMnAudF9zZW5kX3AycF9oZWxsbyA9IE5VTEw7CiAKLSAgc2VuZF9oZWxsbyhjaXJjdWl0LDEpOworICBzZW5kX2hlbGxvIChjaXJjdWl0LCAxKTsKIAotICAvKiBzZXQgbmV4dCB0aW1lciB0aHJlYWQqLwotICBUSFJFQURfVElNRVJfT04obWFzdGVyLCBjaXJjdWl0LT51LnAycC50X3NlbmRfcDJwX2hlbGxvLCBzZW5kX3AycF9oZWxsbywKLSAgICAgIGNpcmN1aXQsIGlzaXNfaml0dGVyIChjaXJjdWl0LT5oZWxsb19pbnRlcnZhbFsxXSwgSUlIX0pJVFRFUikpOworICAvKiBzZXQgbmV4dCB0aW1lciB0aHJlYWQgKi8KKyAgVEhSRUFEX1RJTUVSX09OIChtYXN0ZXIsIGNpcmN1aXQtPnUucDJwLnRfc2VuZF9wMnBfaGVsbG8sIHNlbmRfcDJwX2hlbGxvLAorCQkgICBjaXJjdWl0LCBpc2lzX2ppdHRlciAoY2lyY3VpdC0+aGVsbG9faW50ZXJ2YWxbMV0sCisJCQkJCSBJSUhfSklUVEVSKSk7CiAKICAgcmV0dXJuIElTSVNfT0s7CiB9CiAKIGludAotYnVpbGRfY3NucCAoaW50IGxldmVsLCB1X2NoYXIgKnN0YXJ0LCB1X2NoYXIgKnN0b3AsIHN0cnVjdCBsaXN0ICpsc3BzLCAKLSAgICAgICAgICAgIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQpCitidWlsZF9jc25wIChpbnQgbGV2ZWwsIHVfY2hhciAqIHN0YXJ0LCB1X2NoYXIgKiBzdG9wLCBzdHJ1Y3QgbGlzdCAqbHNwcywKKwkgICAgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCkKIHsKICAgc3RydWN0IGlzaXNfZml4ZWRfaGRyIGZpeGVkX2hkcjsKICAgc3RydWN0IGlzaXNfcGFzc3dkICpwYXNzd2Q7CkBAIC0xOTI5LDE5ICsyMTMwLDE5IEBACiAgIHVuc2lnbmVkIGxvbmcgbGVucDsKICAgdV9pbnQxNl90IGxlbmd0aDsKIAotICBpZiAobGV2ZWwgPT0xKQotICAgIGZpbGxfZml4ZWRfaGRyX2FuZHN0cmVhbSAoJmZpeGVkX2hkciwgTDFfQ09NUExFVEVfU0VRX05VTSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXJjdWl0LT5zbmRfc3RyZWFtKTsKKyAgaWYgKGxldmVsID09IDEpCisgICAgZmlsbF9maXhlZF9oZHJfYW5kc3RyZWFtICgmZml4ZWRfaGRyLCBMMV9DT01QTEVURV9TRVFfTlVNLAorCQkJICAgICAgY2lyY3VpdC0+c25kX3N0cmVhbSk7CiAgIGVsc2UKLSAgICBmaWxsX2ZpeGVkX2hkcl9hbmRzdHJlYW0gKCZmaXhlZF9oZHIsIEwyX0NPTVBMRVRFX1NFUV9OVU0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lyY3VpdC0+c25kX3N0cmVhbSk7CisgICAgZmlsbF9maXhlZF9oZHJfYW5kc3RyZWFtICgmZml4ZWRfaGRyLCBMMl9DT01QTEVURV9TRVFfTlVNLAorCQkJICAgICAgY2lyY3VpdC0+c25kX3N0cmVhbSk7CiAKICAgLyoKICAgICogRmlsbCBMZXZlbCAxIG9yIDIgQ29tcGxldGUgU2VxdWVuY2UgTnVtYmVycyBoZWFkZXIKICAgICovCiAKICAgbGVucCA9IHN0cmVhbV9nZXRfcHV0cCAoY2lyY3VpdC0+c25kX3N0cmVhbSk7Ci0gIHN0cmVhbV9wdXR3IChjaXJjdWl0LT5zbmRfc3RyZWFtLCAwKTsgLyogUERVIGxlbmd0aCAtIHdoZW4gd2Uga25vdyBpdCAqLworICBzdHJlYW1fcHV0dyAoY2lyY3VpdC0+c25kX3N0cmVhbSwgMCk7CS8qIFBEVSBsZW5ndGggLSB3aGVuIHdlIGtub3cgaXQgKi8KICAgLyogbm8gbmVlZCB0byBzZW5kIHRoZSBzb3VyY2UgaGVyZSwgaXQgaXMgYWx3YXlzIHVzIGlmIHdlIGNzbnAgKi8KICAgc3RyZWFtX3B1dCAoY2lyY3VpdC0+c25kX3N0cmVhbSwgaXNpcy0+c3lzaWQsIElTSVNfU1lTX0lEX0xFTik7CiAgIC8qIHdpdGggemVybyBjaXJjdWl0IGlkIC0gcmVmIDkuMTAsIDkuMTEgKi8KQEAgLTE5NjIsMTAgKzIxNjMsMTEgQEAKICAgICByZXR2YWwgPSB0bHZfYWRkX2F1dGhpbmZvIChwYXNzd2QtPnR5cGUsIHBhc3N3ZC0+bGVuLAogCQkJICAgICAgIHBhc3N3ZC0+cGFzc3dkLCBjaXJjdWl0LT5zbmRfc3RyZWFtKTsKIAotICBpZiAoIXJldHZhbCAmJiBsc3BzKSB7IAotICAgIHJldHZhbCA9IHRsdl9hZGRfbHNwX2VudHJpZXMgKGxzcHMsIGNpcmN1aXQtPnNuZF9zdHJlYW0pOwotICB9IAotICBsZW5ndGggPSAodV9pbnQxNl90KXN0cmVhbV9nZXRfcHV0cCAoY2lyY3VpdC0+c25kX3N0cmVhbSk7CisgIGlmICghcmV0dmFsICYmIGxzcHMpCisgICAgeworICAgICAgcmV0dmFsID0gdGx2X2FkZF9sc3BfZW50cmllcyAobHNwcywgY2lyY3VpdC0+c25kX3N0cmVhbSk7CisgICAgfQorICBsZW5ndGggPSAodV9pbnQxNl90KSBzdHJlYW1fZ2V0X3B1dHAgKGNpcmN1aXQtPnNuZF9zdHJlYW0pOwogICBhc3NlcnQgKGxlbmd0aCA+PSBJU0lTX0NTTlBfSERSTEVOKTsKICAgLyogVXBkYXRlIFBVIGxlbmd0aCAqLwogICBzdHJlYW1fcHV0d19hdCAoY2lyY3VpdC0+c25kX3N0cmVhbSwgbGVucCwgbGVuZ3RoKTsKQEAgLTE5ODcsNDEgKzIxODksNDQgQEAKICAgc3RydWN0IGxpc3Rub2RlICpub2RlOwogICBzdHJ1Y3QgaXNpc19sc3AgKmxzcDsKIAotICBtZW1zZXQgKHN0YXJ0LDB4MDAsIElTSVNfU1lTX0lEX0xFTiArIDIpOworICBtZW1zZXQgKHN0YXJ0LCAweDAwLCBJU0lTX1NZU19JRF9MRU4gKyAyKTsKICAgbWVtc2V0IChzdG9wLCAweGZmLCBJU0lTX1NZU19JRF9MRU4gKyAyKTsKIAotICBpZiAoY2lyY3VpdC0+YXJlYS0+bHNwZGJbbGV2ZWwtMV0gJiYgCi0gICAgICBkaWN0X2NvdW50IChjaXJjdWl0LT5hcmVhLT5sc3BkYltsZXZlbC0xXSkgPiAwKSB7Ci0gICAgbGlzdCA9IGxpc3RfbmV3ICgpOwotICAgIGxzcF9idWlsZF9saXN0IChzdGFydCwgc3RvcCwgbGlzdCwgY2lyY3VpdC0+YXJlYS0+bHNwZGJbbGV2ZWwtMV0pOworICBpZiAoY2lyY3VpdC0+YXJlYS0+bHNwZGJbbGV2ZWwgLSAxXSAmJgorICAgICAgZGljdF9jb3VudCAoY2lyY3VpdC0+YXJlYS0+bHNwZGJbbGV2ZWwgLSAxXSkgPiAwKQorICAgIHsKKyAgICAgIGxpc3QgPSBsaXN0X25ldyAoKTsKKyAgICAgIGxzcF9idWlsZF9saXN0IChzdGFydCwgc3RvcCwgbGlzdCwgY2lyY3VpdC0+YXJlYS0+bHNwZGJbbGV2ZWwgLSAxXSk7CiAKLSAgICBpZiAoY2lyY3VpdC0+c25kX3N0cmVhbSA9PSBOVUxMKQotICAgICAgY2lyY3VpdC0+c25kX3N0cmVhbSA9IHN0cmVhbV9uZXcgKElTT19NVFUoY2lyY3VpdCkpOwotICAgIGVsc2UKLSAgICAgIHN0cmVhbV9yZXNldCAoY2lyY3VpdC0+c25kX3N0cmVhbSk7CisgICAgICBpZiAoY2lyY3VpdC0+c25kX3N0cmVhbSA9PSBOVUxMKQorCWNpcmN1aXQtPnNuZF9zdHJlYW0gPSBzdHJlYW1fbmV3IChJU09fTVRVIChjaXJjdWl0KSk7CisgICAgICBlbHNlCisJc3RyZWFtX3Jlc2V0IChjaXJjdWl0LT5zbmRfc3RyZWFtKTsKIAotICAgIHJldHZhbCA9IGJ1aWxkX2NzbnAgIChsZXZlbCwgc3RhcnQsIHN0b3AsIGxpc3QsIGNpcmN1aXQpOworICAgICAgcmV0dmFsID0gYnVpbGRfY3NucCAobGV2ZWwsIHN0YXJ0LCBzdG9wLCBsaXN0LCBjaXJjdWl0KTsKIAotICAgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19TTlBfUEFDS0VUUykgeyAKLSAgICAgIHpsb2dfaW5mbyAoIklTSVMtU25wICglcyk6IFNlbnQgTCVkIENTTlAgb24gJXMsIGxlbmd0aCAlbGQiLAotICAgICAgICAgICAgICAgICBjaXJjdWl0LT5hcmVhLT5hcmVhX3RhZywgbGV2ZWwsIGNpcmN1aXQtPmludGVyZmFjZS0+bmFtZSwKLSAgICAgICAgICAgICAgICAgU1RSRUFNX1NJWkUoY2lyY3VpdC0+c25kX3N0cmVhbSkpOwotICAgICAgTElTVF9MT09QIChsaXN0LCBsc3AsIG5vZGUpIHsKLSAgICAgICAgemxvZ19pbmZvKCJJU0lTLVNucCAoJXMpOiAgICAgICAgIENTTlAgZW50cnkgJXMsIHNlcSAweCUwOHgsIgotICAgICAgICAgICAgICAgICAgIiBja3N1bSAweCUwNHgsIGxpZmV0aW1lICV1cyIsIAotICAgICAgICAgICAgICAgICAgY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsCi0gICAgICAgICAgICAgICAgICByYXdsc3BpZF9wcmludCAobHNwLT5sc3BfaGVhZGVyLT5sc3BfaWQpLAotICAgICAgICAgICAgICAgICAgbnRvaGwgKGxzcC0+bHNwX2hlYWRlci0+c2VxX251bSksCi0gICAgICAgICAgICAgICAgICBudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5jaGVja3N1bSksCi0gICAgICAgICAgICAgICAgICBudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5yZW1fbGlmZXRpbWUpKTsKLSAgICAgIH0KKyAgICAgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19TTlBfUEFDS0VUUykKKwl7CisJICB6bG9nX2luZm8gKCJJU0lTLVNucCAoJXMpOiBTZW50IEwlZCBDU05QIG9uICVzLCBsZW5ndGggJWxkIiwKKwkJICAgICBjaXJjdWl0LT5hcmVhLT5hcmVhX3RhZywgbGV2ZWwsIGNpcmN1aXQtPmludGVyZmFjZS0+bmFtZSwKKwkJICAgICBTVFJFQU1fU0laRSAoY2lyY3VpdC0+c25kX3N0cmVhbSkpOworCSAgTElTVF9MT09QIChsaXN0LCBsc3AsIG5vZGUpCisJICB7CisJICAgIHpsb2dfaW5mbyAoIklTSVMtU25wICglcyk6ICAgICAgICAgQ1NOUCBlbnRyeSAlcywgc2VxIDB4JTA4eCwiCisJCSAgICAgICAiIGNrc3VtIDB4JTA0eCwgbGlmZXRpbWUgJXVzIiwKKwkJICAgICAgIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLAorCQkgICAgICAgcmF3bHNwaWRfcHJpbnQgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkKSwKKwkJICAgICAgIG50b2hsIChsc3AtPmxzcF9oZWFkZXItPnNlcV9udW0pLAorCQkgICAgICAgbnRvaHMgKGxzcC0+bHNwX2hlYWRlci0+Y2hlY2tzdW0pLAorCQkgICAgICAgbnRvaHMgKGxzcC0+bHNwX2hlYWRlci0+cmVtX2xpZmV0aW1lKSk7CisJICB9CisJfQorCisgICAgICBsaXN0X2RlbGV0ZSAobGlzdCk7CisKKyAgICAgIGlmIChyZXR2YWwgPT0gSVNJU19PSykKKwlyZXR2YWwgPSBjaXJjdWl0LT50eCAoY2lyY3VpdCwgbGV2ZWwpOwogICAgIH0KLQotICAgIGxpc3RfZGVsZXRlIChsaXN0KTsKLQotICAgIGlmIChyZXR2YWwgPT0gSVNJU19PSykKLSAgICAgIHJldHZhbCA9IGNpcmN1aXQtPnR4IChjaXJjdWl0LCBsZXZlbCk7Ci0gIH0KICAgcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMjAzNiwxMiArMjI0MSwxMyBAQAogCiAgIGNpcmN1aXQtPnRfc2VuZF9jc25wWzBdID0gTlVMTDsKIAotICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QgJiYgY2lyY3VpdC0+dS5iYy5pc19kclswXSkgewotICAgIHNlbmRfY3NucChjaXJjdWl0LDEpOwotICB9CisgIGlmIChjaXJjdWl0LT5jaXJjX3R5cGUgPT0gQ0lSQ1VJVF9UX0JST0FEQ0FTVCAmJiBjaXJjdWl0LT51LmJjLmlzX2RyWzBdKQorICAgIHsKKyAgICAgIHNlbmRfY3NucCAoY2lyY3VpdCwgMSk7CisgICAgfQogICAvKiBzZXQgbmV4dCB0aW1lciB0aHJlYWQgKi8KLSAgVEhSRUFEX1RJTUVSX09OKG1hc3RlciwgY2lyY3VpdC0+dF9zZW5kX2NzbnBbMF0sIHNlbmRfbDFfY3NucCwgY2lyY3VpdCwKLSAgICAgIGlzaXNfaml0dGVyKGNpcmN1aXQtPmNzbnBfaW50ZXJ2YWxbMF0sIENTTlBfSklUVEVSKSk7CisgIFRIUkVBRF9USU1FUl9PTiAobWFzdGVyLCBjaXJjdWl0LT50X3NlbmRfY3NucFswXSwgc2VuZF9sMV9jc25wLCBjaXJjdWl0LAorCQkgICBpc2lzX2ppdHRlciAoY2lyY3VpdC0+Y3NucF9pbnRlcnZhbFswXSwgQ1NOUF9KSVRURVIpKTsKIAogICByZXR1cm4gcmV0dmFsOwogfQpAQCAtMjA1NywxMiArMjI2MywxMyBAQAogCiAgIGNpcmN1aXQtPnRfc2VuZF9jc25wWzFdID0gTlVMTDsKIAotICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QgJiYgY2lyY3VpdC0+dS5iYy5pc19kclsxXSkgewotICAgIHNlbmRfY3NucChjaXJjdWl0LDIpOwotICB9CisgIGlmIChjaXJjdWl0LT5jaXJjX3R5cGUgPT0gQ0lSQ1VJVF9UX0JST0FEQ0FTVCAmJiBjaXJjdWl0LT51LmJjLmlzX2RyWzFdKQorICAgIHsKKyAgICAgIHNlbmRfY3NucCAoY2lyY3VpdCwgMik7CisgICAgfQogICAvKiBzZXQgbmV4dCB0aW1lciB0aHJlYWQgKi8KLSAgVEhSRUFEX1RJTUVSX09OKG1hc3RlciwgY2lyY3VpdC0+dF9zZW5kX2NzbnBbMV0sIHNlbmRfbDJfY3NucCwgY2lyY3VpdCwKLSAgICAgIGlzaXNfaml0dGVyKGNpcmN1aXQtPmNzbnBfaW50ZXJ2YWxbMV0sIENTTlBfSklUVEVSKSk7CisgIFRIUkVBRF9USU1FUl9PTiAobWFzdGVyLCBjaXJjdWl0LT50X3NlbmRfY3NucFsxXSwgc2VuZF9sMl9jc25wLCBjaXJjdWl0LAorCQkgICBpc2lzX2ppdHRlciAoY2lyY3VpdC0+Y3NucF9pbnRlcnZhbFsxXSwgQ1NOUF9KSVRURVIpKTsKIAogICByZXR1cm4gcmV0dmFsOwogfQpAQCAtMjA3OSwxNyArMjI4NiwxNyBAQAogICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAKICAgaWYgKGxldmVsID09IDEpCi0gICAgZmlsbF9maXhlZF9oZHJfYW5kc3RyZWFtICgmZml4ZWRfaGRyLCBMMV9QQVJUSUFMX1NFUV9OVU0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lyY3VpdC0+c25kX3N0cmVhbSk7CisgICAgZmlsbF9maXhlZF9oZHJfYW5kc3RyZWFtICgmZml4ZWRfaGRyLCBMMV9QQVJUSUFMX1NFUV9OVU0sCisJCQkgICAgICBjaXJjdWl0LT5zbmRfc3RyZWFtKTsKICAgZWxzZQogICAgIGZpbGxfZml4ZWRfaGRyX2FuZHN0cmVhbSAoJmZpeGVkX2hkciwgTDJfUEFSVElBTF9TRVFfTlVNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lyY3VpdC0+c25kX3N0cmVhbSk7CisJCQkgICAgICBjaXJjdWl0LT5zbmRfc3RyZWFtKTsKIAogICAvKgogICAgKiBGaWxsIExldmVsIDEgb3IgMiBQYXJ0aWFsIFNlcXVlbmNlIE51bWJlcnMgaGVhZGVyCiAgICAqLwogICBsZW5wID0gc3RyZWFtX2dldF9wdXRwIChjaXJjdWl0LT5zbmRfc3RyZWFtKTsKLSAgc3RyZWFtX3B1dHcgKGNpcmN1aXQtPnNuZF9zdHJlYW0sIDApOyAvKiBQRFUgbGVuZ3RoIC0gd2hlbiB3ZSBrbm93IGl0ICovCisgIHN0cmVhbV9wdXR3IChjaXJjdWl0LT5zbmRfc3RyZWFtLCAwKTsJLyogUERVIGxlbmd0aCAtIHdoZW4gd2Uga25vdyBpdCAqLwogICBzdHJlYW1fcHV0IChjaXJjdWl0LT5zbmRfc3RyZWFtLCBpc2lzLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOKTsKICAgc3RyZWFtX3B1dGMgKGNpcmN1aXQtPnNuZF9zdHJlYW0sIGNpcmN1aXQtPmlkeCk7CiAKQEAgLTIxMDYsMjMgKzIzMTMsMjYgQEAKICAgICByZXR2YWwgPSB0bHZfYWRkX2F1dGhpbmZvIChwYXNzd2QtPnR5cGUsIHBhc3N3ZC0+bGVuLAogCQkJICAgICAgIHBhc3N3ZC0+cGFzc3dkLCBjaXJjdWl0LT5zbmRfc3RyZWFtKTsKIAotICBpZiAoIXJldHZhbCAmJiBsc3BzKSB7IAotICAgIHJldHZhbCA9IHRsdl9hZGRfbHNwX2VudHJpZXMgKGxzcHMsIGNpcmN1aXQtPnNuZF9zdHJlYW0pOwotICB9Ci0KLSAgaWYgKGlzaXMtPmRlYnVncyAmIERFQlVHX1NOUF9QQUNLRVRTKSB7Ci0gICAgTElTVF9MT09QIChsc3BzLCBsc3AsIG5vZGUpIHsKLSAgICAgIHpsb2dfaW5mbygiSVNJUy1TbnAgKCVzKTogICAgICAgICBQU05QIGVudHJ5ICVzLCBzZXEgMHglMDh4LCIKLSAgICAgICAgICAgICAgICAiIGNrc3VtIDB4JTA0eCwgbGlmZXRpbWUgJXVzIiwgCi0gICAgICAgICAgICAgICAgY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsCi0gICAgICAgICAgICAgICAgcmF3bHNwaWRfcHJpbnQgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkKSwKLSAgICAgICAgICAgICAgICBudG9obCAobHNwLT5sc3BfaGVhZGVyLT5zZXFfbnVtKSwKLSAgICAgICAgICAgICAgICBudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5jaGVja3N1bSksCi0gICAgICAgICAgICAgICAgbnRvaHMgKGxzcC0+bHNwX2hlYWRlci0+cmVtX2xpZmV0aW1lKSk7CisgIGlmICghcmV0dmFsICYmIGxzcHMpCisgICAgeworICAgICAgcmV0dmFsID0gdGx2X2FkZF9sc3BfZW50cmllcyAobHNwcywgY2lyY3VpdC0+c25kX3N0cmVhbSk7CiAgICAgfQotICB9CiAKLSAgbGVuZ3RoID0gKHVfaW50MTZfdClzdHJlYW1fZ2V0X3B1dHAgKGNpcmN1aXQtPnNuZF9zdHJlYW0pOworICBpZiAoaXNpcy0+ZGVidWdzICYgREVCVUdfU05QX1BBQ0tFVFMpCisgICAgeworICAgICAgTElTVF9MT09QIChsc3BzLCBsc3AsIG5vZGUpCisgICAgICB7CisJemxvZ19pbmZvICgiSVNJUy1TbnAgKCVzKTogICAgICAgICBQU05QIGVudHJ5ICVzLCBzZXEgMHglMDh4LCIKKwkJICAgIiBja3N1bSAweCUwNHgsIGxpZmV0aW1lICV1cyIsCisJCSAgIGNpcmN1aXQtPmFyZWEtPmFyZWFfdGFnLAorCQkgICByYXdsc3BpZF9wcmludCAobHNwLT5sc3BfaGVhZGVyLT5sc3BfaWQpLAorCQkgICBudG9obCAobHNwLT5sc3BfaGVhZGVyLT5zZXFfbnVtKSwKKwkJICAgbnRvaHMgKGxzcC0+bHNwX2hlYWRlci0+Y2hlY2tzdW0pLAorCQkgICBudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5yZW1fbGlmZXRpbWUpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgbGVuZ3RoID0gKHVfaW50MTZfdCkgc3RyZWFtX2dldF9wdXRwIChjaXJjdWl0LT5zbmRfc3RyZWFtKTsKICAgYXNzZXJ0IChsZW5ndGggPj0gSVNJU19QU05QX0hEUkxFTik7CiAgIC8qIFVwZGF0ZSBQRFUgbGVuZ3RoICovCiAgIHN0cmVhbV9wdXR3X2F0IChjaXJjdWl0LT5zbmRfc3RyZWFtLCBsZW5wLCBsZW5ndGgpOwpAQCAtMjE0Miw0NSArMjM1Miw1MSBAQAogICBzdHJ1Y3QgbGlzdCAqbGlzdCA9IE5VTEw7CiAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKIAotICBpZiAoKGNpcmN1aXQtPmNpcmNfdHlwZSA9PSBDSVJDVUlUX1RfQlJPQURDQVNUICYmIAorICBpZiAoKGNpcmN1aXQtPmNpcmNfdHlwZSA9PSBDSVJDVUlUX1RfQlJPQURDQVNUICYmCiAgICAgICAgIWNpcmN1aXQtPnUuYmMuaXNfZHJbbGV2ZWwgLSAxXSkgfHwKLSAgICAgIGNpcmN1aXQtPmNpcmNfdHlwZSAhPSBDSVJDVUlUX1RfQlJPQURDQVNUKSB7CisgICAgICBjaXJjdWl0LT5jaXJjX3R5cGUgIT0gQ0lSQ1VJVF9UX0JST0FEQ0FTVCkKKyAgICB7CiAKLSAgICBpZiAoY2lyY3VpdC0+YXJlYS0+bHNwZGJbbGV2ZWwtMV0gJiYgCi0gICAgICAgIGRpY3RfY291bnQgKGNpcmN1aXQtPmFyZWEtPmxzcGRiW2xldmVsLTFdKSA+IDApIHsKLSAgICAgIGxpc3QgPSBsaXN0X25ldyAoKTsKLSAgICAgIGxzcF9idWlsZF9saXN0X3NzbiAoY2lyY3VpdCwgbGlzdCwgY2lyY3VpdC0+YXJlYS0+bHNwZGJbbGV2ZWwtMV0pOworICAgICAgaWYgKGNpcmN1aXQtPmFyZWEtPmxzcGRiW2xldmVsIC0gMV0gJiYKKwkgIGRpY3RfY291bnQgKGNpcmN1aXQtPmFyZWEtPmxzcGRiW2xldmVsIC0gMV0pID4gMCkKKwl7CisJICBsaXN0ID0gbGlzdF9uZXcgKCk7CisJICBsc3BfYnVpbGRfbGlzdF9zc24gKGNpcmN1aXQsIGxpc3QsIGNpcmN1aXQtPmFyZWEtPmxzcGRiW2xldmVsIC0gMV0pOwogCi0gICAgICBpZiAobGlzdGNvdW50KGxpc3QpID4gMCkgewotICAgICAgICBpZiAoY2lyY3VpdC0+c25kX3N0cmVhbSA9PSBOVUxMKQotICAgICAgICAgIGNpcmN1aXQtPnNuZF9zdHJlYW0gPSBzdHJlYW1fbmV3IChJU09fTVRVKGNpcmN1aXQpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHN0cmVhbV9yZXNldCAoY2lyY3VpdC0+c25kX3N0cmVhbSk7CisJICBpZiAobGlzdGNvdW50IChsaXN0KSA+IDApCisJICAgIHsKKwkgICAgICBpZiAoY2lyY3VpdC0+c25kX3N0cmVhbSA9PSBOVUxMKQorCQljaXJjdWl0LT5zbmRfc3RyZWFtID0gc3RyZWFtX25ldyAoSVNPX01UVSAoY2lyY3VpdCkpOworCSAgICAgIGVsc2UKKwkJc3RyZWFtX3Jlc2V0IChjaXJjdWl0LT5zbmRfc3RyZWFtKTsKIAogCi0gICAgICAgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19TTlBfUEFDS0VUUykgCi0gICAgICAgICAgemxvZ19pbmZvICgiSVNJUy1TbnAgKCVzKTogU2VudCBMJWQgUFNOUCBvbiAlcywgbGVuZ3RoICVsZCIsCi0gICAgICAgICAgICAgICAgICAgICBjaXJjdWl0LT5hcmVhLT5hcmVhX3RhZywgbGV2ZWwsIGNpcmN1aXQtPmludGVyZmFjZS0+bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIFNUUkVBTV9TSVpFKGNpcmN1aXQtPnNuZF9zdHJlYW0pKTsKKwkgICAgICBpZiAoaXNpcy0+ZGVidWdzICYgREVCVUdfU05QX1BBQ0tFVFMpCisJCXpsb2dfaW5mbyAoIklTSVMtU25wICglcyk6IFNlbnQgTCVkIFBTTlAgb24gJXMsIGxlbmd0aCAlbGQiLAorCQkJICAgY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsIGxldmVsLAorCQkJICAgY2lyY3VpdC0+aW50ZXJmYWNlLT5uYW1lLAorCQkJICAgU1RSRUFNX1NJWkUgKGNpcmN1aXQtPnNuZF9zdHJlYW0pKTsKIAotICAgICAgICByZXR2YWwgPSBidWlsZF9wc25wIChsZXZlbCwgY2lyY3VpdCwgbGlzdCk7Ci0gICAgICAgIGlmIChyZXR2YWwgPT0gSVNJU19PSykKLSAgICAgICAgICByZXR2YWwgPSBjaXJjdWl0LT50eCAoY2lyY3VpdCwgbGV2ZWwpOworCSAgICAgIHJldHZhbCA9IGJ1aWxkX3BzbnAgKGxldmVsLCBjaXJjdWl0LCBsaXN0KTsKKwkgICAgICBpZiAocmV0dmFsID09IElTSVNfT0spCisJCXJldHZhbCA9IGNpcmN1aXQtPnR4IChjaXJjdWl0LCBsZXZlbCk7CiAKLSAgICAgICAgaWYgKHJldHZhbCA9PSBJU0lTX09LKSB7Ci0gICAgICAgICAgLyoKLSAgICAgICAgICAgKiBzZW5kaW5nIHN1Y2NlZWRlZCwgd2UgY2FuIGNsZWFyIFNTTiBmbGFncyBvZiB0aGlzIGNpcmN1aXQKLSAgICAgICAgICAgKiBmb3IgdGhlIExTUHMgaW4gbGlzdAotICAgICAgICAgICAqLwotICAgICAgICAgIGZvciAobm9kZSA9IGxpc3RoZWFkIChsaXN0KTsgbm9kZTsgbmV4dG5vZGUobm9kZSkpIHsKLSAgICAgICAgICAgIGxzcCA9IGdldGRhdGEgKG5vZGUpOwotICAgICAgICAgICAgSVNJU19DTEVBUl9GTEFHIChsc3AtPlNTTmZsYWdzLCBjaXJjdWl0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGxpc3RfZGVsZXRlIChsaXN0KTsKKwkgICAgICBpZiAocmV0dmFsID09IElTSVNfT0spCisJCXsKKwkJICAvKgorCQkgICAqIHNlbmRpbmcgc3VjY2VlZGVkLCB3ZSBjYW4gY2xlYXIgU1NOIGZsYWdzIG9mIHRoaXMgY2lyY3VpdAorCQkgICAqIGZvciB0aGUgTFNQcyBpbiBsaXN0CisJCSAgICovCisJCSAgZm9yIChub2RlID0gbGlzdGhlYWQgKGxpc3QpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisJCSAgICB7CisJCSAgICAgIGxzcCA9IGdldGRhdGEgKG5vZGUpOworCQkgICAgICBJU0lTX0NMRUFSX0ZMQUcgKGxzcC0+U1NOZmxhZ3MsIGNpcmN1aXQpOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgIGxpc3RfZGVsZXRlIChsaXN0KTsKKwl9CiAgICAgfQotICB9CiAKICAgcmV0dXJuIHJldHZhbDsKIH0KQEAgLTIxOTksOCArMjQxNSw4IEBACiAKICAgc2VuZF9wc25wICgxLCBjaXJjdWl0KTsKICAgLyogc2V0IG5leHQgdGltZXIgdGhyZWFkICovCi0gIFRIUkVBRF9USU1FUl9PTihtYXN0ZXIsIGNpcmN1aXQtPnRfc2VuZF9wc25wWzBdLCBzZW5kX2wxX3BzbnAsIGNpcmN1aXQsCi0gICAgICBpc2lzX2ppdHRlcihjaXJjdWl0LT5wc25wX2ludGVydmFsWzBdLCBQU05QX0pJVFRFUikpOworICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgY2lyY3VpdC0+dF9zZW5kX3BzbnBbMF0sIHNlbmRfbDFfcHNucCwgY2lyY3VpdCwKKwkJICAgaXNpc19qaXR0ZXIgKGNpcmN1aXQtPnBzbnBfaW50ZXJ2YWxbMF0sIFBTTlBfSklUVEVSKSk7CiAKICAgcmV0dXJuIHJldHZhbDsKIH0KQEAgLTIyMTIsNyArMjQyOCw2IEBACiBpbnQKIHNlbmRfbDJfcHNucCAoc3RydWN0IHRocmVhZCAqdGhyZWFkKQogewotCiAgIHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQ7CiAgIGludCByZXR2YWwgPSBJU0lTX09LOwogCkBAIC0yMjI0LDI2ICsyNDM5LDI0IEBACiAgIHNlbmRfcHNucCAoMiwgY2lyY3VpdCk7CiAKICAgLyogc2V0IG5leHQgdGltZXIgdGhyZWFkICovCi0gIFRIUkVBRF9USU1FUl9PTihtYXN0ZXIsIGNpcmN1aXQtPnRfc2VuZF9wc25wWzFdLCBzZW5kX2wyX3BzbnAsIGNpcmN1aXQsCi0gICAgICBpc2lzX2ppdHRlcihjaXJjdWl0LT5wc25wX2ludGVydmFsWzFdLCBQU05QX0pJVFRFUikpOworICBUSFJFQURfVElNRVJfT04gKG1hc3RlciwgY2lyY3VpdC0+dF9zZW5kX3BzbnBbMV0sIHNlbmRfbDJfcHNucCwgY2lyY3VpdCwKKwkJICAgaXNpc19qaXR0ZXIgKGNpcmN1aXQtPnBzbnBfaW50ZXJ2YWxbMV0sIFBTTlBfSklUVEVSKSk7CiAKICAgcmV0dXJuIHJldHZhbDsKIH0KIAotCiB2b2lkCiBidWlsZF9saW5rX3N0YXRlIChzdHJ1Y3QgaXNpc19sc3AgKmxzcCwgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwKLSAgICAgICAgICAgICAgICAgIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKKwkJICBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCiB7CiAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwogCi0gIHN0cmVhbV9wdXQgIChzdHJlYW0sIGxzcC0+cGR1LCBudG9ocyhsc3AtPmxzcF9oZWFkZXItPnBkdV9sZW4pKTsKLSAgbGVuZ3RoID0gc3RyZWFtX2dldF9wdXRwIChzdHJlYW0pOyAKKyAgc3RyZWFtX3B1dCAoc3RyZWFtLCBsc3AtPnBkdSwgbnRvaHMgKGxzcC0+bHNwX2hlYWRlci0+cGR1X2xlbikpOworICBsZW5ndGggPSBzdHJlYW1fZ2V0X3B1dHAgKHN0cmVhbSk7CiAKICAgcmV0dXJuOwogfQogCi0KIC8qCiAgKiBJU08gMTA1ODkgLSA3LjMuMTQuMwogICovCkBAIC0yMjU4LDkwICsyNDcxLDk4IEBACiAgIGNpcmN1aXQgPSBUSFJFQURfQVJHICh0aHJlYWQpOwogICBhc3NlcnQgKGNpcmN1aXQpOwogCi0gIGlmIChjaXJjdWl0LT5zdGF0ZSA9PSBDX1NUQVRFX1VQKSB7Ci0gICAgbm9kZSA9IGxpc3RoZWFkIChjaXJjdWl0LT5sc3BfcXVldWUpOwotICAgIGFzc2VydCAobm9kZSk7CisgIGlmIChjaXJjdWl0LT5zdGF0ZSA9PSBDX1NUQVRFX1VQKQorICAgIHsKKyAgICAgIG5vZGUgPSBsaXN0aGVhZCAoY2lyY3VpdC0+bHNwX3F1ZXVlKTsKKyAgICAgIGFzc2VydCAobm9kZSk7CiAKLSAgICBsc3AgPSBnZXRkYXRhIChub2RlKTsKLQotICAgIC8qCi0gICAgICogRG8gbm90IHNlbmQgaWYgbGV2ZWxzIGRvIG5vdCBtYXRjaAotICAgICAqLwotICAgIGlmICghKGxzcC0+bGV2ZWwgJiBjaXJjdWl0LT5jaXJjdWl0X2lzX3R5cGUpKQotICAgICAgZ290byBkb250c2VuZDsKLQotICAgIC8qCi0gICAgICogRG8gbm90IHNlbmQgaWYgd2UgZG8gbm90IGhhdmUgYWRqYWNlbmNpZXMgaW4gc3RhdGUgdXAgb24gdGhlIGNpcmN1aXQKLSAgICAgKi8KLSAgICBpZiAoY2lyY3VpdC0+dXBhZGpjb3VudFtsc3AtPmxldmVsIC0gMV0gPT0gMCkKLSAgICAgIGdvdG8gZG9udHNlbmQ7Ci0gICAgLyogb25seSBzZW5kIGlmIGl0IG5lZWRzIHNlbmRpbmcgKi8KLSAgICBpZiAoKHRpbWUoTlVMTCkgLSBsc3AtPmxhc3Rfc2VudCkgPj0gCi0gICAgICAgICBjaXJjdWl0LT5hcmVhLT5sc3BfZ2VuX2ludGVydmFsW2xzcC0+bGV2ZWwtMV0pIHsKLQotICAgICAgaWYgKGlzaXMtPmRlYnVncyAmIERFQlVHX1VQREFURV9QQUNLRVRTKSB7Ci0gICAgICAgIHpsb2dfaW5mbyAoIklTSVMtVXBkICglcyk6IFNlbnQgTCVkIExTUCAlcywgc2VxIDB4JTA4eCwgY2tzdW0gMHglMDR4LCIKLSAgICAgICAgICAgICAgICAgICAiIGxpZmV0aW1lICV1cyBvbiAlcyIsCi0gICAgICAgICAgICAgICAgICAgY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsCi0JCSAgIGxzcC0+bGV2ZWwsIAotICAgICAgICAgICAgICAgICAgIHJhd2xzcGlkX3ByaW50IChsc3AtPmxzcF9oZWFkZXItPmxzcF9pZCksCi0gICAgICAgICAgICAgICAgICAgbnRvaGwobHNwLT5sc3BfaGVhZGVyLT5zZXFfbnVtKSwKLQkJICAgbnRvaHMobHNwLT5sc3BfaGVhZGVyLT5jaGVja3N1bSksCi0gICAgICAgICAgICAgICAgICAgbnRvaHMobHNwLT5sc3BfaGVhZGVyLT5yZW1fbGlmZXRpbWUpLCAKLSAgICAgICAgICAgICAgICAgICBjaXJjdWl0LT5pbnRlcmZhY2UtPm5hbWUpOwotICAgICAgfQotICAgICAgLyogY29weSBvdXIgbHNwIHRvIHRoZSBzZW5kIGJ1ZmZlciAqLwotICAgICAgY2lyY3VpdC0+c25kX3N0cmVhbS0+Z2V0cCA9IGxzcC0+cGR1LT5nZXRwOwotICAgICAgY2lyY3VpdC0+c25kX3N0cmVhbS0+cHV0cCA9IGxzcC0+cGR1LT5wdXRwOwotICAgICAgY2lyY3VpdC0+c25kX3N0cmVhbS0+ZW5kcCA9IGxzcC0+cGR1LT5lbmRwOwotICAgICAgbWVtY3B5IChjaXJjdWl0LT5zbmRfc3RyZWFtLT5kYXRhLCBsc3AtPnBkdS0+ZGF0YSwgbHNwLT5wZHUtPmVuZHApOwotCi0gICAgICByZXR2YWwgPSBjaXJjdWl0LT50eCAoY2lyY3VpdCwgbHNwLT5sZXZlbCk7CisgICAgICBsc3AgPSBnZXRkYXRhIChub2RlKTsKIAogICAgICAgLyoKLSAgICAgICAqIElmIHRoZSBzZW5kaW5nIHN1Y2NlZWRlZCwgd2UgY2FuIGRlbCB0aGUgbHNwIGZyb20gY2lyY3VpdHMgbHNwX3F1ZXVlCisgICAgICAgKiBEbyBub3Qgc2VuZCBpZiBsZXZlbHMgZG8gbm90IG1hdGNoCiAgICAgICAgKi8KLSAgICAgIGlmIChyZXR2YWwgPT0gSVNJU19PSykgewotICAgICAgICBsaXN0X2RlbGV0ZV9ub2RlIChjaXJjdWl0LT5sc3BfcXVldWUsIG5vZGUpOworICAgICAgaWYgKCEobHNwLT5sZXZlbCAmIGNpcmN1aXQtPmNpcmN1aXRfaXNfdHlwZSkpCisJZ290byBkb250c2VuZDsKIAotCS8qCi0JICogT24gYnJvYWRjYXN0IGNpcmN1aXRzIGFsc28gdGhlIFNSTWZsYWcgY2FuIGJlIGNsZWFyZWQKLQkgKi8KLQlpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QpCi0JICBJU0lTX0NMRUFSX0ZMQUcgKGxzcC0+U1JNZmxhZ3MsIGNpcmN1aXQpOworICAgICAgLyoKKyAgICAgICAqIERvIG5vdCBzZW5kIGlmIHdlIGRvIG5vdCBoYXZlIGFkamFjZW5jaWVzIGluIHN0YXRlIHVwIG9uIHRoZSBjaXJjdWl0CisgICAgICAgKi8KKyAgICAgIGlmIChjaXJjdWl0LT51cGFkamNvdW50W2xzcC0+bGV2ZWwgLSAxXSA9PSAwKQorCWdvdG8gZG9udHNlbmQ7CisgICAgICAvKiBvbmx5IHNlbmQgaWYgaXQgbmVlZHMgc2VuZGluZyAqLworICAgICAgaWYgKCh0aW1lIChOVUxMKSAtIGxzcC0+bGFzdF9zZW50KSA+PQorCSAgY2lyY3VpdC0+YXJlYS0+bHNwX2dlbl9pbnRlcnZhbFtsc3AtPmxldmVsIC0gMV0pCisJewogCi0JaWYgKGZsYWdzX2FueV9zZXQgKGxzcC0+U1JNZmxhZ3MpID09IDApIHsKKwkgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19VUERBVEVfUEFDS0VUUykKKwkgICAgeworCSAgICAgIHpsb2dfaW5mbworCQkoIklTSVMtVXBkICglcyk6IFNlbnQgTCVkIExTUCAlcywgc2VxIDB4JTA4eCwgY2tzdW0gMHglMDR4LCIKKwkJICIgbGlmZXRpbWUgJXVzIG9uICVzIiwgY2lyY3VpdC0+YXJlYS0+YXJlYV90YWcsIGxzcC0+bGV2ZWwsCisJCSByYXdsc3BpZF9wcmludCAobHNwLT5sc3BfaGVhZGVyLT5sc3BfaWQpLAorCQkgbnRvaGwgKGxzcC0+bHNwX2hlYWRlci0+c2VxX251bSksCisJCSBudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5jaGVja3N1bSksCisJCSBudG9ocyAobHNwLT5sc3BfaGVhZGVyLT5yZW1fbGlmZXRpbWUpLAorCQkgY2lyY3VpdC0+aW50ZXJmYWNlLT5uYW1lKTsKKwkgICAgfQorCSAgLyogY29weSBvdXIgbHNwIHRvIHRoZSBzZW5kIGJ1ZmZlciAqLworCSAgY2lyY3VpdC0+c25kX3N0cmVhbS0+Z2V0cCA9IGxzcC0+cGR1LT5nZXRwOworCSAgY2lyY3VpdC0+c25kX3N0cmVhbS0+cHV0cCA9IGxzcC0+cGR1LT5wdXRwOworCSAgY2lyY3VpdC0+c25kX3N0cmVhbS0+ZW5kcCA9IGxzcC0+cGR1LT5lbmRwOworCSAgbWVtY3B5IChjaXJjdWl0LT5zbmRfc3RyZWFtLT5kYXRhLCBsc3AtPnBkdS0+ZGF0YSwgbHNwLT5wZHUtPmVuZHApOworCisJICByZXR2YWwgPSBjaXJjdWl0LT50eCAoY2lyY3VpdCwgbHNwLT5sZXZlbCk7CisKIAkgIC8qCi0JICAgKiBuZWVkIHRvIHJlbWVtYmVyIHdoZW4gd2Ugd2VyZSBsYXN0IHNlbnQKKwkgICAqIElmIHRoZSBzZW5kaW5nIHN1Y2NlZWRlZCwgd2UgY2FuIGRlbCB0aGUgbHNwIGZyb20gY2lyY3VpdHMKKwkgICAqIGxzcF9xdWV1ZQogCSAgICovCi0JICBsc3AtPmxhc3Rfc2VudCA9IHRpbWUgKE5VTEwpOworCSAgaWYgKHJldHZhbCA9PSBJU0lTX09LKQorCSAgICB7CisJICAgICAgbGlzdF9kZWxldGVfbm9kZSAoY2lyY3VpdC0+bHNwX3F1ZXVlLCBub2RlKTsKKworCSAgICAgIC8qCisJICAgICAgICogT24gYnJvYWRjYXN0IGNpcmN1aXRzIGFsc28gdGhlIFNSTWZsYWcgY2FuIGJlIGNsZWFyZWQKKwkgICAgICAgKi8KKwkgICAgICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QpCisJCUlTSVNfQ0xFQVJfRkxBRyAobHNwLT5TUk1mbGFncywgY2lyY3VpdCk7CisKKwkgICAgICBpZiAoZmxhZ3NfYW55X3NldCAobHNwLT5TUk1mbGFncykgPT0gMCkKKwkJeworCQkgIC8qCisJCSAgICogbmVlZCB0byByZW1lbWJlciB3aGVuIHdlIHdlcmUgbGFzdCBzZW50CisJCSAgICovCisJCSAgbHNwLT5sYXN0X3NlbnQgPSB0aW1lIChOVUxMKTsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICB6bG9nX2luZm8gKCJzZW5kaW5nIG9mIGxldmVsICVkIGxpbmsgc3RhdGUgZmFpbGVkIiwgbHNwLT5sZXZlbCk7CisJICAgIH0KIAl9Ci0gICAgICB9IGVsc2UgewotICAgICAgICB6bG9nX2luZm8gKCJzZW5kaW5nIG9mIGxldmVsICVkIGxpbmsgc3RhdGUgZmFpbGVkIiwgbHNwLT5sZXZlbCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIG15IGJlbGllZiBpcyB0aGF0IGlmIGl0IHdhc24ndCBoaXMgdGltZSwgdGhlIGxzcCBjYW4gYmUgcmVtb3ZlZAotICAgICAgICogZnJvbSB0aGUgcXVldWUKLSAgICAgICAqLwotICAgIGRvbnRzZW5kOgotICAgICAgbGlzdF9kZWxldGVfbm9kZSAoY2lyY3VpdC0+bHNwX3F1ZXVlLCBub2RlKTsKLSAgICB9CisgICAgICBlbHNlCisJeworCSAgLyogbXkgYmVsaWVmIGlzIHRoYXQgaWYgaXQgd2Fzbid0IGhpcyB0aW1lLCB0aGUgbHNwIGNhbiBiZSByZW1vdmVkCisJICAgKiBmcm9tIHRoZSBxdWV1ZQorCSAgICovCisJZG9udHNlbmQ6CisJICBsaXN0X2RlbGV0ZV9ub2RlIChjaXJjdWl0LT5sc3BfcXVldWUsIG5vZGUpOworCX0KICNpZiAwCi0gICAgLyoKLSAgICAgKiBJZiB0aGVyZSBhcmUgc3RpbGwgTFNQcyBzZW5kIG5leHQgb25lIGFmdGVyIGxzcC1pbnRlcnZhbCAoMzMgbXNlY3MpCi0gICAgICovCi0gICAgaWYgKGxpc3Rjb3VudCAoY2lyY3VpdC0+bHNwX3F1ZXVlKSA+IDApCi0gICAgICB0aHJlYWRfYWRkX3RpbWVyIChtYXN0ZXIsIHNlbmRfbHNwLCBjaXJjdWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgIC8qCisgICAgICAgKiBJZiB0aGVyZSBhcmUgc3RpbGwgTFNQcyBzZW5kIG5leHQgb25lIGFmdGVyIGxzcC1pbnRlcnZhbCAoMzMgbXNlY3MpCisgICAgICAgKi8KKyAgICAgIGlmIChsaXN0Y291bnQgKGNpcmN1aXQtPmxzcF9xdWV1ZSkgPiAwKQorCXRocmVhZF9hZGRfdGltZXIgKG1hc3Rlciwgc2VuZF9sc3AsIGNpcmN1aXQsIDEpOwogI2VuZGlmCi0gIH0KKyAgICB9CiAKICAgcmV0dXJuIHJldHZhbDsKLX0gCit9CiAKIGludAotYWNrX2xzcCAoc3RydWN0IGlzaXNfbGlua19zdGF0ZV9oZHIgKmhkciwgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgCi0gICAgICAgICBpbnQgbGV2ZWwpCithY2tfbHNwIChzdHJ1Y3QgaXNpc19saW5rX3N0YXRlX2hkciAqaGRyLCBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LAorCSBpbnQgbGV2ZWwpCiB7CiAgIHVuc2lnbmVkIGxvbmcgbGVucDsKICAgaW50IHJldHZhbDsKQEAgLTIzNDksMzIgKzI1NzAsMzIgQEAKICAgc3RydWN0IGlzaXNfZml4ZWRfaGRyIGZpeGVkX2hkcjsKIAogICBpZiAoIWNpcmN1aXQtPnNuZF9zdHJlYW0pCi0gICAgY2lyY3VpdC0+c25kX3N0cmVhbSA9IHN0cmVhbV9uZXcgKElTT19NVFUoY2lyY3VpdCkpOworICAgIGNpcmN1aXQtPnNuZF9zdHJlYW0gPSBzdHJlYW1fbmV3IChJU09fTVRVIChjaXJjdWl0KSk7CiAgIGVsc2UKICAgICBzdHJlYW1fcmVzZXQgKGNpcmN1aXQtPnNuZF9zdHJlYW0pOwogCiAvLyAgZmlsbF9sbGNfaGRyIChzdHJlYW0pOwogICBpZiAobGV2ZWwgPT0gMSkKLSAgICBmaWxsX2ZpeGVkX2hkcl9hbmRzdHJlYW0gKCZmaXhlZF9oZHIsIEwxX1BBUlRJQUxfU0VRX05VTSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXJjdWl0LT5zbmRfc3RyZWFtKTsKKyAgICBmaWxsX2ZpeGVkX2hkcl9hbmRzdHJlYW0gKCZmaXhlZF9oZHIsIEwxX1BBUlRJQUxfU0VRX05VTSwKKwkJCSAgICAgIGNpcmN1aXQtPnNuZF9zdHJlYW0pOwogICBlbHNlCi0gICAgZmlsbF9maXhlZF9oZHJfYW5kc3RyZWFtICgmZml4ZWRfaGRyLCBMMl9QQVJUSUFMX1NFUV9OVU0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lyY3VpdC0+c25kX3N0cmVhbSk7CisgICAgZmlsbF9maXhlZF9oZHJfYW5kc3RyZWFtICgmZml4ZWRfaGRyLCBMMl9QQVJUSUFMX1NFUV9OVU0sCisJCQkgICAgICBjaXJjdWl0LT5zbmRfc3RyZWFtKTsKIAogCiAgIGxlbnAgPSBzdHJlYW1fZ2V0X3B1dHAgKGNpcmN1aXQtPnNuZF9zdHJlYW0pOwotICBzdHJlYW1fcHV0dyAoY2lyY3VpdC0+c25kX3N0cmVhbSwgMCk7IC8qIFBEVSBsZW5ndGggICovCi0gIHN0cmVhbV9wdXQgIChjaXJjdWl0LT5zbmRfc3RyZWFtLCBpc2lzLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOKTsKKyAgc3RyZWFtX3B1dHcgKGNpcmN1aXQtPnNuZF9zdHJlYW0sIDApOwkvKiBQRFUgbGVuZ3RoICAqLworICBzdHJlYW1fcHV0IChjaXJjdWl0LT5zbmRfc3RyZWFtLCBpc2lzLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOKTsKICAgc3RyZWFtX3B1dGMgKGNpcmN1aXQtPnNuZF9zdHJlYW0sIGNpcmN1aXQtPmlkeCk7Ci0gIHN0cmVhbV9wdXRjIChjaXJjdWl0LT5zbmRfc3RyZWFtLCA5KTsgLyogY29kZSAqLwotICBzdHJlYW1fcHV0YyAoY2lyY3VpdC0+c25kX3N0cmVhbSwgMTYpOyAvKiBsZW4gKi8KKyAgc3RyZWFtX3B1dGMgKGNpcmN1aXQtPnNuZF9zdHJlYW0sIDkpOwkvKiBjb2RlICovCisgIHN0cmVhbV9wdXRjIChjaXJjdWl0LT5zbmRfc3RyZWFtLCAxNik7CS8qIGxlbiAqLwogCi0gIHN0cmVhbV9wdXR3IChjaXJjdWl0LT5zbmRfc3RyZWFtLCBudG9ocyhoZHItPnJlbV9saWZldGltZSkpOwotICBzdHJlYW1fcHV0ICAoY2lyY3VpdC0+c25kX3N0cmVhbSwgaGRyLT5sc3BfaWQsIElTSVNfU1lTX0lEX0xFTiArIDIpOwotICBzdHJlYW1fcHV0bCAoY2lyY3VpdC0+c25kX3N0cmVhbSwgbnRvaGwoaGRyLT5zZXFfbnVtKSk7Ci0gIHN0cmVhbV9wdXR3IChjaXJjdWl0LT5zbmRfc3RyZWFtLCBudG9ocyhoZHItPmNoZWNrc3VtKSk7CisgIHN0cmVhbV9wdXR3IChjaXJjdWl0LT5zbmRfc3RyZWFtLCBudG9ocyAoaGRyLT5yZW1fbGlmZXRpbWUpKTsKKyAgc3RyZWFtX3B1dCAoY2lyY3VpdC0+c25kX3N0cmVhbSwgaGRyLT5sc3BfaWQsIElTSVNfU1lTX0lEX0xFTiArIDIpOworICBzdHJlYW1fcHV0bCAoY2lyY3VpdC0+c25kX3N0cmVhbSwgbnRvaGwgKGhkci0+c2VxX251bSkpOworICBzdHJlYW1fcHV0dyAoY2lyY3VpdC0+c25kX3N0cmVhbSwgbnRvaHMgKGhkci0+Y2hlY2tzdW0pKTsKIAotICBsZW5ndGggPSAodV9pbnQxNl90KXN0cmVhbV9nZXRfcHV0cCAoY2lyY3VpdC0+c25kX3N0cmVhbSk7CisgIGxlbmd0aCA9ICh1X2ludDE2X3QpIHN0cmVhbV9nZXRfcHV0cCAoY2lyY3VpdC0+c25kX3N0cmVhbSk7CiAgIC8qIFVwZGF0ZSBQRFUgbGVuZ3RoICovCiAgIHN0cmVhbV9wdXR3X2F0IChjaXJjdWl0LT5zbmRfc3RyZWFtLCBsZW5wLCBsZW5ndGgpOwogCkBAIC0yMzg4LDY3ICsyNjA5LDg2IEBACiAgKiBJU0ggUERVIFByb2Nlc3NpbmcgCiAgKi8KIAotCiAgIC8qCiAgICAqIExldCdzIGZpcnN0IGNoZWNrIGlmIHRoZSBsb2NhbCBhbmQgcmVtb3RlIHN5c3RlbSBoYXZlIGFueSBjb21tb24gYXJlYQogICAgKiBhZGRyZXNzZXMgCiAgICAqLwotICBpZiAoYXJlYV9tYXRjaCh0bHZzLmFyZWFfYWRkcnMsIGlzaXMtPm1hbl9hcmVhX2FkZHJzKSA9PSAwKSB7Ci0gICAgaWYgKGNpcmN1aXQtPmNpcmN1aXRfdCA9PSBJU19MRVZFTF8yKSB7Ci0gICAgICAvKiBkbyBhcyBpbiB0YWJsZSA4IChwLiA0MCkgKi8KLSAgICAgIHN3aXRjaCAoY2lyY3VpdF90eXBlKSB7Ci0gICAgICBjYXNlIElTX0xFVkVMXzE6Ci0JaWYgKGFkai0+YWRqX3N0YXRlICE9IElTSVNfQURKX1VQKSB7Ci0JICAvKiBSZWplY3QgKi8KLQkgIHpsb2dfd2FybigiYXJlYU1pc21hdGNoIik7Ci0JICByZXR2YWwgPSBJU0lTX1dBUk5JTkc7Ci0JfSBlbHNlIGlmIChhZGotPmFkal91c2FnZSA9PSBJU0lTX0FESl9MRVZFTDEpIHsKLQkgIGlzaXNfYWRqX3N0YXRlX2NoYW5nZSAoYWRqLCBJU0lTX0FESl9ET1dOLCAiQXJlYSBNaXNtYXRjaCIsCi0JCQkJIGNpcmN1aXQtPmFkamRiKTsKLQl9IGVsc2UgaWYgKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMUFORDIgfHwgCi0JCSAgIGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMikgewotCSAgaXNpc19hZGpfc3RhdGVfY2hhbmdlIChhZGosIElTSVNfQURKX0RPV04sICJXcm9uZyBTeXN0ZW0iLAotCQkJCSBjaXJjdWl0LT5hZGpkYik7Ci0JfQotCWJyZWFrOwotICAgICAgY2FzZSBJU19MRVZFTF8yOgotCWlmIChhZGotPmFkal9zdGF0ZSAhPSBJU0lTX0FESl9VUCkgewotCSAgaXNpc19hZGpfc3RhdGVfY2hhbmdlIChhZGosIElTSVNfQURKX1VQLCBOVUxMLCBjaXJjdWl0LT5hZGpkYik7Ci0JICBhZGotPmFkal91c2FnZSA9IElTSVNfQURKX0xFVkVMMjsKLQl9IGVsc2UgaWYgKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMSB8fCAKLQkgICAgICAgICAgIGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMUFORDIpIHsgCi0JICBpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfRE9XTiwgIldyb25nIFN5c3RlbSIsCi0JCQkJIGNpcmN1aXQtPmFkamRiKTsKLQl9IGVsc2UgaWYgKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMikgewotCSAgICA7IC8qIEFjY2VwdCAqLwotCX0KLQlicmVhazsKLSAgICAgIGNhc2UgSVNfTEVWRUxfMV9BTkRfMjoKLQlpZiAoYWRqLT5hZGpfc3RhdGUgIT0gSVNJU19BREpfVVApIHsKLQkgIGlzaXNfYWRqX3N0YXRlX2NoYW5nZSAoYWRqLCBJU0lTX0FESl9VUCwgTlVMTCwgY2lyY3VpdC0+YWRqZGIpOwotCSAgYWRqLT5hZGpfdXNhZ2UgPSBJU0lTX0FESl9MRVZFTDI7Ci0JfSBlbHNlIGlmIChhZGotPmFkal91c2FnZSA9PSBJU0lTX0FESl9MRVZFTDEpIHsKLQkgIGlzaXNfYWRqX3N0YXRlX2NoYW5nZSAoYWRqLCBJU0lTX0FESl9ET1dOLCAiV3JvbmcgU3lzdGVtIiwKLQkJCQkgY2lyY3VpdC0+YWRqZGIpOwotCX0gZWxzZSBpZiAoYWRqLT5hZGpfdXNhZ2UgPT0gSVNJU19BREpfTEVWRUwxQU5EMikgeyAKLQkgIGlzaXNfYWRqX3N0YXRlX2NoYW5nZSAoYWRqLCBJU0lTX0FESl9ET1dOLCAiQXJlYSBNaXNtYXRjaCIsCi0JCQkJIGNpcmN1aXQtPmFkamRiKTsKLQl9IGVsc2UgaWYgKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMikgewotCSAgICA7IC8qIEFjY2VwdCAqLwotCX0KLQlicmVhazsKK2lmIChhcmVhX21hdGNoICh0bHZzLmFyZWFfYWRkcnMsIGlzaXMtPm1hbl9hcmVhX2FkZHJzKSA9PSAwKQorICB7CisgICAgaWYgKGNpcmN1aXQtPmNpcmN1aXRfdCA9PSBJU19MRVZFTF8yKQorICAgICAgeworCS8qIGRvIGFzIGluIHRhYmxlIDggKHAuIDQwKSAqLworCXN3aXRjaCAoY2lyY3VpdF90eXBlKQorCSAgeworCSAgY2FzZSBJU19MRVZFTF8xOgorCSAgICBpZiAoYWRqLT5hZGpfc3RhdGUgIT0gSVNJU19BREpfVVApCisJICAgICAgeworCQkvKiBSZWplY3QgKi8KKwkJemxvZ193YXJuICgiYXJlYU1pc21hdGNoIik7CisJCXJldHZhbCA9IElTSVNfV0FSTklORzsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMSkKKwkgICAgICB7CisJCWlzaXNfYWRqX3N0YXRlX2NoYW5nZSAoYWRqLCBJU0lTX0FESl9ET1dOLCAiQXJlYSBNaXNtYXRjaCIsCisJCQkJICAgICAgIGNpcmN1aXQtPmFkamRiKTsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMUFORDIgfHwKKwkJICAgICBhZGotPmFkal91c2FnZSA9PSBJU0lTX0FESl9MRVZFTDIpCisJICAgICAgeworCQlpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfRE9XTiwgIldyb25nIFN5c3RlbSIsCisJCQkJICAgICAgIGNpcmN1aXQtPmFkamRiKTsKKwkgICAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSBJU19MRVZFTF8yOgorCSAgICBpZiAoYWRqLT5hZGpfc3RhdGUgIT0gSVNJU19BREpfVVApCisJICAgICAgeworCQlpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfVVAsIE5VTEwsCisJCQkJICAgICAgIGNpcmN1aXQtPmFkamRiKTsKKwkJYWRqLT5hZGpfdXNhZ2UgPSBJU0lTX0FESl9MRVZFTDI7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChhZGotPmFkal91c2FnZSA9PSBJU0lTX0FESl9MRVZFTDEgfHwKKwkJICAgICBhZGotPmFkal91c2FnZSA9PSBJU0lTX0FESl9MRVZFTDFBTkQyKQorCSAgICAgIHsKKwkJaXNpc19hZGpfc3RhdGVfY2hhbmdlIChhZGosIElTSVNfQURKX0RPV04sICJXcm9uZyBTeXN0ZW0iLAorCQkJCSAgICAgICBjaXJjdWl0LT5hZGpkYik7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChhZGotPmFkal91c2FnZSA9PSBJU0lTX0FESl9MRVZFTDIpCisJICAgICAgeworCQk7CQkvKiBBY2NlcHQgKi8KKwkgICAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSBJU19MRVZFTF8xX0FORF8yOgorCSAgICBpZiAoYWRqLT5hZGpfc3RhdGUgIT0gSVNJU19BREpfVVApCisJICAgICAgeworCQlpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfVVAsIE5VTEwsCisJCQkJICAgICAgIGNpcmN1aXQtPmFkamRiKTsKKwkJYWRqLT5hZGpfdXNhZ2UgPSBJU0lTX0FESl9MRVZFTDI7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChhZGotPmFkal91c2FnZSA9PSBJU0lTX0FESl9MRVZFTDEpCisJICAgICAgeworCQlpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfRE9XTiwgIldyb25nIFN5c3RlbSIsCisJCQkJICAgICAgIGNpcmN1aXQtPmFkamRiKTsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKGFkai0+YWRqX3VzYWdlID09IElTSVNfQURKX0xFVkVMMUFORDIpCisJICAgICAgeworCQlpc2lzX2Fkal9zdGF0ZV9jaGFuZ2UgKGFkaiwgSVNJU19BREpfRE9XTiwgIkFyZWEgTWlzbWF0Y2giLAorCQkJCSAgICAgICBjaXJjdWl0LT5hZGpkYik7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChhZGotPmFkal91c2FnZSA9PSBJU0lTX0FESl9MRVZFTDIpCisJICAgICAgeworCQk7CQkvKiBBY2NlcHQgKi8KKwkgICAgICB9CisJICAgIGJyZWFrOworCSAgfQorCWdvdG8gbWlzbWF0Y2g7CiAgICAgICB9Ci0gICAgICBnb3RvIG1pc21hdGNoOwotICAgIH0gZWxzZSB7Ci0gICAgICBpc2lzX2RlbGV0ZV9hZGogKGFkaiwgY2lyY3VpdC0+YWRqZGIpOwotICAgICAgemxvZ193YXJuKCJhcmVhTWlzbWF0Y2giKTsKLSAgICAgIHJldHVybiBJU0lTX1dBUk5JTkc7Ci0gICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwlpc2lzX2RlbGV0ZV9hZGogKGFkaiwgY2lyY3VpdC0+YWRqZGIpOworCXpsb2dfd2FybiAoImFyZWFNaXNtYXRjaCIpOworCXJldHVybiBJU0lTX1dBUk5JTkc7CisgICAgICB9CiAgIH0KIAogbWlzbWF0Y2g6CiAjZW5kaWYKLQotCi0KLQpkaWZmIC0tZ2l0IGEvaXNpc2QvaXNpc19wZHUuaCBiL2lzaXNkL2lzaXNfcGR1LmgKaW5kZXggOTk0MDM2OC4uMjljNzYyMSAxMDA2NDQKLS0tIGEvaXNpc2QvaXNpc19wZHUuaAorKysgYi9pc2lzZC9pc2lzX3BkdS5oCkBAIC01NCw3ICs1NCw3IEBACiAgIHVfY2hhciBwZHVfdHlwZTsKICAgdV9pbnQxNl90IGhvbGR0aW1lOwogICB1X2ludDE2X3QgY2hlY2tzdW07Ci19ICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiAjZGVmaW5lIEVTSVNfRklYRURfSERSX0xFTiAgIDkKIApAQCAtODEsNyArODEsNyBAQAogICogICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCiAgKi8KIAotc3RydWN0IGlzaXNfZml4ZWRfaGRyIAorc3RydWN0IGlzaXNfZml4ZWRfaGRyCiB7CiAgIHVfY2hhciBpZHJwOwogICB1X2NoYXIgbGVuZ3RoOwpAQCAtMTE3LDE0ICsxMTcsMTUgQEAKICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBMQU4gSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlkX2xlbiArIDEKICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCiAgKi8KLXN0cnVjdCBpc2lzX2xhbl9oZWxsb19oZHIgewotICB1X2NoYXIgY2lyY3VpdF90OyAgCi0gIHVfY2hhciBzb3VyY2VfaWRbSVNJU19TWVNfSURfTEVOXTsgICAKLSAgdV9pbnQxNl90IGhvbGRfdGltZTsgICAgIAotICB1X2ludDE2X3QgcGR1X2xlbjsgICAgICAKLSAgdV9jaGFyIHByaW87ICAgICAgICAgCi0gIHVfY2hhciBsYW5faWRbSVNJU19TWVNfSURfTEVOICsgMV07ICAgICAgCi19ICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK3N0cnVjdCBpc2lzX2xhbl9oZWxsb19oZHIKK3sKKyAgdV9jaGFyIGNpcmN1aXRfdDsKKyAgdV9jaGFyIHNvdXJjZV9pZFtJU0lTX1NZU19JRF9MRU5dOworICB1X2ludDE2X3QgaG9sZF90aW1lOworICB1X2ludDE2X3QgcGR1X2xlbjsKKyAgdV9jaGFyIHByaW87CisgIHVfY2hhciBsYW5faWRbSVNJU19TWVNfSURfTEVOICsgMV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKICNkZWZpbmUgSVNJU19MQU5IRUxMT19IRFJMRU4gIDE5CiAKICNkZWZpbmUgUDJQX0hFTExPICAgICAgICAgICAgMTcKQEAgLTE0MiwxMyArMTQzLDE0IEBACiAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWwgQ2lyY3VpdCBJRCAgICAgICAgICAgICAgICAgICAgICAgfCAxCiAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwogICovCi1zdHJ1Y3QgaXNpc19wMnBfaGVsbG9faGRyIHsKLSAgdV9jaGFyIGNpcmN1aXRfdDsgIAotICB1X2NoYXIgc291cmNlX2lkW0lTSVNfU1lTX0lEX0xFTl07ICAgCi0gIHVfaW50MTZfdCBob2xkX3RpbWU7ICAgICAKLSAgdV9pbnQxNl90IHBkdV9sZW47ICAgICAgCitzdHJ1Y3QgaXNpc19wMnBfaGVsbG9faGRyCit7CisgIHVfY2hhciBjaXJjdWl0X3Q7CisgIHVfY2hhciBzb3VyY2VfaWRbSVNJU19TWVNfSURfTEVOXTsKKyAgdV9pbnQxNl90IGhvbGRfdGltZTsKKyAgdV9pbnQxNl90IHBkdV9sZW47CiAgIHVfY2hhciBsb2NhbF9pZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKICNkZWZpbmUgSVNJU19QMlBIRUxMT19IRFJMRU4gMTIKIAogI2RlZmluZSBMMV9MSU5LX1NUQVRFICAgICAgICAxOApAQCAtMTY5LDE0ICsxNzEsMTUgQEAKICAqIHwgICBQICAgfCAgICAgICAgICAgICAgQVRUICAgICAgICAgICAgICB8TFNQREJPTHwgICAgSVNUWVBFICAgICB8CiAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwogICovCi1zdHJ1Y3QgaXNpc19saW5rX3N0YXRlX2hkciB7Ci0gIHVfaW50MTZfdCBwZHVfbGVuOyAgICAgIAorc3RydWN0IGlzaXNfbGlua19zdGF0ZV9oZHIKK3sKKyAgdV9pbnQxNl90IHBkdV9sZW47CiAgIHVfaW50MTZfdCByZW1fbGlmZXRpbWU7Ci0gIHVfY2hhciAgbHNwX2lkW0lTSVNfU1lTX0lEX0xFTiArIDJdOworICB1X2NoYXIgbHNwX2lkW0lTSVNfU1lTX0lEX0xFTiArIDJdOwogICB1X2ludDMyX3Qgc2VxX251bTsKICAgdV9pbnQxNl90IGNoZWNrc3VtOwotICB1X2ludDhfdCAgbHNwX2JpdHM7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOyAKKyAgdV9pbnQ4X3QgbHNwX2JpdHM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKICNkZWZpbmUgSVNJU19MU1BfSERSX0xFTiAxOQogCiAjZGVmaW5lIEwxX0NPTVBMRVRFX1NFUV9OVU0gIDI0CkBAIC0xOTMsMTEgKzE5NiwxMiBAQAogICogKyAgICAgICAgICAgICAgICAgICAgICAgIEVuZCBMU1AgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaWRfbGVuICsgMgogICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKICAqLwotc3RydWN0IGlzaXNfY29tcGxldGVfc2VxbnVtX2hkciB7CitzdHJ1Y3QgaXNpc19jb21wbGV0ZV9zZXFudW1faGRyCit7CiAgIHVfaW50MTZfdCBwZHVfbGVuOwotICB1X2NoYXIgICAgc291cmNlX2lkW0lTSVNfU1lTX0lEX0xFTiArIDFdOwotICB1X2NoYXIgICAgc3RhcnRfbHNwX2lkW0lTSVNfU1lTX0lEX0xFTiArIDJdOwotICB1X2NoYXIgICAgc3RvcF9sc3BfaWRbSVNJU19TWVNfSURfTEVOICsgMl07CisgIHVfY2hhciBzb3VyY2VfaWRbSVNJU19TWVNfSURfTEVOICsgMV07CisgIHVfY2hhciBzdGFydF9sc3BfaWRbSVNJU19TWVNfSURfTEVOICsgMl07CisgIHVfY2hhciBzdG9wX2xzcF9pZFtJU0lTX1NZU19JRF9MRU4gKyAyXTsKIH07CiAjZGVmaW5lIElTSVNfQ1NOUF9IRFJMRU4gMjUKIApAQCAtMjExLDkgKzIxNSwxMCBAQAogICogKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZSBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaWRfbGVuICsgMQogICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAqLwotc3RydWN0IGlzaXNfcGFydGlhbF9zZXFudW1faGRyIHsKK3N0cnVjdCBpc2lzX3BhcnRpYWxfc2VxbnVtX2hkcgorewogICB1X2ludDE2X3QgcGR1X2xlbjsKLSAgdV9jaGFyICAgIHNvdXJjZV9pZFtJU0lTX1NZU19JRF9MRU4gKyAxXTsKKyAgdV9jaGFyIHNvdXJjZV9pZFtJU0lTX1NZU19JRF9MRU4gKyAxXTsKIH07CiAjZGVmaW5lIElTSVNfUFNOUF9IRFJMRU4gOQogCkBAIC0yMzEsMjcgKzIzNiwyMiBAQAogLyoKICAqIFNlbmRpbmcgZnVuY3Rpb25zCiAgKi8KLWludCAgc2VuZF9sYW5fbDFfaGVsbG8gKHN0cnVjdCB0aHJlYWQgKnRocmVhZCk7Ci1pbnQgIHNlbmRfbGFuX2wyX2hlbGxvIChzdHJ1Y3QgdGhyZWFkICp0aHJlYWQpOwotaW50ICBzZW5kX3AycF9oZWxsbyAgICAoc3RydWN0IHRocmVhZCAqdGhyZWFkKTsKLWludCAgc2VuZF9jc25wICAgICAgICAgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsIGludCBsZXZlbCk7Ci1pbnQgIHNlbmRfbDFfY3NucCAgICAgIChzdHJ1Y3QgdGhyZWFkICp0aHJlYWQpOwotaW50ICBzZW5kX2wyX2NzbnAgICAgICAoc3RydWN0IHRocmVhZCAqdGhyZWFkKTsKLWludCAgc2VuZF9sMV9wc25wICAgICAgKHN0cnVjdCB0aHJlYWQgKnRocmVhZCk7Ci1pbnQgIHNlbmRfbDJfcHNucCAgICAgIChzdHJ1Y3QgdGhyZWFkICp0aHJlYWQpOwotaW50ICBzZW5kX2xzcCAgICAgICAgICAoc3RydWN0IHRocmVhZCAqdGhyZWFkKTsKLWludCAgYWNrX2xzcCAgICAgICAgICAgKHN0cnVjdCBpc2lzX2xpbmtfc3RhdGVfaGRyICpoZHIsIAotCQkJc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgaW50IGxldmVsKTsKLXZvaWQgZmlsbF9maXhlZF9oZHIgICAgKHN0cnVjdCBpc2lzX2ZpeGVkX2hkciAqaGRyLCB1X2NoYXIgcGR1X3R5cGUpOwotaW50ICBzZW5kX2hlbGxvICAgICAgICAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgaW50IGxldmVsKTsKK2ludCBzZW5kX2xhbl9sMV9oZWxsbyAoc3RydWN0IHRocmVhZCAqdGhyZWFkKTsKK2ludCBzZW5kX2xhbl9sMl9oZWxsbyAoc3RydWN0IHRocmVhZCAqdGhyZWFkKTsKK2ludCBzZW5kX3AycF9oZWxsbyAoc3RydWN0IHRocmVhZCAqdGhyZWFkKTsKK2ludCBzZW5kX2NzbnAgKHN0cnVjdCBpc2lzX2NpcmN1aXQgKmNpcmN1aXQsIGludCBsZXZlbCk7CitpbnQgc2VuZF9sMV9jc25wIChzdHJ1Y3QgdGhyZWFkICp0aHJlYWQpOworaW50IHNlbmRfbDJfY3NucCAoc3RydWN0IHRocmVhZCAqdGhyZWFkKTsKK2ludCBzZW5kX2wxX3BzbnAgKHN0cnVjdCB0aHJlYWQgKnRocmVhZCk7CitpbnQgc2VuZF9sMl9wc25wIChzdHJ1Y3QgdGhyZWFkICp0aHJlYWQpOworaW50IHNlbmRfbHNwIChzdHJ1Y3QgdGhyZWFkICp0aHJlYWQpOworaW50IGFja19sc3AgKHN0cnVjdCBpc2lzX2xpbmtfc3RhdGVfaGRyICpoZHIsCisJICAgICBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0LCBpbnQgbGV2ZWwpOwordm9pZCBmaWxsX2ZpeGVkX2hkciAoc3RydWN0IGlzaXNfZml4ZWRfaGRyICpoZHIsIHVfY2hhciBwZHVfdHlwZSk7CitpbnQgc2VuZF9oZWxsbyAoc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdCwgaW50IGxldmVsKTsKIAogCi1pbnQgYXV0aGVudGljYXRpb25fY2hlY2sgKHN0cnVjdCBpc2lzX3Bhc3N3ZCAqb25lLCAKK2ludCBhdXRoZW50aWNhdGlvbl9jaGVjayAoc3RydWN0IGlzaXNfcGFzc3dkICpvbmUsCiAJCQkgIHN0cnVjdCBpc2lzX3Bhc3N3ZCAqdGhlb3RoZXIpOwogCiAjZW5kaWYgLyogX1pFQlJBX0lTSVNfUERVX0ggKi8KLQotCi0KLQotCmRpZmYgLS1naXQgYS9pc2lzZC9pc2lzX3JvdXRlLmMgYi9pc2lzZC9pc2lzX3JvdXRlLmMKaW5kZXggYjg4OWQzYi4uOTA4MDg2OCAxMDA2NDQKLS0tIGEvaXNpc2QvaXNpc19yb3V0ZS5jCisrKyBiL2lzaXNkL2lzaXNfcm91dGUuYwpAQCAtNTUsMjcgKzU1LDI4IEBACiAKIHN0cnVjdCBpc2lzX25leHRob3AgKgogaXNpc19uZXh0aG9wX2NyZWF0ZSAoc3RydWN0IGluX2FkZHIgKmlwLCB1bnNpZ25lZCBpbnQgaWZpbmRleCkKLSAgICAgICAgICAgICAgICAgICAgIAogewogICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgIHN0cnVjdCBpc2lzX25leHRob3AgKm5leHRob3A7Ci0gIAotICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoaXNpcy0+bmV4dGhvcHMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICBuZXh0aG9wID0gZ2V0ZGF0YSAobm9kZSk7Ci0gICAgaWYgKG5leHRob3AtPmlmaW5kZXggIT0gaWZpbmRleCkKLSAgICAgIGNvbnRpbnVlOwotICAgIGlmIChpcCAmJiBtZW1jbXAgKCZuZXh0aG9wLT5pcCwgaXAsIHNpemVvZiAoc3RydWN0IGluX2FkZHIpKSAhPSAwKQotICAgICAgY29udGludWU7IAogCi0gICAgbmV4dGhvcC0+bG9jaysrOwotICAgIHJldHVybiBuZXh0aG9wOwotICB9Ci0gIAorICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoaXNpcy0+bmV4dGhvcHMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisgICAgeworICAgICAgbmV4dGhvcCA9IGdldGRhdGEgKG5vZGUpOworICAgICAgaWYgKG5leHRob3AtPmlmaW5kZXggIT0gaWZpbmRleCkKKwljb250aW51ZTsKKyAgICAgIGlmIChpcCAmJiBtZW1jbXAgKCZuZXh0aG9wLT5pcCwgaXAsIHNpemVvZiAoc3RydWN0IGluX2FkZHIpKSAhPSAwKQorCWNvbnRpbnVlOworCisgICAgICBuZXh0aG9wLT5sb2NrKys7CisgICAgICByZXR1cm4gbmV4dGhvcDsKKyAgICB9CisKICAgbmV4dGhvcCA9IFhNQUxMT0MgKE1UWVBFX0lTSVNfTkVYVEhPUCwgc2l6ZW9mIChzdHJ1Y3QgaXNpc19uZXh0aG9wKSk7Ci0gIGlmICghbmV4dGhvcCkgewotICAgIHpsb2dfZXJyICgiSVNJUy1SdGU6IGlzaXNfbmV4dGhvcF9jcmVhdGU6IG91dCBvZiBtZW1vcnkhIik7Ci0gIH0KLSAgCisgIGlmICghbmV4dGhvcCkKKyAgICB7CisgICAgICB6bG9nX2VyciAoIklTSVMtUnRlOiBpc2lzX25leHRob3BfY3JlYXRlOiBvdXQgb2YgbWVtb3J5ISIpOworICAgIH0KKwogICBtZW1zZXQgKG5leHRob3AsIDAsIHNpemVvZiAoc3RydWN0IGlzaXNfbmV4dGhvcCkpOwogICBuZXh0aG9wLT5pZmluZGV4ID0gaWZpbmRleDsKICAgbWVtY3B5ICgmbmV4dGhvcC0+aXAsIGlwLCBzaXplb2YgKHN0cnVjdCBpbl9hZGRyKSk7CkBAIC04NSwzMiArODYsMzMgQEAKICAgcmV0dXJuIG5leHRob3A7CiB9CiAKLQogdm9pZAogaXNpc19uZXh0aG9wX2RlbGV0ZSAoc3RydWN0IGlzaXNfbmV4dGhvcCAqbmV4dGhvcCkKIHsKICAgbmV4dGhvcC0+bG9jay0tOwotICBpZiAobmV4dGhvcC0+bG9jayA9PSAwKSB7Ci0gICAgbGlzdG5vZGVfZGVsZXRlIChpc2lzLT5uZXh0aG9wcywgbmV4dGhvcCk7Ci0gICAgWEZSRUUgKE1UWVBFX0lTSVNfTkVYVEhPUCwgbmV4dGhvcCk7Ci0gIH0KLSAgICAKKyAgaWYgKG5leHRob3AtPmxvY2sgPT0gMCkKKyAgICB7CisgICAgICBsaXN0bm9kZV9kZWxldGUgKGlzaXMtPm5leHRob3BzLCBuZXh0aG9wKTsKKyAgICAgIFhGUkVFIChNVFlQRV9JU0lTX05FWFRIT1AsIG5leHRob3ApOworICAgIH0KKwogICByZXR1cm47CiB9CiAKIGludAotbmV4dGhvcGxvb2t1cCAoc3RydWN0IGxpc3QgKm5leHRob3BzLCBzdHJ1Y3QgaW5fYWRkciAqaXAsIAotICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlmaW5kZXgpCituZXh0aG9wbG9va3VwIChzdHJ1Y3QgbGlzdCAqbmV4dGhvcHMsIHN0cnVjdCBpbl9hZGRyICppcCwKKwkgICAgICAgdW5zaWduZWQgaW50IGlmaW5kZXgpCiB7CiAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKICAgc3RydWN0IGlzaXNfbmV4dGhvcCAqbmg7CiAKLSAgZm9yIChub2RlID0gbGlzdGhlYWQgKG5leHRob3BzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7Ci0gICAgbmggPSBnZXRkYXRhIChub2RlKTsKLSAgICBpZiAoIShtZW1jbXAgKGlwLCAmbmgtPmlwLCBzaXplb2YgKHN0cnVjdCBpbl9hZGRyKSkpICYmIAotICAgICAgICBpZmluZGV4ID09IG5oLT5pZmluZGV4KQotICAgICAgcmV0dXJuIDE7Ci0gIH0KKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKG5leHRob3BzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorICAgIHsKKyAgICAgIG5oID0gZ2V0ZGF0YSAobm9kZSk7CisgICAgICBpZiAoIShtZW1jbXAgKGlwLCAmbmgtPmlwLCBzaXplb2YgKHN0cnVjdCBpbl9hZGRyKSkpICYmCisJICBpZmluZGV4ID09IG5oLT5pZmluZGV4KQorCXJldHVybiAxOworICAgIH0KIAogICByZXR1cm4gMDsKIH0KQEAgLTExOSw5ICsxMjEsOSBAQAogbmV4dGhvcF9wcmludCAoc3RydWN0IGlzaXNfbmV4dGhvcCAqbmgpCiB7CiAgIHVfY2hhciBidWZbQlVGU0laXTsKLSAgCisKICAgaW5ldF9udG9wIChBRl9JTkVULCAmbmgtPmlwLCBidWYsIEJVRlNJWik7Ci0gIAorCiAgIHpsb2dfaW5mbyAoIiAgICAgICVzICV1IiwgYnVmLCBuaC0+aWZpbmRleCk7CiB9CiAKQEAgLTEyOSwyNCArMTMxLDI1IEBACiBuZXh0aG9wc19wcmludCAoc3RydWN0IGxpc3QgKm5ocykKIHsKICAgc3RydWN0IGxpc3Rub2RlICpub2RlOwotICAKLSAgZm9yIChub2RlID0gbGlzdGhlYWQobmhzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorCisgIGZvciAobm9kZSA9IGxpc3RoZWFkIChuaHMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCiAgICAgbmV4dGhvcF9wcmludCAoZ2V0ZGF0YSAobm9kZSkpOwogfQogCiAjaWZkZWYgSEFWRV9JUFY2CiAKIHN0cnVjdCBpc2lzX25leHRob3A2ICoKLWlzaXNfbmV4dGhvcDZfbmV3IChzdHJ1Y3QgaW42X2FkZHIgKmlwNiwgdW5zaWduZWQgaW50IGlmaW5kZXgpIAoraXNpc19uZXh0aG9wNl9uZXcgKHN0cnVjdCBpbjZfYWRkciAqaXA2LCB1bnNpZ25lZCBpbnQgaWZpbmRleCkKIHsKLSAgCisKICAgc3RydWN0IGlzaXNfbmV4dGhvcDYgKm5leHRob3A2OwotICAKKwogICBuZXh0aG9wNiA9IFhNQUxMT0MgKE1UWVBFX0lTSVNfTkVYVEhPUDYsIHNpemVvZiAoc3RydWN0IGlzaXNfbmV4dGhvcDYpKTsKLSAgaWYgKCFuZXh0aG9wNikgewotICAgIHpsb2dfZXJyICgiSVNJUy1SdGU6IGlzaXNfbmV4dGhvcF9jcmVhdGU2OiBvdXQgb2YgbWVtb3J5ISIpOwotICB9Ci0gIAorICBpZiAoIW5leHRob3A2KQorICAgIHsKKyAgICAgIHpsb2dfZXJyICgiSVNJUy1SdGU6IGlzaXNfbmV4dGhvcF9jcmVhdGU2OiBvdXQgb2YgbWVtb3J5ISIpOworICAgIH0KKwogICBtZW1zZXQgKG5leHRob3A2LCAwLCBzaXplb2YgKHN0cnVjdCBpc2lzX25leHRob3A2KSk7CiAgIG5leHRob3A2LT5pZmluZGV4ID0gaWZpbmRleDsKICAgbWVtY3B5ICgmbmV4dGhvcDYtPmlwNiwgaXA2LCBzaXplb2YgKHN0cnVjdCBpbjZfYWRkcikpOwpAQCAtMTU3LDU0ICsxNjAsNTUgQEAKIAogc3RydWN0IGlzaXNfbmV4dGhvcDYgKgogaXNpc19uZXh0aG9wNl9jcmVhdGUgKHN0cnVjdCBpbjZfYWRkciAqaXA2LCB1bnNpZ25lZCBpbnQgaWZpbmRleCkKLSAgICAgICAgICAgICAgICAgICAgIAogewogICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgIHN0cnVjdCBpc2lzX25leHRob3A2ICpuZXh0aG9wNjsKLSAgCi0gIGZvciAobm9kZSA9IGxpc3RoZWFkIChpc2lzLT5uZXh0aG9wczYpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICBuZXh0aG9wNiA9IGdldGRhdGEgKG5vZGUpOwotICAgIGlmIChuZXh0aG9wNi0+aWZpbmRleCAhPSBpZmluZGV4KQotICAgICAgY29udGludWU7Ci0gICAgaWYgKGlwNiAmJiBtZW1jbXAgKCZuZXh0aG9wNi0+aXA2LCBpcDYsIHNpemVvZiAoc3RydWN0IGluNl9hZGRyKSkgIT0gMCkKLSAgICAgIGNvbnRpbnVlOyAKIAotICAgIG5leHRob3A2LT5sb2NrKys7Ci0gICAgcmV0dXJuIG5leHRob3A2OwotICB9Ci0gIAorICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoaXNpcy0+bmV4dGhvcHM2KTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorICAgIHsKKyAgICAgIG5leHRob3A2ID0gZ2V0ZGF0YSAobm9kZSk7CisgICAgICBpZiAobmV4dGhvcDYtPmlmaW5kZXggIT0gaWZpbmRleCkKKwljb250aW51ZTsKKyAgICAgIGlmIChpcDYgJiYgbWVtY21wICgmbmV4dGhvcDYtPmlwNiwgaXA2LCBzaXplb2YgKHN0cnVjdCBpbjZfYWRkcikpICE9IDApCisJY29udGludWU7CisKKyAgICAgIG5leHRob3A2LT5sb2NrKys7CisgICAgICByZXR1cm4gbmV4dGhvcDY7CisgICAgfQorCiAgIG5leHRob3A2ID0gaXNpc19uZXh0aG9wNl9uZXcgKGlwNiwgaWZpbmRleCk7CiAKICAgcmV0dXJuIG5leHRob3A2OwogfQogCi0KIHZvaWQKIGlzaXNfbmV4dGhvcDZfZGVsZXRlIChzdHJ1Y3QgaXNpc19uZXh0aG9wNiAqbmV4dGhvcDYpCiB7CiAKICAgbmV4dGhvcDYtPmxvY2stLTsKLSAgaWYgKG5leHRob3A2LT5sb2NrID09IDApIHsKLSAgICBsaXN0bm9kZV9kZWxldGUgKGlzaXMtPm5leHRob3BzNiwgbmV4dGhvcDYpOwotICAgIFhGUkVFIChNVFlQRV9JU0lTX05FWFRIT1A2LCBuZXh0aG9wNik7Ci0gIH0KLSAgICAKKyAgaWYgKG5leHRob3A2LT5sb2NrID09IDApCisgICAgeworICAgICAgbGlzdG5vZGVfZGVsZXRlIChpc2lzLT5uZXh0aG9wczYsIG5leHRob3A2KTsKKyAgICAgIFhGUkVFIChNVFlQRV9JU0lTX05FWFRIT1A2LCBuZXh0aG9wNik7CisgICAgfQorCiAgIHJldHVybjsKIH0KIAogaW50Ci1uZXh0aG9wNmxvb2t1cCAoc3RydWN0IGxpc3QgKm5leHRob3BzNiwgc3RydWN0IGluNl9hZGRyICppcDYsIAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpZmluZGV4KQorbmV4dGhvcDZsb29rdXAgKHN0cnVjdCBsaXN0ICpuZXh0aG9wczYsIHN0cnVjdCBpbjZfYWRkciAqaXA2LAorCQl1bnNpZ25lZCBpbnQgaWZpbmRleCkKIHsKICAgc3RydWN0IGxpc3Rub2RlICpub2RlOwogICBzdHJ1Y3QgaXNpc19uZXh0aG9wNiAqbmg2OwogCi0gIGZvciAobm9kZSA9IGxpc3RoZWFkIChuZXh0aG9wczYpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICBuaDYgPSBnZXRkYXRhIChub2RlKTsKLSAgICBpZiAoIShtZW1jbXAgKGlwNiwgJm5oNi0+aXA2LCBzaXplb2YgKHN0cnVjdCBpbjZfYWRkcikpKSAmJiAKLSAgICAgICAgaWZpbmRleCA9PSBuaDYtPmlmaW5kZXgpCi0gICAgICByZXR1cm4gMTsKLSAgfQorICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAobmV4dGhvcHM2KTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorICAgIHsKKyAgICAgIG5oNiA9IGdldGRhdGEgKG5vZGUpOworICAgICAgaWYgKCEobWVtY21wIChpcDYsICZuaDYtPmlwNiwgc2l6ZW9mIChzdHJ1Y3QgaW42X2FkZHIpKSkgJiYKKwkgIGlmaW5kZXggPT0gbmg2LT5pZmluZGV4KQorCXJldHVybiAxOworICAgIH0KIAogICByZXR1cm4gMDsKIH0KQEAgLTIxMyw5ICsyMTcsOSBAQAogbmV4dGhvcDZfcHJpbnQgKHN0cnVjdCBpc2lzX25leHRob3A2ICpuaDYpCiB7CiAgIHVfY2hhciBidWZbQlVGU0laXTsKLSAgCisKICAgaW5ldF9udG9wIChBRl9JTkVUNiwgJm5oNi0+aXA2LCBidWYsIEJVRlNJWik7Ci0gIAorCiAgIHpsb2dfaW5mbyAoIiAgICAgICVzICV1IiwgYnVmLCBuaDYtPmlmaW5kZXgpOwogfQogCkBAIC0yMjMsOCArMjI3LDggQEAKIG5leHRob3BzNl9wcmludCAoc3RydWN0IGxpc3QgKm5oczYpCiB7CiAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKLSAgCi0gIGZvciAobm9kZSA9IGxpc3RoZWFkKG5oczYpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKG5oczYpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCiAgICAgbmV4dGhvcDZfcHJpbnQgKGdldGRhdGEgKG5vZGUpKTsKIH0KIApAQCAtMjQwLDE1ICsyNDQsMTcgQEAKIAogICBpZiAoYWRqLT5pcHY0X2FkZHJzID09IE5VTEwpCiAgICAgcmV0dXJuOwotICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoYWRqLT5pcHY0X2FkZHJzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7Ci0gICAgaXB2NF9hZGRyID0gZ2V0ZGF0YSAobm9kZSk7Ci0gICAgaWYgKCFuZXh0aG9wbG9va3VwIChuZXh0aG9wcywgaXB2NF9hZGRyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkai0+Y2lyY3VpdC0+aW50ZXJmYWNlLT5pZmluZGV4KSkgewotICAgICAgbmggPSBpc2lzX25leHRob3BfY3JlYXRlIChpcHY0X2FkZHIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGotPmNpcmN1aXQtPmludGVyZmFjZS0+aWZpbmRleCk7Ci0gICAgICBsaXN0bm9kZV9hZGQgKG5leHRob3BzLCBuaCk7CisgIGZvciAobm9kZSA9IGxpc3RoZWFkIChhZGotPmlwdjRfYWRkcnMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisgICAgeworICAgICAgaXB2NF9hZGRyID0gZ2V0ZGF0YSAobm9kZSk7CisgICAgICBpZiAoIW5leHRob3Bsb29rdXAgKG5leHRob3BzLCBpcHY0X2FkZHIsCisJCQkgIGFkai0+Y2lyY3VpdC0+aW50ZXJmYWNlLT5pZmluZGV4KSkKKwl7CisJICBuaCA9IGlzaXNfbmV4dGhvcF9jcmVhdGUgKGlwdjRfYWRkciwKKwkJCQkgICAgYWRqLT5jaXJjdWl0LT5pbnRlcmZhY2UtPmlmaW5kZXgpOworCSAgbGlzdG5vZGVfYWRkIChuZXh0aG9wcywgbmgpOworCX0KICAgICB9Ci0gIH0KIH0KIAogI2lmZGVmIEhBVkVfSVBWNgpAQCAtMjU4LDE1NiArMjY0LDE3MCBAQAogICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgIHN0cnVjdCBpbjZfYWRkciAqaXB2Nl9hZGRyOwogICBzdHJ1Y3QgaXNpc19uZXh0aG9wNiAqbmg2OwotICAKKwogICBpZiAoIWFkai0+aXB2Nl9hZGRycykKICAgICByZXR1cm47CiAKLSAgZm9yIChub2RlID0gbGlzdGhlYWQgKGFkai0+aXB2Nl9hZGRycyk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgewotICAgIGlwdjZfYWRkciA9IGdldGRhdGEgKG5vZGUpOwotICAgIGlmICghbmV4dGhvcDZsb29rdXAgKG5leHRob3BzNiwgaXB2Nl9hZGRyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBhZGotPmNpcmN1aXQtPmludGVyZmFjZS0+aWZpbmRleCkpIHsKLSAgICAgIG5oNiA9IGlzaXNfbmV4dGhvcDZfY3JlYXRlIChpcHY2X2FkZHIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkai0+Y2lyY3VpdC0+aW50ZXJmYWNlLT5pZmluZGV4KTsKLSAgICAgIGxpc3Rub2RlX2FkZCAobmV4dGhvcHM2LCBuaDYpOworICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoYWRqLT5pcHY2X2FkZHJzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorICAgIHsKKyAgICAgIGlwdjZfYWRkciA9IGdldGRhdGEgKG5vZGUpOworICAgICAgaWYgKCFuZXh0aG9wNmxvb2t1cCAobmV4dGhvcHM2LCBpcHY2X2FkZHIsCisJCQkgICBhZGotPmNpcmN1aXQtPmludGVyZmFjZS0+aWZpbmRleCkpCisJeworCSAgbmg2ID0gaXNpc19uZXh0aG9wNl9jcmVhdGUgKGlwdjZfYWRkciwKKwkJCQkgICAgICBhZGotPmNpcmN1aXQtPmludGVyZmFjZS0+aWZpbmRleCk7CisJICBsaXN0bm9kZV9hZGQgKG5leHRob3BzNiwgbmg2KTsKKwl9CiAgICAgfQotICB9CiB9CiAjZW5kaWYgLyogSEFWRV9JUFY2ICovCiAKIHN0cnVjdCBpc2lzX3JvdXRlX2luZm8gKgotaXNpc19yb3V0ZV9pbmZvX25ldyAodWludDMyX3QgY29zdCwgdWludDMyX3QgZGVwdGgsIHVfY2hhciBmYW1pbHksIAotICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxpc3QgKmFkamFjZW5jaWVzKQoraXNpc19yb3V0ZV9pbmZvX25ldyAodWludDMyX3QgY29zdCwgdWludDMyX3QgZGVwdGgsIHVfY2hhciBmYW1pbHksCisJCSAgICAgc3RydWN0IGxpc3QgKmFkamFjZW5jaWVzKQogewogICBzdHJ1Y3QgaXNpc19yb3V0ZV9pbmZvICpyaW5mbzsKICAgc3RydWN0IGlzaXNfYWRqYWNlbmN5ICphZGo7CiAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKLSAgCisKICAgcmluZm8gPSBYTUFMTE9DIChNVFlQRV9JU0lTX1JPVVRFX0lORk8sIHNpemVvZiAoc3RydWN0IGlzaXNfcm91dGVfaW5mbykpOwotICBpZiAoIXJpbmZvKSB7Ci0gICAgemxvZ19lcnIgKCJJU0lTLVJ0ZTogaXNpc19yb3V0ZV9pbmZvX25ldzogb3V0IG9mIG1lbW9yeSEiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQorICBpZiAoIXJpbmZvKQorICAgIHsKKyAgICAgIHpsb2dfZXJyICgiSVNJUy1SdGU6IGlzaXNfcm91dGVfaW5mb19uZXc6IG91dCBvZiBtZW1vcnkhIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgIG1lbXNldCAocmluZm8sIDAsIHNpemVvZiAoc3RydWN0IGlzaXNfcm91dGVfaW5mbykpOwogCi0gIGlmIChmYW1pbHkgPT0gQUZfSU5FVCkgewotICAgIHJpbmZvLT5uZXh0aG9wcyA9IGxpc3RfbmV3ICgpOwotICAgIGZvciAobm9kZSA9IGxpc3RoZWFkIChhZGphY2VuY2llcyk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgewotICAgICAgYWRqID0gZ2V0ZGF0YSAobm9kZSk7Ci0gICAgICBhZGppbmZvMm5leHRob3AgKHJpbmZvLT5uZXh0aG9wcywgYWRqKTsKKyAgaWYgKGZhbWlseSA9PSBBRl9JTkVUKQorICAgIHsKKyAgICAgIHJpbmZvLT5uZXh0aG9wcyA9IGxpc3RfbmV3ICgpOworICAgICAgZm9yIChub2RlID0gbGlzdGhlYWQgKGFkamFjZW5jaWVzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorCXsKKwkgIGFkaiA9IGdldGRhdGEgKG5vZGUpOworCSAgYWRqaW5mbzJuZXh0aG9wIChyaW5mby0+bmV4dGhvcHMsIGFkaik7CisJfQogICAgIH0KLSAgfQogI2lmZGVmIEhBVkVfSVBWNgotICBpZiAoZmFtaWx5ID09IEFGX0lORVQ2KSB7Ci0gICAgcmluZm8tPm5leHRob3BzNiA9IGxpc3RfbmV3ICgpOwotICAgIGZvciAobm9kZSA9IGxpc3RoZWFkIChhZGphY2VuY2llcyk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgewotICAgICAgYWRqID1nZXRkYXRhIChub2RlKTsKLSAgICAgIGFkamluZm8ybmV4dGhvcDYgKHJpbmZvLT5uZXh0aG9wczYsIGFkaik7CisgIGlmIChmYW1pbHkgPT0gQUZfSU5FVDYpCisgICAgeworICAgICAgcmluZm8tPm5leHRob3BzNiA9IGxpc3RfbmV3ICgpOworICAgICAgZm9yIChub2RlID0gbGlzdGhlYWQgKGFkamFjZW5jaWVzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorCXsKKwkgIGFkaiA9IGdldGRhdGEgKG5vZGUpOworCSAgYWRqaW5mbzJuZXh0aG9wNiAocmluZm8tPm5leHRob3BzNiwgYWRqKTsKKwl9CiAgICAgfQotICB9Ci0gICAgCisKICNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KIAogICByaW5mby0+Y29zdCA9IGNvc3Q7CiAgIHJpbmZvLT5kZXB0aCA9IGRlcHRoOwotICAgICAgCisKICAgcmV0dXJuIHJpbmZvOwogfQogCi0KIHZvaWQKIGlzaXNfcm91dGVfaW5mb19kZWxldGUgKHN0cnVjdCBpc2lzX3JvdXRlX2luZm8gKnJvdXRlX2luZm8pCiB7Ci0gIAotICBpZiAocm91dGVfaW5mby0+bmV4dGhvcHMpIHsKLSAgICByb3V0ZV9pbmZvLT5uZXh0aG9wcy0+ZGVsID0gKHZvaWQgKilpc2lzX25leHRob3BfZGVsZXRlOwotICAgIGxpc3RfZGVsZXRlIChyb3V0ZV9pbmZvLT5uZXh0aG9wcyk7Ci0gIH0KLSAgIAorICBpZiAocm91dGVfaW5mby0+bmV4dGhvcHMpCisgICAgeworICAgICAgcm91dGVfaW5mby0+bmV4dGhvcHMtPmRlbCA9ICh2b2lkICopIGlzaXNfbmV4dGhvcF9kZWxldGU7CisgICAgICBsaXN0X2RlbGV0ZSAocm91dGVfaW5mby0+bmV4dGhvcHMpOworICAgIH0KKwogI2lmZGVmIEhBVkVfSVBWNgotICBpZiAocm91dGVfaW5mby0+bmV4dGhvcHM2KSB7Ci0gICAgICByb3V0ZV9pbmZvLT5uZXh0aG9wczYtPmRlbCA9ICh2b2lkICopaXNpc19uZXh0aG9wNl9kZWxldGU7CisgIGlmIChyb3V0ZV9pbmZvLT5uZXh0aG9wczYpCisgICAgeworICAgICAgcm91dGVfaW5mby0+bmV4dGhvcHM2LT5kZWwgPSAodm9pZCAqKSBpc2lzX25leHRob3A2X2RlbGV0ZTsKICAgICAgIGxpc3RfZGVsZXRlIChyb3V0ZV9pbmZvLT5uZXh0aG9wczYpOwotICB9CisgICAgfQogI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwotIAorCiAgIFhGUkVFIChNVFlQRV9JU0lTX1JPVVRFX0lORk8sIHJvdXRlX2luZm8pOwogfQogCiBpbnQKLWlzaXNfcm91dGVfaW5mb19zYW1lX2F0dHJpYiAoc3RydWN0IGlzaXNfcm91dGVfaW5mbyAqbmV3LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlzaXNfcm91dGVfaW5mbyAqb2xkKQoraXNpc19yb3V0ZV9pbmZvX3NhbWVfYXR0cmliIChzdHJ1Y3QgaXNpc19yb3V0ZV9pbmZvICpuZXcsCisJCQkgICAgIHN0cnVjdCBpc2lzX3JvdXRlX2luZm8gKm9sZCkKIHsKICAgaWYgKG5ldy0+Y29zdCAhPSBvbGQtPmNvc3QpCiAgICAgcmV0dXJuIDA7CiAgIGlmIChuZXctPmRlcHRoICE9IG9sZC0+ZGVwdGgpCiAgICAgcmV0dXJuIDA7Ci0gIAorCiAgIHJldHVybiAxOwogfQogCiBpbnQKLWlzaXNfcm91dGVfaW5mb19zYW1lIChzdHJ1Y3QgaXNpc19yb3V0ZV9pbmZvICpuZXcsIHN0cnVjdCBpc2lzX3JvdXRlX2luZm8gKm9sZCwKLSAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgZmFtaWx5KQoraXNpc19yb3V0ZV9pbmZvX3NhbWUgKHN0cnVjdCBpc2lzX3JvdXRlX2luZm8gKm5ldywKKwkJICAgICAgc3RydWN0IGlzaXNfcm91dGVfaW5mbyAqb2xkLCB1X2NoYXIgZmFtaWx5KQogewotICBzdHJ1Y3QgbGlzdG5vZGUgICpub2RlOworICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgIHN0cnVjdCBpc2lzX25leHRob3AgKm5leHRob3A7CiAjaWZkZWYgSEFWRV9JUFY2CiAgIHN0cnVjdCBpc2lzX25leHRob3A2ICpuZXh0aG9wNjsKICNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KICAgaWYgKCFpc2lzX3JvdXRlX2luZm9fc2FtZV9hdHRyaWIgKG5ldywgb2xkKSkKICAgICByZXR1cm4gMDsKLSAgCi0gIGlmIChmYW1pbHkgPT0gQUZfSU5FVCkgewotICAgIGZvciAobm9kZSA9IGxpc3RoZWFkIChuZXctPm5leHRob3BzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7Ci0gICAgICBuZXh0aG9wID0gKHN0cnVjdCBpc2lzX25leHRob3AgKikgZ2V0ZGF0YSAobm9kZSk7Ci0gICAgICBpZiAobmV4dGhvcGxvb2t1cCAob2xkLT5uZXh0aG9wcywgJm5leHRob3AtPmlwLCBuZXh0aG9wLT5pZmluZGV4KSA9PSAwKQotICAgICAgICByZXR1cm4gMDsKKworICBpZiAoZmFtaWx5ID09IEFGX0lORVQpCisgICAgeworICAgICAgZm9yIChub2RlID0gbGlzdGhlYWQgKG5ldy0+bmV4dGhvcHMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisJeworCSAgbmV4dGhvcCA9IChzdHJ1Y3QgaXNpc19uZXh0aG9wICopIGdldGRhdGEgKG5vZGUpOworCSAgaWYgKG5leHRob3Bsb29rdXAgKG9sZC0+bmV4dGhvcHMsICZuZXh0aG9wLT5pcCwgbmV4dGhvcC0+aWZpbmRleCkgPT0KKwkgICAgICAwKQorCSAgICByZXR1cm4gMDsKKwl9CisKKyAgICAgIGZvciAobm9kZSA9IGxpc3RoZWFkIChvbGQtPm5leHRob3BzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorCXsKKwkgIG5leHRob3AgPSAoc3RydWN0IGlzaXNfbmV4dGhvcCAqKSBnZXRkYXRhIChub2RlKTsKKwkgIGlmIChuZXh0aG9wbG9va3VwIChuZXctPm5leHRob3BzLCAmbmV4dGhvcC0+aXAsIG5leHRob3AtPmlmaW5kZXgpID09CisJICAgICAgMCkKKwkgICAgcmV0dXJuIDA7CisJfQogICAgIH0KLSAgCi0gICAgZm9yIChub2RlID0gbGlzdGhlYWQgKG9sZC0+bmV4dGhvcHMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICAgIG5leHRob3AgPSAoc3RydWN0IGlzaXNfbmV4dGhvcCAqKSBnZXRkYXRhIChub2RlKTsKLSAgICAgIGlmIChuZXh0aG9wbG9va3VwIChuZXctPm5leHRob3BzLCAmbmV4dGhvcC0+aXAsIG5leHRob3AtPmlmaW5kZXgpID09IDApCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQogI2lmZGVmIEhBVkVfSVBWNgotICBlbHNlIGlmIChmYW1pbHkgPT0gQUZfSU5FVDYpIHsKLSAgICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAobmV3LT5uZXh0aG9wczYpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICAgIG5leHRob3A2ID0gKHN0cnVjdCBpc2lzX25leHRob3A2ICopIGdldGRhdGEgKG5vZGUpOwotICAgICAgaWYgKG5leHRob3A2bG9va3VwIChvbGQtPm5leHRob3BzNiwgJm5leHRob3A2LT5pcDYsIAotICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0aG9wNi0+aWZpbmRleCkgPT0gMCkKLSAgICAgICAgcmV0dXJuIDA7CisgIGVsc2UgaWYgKGZhbWlseSA9PSBBRl9JTkVUNikKKyAgICB7CisgICAgICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAobmV3LT5uZXh0aG9wczYpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisJeworCSAgbmV4dGhvcDYgPSAoc3RydWN0IGlzaXNfbmV4dGhvcDYgKikgZ2V0ZGF0YSAobm9kZSk7CisJICBpZiAobmV4dGhvcDZsb29rdXAgKG9sZC0+bmV4dGhvcHM2LCAmbmV4dGhvcDYtPmlwNiwKKwkJCSAgICAgIG5leHRob3A2LT5pZmluZGV4KSA9PSAwKQorCSAgICByZXR1cm4gMDsKKwl9CisKKyAgICAgIGZvciAobm9kZSA9IGxpc3RoZWFkIChvbGQtPm5leHRob3BzNik7IG5vZGU7IG5leHRub2RlIChub2RlKSkKKwl7CisJICBuZXh0aG9wNiA9IChzdHJ1Y3QgaXNpc19uZXh0aG9wNiAqKSBnZXRkYXRhIChub2RlKTsKKwkgIGlmIChuZXh0aG9wNmxvb2t1cCAobmV3LT5uZXh0aG9wczYsICZuZXh0aG9wNi0+aXA2LAorCQkJICAgICAgbmV4dGhvcDYtPmlmaW5kZXgpID09IDApCisJICAgIHJldHVybiAwOworCX0KICAgICB9Ci0gIAotICAgIGZvciAobm9kZSA9IGxpc3RoZWFkIChvbGQtPm5leHRob3BzNik7IG5vZGU7IG5leHRub2RlIChub2RlKSkgewotICAgICAgbmV4dGhvcDYgPSAoc3RydWN0IGlzaXNfbmV4dGhvcDYgKikgZ2V0ZGF0YSAobm9kZSk7Ci0gICAgICBpZiAobmV4dGhvcDZsb29rdXAgKG5ldy0+bmV4dGhvcHM2LCAmbmV4dGhvcDYtPmlwNiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRob3A2LT5pZmluZGV4KSA9PSAwKQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KICNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KIAogICByZXR1cm4gMTsKIH0KIAotCiB2b2lkCiBpc2lzX25leHRob3BzX21lcmdlIChzdHJ1Y3QgbGlzdCAqbmV3LCBzdHJ1Y3QgbGlzdCAqb2xkKQogewogICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgIHN0cnVjdCBpc2lzX25leHRob3AgKm5leHRob3A7CiAKLSAgZm9yIChub2RlID0gbGlzdGhlYWQgKG5ldyk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgewotICAgIG5leHRob3AgPSAoc3RydWN0IGlzaXNfbmV4dGhvcCAqKSBnZXRkYXRhIChub2RlKTsKLSAgICBpZiAobmV4dGhvcGxvb2t1cCAob2xkLCAmbmV4dGhvcC0+aXAsIG5leHRob3AtPmlmaW5kZXgpKQotICAgICAgY29udGludWU7Ci0gICAgbGlzdG5vZGVfYWRkIChvbGQsIG5leHRob3ApOwotICAgIG5leHRob3AtPmxvY2srKzsKLSAgfQorICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAobmV3KTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorICAgIHsKKyAgICAgIG5leHRob3AgPSAoc3RydWN0IGlzaXNfbmV4dGhvcCAqKSBnZXRkYXRhIChub2RlKTsKKyAgICAgIGlmIChuZXh0aG9wbG9va3VwIChvbGQsICZuZXh0aG9wLT5pcCwgbmV4dGhvcC0+aWZpbmRleCkpCisJY29udGludWU7CisgICAgICBsaXN0bm9kZV9hZGQgKG9sZCwgbmV4dGhvcCk7CisgICAgICBuZXh0aG9wLT5sb2NrKys7CisgICAgfQogfQogCi0KICNpZmRlZiBIQVZFX0lQVjYKIHZvaWQKIGlzaXNfbmV4dGhvcHM2X21lcmdlIChzdHJ1Y3QgbGlzdCAqbmV3LCBzdHJ1Y3QgbGlzdCAqb2xkKQpAQCAtNDE1LDEyMyArNDM1LDEzMyBAQAogICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgIHN0cnVjdCBpc2lzX25leHRob3A2ICpuZXh0aG9wNjsKIAotICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAobmV3KTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7Ci0gICAgbmV4dGhvcDYgPSAoc3RydWN0IGlzaXNfbmV4dGhvcDYgKikgZ2V0ZGF0YSAobm9kZSk7Ci0gICAgaWYgKG5leHRob3A2bG9va3VwIChvbGQsICZuZXh0aG9wNi0+aXA2LCBuZXh0aG9wNi0+aWZpbmRleCkpCi0gICAgICBjb250aW51ZTsKLSAgICBsaXN0bm9kZV9hZGQgKG9sZCwgbmV4dGhvcDYpOwotICAgIG5leHRob3A2LT5sb2NrKys7Ci0gIH0KKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKG5ldyk7IG5vZGU7IG5leHRub2RlIChub2RlKSkKKyAgICB7CisgICAgICBuZXh0aG9wNiA9IChzdHJ1Y3QgaXNpc19uZXh0aG9wNiAqKSBnZXRkYXRhIChub2RlKTsKKyAgICAgIGlmIChuZXh0aG9wNmxvb2t1cCAob2xkLCAmbmV4dGhvcDYtPmlwNiwgbmV4dGhvcDYtPmlmaW5kZXgpKQorCWNvbnRpbnVlOworICAgICAgbGlzdG5vZGVfYWRkIChvbGQsIG5leHRob3A2KTsKKyAgICAgIG5leHRob3A2LT5sb2NrKys7CisgICAgfQogfQogI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwogCiB2b2lkCi1pc2lzX3JvdXRlX2luZm9fbWVyZ2UgKHN0cnVjdCBpc2lzX3JvdXRlX2luZm8gKm5ldywgCi0gICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpc2lzX3JvdXRlX2luZm8gKm9sZCwgdV9jaGFyIGZhbWlseSkKK2lzaXNfcm91dGVfaW5mb19tZXJnZSAoc3RydWN0IGlzaXNfcm91dGVfaW5mbyAqbmV3LAorCQkgICAgICAgc3RydWN0IGlzaXNfcm91dGVfaW5mbyAqb2xkLCB1X2NoYXIgZmFtaWx5KQogewotICAKLSAgaWYgKGZhbWlseSA9PSBBRl9JTkVUKSAKKyAgaWYgKGZhbWlseSA9PSBBRl9JTkVUKQogICAgIGlzaXNfbmV4dGhvcHNfbWVyZ2UgKG5ldy0+bmV4dGhvcHMsIG9sZC0+bmV4dGhvcHMpOwogI2lmZGVmIEhBVkVfSVBWNgotICBlbHNlIGlmIChmYW1pbHkgPT0gQUZfSU5FVDYpIAorICBlbHNlIGlmIChmYW1pbHkgPT0gQUZfSU5FVDYpCiAgICAgaXNpc19uZXh0aG9wczZfbWVyZ2UgKG5ldy0+bmV4dGhvcHM2LCBvbGQtPm5leHRob3BzNik7CiAjZW5kaWYgLyogSEFWRV9JUFY2ICovCi0gICAgCisKICAgcmV0dXJuOwogfQogCi0KIGludAotaXNpc19yb3V0ZV9pbmZvX3ByZWZlcl9uZXcgKHN0cnVjdCBpc2lzX3JvdXRlX2luZm8gKm5ldywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlzaXNfcm91dGVfaW5mbyAqb2xkKQoraXNpc19yb3V0ZV9pbmZvX3ByZWZlcl9uZXcgKHN0cnVjdCBpc2lzX3JvdXRlX2luZm8gKm5ldywKKwkJCSAgICBzdHJ1Y3QgaXNpc19yb3V0ZV9pbmZvICpvbGQpCiB7Ci0gIAogICBpZiAoIUNIRUNLX0ZMQUcgKG9sZC0+ZmxhZywgSVNJU19ST1VURV9GTEFHX0FDVElWRSkpCiAgICAgcmV0dXJuIDE7CiAKICAgaWYgKG5ldy0+Y29zdCA8IG9sZC0+Y29zdCkKICAgICByZXR1cm4gMTsKLSAgCisKICAgcmV0dXJuIDA7CiB9CiAKLQogc3RydWN0IGlzaXNfcm91dGVfaW5mbyAqCiBpc2lzX3JvdXRlX2NyZWF0ZSAoc3RydWN0IHByZWZpeCAqcHJlZml4LCB1X2ludDMyX3QgY29zdCwgdV9pbnQzMl90IGRlcHRoLAotICAgICAgICAgICAgICAgICAgIHN0cnVjdCBsaXN0ICphZGphY2VuY2llcywgc3RydWN0IGlzaXNfYXJlYSAqYXJlYSkKKwkJICAgc3RydWN0IGxpc3QgKmFkamFjZW5jaWVzLCBzdHJ1Y3QgaXNpc19hcmVhICphcmVhKQogewogICBzdHJ1Y3Qgcm91dGVfbm9kZSAqcm91dGVfbm9kZTsKICAgc3RydWN0IGlzaXNfcm91dGVfaW5mbyAqcmluZm9fbmV3LCAqcmluZm9fb2xkLCAqcm91dGVfaW5mbyA9IE5VTEw7CiAgIHVfY2hhciBidWZmW0JVRlNJWl07CiAgIHVfY2hhciBmYW1pbHk7Ci0gIAorCiAgIGZhbWlseSA9IHByZWZpeC0+ZmFtaWx5OwogICAvKiBmb3IgZGVidWdzICovCiAgIHByZWZpeDJzdHIgKHByZWZpeCwgYnVmZiwgQlVGU0laKTsKLSAgCisKICAgcmluZm9fbmV3ID0gaXNpc19yb3V0ZV9pbmZvX25ldyAoY29zdCwgZGVwdGgsIGZhbWlseSwgYWRqYWNlbmNpZXMpOwotICBpZiAoIXJpbmZvX25ldykgewotICAgIHpsb2dfZXJyICgiSVNJUy1SdGUgKCVzKTogaXNpc19yb3V0ZV9jcmVhdGU6IG91dCBvZiBtZW1vcnkhIiwKLQkgICAgICBhcmVhLT5hcmVhX3RhZyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgCisgIGlmICghcmluZm9fbmV3KQorICAgIHsKKyAgICAgIHpsb2dfZXJyICgiSVNJUy1SdGUgKCVzKTogaXNpc19yb3V0ZV9jcmVhdGU6IG91dCBvZiBtZW1vcnkhIiwKKwkJYXJlYS0+YXJlYV90YWcpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCiAgIGlmIChmYW1pbHkgPT0gQUZfSU5FVCkKLSAgICByb3V0ZV9ub2RlID0gcm91dGVfbm9kZV9nZXQgKGFyZWEtPnJvdXRlX3RhYmxlLCBwcmVmaXgpOyAgCisgICAgcm91dGVfbm9kZSA9IHJvdXRlX25vZGVfZ2V0IChhcmVhLT5yb3V0ZV90YWJsZSwgcHJlZml4KTsKICNpZmRlZiBIQVZFX0lQVjYKICAgZWxzZSBpZiAoZmFtaWx5ID09IEFGX0lORVQ2KQotICAgIHJvdXRlX25vZGUgPSByb3V0ZV9ub2RlX2dldCAoYXJlYS0+cm91dGVfdGFibGU2LCBwcmVmaXgpOyAgCisgICAgcm91dGVfbm9kZSA9IHJvdXRlX25vZGVfZ2V0IChhcmVhLT5yb3V0ZV90YWJsZTYsIHByZWZpeCk7CiAjZW5kaWYgLyogSEFWRV9JUFY2ICovCi0gIGVsc2UgCisgIGVsc2UKICAgICByZXR1cm4gTlVMTDsKLSAgcmluZm9fb2xkID0gcm91dGVfbm9kZS0+aW5mbzsgIAotICBpZiAoIXJpbmZvX29sZCkgewotICAgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19SVEVfRVZFTlRTKQotICAgICAgemxvZ19pbmZvICgiSVNJUy1SdGUgKCVzKSByb3V0ZSBjcmVhdGVkOiAlcyIsIGFyZWEtPmFyZWFfdGFnLCBidWZmKTsKLSAgICBTRVRfRkxBRyhyaW5mb19uZXctPmZsYWcsIElTSVNfUk9VVEVfRkxBR19BQ1RJVkUpOwotICAgIHJvdXRlX25vZGUtPmluZm8gPSByaW5mb19uZXc7Ci0gICAgcmV0dXJuIHJpbmZvX25ldzsKLSAgfQotICAKKyAgcmluZm9fb2xkID0gcm91dGVfbm9kZS0+aW5mbzsKKyAgaWYgKCFyaW5mb19vbGQpCisgICAgeworICAgICAgaWYgKGlzaXMtPmRlYnVncyAmIERFQlVHX1JURV9FVkVOVFMpCisJemxvZ19pbmZvICgiSVNJUy1SdGUgKCVzKSByb3V0ZSBjcmVhdGVkOiAlcyIsIGFyZWEtPmFyZWFfdGFnLCBidWZmKTsKKyAgICAgIFNFVF9GTEFHIChyaW5mb19uZXctPmZsYWcsIElTSVNfUk9VVEVfRkxBR19BQ1RJVkUpOworICAgICAgcm91dGVfbm9kZS0+aW5mbyA9IHJpbmZvX25ldzsKKyAgICAgIHJldHVybiByaW5mb19uZXc7CisgICAgfQorCiAgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19SVEVfRVZFTlRTKQotICAgIHpsb2dfaW5mbyAoIklTSVMtUnRlICglcykgcm91dGUgYWxyZWFkeSBleGlzdHM6ICVzIiwgYXJlYS0+YXJlYV90YWcsIGJ1ZmYpOwotICAKLSAgaWYgKGlzaXNfcm91dGVfaW5mb19zYW1lIChyaW5mb19uZXcsIHJpbmZvX29sZCwgZmFtaWx5KSkgewotICAgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19SVEVfRVZFTlRTKQotICAgICAgemxvZ19pbmZvICgiSVNJUy1SdGUgKCVzKSByb3V0ZSB1bmNoYW5nZWQ6ICVzIiwgYXJlYS0+YXJlYV90YWcsIGJ1ZmYpOwotICAgIGlzaXNfcm91dGVfaW5mb19kZWxldGUgKHJpbmZvX25ldyk7Ci0gICAgcm91dGVfaW5mbyA9IHJpbmZvX29sZDsKLSAgfSBlbHNlIGlmIChpc2lzX3JvdXRlX2luZm9fc2FtZV9hdHRyaWIgKHJpbmZvX25ldywgcmluZm9fb2xkKSkgewotICAgIC8qIG1lcmdlIHRoZSBuZXh0aG9wIGxpc3RzICovCi0gICAgaWYgKGlzaXMtPmRlYnVncyAmIERFQlVHX1JURV9FVkVOVFMpCi0gICAgICAgIHpsb2dfaW5mbyAoIklTSVMtUnRlICglcykgcm91dGUgY2hhbmdlZCAoc2FtZSBhdHRyaWJzKTogJXMiLCAKLSAgICAgICAgICAgICAgICAgICBhcmVhLT5hcmVhX3RhZywgYnVmZik7Ci0jaWZkZWYgRVhUUkVNRV9ERUJVRwotICAgIHpsb2dfaW5mbyAoIk9sZCBuZXh0aG9wcyIpOwotICAgIG5leHRob3BzNl9wcmludCAocmluZm9fb2xkLT5uZXh0aG9wczYpOwotICAgIHpsb2dfaW5mbyAoIk5ldyBuZXh0aG9wcyIpOwotICAgIG5leHRob3BzNl9wcmludCAocmluZm9fbmV3LT5uZXh0aG9wczYpOwotI2VuZGlmIC8qIEVYVFJFTUVfREVCVUcgKi8KLSAgICBpc2lzX3JvdXRlX2luZm9fbWVyZ2UgKHJpbmZvX25ldywgcmluZm9fb2xkLCBmYW1pbHkpOwotICAgIGlzaXNfcm91dGVfaW5mb19kZWxldGUgKHJpbmZvX25ldyk7Ci0gICAgcm91dGVfaW5mbyA9IHJpbmZvX29sZDsKLSAgfSBlbHNlIHsKLSAgICBpZiAoaXNpc19yb3V0ZV9pbmZvX3ByZWZlcl9uZXcgKHJpbmZvX25ldywgcmluZm9fb2xkKSkgeworICAgIHpsb2dfaW5mbyAoIklTSVMtUnRlICglcykgcm91dGUgYWxyZWFkeSBleGlzdHM6ICVzIiwgYXJlYS0+YXJlYV90YWcsCisJICAgICAgIGJ1ZmYpOworCisgIGlmIChpc2lzX3JvdXRlX2luZm9fc2FtZSAocmluZm9fbmV3LCByaW5mb19vbGQsIGZhbWlseSkpCisgICAgewogICAgICAgaWYgKGlzaXMtPmRlYnVncyAmIERFQlVHX1JURV9FVkVOVFMpCi0gICAgICAgIHpsb2dfaW5mbyAoIklTSVMtUnRlICglcykgcm91dGUgY2hhbmdlZDogJXMiLCBhcmVhLT5hcmVhX3RhZywgYnVmZik7Ci0gICAgICBpc2lzX3JvdXRlX2luZm9fZGVsZXRlIChyaW5mb19vbGQpOwotICAgICAgcm91dGVfaW5mbyA9IHJpbmZvX25ldzsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKGlzaXMtPmRlYnVncyAmIERFQlVHX1JURV9FVkVOVFMpCi0gICAgICAgIHpsb2dfaW5mbyAoIklTSVMtUnRlICglcykgcm91dGUgcmVqZWN0ZWQ6ICVzIiwgYXJlYS0+YXJlYV90YWcsIGJ1ZmYpOworCXpsb2dfaW5mbyAoIklTSVMtUnRlICglcykgcm91dGUgdW5jaGFuZ2VkOiAlcyIsIGFyZWEtPmFyZWFfdGFnLCBidWZmKTsKICAgICAgIGlzaXNfcm91dGVfaW5mb19kZWxldGUgKHJpbmZvX25ldyk7CiAgICAgICByb3V0ZV9pbmZvID0gcmluZm9fb2xkOwogICAgIH0KLSAgfQotICAKKyAgZWxzZSBpZiAoaXNpc19yb3V0ZV9pbmZvX3NhbWVfYXR0cmliIChyaW5mb19uZXcsIHJpbmZvX29sZCkpCisgICAgeworICAgICAgLyogbWVyZ2UgdGhlIG5leHRob3AgbGlzdHMgKi8KKyAgICAgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19SVEVfRVZFTlRTKQorCXpsb2dfaW5mbyAoIklTSVMtUnRlICglcykgcm91dGUgY2hhbmdlZCAoc2FtZSBhdHRyaWJzKTogJXMiLAorCQkgICBhcmVhLT5hcmVhX3RhZywgYnVmZik7CisjaWZkZWYgRVhUUkVNRV9ERUJVRworICAgICAgemxvZ19pbmZvICgiT2xkIG5leHRob3BzIik7CisgICAgICBuZXh0aG9wczZfcHJpbnQgKHJpbmZvX29sZC0+bmV4dGhvcHM2KTsKKyAgICAgIHpsb2dfaW5mbyAoIk5ldyBuZXh0aG9wcyIpOworICAgICAgbmV4dGhvcHM2X3ByaW50IChyaW5mb19uZXctPm5leHRob3BzNik7CisjZW5kaWYgLyogRVhUUkVNRV9ERUJVRyAqLworICAgICAgaXNpc19yb3V0ZV9pbmZvX21lcmdlIChyaW5mb19uZXcsIHJpbmZvX29sZCwgZmFtaWx5KTsKKyAgICAgIGlzaXNfcm91dGVfaW5mb19kZWxldGUgKHJpbmZvX25ldyk7CisgICAgICByb3V0ZV9pbmZvID0gcmluZm9fb2xkOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChpc2lzX3JvdXRlX2luZm9fcHJlZmVyX25ldyAocmluZm9fbmV3LCByaW5mb19vbGQpKQorCXsKKwkgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19SVEVfRVZFTlRTKQorCSAgICB6bG9nX2luZm8gKCJJU0lTLVJ0ZSAoJXMpIHJvdXRlIGNoYW5nZWQ6ICVzIiwgYXJlYS0+YXJlYV90YWcsCisJCSAgICAgICBidWZmKTsKKwkgIGlzaXNfcm91dGVfaW5mb19kZWxldGUgKHJpbmZvX29sZCk7CisJICByb3V0ZV9pbmZvID0gcmluZm9fbmV3OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoaXNpcy0+ZGVidWdzICYgREVCVUdfUlRFX0VWRU5UUykKKwkgICAgemxvZ19pbmZvICgiSVNJUy1SdGUgKCVzKSByb3V0ZSByZWplY3RlZDogJXMiLCBhcmVhLT5hcmVhX3RhZywKKwkJICAgICAgIGJ1ZmYpOworCSAgaXNpc19yb3V0ZV9pbmZvX2RlbGV0ZSAocmluZm9fbmV3KTsKKwkgIHJvdXRlX2luZm8gPSByaW5mb19vbGQ7CisJfQorICAgIH0KKwogICBTRVRfRkxBRyAocm91dGVfaW5mby0+ZmxhZywgSVNJU19ST1VURV9GTEFHX0FDVElWRSk7CiAgIHJvdXRlX25vZGUtPmluZm8gPSByb3V0ZV9pbmZvOwotICAKKwogICByZXR1cm4gcm91dGVfaW5mbzsKIH0KIApAQCAtNTQ5LDIxICs1NzksMjMgQEAKICAgcm9kZSA9IHJvdXRlX25vZGVfZ2V0ICh0YWJsZSwgcHJlZml4KTsKICAgcmluZm8gPSByb2RlLT5pbmZvOwogCi0gIGlmIChyaW5mbyA9PSBOVUxMKSB7Ci0gICAgaWYgKGlzaXMtPmRlYnVncyAmIERFQlVHX1JURV9FVkVOVFMpCi0gICAgICB6bG9nX2luZm8gKCJJU0lTLVJ0ZTogdHJpZWQgdG8gZGVsZXRlIG5vbi1leGlzdGFudCByb3V0ZSAlcyIsIGJ1ZmYpOwotICAgIHJldHVybjsKLSAgfQorICBpZiAocmluZm8gPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoaXNpcy0+ZGVidWdzICYgREVCVUdfUlRFX0VWRU5UUykKKwl6bG9nX2luZm8gKCJJU0lTLVJ0ZTogdHJpZWQgdG8gZGVsZXRlIG5vbi1leGlzdGFudCByb3V0ZSAlcyIsIGJ1ZmYpOworICAgICAgcmV0dXJuOworICAgIH0KIAotICBpZiAoQ0hFQ0tfRkxBRyAocmluZm8tPmZsYWcsIElTSVNfUk9VVEVfRkxBR19aRUJSQV9TWU5DKSkgewotICAgIFVOU0VUX0ZMQUcgKHJpbmZvLT5mbGFnLCBJU0lTX1JPVVRFX0ZMQUdfQUNUSVZFKTsKLSAgICBpZiAoaXNpcy0+ZGVidWdzICYgREVCVUdfUlRFX0VWRU5UUykKLSAgICAgIHpsb2dfaW5mbyAoIklTSVMtUnRlOiByb3V0ZSBkZWxldGUgICVzIiwgYnVmZik7Ci0gICAgaXNpc196ZWJyYV9yb3V0ZV91cGRhdGUgKHByZWZpeCwgcmluZm8pOwotICB9CisgIGlmIChDSEVDS19GTEFHIChyaW5mby0+ZmxhZywgSVNJU19ST1VURV9GTEFHX1pFQlJBX1NZTkMpKQorICAgIHsKKyAgICAgIFVOU0VUX0ZMQUcgKHJpbmZvLT5mbGFnLCBJU0lTX1JPVVRFX0ZMQUdfQUNUSVZFKTsKKyAgICAgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19SVEVfRVZFTlRTKQorCXpsb2dfaW5mbyAoIklTSVMtUnRlOiByb3V0ZSBkZWxldGUgICVzIiwgYnVmZik7CisgICAgICBpc2lzX3plYnJhX3JvdXRlX3VwZGF0ZSAocHJlZml4LCByaW5mbyk7CisgICAgfQogICBpc2lzX3JvdXRlX2luZm9fZGVsZXRlIChyaW5mbyk7CiAgIHJvZGUtPmluZm8gPSBOVUxMOwotICAKKwogICByZXR1cm47CiB9CiAKQEAgLTU4MSwyNyArNjEzLDI5IEBACiAgIGFyZWEgPSBUSFJFQURfQVJHICh0aHJlYWQpOwogICB0YWJsZSA9IGFyZWEtPnJvdXRlX3RhYmxlOwogI2lmZGVmIEhBVkVfSVBWNgotIGFnYWluOgorYWdhaW46CiAjZW5kaWYKLSAgZm9yIChyb2RlID0gcm91dGVfdG9wICh0YWJsZSk7IHJvZGU7IHJvZGUgPSByb3V0ZV9uZXh0IChyb2RlKSkgewotICAgIGlmIChyb2RlLT5pbmZvID09IE5VTEwpCi0gICAgICBjb250aW51ZTsKLSAgICByaW5mbyA9IHJvZGUtPmluZm87Ci0gICAgCi0gICAgaWYgKGlzaXMtPmRlYnVncyAmIERFQlVHX1JURV9FVkVOVFMpIHsKLSAgICAgIHByZWZpeDJzdHIgKCZyb2RlLT5wLCBidWZmLCBCVUZTSVopOwotICAgICAgemxvZ19pbmZvICgiSVNJUy1SdGUgKCVzKTogcm91dGUgdmFsaWRhdGU6ICVzICVzICVzIiwKLSAgICAgICAgICAgICAgICAgYXJlYS0+YXJlYV90YWcsCi0gICAgICAgICAgICAgICAgIChDSEVDS19GTEFHIChyaW5mby0+ZmxhZywgSVNJU19ST1VURV9GTEFHX1pFQlJBX1NZTkMpID8KLSAgICAgICAgICAgICAgICAgICJzeW5jJ2VkIjogIm5vc3luYyIpLAotICAgICAgICAgICAgICAgICAoQ0hFQ0tfRkxBRyAocmluZm8tPmZsYWcsIElTSVNfUk9VVEVfRkxBR19BQ1RJVkUpID8KLSAgICAgICAgICAgICAgICAgICJhY3RpdmUiOiAiaW5hY3RpdmUiKSwgYnVmZik7CisgIGZvciAocm9kZSA9IHJvdXRlX3RvcCAodGFibGUpOyByb2RlOyByb2RlID0gcm91dGVfbmV4dCAocm9kZSkpCisgICAgeworICAgICAgaWYgKHJvZGUtPmluZm8gPT0gTlVMTCkKKwljb250aW51ZTsKKyAgICAgIHJpbmZvID0gcm9kZS0+aW5mbzsKKworICAgICAgaWYgKGlzaXMtPmRlYnVncyAmIERFQlVHX1JURV9FVkVOVFMpCisJeworCSAgcHJlZml4MnN0ciAoJnJvZGUtPnAsIGJ1ZmYsIEJVRlNJWik7CisJICB6bG9nX2luZm8gKCJJU0lTLVJ0ZSAoJXMpOiByb3V0ZSB2YWxpZGF0ZTogJXMgJXMgJXMiLAorCQkgICAgIGFyZWEtPmFyZWFfdGFnLAorCQkgICAgIChDSEVDS19GTEFHIChyaW5mby0+ZmxhZywgSVNJU19ST1VURV9GTEFHX1pFQlJBX1NZTkMpID8KKwkJICAgICAgInN5bmMnZWQiIDogIm5vc3luYyIpLAorCQkgICAgIChDSEVDS19GTEFHIChyaW5mby0+ZmxhZywgSVNJU19ST1VURV9GTEFHX0FDVElWRSkgPworCQkgICAgICAiYWN0aXZlIiA6ICJpbmFjdGl2ZSIpLCBidWZmKTsKKwl9CisKKyAgICAgIGlzaXNfemVicmFfcm91dGVfdXBkYXRlICgmcm9kZS0+cCwgcmluZm8pOworICAgICAgaWYgKCFDSEVDS19GTEFHIChyaW5mby0+ZmxhZywgSVNJU19ST1VURV9GTEFHX0FDVElWRSkpCisJaXNpc19yb3V0ZV9kZWxldGUgKCZyb2RlLT5wLCBhcmVhLT5yb3V0ZV90YWJsZSk7CiAgICAgfQotICAgIAotICAgIGlzaXNfemVicmFfcm91dGVfdXBkYXRlICgmcm9kZS0+cCwgcmluZm8pOwotICAgIGlmICghQ0hFQ0tfRkxBRyAocmluZm8tPmZsYWcsIElTSVNfUk9VVEVfRkxBR19BQ1RJVkUpKQotICAgICAgaXNpc19yb3V0ZV9kZWxldGUgKCZyb2RlLT5wLCBhcmVhLT5yb3V0ZV90YWJsZSk7Ci0gIH0KICNpZmRlZiBIQVZFX0lQVjYKICAgaWYgKHY2ZG9uZSkKICAgICByZXR1cm4gSVNJU19PSzsKZGlmZiAtLWdpdCBhL2lzaXNkL2lzaXNfcm91dGUuaCBiL2lzaXNkL2lzaXNfcm91dGUuaAppbmRleCA3MTM3OTQ4Li41OWI2YzIyIDEwMDY0NAotLS0gYS9pc2lzZC9pc2lzX3JvdXRlLmgKKysrIGIvaXNpc2QvaXNpc19yb3V0ZS5oCkBAIC0yNiwzNSArMjYsMzggQEAKICNkZWZpbmUgX1pFQlJBX0lTSVNfUk9VVEVfSAogCiAjaWZkZWYgSEFWRV9JUFY2Ci1zdHJ1Y3QgaXNpc19uZXh0aG9wNiB7CitzdHJ1Y3QgaXNpc19uZXh0aG9wNgorewogICB1bnNpZ25lZCBpbnQgaWZpbmRleDsKICAgc3RydWN0IGluNl9hZGRyIGlwNjsKICAgdW5zaWduZWQgaW50IGxvY2s7CiB9OwogI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwogCi1zdHJ1Y3QgaXNpc19uZXh0aG9wIHsKK3N0cnVjdCBpc2lzX25leHRob3AKK3sKICAgdW5zaWduZWQgaW50IGlmaW5kZXg7CiAgIHN0cnVjdCBpbl9hZGRyIGlwOwogICB1bnNpZ25lZCBpbnQgbG9jazsKIH07CiAKLXN0cnVjdCBpc2lzX3JvdXRlX2luZm8geworc3RydWN0IGlzaXNfcm91dGVfaW5mbworewogI2RlZmluZSBJU0lTX1JPVVRFX0ZMQUdfWkVCUkFfU1lOQyAweDAxCiAjZGVmaW5lIElTSVNfUk9VVEVfRkxBR19BQ1RJVkUgICAgIDB4MDIKLSAgdV9jaGFyIGZsYWc7IAorICB1X2NoYXIgZmxhZzsKICAgdV9pbnQzMl90IGNvc3Q7CiAgIHVfaW50MzJfdCBkZXB0aDsKICAgc3RydWN0IGxpc3QgKm5leHRob3BzOwogI2lmZGVmIEhBVkVfSVBWNgogICBzdHJ1Y3QgbGlzdCAqbmV4dGhvcHM2OwotI2VuZGlmIC8qIEhBVkVfSVBWNiAqLworI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAqLwogfTsKIAotc3RydWN0IGlzaXNfcm91dGVfaW5mbyAqaXNpc19yb3V0ZV9jcmVhdGUgKHN0cnVjdCBwcmVmaXggKnByZWZpeCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQzMl90IGNvc3QsIHVfaW50MzJfdCBkZXB0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbGlzdCAqYWRqYWNlbmNpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlzaXNfYXJlYSAqYXJlYSk7CitzdHJ1Y3QgaXNpc19yb3V0ZV9pbmZvICppc2lzX3JvdXRlX2NyZWF0ZSAoc3RydWN0IHByZWZpeCAqcHJlZml4LAorCQkJCQkgICB1X2ludDMyX3QgY29zdCwgdV9pbnQzMl90IGRlcHRoLAorCQkJCQkgICBzdHJ1Y3QgbGlzdCAqYWRqYWNlbmNpZXMsCisJCQkJCSAgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWEpOwogCiBpbnQgaXNpc19yb3V0ZV92YWxpZGF0ZSAoc3RydWN0IHRocmVhZCAqdGhyZWFkKTsKIApkaWZmIC0tZ2l0IGEvaXNpc2QvaXNpc19yb3V0ZW1hcC5jIGIvaXNpc2QvaXNpc19yb3V0ZW1hcC5jCmluZGV4IDlhOGRmNjEuLjU2ZTQ0YjggMTAwNjQ0Ci0tLSBhL2lzaXNkL2lzaXNfcm91dGVtYXAuYworKysgYi9pc2lzZC9pc2lzX3JvdXRlbWFwLmMKQEAgLTUyLDQ4ICs1Miw0OSBAQAogZXh0ZXJuIHN0cnVjdCBpc2lzICppc2lzOwogCiB2b2lkCi1pc2lzX3JvdXRlX21hcF91cGQoKQoraXNpc19yb3V0ZV9tYXBfdXBkICgpCiB7CiAgIGludCBpID0gMDsKLSAgCisKICAgaWYgKCFpc2lzKQogICAgIHJldHVybjsKLSAgCi0gIGZvciAoaSA9IDA7IGkgPD0gWkVCUkFfUk9VVEVfTUFYOyBpKyspIHsKLSAgICBpZiAoaXNpcy0+cm1hcFtpXS5uYW1lKQotICAgICAgaXNpcy0+cm1hcFtpXS5tYXAgPSAgaXNpcy0+cm1hcFtpXS5tYXAgPSAKLSAgICAgICAgcm91dGVfbWFwX2xvb2t1cF9ieV9uYW1lIChpc2lzLT5ybWFwW2ldLm5hbWUpOwotICAgIGVsc2UKLSAgICAgIGlzaXMtPnJtYXBbaV0ubWFwID0gTlVMTDsKLSAgfQorCisgIGZvciAoaSA9IDA7IGkgPD0gWkVCUkFfUk9VVEVfTUFYOyBpKyspCisgICAgeworICAgICAgaWYgKGlzaXMtPnJtYXBbaV0ubmFtZSkKKwlpc2lzLT5ybWFwW2ldLm1hcCA9IGlzaXMtPnJtYXBbaV0ubWFwID0KKwkgIHJvdXRlX21hcF9sb29rdXBfYnlfbmFtZSAoaXNpcy0+cm1hcFtpXS5uYW1lKTsKKyAgICAgIGVsc2UKKwlpc2lzLT5ybWFwW2ldLm1hcCA9IE5VTEw7CisgICAgfQogICAvKiBGSVhNRTogZG8gdGhlIGFkZHJlc3MgZmFtaWx5IHN1Yi1tb2RlIEFGX0lORVQ2IGhlcmUgPyAqLwogfQogCiB2b2lkCi1pc2lzX3JvdXRlX21hcF9ldmVudChyb3V0ZV9tYXBfZXZlbnRfdCBldmVudCwgY2hhciAqbmFtZSkKK2lzaXNfcm91dGVfbWFwX2V2ZW50IChyb3V0ZV9tYXBfZXZlbnRfdCBldmVudCwgY2hhciAqbmFtZSkKIHsKICAgaW50IHR5cGU7CiAKICAgaWYgKCFpc2lzKQogICAgIHJldHVybjsKIAotICBmb3IgKHR5cGUgPSAwOyB0eXBlIDw9IFpFQlJBX1JPVVRFX01BWDsgdHlwZSsrKSB7Ci0gICAgaWYgKGlzaXMtPnJtYXBbdHlwZV0ubmFtZSAmJiAgaXNpcy0+cm1hcFt0eXBlXS5tYXAgJiYgCi0gICAgICAgICFzdHJjbXAgKGlzaXMtPnJtYXBbdHlwZV0ubmFtZSwgbmFtZSkpIHsKLSAgICAgIGlzaXNfZGlzdHJpYnV0ZV9saXN0X3VwZGF0ZSAodHlwZSk7CisgIGZvciAodHlwZSA9IDA7IHR5cGUgPD0gWkVCUkFfUk9VVEVfTUFYOyB0eXBlKyspCisgICAgeworICAgICAgaWYgKGlzaXMtPnJtYXBbdHlwZV0ubmFtZSAmJiBpc2lzLT5ybWFwW3R5cGVdLm1hcCAmJgorCSAgIXN0cmNtcCAoaXNpcy0+cm1hcFt0eXBlXS5uYW1lLCBuYW1lKSkKKwl7CisJICBpc2lzX2Rpc3RyaWJ1dGVfbGlzdF91cGRhdGUgKHR5cGUpOworCX0KICAgICB9Ci0gIH0gIAogfQogCi0KIHZvaWQKIGlzaXNfcm91dGVfbWFwX2luaXQgKHZvaWQpCiB7CiAgIHJvdXRlX21hcF9pbml0ICgpOwogICByb3V0ZV9tYXBfaW5pdF92dHkgKCk7Ci0gIAorCiAgIHJvdXRlX21hcF9hZGRfaG9vayAoaXNpc19yb3V0ZV9tYXBfdXBkKTsKICAgcm91dGVfbWFwX2RlbGV0ZV9ob29rIChpc2lzX3JvdXRlX21hcF91cGQpOwogICByb3V0ZV9tYXBfZXZlbnRfaG9vayAoaXNpc19yb3V0ZV9tYXBfZXZlbnQpOwotCiB9CmRpZmYgLS1naXQgYS9pc2lzZC9pc2lzX3NwZi5jIGIvaXNpc2QvaXNpc19zcGYuYwppbmRleCAxZTQxNGM2Li5iZDc5NjU5IDEwMDY0NAotLS0gYS9pc2lzZC9pc2lzX3NwZi5jCisrKyBiL2lzaXNkL2lzaXNfc3BmLmMKQEAgLTYwLDczICs2MCw4MSBAQAogCiAvKiBwZXJmb3JtYWNlIGlzc3VlID8/Pz8gKi8KIHZvaWQKLXVuaW9uX2Fkamxpc3QoIHN0cnVjdCBsaXN0ICp0YXJnZXQsIHN0cnVjdCBsaXN0ICpzb3VyY2UgKQordW5pb25fYWRqbGlzdCAoc3RydWN0IGxpc3QgKnRhcmdldCwgc3RydWN0IGxpc3QgKnNvdXJjZSkKIHsKICAgc3RydWN0IGlzaXNfYWRqYWNlbmN5ICphZGosICphZGoyOwogICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGUsICpub2RlMjsKLSAgCisKICAgemxvZ19pbmZvICgiVW5pb24gYWRqbGlzdCEiKTsKLSAgZm9yIChub2RlID0gbGlzdGhlYWQgKHNvdXJjZSk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgewotICAgIGFkaiA9IGdldGRhdGEgKG5vZGUpOwotICAgIAotICAgIC8qIGxvb2t1cCBhZGphY2VuY3kgaW4gdGhlIHNvdXJjZSBsaXN0ICovCi0gICAgZm9yIChub2RlMiA9IGxpc3RoZWFkICh0YXJnZXQpOyBub2RlMjsgbmV4dG5vZGUgKG5vZGUyKSkgewotICAgICAgYWRqMiA9IGdldGRhdGEobm9kZTIpOwotICAgICAgaWYgKGFkaiA9PSBhZGoyKSBicmVhazsKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKHNvdXJjZSk7IG5vZGU7IG5leHRub2RlIChub2RlKSkKKyAgICB7CisgICAgICBhZGogPSBnZXRkYXRhIChub2RlKTsKKworICAgICAgLyogbG9va3VwIGFkamFjZW5jeSBpbiB0aGUgc291cmNlIGxpc3QgKi8KKyAgICAgIGZvciAobm9kZTIgPSBsaXN0aGVhZCAodGFyZ2V0KTsgbm9kZTI7IG5leHRub2RlIChub2RlMikpCisJeworCSAgYWRqMiA9IGdldGRhdGEgKG5vZGUyKTsKKwkgIGlmIChhZGogPT0gYWRqMikKKwkgICAgYnJlYWs7CisJfQorCisgICAgICBpZiAoIW5vZGUyKQorCWxpc3Rub2RlX2FkZCAodGFyZ2V0LCBhZGopOwogICAgIH0KLSAgICAKLSAgICBpZiAoIW5vZGUyKSBsaXN0bm9kZV9hZGQgKHRhcmdldCwgYWRqKTsKLSAgfQogfQogCi0KIC8qIDcuMi43ICovCi12b2lkICAgICAgCit2b2lkCiByZW1vdmVfZXhjZXNzX2FkanMgKHN0cnVjdCBsaXN0ICphZGpzKQogewogICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGUsICpleGNlc3MgPSBOVUxMOwogICBzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKmFkaiwgKmNhbmRpZGF0ZSA9IE5VTEw7CiAgIGludCBjb21wOwogCi0gIGZvciAobm9kZSA9IGxpc3RoZWFkIChhZGpzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7Ci0gICAgaWYgKGV4Y2VzcyA9PSBOVUxMKSAKLSAgICAgIGV4Y2VzcyA9IG5vZGU7Ci0gICAgY2FuZGlkYXRlID0gZ2V0ZGF0YSAoZXhjZXNzKTsKLSAgICBhZGogPSBnZXRkYXRhIChub2RlKTsKLSAgICBpZiAoY2FuZGlkYXRlLT5zeXNfdHlwZSA8IGFkai0+c3lzX3R5cGUpIHsKLSAgICAgIGV4Y2VzcyA9IG5vZGU7Ci0gICAgICBjYW5kaWRhdGUgPSBhZGo7Ci0gICAgICBjb250aW51ZTsKLSAgICB9IAotICAgIGlmIChjYW5kaWRhdGUtPnN5c190eXBlID4gYWRqLT5zeXNfdHlwZSkKLSAgICAgIGNvbnRpbnVlOwotICAgIAotICAgIGNvbXAgPSBtZW1jbXAgKGNhbmRpZGF0ZS0+c3lzaWQsIGFkai0+c3lzaWQsIElTSVNfU1lTX0lEX0xFTik7Ci0gICAgaWYgKGNvbXAgPiAwKSB7Ci0gICAgICBleGNlc3MgPSBub2RlOwotICAgICAgY2FuZGlkYXRlID0gYWRqOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChjb21wIDwgMCkKLSAgICAgIGNvbnRpbnVlOwotICAgIAotICAgIGlmIChjYW5kaWRhdGUtPmNpcmN1aXQtPmNpcmN1aXRfaWQgPiBhZGotPmNpcmN1aXQtPmNpcmN1aXRfaWQpIHsKLSAgICAgIGV4Y2VzcyA9IG5vZGU7Ci0gICAgICBjYW5kaWRhdGUgPSBhZGo7Ci0gICAgICBjb250aW51ZTsKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGFkanMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisgICAgeworICAgICAgaWYgKGV4Y2VzcyA9PSBOVUxMKQorCWV4Y2VzcyA9IG5vZGU7CisgICAgICBjYW5kaWRhdGUgPSBnZXRkYXRhIChleGNlc3MpOworICAgICAgYWRqID0gZ2V0ZGF0YSAobm9kZSk7CisgICAgICBpZiAoY2FuZGlkYXRlLT5zeXNfdHlwZSA8IGFkai0+c3lzX3R5cGUpCisJeworCSAgZXhjZXNzID0gbm9kZTsKKwkgIGNhbmRpZGF0ZSA9IGFkajsKKwkgIGNvbnRpbnVlOworCX0KKyAgICAgIGlmIChjYW5kaWRhdGUtPnN5c190eXBlID4gYWRqLT5zeXNfdHlwZSkKKwljb250aW51ZTsKKworICAgICAgY29tcCA9IG1lbWNtcCAoY2FuZGlkYXRlLT5zeXNpZCwgYWRqLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOKTsKKyAgICAgIGlmIChjb21wID4gMCkKKwl7CisJICBleGNlc3MgPSBub2RlOworCSAgY2FuZGlkYXRlID0gYWRqOworCSAgY29udGludWU7CisJfQorICAgICAgaWYgKGNvbXAgPCAwKQorCWNvbnRpbnVlOworCisgICAgICBpZiAoY2FuZGlkYXRlLT5jaXJjdWl0LT5jaXJjdWl0X2lkID4gYWRqLT5jaXJjdWl0LT5jaXJjdWl0X2lkKQorCXsKKwkgIGV4Y2VzcyA9IG5vZGU7CisJICBjYW5kaWRhdGUgPSBhZGo7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGlmIChjYW5kaWRhdGUtPmNpcmN1aXQtPmNpcmN1aXRfaWQgPCBhZGotPmNpcmN1aXQtPmNpcmN1aXRfaWQpCisJY29udGludWU7CisKKyAgICAgIGNvbXAgPSBtZW1jbXAgKGNhbmRpZGF0ZS0+c25wYSwgYWRqLT5zbnBhLCBFVEhfQUxFTik7CisgICAgICBpZiAoY29tcCA+IDApCisJeworCSAgZXhjZXNzID0gbm9kZTsKKwkgIGNhbmRpZGF0ZSA9IGFkajsKKwkgIGNvbnRpbnVlOworCX0KICAgICB9CiAKLSAgICBpZiAoY2FuZGlkYXRlLT5jaXJjdWl0LT5jaXJjdWl0X2lkIDwgYWRqLT5jaXJjdWl0LT5jaXJjdWl0X2lkKQotICAgICAgY29udGludWU7Ci0gICAgCi0gICAgY29tcCA9IG1lbWNtcCAoY2FuZGlkYXRlLT5zbnBhLCBhZGotPnNucGEsIEVUSF9BTEVOKTsKLSAgICBpZiAoY29tcCA+IDApIHsKLSAgICAgIGV4Y2VzcyA9IG5vZGU7Ci0gICAgICBjYW5kaWRhdGUgPSBhZGo7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gIH0KLSAgCiAgIGxpc3RfZGVsZXRlX25vZGUgKGFkanMsIGV4Y2Vzcyk7CiAKICAgcmV0dXJuOwpAQCAtMTM1LDU5ICsxNDMsNjEgQEAKIGNvbnN0IGNoYXIgKgogdnR5cGUyc3RyaW5nIChlbnVtIHZlcnRleHR5cGUgdnR5cGUpCiB7Ci0gIHN3aXRjaCAodnR5cGUpIHsKLSAgY2FzZSAgVlRZUEVfUFNFVURPX0lTOgotICAgIHJldHVybiAicHNldWRvX0lTIjsKLSAgICBicmVhazsKLSAgY2FzZSBWVFlQRV9OT05QU0VVRE9fSVM6Ci0gICAgcmV0dXJuICJJUyI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVlRZUEVfRVM6Ci0gICAgcmV0dXJuICJFUyI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVlRZUEVfSVBSRUFDSF9JTlRFUk5BTDoKLSAgICByZXR1cm4gIklQIGludGVybmFsIjsKLSAgICBicmVhazsKLSAgY2FzZSBWVFlQRV9JUFJFQUNIX0VYVEVSTkFMOgotICAgIHJldHVybiAiSVAgZXh0ZXJuYWwiOwotICAgIGJyZWFrOworICBzd2l0Y2ggKHZ0eXBlKQorICAgIHsKKyAgICBjYXNlIFZUWVBFX1BTRVVET19JUzoKKyAgICAgIHJldHVybiAicHNldWRvX0lTIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVlRZUEVfTk9OUFNFVURPX0lTOgorICAgICAgcmV0dXJuICJJUyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFZUWVBFX0VTOgorICAgICAgcmV0dXJuICJFUyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFZUWVBFX0lQUkVBQ0hfSU5URVJOQUw6CisgICAgICByZXR1cm4gIklQIGludGVybmFsIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVlRZUEVfSVBSRUFDSF9FWFRFUk5BTDoKKyAgICAgIHJldHVybiAiSVAgZXh0ZXJuYWwiOworICAgICAgYnJlYWs7CiAjaWZkZWYgSEFWRV9JUFY2Ci0gIGNhc2UgVlRZUEVfSVA2UkVBQ0hfSU5URVJOQUw6Ci0gICAgcmV0dXJuICJJUDYgaW50ZXJuYWwiOwotICAgIGJyZWFrOwotICBjYXNlIFZUWVBFX0lQNlJFQUNIX0VYVEVSTkFMOgotICAgIHJldHVybiAiSVA2IGV4dGVybmFsIjsKLSAgICBicmVhazsKLSNlbmRpZiAvKiBIQVZFX0lQVjYgKi8gCi0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuICJVTktOT1dOIjsKLSAgfQotICByZXR1cm4gTlVMTDsgLyogTm90IHJlYWNoZWQgKi8KKyAgICBjYXNlIFZUWVBFX0lQNlJFQUNIX0lOVEVSTkFMOgorICAgICAgcmV0dXJuICJJUDYgaW50ZXJuYWwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWVFlQRV9JUDZSRUFDSF9FWFRFUk5BTDoKKyAgICAgIHJldHVybiAiSVA2IGV4dGVybmFsIjsKKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIEhBVkVfSVBWNiAqLworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gIlVOS05PV04iOworICAgIH0KKyAgcmV0dXJuIE5VTEw7CQkJLyogTm90IHJlYWNoZWQgKi8KIH0KIAogY2hhciAqCi12aWQyc3RyaW5nIChzdHJ1Y3QgaXNpc192ZXJ0ZXggKnZlcnRleCwgdV9jaGFyICpidWZmKQordmlkMnN0cmluZyAoc3RydWN0IGlzaXNfdmVydGV4ICp2ZXJ0ZXgsIHVfY2hhciAqIGJ1ZmYpCiB7Ci0gIHN3aXRjaCAodmVydGV4LT50eXBlKSB7Ci0gIGNhc2UgIFZUWVBFX1BTRVVET19JUzoKLSAgICByZXR1cm4gcmF3bHNwaWRfcHJpbnQgKHZlcnRleC0+Ti5pZCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVlRZUEVfTk9OUFNFVURPX0lTOgotICBjYXNlIFZUWVBFX0VTOgotICAgIHJldHVybiBzeXNpZF9wcmludCAodmVydGV4LT5OLmlkKTsKLSAgICBicmVhazsKLSAgY2FzZSBWVFlQRV9JUFJFQUNIX0lOVEVSTkFMOgotICBjYXNlIFZUWVBFX0lQUkVBQ0hfRVhURVJOQUw6CisgIHN3aXRjaCAodmVydGV4LT50eXBlKQorICAgIHsKKyAgICBjYXNlIFZUWVBFX1BTRVVET19JUzoKKyAgICAgIHJldHVybiByYXdsc3BpZF9wcmludCAodmVydGV4LT5OLmlkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVlRZUEVfTk9OUFNFVURPX0lTOgorICAgIGNhc2UgVlRZUEVfRVM6CisgICAgICByZXR1cm4gc3lzaWRfcHJpbnQgKHZlcnRleC0+Ti5pZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFZUWVBFX0lQUkVBQ0hfSU5URVJOQUw6CisgICAgY2FzZSBWVFlQRV9JUFJFQUNIX0VYVEVSTkFMOgogI2lmZGVmIEhBVkVfSVBWNgotICBjYXNlIFZUWVBFX0lQNlJFQUNIX0lOVEVSTkFMOgotICBjYXNlIFZUWVBFX0lQNlJFQUNIX0VYVEVSTkFMOgotI2VuZGlmIC8qIEhBVkVfSVBWNiAqLyAKLSAgICBwcmVmaXgyc3RyICgoc3RydWN0IHByZWZpeCAqKSZ2ZXJ0ZXgtPk4ucHJlZml4LCBidWZmLCBCVUZTSVopOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIHJldHVybiAiVU5LTk9XTiI7Ci0gIH0KLSAgCisgICAgY2FzZSBWVFlQRV9JUDZSRUFDSF9JTlRFUk5BTDoKKyAgICBjYXNlIFZUWVBFX0lQNlJFQUNIX0VYVEVSTkFMOgorI2VuZGlmIC8qIEhBVkVfSVBWNiAqLworICAgICAgcHJlZml4MnN0ciAoKHN0cnVjdCBwcmVmaXggKikgJnZlcnRleC0+Ti5wcmVmaXgsIGJ1ZmYsIEJVRlNJWik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJVTktOT1dOIjsKKyAgICB9CisKICAgcmV0dXJuIGJ1ZmY7CiB9CiAKQEAgLTE5NywzNiArMjA3LDM1IEBACiAgIHN0cnVjdCBpc2lzX3NwZnRyZWUgKnRyZWU7CiAKICAgdHJlZSA9IFhNQUxMT0MgKE1UWVBFX0lTSVNfU1BGVFJFRSwgc2l6ZW9mIChzdHJ1Y3QgaXNpc19zcGZ0cmVlKSk7Ci0gIGlmICh0cmVlID09IE5VTEwpIHsKLSAgICB6bG9nX2VyciAoIklTSVMtU3BmOiBpc2lzX3NwZnRyZWVfbmV3IE91dCBvZiBtZW1vcnkhIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0gCisgIGlmICh0cmVlID09IE5VTEwpCisgICAgeworICAgICAgemxvZ19lcnIgKCJJU0lTLVNwZjogaXNpc19zcGZ0cmVlX25ldyBPdXQgb2YgbWVtb3J5ISIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICBtZW1zZXQgKHRyZWUsIDAsIHNpemVvZiAoc3RydWN0IGlzaXNfc3BmdHJlZSkpOwogCiAgIHRyZWUtPnRlbnRzID0gbGlzdF9uZXcgKCk7Ci0gIHRyZWUtPnBhdGhzICA9IGxpc3RfbmV3ICgpOworICB0cmVlLT5wYXRocyA9IGxpc3RfbmV3ICgpOwogICByZXR1cm4gdHJlZTsKIH0KIAogdm9pZAogaXNpc192ZXJ0ZXhfZGVsIChzdHJ1Y3QgaXNpc192ZXJ0ZXggKnZlcnRleCkKIHsKLSAgCiAgIGxpc3RfZGVsZXRlICh2ZXJ0ZXgtPkFkal9OKTsKIAogICBYRlJFRSAoTVRZUEVfSVNJU19WRVJURVgsIHZlcnRleCk7Ci0gIAorCiAgIHJldHVybjsKIH0KIAogdm9pZAogaXNpc19zcGZ0cmVlX2RlbCAoc3RydWN0IGlzaXNfc3BmdHJlZSAqc3BmdHJlZSkKIHsKLQotICBzcGZ0cmVlLT50ZW50cy0+ZGVsID0gKHZvaWQgKilpc2lzX3ZlcnRleF9kZWw7CisgIHNwZnRyZWUtPnRlbnRzLT5kZWwgPSAodm9pZCAqKSBpc2lzX3ZlcnRleF9kZWw7CiAgIGxpc3RfZGVsZXRlIChzcGZ0cmVlLT50ZW50cyk7Ci0gIAotICBzcGZ0cmVlLT5wYXRocy0+ZGVsID0gKHZvaWQgKilpc2lzX3ZlcnRleF9kZWw7CisKKyAgc3BmdHJlZS0+cGF0aHMtPmRlbCA9ICh2b2lkICopIGlzaXNfdmVydGV4X2RlbDsKICAgbGlzdF9kZWxldGUgKHNwZnRyZWUtPnBhdGhzKTsKIAogICBYRlJFRSAoTVRZUEVfSVNJU19TUEZUUkVFLCBzcGZ0cmVlKTsKQEAgLTIzNCwyOCArMjQzLDI5IEBACiAgIHJldHVybjsKIH0KIAotdm9pZCAKK3ZvaWQKIHNwZnRyZWVfYXJlYV9pbml0IChzdHJ1Y3QgaXNpc19hcmVhICphcmVhKQogewotCi0gIGlmICgoYXJlYS0+aXNfdHlwZSAmIElTX0xFVkVMXzEpICYmIGFyZWEtPnNwZnRyZWVbMF0gPT0gTlVMTCkgewotICAgIGFyZWEtPnNwZnRyZWVbMF0gPSBpc2lzX3NwZnRyZWVfbmV3ICgpOworICBpZiAoKGFyZWEtPmlzX3R5cGUgJiBJU19MRVZFTF8xKSAmJiBhcmVhLT5zcGZ0cmVlWzBdID09IE5VTEwpCisgICAgeworICAgICAgYXJlYS0+c3BmdHJlZVswXSA9IGlzaXNfc3BmdHJlZV9uZXcgKCk7CiAjaWZkZWYgSEFWRV9JUFY2Ci0gICAgYXJlYS0+c3BmdHJlZTZbMF0gPSBpc2lzX3NwZnRyZWVfbmV3ICgpOworICAgICAgYXJlYS0+c3BmdHJlZTZbMF0gPSBpc2lzX3NwZnRyZWVfbmV3ICgpOwogI2VuZGlmCiAKLSAgICAvKiAgICB0aHJlYWRfYWRkX3RpbWVyIChtYXN0ZXIsIGlzaXNfcnVuX3NwZl9sMSwgYXJlYSwgCi0gICAgICAgICAgaXNpc19qaXR0ZXIgKFBFUklPRElDX1NQRl9JTlRFUlZBTCwgMTApKTsgKi8KLSAgfQotICAKLSAgaWYgKChhcmVhLT5pc190eXBlICYgSVNfTEVWRUxfMikgJiYgYXJlYS0+c3BmdHJlZVsxXSA9PSBOVUxMKSB7Ci0gICAgYXJlYS0+c3BmdHJlZVsxXSA9IGlzaXNfc3BmdHJlZV9uZXcgKCk7CisgICAgICAvKiAgICB0aHJlYWRfYWRkX3RpbWVyIChtYXN0ZXIsIGlzaXNfcnVuX3NwZl9sMSwgYXJlYSwgCisgICAgICAgICBpc2lzX2ppdHRlciAoUEVSSU9ESUNfU1BGX0lOVEVSVkFMLCAxMCkpOyAqLworICAgIH0KKworICBpZiAoKGFyZWEtPmlzX3R5cGUgJiBJU19MRVZFTF8yKSAmJiBhcmVhLT5zcGZ0cmVlWzFdID09IE5VTEwpCisgICAgeworICAgICAgYXJlYS0+c3BmdHJlZVsxXSA9IGlzaXNfc3BmdHJlZV9uZXcgKCk7CiAjaWZkZWYgSEFWRV9JUFY2Ci0gICAgYXJlYS0+c3BmdHJlZTZbMV0gPSBpc2lzX3NwZnRyZWVfbmV3ICgpOworICAgICAgYXJlYS0+c3BmdHJlZTZbMV0gPSBpc2lzX3NwZnRyZWVfbmV3ICgpOwogI2VuZGlmCi0gICAgLyogICAgdGhyZWFkX2FkZF90aW1lciAobWFzdGVyLCBpc2lzX3J1bl9zcGZfbDIsIGFyZWEsIAotICAgICAgICAgIGlzaXNfaml0dGVyIChQRVJJT0RJQ19TUEZfSU5URVJWQUwsIDEwKSk7ICovCi0gIH0KKyAgICAgIC8qICAgIHRocmVhZF9hZGRfdGltZXIgKG1hc3RlciwgaXNpc19ydW5fc3BmX2wyLCBhcmVhLCAKKyAgICAgICAgIGlzaXNfaml0dGVyIChQRVJJT0RJQ19TUEZfSU5URVJWQUwsIDEwKSk7ICovCisgICAgfQogCiAgIHJldHVybjsKIH0KQEAgLTI2NiwzNiArMjc2LDM4IEBACiAgIHN0cnVjdCBpc2lzX3ZlcnRleCAqdmVydGV4OwogCiAgIHZlcnRleCA9IFhNQUxMT0MgKE1UWVBFX0lTSVNfVkVSVEVYLCBzaXplb2YgKHN0cnVjdCBpc2lzX3ZlcnRleCkpOwotICBpZiAodmVydGV4ID09IE5VTEwpIHsKLSAgICB6bG9nX2VyciAoImlzaXNfdmVydGV4X25ldyBPdXQgb2YgbWVtb3J5ISIpOwotICAgIHJldHVybiBOVUxMOwotICB9IAotICAKKyAgaWYgKHZlcnRleCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHpsb2dfZXJyICgiaXNpc192ZXJ0ZXhfbmV3IE91dCBvZiBtZW1vcnkhIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKICAgbWVtc2V0ICh2ZXJ0ZXgsIDAsIHNpemVvZiAoc3RydWN0IGlzaXNfdmVydGV4KSk7CiAgIHZlcnRleC0+dHlwZSA9IHZ0eXBlOwotICBzd2l0Y2ggKHZ0eXBlKSB7Ci0gIGNhc2UgVlRZUEVfRVM6Ci0gIGNhc2UgVlRZUEVfTk9OUFNFVURPX0lTOgotICAgIG1lbWNweSAodmVydGV4LT5OLmlkLCAodV9jaGFyICopaWQsIElTSVNfU1lTX0lEX0xFTik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVlRZUEVfUFNFVURPX0lTOgotICAgIG1lbWNweSAodmVydGV4LT5OLmlkLCAodV9jaGFyICopaWQsIElTSVNfU1lTX0lEX0xFTiArIDEpOwotICAgIGJyZWFrOwotICBjYXNlIFZUWVBFX0lQUkVBQ0hfSU5URVJOQUw6Ci0gIGNhc2UgVlRZUEVfSVBSRUFDSF9FWFRFUk5BTDoKKyAgc3dpdGNoICh2dHlwZSkKKyAgICB7CisgICAgY2FzZSBWVFlQRV9FUzoKKyAgICBjYXNlIFZUWVBFX05PTlBTRVVET19JUzoKKyAgICAgIG1lbWNweSAodmVydGV4LT5OLmlkLCAodV9jaGFyICopIGlkLCBJU0lTX1NZU19JRF9MRU4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWVFlQRV9QU0VVRE9fSVM6CisgICAgICBtZW1jcHkgKHZlcnRleC0+Ti5pZCwgKHVfY2hhciAqKSBpZCwgSVNJU19TWVNfSURfTEVOICsgMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFZUWVBFX0lQUkVBQ0hfSU5URVJOQUw6CisgICAgY2FzZSBWVFlQRV9JUFJFQUNIX0VYVEVSTkFMOgogI2lmZGVmIEhBVkVfSVBWNgotICBjYXNlIFZUWVBFX0lQNlJFQUNIX0lOVEVSTkFMOgotICBjYXNlIFZUWVBFX0lQNlJFQUNIX0VYVEVSTkFMOgotI2VuZGlmIC8qIEhBVkVfSVBWNiAqLyAKLSAgICBtZW1jcHkgKCZ2ZXJ0ZXgtPk4ucHJlZml4LCAoc3RydWN0IHByZWZpeCAqKWlkLCAKLSAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IHByZWZpeCkpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIHpsb2dfZXJyICgiV1RGISIpOwotICB9CisgICAgY2FzZSBWVFlQRV9JUDZSRUFDSF9JTlRFUk5BTDoKKyAgICBjYXNlIFZUWVBFX0lQNlJFQUNIX0VYVEVSTkFMOgorI2VuZGlmIC8qIEhBVkVfSVBWNiAqLworICAgICAgbWVtY3B5ICgmdmVydGV4LT5OLnByZWZpeCwgKHN0cnVjdCBwcmVmaXggKikgaWQsCisJICAgICAgc2l6ZW9mIChzdHJ1Y3QgcHJlZml4KSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgemxvZ19lcnIgKCJXVEYhIik7CisgICAgfQogCiAgIHZlcnRleC0+QWRqX04gPSBsaXN0X25ldyAoKTsKLSAgCisKICAgcmV0dXJuIHZlcnRleDsKIH0KIApAQCAtMzA0LDcgKzMxNiw3IEBACiAgKi8KIHZvaWQKIGlzaXNfc3BmX2FkZF9zZWxmIChzdHJ1Y3QgaXNpc19zcGZ0cmVlICpzcGZ0cmVlLCBzdHJ1Y3QgaXNpc19hcmVhICphcmVhLAotICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCkKKwkJICAgaW50IGxldmVsKQogewogICBzdHJ1Y3QgaXNpc192ZXJ0ZXggKnZlcnRleDsKICAgc3RydWN0IGlzaXNfbHNwICpsc3A7CkBAIC0zMTMsMTQgKzMyNSwxNCBAQAogICB1X2NoYXIgYnVmZltCVUZTSVpdOwogI2VuZGlmIC8qIEVYVFJFTUVfREVCVUcgKi8KICAgbWVtY3B5IChsc3BpZCwgaXNpcy0+c3lzaWQsIElTSVNfU1lTX0lEX0xFTik7Ci0gIExTUF9QU0VVRE9fSUQobHNwaWQpID0gMDsKLSAgTFNQX0ZSQUdNRU5UKGxzcGlkKSA9IDA7Ci0gIAorICBMU1BfUFNFVURPX0lEIChsc3BpZCkgPSAwOworICBMU1BfRlJBR01FTlQgKGxzcGlkKSA9IDA7CisKICAgbHNwID0gbHNwX3NlYXJjaCAobHNwaWQsIGFyZWEtPmxzcGRiW2xldmVsIC0gMV0pOwotICAKKwogICBpZiAobHNwID09IE5VTEwpCiAgICAgemxvZ193YXJuICgiSVNJUy1TcGY6IGNvdWxkIG5vdCBmaW5kIG93biBsJWQgTFNQISIsIGxldmVsKTsKLSAgCisKICAgdmVydGV4ID0gaXNpc192ZXJ0ZXhfbmV3IChpc2lzLT5zeXNpZCwgVlRZUEVfTk9OUFNFVURPX0lTKTsKICAgdmVydGV4LT5sc3AgPSBsc3A7CiAKQEAgLTMyOCwxNDMgKzM0MCwxNTYgQEAKIAogI2lmZGVmIEVYVFJFTUVfREVCVUcKICAgemxvZ19pbmZvICgiSVNJUy1TcGY6IGFkZGVkIHRoaXMgSVMgICVzICVzIGRlcHRoICVkIGRpc3QgJWQgdG8gUEFUSFMiLAotICAgICAgICAgICAgIHZ0eXBlMnN0cmluZyh2ZXJ0ZXgtPnR5cGUpLCB2aWQyc3RyaW5nKHZlcnRleCwgYnVmZiksCi0gICAgICAgICAgICAgdmVydGV4LT5kZXB0aCwgdmVydGV4LT5kX04pOworCSAgICAgdnR5cGUyc3RyaW5nICh2ZXJ0ZXgtPnR5cGUpLCB2aWQyc3RyaW5nICh2ZXJ0ZXgsIGJ1ZmYpLAorCSAgICAgdmVydGV4LT5kZXB0aCwgdmVydGV4LT5kX04pOwogI2VuZGlmIC8qIEVYVFJFTUVfREVCVUcgKi8KIAogICByZXR1cm47CiB9CiAKIHN0cnVjdCBpc2lzX3ZlcnRleCAqCi1pc2lzX2ZpbmRfdmVydGV4IChzdHJ1Y3QgbGlzdCAqbGlzdCwgdm9pZCAqaWQsIGVudW0gdmVydGV4dHlwZSB2dHlwZSkgCitpc2lzX2ZpbmRfdmVydGV4IChzdHJ1Y3QgbGlzdCAqbGlzdCwgdm9pZCAqaWQsIGVudW0gdmVydGV4dHlwZSB2dHlwZSkKIHsKICAgc3RydWN0IGxpc3Rub2RlICpub2RlOwogICBzdHJ1Y3QgaXNpc192ZXJ0ZXggKnZlcnRleDsKICAgc3RydWN0IHByZWZpeCAqcDEsICpwMjsKIAotICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAobGlzdCk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgewotICAgIHZlcnRleCA9IGdldGRhdGEgKG5vZGUpOwotICAgIGlmICh2ZXJ0ZXgtPnR5cGUgIT0gdnR5cGUpCi0gICAgICBjb250aW51ZTsKLSAgICBzd2l0Y2ggKHZ0eXBlKSB7Ci0gICAgY2FzZSBWVFlQRV9FUzoKLSAgICBjYXNlIFZUWVBFX05PTlBTRVVET19JUzoKLSAgICAgIGlmIChtZW1jbXAgKCh1X2NoYXIgKilpZCwgdmVydGV4LT5OLmlkLCBJU0lTX1NZU19JRF9MRU4pID09IDApCi0gICAgICAgIHJldHVybiB2ZXJ0ZXg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFZUWVBFX1BTRVVET19JUzoKLSAgICAgIGlmIChtZW1jbXAgKCh1X2NoYXIgKilpZCwgdmVydGV4LT5OLmlkLCBJU0lTX1NZU19JRF9MRU4gKyAxKSA9PSAwKQotICAgICAgICByZXR1cm4gdmVydGV4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBWVFlQRV9JUFJFQUNIX0lOVEVSTkFMOgotICAgIGNhc2UgVlRZUEVfSVBSRUFDSF9FWFRFUk5BTDoKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGxpc3QpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisgICAgeworICAgICAgdmVydGV4ID0gZ2V0ZGF0YSAobm9kZSk7CisgICAgICBpZiAodmVydGV4LT50eXBlICE9IHZ0eXBlKQorCWNvbnRpbnVlOworICAgICAgc3dpdGNoICh2dHlwZSkKKwl7CisJY2FzZSBWVFlQRV9FUzoKKwljYXNlIFZUWVBFX05PTlBTRVVET19JUzoKKwkgIGlmIChtZW1jbXAgKCh1X2NoYXIgKikgaWQsIHZlcnRleC0+Ti5pZCwgSVNJU19TWVNfSURfTEVOKSA9PSAwKQorCSAgICByZXR1cm4gdmVydGV4OworCSAgYnJlYWs7CisJY2FzZSBWVFlQRV9QU0VVRE9fSVM6CisJICBpZiAobWVtY21wICgodV9jaGFyICopIGlkLCB2ZXJ0ZXgtPk4uaWQsIElTSVNfU1lTX0lEX0xFTiArIDEpID09IDApCisJICAgIHJldHVybiB2ZXJ0ZXg7CisJICBicmVhazsKKwljYXNlIFZUWVBFX0lQUkVBQ0hfSU5URVJOQUw6CisJY2FzZSBWVFlQRV9JUFJFQUNIX0VYVEVSTkFMOgogI2lmZGVmIEhBVkVfSVBWNgotICAgIGNhc2UgVlRZUEVfSVA2UkVBQ0hfSU5URVJOQUw6Ci0gICAgY2FzZSBWVFlQRV9JUDZSRUFDSF9FWFRFUk5BTDoKKwljYXNlIFZUWVBFX0lQNlJFQUNIX0lOVEVSTkFMOgorCWNhc2UgVlRZUEVfSVA2UkVBQ0hfRVhURVJOQUw6CiAjZW5kaWYgLyogSEFWRV9JUFY2ICovCi0gICAgICBwMSA9IChzdHJ1Y3QgcHJlZml4ICopaWQ7Ci0gICAgICBwMiA9IChzdHJ1Y3QgcHJlZml4ICopJnZlcnRleC0+Ti5pZDsKLSAgICAgIGlmIChwMS0+ZmFtaWx5ID09IHAyLT5mYW1pbHkgJiYgcDEtPnByZWZpeGxlbiA9PSBwMi0+cHJlZml4bGVuICYmCi0gICAgICAgICAgbWVtY21wICgmcDEtPnUucHJlZml4LCAmcDItPnUucHJlZml4LCBQU0laRSAocDEtPnByZWZpeGxlbikpID09IDApCi0gICAgICAgIHJldHVybiB2ZXJ0ZXg7Ci0gICAgICBicmVhazsKKwkgIHAxID0gKHN0cnVjdCBwcmVmaXggKikgaWQ7CisJICBwMiA9IChzdHJ1Y3QgcHJlZml4ICopICZ2ZXJ0ZXgtPk4uaWQ7CisJICBpZiAocDEtPmZhbWlseSA9PSBwMi0+ZmFtaWx5ICYmIHAxLT5wcmVmaXhsZW4gPT0gcDItPnByZWZpeGxlbiAmJgorCSAgICAgIG1lbWNtcCAoJnAxLT51LnByZWZpeCwgJnAyLT51LnByZWZpeCwKKwkJICAgICAgUFNJWkUgKHAxLT5wcmVmaXhsZW4pKSA9PSAwKQorCSAgICByZXR1cm4gdmVydGV4OworCSAgYnJlYWs7CisJfQogICAgIH0KLSAgfQogCiAgIHJldHVybiBOVUxMOwogfQogCi0KLQogLyoKICAqIEFkZCBhIHZlcnRleCB0byBURU5UIHNvcnRlZCBieSBjb3N0IGFuZCBieSB2ZXJ0ZXh0eXBlIG9uIHRpZSBicmVhayBzaXR1YXRpb24KICAqLwogc3RydWN0IGlzaXNfdmVydGV4ICoKLWlzaXNfc3BmX2FkZDJ0ZW50IChzdHJ1Y3QgaXNpc19zcGZ0cmVlICpzcGZ0cmVlLCBlbnVtIHZlcnRleHR5cGUgdnR5cGUsIAotICAgICAgICAgICAgICAgICAgIHZvaWQgKmlkLCBzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKmFkaiwgdV9pbnQxNl90IGNvc3QsCi0gICAgICAgICAgICAgICAgICAgaW50IGRlcHRoLCBpbnQgZmFtaWx5KQoraXNpc19zcGZfYWRkMnRlbnQgKHN0cnVjdCBpc2lzX3NwZnRyZWUgKnNwZnRyZWUsIGVudW0gdmVydGV4dHlwZSB2dHlwZSwKKwkJICAgdm9pZCAqaWQsIHN0cnVjdCBpc2lzX2FkamFjZW5jeSAqYWRqLCB1X2ludDE2X3QgY29zdCwKKwkJICAgaW50IGRlcHRoLCBpbnQgZmFtaWx5KQogewogICBzdHJ1Y3QgaXNpc192ZXJ0ZXggKnZlcnRleCwgKnY7CiAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKLSNpZmRlZiBFWFRSRU1FX0RFQlVHIAorI2lmZGVmIEVYVFJFTUVfREVCVUcKICAgdV9jaGFyIGJ1ZmZbQlVGU0laXTsKICNlbmRpZgogCiAgIHZlcnRleCA9IGlzaXNfdmVydGV4X25ldyAoaWQsIHZ0eXBlKTsKICAgdmVydGV4LT5kX04gPSBjb3N0OwogICB2ZXJ0ZXgtPmRlcHRoID0gZGVwdGg7Ci0gIAorCiAgIGlmIChhZGopCiAgICAgbGlzdG5vZGVfYWRkICh2ZXJ0ZXgtPkFkal9OLCBhZGopOwotI2lmZGVmIEVYVFJFTUVfREVCVUcgCisjaWZkZWYgRVhUUkVNRV9ERUJVRwogICB6bG9nX2luZm8gKCJJU0lTLVNwZjogYWRkIHRvIFRFTlQgICVzICVzIGRlcHRoICVkIGRpc3QgJWQiLAotICAgICAgICAgICAgIHZ0eXBlMnN0cmluZyh2ZXJ0ZXgtPnR5cGUpLCB2aWQyc3RyaW5nKHZlcnRleCwgYnVmZiksCi0gICAgICAgICAgICAgdmVydGV4LT5kZXB0aCwgdmVydGV4LT5kX04pOworCSAgICAgdnR5cGUyc3RyaW5nICh2ZXJ0ZXgtPnR5cGUpLCB2aWQyc3RyaW5nICh2ZXJ0ZXgsIGJ1ZmYpLAorCSAgICAgdmVydGV4LT5kZXB0aCwgdmVydGV4LT5kX04pOwogI2VuZGlmIC8qIEVYVFJFTUVfREVCVUcgKi8KLSAgbGlzdG5vZGVfYWRkIChzcGZ0cmVlLT50ZW50cywgdmVydGV4KTsgCi0gIGlmIChsaXN0X2lzZW1wdHkgKHNwZnRyZWUtPnRlbnRzKSkgewotICAgIGxpc3Rub2RlX2FkZCAoc3BmdHJlZS0+dGVudHMsIHZlcnRleCk7IAotICAgIHJldHVybiB2ZXJ0ZXg7Ci0gIH0KLSAgZm9yIChub2RlID0gbGlzdGhlYWQgKHNwZnRyZWUtPnRlbnRzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7Ci0gICAgdiA9IGdldGRhdGEgKG5vZGUpOwotICAgIGlmICh2LT5kX04gPiB2ZXJ0ZXgtPmRfTikgewotICAgICAgbGlzdF9hZGRfbm9kZV9wcmV2IChzcGZ0cmVlLT50ZW50cywgbm9kZSwgdmVydGV4KTsKLSAgICAgIGJyZWFrOwotICAgIH0gZWxzZSBpZiAodi0+ZF9OID09IHZlcnRleC0+ZF9OKSB7Ci0gICAgICAvKiAgVGllIGJyZWFrLCBhZGQgYWNjb3JkaW5nIHRvIHR5cGUgKi8KLSAgICAgIHdoaWxlICh2ICAmJiB2LT5kX04gPT0gdmVydGV4LT5kX04gJiYgdi0+dHlwZSA+IHZlcnRleC0+dHlwZSkgewotICAgICAgICBpZiAodi0+dHlwZSA+IHZlcnRleC0+dHlwZSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG5leHRub2RlIChub2RlKTsKLSAgICAgICAgKG5vZGUpID8gKHYgPSBnZXRkYXRhIChub2RlKSkgOiAodiA9IE5VTEwpOwotICAgICAgfQotICAgICAgbGlzdF9hZGRfbm9kZV9wcmV2IChzcGZ0cmVlLT50ZW50cywgbm9kZSwgdmVydGV4KTsKLSAgICAgIGJyZWFrOyAKLSAgICB9IGVsc2UgIGlmIChub2RlLT5uZXh0ID09IE5VTEwpIHsKLSAgICAgIGxpc3RfYWRkX25vZGVfbmV4dCAoc3BmdHJlZS0+dGVudHMsIG5vZGUsIHZlcnRleCk7Ci0gICAgICBicmVhazsKKyAgbGlzdG5vZGVfYWRkIChzcGZ0cmVlLT50ZW50cywgdmVydGV4KTsKKyAgaWYgKGxpc3RfaXNlbXB0eSAoc3BmdHJlZS0+dGVudHMpKQorICAgIHsKKyAgICAgIGxpc3Rub2RlX2FkZCAoc3BmdHJlZS0+dGVudHMsIHZlcnRleCk7CisgICAgICByZXR1cm4gdmVydGV4OwogICAgIH0KLSAgfQorICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoc3BmdHJlZS0+dGVudHMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisgICAgeworICAgICAgdiA9IGdldGRhdGEgKG5vZGUpOworICAgICAgaWYgKHYtPmRfTiA+IHZlcnRleC0+ZF9OKQorCXsKKwkgIGxpc3RfYWRkX25vZGVfcHJldiAoc3BmdHJlZS0+dGVudHMsIG5vZGUsIHZlcnRleCk7CisJICBicmVhazsKKwl9CisgICAgICBlbHNlIGlmICh2LT5kX04gPT0gdmVydGV4LT5kX04pCisJeworCSAgLyogIFRpZSBicmVhaywgYWRkIGFjY29yZGluZyB0byB0eXBlICovCisJICB3aGlsZSAodiAmJiB2LT5kX04gPT0gdmVydGV4LT5kX04gJiYgdi0+dHlwZSA+IHZlcnRleC0+dHlwZSkKKwkgICAgeworCSAgICAgIGlmICh2LT50eXBlID4gdmVydGV4LT50eXBlKQorCQl7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICBuZXh0bm9kZSAobm9kZSk7CisJICAgICAgKG5vZGUpID8gKHYgPSBnZXRkYXRhIChub2RlKSkgOiAodiA9IE5VTEwpOworCSAgICB9CisJICBsaXN0X2FkZF9ub2RlX3ByZXYgKHNwZnRyZWUtPnRlbnRzLCBub2RlLCB2ZXJ0ZXgpOworCSAgYnJlYWs7CisJfQorICAgICAgZWxzZSBpZiAobm9kZS0+bmV4dCA9PSBOVUxMKQorCXsKKwkgIGxpc3RfYWRkX25vZGVfbmV4dCAoc3BmdHJlZS0+dGVudHMsIG5vZGUsIHZlcnRleCk7CisJICBicmVhazsKKwl9CisgICAgfQogICByZXR1cm4gdmVydGV4OwogfQogCiBzdHJ1Y3QgaXNpc192ZXJ0ZXggKgotaXNpc19zcGZfYWRkX2xvY2FsIChzdHJ1Y3QgaXNpc19zcGZ0cmVlICpzcGZ0cmVlLCBlbnVtIHZlcnRleHR5cGUgdnR5cGUsIAotICAgICAgICAgICAgICAgICAgICB2b2lkICppZCwgc3RydWN0IGlzaXNfYWRqYWNlbmN5ICphZGosIHVfaW50MTZfdCBjb3N0LAotICAgICAgICAgICAgICAgICAgICBpbnQgZmFtaWx5KQoraXNpc19zcGZfYWRkX2xvY2FsIChzdHJ1Y3QgaXNpc19zcGZ0cmVlICpzcGZ0cmVlLCBlbnVtIHZlcnRleHR5cGUgdnR5cGUsCisJCSAgICB2b2lkICppZCwgc3RydWN0IGlzaXNfYWRqYWNlbmN5ICphZGosIHVfaW50MTZfdCBjb3N0LAorCQkgICAgaW50IGZhbWlseSkKIHsKICAgc3RydWN0IGlzaXNfdmVydGV4ICp2ZXJ0ZXg7Ci0gCi0gIHZlcnRleCA9IGlzaXNfZmluZF92ZXJ0ZXggKHNwZnRyZWUtPnRlbnRzLCBpZCwgdnR5cGUpOyAKLSAgCi0gIGlmICh2ZXJ0ZXgpIHsKLSAgICAvKiBDLjIuNSAgIGMpICovCi0gICAgaWYgKHZlcnRleC0+ZF9OID09IGNvc3QpIHsKLSAgICAgIGlmIChhZGopCi0gICAgICAgIGxpc3Rub2RlX2FkZCAodmVydGV4LT5BZGpfTiwgYWRqKTsKLSAgICAgIC8qICAgICAgIGQpICovCi0gICAgICBpZiAobGlzdGNvdW50ICh2ZXJ0ZXgtPkFkal9OKSA+IElTSVNfTUFYX1BBVEhfU1BMSVRTKQotCXJlbW92ZV9leGNlc3NfYWRqcyAodmVydGV4LT5BZGpfTik7Ci0gICAgfQotICAgIC8qICAgICAgICAgZikgKi8KLSAgICBlbHNlIGlmICh2ZXJ0ZXgtPmRfTiA+IGNvc3QpIHsKLSAgICAgIGxpc3Rub2RlX2RlbGV0ZSAoc3BmdHJlZS0+dGVudHMsIHZlcnRleCk7Ci0gICAgICBnb3RvIGFkZDJ0ZW50OwotICAgIH0KLSAgICAvKiAgICAgICBlKSBkbyBub3RoaW5nICovCi0gICAgcmV0dXJuIHZlcnRleDsKLSAgfQogCi0gYWRkMnRlbnQ6CisgIHZlcnRleCA9IGlzaXNfZmluZF92ZXJ0ZXggKHNwZnRyZWUtPnRlbnRzLCBpZCwgdnR5cGUpOworCisgIGlmICh2ZXJ0ZXgpCisgICAgeworICAgICAgLyogQy4yLjUgICBjKSAqLworICAgICAgaWYgKHZlcnRleC0+ZF9OID09IGNvc3QpCisJeworCSAgaWYgKGFkaikKKwkgICAgbGlzdG5vZGVfYWRkICh2ZXJ0ZXgtPkFkal9OLCBhZGopOworCSAgLyogICAgICAgZCkgKi8KKwkgIGlmIChsaXN0Y291bnQgKHZlcnRleC0+QWRqX04pID4gSVNJU19NQVhfUEFUSF9TUExJVFMpCisJICAgIHJlbW92ZV9leGNlc3NfYWRqcyAodmVydGV4LT5BZGpfTik7CisJfQorICAgICAgLyogICAgICAgICBmKSAqLworICAgICAgZWxzZSBpZiAodmVydGV4LT5kX04gPiBjb3N0KQorCXsKKwkgIGxpc3Rub2RlX2RlbGV0ZSAoc3BmdHJlZS0+dGVudHMsIHZlcnRleCk7CisJICBnb3RvIGFkZDJ0ZW50OworCX0KKyAgICAgIC8qICAgICAgIGUpIGRvIG5vdGhpbmcgKi8KKyAgICAgIHJldHVybiB2ZXJ0ZXg7CisgICAgfQorCithZGQydGVudDoKICAgcmV0dXJuIGlzaXNfc3BmX2FkZDJ0ZW50IChzcGZ0cmVlLCB2dHlwZSwgaWQsIGFkaiwgY29zdCwgMSwgZmFtaWx5KTsKIH0KIAogdm9pZAotcHJvY2Vzc19OIChzdHJ1Y3QgaXNpc19zcGZ0cmVlICpzcGZ0cmVlLCBlbnVtIHZlcnRleHR5cGUgdnR5cGUsIHZvaWQgKmlkLCAKLSAgICAgICAgICAgdV9pbnQxNl90IGRpc3QsIHVfaW50MTZfdCBkZXB0aCwgc3RydWN0IGlzaXNfYWRqYWNlbmN5ICphZGosICAKLSAgICAgICAgICAgaW50IGZhbWlseSkgCitwcm9jZXNzX04gKHN0cnVjdCBpc2lzX3NwZnRyZWUgKnNwZnRyZWUsIGVudW0gdmVydGV4dHlwZSB2dHlwZSwgdm9pZCAqaWQsCisJICAgdV9pbnQxNl90IGRpc3QsIHVfaW50MTZfdCBkZXB0aCwgc3RydWN0IGlzaXNfYWRqYWNlbmN5ICphZGosCisJICAgaW50IGZhbWlseSkKIHsKICAgc3RydWN0IGlzaXNfdmVydGV4ICp2ZXJ0ZXg7CiAjaWZkZWYgRVhUUkVNRV9ERUJVRwpAQCAtNDc2LDM5ICs1MDEsNDYgQEAKICAgICByZXR1cm47CiAgIC8qICAgICAgIGMpICAgICovCiAgIHZlcnRleCA9IGlzaXNfZmluZF92ZXJ0ZXggKHNwZnRyZWUtPnBhdGhzLCBpZCwgdnR5cGUpOwotICBpZiAodmVydGV4KSB7CisgIGlmICh2ZXJ0ZXgpCisgICAgewogI2lmZGVmIEVYVFJFTUVfREVCVUcKLSAgICB6bG9nX2luZm8gKCJJU0lTLVNwZjogcHJvY2Vzc19OICAlcyAlcyBkaXN0ICVkIGFscmVhZHkgZm91bmQgZnJvbSBQQVRIIiwKLQkgICAgICAgdnR5cGUyc3RyaW5nKHZ0eXBlKSwgdmlkMnN0cmluZyh2ZXJ0ZXgsIGJ1ZmYpLCBkaXN0KTsKKyAgICAgIHpsb2dfaW5mbyAoIklTSVMtU3BmOiBwcm9jZXNzX04gICVzICVzIGRpc3QgJWQgYWxyZWFkeSBmb3VuZCBmcm9tIFBBVEgiLAorCQkgdnR5cGUyc3RyaW5nICh2dHlwZSksIHZpZDJzdHJpbmcgKHZlcnRleCwgYnVmZiksIGRpc3QpOwogI2VuZGlmIC8qIEVYVFJFTUVfREVCVUcgKi8KLSAgICBhc3NlcnQgKGRpc3QgPj0gdmVydGV4LT5kX04pOwotICAgIHJldHVybjsKLSAgfQorICAgICAgYXNzZXJ0IChkaXN0ID49IHZlcnRleC0+ZF9OKTsKKyAgICAgIHJldHVybjsKKyAgICB9CiAKICAgdmVydGV4ID0gaXNpc19maW5kX3ZlcnRleCAoc3BmdHJlZS0+dGVudHMsIGlkLCB2dHlwZSk7Ci0gIC8qICAgICAgIGQpICAgICovIAotICBpZiAodmVydGV4KSB7Ci0gICAgLyogICAgICAgIDEpICovCisgIC8qICAgICAgIGQpICAgICovCisgIGlmICh2ZXJ0ZXgpCisgICAgeworICAgICAgLyogICAgICAgIDEpICovCiAjaWZkZWYgRVhUUkVNRV9ERUJVRwotICAgIHpsb2dfaW5mbyAoIklTSVMtU3BmOiBwcm9jZXNzX04gICVzICVzIGRpc3QgJWQiLAotCSAgICAgICB2dHlwZTJzdHJpbmcodnR5cGUpLCB2aWQyc3RyaW5nKHZlcnRleCwgYnVmZiksIGRpc3QpOworICAgICAgemxvZ19pbmZvICgiSVNJUy1TcGY6IHByb2Nlc3NfTiAgJXMgJXMgZGlzdCAlZCIsCisJCSB2dHlwZTJzdHJpbmcgKHZ0eXBlKSwgdmlkMnN0cmluZyAodmVydGV4LCBidWZmKSwgZGlzdCk7CiAjZW5kaWYgLyogRVhUUkVNRV9ERUJVRyAqLwotICAgIGlmICh2ZXJ0ZXgtPmRfTiA9PSBkaXN0KSB7Ci0gICAgICBpZiAoYWRqKQotICAgICAgICBsaXN0bm9kZV9hZGQgKHZlcnRleC0+QWRqX04sIGFkaik7Ci0gICAgICAvKiAgICAgIDIpICovCi0gICAgICBpZiAobGlzdGNvdW50KHZlcnRleC0+QWRqX04pID4gSVNJU19NQVhfUEFUSF9TUExJVFMpCi0gICAgICAgIHJlbW92ZV9leGNlc3NfYWRqcyAodmVydGV4LT5BZGpfTik7Ci0gICAgICAvKiAgICAgIDMpICovCi0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmICh2ZXJ0ZXgtPmRfTiA8IGRpc3QpIHsKLSAgICAgIHJldHVybjsKLSAgICAgIC8qICAgICAgNCkgKi8KLSAgICB9IGVsc2UgewotICAgICAgbGlzdG5vZGVfZGVsZXRlIChzcGZ0cmVlLT50ZW50cywgdmVydGV4KTsKKyAgICAgIGlmICh2ZXJ0ZXgtPmRfTiA9PSBkaXN0KQorCXsKKwkgIGlmIChhZGopCisJICAgIGxpc3Rub2RlX2FkZCAodmVydGV4LT5BZGpfTiwgYWRqKTsKKwkgIC8qICAgICAgMikgKi8KKwkgIGlmIChsaXN0Y291bnQgKHZlcnRleC0+QWRqX04pID4gSVNJU19NQVhfUEFUSF9TUExJVFMpCisJICAgIHJlbW92ZV9leGNlc3NfYWRqcyAodmVydGV4LT5BZGpfTik7CisJICAvKiAgICAgIDMpICovCisJICByZXR1cm47CisJfQorICAgICAgZWxzZSBpZiAodmVydGV4LT5kX04gPCBkaXN0KQorCXsKKwkgIHJldHVybjsKKwkgIC8qICAgICAgNCkgKi8KKwl9CisgICAgICBlbHNlCisJeworCSAgbGlzdG5vZGVfZGVsZXRlIChzcGZ0cmVlLT50ZW50cywgdmVydGV4KTsKKwl9CiAgICAgfQotICB9Ci0gIAorCiAgIGlzaXNfc3BmX2FkZDJ0ZW50IChzcGZ0cmVlLCB2dHlwZSwgaWQsIGFkaiwgZGlzdCwgZGVwdGgsIGZhbWlseSk7CiAgIHJldHVybjsKIH0KQEAgLTUxNyw4ICs1NDksOCBAQAogICogQy4yLjYgU3RlcCAxCiAgKi8KIGludAotaXNpc19zcGZfcHJvY2Vzc19sc3AgKHN0cnVjdCBpc2lzX3NwZnRyZWUgKnNwZnRyZWUsIHN0cnVjdCBpc2lzX2xzcCAqbHNwLCAKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb3N0LCB1aW50MTZfdCBkZXB0aCwgaW50IGZhbWlseSkKK2lzaXNfc3BmX3Byb2Nlc3NfbHNwIChzdHJ1Y3QgaXNpc19zcGZ0cmVlICpzcGZ0cmVlLCBzdHJ1Y3QgaXNpc19sc3AgKmxzcCwKKwkJICAgICAgdWludDE2X3QgY29zdCwgdWludDE2X3QgZGVwdGgsIGludCBmYW1pbHkpCiB7CiAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZSwgKmZyYWdub2RlID0gTlVMTDsKICAgdV9pbnQxNl90IGRpc3Q7CkBAIC01MjksMTQ3ICs1NjEsMTYyIEBACiAjaWZkZWYgSEFWRV9JUFY2CiAgIHN0cnVjdCBpcHY2X3JlYWNoYWJpbGl0eSAqaXA2cmVhY2g7CiAjZW5kaWYgLyogSEFWRV9JUFY2ICovCi0gIAorCiAKICAgaWYgKCFsc3AtPmFkaikKICAgICByZXR1cm4gSVNJU19XQVJOSU5HOwotICBpZiAobHNwLT50bHZfZGF0YS5ubHBpZHMgPT0gTlVMTCB8fCAKLSAgICAgICFzcGVha3MgKGxzcC0+dGx2X2RhdGEubmxwaWRzLCBmYW1pbHkpKQorICBpZiAobHNwLT50bHZfZGF0YS5ubHBpZHMgPT0gTlVMTCB8fCAhc3BlYWtzIChsc3AtPnRsdl9kYXRhLm5scGlkcywgZmFtaWx5KSkKICAgICByZXR1cm4gSVNJU19PSzsKIAotIGxzcGZyYWdsb29wOgotICBpZiAobHNwLT5sc3BfaGVhZGVyLT5zZXFfbnVtID09IDApIHsKLSAgICB6bG9nX3dhcm4gKCJpc2lzX3NwZl9wcm9jZXNzX2xzcCgpOiBsc3Agd2l0aCAwIHNlcV9udW0iCi0JICAgICAgICIgLSBkbyBub3QgcHJvY2VzcyIpOwotICAgIHJldHVybiBJU0lTX1dBUk5JTkc7Ci0gIH0KK2xzcGZyYWdsb29wOgorICBpZiAobHNwLT5sc3BfaGVhZGVyLT5zZXFfbnVtID09IDApCisgICAgeworICAgICAgemxvZ193YXJuICgiaXNpc19zcGZfcHJvY2Vzc19sc3AoKTogbHNwIHdpdGggMCBzZXFfbnVtIgorCQkgIiAtIGRvIG5vdCBwcm9jZXNzIik7CisgICAgICByZXR1cm4gSVNJU19XQVJOSU5HOworICAgIH0KIAotICBpZiAoIUlTSVNfTUFTS19MU1BfT0xfQklUKGxzcC0+bHNwX2hlYWRlci0+bHNwX2JpdHMpKSB7Ci0gICAgaWYgKGxzcC0+dGx2X2RhdGEuaXNfbmVpZ2hzKSB7Ci0gICAgICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAobHNwLT50bHZfZGF0YS5pc19uZWlnaHMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICAgICAgaXNfbmVpZ2ggPSBnZXRkYXRhIChub2RlKTsKLSAgICAgICAgLyogQy4yLjYgYSkgKi8gICAgICAgCi0JLyogVHdvIHdheSBjb25uZWN0aXZpdHkgKi8KLQlpZiAoIW1lbWNtcCAoaXNfbmVpZ2gtPm5laWdoX2lkLCBpc2lzLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOKSkKLQkgIGNvbnRpbnVlOwotICAgICAgICBkaXN0ID0gY29zdCArIGlzX25laWdoLT5tZXRyaWNzLm1ldHJpY19kZWZhdWx0OwotICAgICAgICB2dHlwZSA9IExTUF9QU0VVRE9fSUQoaXNfbmVpZ2gtPm5laWdoX2lkKSA/IFZUWVBFX1BTRVVET19JUyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBWVFlQRV9OT05QU0VVRE9fSVM7Ci0gICAgICAgIHByb2Nlc3NfTiAoc3BmdHJlZSwgdnR5cGUsICh2b2lkICopaXNfbmVpZ2gtPm5laWdoX2lkLCBkaXN0LCBkZXB0aCsxLCAKLSAgICAgICAgICAgICAgICAgICBsc3AtPmFkaiwgZmFtaWx5KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGZhbWlseSA9PSBBRl9JTkVUICYmIGxzcC0+dGx2X2RhdGEuaXB2NF9pbnRfcmVhY2hzKSB7Ci0gICAgICBwcmVmaXguZmFtaWx5ID0gQUZfSU5FVDsKLSAgICAgIGZvciAobm9kZSA9IGxpc3RoZWFkIChsc3AtPnRsdl9kYXRhLmlwdjRfaW50X3JlYWNocyk7IG5vZGU7IAotICAgICAgICAgICBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICAgICAgaXByZWFjaCA9IGdldGRhdGEgKG5vZGUpOwotICAgICAgICBkaXN0ID0gY29zdCArIGlwcmVhY2gtPm1ldHJpY3MubWV0cmljX2RlZmF1bHQ7Ci0gICAgICAgIHZ0eXBlID0gVlRZUEVfSVBSRUFDSF9JTlRFUk5BTDsKLSAgICAgICAgcHJlZml4LnUucHJlZml4NCA9IGlwcmVhY2gtPnByZWZpeDsKLSAgICAgICAgcHJlZml4LnByZWZpeGxlbiA9IGlwX21hc2tsZW4gKGlwcmVhY2gtPm1hc2spOwotICAgICAgICBwcm9jZXNzX04gKHNwZnRyZWUsIHZ0eXBlLCAodm9pZCAqKSZwcmVmaXgsIGRpc3QsIGRlcHRoICsgMSwKLSAgICAgICAgICAgICAgICAgICBsc3AtPmFkaiwgZmFtaWx5KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGZhbWlseSA9PSBBRl9JTkVUICYmIGxzcC0+dGx2X2RhdGEuaXB2NF9leHRfcmVhY2hzKSB7Ci0gICAgICBwcmVmaXguZmFtaWx5ID0gQUZfSU5FVDsKLSAgICAgIGZvciAobm9kZSA9IGxpc3RoZWFkIChsc3AtPnRsdl9kYXRhLmlwdjRfZXh0X3JlYWNocyk7IG5vZGU7IAotICAgICAgICAgICBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICAgICAgaXByZWFjaCA9IGdldGRhdGEgKG5vZGUpOwotICAgICAgICBkaXN0ID0gY29zdCArIGlwcmVhY2gtPm1ldHJpY3MubWV0cmljX2RlZmF1bHQ7Ci0gICAgICAgIHZ0eXBlID0gVlRZUEVfSVBSRUFDSF9FWFRFUk5BTDsKLSAgICAgICAgcHJlZml4LnUucHJlZml4NCA9IGlwcmVhY2gtPnByZWZpeDsKLSAgICAgICAgcHJlZml4LnByZWZpeGxlbiA9IGlwX21hc2tsZW4gKGlwcmVhY2gtPm1hc2spOwotICAgICAgICBwcm9jZXNzX04gKHNwZnRyZWUsIHZ0eXBlLCAodm9pZCAqKSZwcmVmaXgsIGRpc3QsIGRlcHRoICsgMSwKLSAgICAgICAgICAgICAgICAgICBsc3AtPmFkaiwgZmFtaWx5KTsKLSAgICAgIH0KLSAgICB9CisgIGlmICghSVNJU19NQVNLX0xTUF9PTF9CSVQgKGxzcC0+bHNwX2hlYWRlci0+bHNwX2JpdHMpKQorICAgIHsKKyAgICAgIGlmIChsc3AtPnRsdl9kYXRhLmlzX25laWdocykKKwl7CisJICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAobHNwLT50bHZfZGF0YS5pc19uZWlnaHMpOyBub2RlOworCSAgICAgICBuZXh0bm9kZSAobm9kZSkpCisJICAgIHsKKwkgICAgICBpc19uZWlnaCA9IGdldGRhdGEgKG5vZGUpOworCSAgICAgIC8qIEMuMi42IGEpICovCisJICAgICAgLyogVHdvIHdheSBjb25uZWN0aXZpdHkgKi8KKwkgICAgICBpZiAoIW1lbWNtcCAoaXNfbmVpZ2gtPm5laWdoX2lkLCBpc2lzLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOKSkKKwkJY29udGludWU7CisJICAgICAgZGlzdCA9IGNvc3QgKyBpc19uZWlnaC0+bWV0cmljcy5tZXRyaWNfZGVmYXVsdDsKKwkgICAgICB2dHlwZSA9IExTUF9QU0VVRE9fSUQgKGlzX25laWdoLT5uZWlnaF9pZCkgPyBWVFlQRV9QU0VVRE9fSVMKKwkJOiBWVFlQRV9OT05QU0VVRE9fSVM7CisJICAgICAgcHJvY2Vzc19OIChzcGZ0cmVlLCB2dHlwZSwgKHZvaWQgKikgaXNfbmVpZ2gtPm5laWdoX2lkLCBkaXN0LAorCQkJIGRlcHRoICsgMSwgbHNwLT5hZGosIGZhbWlseSk7CisJICAgIH0KKwl9CisgICAgICBpZiAoZmFtaWx5ID09IEFGX0lORVQgJiYgbHNwLT50bHZfZGF0YS5pcHY0X2ludF9yZWFjaHMpCisJeworCSAgcHJlZml4LmZhbWlseSA9IEFGX0lORVQ7CisJICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAobHNwLT50bHZfZGF0YS5pcHY0X2ludF9yZWFjaHMpOyBub2RlOworCSAgICAgICBuZXh0bm9kZSAobm9kZSkpCisJICAgIHsKKwkgICAgICBpcHJlYWNoID0gZ2V0ZGF0YSAobm9kZSk7CisJICAgICAgZGlzdCA9IGNvc3QgKyBpcHJlYWNoLT5tZXRyaWNzLm1ldHJpY19kZWZhdWx0OworCSAgICAgIHZ0eXBlID0gVlRZUEVfSVBSRUFDSF9JTlRFUk5BTDsKKwkgICAgICBwcmVmaXgudS5wcmVmaXg0ID0gaXByZWFjaC0+cHJlZml4OworCSAgICAgIHByZWZpeC5wcmVmaXhsZW4gPSBpcF9tYXNrbGVuIChpcHJlYWNoLT5tYXNrKTsKKwkgICAgICBwcm9jZXNzX04gKHNwZnRyZWUsIHZ0eXBlLCAodm9pZCAqKSAmcHJlZml4LCBkaXN0LCBkZXB0aCArIDEsCisJCQkgbHNwLT5hZGosIGZhbWlseSk7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChmYW1pbHkgPT0gQUZfSU5FVCAmJiBsc3AtPnRsdl9kYXRhLmlwdjRfZXh0X3JlYWNocykKKwl7CisJICBwcmVmaXguZmFtaWx5ID0gQUZfSU5FVDsKKwkgIGZvciAobm9kZSA9IGxpc3RoZWFkIChsc3AtPnRsdl9kYXRhLmlwdjRfZXh0X3JlYWNocyk7IG5vZGU7CisJICAgICAgIG5leHRub2RlIChub2RlKSkKKwkgICAgeworCSAgICAgIGlwcmVhY2ggPSBnZXRkYXRhIChub2RlKTsKKwkgICAgICBkaXN0ID0gY29zdCArIGlwcmVhY2gtPm1ldHJpY3MubWV0cmljX2RlZmF1bHQ7CisJICAgICAgdnR5cGUgPSBWVFlQRV9JUFJFQUNIX0VYVEVSTkFMOworCSAgICAgIHByZWZpeC51LnByZWZpeDQgPSBpcHJlYWNoLT5wcmVmaXg7CisJICAgICAgcHJlZml4LnByZWZpeGxlbiA9IGlwX21hc2tsZW4gKGlwcmVhY2gtPm1hc2spOworCSAgICAgIHByb2Nlc3NfTiAoc3BmdHJlZSwgdnR5cGUsICh2b2lkICopICZwcmVmaXgsIGRpc3QsIGRlcHRoICsgMSwKKwkJCSBsc3AtPmFkaiwgZmFtaWx5KTsKKwkgICAgfQorCX0KICNpZmRlZiBIQVZFX0lQVjYKLSAgICBpZiAoZmFtaWx5ID09IEFGX0lORVQ2ICYmIGxzcC0+dGx2X2RhdGEuaXB2Nl9yZWFjaHMpIHsKLSAgICAgIHByZWZpeC5mYW1pbHkgPSBBRl9JTkVUNjsKLSAgICAgIGZvciAobm9kZSA9IGxpc3RoZWFkIChsc3AtPnRsdl9kYXRhLmlwdjZfcmVhY2hzKTsgbm9kZTsgCi0gICAgICAgICAgIG5leHRub2RlIChub2RlKSkgewotICAgICAgICBpcDZyZWFjaCA9IGdldGRhdGEgKG5vZGUpOwotICAgICAgICBkaXN0ID0gY29zdCArIGlwNnJlYWNoLT5tZXRyaWM7Ci0gICAgICAgIHZ0eXBlID0gKGlwNnJlYWNoLT5jb250cm9sX2luZm8gJiBDVFJMX0lORk9fRElTVFJJQlVUSU9OKSA/IAotICAgICAgICAgIFZUWVBFX0lQNlJFQUNIX0VYVEVSTkFMIDogVlRZUEVfSVA2UkVBQ0hfSU5URVJOQUw7Ci0gICAgICAgIHByZWZpeC5wcmVmaXhsZW4gPSBpcDZyZWFjaC0+cHJlZml4X2xlbjsKLSAgICAgICAgbWVtY3B5ICgmcHJlZml4LnUucHJlZml4Ni5zNl9hZGRyLCBpcDZyZWFjaC0+cHJlZml4LCAKLSAgICAgICAgICAgICAgICBQU0laRShpcDZyZWFjaC0+cHJlZml4X2xlbikpOwotICAgICAgICBwcm9jZXNzX04gKHNwZnRyZWUsIHZ0eXBlLCAodm9pZCAqKSZwcmVmaXgsIGRpc3QsIGRlcHRoICsgMSwKLSAgICAgICAgICAgICAgICAgICBsc3AtPmFkaiwgZmFtaWx5KTsKLSAgICAgIH0KLSAgICB9CisgICAgICBpZiAoZmFtaWx5ID09IEFGX0lORVQ2ICYmIGxzcC0+dGx2X2RhdGEuaXB2Nl9yZWFjaHMpCisJeworCSAgcHJlZml4LmZhbWlseSA9IEFGX0lORVQ2OworCSAgZm9yIChub2RlID0gbGlzdGhlYWQgKGxzcC0+dGx2X2RhdGEuaXB2Nl9yZWFjaHMpOyBub2RlOworCSAgICAgICBuZXh0bm9kZSAobm9kZSkpCisJICAgIHsKKwkgICAgICBpcDZyZWFjaCA9IGdldGRhdGEgKG5vZGUpOworCSAgICAgIGRpc3QgPSBjb3N0ICsgaXA2cmVhY2gtPm1ldHJpYzsKKwkgICAgICB2dHlwZSA9IChpcDZyZWFjaC0+Y29udHJvbF9pbmZvICYgQ1RSTF9JTkZPX0RJU1RSSUJVVElPTikgPworCQlWVFlQRV9JUDZSRUFDSF9FWFRFUk5BTCA6IFZUWVBFX0lQNlJFQUNIX0lOVEVSTkFMOworCSAgICAgIHByZWZpeC5wcmVmaXhsZW4gPSBpcDZyZWFjaC0+cHJlZml4X2xlbjsKKwkgICAgICBtZW1jcHkgKCZwcmVmaXgudS5wcmVmaXg2LnM2X2FkZHIsIGlwNnJlYWNoLT5wcmVmaXgsCisJCSAgICAgIFBTSVpFIChpcDZyZWFjaC0+cHJlZml4X2xlbikpOworCSAgICAgIHByb2Nlc3NfTiAoc3BmdHJlZSwgdnR5cGUsICh2b2lkICopICZwcmVmaXgsIGRpc3QsIGRlcHRoICsgMSwKKwkJCSBsc3AtPmFkaiwgZmFtaWx5KTsKKwkgICAgfQorCX0KICNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KLSAgfQotICAKKyAgICB9CisKICAgaWYgKGZyYWdub2RlID09IE5VTEwpCiAgICAgZnJhZ25vZGUgPSBsaXN0aGVhZCAobHNwLT5sc3B1LmZyYWdzKTsKLSAgZWxzZSAKKyAgZWxzZQogICAgIGZyYWdub2RlID0gbmV4dG5vZGUgKGZyYWdub2RlKTsKIAotICBpZiAoZnJhZ25vZGUpIHsKLSAgICBsc3AgPSBnZXRkYXRhIChmcmFnbm9kZSk7Ci0gICAgZ290byBsc3BmcmFnbG9vcDsKLSAgfQotICAKKyAgaWYgKGZyYWdub2RlKQorICAgIHsKKyAgICAgIGxzcCA9IGdldGRhdGEgKGZyYWdub2RlKTsKKyAgICAgIGdvdG8gbHNwZnJhZ2xvb3A7CisgICAgfQorCiAgIHJldHVybiBJU0lTX09LOwogfQogCiBpbnQKLWlzaXNfc3BmX3Byb2Nlc3NfcHNldWRvX2xzcCAoc3RydWN0IGlzaXNfc3BmdHJlZSAqc3BmdHJlZSxzdHJ1Y3QgaXNpc19sc3AgKmxzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29zdCwgdWludDE2X3QgZGVwdGgsIGludCBmYW1pbHkpCitpc2lzX3NwZl9wcm9jZXNzX3BzZXVkb19sc3AgKHN0cnVjdCBpc2lzX3NwZnRyZWUgKnNwZnRyZWUsCisJCQkgICAgIHN0cnVjdCBpc2lzX2xzcCAqbHNwLCB1aW50MTZfdCBjb3N0LAorCQkJICAgICB1aW50MTZfdCBkZXB0aCwgaW50IGZhbWlseSkKIHsKICAgc3RydWN0IGxpc3Rub2RlICpub2RlLCAqZnJhZ25vZGUgPSBOVUxMOwogICBzdHJ1Y3QgaXNfbmVpZ2ggKmlzX25laWdoOwogICBlbnVtIHZlcnRleHR5cGUgdnR5cGU7Ci0gIAotIHBzZXVkb2ZyYWdsb29wOgotICAKLSAgaWYgKGxzcC0+bHNwX2hlYWRlci0+c2VxX251bSA9PSAwKSB7Ci0gICAgemxvZ193YXJuICgiaXNpc19zcGZfcHJvY2Vzc19wc2V1ZG9fbHNwKCk6IGxzcCB3aXRoIDAgc2VxX251bSIKLQkgICAgICAgIiAtIGRvIG5vdCBwcm9jZXNzIik7Ci0gICAgcmV0dXJuIElTSVNfV0FSTklORzsKLSAgfQotICAgIAotICBmb3IgKG5vZGUgPSAobHNwLT50bHZfZGF0YS5pc19uZWlnaHMgPyAKLSAgICAgICAgICAgICAgIGxpc3RoZWFkIChsc3AtPnRsdl9kYXRhLmlzX25laWdocykgOiBOVUxMKTsgCi0gICAgICAgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7Ci0gICAgaXNfbmVpZ2ggPSBnZXRkYXRhIChub2RlKTsKLSAgICB2dHlwZSA9IExTUF9QU0VVRE9fSUQoaXNfbmVpZ2gtPm5laWdoX2lkKSA/IFZUWVBFX1BTRVVET19JUyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFZUWVBFX05PTlBTRVVET19JUzsKLSAgICAvKiBUd28gd2F5IGNvbm5lY3Rpdml0eSAqLwotICAgIGlmICghbWVtY21wIChpc19uZWlnaC0+bmVpZ2hfaWQsIGlzaXMtPnN5c2lkLCBJU0lTX1NZU19JRF9MRU4pKQotICAgICAgY29udGludWU7Ci0gICAgaWYgKGlzaXNfZmluZF92ZXJ0ZXggKHNwZnRyZWUtPnRlbnRzLCAodm9pZCAqKWlzX25laWdoLT5uZWlnaF9pZCwgdnR5cGUpIAotCT09IE5VTEwgJiYKLSAgICAgICAgaXNpc19maW5kX3ZlcnRleCAoc3BmdHJlZS0+cGF0aHMsICh2b2lkICopaXNfbmVpZ2gtPm5laWdoX2lkLCB2dHlwZSkKLSAgICAgICAgPT0gTlVMTCkgewotICAgICAgICAvKiBDLjIuNSBpKSAqLwotICAgICAgICBpc2lzX3NwZl9hZGQydGVudCAoc3BmdHJlZSwgdnR5cGUsIGlzX25laWdoLT5uZWlnaF9pZCwgbHNwLT5hZGosIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCwgZGVwdGgsIGZhbWlseSk7CisKK3BzZXVkb2ZyYWdsb29wOgorCisgIGlmIChsc3AtPmxzcF9oZWFkZXItPnNlcV9udW0gPT0gMCkKKyAgICB7CisgICAgICB6bG9nX3dhcm4gKCJpc2lzX3NwZl9wcm9jZXNzX3BzZXVkb19sc3AoKTogbHNwIHdpdGggMCBzZXFfbnVtIgorCQkgIiAtIGRvIG5vdCBwcm9jZXNzIik7CisgICAgICByZXR1cm4gSVNJU19XQVJOSU5HOwogICAgIH0KLSAgfQotICAKKworICBmb3IgKG5vZGUgPSAobHNwLT50bHZfZGF0YS5pc19uZWlnaHMgPworCSAgICAgICBsaXN0aGVhZCAobHNwLT50bHZfZGF0YS5pc19uZWlnaHMpIDogTlVMTCk7CisgICAgICAgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorICAgIHsKKyAgICAgIGlzX25laWdoID0gZ2V0ZGF0YSAobm9kZSk7CisgICAgICB2dHlwZSA9IExTUF9QU0VVRE9fSUQgKGlzX25laWdoLT5uZWlnaF9pZCkgPyBWVFlQRV9QU0VVRE9fSVMKKwk6IFZUWVBFX05PTlBTRVVET19JUzsKKyAgICAgIC8qIFR3byB3YXkgY29ubmVjdGl2aXR5ICovCisgICAgICBpZiAoIW1lbWNtcCAoaXNfbmVpZ2gtPm5laWdoX2lkLCBpc2lzLT5zeXNpZCwgSVNJU19TWVNfSURfTEVOKSkKKwljb250aW51ZTsKKyAgICAgIGlmIChpc2lzX2ZpbmRfdmVydGV4CisJICAoc3BmdHJlZS0+dGVudHMsICh2b2lkICopIGlzX25laWdoLT5uZWlnaF9pZCwgdnR5cGUpID09IE5VTEwKKwkgICYmIGlzaXNfZmluZF92ZXJ0ZXggKHNwZnRyZWUtPnBhdGhzLCAodm9pZCAqKSBpc19uZWlnaC0+bmVpZ2hfaWQsCisJCQkgICAgICAgdnR5cGUpID09IE5VTEwpCisJeworCSAgLyogQy4yLjUgaSkgKi8KKwkgIGlzaXNfc3BmX2FkZDJ0ZW50IChzcGZ0cmVlLCB2dHlwZSwgaXNfbmVpZ2gtPm5laWdoX2lkLCBsc3AtPmFkaiwKKwkJCSAgICAgY29zdCwgZGVwdGgsIGZhbWlseSk7CisJfQorICAgIH0KKwogICBpZiAoZnJhZ25vZGUgPT0gTlVMTCkKICAgICBmcmFnbm9kZSA9IGxpc3RoZWFkIChsc3AtPmxzcHUuZnJhZ3MpOwotICBlbHNlIAorICBlbHNlCiAgICAgZnJhZ25vZGUgPSBuZXh0bm9kZSAoZnJhZ25vZGUpOwogCi0gIGlmIChmcmFnbm9kZSkgewotICAgIGxzcCA9IGdldGRhdGEgKGZyYWdub2RlKTsKLSAgICBnb3RvIHBzZXVkb2ZyYWdsb29wOwotICB9CisgIGlmIChmcmFnbm9kZSkKKyAgICB7CisgICAgICBsc3AgPSBnZXRkYXRhIChmcmFnbm9kZSk7CisgICAgICBnb3RvIHBzZXVkb2ZyYWdsb29wOworICAgIH0KIAotICAKICAgcmV0dXJuIElTSVNfT0s7CiB9Ci0gICAgICAKKwogaW50Ci1pc2lzX3NwZl9wcmVsb2FkX3RlbnQgKHN0cnVjdCBpc2lzX3NwZnRyZWUgKnNwZnRyZWUsIAotICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhLCBpbnQgbGV2ZWwsIGludCBmYW1pbHkpCitpc2lzX3NwZl9wcmVsb2FkX3RlbnQgKHN0cnVjdCBpc2lzX3NwZnRyZWUgKnNwZnRyZWUsCisJCSAgICAgICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhLCBpbnQgbGV2ZWwsIGludCBmYW1pbHkpCiB7CiAgIHN0cnVjdCBpc2lzX3ZlcnRleCAqdmVydGV4OwogICBzdHJ1Y3QgaXNpc19jaXJjdWl0ICpjaXJjdWl0OwpAQCAtNjg1LDE0OCArNzMyLDE3MiBAQAogI2lmZGVmIEhBVkVfSVBWNgogICBzdHJ1Y3QgcHJlZml4X2lwdjYgKmlwdjY7CiAjZW5kaWYgLyogSEFWRV9JUFY2ICovCi0gIAotICBmb3IgKGNub2RlID0gbGlzdGhlYWQgKGFyZWEtPmNpcmN1aXRfbGlzdCk7IGNub2RlOyBuZXh0bm9kZSAoY25vZGUpKSB7Ci0gICAgY2lyY3VpdCA9IGdldGRhdGEgKGNub2RlKTsKLSAgICBpZiAoY2lyY3VpdC0+c3RhdGUgIT0gQ19TVEFURV9VUCkKLSAgICAgIGNvbnRpbnVlOwotICAgIGlmICghKGNpcmN1aXQtPmNpcmN1aXRfaXNfdHlwZSAmIGxldmVsKSkKLSAgICAgIGNvbnRpbnVlOwotICAgIGlmIChmYW1pbHkgPT0gQUZfSU5FVCAmJiAhY2lyY3VpdC0+aXBfcm91dGVyKQotICAgICAgY29udGludWU7Ci0jaWZkZWYgSEFWRV9JUFY2Ci0gICAgaWYgKGZhbWlseSA9PSBBRl9JTkVUNiAmJiAhY2lyY3VpdC0+aXB2Nl9yb3V0ZXIpCi0gICAgICBjb250aW51ZTsKLSNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KLSAgICAvKiAKLSAgICAgKiBBZGQgSVAodjYpIGFkZHJlc3NlcyBvZiB0aGlzIGNpcmN1aXQKLSAgICAgKi8KLSAgICBpZiAoZmFtaWx5ID09IEFGX0lORVQpIHsKLSAgICAgIHByZWZpeC5mYW1pbHkgPSBBRl9JTkVUOwotICAgICAgZm9yIChpcG5vZGUgPSAoY2lyY3VpdC0+aXBfYWRkcnMgPyBsaXN0aGVhZCAoY2lyY3VpdC0+aXBfYWRkcnMpIDogTlVMTCk7IAotICAgICAgICAgICBpcG5vZGU7IG5leHRub2RlIChpcG5vZGUpKSB7Ci0gICAgICAgIGlwdjQgPSBnZXRkYXRhIChpcG5vZGUpOwotICAgICAgICBwcmVmaXgudS5wcmVmaXg0ID0gaXB2NC0+cHJlZml4OwotICAgICAgICBwcmVmaXgucHJlZml4bGVuID0gaXB2NC0+cHJlZml4bGVuOwotICAgICAgICBpc2lzX3NwZl9hZGRfbG9jYWwgKHNwZnRyZWUsIFZUWVBFX0lQUkVBQ0hfSU5URVJOQUwsICZwcmVmaXgsIE5VTEwsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5KTsKLSAgICAgIH0KLSAgICB9Ci0jaWZkZWYgSEFWRV9JUFY2Ci0gICAgaWYgKGZhbWlseSA9PSBBRl9JTkVUNikgewotICAgICAgcHJlZml4LmZhbWlseSA9IEFGX0lORVQ2OwotICAgICAgZm9yIChpcG5vZGUgPSAoY2lyY3VpdC0+aXB2Nl9ub25fbGluayA/IGxpc3RoZWFkIAotICAgICAgICAgICAgICAgICAgICAgKGNpcmN1aXQtPmlwdjZfbm9uX2xpbmspIDogTlVMTCk7IGlwbm9kZTsgCi0gICAgICAgICAgIG5leHRub2RlIChpcG5vZGUpKSB7Ci0gICAgICAgIGlwdjYgPSBnZXRkYXRhIChpcG5vZGUpOwotICAgICAgICBwcmVmaXgucHJlZml4bGVuID0gaXB2Ni0+cHJlZml4bGVuOwotICAgICAgICBwcmVmaXgudS5wcmVmaXg2ID0gaXB2Ni0+cHJlZml4OwotICAgICAgICBpc2lzX3NwZl9hZGRfbG9jYWwgKHNwZnRyZWUsIFZUWVBFX0lQNlJFQUNIX0lOVEVSTkFMLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlZml4LCBOVUxMLCAwLCBmYW1pbHkpOwotICAgICAgfQotICAgIH0KLSNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KLSAgICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QgKSB7Ci0gICAgICAvKgotICAgICAgICogQWRkIHRoZSBhZGphY2VuY2llcwotICAgICAgICovCi0gICAgICBhZGpfbGlzdCA9IGxpc3RfbmV3ICgpOwotICAgICAgYWRqZGIgPSBjaXJjdWl0LT51LmJjLmFkamRiW2xldmVsIC0gMV07Ci0gICAgICBpc2lzX2Fkal9idWlsZF91cF9saXN0IChhZGpkYiwgYWRqX2xpc3QpOwotICAgICAgaWYgKGxpc3Rjb3VudCAoYWRqX2xpc3QpID09IDApIHsKLSAgICAgICAgbGlzdF9kZWxldGUgKGFkal9saXN0KTsKLSAgICAgICAgemxvZ193YXJuICgiSVNJUy1TcGY6IG5vIEwlZCBhZGphY2VuY2llcyBvbiBjaXJjdWl0ICVzIiwKLSAgICAgICAgICAgICAgICAgICBsZXZlbCwgY2lyY3VpdC0+aW50ZXJmYWNlLT5uYW1lKTsKKworICBmb3IgKGNub2RlID0gbGlzdGhlYWQgKGFyZWEtPmNpcmN1aXRfbGlzdCk7IGNub2RlOyBuZXh0bm9kZSAoY25vZGUpKQorICAgIHsKKyAgICAgIGNpcmN1aXQgPSBnZXRkYXRhIChjbm9kZSk7CisgICAgICBpZiAoY2lyY3VpdC0+c3RhdGUgIT0gQ19TVEFURV9VUCkKIAljb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGFub2RlID0gbGlzdGhlYWQgKGFkal9saXN0KTsKLSAgICAgIHdoaWxlIChhbm9kZSkgewotICAgICAgICBhZGogPSBnZXRkYXRhIChhbm9kZSk7Ci0gICAgICAgIGlmICghc3BlYWtzICgmYWRqLT5ubHBpZHMsIGZhbWlseSkpIHsKLSAgICAgICAgICBhbm9kZSA9IG5leHRub2RlIChhbm9kZSk7IAotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoYWRqLT5zeXNfdHlwZSkgewotICAgICAgICBjYXNlIElTSVNfU1lTVFlQRV9FUzoKLSAgICAgICAgICBpc2lzX3NwZl9hZGRfbG9jYWwgKHNwZnRyZWUsIFZUWVBFX0VTLCBhZGotPnN5c2lkLCBhZGosIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lyY3VpdC0+bWV0cmljc1tsZXZlbCAtIDFdLm1ldHJpY19kZWZhdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSVNJU19TWVNUWVBFX0lTOgotICAgICAgICBjYXNlIElTSVNfU1lTVFlQRV9MMV9JUzoKLSAgICAgICAgY2FzZSBJU0lTX1NZU1RZUEVfTDJfSVM6Ci0gICAgICAgICAgdmVydGV4ID0gCi0gICAgICAgICAgICBpc2lzX3NwZl9hZGRfbG9jYWwgKHNwZnRyZWUsIFZUWVBFX05PTlBTRVVET19JUywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkai0+c3lzaWQsIGFkaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lyY3VpdC0+bWV0cmljc1tsZXZlbCAtIDFdLm1ldHJpY19kZWZhdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkpOwotICAgICAgICAgIG1lbWNweSAobHNwX2lkLCBhZGotPnN5c2lkLCBJU0lTX1NZU19JRF9MRU4pOwotICAgICAgICAgIExTUF9QU0VVRE9fSUQobHNwX2lkKSA9IDA7Ci0gICAgICAgICAgTFNQX0ZSQUdNRU5UKGxzcF9pZCkgPSAwOwotICAgICAgICAgIGxzcCA9IGxzcF9zZWFyY2ggKGxzcF9pZCwgYXJlYS0+bHNwZGJbbGV2ZWwgLSAxXSk7Ci0gICAgICAgICAgaWYgKCFsc3ApCi0gICAgICAgICAgICB6bG9nX3dhcm4gKCJObyBsc3AgZm91bmQgZm9yIElTIGFkamFjZW5jeSIpOwotICAgICAgICAgIC8qICAgICAgICAgIGVsc2UgewotCSAgICBpc2lzX3NwZl9wcm9jZXNzX2xzcCAoc3BmdHJlZSwgbHNwLCB2ZXJ0ZXgtPmRfTiwgMSwgZmFtaWx5KTsKLSAgICAgICAgICAgIH0gKi8KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJU0lTX1NZU1RZUEVfVU5LTk9XTjoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB6bG9nX3dhcm4gKCJpc2lzX3NwZl9wcmVsb2FkX3RlbnQgdW5rbm93IGFkaiB0eXBlIik7Ci0gICAgICAgIH0KLSAgICAgICAgYW5vZGUgPSBuZXh0bm9kZSAoYW5vZGUpOyAKLSAgICAgIH0KLSAgICAgIGxpc3RfZGVsZXRlIChhZGpfbGlzdCk7Ci0gICAgICAvKgotICAgICAgICogQWRkIHRoZSBwc2V1ZG9ub2RlIAorICAgICAgaWYgKCEoY2lyY3VpdC0+Y2lyY3VpdF9pc190eXBlICYgbGV2ZWwpKQorCWNvbnRpbnVlOworICAgICAgaWYgKGZhbWlseSA9PSBBRl9JTkVUICYmICFjaXJjdWl0LT5pcF9yb3V0ZXIpCisJY29udGludWU7CisjaWZkZWYgSEFWRV9JUFY2CisgICAgICBpZiAoZmFtaWx5ID09IEFGX0lORVQ2ICYmICFjaXJjdWl0LT5pcHY2X3JvdXRlcikKKwljb250aW51ZTsKKyNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KKyAgICAgIC8qIAorICAgICAgICogQWRkIElQKHY2KSBhZGRyZXNzZXMgb2YgdGhpcyBjaXJjdWl0CiAgICAgICAgKi8KLSAgICAgIGlmIChsZXZlbCA9PSAxKQotICAgICAgICBtZW1jcHkgKGxzcF9pZCwgY2lyY3VpdC0+dS5iYy5sMV9kZXNpZ19pcywgSVNJU19TWVNfSURfTEVOICsgMSk7CisgICAgICBpZiAoZmFtaWx5ID09IEFGX0lORVQpCisJeworCSAgcHJlZml4LmZhbWlseSA9IEFGX0lORVQ7CisJICBmb3IgKGlwbm9kZSA9CisJICAgICAgIChjaXJjdWl0LT5pcF9hZGRycyA/IGxpc3RoZWFkIChjaXJjdWl0LT5pcF9hZGRycykgOiBOVUxMKTsKKwkgICAgICAgaXBub2RlOyBuZXh0bm9kZSAoaXBub2RlKSkKKwkgICAgeworCSAgICAgIGlwdjQgPSBnZXRkYXRhIChpcG5vZGUpOworCSAgICAgIHByZWZpeC51LnByZWZpeDQgPSBpcHY0LT5wcmVmaXg7CisJICAgICAgcHJlZml4LnByZWZpeGxlbiA9IGlwdjQtPnByZWZpeGxlbjsKKwkgICAgICBpc2lzX3NwZl9hZGRfbG9jYWwgKHNwZnRyZWUsIFZUWVBFX0lQUkVBQ0hfSU5URVJOQUwsICZwcmVmaXgsCisJCQkJICBOVUxMLCAwLCBmYW1pbHkpOworCSAgICB9CisJfQorI2lmZGVmIEhBVkVfSVBWNgorICAgICAgaWYgKGZhbWlseSA9PSBBRl9JTkVUNikKKwl7CisJICBwcmVmaXguZmFtaWx5ID0gQUZfSU5FVDY7CisJICBmb3IgKGlwbm9kZSA9IChjaXJjdWl0LT5pcHY2X25vbl9saW5rID8gbGlzdGhlYWQKKwkJCSAoY2lyY3VpdC0+aXB2Nl9ub25fbGluaykgOiBOVUxMKTsgaXBub2RlOworCSAgICAgICBuZXh0bm9kZSAoaXBub2RlKSkKKwkgICAgeworCSAgICAgIGlwdjYgPSBnZXRkYXRhIChpcG5vZGUpOworCSAgICAgIHByZWZpeC5wcmVmaXhsZW4gPSBpcHY2LT5wcmVmaXhsZW47CisJICAgICAgcHJlZml4LnUucHJlZml4NiA9IGlwdjYtPnByZWZpeDsKKwkgICAgICBpc2lzX3NwZl9hZGRfbG9jYWwgKHNwZnRyZWUsIFZUWVBFX0lQNlJFQUNIX0lOVEVSTkFMLAorCQkJCSAgJnByZWZpeCwgTlVMTCwgMCwgZmFtaWx5KTsKKwkgICAgfQorCX0KKyNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KKyAgICAgIGlmIChjaXJjdWl0LT5jaXJjX3R5cGUgPT0gQ0lSQ1VJVF9UX0JST0FEQ0FTVCkKKwl7CisJICAvKgorCSAgICogQWRkIHRoZSBhZGphY2VuY2llcworCSAgICovCisJICBhZGpfbGlzdCA9IGxpc3RfbmV3ICgpOworCSAgYWRqZGIgPSBjaXJjdWl0LT51LmJjLmFkamRiW2xldmVsIC0gMV07CisJICBpc2lzX2Fkal9idWlsZF91cF9saXN0IChhZGpkYiwgYWRqX2xpc3QpOworCSAgaWYgKGxpc3Rjb3VudCAoYWRqX2xpc3QpID09IDApCisJICAgIHsKKwkgICAgICBsaXN0X2RlbGV0ZSAoYWRqX2xpc3QpOworCSAgICAgIHpsb2dfd2FybiAoIklTSVMtU3BmOiBubyBMJWQgYWRqYWNlbmNpZXMgb24gY2lyY3VpdCAlcyIsCisJCQkgbGV2ZWwsIGNpcmN1aXQtPmludGVyZmFjZS0+bmFtZSk7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgIGFub2RlID0gbGlzdGhlYWQgKGFkal9saXN0KTsKKwkgIHdoaWxlIChhbm9kZSkKKwkgICAgeworCSAgICAgIGFkaiA9IGdldGRhdGEgKGFub2RlKTsKKwkgICAgICBpZiAoIXNwZWFrcyAoJmFkai0+bmxwaWRzLCBmYW1pbHkpKQorCQl7CisJCSAgYW5vZGUgPSBuZXh0bm9kZSAoYW5vZGUpOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgc3dpdGNoIChhZGotPnN5c190eXBlKQorCQl7CisJCWNhc2UgSVNJU19TWVNUWVBFX0VTOgorCQkgIGlzaXNfc3BmX2FkZF9sb2NhbCAoc3BmdHJlZSwgVlRZUEVfRVMsIGFkai0+c3lzaWQsIGFkaiwKKwkJCQkgICAgICBjaXJjdWl0LT5tZXRyaWNzW2xldmVsIC0KKwkJCQkJCSAgICAgICAxXS5tZXRyaWNfZGVmYXVsdCwKKwkJCQkgICAgICBmYW1pbHkpOworCQkgIGJyZWFrOworCQljYXNlIElTSVNfU1lTVFlQRV9JUzoKKwkJY2FzZSBJU0lTX1NZU1RZUEVfTDFfSVM6CisJCWNhc2UgSVNJU19TWVNUWVBFX0wyX0lTOgorCQkgIHZlcnRleCA9CisJCSAgICBpc2lzX3NwZl9hZGRfbG9jYWwgKHNwZnRyZWUsIFZUWVBFX05PTlBTRVVET19JUywKKwkJCQkJYWRqLT5zeXNpZCwgYWRqLAorCQkJCQljaXJjdWl0LT5tZXRyaWNzW2xldmVsIC0KKwkJCQkJCQkgMV0ubWV0cmljX2RlZmF1bHQsCisJCQkJCWZhbWlseSk7CisJCSAgbWVtY3B5IChsc3BfaWQsIGFkai0+c3lzaWQsIElTSVNfU1lTX0lEX0xFTik7CisJCSAgTFNQX1BTRVVET19JRCAobHNwX2lkKSA9IDA7CisJCSAgTFNQX0ZSQUdNRU5UIChsc3BfaWQpID0gMDsKKwkJICBsc3AgPSBsc3Bfc2VhcmNoIChsc3BfaWQsIGFyZWEtPmxzcGRiW2xldmVsIC0gMV0pOworCQkgIGlmICghbHNwKQorCQkgICAgemxvZ193YXJuICgiTm8gbHNwIGZvdW5kIGZvciBJUyBhZGphY2VuY3kiKTsKKwkJICAvKiAgICAgICAgICBlbHNlIHsKKwkJICAgICBpc2lzX3NwZl9wcm9jZXNzX2xzcCAoc3BmdHJlZSwgbHNwLCB2ZXJ0ZXgtPmRfTiwgMSwgZmFtaWx5KTsKKwkJICAgICB9ICovCisJCSAgYnJlYWs7CisJCWNhc2UgSVNJU19TWVNUWVBFX1VOS05PV046CisJCWRlZmF1bHQ6CisJCSAgemxvZ193YXJuICgiaXNpc19zcGZfcHJlbG9hZF90ZW50IHVua25vdyBhZGogdHlwZSIpOworCQl9CisJICAgICAgYW5vZGUgPSBuZXh0bm9kZSAoYW5vZGUpOworCSAgICB9CisJICBsaXN0X2RlbGV0ZSAoYWRqX2xpc3QpOworCSAgLyoKKwkgICAqIEFkZCB0aGUgcHNldWRvbm9kZSAKKwkgICAqLworCSAgaWYgKGxldmVsID09IDEpCisJICAgIG1lbWNweSAobHNwX2lkLCBjaXJjdWl0LT51LmJjLmwxX2Rlc2lnX2lzLCBJU0lTX1NZU19JRF9MRU4gKyAxKTsKKwkgIGVsc2UKKwkgICAgbWVtY3B5IChsc3BfaWQsIGNpcmN1aXQtPnUuYmMubDJfZGVzaWdfaXMsIElTSVNfU1lTX0lEX0xFTiArIDEpOworCSAgbHNwID0gbHNwX3NlYXJjaCAobHNwX2lkLCBhcmVhLT5sc3BkYltsZXZlbCAtIDFdKTsKKwkgIGFkaiA9IGlzaXNfYWRqX2xvb2t1cCAobHNwX2lkLCBhZGpkYik7CisJICAvKiBpZiBubyBhZGosIHdlIGFyZSB0aGUgZGlzIG9yIGVycm9yICovCisJICBpZiAoIWFkaiAmJiAhY2lyY3VpdC0+dS5iYy5pc19kcltsZXZlbCAtIDFdKQorCSAgICB7CisJICAgICAgemxvZ193YXJuICgiSVNJUy1TcGY6IE5vIGFkamFjZW5jeSBmb3VuZCBmb3IgRFIiKTsKKwkgICAgfQorCSAgaWYgKGxzcCA9PSBOVUxMIHx8IGxzcC0+bHNwX2hlYWRlci0+cmVtX2xpZmV0aW1lID09IDApCisJICAgIHsKKwkgICAgICB6bG9nX3dhcm4gKCJJU0lTLVNwZjogTm8gbHNwIGZvdW5kIGZvciBEUiIpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpc2lzX3NwZl9wcm9jZXNzX3BzZXVkb19sc3AKKwkJKHNwZnRyZWUsIGxzcCwgY2lyY3VpdC0+bWV0cmljc1tsZXZlbCAtIDFdLm1ldHJpY19kZWZhdWx0LCAwLAorCQkgZmFtaWx5KTsKKworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9QMlApCisJeworCSAgYWRqID0gY2lyY3VpdC0+dS5wMnAubmVpZ2hib3I7CisJICBpZiAoIWFkaikKKwkgICAgY29udGludWU7CisJICBzd2l0Y2ggKGFkai0+c3lzX3R5cGUpCisJICAgIHsKKwkgICAgY2FzZSBJU0lTX1NZU1RZUEVfRVM6CisJICAgICAgaXNpc19zcGZfYWRkX2xvY2FsIChzcGZ0cmVlLCBWVFlQRV9FUywgYWRqLT5zeXNpZCwgYWRqLAorCQkJCSAgY2lyY3VpdC0+bWV0cmljc1tsZXZlbCAtIDFdLm1ldHJpY19kZWZhdWx0LAorCQkJCSAgZmFtaWx5KTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBJU0lTX1NZU1RZUEVfSVM6CisJICAgIGNhc2UgSVNJU19TWVNUWVBFX0wxX0lTOgorCSAgICBjYXNlIElTSVNfU1lTVFlQRV9MMl9JUzoKKwkgICAgICBpZiAoc3BlYWtzICgmYWRqLT5ubHBpZHMsIGZhbWlseSkpCisJCWlzaXNfc3BmX2FkZF9sb2NhbCAoc3BmdHJlZSwgVlRZUEVfTk9OUFNFVURPX0lTLCBhZGotPnN5c2lkLAorCQkJCSAgICBhZGosCisJCQkJICAgIGNpcmN1aXQtPm1ldHJpY3NbbGV2ZWwgLQorCQkJCQkJICAgICAxXS5tZXRyaWNfZGVmYXVsdCwKKwkJCQkgICAgZmFtaWx5KTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBJU0lTX1NZU1RZUEVfVU5LTk9XTjoKKwkgICAgZGVmYXVsdDoKKwkgICAgICB6bG9nX3dhcm4gKCJpc2lzX3NwZl9wcmVsb2FkX3RlbnQgdW5rbm93IGFkaiB0eXBlIik7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CiAgICAgICBlbHNlCi0gICAgICAgIG1lbWNweSAobHNwX2lkLCBjaXJjdWl0LT51LmJjLmwyX2Rlc2lnX2lzLCBJU0lTX1NZU19JRF9MRU4gKyAxKTsKLSAgICAgIGxzcCA9IGxzcF9zZWFyY2ggKGxzcF9pZCwgYXJlYS0+bHNwZGJbbGV2ZWwgLSAxXSk7Ci0gICAgICBhZGogPSBpc2lzX2Fkal9sb29rdXAgKGxzcF9pZCwgIGFkamRiKTsKLSAgICAgIC8qIGlmIG5vIGFkaiwgd2UgYXJlIHRoZSBkaXMgb3IgZXJyb3IgKi8KLSAgICAgIGlmICghYWRqICYmICFjaXJjdWl0LT51LmJjLmlzX2RyW2xldmVsIC0gMV0pIHsKLSAgICAgICAgemxvZ193YXJuICgiSVNJUy1TcGY6IE5vIGFkamFjZW5jeSBmb3VuZCBmb3IgRFIiKTsKLSAgICAgIH0KLSAgICAgIGlmIChsc3AgPT0gIE5VTEwgfHwgbHNwLT5sc3BfaGVhZGVyLT5yZW1fbGlmZXRpbWUgPT0gMCkgewotICAgICAgICB6bG9nX3dhcm4gKCJJU0lTLVNwZjogTm8gbHNwIGZvdW5kIGZvciBEUiIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaXNpc19zcGZfcHJvY2Vzc19wc2V1ZG9fbHNwIAotICAgICAgICAgIChzcGZ0cmVlLCBsc3AsIGNpcmN1aXQtPm1ldHJpY3NbbGV2ZWwgLSAxXS5tZXRyaWNfZGVmYXVsdCwgMCwKLSAgICAgICAgICAgZmFtaWx5KTsKLSAgICAgICAgCi0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChjaXJjdWl0LT5jaXJjX3R5cGUgPT0gQ0lSQ1VJVF9UX1AyUCApIHsKLSAgICAgIGFkaiA9IGNpcmN1aXQtPnUucDJwLm5laWdoYm9yOwotICAgICAgaWYgKCFhZGopCi0JY29udGludWU7Ci0gICAgICBzd2l0Y2ggKGFkai0+c3lzX3R5cGUpIHsKLSAgICAgIGNhc2UgSVNJU19TWVNUWVBFX0VTOgotICAgICAgICBpc2lzX3NwZl9hZGRfbG9jYWwgKHNwZnRyZWUsIFZUWVBFX0VTLCBhZGotPnN5c2lkLCBhZGosIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpcmN1aXQtPm1ldHJpY3NbbGV2ZWwgLSAxXS5tZXRyaWNfZGVmYXVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSVNJU19TWVNUWVBFX0lTOgotICAgICAgY2FzZSBJU0lTX1NZU1RZUEVfTDFfSVM6Ci0gICAgICBjYXNlIElTSVNfU1lTVFlQRV9MMl9JUzoKLSAgICAgICAgaWYgKHNwZWFrcyAoJmFkai0+bmxwaWRzLCBmYW1pbHkpKQotICAgICAgICAgIGlzaXNfc3BmX2FkZF9sb2NhbCAoc3BmdHJlZSwgVlRZUEVfTk9OUFNFVURPX0lTLCBhZGotPnN5c2lkLCBhZGosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXJjdWl0LT5tZXRyaWNzW2xldmVsIC0gMV0ubWV0cmljX2RlZmF1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSVNJU19TWVNUWVBFX1VOS05PV046Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB6bG9nX3dhcm4gKCJpc2lzX3NwZl9wcmVsb2FkX3RlbnQgdW5rbm93IGFkaiB0eXBlIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB6bG9nX3dhcm4gKCJpc2lzX3NwZl9wcmVsb2FkX3RlbnQgdW5zdXBwb3J0ZWQgbWVkaWEiKTsKLSAgICAgIHJldHZhbCA9IElTSVNfV0FSTklORzsKKwl7CisJICB6bG9nX3dhcm4gKCJpc2lzX3NwZl9wcmVsb2FkX3RlbnQgdW5zdXBwb3J0ZWQgbWVkaWEiKTsKKwkgIHJldHZhbCA9IElTSVNfV0FSTklORzsKKwl9CisKICAgICB9Ci0gICAgCi0gIH0KIAogICByZXR1cm4gcmV0dmFsOwogfQpAQCAtODM3LDM5ICs5MDgsMzggQEAKICAqLwogdm9pZAogYWRkX3RvX3BhdGhzIChzdHJ1Y3QgaXNpc19zcGZ0cmVlICpzcGZ0cmVlLCBzdHJ1Y3QgaXNpc192ZXJ0ZXggKnZlcnRleCwKLSAgICAgICAgICAgICAgc3RydWN0IGlzaXNfYXJlYSAqYXJlYSkKKwkgICAgICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhKQogewotCiAjaWZkZWYgRVhUUkVNRV9ERUJVRwogICB1X2NoYXIgYnVmZltCVUZTSVpdOwogI2VuZGlmIC8qIEVYVFJFTUVfREVCVUcgKi8KICAgbGlzdG5vZGVfYWRkIChzcGZ0cmVlLT5wYXRocywgdmVydGV4KTsKIAotI2lmZGVmIEVYVFJFTUVfREVCVUcgIAorI2lmZGVmIEVYVFJFTUVfREVCVUcKICAgemxvZ19pbmZvICgiSVNJUy1TcGY6IGFkZGVkICAlcyAlcyBkZXB0aCAlZCBkaXN0ICVkIHRvIFBBVEhTIiwKLSAgICAgICAgICAgICB2dHlwZTJzdHJpbmcodmVydGV4LT50eXBlKSwgdmlkMnN0cmluZyh2ZXJ0ZXgsIGJ1ZmYpLAotICAgICAgICAgICAgIHZlcnRleC0+ZGVwdGgsIHZlcnRleC0+ZF9OKTsKLSNlbmRpZiAvKiBFWFRSRU1FX0RFQlVHICovICAKLSAgaWYgKHZlcnRleC0+dHlwZSA+IFZUWVBFX0VTKSB7Ci0gICAgaWYgKGxpc3Rjb3VudCh2ZXJ0ZXgtPkFkal9OKSA+IDApCi0gICAgICBpc2lzX3JvdXRlX2NyZWF0ZSAoKHN0cnVjdCBwcmVmaXggKikmdmVydGV4LT5OLnByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXgtPmRfTiwgdmVydGV4LT5kZXB0aCwgdmVydGV4LT5BZGpfTiwgYXJlYSk7Ci0gICAgZWxzZSBpZiAoaXNpcy0+ZGVidWdzICYgREVCVUdfU1BGX0VWRU5UUykKLSAgICAgIHpsb2dfaW5mbyAoIklTSVMtU3BmOiBubyBhZGphY2VuY2llcyBkbyBub3QgaW5zdGFsbCByb3V0ZSIpOwotICB9Ci0gIAorCSAgICAgdnR5cGUyc3RyaW5nICh2ZXJ0ZXgtPnR5cGUpLCB2aWQyc3RyaW5nICh2ZXJ0ZXgsIGJ1ZmYpLAorCSAgICAgdmVydGV4LT5kZXB0aCwgdmVydGV4LT5kX04pOworI2VuZGlmIC8qIEVYVFJFTUVfREVCVUcgKi8KKyAgaWYgKHZlcnRleC0+dHlwZSA+IFZUWVBFX0VTKQorICAgIHsKKyAgICAgIGlmIChsaXN0Y291bnQgKHZlcnRleC0+QWRqX04pID4gMCkKKwlpc2lzX3JvdXRlX2NyZWF0ZSAoKHN0cnVjdCBwcmVmaXggKikgJnZlcnRleC0+Ti5wcmVmaXgsCisJCQkgICB2ZXJ0ZXgtPmRfTiwgdmVydGV4LT5kZXB0aCwgdmVydGV4LT5BZGpfTiwgYXJlYSk7CisgICAgICBlbHNlIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19TUEZfRVZFTlRTKQorCXpsb2dfaW5mbyAoIklTSVMtU3BmOiBubyBhZGphY2VuY2llcyBkbyBub3QgaW5zdGFsbCByb3V0ZSIpOworICAgIH0KKwogICByZXR1cm47CiB9CiAKLQogdm9pZAogaW5pdF9zcHQgKHN0cnVjdCBpc2lzX3NwZnRyZWUgKnNwZnRyZWUpCiB7Ci0gIHNwZnRyZWUtPnRlbnRzLT5kZWwgPSBzcGZ0cmVlLT5wYXRocy0+ZGVsID0gKHZvaWQgKilpc2lzX3ZlcnRleF9kZWw7CisgIHNwZnRyZWUtPnRlbnRzLT5kZWwgPSBzcGZ0cmVlLT5wYXRocy0+ZGVsID0gKHZvaWQgKikgaXNpc192ZXJ0ZXhfZGVsOwogICBsaXN0X2RlbGV0ZV9hbGxfbm9kZSAoc3BmdHJlZS0+dGVudHMpOwogICBsaXN0X2RlbGV0ZV9hbGxfbm9kZSAoc3BmdHJlZS0+cGF0aHMpOwogICBzcGZ0cmVlLT50ZW50cy0+ZGVsID0gc3BmdHJlZS0+cGF0aHMtPmRlbCA9IE5VTEw7Ci0gIAorCiAgIHJldHVybjsKIH0KIApAQCAtODc5LDE3ICs5NDksMTcgQEAKICAgaW50IHJldHZhbCA9IElTSVNfT0s7CiAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKICAgc3RydWN0IGlzaXNfdmVydGV4ICp2ZXJ0ZXg7Ci0gIHN0cnVjdCBpc2lzX3NwZnRyZWUgKnNwZnRyZWUgPSBOVUxMOyAKKyAgc3RydWN0IGlzaXNfc3BmdHJlZSAqc3BmdHJlZSA9IE5VTEw7CiAgIHVfY2hhciBsc3BfaWRbSVNJU19TWVNfSURfTEVOICsgMl07CiAgIHN0cnVjdCBpc2lzX2xzcCAqbHNwOwotICAKKwogICBpZiAoZmFtaWx5ID09IEFGX0lORVQpCiAgICAgc3BmdHJlZSA9IGFyZWEtPnNwZnRyZWVbbGV2ZWwgLSAxXTsKICNpZmRlZiBIQVZFX0lQVjYKICAgZWxzZSBpZiAoZmFtaWx5ID09IEFGX0lORVQ2KQogICAgIHNwZnRyZWUgPSBhcmVhLT5zcGZ0cmVlNltsZXZlbCAtIDFdOwogI2VuZGlmCi0gIAorCiAgIGFzc2VydCAoc3BmdHJlZSk7CiAKICAgLyoKQEAgLTkwMCw2MCArOTcwLDcyIEBACiAgIGlzaXNfc3BmX2FkZF9zZWxmIChzcGZ0cmVlLCBhcmVhLCBsZXZlbCk7CiAgIC8qICAgICAgICAgICAgICBiKSAqLwogICByZXR2YWwgPSBpc2lzX3NwZl9wcmVsb2FkX3RlbnQgKHNwZnRyZWUsIGFyZWEsIGxldmVsLCBmYW1pbHkpOwotICAKKwogICAvKgogICAgKiBDLjIuNyBTdGVwIDIKICAgICovCi0gIGlmIChsaXN0Y291bnQgKHNwZnRyZWUtPnRlbnRzKSA9PSAwKSB7Ci0gICAgemxvZ193YXJuICgiSVNJUy1TcGY6IFRFTlQgaXMgZW1wdHkiKTsKLSAgICBzcGZ0cmVlLT5sYXN0cnVuID0gdGltZSAoTlVMTCk7Ci0gICAgcmV0dXJuIHJldHZhbDsKLSAgfQotCi0gIHdoaWxlIChsaXN0Y291bnQgKHNwZnRyZWUtPnRlbnRzKSA+IDApIHsKLSAgICBub2RlID0gbGlzdGhlYWQgKHNwZnRyZWUtPnRlbnRzKTsKLSAgICB2ZXJ0ZXggPSBnZXRkYXRhIChub2RlKTsKLSAgICAvKiBSZW1vdmUgZnJvbSB0ZW50IGxpc3QgKi8KLSAgICBsaXN0X2RlbGV0ZV9ub2RlIChzcGZ0cmVlLT50ZW50cywgbm9kZSk7Ci0gICAgaWYgKGlzaXNfZmluZF92ZXJ0ZXggKHNwZnRyZWUtPnBhdGhzLCB2ZXJ0ZXgtPk4uaWQsIHZlcnRleC0+dHlwZSkpCi0gICAgICBjb250aW51ZTsKLSAgICBhZGRfdG9fcGF0aHMgKHNwZnRyZWUsIHZlcnRleCwgYXJlYSk7Ci0gICAgaWYgKHZlcnRleC0+dHlwZSA9PSBWVFlQRV9QU0VVRE9fSVMgfHwgCi0gICAgICAgIHZlcnRleC0+dHlwZSA9PSBWVFlQRV9OT05QU0VVRE9fSVMpIHsKLSAgICAgIG1lbWNweSAobHNwX2lkLCB2ZXJ0ZXgtPk4uaWQsIElTSVNfU1lTX0lEX0xFTiArIDEpOwotICAgICAgTFNQX0ZSQUdNRU5UKGxzcF9pZCkgPSAwOwotICAgICAgbHNwID0gbHNwX3NlYXJjaCAobHNwX2lkLCBhcmVhLT5sc3BkYltsZXZlbCAtIDFdKTsKLSAgICAgIGlmIChsc3ApIHsKLQlpZiAoTFNQX1BTRVVET19JRCAobHNwX2lkKSkgewotICAgICAgICAgIGlzaXNfc3BmX3Byb2Nlc3NfcHNldWRvX2xzcCAoc3BmdHJlZSwgbHNwLCB2ZXJ0ZXgtPmRfTiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXgtPmRlcHRoLCBmYW1pbHkpOwotICAgICAgICAKLSAgICAgICAgfSBlbHNlIHsKLQkgIGlzaXNfc3BmX3Byb2Nlc3NfbHNwIChzcGZ0cmVlLCBsc3AsIHZlcnRleC0+ZF9OLCB2ZXJ0ZXgtPmRlcHRoLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5KTsKLQl9Ci0gICAgICB9IGVsc2UgewotICAgICAgICB6bG9nX3dhcm4gKCJJU0lTLVNwZjogTm8gTFNQIGZvdW5kIGZvciAlcyIsIHJhd2xzcGlkX3ByaW50IChsc3BfaWQpKTsKLSAgICAgIH0KKyAgaWYgKGxpc3Rjb3VudCAoc3BmdHJlZS0+dGVudHMpID09IDApCisgICAgeworICAgICAgemxvZ193YXJuICgiSVNJUy1TcGY6IFRFTlQgaXMgZW1wdHkiKTsKKyAgICAgIHNwZnRyZWUtPmxhc3RydW4gPSB0aW1lIChOVUxMKTsKKyAgICAgIHJldHVybiByZXR2YWw7CiAgICAgfQotICB9Ci0gIAorCisgIHdoaWxlIChsaXN0Y291bnQgKHNwZnRyZWUtPnRlbnRzKSA+IDApCisgICAgeworICAgICAgbm9kZSA9IGxpc3RoZWFkIChzcGZ0cmVlLT50ZW50cyk7CisgICAgICB2ZXJ0ZXggPSBnZXRkYXRhIChub2RlKTsKKyAgICAgIC8qIFJlbW92ZSBmcm9tIHRlbnQgbGlzdCAqLworICAgICAgbGlzdF9kZWxldGVfbm9kZSAoc3BmdHJlZS0+dGVudHMsIG5vZGUpOworICAgICAgaWYgKGlzaXNfZmluZF92ZXJ0ZXggKHNwZnRyZWUtPnBhdGhzLCB2ZXJ0ZXgtPk4uaWQsIHZlcnRleC0+dHlwZSkpCisJY29udGludWU7CisgICAgICBhZGRfdG9fcGF0aHMgKHNwZnRyZWUsIHZlcnRleCwgYXJlYSk7CisgICAgICBpZiAodmVydGV4LT50eXBlID09IFZUWVBFX1BTRVVET19JUyB8fAorCSAgdmVydGV4LT50eXBlID09IFZUWVBFX05PTlBTRVVET19JUykKKwl7CisJICBtZW1jcHkgKGxzcF9pZCwgdmVydGV4LT5OLmlkLCBJU0lTX1NZU19JRF9MRU4gKyAxKTsKKwkgIExTUF9GUkFHTUVOVCAobHNwX2lkKSA9IDA7CisJICBsc3AgPSBsc3Bfc2VhcmNoIChsc3BfaWQsIGFyZWEtPmxzcGRiW2xldmVsIC0gMV0pOworCSAgaWYgKGxzcCkKKwkgICAgeworCSAgICAgIGlmIChMU1BfUFNFVURPX0lEIChsc3BfaWQpKQorCQl7CisJCSAgaXNpc19zcGZfcHJvY2Vzc19wc2V1ZG9fbHNwIChzcGZ0cmVlLCBsc3AsIHZlcnRleC0+ZF9OLAorCQkJCQkgICAgICAgdmVydGV4LT5kZXB0aCwgZmFtaWx5KTsKKworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgaXNpc19zcGZfcHJvY2Vzc19sc3AgKHNwZnRyZWUsIGxzcCwgdmVydGV4LT5kX04sCisJCQkJCXZlcnRleC0+ZGVwdGgsIGZhbWlseSk7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgemxvZ193YXJuICgiSVNJUy1TcGY6IE5vIExTUCBmb3VuZCBmb3IgJXMiLAorCQkJIHJhd2xzcGlkX3ByaW50IChsc3BfaWQpKTsKKwkgICAgfQorCX0KKyAgICB9CisKICAgdGhyZWFkX2FkZF9ldmVudCAobWFzdGVyLCBpc2lzX3JvdXRlX3ZhbGlkYXRlLCBhcmVhLCAwKTsKICAgc3BmdHJlZS0+bGFzdHJ1biA9IHRpbWUgKE5VTEwpOwogICBzcGZ0cmVlLT5wZW5kaW5nID0gMDsKLSAgCi0gIGlmIChsZXZlbCA9PSAxKSB7Ci0gICAgLyogRklYTUU6IFNob3VsZCBkbyBpdCBlYXJsaWVyLiAqLwotICAgIHNwZnRyZWUtPnRfc3BmX3BlcmlvZGljID0gTlVMTDsKLSAgICBUSFJFQURfVElNRVJfT04obWFzdGVyLCBzcGZ0cmVlLT50X3NwZl9wZXJpb2RpYywgaXNpc19ydW5fc3BmX2wxLCBhcmVhLAotICAgICAgICBpc2lzX2ppdHRlcihQRVJJT0RJQ19TUEZfSU5URVJWQUwsIDEwKSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgLyogRklYTUU6IFNob3VsZCBkbyBpdCBlYXJsaWVyLiAqLwotICAgIHNwZnRyZWUtPnRfc3BmX3BlcmlvZGljID0gTlVMTDsKLSAgICBUSFJFQURfVElNRVJfT04obWFzdGVyLCBzcGZ0cmVlLT50X3NwZl9wZXJpb2RpYywgaXNpc19ydW5fc3BmX2wyLCBhcmVhLAotICAgICAgICBpc2lzX2ppdHRlcihQRVJJT0RJQ19TUEZfSU5URVJWQUwsIDEwKSk7Ci0gIH0KKworICBpZiAobGV2ZWwgPT0gMSkKKyAgICB7CisgICAgICAvKiBGSVhNRTogU2hvdWxkIGRvIGl0IGVhcmxpZXIuICovCisgICAgICBzcGZ0cmVlLT50X3NwZl9wZXJpb2RpYyA9IE5VTEw7CisgICAgICBUSFJFQURfVElNRVJfT04gKG1hc3Rlciwgc3BmdHJlZS0+dF9zcGZfcGVyaW9kaWMsIGlzaXNfcnVuX3NwZl9sMSwgYXJlYSwKKwkJICAgICAgIGlzaXNfaml0dGVyIChQRVJJT0RJQ19TUEZfSU5URVJWQUwsIDEwKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogRklYTUU6IFNob3VsZCBkbyBpdCBlYXJsaWVyLiAqLworICAgICAgc3BmdHJlZS0+dF9zcGZfcGVyaW9kaWMgPSBOVUxMOworICAgICAgVEhSRUFEX1RJTUVSX09OIChtYXN0ZXIsIHNwZnRyZWUtPnRfc3BmX3BlcmlvZGljLCBpc2lzX3J1bl9zcGZfbDIsIGFyZWEsCisJCSAgICAgICBpc2lzX2ppdHRlciAoUEVSSU9ESUNfU1BGX0lOVEVSVkFMLCAxMCkpOworICAgIH0KIAogICByZXR1cm4gcmV0dmFsOwogfQpAQCAtOTY0LDIxICsxMDQ2LDI0IEBACiAgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWE7CiAgIGludCByZXR2YWwgPSBJU0lTX09LOwogCi0gIGFyZWEgPSBUSFJFQURfQVJHKHRocmVhZCk7CisgIGFyZWEgPSBUSFJFQURfQVJHICh0aHJlYWQpOwogICBhc3NlcnQgKGFyZWEpOwogCi0gIGlmICghKGFyZWEtPmlzX3R5cGUgJiBJU19MRVZFTF8xKSkgewotICAgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19TUEZfRVZFTlRTKSB7Ci0gICAgICB6bG9nX3dhcm4gKCJJU0lTLVNQRiAoJXMpIGFyZWEgZG9lcyBub3Qgc2hhcmUgbGV2ZWwiLCBhcmVhLT5hcmVhX3RhZyk7CisgIGlmICghKGFyZWEtPmlzX3R5cGUgJiBJU19MRVZFTF8xKSkKKyAgICB7CisgICAgICBpZiAoaXNpcy0+ZGVidWdzICYgREVCVUdfU1BGX0VWRU5UUykKKwl7CisJICB6bG9nX3dhcm4gKCJJU0lTLVNQRiAoJXMpIGFyZWEgZG9lcyBub3Qgc2hhcmUgbGV2ZWwiLAorCQkgICAgIGFyZWEtPmFyZWFfdGFnKTsKKwl9CisgICAgICByZXR1cm4gSVNJU19XQVJOSU5HOwogICAgIH0KLSAgICByZXR1cm4gSVNJU19XQVJOSU5HOwotICB9CiAKLSAgaWYgKGlzaXMtPmRlYnVncyAmIERFQlVHX1NQRl9FVkVOVFMpIHsKLSAgICB6bG9nX2luZm8gKCJJU0lTLVNwZiAoJXMpIEwxIFNQRiBuZWVkZWQsIHBlcmlvZGljIFNQRiIsCi0gICAgICAgICAgICAgICBhcmVhLT5hcmVhX3RhZyk7Ci0gIH0KLSAgCisgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19TUEZfRVZFTlRTKQorICAgIHsKKyAgICAgIHpsb2dfaW5mbyAoIklTSVMtU3BmICglcykgTDEgU1BGIG5lZWRlZCwgcGVyaW9kaWMgU1BGIiwgYXJlYS0+YXJlYV90YWcpOworICAgIH0KKwogICBpZiAoYXJlYS0+aXBfY2lyY3VpdHMpCiAgICAgcmV0dmFsID0gaXNpc19ydW5fc3BmIChhcmVhLCAxLCBBRl9JTkVUKTsKICNpZmRlZiBIQVZFX0lQVjYKQEAgLTk5NCwyMCArMTA3OSwyMyBAQAogICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOwogICBpbnQgcmV0dmFsID0gSVNJU19PSzsKIAotICBhcmVhID0gVEhSRUFEX0FSRyh0aHJlYWQpOworICBhcmVhID0gVEhSRUFEX0FSRyAodGhyZWFkKTsKICAgYXNzZXJ0IChhcmVhKTsKLSAgCi0gIGlmICghKGFyZWEtPmlzX3R5cGUgJiBJU19MRVZFTF8yKSkgewotICAgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19TUEZfRVZFTlRTKSB7Ci0gICAgICB6bG9nX3dhcm4gKCJJU0lTLVNQRiAoJXMpIGFyZWEgZG9lcyBub3Qgc2hhcmUgbGV2ZWwiLCBhcmVhLT5hcmVhX3RhZyk7CisKKyAgaWYgKCEoYXJlYS0+aXNfdHlwZSAmIElTX0xFVkVMXzIpKQorICAgIHsKKyAgICAgIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19TUEZfRVZFTlRTKQorCXsKKwkgIHpsb2dfd2FybiAoIklTSVMtU1BGICglcykgYXJlYSBkb2VzIG5vdCBzaGFyZSBsZXZlbCIsCisJCSAgICAgYXJlYS0+YXJlYV90YWcpOworCX0KKyAgICAgIHJldHVybiBJU0lTX1dBUk5JTkc7CiAgICAgfQotICAgIHJldHVybiBJU0lTX1dBUk5JTkc7Ci0gIH0KLSAgCi0gIGlmIChpc2lzLT5kZWJ1Z3MgJiBERUJVR19TUEZfRVZFTlRTKSB7Ci0gICAgemxvZ19pbmZvICgiSVNJUy1TcGYgKCVzKSBMMiBTUEYgbmVlZGVkLCBwZXJpb2RpYyBTUEYiLAotICAgICAgICAgICAgICAgYXJlYS0+YXJlYV90YWcpOwotICB9CisKKyAgaWYgKGlzaXMtPmRlYnVncyAmIERFQlVHX1NQRl9FVkVOVFMpCisgICAgeworICAgICAgemxvZ19pbmZvICgiSVNJUy1TcGYgKCVzKSBMMiBTUEYgbmVlZGVkLCBwZXJpb2RpYyBTUEYiLCBhcmVhLT5hcmVhX3RhZyk7CisgICAgfQogCiAgIGlmIChhcmVhLT5pcF9jaXJjdWl0cykKICAgICByZXR2YWwgPSBpc2lzX3J1bl9zcGYgKGFyZWEsIDIsIEFGX0lORVQpOwpAQCAtMTAxOSw3ICsxMTA3LDcgQEAKICAgcmV0dXJuIHJldHZhbDsKIH0KIAotaW50IAoraW50CiBpc2lzX3NwZl9zY2hlZHVsZSAoc3RydWN0IGlzaXNfYXJlYSAqYXJlYSwgaW50IGxldmVsKQogewogICBpbnQgcmV0dmFsID0gSVNJU19PSzsKQEAgLTEwMjksNDMgKzExMTcsNDUgQEAKICAgaWYgKHNwZnRyZWUtPnBlbmRpbmcpCiAgICAgcmV0dXJuIHJldHZhbDsKIAotICBkaWZmID0gbm93IC0gc3BmdHJlZS0+bGFzdHJ1bjsgCisgIGRpZmYgPSBub3cgLSBzcGZ0cmVlLT5sYXN0cnVuOwogCiAgIC8qIEZJWE1FOiBsZXQncyB3YWl0IGEgbWludXRlIGJlZm9yZSBkb2luZyB0aGUgU1BGICovCi0gIGlmIChub3cgLSBpc2lzLT51cHRpbWUgPCA2MCB8fCBpc2lzLT51cHRpbWUgPT0gMCkgewotICAgIGlmIChsZXZlbCA9PSAxKQotICAgICAgdGhyZWFkX2FkZF90aW1lciAobWFzdGVyLCBpc2lzX3J1bl9zcGZfbDEsIGFyZWEsIAotICAgICAgICAgICAgICAgICAgICAgICAgNjApOwotICAgIGVsc2UKLSAgICAgIHRocmVhZF9hZGRfdGltZXIgKG1hc3RlciwgaXNpc19ydW5fc3BmX2wyLCBhcmVhLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIDYwKTsKKyAgaWYgKG5vdyAtIGlzaXMtPnVwdGltZSA8IDYwIHx8IGlzaXMtPnVwdGltZSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChsZXZlbCA9PSAxKQorCXRocmVhZF9hZGRfdGltZXIgKG1hc3RlciwgaXNpc19ydW5fc3BmX2wxLCBhcmVhLCA2MCk7CisgICAgICBlbHNlCisJdGhyZWFkX2FkZF90aW1lciAobWFzdGVyLCBpc2lzX3J1bl9zcGZfbDIsIGFyZWEsIDYwKTsKIAotICAgIHNwZnRyZWUtPnBlbmRpbmcgPSAxOwotICAgIHJldHVybiByZXR2YWw7Ci0gIH0KKyAgICAgIHNwZnRyZWUtPnBlbmRpbmcgPSAxOworICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CiAgIC8qIEZJWE1FOiBUaGlzIHN0dWZmIGlzIGp1c3QgbWVzcy4gQWxsIHNwZiB0aHJlYWQgYWRkL2NhbmNlbAogICAgICBsb2dpYyBzaG91bGQgYmUgcmV2aWV3ZWQuICovCi0gIFRIUkVBRF9USU1FUl9PRkYoc3BmdHJlZS0+dF9zcGZfcGVyaW9kaWMpOworICBUSFJFQURfVElNRVJfT0ZGIChzcGZ0cmVlLT50X3NwZl9wZXJpb2RpYyk7CiAKLSAgaWYgKGRpZmYgPCBNSU5JTVVNX1NQRl9JTlRFUlZBTCkgewotICAgIGlmIChsZXZlbCA9PSAxKQotICAgICAgdGhyZWFkX2FkZF90aW1lciAobWFzdGVyLCBpc2lzX3J1bl9zcGZfbDEsIGFyZWEsIAotICAgICAgICAgICAgICAgICAgICAgICAgTUlOSU1VTV9TUEZfSU5URVJWQUwgLSBkaWZmKTsKLSAgICBlbHNlCi0gICAgICB0aHJlYWRfYWRkX3RpbWVyIChtYXN0ZXIsIGlzaXNfcnVuX3NwZl9sMiwgYXJlYSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBNSU5JTVVNX1NQRl9JTlRFUlZBTCAtIGRpZmYpOworICBpZiAoZGlmZiA8IE1JTklNVU1fU1BGX0lOVEVSVkFMKQorICAgIHsKKyAgICAgIGlmIChsZXZlbCA9PSAxKQorCXRocmVhZF9hZGRfdGltZXIgKG1hc3RlciwgaXNpc19ydW5fc3BmX2wxLCBhcmVhLAorCQkJICBNSU5JTVVNX1NQRl9JTlRFUlZBTCAtIGRpZmYpOworICAgICAgZWxzZQorCXRocmVhZF9hZGRfdGltZXIgKG1hc3RlciwgaXNpc19ydW5fc3BmX2wyLCBhcmVhLAorCQkJICBNSU5JTVVNX1NQRl9JTlRFUlZBTCAtIGRpZmYpOwogCi0gICAgc3BmdHJlZS0+cGVuZGluZyA9IDE7Ci0gIH0gZWxzZSB7Ci0gICAgc3BmdHJlZS0+cGVuZGluZyA9IDA7Ci0gICAgcmV0dmFsID0gaXNpc19ydW5fc3BmIChhcmVhLCBsZXZlbCwgQUZfSU5FVCk7Ci0gIH0KKyAgICAgIHNwZnRyZWUtPnBlbmRpbmcgPSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNwZnRyZWUtPnBlbmRpbmcgPSAwOworICAgICAgcmV0dmFsID0gaXNpc19ydW5fc3BmIChhcmVhLCBsZXZlbCwgQUZfSU5FVCk7CisgICAgfQogCiAgIHJldHVybiByZXR2YWw7CiB9CiAKICNpZmRlZiBIQVZFX0lQVjYKLWludCAKK2ludAogaXNpc19zcGZfc2NoZWR1bGU2IChzdHJ1Y3QgaXNpc19hcmVhICphcmVhLCBpbnQgbGV2ZWwpCiB7CiAgIGludCByZXR2YWwgPSBJU0lTX09LOwpAQCAtMTA3NSwzNyArMTE2NSwzOSBAQAogICBpZiAoc3BmdHJlZS0+cGVuZGluZykKICAgICByZXR1cm4gcmV0dmFsOwogCi0gIGRpZmYgPSBub3cgLSBzcGZ0cmVlLT5sYXN0cnVuOyAKLSAgCi0gIFRIUkVBRF9USU1FUl9PRkYoc3BmdHJlZS0+dF9zcGZfcGVyaW9kaWMpOwotICAKKyAgZGlmZiA9IG5vdyAtIHNwZnRyZWUtPmxhc3RydW47CisKKyAgVEhSRUFEX1RJTUVSX09GRiAoc3BmdHJlZS0+dF9zcGZfcGVyaW9kaWMpOworCiAgIC8qIEZJWE1FOiBsZXQncyB3YWl0IGEgbWludXRlIGJlZm9yZSBkb2luZyB0aGUgU1BGICovCi0gIGlmIChub3cgLSBpc2lzLT51cHRpbWUgPCA2MCB8fCBpc2lzLT51cHRpbWUgPT0gMCkgewotICAgIGlmIChsZXZlbCA9PSAxKQotICAgICAgdGhyZWFkX2FkZF90aW1lciAobWFzdGVyLCBpc2lzX3J1bl9zcGZfbDEsIGFyZWEsIAotICAgICAgICAgICAgICAgICAgICAgICAgNjApOwotICAgIGVsc2UKLSAgICAgIHRocmVhZF9hZGRfdGltZXIgKG1hc3RlciwgaXNpc19ydW5fc3BmX2wyLCBhcmVhLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIDYwKTsKKyAgaWYgKG5vdyAtIGlzaXMtPnVwdGltZSA8IDYwIHx8IGlzaXMtPnVwdGltZSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChsZXZlbCA9PSAxKQorCXRocmVhZF9hZGRfdGltZXIgKG1hc3RlciwgaXNpc19ydW5fc3BmX2wxLCBhcmVhLCA2MCk7CisgICAgICBlbHNlCisJdGhyZWFkX2FkZF90aW1lciAobWFzdGVyLCBpc2lzX3J1bl9zcGZfbDIsIGFyZWEsIDYwKTsKIAotICAgIHNwZnRyZWUtPnBlbmRpbmcgPSAxOwotICAgIHJldHVybiByZXR2YWw7Ci0gIH0KKyAgICAgIHNwZnRyZWUtPnBlbmRpbmcgPSAxOworICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CiAKIAotICBpZiAoZGlmZiA8IE1JTklNVU1fU1BGX0lOVEVSVkFMKSB7Ci0gICAgaWYgKGxldmVsID09IDEpCi0gICAgICB0aHJlYWRfYWRkX3RpbWVyIChtYXN0ZXIsIGlzaXNfcnVuX3NwZl9sMSwgYXJlYSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBNSU5JTVVNX1NQRl9JTlRFUlZBTCAtIGRpZmYpOwotICAgIGVsc2UKLSAgICAgIHRocmVhZF9hZGRfdGltZXIgKG1hc3RlciwgaXNpc19ydW5fc3BmX2wyLCBhcmVhLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIE1JTklNVU1fU1BGX0lOVEVSVkFMIC0gZGlmZik7CisgIGlmIChkaWZmIDwgTUlOSU1VTV9TUEZfSU5URVJWQUwpCisgICAgeworICAgICAgaWYgKGxldmVsID09IDEpCisJdGhyZWFkX2FkZF90aW1lciAobWFzdGVyLCBpc2lzX3J1bl9zcGZfbDEsIGFyZWEsCisJCQkgIE1JTklNVU1fU1BGX0lOVEVSVkFMIC0gZGlmZik7CisgICAgICBlbHNlCisJdGhyZWFkX2FkZF90aW1lciAobWFzdGVyLCBpc2lzX3J1bl9zcGZfbDIsIGFyZWEsCisJCQkgIE1JTklNVU1fU1BGX0lOVEVSVkFMIC0gZGlmZik7CiAKLSAgICBzcGZ0cmVlLT5wZW5kaW5nID0gMTsKLSAgfSBlbHNlIHsKLSAgICBzcGZ0cmVlLT5wZW5kaW5nID0gMDsKLSAgICByZXR2YWwgPSBpc2lzX3J1bl9zcGYgKGFyZWEsIGxldmVsLCBBRl9JTkVUNik7Ci0gIH0KKyAgICAgIHNwZnRyZWUtPnBlbmRpbmcgPSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNwZnRyZWUtPnBlbmRpbmcgPSAwOworICAgICAgcmV0dmFsID0gaXNpc19ydW5fc3BmIChhcmVhLCBsZXZlbCwgQUZfSU5FVDYpOworICAgIH0KIAogICByZXR1cm4gcmV0dmFsOwogfQpAQCAtMTEyMSw0MyArMTIxMyw0NyBAQAogICBzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKmFkajsKICNpZmRlZiBFWFRSRU1FX0RFQlVHCiAgIHVfY2hhciBidWZmWzI1NV07Ci0jZW5kaWYgCisjZW5kaWYKIAogICB2dHlfb3V0ICh2dHksICJTeXN0ZW0gSWQgICAgICAgICAgICBNZXRyaWMgICAgIE5leHQtSG9wIgotICAgICAgICAgICAiICAgICAgICAgICAgIEludGVyZmFjZSAgIFNOUEElcyIsIFZUWV9ORVdMSU5FKTsKLSAgZm9yIChub2RlID0gbGlzdGhlYWQgKHBhdGhzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7Ci0gICAgdmVydGV4ID0gZ2V0ZGF0YSAobm9kZSk7Ci0gICAgaWYgKHZlcnRleC0+dHlwZSAhPSBWVFlQRV9OT05QU0VVRE9fSVMpCi0gICAgICBjb250aW51ZTsKLSAgICBpZiAobWVtY21wICh2ZXJ0ZXgtPk4uaWQsIGlzaXMtPnN5c2lkLCBJU0lTX1NZU19JRF9MRU4pID09IDApIHsKLSAgICAgIHZ0eV9vdXQgKHZ0eSwgIiVzICAgICAgICAgICAgIC0tJXMiLCBob3N0Lm5hbWUsIFZUWV9ORVdMSU5FKTsKLSAgICB9IGVsc2UgewotICAgICAgZHluID0gZHluaG5fZmluZF9ieV9pZCAoKHVfY2hhciAqKXZlcnRleC0+Ti5pZCk7Ci0gICAgICBhbm9kZSA9IGxpc3RoZWFkICh2ZXJ0ZXgtPkFkal9OKTsKLSAgICAgIGFkaiA9IGdldGRhdGEgKGFub2RlKTsKLSAgICAgIGlmIChhZGopIHsKLSAgICAgICAgbmhfZHluID0gZHluaG5fZmluZF9ieV9pZCAoYWRqLT5zeXNpZCk7Ci0gICAgICAgIHZ0eV9vdXQgKHZ0eSwgIiUtMjBzICUtMTB1ICUtMjBzICUtMTFzICUtNXMlcyIsIAotICAgICAgICAgICAgICAgICAoZHluICE9IE5VTEwpID8gZHluLT5uYW1lLm5hbWUgOiAKLSAgICAgICAgICAgICAgICAgKHVfY2hhciAqKXJhd2xzcGlkX3ByaW50ICgodV9jaGFyICopdmVydGV4LT5OLmlkKSwKLSAgICAgICAgICAgICAgICAgdmVydGV4LT5kX04sIChuaF9keW4gIT0gTlVMTCkgPyBuaF9keW4tPm5hbWUubmFtZSA6IAotICAgICAgICAgICAgICAgICAodV9jaGFyICopcmF3bHNwaWRfcHJpbnQgKGFkai0+c3lzaWQpLCAKLSAgICAgICAgICAgICAgICAgYWRqLT5jaXJjdWl0LT5pbnRlcmZhY2UtPm5hbWUsCi0gICAgICAgICAgICAgICAgIHNucGFfcHJpbnQgKGFkai0+c25wYSksIFZUWV9ORVdMSU5FKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHZ0eV9vdXQgKHZ0eSwgIiVzICAgICAgICAgICAgICAldSAlcyIsIGR5biA/IGR5bi0+bmFtZS5uYW1lIDogCi0gICAgICAgICAgICAgICAgICh1X2NoYXIgKilyYXdsc3BpZF9wcmludCAodmVydGV4LT5OLmlkKSwgCi0gICAgICAgICAgICAgICAgIHZlcnRleC0+ZF9OLCBWVFlfTkVXTElORSk7Ci0gICAgICB9Ci0gICAgICAgIAotICAgIH0KKwkgICAiICAgICAgICAgICAgIEludGVyZmFjZSAgIFNOUEElcyIsIFZUWV9ORVdMSU5FKTsKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKHBhdGhzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorICAgIHsKKyAgICAgIHZlcnRleCA9IGdldGRhdGEgKG5vZGUpOworICAgICAgaWYgKHZlcnRleC0+dHlwZSAhPSBWVFlQRV9OT05QU0VVRE9fSVMpCisJY29udGludWU7CisgICAgICBpZiAobWVtY21wICh2ZXJ0ZXgtPk4uaWQsIGlzaXMtPnN5c2lkLCBJU0lTX1NZU19JRF9MRU4pID09IDApCisJeworCSAgdnR5X291dCAodnR5LCAiJXMgICAgICAgICAgICAgLS0lcyIsIGhvc3QubmFtZSwgVlRZX05FV0xJTkUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBkeW4gPSBkeW5obl9maW5kX2J5X2lkICgodV9jaGFyICopIHZlcnRleC0+Ti5pZCk7CisJICBhbm9kZSA9IGxpc3RoZWFkICh2ZXJ0ZXgtPkFkal9OKTsKKwkgIGFkaiA9IGdldGRhdGEgKGFub2RlKTsKKwkgIGlmIChhZGopCisJICAgIHsKKwkgICAgICBuaF9keW4gPSBkeW5obl9maW5kX2J5X2lkIChhZGotPnN5c2lkKTsKKwkgICAgICB2dHlfb3V0ICh2dHksICIlLTIwcyAlLTEwdSAlLTIwcyAlLTExcyAlLTVzJXMiLAorCQkgICAgICAgKGR5biAhPSBOVUxMKSA/IGR5bi0+bmFtZS5uYW1lIDoKKwkJICAgICAgICh1X2NoYXIgKikgcmF3bHNwaWRfcHJpbnQgKCh1X2NoYXIgKikgdmVydGV4LT5OLmlkKSwKKwkJICAgICAgIHZlcnRleC0+ZF9OLCAobmhfZHluICE9IE5VTEwpID8gbmhfZHluLT5uYW1lLm5hbWUgOgorCQkgICAgICAgKHVfY2hhciAqKSByYXdsc3BpZF9wcmludCAoYWRqLT5zeXNpZCksCisJCSAgICAgICBhZGotPmNpcmN1aXQtPmludGVyZmFjZS0+bmFtZSwKKwkJICAgICAgIHNucGFfcHJpbnQgKGFkai0+c25wYSksIFZUWV9ORVdMSU5FKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgdnR5X291dCAodnR5LCAiJXMgICAgICAgICAgICAgICV1ICVzIiwgZHluID8gZHluLT5uYW1lLm5hbWUgOgorCQkgICAgICAgKHVfY2hhciAqKSByYXdsc3BpZF9wcmludCAodmVydGV4LT5OLmlkKSwKKwkJICAgICAgIHZlcnRleC0+ZF9OLCBWVFlfTkVXTElORSk7CisJICAgIH0KKwl9CiAjaWYgMAotICAgIHZ0eV9vdXQgKHZ0eSwgIiVzICVzICV1ICVzIiwgdnR5cGUyc3RyaW5nKHZlcnRleC0+dHlwZSksIAotICAgICAgICAgICAgIHZpZDJzdHJpbmcodmVydGV4LCBidWZmKSwgdmVydGV4LT5kX04sIFZUWV9ORVdMSU5FKTsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIiVzICVzICV1ICVzIiwgdnR5cGUyc3RyaW5nICh2ZXJ0ZXgtPnR5cGUpLAorCSAgICAgICB2aWQyc3RyaW5nICh2ZXJ0ZXgsIGJ1ZmYpLCB2ZXJ0ZXgtPmRfTiwgVlRZX05FV0xJTkUpOwogI2VuZGlmCi0gIH0KLQotICAKKyAgICB9CiB9CiAKIERFRlVOIChzaG93X2lzaXNfdG9wb2xvZ3ksCkBAIC0xMTcwLDM3ICsxMjY2LDQxIEBACiAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKICAgc3RydWN0IGlzaXNfYXJlYSAqYXJlYTsKICAgaW50IGxldmVsOwotICAKKwogICBpZiAoIWlzaXMtPmFyZWFfbGlzdCB8fCBpc2lzLT5hcmVhX2xpc3QtPmNvdW50ID09IDApCiAgICAgcmV0dXJuIENNRF9TVUNDRVNTOwogCi0gIGZvciAobm9kZSA9IGxpc3RoZWFkIChpc2lzLT5hcmVhX2xpc3QpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICBhcmVhID0gZ2V0ZGF0YSAobm9kZSk7CisgIGZvciAobm9kZSA9IGxpc3RoZWFkIChpc2lzLT5hcmVhX2xpc3QpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisgICAgeworICAgICAgYXJlYSA9IGdldGRhdGEgKG5vZGUpOwogCi0gICAgdnR5X291dCAodnR5LCAiQXJlYSAlczolcyIsIGFyZWEtPmFyZWFfdGFnID8gYXJlYS0+YXJlYV90YWcgOiAibnVsbCIsCi0gICAgICAgICAgICAgVlRZX05FV0xJTkUpOwotICAgIAotICAgIGZvciAobGV2ZWw9MDsgbGV2ZWwgPCBJU0lTX0xFVkVMUzsgbGV2ZWwrKykgewotICAgICAgaWYgKGFyZWEtPmlwX2NpcmN1aXRzID4gMCAmJiBhcmVhLT5zcGZ0cmVlW2xldmVsXSAKLSAgICAgICAgICAmJiBhcmVhLT5zcGZ0cmVlW2xldmVsXS0+cGF0aHMtPmNvdW50ID4gMCkgewotICAgICAgICB2dHlfb3V0ICh2dHksICJJUy1JUyBwYXRocyB0byBsZXZlbC0lZCByb3V0ZXJzIHRoYXQgc3BlYWsgSVAlcyIsIAotICAgICAgICAgICAgICAgICBsZXZlbCsxLCBWVFlfTkVXTElORSk7Ci0gICAgICAgIGlzaXNfcHJpbnRfcGF0aHMgKHZ0eSwgYXJlYS0+c3BmdHJlZVtsZXZlbF0tPnBhdGhzKTsKLSAgICAgIH0KKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIkFyZWEgJXM6JXMiLCBhcmVhLT5hcmVhX3RhZyA/IGFyZWEtPmFyZWFfdGFnIDogIm51bGwiLAorCSAgICAgICBWVFlfTkVXTElORSk7CisKKyAgICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IElTSVNfTEVWRUxTOyBsZXZlbCsrKQorCXsKKwkgIGlmIChhcmVhLT5pcF9jaXJjdWl0cyA+IDAgJiYgYXJlYS0+c3BmdHJlZVtsZXZlbF0KKwkgICAgICAmJiBhcmVhLT5zcGZ0cmVlW2xldmVsXS0+cGF0aHMtPmNvdW50ID4gMCkKKwkgICAgeworCSAgICAgIHZ0eV9vdXQgKHZ0eSwgIklTLUlTIHBhdGhzIHRvIGxldmVsLSVkIHJvdXRlcnMgdGhhdCBzcGVhayBJUCVzIiwKKwkJICAgICAgIGxldmVsICsgMSwgVlRZX05FV0xJTkUpOworCSAgICAgIGlzaXNfcHJpbnRfcGF0aHMgKHZ0eSwgYXJlYS0+c3BmdHJlZVtsZXZlbF0tPnBhdGhzKTsKKwkgICAgfQogI2lmZGVmIEhBVkVfSVBWNgotICAgICAgaWYgKGFyZWEtPmlwdjZfY2lyY3VpdHMgPiAwICYmIGFyZWEtPnNwZnRyZWU2W2xldmVsXSAKLSAgICAgICAgICAmJiBhcmVhLT5zcGZ0cmVlNltsZXZlbF0tPnBhdGhzLT5jb3VudCA+IDApIHsKLSAgICAgICAgdnR5X291dCAodnR5LCAiSVMtSVMgcGF0aHMgdG8gbGV2ZWwtJWQgcm91dGVycyB0aGF0IHNwZWFrIElQdjYlcyIsIAotICAgICAgICAgICAgICAgICBsZXZlbCsxLCBWVFlfTkVXTElORSk7Ci0gICAgICAgIGlzaXNfcHJpbnRfcGF0aHMgKHZ0eSwgYXJlYS0+c3BmdHJlZTZbbGV2ZWxdLT5wYXRocyk7Ci0gICAgICB9CisJICBpZiAoYXJlYS0+aXB2Nl9jaXJjdWl0cyA+IDAgJiYgYXJlYS0+c3BmdHJlZTZbbGV2ZWxdCisJICAgICAgJiYgYXJlYS0+c3BmdHJlZTZbbGV2ZWxdLT5wYXRocy0+Y291bnQgPiAwKQorCSAgICB7CisJICAgICAgdnR5X291dCAodnR5LAorCQkgICAgICAgIklTLUlTIHBhdGhzIHRvIGxldmVsLSVkIHJvdXRlcnMgdGhhdCBzcGVhayBJUHY2JXMiLAorCQkgICAgICAgbGV2ZWwgKyAxLCBWVFlfTkVXTElORSk7CisJICAgICAgaXNpc19wcmludF9wYXRocyAodnR5LCBhcmVhLT5zcGZ0cmVlNltsZXZlbF0tPnBhdGhzKTsKKwkgICAgfQogI2VuZGlmIC8qIEhBVkVfSVBWNiAqLworCX0KICAgICB9Ci0gIH0KIAogICByZXR1cm4gQ01EX1NVQ0NFU1M7Ci19IAotCit9CiAKIERFRlVOIChzaG93X2lzaXNfdG9wb2xvZ3lfbDEsCiAgICAgICAgc2hvd19pc2lzX3RvcG9sb2d5X2wxX2NtZCwKQEAgLTEyMTIsMzUgKzEzMTIsMzcgQEAKIHsKICAgc3RydWN0IGxpc3Rub2RlICpub2RlOwogICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOwotICAKKwogICBpZiAoIWlzaXMtPmFyZWFfbGlzdCB8fCBpc2lzLT5hcmVhX2xpc3QtPmNvdW50ID09IDApCiAgICAgcmV0dXJuIENNRF9TVUNDRVNTOwogCi0gIGZvciAobm9kZSA9IGxpc3RoZWFkIChpc2lzLT5hcmVhX2xpc3QpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICBhcmVhID0gZ2V0ZGF0YSAobm9kZSk7CisgIGZvciAobm9kZSA9IGxpc3RoZWFkIChpc2lzLT5hcmVhX2xpc3QpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisgICAgeworICAgICAgYXJlYSA9IGdldGRhdGEgKG5vZGUpOwogCi0gICAgdnR5X291dCAodnR5LCAiQXJlYSAlczolcyIsIGFyZWEtPmFyZWFfdGFnID8gYXJlYS0+YXJlYV90YWcgOiAibnVsbCIsCi0gICAgICAgICAgICAgVlRZX05FV0xJTkUpOwotICAgIAotICAgIGlmIChhcmVhLT5pcF9jaXJjdWl0cyA+IDAgJiYgYXJlYS0+c3BmdHJlZVswXSAKLSAgICAgICAgJiYgYXJlYS0+c3BmdHJlZVswXS0+cGF0aHMtPmNvdW50ID4gMCkgewotICAgICAgdnR5X291dCAodnR5LCAiSVMtSVMgcGF0aHMgdG8gbGV2ZWwtMSByb3V0ZXJzIHRoYXQgc3BlYWsgSVAlcyIsIAotICAgICAgICAgICAgICAgVlRZX05FV0xJTkUpOwotICAgICAgaXNpc19wcmludF9wYXRocyAodnR5LCBhcmVhLT5zcGZ0cmVlWzBdLT5wYXRocyk7Ci0gICAgfQorICAgICAgdnR5X291dCAodnR5LCAiQXJlYSAlczolcyIsIGFyZWEtPmFyZWFfdGFnID8gYXJlYS0+YXJlYV90YWcgOiAibnVsbCIsCisJICAgICAgIFZUWV9ORVdMSU5FKTsKKworICAgICAgaWYgKGFyZWEtPmlwX2NpcmN1aXRzID4gMCAmJiBhcmVhLT5zcGZ0cmVlWzBdCisJICAmJiBhcmVhLT5zcGZ0cmVlWzBdLT5wYXRocy0+Y291bnQgPiAwKQorCXsKKwkgIHZ0eV9vdXQgKHZ0eSwgIklTLUlTIHBhdGhzIHRvIGxldmVsLTEgcm91dGVycyB0aGF0IHNwZWFrIElQJXMiLAorCQkgICBWVFlfTkVXTElORSk7CisJICBpc2lzX3ByaW50X3BhdGhzICh2dHksIGFyZWEtPnNwZnRyZWVbMF0tPnBhdGhzKTsKKwl9CiAjaWZkZWYgSEFWRV9JUFY2Ci0gICAgICBpZiAoYXJlYS0+aXB2Nl9jaXJjdWl0cyA+IDAgJiYgYXJlYS0+c3BmdHJlZTZbMF0gCi0gICAgICAgICAgJiYgYXJlYS0+c3BmdHJlZTZbMF0tPnBhdGhzLT5jb3VudCA+IDApIHsKLSAgICAgICAgdnR5X291dCAodnR5LCAiSVMtSVMgcGF0aHMgdG8gbGV2ZWwtMSByb3V0ZXJzIHRoYXQgc3BlYWsgSVB2NiVzIiwgCi0gICAgICAgICAgICAgICAgIFZUWV9ORVdMSU5FKTsKLSAgICAgICAgaXNpc19wcmludF9wYXRocyAodnR5LCBhcmVhLT5zcGZ0cmVlNlswXS0+cGF0aHMpOwotICAgICAgfQorICAgICAgaWYgKGFyZWEtPmlwdjZfY2lyY3VpdHMgPiAwICYmIGFyZWEtPnNwZnRyZWU2WzBdCisJICAmJiBhcmVhLT5zcGZ0cmVlNlswXS0+cGF0aHMtPmNvdW50ID4gMCkKKwl7CisJICB2dHlfb3V0ICh2dHksICJJUy1JUyBwYXRocyB0byBsZXZlbC0xIHJvdXRlcnMgdGhhdCBzcGVhayBJUHY2JXMiLAorCQkgICBWVFlfTkVXTElORSk7CisJICBpc2lzX3ByaW50X3BhdGhzICh2dHksIGFyZWEtPnNwZnRyZWU2WzBdLT5wYXRocyk7CisJfQogI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwogICAgIH0KIAotCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKLX0gCit9CiAKIERFRlVOIChzaG93X2lzaXNfdG9wb2xvZ3lfbDIsCiAgICAgICAgc2hvd19pc2lzX3RvcG9sb2d5X2wyX2NtZCwKQEAgLTEyNTIsMzYgKzEzNTQsMzcgQEAKIHsKICAgc3RydWN0IGxpc3Rub2RlICpub2RlOwogICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOwotICAKKwogICBpZiAoIWlzaXMtPmFyZWFfbGlzdCB8fCBpc2lzLT5hcmVhX2xpc3QtPmNvdW50ID09IDApCiAgICAgcmV0dXJuIENNRF9TVUNDRVNTOwogCi0gIGZvciAobm9kZSA9IGxpc3RoZWFkIChpc2lzLT5hcmVhX2xpc3QpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICBhcmVhID0gZ2V0ZGF0YSAobm9kZSk7CisgIGZvciAobm9kZSA9IGxpc3RoZWFkIChpc2lzLT5hcmVhX2xpc3QpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisgICAgeworICAgICAgYXJlYSA9IGdldGRhdGEgKG5vZGUpOwogCi0gICAgdnR5X291dCAodnR5LCAiQXJlYSAlczolcyIsIGFyZWEtPmFyZWFfdGFnID8gYXJlYS0+YXJlYV90YWcgOiAibnVsbCIsCi0gICAgICAgICAgICAgVlRZX05FV0xJTkUpOwotICAgIAotICAgIGlmIChhcmVhLT5pcF9jaXJjdWl0cyA+IDAgJiYgYXJlYS0+c3BmdHJlZVsxXSAKLSAgICAgICAgJiYgYXJlYS0+c3BmdHJlZVsxXS0+cGF0aHMtPmNvdW50ID4gMCkgewotICAgICAgdnR5X291dCAodnR5LCAiSVMtSVMgcGF0aHMgdG8gbGV2ZWwtMiByb3V0ZXJzIHRoYXQgc3BlYWsgSVAlcyIsIAotICAgICAgICAgICAgICAgVlRZX05FV0xJTkUpOwotICAgICAgaXNpc19wcmludF9wYXRocyAodnR5LCBhcmVhLT5zcGZ0cmVlWzFdLT5wYXRocyk7Ci0gICAgfQorICAgICAgdnR5X291dCAodnR5LCAiQXJlYSAlczolcyIsIGFyZWEtPmFyZWFfdGFnID8gYXJlYS0+YXJlYV90YWcgOiAibnVsbCIsCisJICAgICAgIFZUWV9ORVdMSU5FKTsKKworICAgICAgaWYgKGFyZWEtPmlwX2NpcmN1aXRzID4gMCAmJiBhcmVhLT5zcGZ0cmVlWzFdCisJICAmJiBhcmVhLT5zcGZ0cmVlWzFdLT5wYXRocy0+Y291bnQgPiAwKQorCXsKKwkgIHZ0eV9vdXQgKHZ0eSwgIklTLUlTIHBhdGhzIHRvIGxldmVsLTIgcm91dGVycyB0aGF0IHNwZWFrIElQJXMiLAorCQkgICBWVFlfTkVXTElORSk7CisJICBpc2lzX3ByaW50X3BhdGhzICh2dHksIGFyZWEtPnNwZnRyZWVbMV0tPnBhdGhzKTsKKwl9CiAjaWZkZWYgSEFWRV9JUFY2Ci0gICAgICBpZiAoYXJlYS0+aXB2Nl9jaXJjdWl0cyA+IDAgJiYgYXJlYS0+c3BmdHJlZTZbMV0gCi0gICAgICAgICAgJiYgYXJlYS0+c3BmdHJlZTZbMV0tPnBhdGhzLT5jb3VudCA+IDApIHsKLSAgICAgICAgdnR5X291dCAodnR5LCAiSVMtSVMgcGF0aHMgdG8gbGV2ZWwtMiByb3V0ZXJzIHRoYXQgc3BlYWsgSVB2NiVzIiwgCi0gICAgICAgICAgICAgICAgIFZUWV9ORVdMSU5FKTsKLSAgICAgICAgaXNpc19wcmludF9wYXRocyAodnR5LCBhcmVhLT5zcGZ0cmVlNlsxXS0+cGF0aHMpOwotICAgICAgfQorICAgICAgaWYgKGFyZWEtPmlwdjZfY2lyY3VpdHMgPiAwICYmIGFyZWEtPnNwZnRyZWU2WzFdCisJICAmJiBhcmVhLT5zcGZ0cmVlNlsxXS0+cGF0aHMtPmNvdW50ID4gMCkKKwl7CisJICB2dHlfb3V0ICh2dHksICJJUy1JUyBwYXRocyB0byBsZXZlbC0yIHJvdXRlcnMgdGhhdCBzcGVhayBJUHY2JXMiLAorCQkgICBWVFlfTkVXTElORSk7CisJICBpc2lzX3ByaW50X3BhdGhzICh2dHksIGFyZWEtPnNwZnRyZWU2WzFdLT5wYXRocyk7CisJfQogI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwogICAgIH0KIAotCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKLX0gCi0KK30KIAogdm9pZAogaXNpc19zcGZfY21kc19pbml0ICgpCmRpZmYgLS1naXQgYS9pc2lzZC9pc2lzX3NwZi5oIGIvaXNpc2QvaXNpc19zcGYuaAppbmRleCA1OWU0YjZiLi40MzJmODQ2IDEwMDY0NAotLS0gYS9pc2lzZC9pc2lzX3NwZi5oCisrKyBiL2lzaXNkL2lzaXNfc3BmLmgKQEAgLTI0LDE3ICsyNCwxOCBAQAogI2lmbmRlZiBfWkVCUkFfSVNJU19TUEZfSAogI2RlZmluZSBfWkVCUkFfSVNJU19TUEZfSAogCi1lbnVtIHZlcnRleHR5cGUgeworZW51bSB2ZXJ0ZXh0eXBlCit7CiAgIFZUWVBFX1BTRVVET19JUyA9IDEsCiAgIFZUWVBFX05PTlBTRVVET19JUywKICAgVlRZUEVfRVMsCiAgIFZUWVBFX0lQUkVBQ0hfSU5URVJOQUwsCiAgIFZUWVBFX0lQUkVBQ0hfRVhURVJOQUwKICNpZmRlZiBIQVZFX0lQVjYKLSAgLCAKKyAgICAsCiAgIFZUWVBFX0lQNlJFQUNIX0lOVEVSTkFMLAogICBWVFlQRV9JUDZSRUFDSF9FWFRFUk5BTAotI2VuZGlmIC8qIEhBVkVfSVBWNiAqLyAKKyNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KIH07CiAKIC8qCkBAIC00NCwyOCArNDUsMjggQEAKIHsKICAgZW51bSB2ZXJ0ZXh0eXBlIHR5cGU7CiAKLSAgdW5pb24gewotICAgIHVfY2hhciBpZCBbSVNJU19TWVNfSURfTEVOICsgMV07CisgIHVuaW9uCisgIHsKKyAgICB1X2NoYXIgaWRbSVNJU19TWVNfSURfTEVOICsgMV07CiAgICAgc3RydWN0IHByZWZpeCBwcmVmaXg7CiAgIH0gTjsKLSAgCisKICAgc3RydWN0IGlzaXNfbHNwICpsc3A7Ci0gIHVfaW50MzJfdCBkX047ICAgLyogZChOKSBEaXN0YW5jZSBmcm9tIHRoaXMgSVMgICAgICAqLwotICB1X2ludDE2X3QgZGVwdGg7IC8qIFRoZSBkZXB0aCBpbiB0aGUgaW1hZ2luYXJ5IHRyZWUgKi8KKyAgdV9pbnQzMl90IGRfTjsJCS8qIGQoTikgRGlzdGFuY2UgZnJvbSB0aGlzIElTICAgICAgKi8KKyAgdV9pbnQxNl90IGRlcHRoOwkJLyogVGhlIGRlcHRoIGluIHRoZSBpbWFnaW5hcnkgdHJlZSAqLwogCi0gIHN0cnVjdCBsaXN0ICpBZGpfTjsgLyoge0FkaihOKX0gICovCi19OyAKLQorICBzdHJ1Y3QgbGlzdCAqQWRqX047CQkvKiB7QWRqKE4pfSAgKi8KK307CiAKIHN0cnVjdCBpc2lzX3NwZnRyZWUKIHsKLSAgc3RydWN0IHRocmVhZCAqdF9zcGZfcGVyaW9kaWM7ICAvKiBwZXJpb2RpYyBzcGYgdGhyZWFkcyAgKi8KLSAgdGltZV90ICAgICAgICAgICAgICAgIGxhc3RydW47ICAvKiBmb3Igc2NoZWR1bGluZyAqLwotICBpbnQgICAgICAgICAgICAgICAgICAgcGVuZGluZzsgIC8qIGFscmVhZHkgc2NoZWR1bGVkICovCi0gIHN0cnVjdCBsaXN0ICAgICAgICAgICAgKnBhdGhzOyAgLyogdGhlIFNQVCAqLwotICBzdHJ1Y3QgbGlzdCAgICAgICAgICAgICp0ZW50czsgIC8qIFRFTlQgKi8KKyAgc3RydWN0IHRocmVhZCAqdF9zcGZfcGVyaW9kaWM7CS8qIHBlcmlvZGljIHNwZiB0aHJlYWRzICAqLworICB0aW1lX3QgbGFzdHJ1bjsJCS8qIGZvciBzY2hlZHVsaW5nICovCisgIGludCBwZW5kaW5nOwkJCS8qIGFscmVhZHkgc2NoZWR1bGVkICovCisgIHN0cnVjdCBsaXN0ICpwYXRoczsJCS8qIHRoZSBTUFQgKi8KKyAgc3RydWN0IGxpc3QgKnRlbnRzOwkJLyogVEVOVCAqLwogCi0gIHVfaW50MzJfdCAgICAgICAgICAgICB0aW1lcnVuOyAgLyogc3RhdGlzdGljcyAqLworICB1X2ludDMyX3QgdGltZXJ1bjsJCS8qIHN0YXRpc3RpY3MgKi8KIH07CiAKIHZvaWQgc3BmdHJlZV9hcmVhX2luaXQgKHN0cnVjdCBpc2lzX2FyZWEgKmFyZWEpOwpAQCAtNzUsMTEgKzc2LDMgQEAKIGludCBpc2lzX3NwZl9zY2hlZHVsZTYgKHN0cnVjdCBpc2lzX2FyZWEgKmFyZWEsIGludCBsZXZlbCk7CiAjZW5kaWYKICNlbmRpZiAvKiBfWkVCUkFfSVNJU19TUEZfSCAqLwotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2lzaXNkL2lzaXNfdGx2LmMgYi9pc2lzZC9pc2lzX3Rsdi5jCmluZGV4IGQ3YmJiOTEuLmEzNWI2ODcgMTAwNjQ0Ci0tLSBhL2lzaXNkL2lzaXNfdGx2LmMKKysrIGIvaXNpc2QvaXNpc190bHYuYwpAQCAtNDgsNTggKzQ4LDcxIEBACiB2b2lkCiBmcmVlX3RsdiAodm9pZCAqdmFsKQogewotICAgIFhGUkVFIChNVFlQRV9JU0lTX1RMViwgdmFsKTsKLSAgICAKLSAgICByZXR1cm47CisgIFhGUkVFIChNVFlQRV9JU0lTX1RMViwgdmFsKTsKKworICByZXR1cm47CiB9CiAKIC8qCiAgKiBDYWxsZWQgYWZ0ZXIgcGFyc2luZyBvZiBhIFBEVS4gVGhlcmUgc2hvdWxkbid0IGJlIGFueSB0bHYncyBsZWZ0LCBzbyB0aGlzCiAgKiBpcyBvbmx5IGEgY2F1dGlvbiB0byBhdm9pZCBtZW1vcnkgbGVha3MKICAqLwotdm9pZCAKK3ZvaWQKIGZyZWVfdGx2cyAoc3RydWN0IHRsdnMgKnRsdnMpCiB7Ci0gIGlmICh0bHZzLT5hcmVhX2FkZHJzKSB7Ci0gICAgbGlzdF9kZWxldGUgKHRsdnMtPmFyZWFfYWRkcnMpOwotICB9Ci0gIGlmICh0bHZzLT5pc19uZWlnaHMpIHsKLSAgICBsaXN0X2RlbGV0ZSAodGx2cy0+aXNfbmVpZ2hzKTsKLSAgfQotICBpZiAodGx2cy0+dGVfaXNfbmVpZ2hzKSB7Ci0gICAgbGlzdF9kZWxldGUgKHRsdnMtPnRlX2lzX25laWdocyk7Ci0gIH0KLSAgaWYgKHRsdnMtPmVzX25laWdocykgewotICAgIGxpc3RfZGVsZXRlICh0bHZzLT5lc19uZWlnaHMpOwotICB9Ci0gIGlmICh0bHZzLT5sc3BfZW50cmllcykgewotICAgIGxpc3RfZGVsZXRlICh0bHZzLT5sc3BfZW50cmllcyk7Ci0gIH0gIAotICBpZiAodGx2cy0+bGFuX25laWdocykgewotICAgIGxpc3RfZGVsZXRlICh0bHZzLT5sYW5fbmVpZ2hzKTsKLSAgfQotICBpZiAodGx2cy0+cHJlZml4X25laWdocykgewotICAgIGxpc3RfZGVsZXRlICh0bHZzLT5wcmVmaXhfbmVpZ2hzKTsKLSAgfQotICBpZiAodGx2cy0+aXB2NF9hZGRycykgewotICAgIGxpc3RfZGVsZXRlICh0bHZzLT5pcHY0X2FkZHJzKTsKLSAgfQotICBpZiAodGx2cy0+aXB2NF9pbnRfcmVhY2hzKSB7Ci0gICAgbGlzdF9kZWxldGUgKHRsdnMtPmlwdjRfaW50X3JlYWNocyk7Ci0gIH0KLSAgaWYgKHRsdnMtPmlwdjRfZXh0X3JlYWNocykgewotICAgIGxpc3RfZGVsZXRlICh0bHZzLT5pcHY0X2V4dF9yZWFjaHMpOwotICB9Ci0gIGlmICh0bHZzLT50ZV9pcHY0X3JlYWNocykgewotICAgIGxpc3RfZGVsZXRlICh0bHZzLT50ZV9pcHY0X3JlYWNocyk7Ci0gIH0KKyAgaWYgKHRsdnMtPmFyZWFfYWRkcnMpCisgICAgeworICAgICAgbGlzdF9kZWxldGUgKHRsdnMtPmFyZWFfYWRkcnMpOworICAgIH0KKyAgaWYgKHRsdnMtPmlzX25laWdocykKKyAgICB7CisgICAgICBsaXN0X2RlbGV0ZSAodGx2cy0+aXNfbmVpZ2hzKTsKKyAgICB9CisgIGlmICh0bHZzLT50ZV9pc19uZWlnaHMpCisgICAgeworICAgICAgbGlzdF9kZWxldGUgKHRsdnMtPnRlX2lzX25laWdocyk7CisgICAgfQorICBpZiAodGx2cy0+ZXNfbmVpZ2hzKQorICAgIHsKKyAgICAgIGxpc3RfZGVsZXRlICh0bHZzLT5lc19uZWlnaHMpOworICAgIH0KKyAgaWYgKHRsdnMtPmxzcF9lbnRyaWVzKQorICAgIHsKKyAgICAgIGxpc3RfZGVsZXRlICh0bHZzLT5sc3BfZW50cmllcyk7CisgICAgfQorICBpZiAodGx2cy0+bGFuX25laWdocykKKyAgICB7CisgICAgICBsaXN0X2RlbGV0ZSAodGx2cy0+bGFuX25laWdocyk7CisgICAgfQorICBpZiAodGx2cy0+cHJlZml4X25laWdocykKKyAgICB7CisgICAgICBsaXN0X2RlbGV0ZSAodGx2cy0+cHJlZml4X25laWdocyk7CisgICAgfQorICBpZiAodGx2cy0+aXB2NF9hZGRycykKKyAgICB7CisgICAgICBsaXN0X2RlbGV0ZSAodGx2cy0+aXB2NF9hZGRycyk7CisgICAgfQorICBpZiAodGx2cy0+aXB2NF9pbnRfcmVhY2hzKQorICAgIHsKKyAgICAgIGxpc3RfZGVsZXRlICh0bHZzLT5pcHY0X2ludF9yZWFjaHMpOworICAgIH0KKyAgaWYgKHRsdnMtPmlwdjRfZXh0X3JlYWNocykKKyAgICB7CisgICAgICBsaXN0X2RlbGV0ZSAodGx2cy0+aXB2NF9leHRfcmVhY2hzKTsKKyAgICB9CisgIGlmICh0bHZzLT50ZV9pcHY0X3JlYWNocykKKyAgICB7CisgICAgICBsaXN0X2RlbGV0ZSAodGx2cy0+dGVfaXB2NF9yZWFjaHMpOworICAgIH0KICNpZmRlZiBIQVZFX0lQVjYKLSAgaWYgKHRsdnMtPmlwdjZfYWRkcnMpIHsKLSAgICBsaXN0X2RlbGV0ZSAodGx2cy0+aXB2Nl9hZGRycyk7Ci0gIH0KLSAgaWYgKHRsdnMtPmlwdjZfcmVhY2hzKSB7Ci0gICAgbGlzdF9kZWxldGUgKHRsdnMtPmlwdjZfcmVhY2hzKTsKLSAgfQorICBpZiAodGx2cy0+aXB2Nl9hZGRycykKKyAgICB7CisgICAgICBsaXN0X2RlbGV0ZSAodGx2cy0+aXB2Nl9hZGRycyk7CisgICAgfQorICBpZiAodGx2cy0+aXB2Nl9yZWFjaHMpCisgICAgeworICAgICAgbGlzdF9kZWxldGUgKHRsdnMtPmlwdjZfcmVhY2hzKTsKKyAgICB9CiAjZW5kaWYgLyogSEFWRV9JUFY2ICovCiAgIHJldHVybjsKIH0KQEAgLTEwOCw1MzQgKzEyMSw1ODQgQEAKICAqIFBhcnNlcyB0aGUgdGx2cyBmb3VuZCBpbiB0aGUgdmFyaWFudCBsZW5ndGggcGFydCBvZiB0aGUgUERVLgogICogQ2FsbGVyIHRlbGxzIHdpdGggZmxhZ3MgaW4gImV4cGVjdGVkIiB3aGljaCBUTFYncyBpdCBpcyBpbnRlcmVzdGVkIGluLgogICovCi1pbnQgCi1wYXJzZV90bHZzIChjaGFyICphcmVhdGFnLCB1X2NoYXIgKnN0cmVhbSwgaW50IHNpemUsIHVfaW50MzJfdCAqZXhwZWN0ZWQsIAotCSAgICB1X2ludDMyX3QgKmZvdW5kLCBzdHJ1Y3QgdGx2cyAqdGx2cykKK2ludAorcGFyc2VfdGx2cyAoY2hhciAqYXJlYXRhZywgdV9jaGFyICogc3RyZWFtLCBpbnQgc2l6ZSwgdV9pbnQzMl90ICogZXhwZWN0ZWQsCisJICAgIHVfaW50MzJfdCAqIGZvdW5kLCBzdHJ1Y3QgdGx2cyAqdGx2cykKIHsKLSAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBsZW5ndGg7Ci0gIHN0cnVjdCBsYW5fbmVpZ2ggICAgICAgICAgICAgICAgICAgICpsYW5fbmVpOwotICBzdHJ1Y3QgYXJlYV9hZGRyICAgICAgICAgICAgICAgICAgKmFyZWFfYWRkcjsKLSAgc3RydWN0IGlzX25laWdoICAgICAgICAgICAgICAgICAgICAgICppc19uZWk7Ci0gIHN0cnVjdCB0ZV9pc19uZWlnaCAgICAgICAgICAgICAgICAqdGVfaXNfbmVpOwotICBzdHJ1Y3QgZXNfbmVpZ2ggICAgICAgICAgICAgICAgICAgICAgKmVzX25laTsKLSAgc3RydWN0IGxzcF9lbnRyeSAgICAgICAgICAgICAgICAgICpsc3BfZW50cnk7Ci0gIHN0cnVjdCBpbl9hZGRyICAgICAgICAgICAgICAgICAgICAqaXB2NF9hZGRyOwotICBzdHJ1Y3QgaXB2NF9yZWFjaGFiaWxpdHkgICAgICAgICAqaXB2NF9yZWFjaDsKLSAgc3RydWN0IHRlX2lwdjRfcmVhY2hhYmlsaXR5ICAgKnRlX2lwdjRfcmVhY2g7CisgIHVfY2hhciB0eXBlLCBsZW5ndGg7CisgIHN0cnVjdCBsYW5fbmVpZ2ggKmxhbl9uZWk7CisgIHN0cnVjdCBhcmVhX2FkZHIgKmFyZWFfYWRkcjsKKyAgc3RydWN0IGlzX25laWdoICppc19uZWk7CisgIHN0cnVjdCB0ZV9pc19uZWlnaCAqdGVfaXNfbmVpOworICBzdHJ1Y3QgZXNfbmVpZ2ggKmVzX25laTsKKyAgc3RydWN0IGxzcF9lbnRyeSAqbHNwX2VudHJ5OworICBzdHJ1Y3QgaW5fYWRkciAqaXB2NF9hZGRyOworICBzdHJ1Y3QgaXB2NF9yZWFjaGFiaWxpdHkgKmlwdjRfcmVhY2g7CisgIHN0cnVjdCB0ZV9pcHY0X3JlYWNoYWJpbGl0eSAqdGVfaXB2NF9yZWFjaDsKICNpZmRlZiBIQVZFX0lQVjYKLSAgc3RydWN0IGluNl9hZGRyICAgICAgICAgICAgICAgICAgICppcHY2X2FkZHI7Ci0gIHN0cnVjdCBpcHY2X3JlYWNoYWJpbGl0eSAgICAgICAgICppcHY2X3JlYWNoOwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4X29jdGV0czsKKyAgc3RydWN0IGluNl9hZGRyICppcHY2X2FkZHI7CisgIHN0cnVjdCBpcHY2X3JlYWNoYWJpbGl0eSAqaXB2Nl9yZWFjaDsKKyAgaW50IHByZWZpeF9vY3RldHM7CiAjZW5kaWYgLyogSEFWRV9JUFY2ICovCi0gIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsOwotICBpbnQgICAgICAgICAgICAgIHZhbHVlX2xlbiwgcmV0dmFsID0gSVNJU19PSzsKLSAgdV9jaGFyICAgICAgICAgICAgICAgICAgICpwbnQgPSBzdHJlYW07CisgIHVfY2hhciB2aXJ0dWFsOworICBpbnQgdmFsdWVfbGVuLCByZXR2YWwgPSBJU0lTX09LOworICB1X2NoYXIgKnBudCA9IHN0cmVhbTsKIAogICAqZm91bmQgPSAwOwogICBtZW1zZXQgKHRsdnMsIDAsIHNpemVvZiAoc3RydWN0IHRsdnMpKTsKLSAgCi0gIHdoaWxlIChwbnQgPCBzdHJlYW0gKyBzaXplIC0gMikgewotICAgIHR5cGUgPSAqcG50OwotICAgIGxlbmd0aCA9ICoocG50KzEpOwotICAgIHBudCArPSAyOwotICAgIHZhbHVlX2xlbiA9IDA7Ci0gICAgaWYgKCBwbnQgKyBsZW5ndGggPiBzdHJlYW0gKyBzaXplICkgewotICAgICAgemxvZ193YXJuICgiSVNJUy1UTFYgKCVzKTogVExWICh0eXBlICVkLCBsZW5ndGggJWQpIGV4Y2VlZHMgcGFja2V0ICIKLQkJICJib3VuZGFyaWVzIiwgYXJlYXRhZywgdHlwZSwgbGVuZ3RoKTsKLSAgICAgIHJldHZhbCA9IElTSVNfV0FSTklORzsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIEFSRUFfQUREUkVTU0VTOgotICAgICAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIExlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICB8IAotICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgQXJlYSBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICB8IAotICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAgICAgICAqIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Ci0gICAgICAgKi8KLSAgICAgICpmb3VuZCB8PSBUTFZGTEFHX0FSRUFfQUREUlM7CisKKyAgd2hpbGUgKHBudCA8IHN0cmVhbSArIHNpemUgLSAyKQorICAgIHsKKyAgICAgIHR5cGUgPSAqcG50OworICAgICAgbGVuZ3RoID0gKihwbnQgKyAxKTsKKyAgICAgIHBudCArPSAyOworICAgICAgdmFsdWVfbGVuID0gMDsKKyAgICAgIGlmIChwbnQgKyBsZW5ndGggPiBzdHJlYW0gKyBzaXplKQorCXsKKwkgIHpsb2dfd2FybiAoIklTSVMtVExWICglcyk6IFRMViAodHlwZSAlZCwgbGVuZ3RoICVkKSBleGNlZWRzIHBhY2tldCAiCisJCSAgICAgImJvdW5kYXJpZXMiLCBhcmVhdGFnLCB0eXBlLCBsZW5ndGgpOworCSAgcmV0dmFsID0gSVNJU19XQVJOSU5HOworCSAgYnJlYWs7CisJfQorICAgICAgc3dpdGNoICh0eXBlKQorCXsKKwljYXNlIEFSRUFfQUREUkVTU0VTOgorCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKwkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIExlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICB8IAorCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKwkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgQXJlYSBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICB8IAorCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKwkgICAqIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisJICAgKi8KKwkgICpmb3VuZCB8PSBUTFZGTEFHX0FSRUFfQUREUlM7CiAjaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKLSAgICAgIHpsb2dfaW5mbyAoIlRMViBBcmVhIEFkcmVzc2VzIGxlbiAlZCIsIGxlbmd0aCk7CisJICB6bG9nX2luZm8gKCJUTFYgQXJlYSBBZHJlc3NlcyBsZW4gJWQiLCBsZW5ndGgpOwogI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCi0gICAgICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19BUkVBX0FERFJTKSB7Ci0gICAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pIHsKLSAgICAgICAgICBhcmVhX2FkZHIgPSAoc3RydWN0IGFyZWFfYWRkciopcG50OwotICAgICAgICAgIHZhbHVlX2xlbiArPSBhcmVhX2FkZHItPmFkZHJfbGVuICsgMTsKLSAgICAgICAgICBwbnQgKz0gIGFyZWFfYWRkci0+YWRkcl9sZW4gKyAxOwotICAgICAgICAgIGlmICghdGx2cy0+YXJlYV9hZGRycykgdGx2cy0+YXJlYV9hZGRycyA9IGxpc3RfbmV3ICgpOwotICAgICAgICAgIGxpc3Rub2RlX2FkZCAodGx2cy0+YXJlYV9hZGRycywgYXJlYV9hZGRyKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcG50ICs9IGxlbmd0aDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOworCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfQVJFQV9BRERSUykKKwkgICAgeworCSAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pCisJCXsKKwkJICBhcmVhX2FkZHIgPSAoc3RydWN0IGFyZWFfYWRkciAqKSBwbnQ7CisJCSAgdmFsdWVfbGVuICs9IGFyZWFfYWRkci0+YWRkcl9sZW4gKyAxOworCQkgIHBudCArPSBhcmVhX2FkZHItPmFkZHJfbGVuICsgMTsKKwkJICBpZiAoIXRsdnMtPmFyZWFfYWRkcnMpCisJCSAgICB0bHZzLT5hcmVhX2FkZHJzID0gbGlzdF9uZXcgKCk7CisJCSAgbGlzdG5vZGVfYWRkICh0bHZzLT5hcmVhX2FkZHJzLCBhcmVhX2FkZHIpOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHBudCArPSBsZW5ndGg7CisJICAgIH0KKwkgIGJyZWFrOwogCi0gICAgY2FzZSBJU19ORUlHSEJPVVJTOgotICAgICAgKmZvdW5kIHw9IFRMVkZMQUdfSVNfTkVJR0hTOworCWNhc2UgSVNfTkVJR0hCT1VSUzoKKwkgICpmb3VuZCB8PSBUTFZGTEFHX0lTX05FSUdIUzsKICNpZmRlZiBFWFRSRU1FX1RMVl9ERUJVRwotICAgICAgemxvZ19pbmZvICgiSVNJUy1UTFYgKCVzKTogSVMgTmVpZ2hib3VycyBsZW5ndGggJWQiLAotCQkgYXJlYXRhZywKLQkJIGxlbmd0aCk7CisJICB6bG9nX2luZm8gKCJJU0lTLVRMViAoJXMpOiBJUyBOZWlnaGJvdXJzIGxlbmd0aCAlZCIsCisJCSAgICAgYXJlYXRhZywgbGVuZ3RoKTsKICNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwotICAgICAgaWYgKFRMVkZMQUdfSVNfTkVJR0hTICYgKmV4cGVjdGVkKSB7Ci0gICAgICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICAgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIFZpcnR1YWwgRmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgCi0gICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgPSAqcG50OyAvKiBGSVhNRTogd2hhdCBpcyB0aGUgdXNlIGZvciB0aGlzPyAqLwotICAgICAgICBwbnQrKzsKLSAgICAgICAgdmFsdWVfbGVuICsrOwotICAgICAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAgICAgICAqIHwgICAwICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRGVmYXVsdCBNZXRyaWMgICAgICAgICAgICAgICAgICB8IAotICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAgICAgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRGVsYXkgTWV0cmljICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICAgICAgICogfCAgIFMgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBFeHBlbnNlIE1ldHJpYyAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gICAgICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIEVycm9yIE1ldHJpYyAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBOZWlnaGJvdXIgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKLSAgICAgICAqLwotICAgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKSB7Ci0gICAgICAgICAgaXNfbmVpID0gKHN0cnVjdCBpc19uZWlnaCopcG50OwotICAgICAgICAgIHZhbHVlX2xlbiArPSA0ICsgSVNJU19TWVNfSURfTEVOICsgMTsKLSAgICAgICAgICBwbnQgKz0gNCArIElTSVNfU1lTX0lEX0xFTiArIDE7Ci0gICAgICAgICAgaWYgKCF0bHZzLT5pc19uZWlnaHMpIHRsdnMtPmlzX25laWdocyA9IGxpc3RfbmV3ICgpOwotICAgICAgICAgIGxpc3Rub2RlX2FkZCAodGx2cy0+aXNfbmVpZ2hzLCBpc19uZWkpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwbnQgKz0gbGVuZ3RoOwotICAgICAgfQotICAgICAgYnJlYWs7CisJICBpZiAoVExWRkxBR19JU19ORUlHSFMgJiAqZXhwZWN0ZWQpCisJICAgIHsKKwkgICAgICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworCSAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBWaXJ0dWFsIEZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICB8IAorCSAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisJICAgICAgICovCisJICAgICAgdmlydHVhbCA9ICpwbnQ7CS8qIEZJWE1FOiB3aGF0IGlzIHRoZSB1c2UgZm9yIHRoaXM/ICovCisJICAgICAgcG50Kys7CisJICAgICAgdmFsdWVfbGVuKys7CisJICAgICAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKwkgICAgICAgKiB8ICAgMCAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIERlZmF1bHQgTWV0cmljICAgICAgICAgICAgICAgICAgfCAKKwkgICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworCSAgICAgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRGVsYXkgTWV0cmljICAgICAgICAgICAgICAgICAgICB8CisJICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKwkgICAgICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIEV4cGVuc2UgTWV0cmljICAgICAgICAgICAgICAgICAgfAorCSAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisJICAgICAgICogfCAgIFMgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBFcnJvciBNZXRyaWMgICAgICAgICAgICAgICAgICAgIHwKKwkgICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworCSAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBOZWlnaGJvdXIgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisJICAgICAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgICAgICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorCSAgICAgICAqLworCSAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pCisJCXsKKwkJICBpc19uZWkgPSAoc3RydWN0IGlzX25laWdoICopIHBudDsKKwkJICB2YWx1ZV9sZW4gKz0gNCArIElTSVNfU1lTX0lEX0xFTiArIDE7CisJCSAgcG50ICs9IDQgKyBJU0lTX1NZU19JRF9MRU4gKyAxOworCQkgIGlmICghdGx2cy0+aXNfbmVpZ2hzKQorCQkgICAgdGx2cy0+aXNfbmVpZ2hzID0gbGlzdF9uZXcgKCk7CisJCSAgbGlzdG5vZGVfYWRkICh0bHZzLT5pc19uZWlnaHMsIGlzX25laSk7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcG50ICs9IGxlbmd0aDsKKwkgICAgfQorCSAgYnJlYWs7CiAKLSAgICBjYXNlIFRFX0lTX05FSUdIQk9VUlM6Ci0gICAgICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICAgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIE5laWdoYm91ciBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNwotICAgICAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBURSBNZXRyaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMKLSAgICAgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgU3ViVExWcyBMZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgfCAxCi0gICAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKLSAgICAgICAqLwotICAgICAgKmZvdW5kIHw9IFRMVkZMQUdfVEVfSVNfTkVJR0hTOworCWNhc2UgVEVfSVNfTkVJR0hCT1VSUzoKKwkgIC8qICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgTmVpZ2hib3VyIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA3CisJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIFRFIE1ldHJpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMworCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBTdWJUTFZzIExlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICB8IDEKKwkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorCSAgICovCisJICAqZm91bmQgfD0gVExWRkxBR19URV9JU19ORUlHSFM7CiAjaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKLSAgICAgIHpsb2dfaW5mbyAoIklTSVMtVExWICglcyk6IEV4dGVuZGVkIElTIE5laWdoYm91cnMgbGVuZ3RoICVkIiwKLQkJIGFyZWF0YWcsCi0JCSBsZW5ndGgpOworCSAgemxvZ19pbmZvICgiSVNJUy1UTFYgKCVzKTogRXh0ZW5kZWQgSVMgTmVpZ2hib3VycyBsZW5ndGggJWQiLAorCQkgICAgIGFyZWF0YWcsIGxlbmd0aCk7CiAjZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KLSAgICAgIGlmIChUTFZGTEFHX1RFX0lTX05FSUdIUyAmICpleHBlY3RlZCkgewotICAgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKSB7Ci0gICAgICAgICAgdGVfaXNfbmVpID0gKHN0cnVjdCB0ZV9pc19uZWlnaCopcG50OwotICAgICAgICAgIHZhbHVlX2xlbiArPSAxMTsKLSAgICAgICAgICBwbnQgKz0gMTE7Ci0gICAgICAgICAgLyogRklYTUUgLSBzdWJ0bHZzIGFyZSBoYW5kbGVkIGhlcmUsIGZvciBub3cgd2Ugc2tpcCAqLwotICAgICAgICAgIHZhbHVlX2xlbiArPSB0ZV9pc19uZWktPnN1Yl90bHZzX2xlbmd0aDsKLSAgICAgICAgICBwbnQgKz0gdGVfaXNfbmVpLT5zdWJfdGx2c19sZW5ndGg7CisJICBpZiAoVExWRkxBR19URV9JU19ORUlHSFMgJiAqZXhwZWN0ZWQpCisJICAgIHsKKwkgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKQorCQl7CisJCSAgdGVfaXNfbmVpID0gKHN0cnVjdCB0ZV9pc19uZWlnaCAqKSBwbnQ7CisJCSAgdmFsdWVfbGVuICs9IDExOworCQkgIHBudCArPSAxMTsKKwkJICAvKiBGSVhNRSAtIHN1YnRsdnMgYXJlIGhhbmRsZWQgaGVyZSwgZm9yIG5vdyB3ZSBza2lwICovCisJCSAgdmFsdWVfbGVuICs9IHRlX2lzX25laS0+c3ViX3RsdnNfbGVuZ3RoOworCQkgIHBudCArPSB0ZV9pc19uZWktPnN1Yl90bHZzX2xlbmd0aDsKIAorCQkgIGlmICghdGx2cy0+dGVfaXNfbmVpZ2hzKQorCQkgICAgdGx2cy0+dGVfaXNfbmVpZ2hzID0gbGlzdF9uZXcgKCk7CisJCSAgbGlzdG5vZGVfYWRkICh0bHZzLT50ZV9pc19uZWlnaHMsIHRlX2lzX25laSk7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcG50ICs9IGxlbmd0aDsKKwkgICAgfQorCSAgYnJlYWs7CiAKLSAgICAgICAgICBpZiAoIXRsdnMtPnRlX2lzX25laWdocykgdGx2cy0+dGVfaXNfbmVpZ2hzID0gbGlzdF9uZXcgKCk7Ci0gICAgICAgICAgbGlzdG5vZGVfYWRkICh0bHZzLT50ZV9pc19uZWlnaHMsIHRlX2lzX25laSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBudCArPSBsZW5ndGg7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRVNfTkVJR0hCT1VSUzogCi0gICAgICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICAgICAgICogfCAgIDAgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBEZWZhdWx0IE1ldHJpYyAgICAgICAgICAgICAgICAgIHwgCi0gICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICAgICAgICogfCAgIFMgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBEZWxheSBNZXRyaWMgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gICAgICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIEV4cGVuc2UgTWV0cmljICAgICAgICAgICAgICAgICAgfAotICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAgICAgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRXJyb3IgTWV0cmljICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICAgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIE5laWdoYm91ciBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgTmVpZ2hib3VyIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgICAqIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Ci0gICAgICAgKi8KKwljYXNlIEVTX05FSUdIQk9VUlM6CisJICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworCSAgICogfCAgIDAgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBEZWZhdWx0IE1ldHJpYyAgICAgICAgICAgICAgICAgIHwgCisJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworCSAgICogfCAgIFMgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBEZWxheSBNZXRyaWMgICAgICAgICAgICAgICAgICAgIHwKKwkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisJICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIEV4cGVuc2UgTWV0cmljICAgICAgICAgICAgICAgICAgfAorCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKwkgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRXJyb3IgTWV0cmljICAgICAgICAgICAgICAgICAgICB8CisJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIE5laWdoYm91ciBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKwkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgTmVpZ2hib3VyIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgICAqIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisJICAgKi8KICNpZmRlZiBFWFRSRU1FX1RMVl9ERUJVRwotICAgICAgemxvZ19pbmZvICgiSVNJUy1UTFYgKCVzKTogRVMgTmVpZ2hib3VycyBsZW5ndGggJWQiLAotCQkgYXJlYXRhZywKLQkJIGxlbmd0aCk7CisJICB6bG9nX2luZm8gKCJJU0lTLVRMViAoJXMpOiBFUyBOZWlnaGJvdXJzIGxlbmd0aCAlZCIsCisJCSAgICAgYXJlYXRhZywgbGVuZ3RoKTsKICNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwotICAgICAgKmZvdW5kIHw9IFRMVkZMQUdfRVNfTkVJR0hTOwotICAgICAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfRVNfTkVJR0hTKSB7Ci0gICAgICAgIGVzX25laSA9IChzdHJ1Y3QgZXNfbmVpZ2gqKXBudDsKLSAgICAgICAgdmFsdWVfbGVuICs9IDQ7Ci0gICAgICAgIHBudCArPSA0OwotICAgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKSB7Ci0gICAgICAgIC8qIEZJWE1FIEZJWE1FIEZJWE1FIC0gYWRkIHRvIHRoZSBsaXN0ICovCi0JLyogICAgICAgICAgc3lzX2lkLT5pZCA9IHBudDsqLwotICAgICAgICAgIHZhbHVlX2xlbiArPSBJU0lTX1NZU19JRF9MRU47Ci0gICAgICAgICAgcG50ICs9IElTSVNfU1lTX0lEX0xFTjsKLSAgICAgICAgLyogIGlmICghZXNfbmVpLT5uZWlnaF9pZHMpIGVzX25laS0+bmVpZ2hfaWRzID0gc3lzaWQ7Ki8KLSAgICAgICAgfQotICAgICAgICBpZiAoIXRsdnMtPmVzX25laWdocykgdGx2cy0+ZXNfbmVpZ2hzID0gbGlzdF9uZXcgKCk7Ci0gICAgICAgIGxpc3Rub2RlX2FkZCAodGx2cy0+ZXNfbmVpZ2hzLCBlc19uZWkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcG50ICs9IGxlbmd0aDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOworCSAgKmZvdW5kIHw9IFRMVkZMQUdfRVNfTkVJR0hTOworCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfRVNfTkVJR0hTKQorCSAgICB7CisJICAgICAgZXNfbmVpID0gKHN0cnVjdCBlc19uZWlnaCAqKSBwbnQ7CisJICAgICAgdmFsdWVfbGVuICs9IDQ7CisJICAgICAgcG50ICs9IDQ7CisJICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikKKwkJeworCQkgIC8qIEZJWE1FIEZJWE1FIEZJWE1FIC0gYWRkIHRvIHRoZSBsaXN0ICovCisJCSAgLyogICAgICAgICAgc3lzX2lkLT5pZCA9IHBudDsgKi8KKwkJICB2YWx1ZV9sZW4gKz0gSVNJU19TWVNfSURfTEVOOworCQkgIHBudCArPSBJU0lTX1NZU19JRF9MRU47CisJCSAgLyogIGlmICghZXNfbmVpLT5uZWlnaF9pZHMpIGVzX25laS0+bmVpZ2hfaWRzID0gc3lzaWQ7ICovCisJCX0KKwkgICAgICBpZiAoIXRsdnMtPmVzX25laWdocykKKwkJdGx2cy0+ZXNfbmVpZ2hzID0gbGlzdF9uZXcgKCk7CisJICAgICAgbGlzdG5vZGVfYWRkICh0bHZzLT5lc19uZWlnaHMsIGVzX25laSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHBudCArPSBsZW5ndGg7CisJICAgIH0KKwkgIGJyZWFrOwogCi0gICAgY2FzZSBMQU5fTkVJR0hCT1VSUzoKLSAgICAgIC8qICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gICAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgTEFOIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAKLSAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gICAgICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgotICAgICAgICovCi0gICAgICAqZm91bmQgfD0gVExWRkxBR19MQU5fTkVJR0hTOwotICAgICAgI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCi0gICAgICB6bG9nX2luZm8gKCJJU0lTLVRMViAoJXMpOiBMQU4gTmVpZ2JvdXJzIGxlbmd0aCAlZCIsCi0JCSBhcmVhdGFnLAotCQkgbGVuZ3RoKTsKLSAgICAgICNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwotICAgICAgaWYgKFRMVkZMQUdfTEFOX05FSUdIUyAmICpleHBlY3RlZCkgewotICAgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKSB7Ci0gICAgICAgICAgbGFuX25laSA9IChzdHJ1Y3QgbGFuX25laWdoKilwbnQ7Ci0gICAgICAgICAgaWYgKCF0bHZzLT5sYW5fbmVpZ2hzKSB0bHZzLT5sYW5fbmVpZ2hzID0gbGlzdF9uZXcgKCk7Ci0gICAgICAgICAgbGlzdG5vZGVfYWRkICh0bHZzLT5sYW5fbmVpZ2hzLCBsYW5fbmVpKTsKLSAgICAgICAgICB2YWx1ZV9sZW4gKz0gRVRIX0FMRU47Ci0gICAgICAgICAgcG50ICs9IEVUSF9BTEVOOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwbnQgKz0gbGVuZ3RoOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBBRERJTkc6CisJY2FzZSBMQU5fTkVJR0hCT1VSUzoKKwkgIC8qICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgTEFOIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAKKwkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisJICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorCSAgICovCisJICAqZm91bmQgfD0gVExWRkxBR19MQU5fTkVJR0hTOwogI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCi0gICAgICB6bG9nX2luZm8gKCJUTFYgcGFkZGluZyAlZCIsIGxlbmd0aCk7CisJICB6bG9nX2luZm8gKCJJU0lTLVRMViAoJXMpOiBMQU4gTmVpZ2JvdXJzIGxlbmd0aCAlZCIsCisJCSAgICAgYXJlYXRhZywgbGVuZ3RoKTsKICNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwotICAgICAgcG50ICs9IGxlbmd0aDsKLSAgICAgIGJyZWFrOworCSAgaWYgKFRMVkZMQUdfTEFOX05FSUdIUyAmICpleHBlY3RlZCkKKwkgICAgeworCSAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pCisJCXsKKwkJICBsYW5fbmVpID0gKHN0cnVjdCBsYW5fbmVpZ2ggKikgcG50OworCQkgIGlmICghdGx2cy0+bGFuX25laWdocykKKwkJICAgIHRsdnMtPmxhbl9uZWlnaHMgPSBsaXN0X25ldyAoKTsKKwkJICBsaXN0bm9kZV9hZGQgKHRsdnMtPmxhbl9uZWlnaHMsIGxhbl9uZWkpOworCQkgIHZhbHVlX2xlbiArPSBFVEhfQUxFTjsKKwkJICBwbnQgKz0gRVRIX0FMRU47CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcG50ICs9IGxlbmd0aDsKKwkgICAgfQorCSAgYnJlYWs7CiAKLSAgICBjYXNlIExTUF9FTlRSSUVTOgotICAgICAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICBSZW1haW5pbmcgTGlmZXRpbWUgICAgICAgICAgICAgICAgICAgICAgICB8IDIKLSAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gICAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIExTUCBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpZCsyCi0gICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICAgICAgICogfCAgICAgICAgICAgICAgICAgICBMU1AgU2VxdWVuY2UgTnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgIHygNAotICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBDaGVja3N1bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIKLSAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gICAgICAgKi8KKwljYXNlIFBBRERJTkc6CiAjaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKLSAgICAgIHpsb2dfaW5mbyAoIkxTUCBFbnRyaWVzIGxlbmd0aCAlZCIsCi0JCSBhcmVhdGFnLAotCQkgbGVuZ3RoKTsKKwkgIHpsb2dfaW5mbyAoIlRMViBwYWRkaW5nICVkIiwgbGVuZ3RoKTsKICNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwotICAgICAgKmZvdW5kIHw9IFRMVkZMQUdfTFNQX0VOVFJJRVM7Ci0gICAgICBpZiAoVExWRkxBR19MU1BfRU5UUklFUyAmICpleHBlY3RlZCkgewotICAgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKSB7Ci0gICAgICAgICAgbHNwX2VudHJ5ID0gKHN0cnVjdCBsc3BfZW50cnkqKXBudDsKLSAgICAgICAgICB2YWx1ZV9sZW4gKz0gMTAgKyBJU0lTX1NZU19JRF9MRU47Ci0gICAgICAgICAgcG50ICs9ICAxMCArIElTSVNfU1lTX0lEX0xFTjsKLSAgICAgICAgICBpZiAoIXRsdnMtPmxzcF9lbnRyaWVzKSB0bHZzLT5sc3BfZW50cmllcyA9IGxpc3RfbmV3ICgpOwotICAgICAgICAgIGxpc3Rub2RlX2FkZCAodGx2cy0+bHNwX2VudHJpZXMsIGxzcF9lbnRyeSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBudCArPSBsZW5ndGg7Ci0gICAgICB9Ci0gICAgICBicmVhazsKKwkgIHBudCArPSBsZW5ndGg7CisJICBicmVhazsKIAotICAgIGNhc2UgQ0hFQ0tTVU06Ci0gICAgICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICAgICAgICogfCAgICAgICAgICAgICAgICAgICAxNiBiaXQgZmxldGNoZXIgQ0hFQ0tTVU0gICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gICAgICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgotICAgICAgICovCi0gICAgICAqZm91bmQgfD0gVExWRkxBR19DSEVDS1NVTTsKKwljYXNlIExTUF9FTlRSSUVTOgorCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKwkgICAqIHwgICAgICAgICAgICAgICAgICAgICBSZW1haW5pbmcgTGlmZXRpbWUgICAgICAgICAgICAgICAgICAgICAgICB8IDIKKwkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIExTUCBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpZCsyCisJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworCSAgICogfCAgICAgICAgICAgICAgICAgICBMU1AgU2VxdWVuY2UgTnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgIHygNAorCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKwkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBDaGVja3N1bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIKKwkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisJICAgKi8KICNpZmRlZiBFWFRSRU1FX1RMVl9ERUJVRwotICAgICAgemxvZ19pbmZvICgiSVNJUy1UTFYgKCVzKTogQ2hlY2tzdW0gbGVuZ3RoICVkIiwKLQkJIGFyZWF0YWcsCi0JCSBsZW5ndGgpOworCSAgemxvZ19pbmZvICgiTFNQIEVudHJpZXMgbGVuZ3RoICVkIiwgYXJlYXRhZywgbGVuZ3RoKTsKICNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwotICAgICAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfQ0hFQ0tTVU0pIHsKLSAgICAgICAgdGx2cy0+Y2hlY2tzdW0gPSAoc3RydWN0IGNoZWNrc3VtKilwbnQ7Ci0gICAgICB9Ci0gICAgICBwbnQgKz0gbGVuZ3RoOwotICAgICAgYnJlYWs7CisJICAqZm91bmQgfD0gVExWRkxBR19MU1BfRU5UUklFUzsKKwkgIGlmIChUTFZGTEFHX0xTUF9FTlRSSUVTICYgKmV4cGVjdGVkKQorCSAgICB7CisJICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikKKwkJeworCQkgIGxzcF9lbnRyeSA9IChzdHJ1Y3QgbHNwX2VudHJ5ICopIHBudDsKKwkJICB2YWx1ZV9sZW4gKz0gMTAgKyBJU0lTX1NZU19JRF9MRU47CisJCSAgcG50ICs9IDEwICsgSVNJU19TWVNfSURfTEVOOworCQkgIGlmICghdGx2cy0+bHNwX2VudHJpZXMpCisJCSAgICB0bHZzLT5sc3BfZW50cmllcyA9IGxpc3RfbmV3ICgpOworCQkgIGxpc3Rub2RlX2FkZCAodGx2cy0+bHNwX2VudHJpZXMsIGxzcF9lbnRyeSk7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcG50ICs9IGxlbmd0aDsKKwkgICAgfQorCSAgYnJlYWs7CiAKLSAgICBjYXNlIFBST1RPQ09MU19TVVBQT1JURUQ6Ci0gICAgICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICAgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgTkxQSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gICAgICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgotICAgICAgICovCi0gICAgICAqZm91bmQgfD0gVExWRkxBR19OTFBJRDsKKwljYXNlIENIRUNLU1VNOgorCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKwkgICAqIHwgICAgICAgICAgICAgICAgICAgMTYgYml0IGZsZXRjaGVyIENIRUNLU1VNICAgICAgICAgICAgICAgICAgICB8CisJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworCSAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKwkgICAqLworCSAgKmZvdW5kIHw9IFRMVkZMQUdfQ0hFQ0tTVU07CiAjaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKLSAgICAgIHpsb2dfaW5mbyAoIklTSVMtVExWICglcyk6IFByb3RvY29scyBTdXBwb3J0ZWQgbGVuZ3RoICVkIiwKLQkJIGFyZWF0YWcsCi0JCSBsZW5ndGgpOworCSAgemxvZ19pbmZvICgiSVNJUy1UTFYgKCVzKTogQ2hlY2tzdW0gbGVuZ3RoICVkIiwgYXJlYXRhZywgbGVuZ3RoKTsKICNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwotICAgICAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfTkxQSUQpIHsKLSAgICAgICAgdGx2cy0+bmxwaWRzID0gKHN0cnVjdCBubHBpZHMqKShwbnQtMSk7Ci0gICAgICB9Ci0gICAgICBwbnQgKz0gbGVuZ3RoOwotICAgICAgYnJlYWs7CisJICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19DSEVDS1NVTSkKKwkgICAgeworCSAgICAgIHRsdnMtPmNoZWNrc3VtID0gKHN0cnVjdCBjaGVja3N1bSAqKSBwbnQ7CisJICAgIH0KKwkgIHBudCArPSBsZW5ndGg7CisJICBicmVhazsKIAotICAgIGNhc2UgSVBWNF9BRERSOgotICAgICAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAgICAgICAqICsgICAgICAgICAgICAgICAgIElQIHZlcnNpb24gNCBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICArIDQKLSAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gICAgICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgotICAgICAgICovCi0gICAgICAqZm91bmQgfD0gVExWRkxBR19JUFY0X0FERFI7CisJY2FzZSBQUk9UT0NPTFNfU1VQUE9SVEVEOgorCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKwkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgIE5MUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworCSAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKwkgICAqLworCSAgKmZvdW5kIHw9IFRMVkZMQUdfTkxQSUQ7CiAjaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKLSAgICAgIHpsb2dfaW5mbyAoIklTSVMtVExWICglcyk6IElQdjQgQWRkcmVzcyBsZW5ndGggJWQiLAotCQkgYXJlYXRhZywKLQkJIGxlbmd0aCk7CisJICB6bG9nX2luZm8gKCJJU0lTLVRMViAoJXMpOiBQcm90b2NvbHMgU3VwcG9ydGVkIGxlbmd0aCAlZCIsCisJCSAgICAgYXJlYXRhZywgbGVuZ3RoKTsKICNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwotICAgICAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfSVBWNF9BRERSKSB7Ci0gICAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pIHsKLSAgICAgICAgICBpcHY0X2FkZHIgPSAoc3RydWN0IGluX2FkZHIqKXBudDsKLQkgIHpsb2dfaW5mbyAoIklTSVMtVExWICglcykgOiBJUCBBRERSICVzLCBwbnQgJXAiLCBhcmVhdGFnLCAKLQkJICAgICBpbmV0X250b2EgKCppcHY0X2FkZHIpLCBwbnQpOwotICAgICAgICAgIGlmICghdGx2cy0+aXB2NF9hZGRycykgdGx2cy0+aXB2NF9hZGRycyA9IGxpc3RfbmV3KCk7Ci0gICAgICAgICAgbGlzdG5vZGVfYWRkICh0bHZzLT5pcHY0X2FkZHJzLCBpcHY0X2FkZHIpOwotICAgICAgICAgIHZhbHVlX2xlbiArPSA0OwotICAgICAgICAgIHBudCArPSA0OwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwbnQgKz0gbGVuZ3RoOwotICAgICAgfQotICAgICAgYnJlYWs7CisJICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19OTFBJRCkKKwkgICAgeworCSAgICAgIHRsdnMtPm5scGlkcyA9IChzdHJ1Y3QgbmxwaWRzICopIChwbnQgLSAxKTsKKwkgICAgfQorCSAgcG50ICs9IGxlbmd0aDsKKwkgIGJyZWFrOwogCi0gICAgY2FzZSBBVVRIX0lORk86Ci0gICAgICAqZm91bmQgfD0gVExWRkxBR19BVVRIX0lORk87CisJY2FzZSBJUFY0X0FERFI6CisJICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworCSAgICogKyAgICAgICAgICAgICAgICAgSVAgdmVyc2lvbiA0IGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICsgNAorCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKwkgICAqIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisJICAgKi8KKwkgICpmb3VuZCB8PSBUTFZGTEFHX0lQVjRfQUREUjsKICNpZmRlZiBFWFRSRU1FX1RMVl9ERUJVRwotICAgICAgemxvZ19pbmZvICgiSVNJUy1UTFYgKCVzKTogSVMtSVMgQXV0aGVudGljYXRpb24gSW5mb3JtYXRpb24iLAotCQkgYXJlYXRhZyk7CisJICB6bG9nX2luZm8gKCJJU0lTLVRMViAoJXMpOiBJUHY0IEFkZHJlc3MgbGVuZ3RoICVkIiwKKwkJICAgICBhcmVhdGFnLCBsZW5ndGgpOworI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCisJICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19JUFY0X0FERFIpCisJICAgIHsKKwkgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKQorCQl7CisJCSAgaXB2NF9hZGRyID0gKHN0cnVjdCBpbl9hZGRyICopIHBudDsKKwkJICB6bG9nX2luZm8gKCJJU0lTLVRMViAoJXMpIDogSVAgQUREUiAlcywgcG50ICVwIiwgYXJlYXRhZywKKwkJCSAgICAgaW5ldF9udG9hICgqaXB2NF9hZGRyKSwgcG50KTsKKwkJICBpZiAoIXRsdnMtPmlwdjRfYWRkcnMpCisJCSAgICB0bHZzLT5pcHY0X2FkZHJzID0gbGlzdF9uZXcgKCk7CisJCSAgbGlzdG5vZGVfYWRkICh0bHZzLT5pcHY0X2FkZHJzLCBpcHY0X2FkZHIpOworCQkgIHZhbHVlX2xlbiArPSA0OworCQkgIHBudCArPSA0OworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHBudCArPSBsZW5ndGg7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBBVVRIX0lORk86CisJICAqZm91bmQgfD0gVExWRkxBR19BVVRIX0lORk87CisjaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKKwkgIHpsb2dfaW5mbyAoIklTSVMtVExWICglcyk6IElTLUlTIEF1dGhlbnRpY2F0aW9uIEluZm9ybWF0aW9uIiwKKwkJICAgICBhcmVhdGFnKTsKICNlbmRpZgotICAgICAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfQVVUSF9JTkZPKSB7Ci0JdGx2cy0+YXV0aF9pbmZvLnR5cGUgPSAqcG50OwotCXBudCsrOwotCW1lbWNweSAodGx2cy0+YXV0aF9pbmZvLnBhc3N3ZCwgcG50LCBsZW5ndGggLSAxKTsKLQlwbnQgKz0gbGVuZ3RoIC0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotCXBudCArPSBsZW5ndGg7Ci0gICAgICB9Ci0gICAgICBicmVhazsKKwkgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX0FVVEhfSU5GTykKKwkgICAgeworCSAgICAgIHRsdnMtPmF1dGhfaW5mby50eXBlID0gKnBudDsKKwkgICAgICBwbnQrKzsKKwkgICAgICBtZW1jcHkgKHRsdnMtPmF1dGhfaW5mby5wYXNzd2QsIHBudCwgbGVuZ3RoIC0gMSk7CisJICAgICAgcG50ICs9IGxlbmd0aCAtIDE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHBudCArPSBsZW5ndGg7CisJICAgIH0KKwkgIGJyZWFrOwogCi0gICAgY2FzZSBEWU5BTUlDX0hPU1ROQU1FOgotICAgICAgKmZvdW5kIHw9IFRMVkZMQUdfRFlOX0hPU1ROQU1FOworCWNhc2UgRFlOQU1JQ19IT1NUTkFNRToKKwkgICpmb3VuZCB8PSBUTFZGTEFHX0RZTl9IT1NUTkFNRTsKICNpZmRlZiBFWFRSRU1FX1RMVl9ERUJVRwotICAgICAgemxvZ19pbmZvICgiSVNJUy1UTFYgKCVzKTogRHluYW1pYyBIb3N0bmFtZSBsZW5ndGggJWQiLAotCQkgYXJlYXRhZywKLQkJIGxlbmd0aCk7CisJICB6bG9nX2luZm8gKCJJU0lTLVRMViAoJXMpOiBEeW5hbWljIEhvc3RuYW1lIGxlbmd0aCAlZCIsCisJCSAgICAgYXJlYXRhZywgbGVuZ3RoKTsKICNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwotICAgICAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfRFlOX0hPU1ROQU1FKSB7Ci0JLyogdGhlIGxlbmd0aCBpcyBhbHNvIGluY2x1ZGVkIGluIHRoZSBwb2ludGVkIHN0cnVjdCAqLwotICAgICAgICB0bHZzLT5ob3N0bmFtZSA9IChzdHJ1Y3QgaG9zdG5hbWUqKShwbnQgLSAxKTsgCi0gICAgICB9Ci0gICAgICBwbnQgKz0gbGVuZ3RoOwotICAgICAgYnJlYWs7CisJICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19EWU5fSE9TVE5BTUUpCisJICAgIHsKKwkgICAgICAvKiB0aGUgbGVuZ3RoIGlzIGFsc28gaW5jbHVkZWQgaW4gdGhlIHBvaW50ZWQgc3RydWN0ICovCisJICAgICAgdGx2cy0+aG9zdG5hbWUgPSAoc3RydWN0IGhvc3RuYW1lICopIChwbnQgLSAxKTsKKwkgICAgfQorCSAgcG50ICs9IGxlbmd0aDsKKwkgIGJyZWFrOwogCi0gICAgY2FzZSBURV9ST1VURVJfSUQ6Ci0gICAgICAvKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgICogKyAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZXIgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgNAotICAgICAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgICAqLwotICAgICAgKmZvdW5kIHw9IFRMVkZMQUdfVEVfUk9VVEVSX0lEOworCWNhc2UgVEVfUk9VVEVSX0lEOgorCSAgLyogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgICAqICsgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVyIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDQKKwkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICAgKi8KKwkgICpmb3VuZCB8PSBUTFZGTEFHX1RFX1JPVVRFUl9JRDsKICNpZmRlZiBFWFRSRU1FX1RMVl9ERUJVRwotICAgICAgemxvZ19pbmZvICgiSVNJUy1UTFYgKCVzKTogVEUgUm91dGVyIElEICVkIiwKLQkJIGFyZWF0YWcsCi0JCSBsZW5ndGgpOworCSAgemxvZ19pbmZvICgiSVNJUy1UTFYgKCVzKTogVEUgUm91dGVyIElEICVkIiwgYXJlYXRhZywgbGVuZ3RoKTsKICNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwotICAgICAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfVEVfUk9VVEVSX0lEKSB7Ci0gICAgICAgIHRsdnMtPnJvdXRlcl9pZCA9IChzdHJ1Y3QgdGVfcm91dGVyX2lkKikocG50KTsKLSAgICAgIH0KLSAgICAgIHBudCArPSBsZW5ndGg7Ci0gICAgICBicmVhazsKKwkgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX1RFX1JPVVRFUl9JRCkKKwkgICAgeworCSAgICAgIHRsdnMtPnJvdXRlcl9pZCA9IChzdHJ1Y3QgdGVfcm91dGVyX2lkICopIChwbnQpOworCSAgICB9CisJICBwbnQgKz0gbGVuZ3RoOworCSAgYnJlYWs7CiAKLSAgICBjYXNlIElQVjRfSU5UX1JFQUNIQUJJTElUWToKLSAgICAgIC8qICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gICAgICAgKiB8ICAgMCAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIERlZmF1bHQgTWV0cmljICAgICAgICAgICAgICAgICAgfCAxCi0gICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICAgICAgICogfCAgIFMgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBEZWxheSBNZXRyaWMgICAgICAgICAgICAgICAgICAgIHwgMQotICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAgICAgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRXhwZW5zZSBNZXRyaWMgICAgICAgICAgICAgICAgICB8IDEKLSAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gICAgICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIEVycm9yIE1ldHJpYyAgICAgICAgICAgICAgICAgICAgfCAxCi0gICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICAgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIGlwIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNAotICAgICAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIG1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQKLSAgICAgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgotICAgICAgICovCi0gICAgICAqZm91bmQgfD0gVExWRkxBR19JUFY0X0lOVF9SRUFDSEFCSUxJVFk7CisJY2FzZSBJUFY0X0lOVF9SRUFDSEFCSUxJVFk6CisJICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworCSAgICogfCAgIDAgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBEZWZhdWx0IE1ldHJpYyAgICAgICAgICAgICAgICAgIHwgMQorCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKwkgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRGVsYXkgTWV0cmljICAgICAgICAgICAgICAgICAgICB8IDEKKwkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisJICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIEV4cGVuc2UgTWV0cmljICAgICAgICAgICAgICAgICAgfCAxCisJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworCSAgICogfCAgIFMgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBFcnJvciBNZXRyaWMgICAgICAgICAgICAgICAgICAgIHwgMQorCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKwkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBpcCBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQKKwkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBtYXNrICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA0CisJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKwkgICAqLworCSAgKmZvdW5kIHw9IFRMVkZMQUdfSVBWNF9JTlRfUkVBQ0hBQklMSVRZOwogI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCi0gICAgICB6bG9nX2luZm8gKCJJU0lTLVRMViAoJXMpOiBJUHY0IGludGVybmFsIFJlYWNoYWJpbGl0eSBsZW5ndGggJWQiLAotCQkgYXJlYXRhZywKLQkJIGxlbmd0aCk7CisJICB6bG9nX2luZm8gKCJJU0lTLVRMViAoJXMpOiBJUHY0IGludGVybmFsIFJlYWNoYWJpbGl0eSBsZW5ndGggJWQiLAorCQkgICAgIGFyZWF0YWcsIGxlbmd0aCk7CiAjZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KLSAgICAgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX0lQVjRfSU5UX1JFQUNIQUJJTElUWSkgewotICAgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKSB7Ci0gICAgICAgICAgaXB2NF9yZWFjaCA9IChzdHJ1Y3QgaXB2NF9yZWFjaGFiaWxpdHkqKXBudDsKLSAgICAgICAgICBpZiAoIXRsdnMtPmlwdjRfaW50X3JlYWNocykgdGx2cy0+aXB2NF9pbnRfcmVhY2hzID0gbGlzdF9uZXcoKTsKLSAgICAgICAgICBsaXN0bm9kZV9hZGQgKHRsdnMtPmlwdjRfaW50X3JlYWNocywgaXB2NF9yZWFjaCk7Ci0gICAgICAgICAgdmFsdWVfbGVuICs9IDEyOwotICAgICAgICAgIHBudCArPSAxMjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIHBudCArPSBsZW5ndGg7Ci0gICAgICB9Ci0gICAgICBicmVhazsKKwkgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX0lQVjRfSU5UX1JFQUNIQUJJTElUWSkKKwkgICAgeworCSAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pCisJCXsKKwkJICBpcHY0X3JlYWNoID0gKHN0cnVjdCBpcHY0X3JlYWNoYWJpbGl0eSAqKSBwbnQ7CisJCSAgaWYgKCF0bHZzLT5pcHY0X2ludF9yZWFjaHMpCisJCSAgICB0bHZzLT5pcHY0X2ludF9yZWFjaHMgPSBsaXN0X25ldyAoKTsKKwkJICBsaXN0bm9kZV9hZGQgKHRsdnMtPmlwdjRfaW50X3JlYWNocywgaXB2NF9yZWFjaCk7CisJCSAgdmFsdWVfbGVuICs9IDEyOworCQkgIHBudCArPSAxMjsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBwbnQgKz0gbGVuZ3RoOworCSAgICB9CisJICBicmVhazsKIAotICAgIGNhc2UgSVBWNF9FWFRfUkVBQ0hBQklMSVRZOgotICAgICAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAgICAgICAqIHwgICAwICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRGVmYXVsdCBNZXRyaWMgICAgICAgICAgICAgICAgICB8IDEKLSAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gICAgICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIERlbGF5IE1ldHJpYyAgICAgICAgICAgICAgICAgICAgfCAxCi0gICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICAgICAgICogfCAgIFMgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBFeHBlbnNlIE1ldHJpYyAgICAgICAgICAgICAgICAgIHwgMQotICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAgICAgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRXJyb3IgTWV0cmljICAgICAgICAgICAgICAgICAgICB8IDEKLSAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gICAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgaXAgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA0Ci0gICAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgbWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNAotICAgICAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgICAqIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Ci0gICAgICAgKi8KLSAgICAgICpmb3VuZCB8PSBUTFZGTEFHX0lQVjRfRVhUX1JFQUNIQUJJTElUWTsKKwljYXNlIElQVjRfRVhUX1JFQUNIQUJJTElUWToKKwkgIC8qICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisJICAgKiB8ICAgMCAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIERlZmF1bHQgTWV0cmljICAgICAgICAgICAgICAgICAgfCAxCisJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworCSAgICogfCAgIFMgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBEZWxheSBNZXRyaWMgICAgICAgICAgICAgICAgICAgIHwgMQorCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKwkgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRXhwZW5zZSBNZXRyaWMgICAgICAgICAgICAgICAgICB8IDEKKwkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisJICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIEVycm9yIE1ldHJpYyAgICAgICAgICAgICAgICAgICAgfCAxCisJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIGlwIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNAorCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIG1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQKKwkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorCSAgICovCisJICAqZm91bmQgfD0gVExWRkxBR19JUFY0X0VYVF9SRUFDSEFCSUxJVFk7CiAjaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKLSAgICAgIHpsb2dfaW5mbyAoIklTSVMtVExWICglcyk6IElQdjQgZXh0ZXJuYWwgUmVhY2hhYmlsaXR5IGxlbmd0aCAlZCIsCi0JCSBhcmVhdGFnLAotCQkgbGVuZ3RoKTsKKwkgIHpsb2dfaW5mbyAoIklTSVMtVExWICglcyk6IElQdjQgZXh0ZXJuYWwgUmVhY2hhYmlsaXR5IGxlbmd0aCAlZCIsCisJCSAgICAgYXJlYXRhZywgbGVuZ3RoKTsKICNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwotICAgICAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfSVBWNF9FWFRfUkVBQ0hBQklMSVRZKSB7Ci0gICAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pIHsKLSAgICAgICAgICBpcHY0X3JlYWNoID0gKHN0cnVjdCBpcHY0X3JlYWNoYWJpbGl0eSopcG50OwotICAgICAgICAgIGlmICghdGx2cy0+aXB2NF9leHRfcmVhY2hzKSAKLSAgICAgICAgICAgIHRsdnMtPmlwdjRfZXh0X3JlYWNocyA9IGxpc3RfbmV3KCk7Ci0gICAgICAgICAgbGlzdG5vZGVfYWRkICh0bHZzLT5pcHY0X2V4dF9yZWFjaHMsIGlwdjRfcmVhY2gpOwotICAgICAgICAgIHZhbHVlX2xlbiArPSAxMjsKLSAgICAgICAgICBwbnQgKz0gMTI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBwbnQgKz0gbGVuZ3RoOwotICAgICAgfQotICAgICAgYnJlYWs7CisJICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19JUFY0X0VYVF9SRUFDSEFCSUxJVFkpCisJICAgIHsKKwkgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKQorCQl7CisJCSAgaXB2NF9yZWFjaCA9IChzdHJ1Y3QgaXB2NF9yZWFjaGFiaWxpdHkgKikgcG50OworCQkgIGlmICghdGx2cy0+aXB2NF9leHRfcmVhY2hzKQorCQkgICAgdGx2cy0+aXB2NF9leHRfcmVhY2hzID0gbGlzdF9uZXcgKCk7CisJCSAgbGlzdG5vZGVfYWRkICh0bHZzLT5pcHY0X2V4dF9yZWFjaHMsIGlwdjRfcmVhY2gpOworCQkgIHZhbHVlX2xlbiArPSAxMjsKKwkJICBwbnQgKz0gMTI7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcG50ICs9IGxlbmd0aDsKKwkgICAgfQorCSAgYnJlYWs7CiAKLSAgICBjYXNlIFRFX0lQVjRfUkVBQ0hBQklMSVRZOgotICAgICAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBURSBNZXRyaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQKLSAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gICAgICAgKiB8ICBVL0QgIHwgc1RMVj8gfCAgICAgICAgICAgICAgIFByZWZpeCBNYXNrIExlbiAgICAgICAgICAgICAgICAgfCAxCi0gICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICAgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMC00Ci0gICAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgdGx2cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgotICAgICAgICovCi0gICAgICAqZm91bmQgfD0gVExWRkxBR19URV9JUFY0X1JFQUNIQUJJTElUWTsKKwljYXNlIFRFX0lQVjRfUkVBQ0hBQklMSVRZOgorCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKwkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBURSBNZXRyaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQKKwkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisJICAgKiB8ICBVL0QgIHwgc1RMVj8gfCAgICAgICAgICAgICAgIFByZWZpeCBNYXNrIExlbiAgICAgICAgICAgICAgICAgfCAxCisJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMC00CisJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgdGx2cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKwkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorCSAgICovCisJICAqZm91bmQgfD0gVExWRkxBR19URV9JUFY0X1JFQUNIQUJJTElUWTsKICNpZmRlZiBFWFRSRU1FX1RMVl9ERUJVRwotICAgICAgemxvZ19pbmZvICgiSVNJUy1UTFYgKCVzKTogSVB2NCBleHRlbmRlZCBSZWFjaGFiaWxpdHkgbGVuZ3RoICVkIiwKLQkJIGFyZWF0YWcsCi0JCSBsZW5ndGgpOworCSAgemxvZ19pbmZvICgiSVNJUy1UTFYgKCVzKTogSVB2NCBleHRlbmRlZCBSZWFjaGFiaWxpdHkgbGVuZ3RoICVkIiwKKwkJICAgICBhcmVhdGFnLCBsZW5ndGgpOwogI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCi0gICAgICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19URV9JUFY0X1JFQUNIQUJJTElUWSkgewotICAgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKSB7Ci0gICAgICAgICAgdGVfaXB2NF9yZWFjaCA9IChzdHJ1Y3QgdGVfaXB2NF9yZWFjaGFiaWxpdHkqKXBudDsKLSAgICAgICAgICBpZiAoIXRsdnMtPnRlX2lwdjRfcmVhY2hzKSB0bHZzLT50ZV9pcHY0X3JlYWNocyA9IGxpc3RfbmV3KCk7Ci0gICAgICAgICAgbGlzdG5vZGVfYWRkICh0bHZzLT50ZV9pcHY0X3JlYWNocywgdGVfaXB2NF9yZWFjaCk7Ci0gICAgICAgICAgLyogdGhpcyB0cmlja2VyeSBpcyBwZXJtaXRhYmxlIHNpbmNlIG5vIHN1YnRsdnMgYXJlIGRlZmluZWQgKi8KLSAgICAgICAgICB2YWx1ZV9sZW4gKz0gNSArICgodGVfaXB2NF9yZWFjaC0+Y29udHJvbCAmIDB4M0YpID8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgodGVfaXB2NF9yZWFjaC0+Y29udHJvbCAmIDB4M0YpLTEpPj4zKSsxKSA6IDApOwotICAgICAgICAgIHBudCArPSAgNSArICgodGVfaXB2NF9yZWFjaC0+Y29udHJvbCAmIDB4M0YpID8gCi0gICAgICAgICAgICAgICAgICAgICAgKCgoKHRlX2lwdjRfcmVhY2gtPmNvbnRyb2wgJiAweDNGKS0xKT4+MykrMSkgOiAwKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIHBudCArPSBsZW5ndGg7Ci0gICAgICB9Ci0gICAgICBicmVhazsKKwkgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX1RFX0lQVjRfUkVBQ0hBQklMSVRZKQorCSAgICB7CisJICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikKKwkJeworCQkgIHRlX2lwdjRfcmVhY2ggPSAoc3RydWN0IHRlX2lwdjRfcmVhY2hhYmlsaXR5ICopIHBudDsKKwkJICBpZiAoIXRsdnMtPnRlX2lwdjRfcmVhY2hzKQorCQkgICAgdGx2cy0+dGVfaXB2NF9yZWFjaHMgPSBsaXN0X25ldyAoKTsKKwkJICBsaXN0bm9kZV9hZGQgKHRsdnMtPnRlX2lwdjRfcmVhY2hzLCB0ZV9pcHY0X3JlYWNoKTsKKwkJICAvKiB0aGlzIHRyaWNrZXJ5IGlzIHBlcm1pdGFibGUgc2luY2Ugbm8gc3VidGx2cyBhcmUgZGVmaW5lZCAqLworCQkgIHZhbHVlX2xlbiArPSA1ICsgKCh0ZV9pcHY0X3JlYWNoLT5jb250cm9sICYgMHgzRikgPworCQkJCSAgICAoKCgodGVfaXB2NF9yZWFjaC0+Y29udHJvbCAmIDB4M0YpIC0KKwkJCQkgICAgICAgMSkgPj4gMykgKyAxKSA6IDApOworCQkgIHBudCArPSA1ICsgKCh0ZV9pcHY0X3JlYWNoLT5jb250cm9sICYgMHgzRikgPworCQkgICAgICAgICAgICAgICgoKCh0ZV9pcHY0X3JlYWNoLT5jb250cm9sICYgMHgzRikgLSAxKSA+PiAzKSArIDEpIDogMCk7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcG50ICs9IGxlbmd0aDsKKwkgICAgfQorCSAgYnJlYWs7CiAKICNpZmRlZiAgSEFWRV9JUFY2Ci0gICAgY2FzZSBJUFY2X0FERFI6Ci0gICAgICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICAgICAgICogKyAgICAgICAgICAgICAgICAgSVAgdmVyc2lvbiA2IGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICsgMTYKLSAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gICAgICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgotICAgICAgICovCi0gICAgICAqZm91bmQgfD0gVExWRkxBR19JUFY2X0FERFI7CisJY2FzZSBJUFY2X0FERFI6CisJICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworCSAgICogKyAgICAgICAgICAgICAgICAgSVAgdmVyc2lvbiA2IGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICsgMTYKKwkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisJICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorCSAgICovCisJICAqZm91bmQgfD0gVExWRkxBR19JUFY2X0FERFI7CiAjaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKLSAgICAgIHpsb2dfaW5mbyAoIklTSVMtVExWICglcyk6IElQdjYgQWRkcmVzcyBsZW5ndGggJWQiLAotCQkgYXJlYXRhZywKLQkJIGxlbmd0aCk7CisJICB6bG9nX2luZm8gKCJJU0lTLVRMViAoJXMpOiBJUHY2IEFkZHJlc3MgbGVuZ3RoICVkIiwKKwkJICAgICBhcmVhdGFnLCBsZW5ndGgpOwogI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCi0gICAgICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19JUFY2X0FERFIpIHsKLSAgICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikgewotICAgICAgICAgIGlwdjZfYWRkciA9IChzdHJ1Y3QgaW42X2FkZHIqKXBudDsKLSAgICAgICAgICBpZiAoIXRsdnMtPmlwdjZfYWRkcnMpIHRsdnMtPmlwdjZfYWRkcnMgPSBsaXN0X25ldygpOwotICAgICAgICAgIGxpc3Rub2RlX2FkZCAodGx2cy0+aXB2Nl9hZGRycywgaXB2Nl9hZGRyKTsKLSAgICAgICAgICB2YWx1ZV9sZW4gKz0gMTY7Ci0gICAgICAgICAgcG50ICs9IDE2OwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwbnQgKz0gbGVuZ3RoOwotICAgICAgfQotICAgICAgYnJlYWs7CisJICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19JUFY2X0FERFIpCisJICAgIHsKKwkgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKQorCQl7CisJCSAgaXB2Nl9hZGRyID0gKHN0cnVjdCBpbjZfYWRkciAqKSBwbnQ7CisJCSAgaWYgKCF0bHZzLT5pcHY2X2FkZHJzKQorCQkgICAgdGx2cy0+aXB2Nl9hZGRycyA9IGxpc3RfbmV3ICgpOworCQkgIGxpc3Rub2RlX2FkZCAodGx2cy0+aXB2Nl9hZGRycywgaXB2Nl9hZGRyKTsKKwkJICB2YWx1ZV9sZW4gKz0gMTY7CisJCSAgcG50ICs9IDE2OworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHBudCArPSBsZW5ndGg7CisJICAgIH0KKwkgIGJyZWFrOwogCi0gICAgY2FzZSBJUFY2X1JFQUNIQUJJTElUWToKLSAgICAgIC8qICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gICAgICAgKiB8ICAgICAgICAgICAgICAgICBEZWZhdWx0IE1ldHJpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA0IAotICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIEluZm9ybWFudGlvbiAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIElQdjYgUHJlZml4IExlbmd0aCAgICAgICAgICAgICAgICAgICAgIHwtLSsKLSAgICAgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICB8Ci0gICAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgSVB2NiBQcmVmaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgfDwtKwotICAgICAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgICAqLwotICAgICAgKmZvdW5kIHw9IFRMVkZMQUdfSVBWNl9SRUFDSEFCSUxJVFk7Ci0gICAgICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19JUFY2X1JFQUNIQUJJTElUWSkgewotICAgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKSB7Ci0gICAgICAgICAgaXB2Nl9yZWFjaCA9IChzdHJ1Y3QgaXB2Nl9yZWFjaGFiaWxpdHkqKXBudDsKLSAgICAgICAgICBwcmVmaXhfb2N0ZXRzID0gKChpcHY2X3JlYWNoLT5wcmVmaXhfbGVuICsgNykgLyA4KTsKLSAgICAgICAgICB2YWx1ZV9sZW4gKz0gcHJlZml4X29jdGV0cyArIDY7Ci0gICAgICAgICAgcG50ICs9ICBwcmVmaXhfb2N0ZXRzICsgNjsKLSAgICAgICAgICAvKiBGSVhNRTogc3ViLXRsdnMgKi8KLSAgICAgICAgICBpZiAoIXRsdnMtPmlwdjZfcmVhY2hzKSB0bHZzLT5pcHY2X3JlYWNocyA9IGxpc3RfbmV3KCk7Ci0gICAgICAgICAgbGlzdG5vZGVfYWRkICh0bHZzLT5pcHY2X3JlYWNocywgaXB2Nl9yZWFjaCk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBudCArPSBsZW5ndGg7Ci0gICAgICB9Ci0gICAgICBicmVhazsKKwljYXNlIElQVjZfUkVBQ0hBQklMSVRZOgorCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKwkgICAqIHwgICAgICAgICAgICAgICAgIERlZmF1bHQgTWV0cmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQgCisJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgSW5mb3JtYW50aW9uICAgICAgICAgICAgICAgICAgIHwKKwkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgSVB2NiBQcmVmaXggTGVuZ3RoICAgICAgICAgICAgICAgICAgICAgfC0tKworCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgIHwKKwkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBJUHY2IFByZWZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8PC0rCisJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAgICovCisJICAqZm91bmQgfD0gVExWRkxBR19JUFY2X1JFQUNIQUJJTElUWTsKKwkgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX0lQVjZfUkVBQ0hBQklMSVRZKQorCSAgICB7CisJICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikKKwkJeworCQkgIGlwdjZfcmVhY2ggPSAoc3RydWN0IGlwdjZfcmVhY2hhYmlsaXR5ICopIHBudDsKKwkJICBwcmVmaXhfb2N0ZXRzID0gKChpcHY2X3JlYWNoLT5wcmVmaXhfbGVuICsgNykgLyA4KTsKKwkJICB2YWx1ZV9sZW4gKz0gcHJlZml4X29jdGV0cyArIDY7CisJCSAgcG50ICs9IHByZWZpeF9vY3RldHMgKyA2OworCQkgIC8qIEZJWE1FOiBzdWItdGx2cyAqLworCQkgIGlmICghdGx2cy0+aXB2Nl9yZWFjaHMpCisJCSAgICB0bHZzLT5pcHY2X3JlYWNocyA9IGxpc3RfbmV3ICgpOworCQkgIGxpc3Rub2RlX2FkZCAodGx2cy0+aXB2Nl9yZWFjaHMsIGlwdjZfcmVhY2gpOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHBudCArPSBsZW5ndGg7CisJICAgIH0KKwkgIGJyZWFrOwogI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwogCi0gICAgY2FzZSBXQVkzX0hFTExPOgotICAgICAgLyogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgICAqIHwgICAgICAgICAgICAgICAgICBBZGphY2VuY3kgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEKLSAgICAgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICAgKiB8ICAgICAgICAgICAgICAgICAgRXh0ZW5kZWQgTG9jYWwgQ2lyY3VpdCBJRCAgICAgICAgICAgICAgICAgICAgfCA0Ci0gICAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgICogfCAgICAgICAgICAgICAgICAgIE5laWdoYm9yIFN5c3RlbSBJRCAoSWYga25vd24pICAgICAgICAgICAgICAgIHwgMC04Ci0gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2JhYmx5IDYpCi0gICAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgICogfCAgICAgICAgICAgICAgICAgIE5laWdoYm9yIExvY2FsIENpcmN1aXQgSUQgKElmIGtub3duKSAgICAgICAgIHwgNAotICAgICAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgICAqLwotICAgICAgKmZvdW5kIHw9IFRMVkZMQUdfM1dBWV9IRUxMTzsKLSAgICAgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHXzNXQVlfSEVMTE8pIHsKLSAgICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikgewotICAgICAgICAvKiBGSVhNRTogbWFrZSB0aGlzIHdvcmsgKi8KKwljYXNlIFdBWTNfSEVMTE86CisJICAvKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAgICogfCAgICAgICAgICAgICAgICAgIEFkamFjZW5jeSBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMQorCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgICAqIHwgICAgICAgICAgICAgICAgICBFeHRlbmRlZCBMb2NhbCBDaXJjdWl0IElEICAgICAgICAgICAgICAgICAgICB8IDQKKwkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICAgKiB8ICAgICAgICAgICAgICAgICAgTmVpZ2hib3IgU3lzdGVtIElEIChJZiBrbm93bikgICAgICAgICAgICAgICAgfCAwLTgKKwkgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvYmFibHkgNikKKwkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICAgKiB8ICAgICAgICAgICAgICAgICAgTmVpZ2hib3IgTG9jYWwgQ2lyY3VpdCBJRCAoSWYga25vd24pICAgICAgICAgfCA0CisJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAgICovCisJICAqZm91bmQgfD0gVExWRkxBR18zV0FZX0hFTExPOworCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfM1dBWV9IRUxMTykKKwkgICAgeworCSAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pCisJCXsKKwkJICAvKiBGSVhNRTogbWFrZSB0aGlzIHdvcmsgKi8KIC8qICAgICAgICAgICBBZGphY2VuY3kgU3RhdGUgKG9uZSBvY3RldCk6CiAgICAgICAgICAgICAgIDAgPSBVcAogICAgICAgICAgICAgICAxID0gSW5pdGlhbGl6aW5nCkBAIC02NDQsNTYgKzcwNyw1OCBAQAogICAgICAgICAgICAgTmVpZ2hib3IgU3lzdGVtIElEIGlmIGtub3duICh6ZXJvIHRvIGVpZ2h0IG9jdGV0cykKICAgICAgICAgICAgIE5laWdoYm9yIEV4dGVuZGVkIExvY2FsIENpcmN1aXQgSUQgKGZvdXIgb2N0ZXRzLCBpZiBOZWlnaGJvcgogICAgICAgICAgICAgICBTeXN0ZW0gSUQgaXMgcHJlc2VudCkgKi8KLSAgICAgICAgICBwbnQgKz0gbGVuZ3RoOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwbnQgKz0gbGVuZ3RoOwotICAgICAgfQorCQkgIHBudCArPSBsZW5ndGg7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcG50ICs9IGxlbmd0aDsKKwkgICAgfQogCi0gICAgICBicmVhazsKLSAgICBjYXNlIEdSQUNFRlVMX1JFU1RBUlQ6Ci0gICAgICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICAgICAgICogfCAgICAgICAgIFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgIHwgIFNBICAgfCAgUkEgICB8ICBSUiAgIHwgMQotICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbWFpbmluZyBUaW1lICAgICAgICAgICAgICAgICAgICAgICB8IDIKLSAgICAgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICAgKiB8ICAgICAgICAgICAgICAgIFJlc3RhcnRpbmcgTmVpZ2hib3IgSUQgKElmIGtub3duKSAgICAgICAgICAgICAgfCAwLTgKLSAgICAgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICAgKi8KLSAgICAgICpmb3VuZCB8PSBUTFZGTEFHX0dSQUNFRlVMX1JFU1RBUlQ7Ci0gICAgICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19HUkFDRUZVTF9SRVNUQVJUKSB7Ci0gICAgICAgIC8qIEZJWE1FOiBtYWtlIHRoaXMgd29yayAqLwotICAgICAgfQotICAgICAgcG50ICs9IGxlbmd0aDsKLSAgICAgIGJyZWFrOworCSAgYnJlYWs7CisJY2FzZSBHUkFDRUZVTF9SRVNUQVJUOgorCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKwkgICAqIHwgICAgICAgICBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICB8ICBTQSAgIHwgIFJBICAgfCAgUlIgICB8IDEKKwkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1haW5pbmcgVGltZSAgICAgICAgICAgICAgICAgICAgICAgfCAyCisJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAgICogfCAgICAgICAgICAgICAgICBSZXN0YXJ0aW5nIE5laWdoYm9yIElEIChJZiBrbm93bikgICAgICAgICAgICAgIHwgMC04CisJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAgICovCisJICAqZm91bmQgfD0gVExWRkxBR19HUkFDRUZVTF9SRVNUQVJUOworCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfR1JBQ0VGVUxfUkVTVEFSVCkKKwkgICAgeworCSAgICAgIC8qIEZJWE1FOiBtYWtlIHRoaXMgd29yayAqLworCSAgICB9CisJICBwbnQgKz0gbGVuZ3RoOworCSAgYnJlYWs7CiAKLSAgICBkZWZhdWx0OgotICAgICAgemxvZ193YXJuICgiSVNJUy1UTFYgKCVzKTogdW5zdXBwb3J0ZWQgVExWIHR5cGUgJWQsIGxlbmd0aCAlZCIsCi0JCSBhcmVhdGFnLAotCQkgdHlwZSwKLQkJIGxlbmd0aCk7CisJZGVmYXVsdDoKKwkgIHpsb2dfd2FybiAoIklTSVMtVExWICglcyk6IHVuc3VwcG9ydGVkIFRMViB0eXBlICVkLCBsZW5ndGggJWQiLAorCQkgICAgIGFyZWF0YWcsIHR5cGUsIGxlbmd0aCk7CiAKLSAgICAgIHJldHZhbCA9IElTSVNfV0FSTklORzsKLSAgICAgIHBudCArPSBsZW5ndGg7Ci0gICAgICBicmVhazsKKwkgIHJldHZhbCA9IElTSVNfV0FSTklORzsKKwkgIHBudCArPSBsZW5ndGg7CisJICBicmVhazsKKwl9CiAgICAgfQotICB9Ci0gIAorCiAgIHJldHVybiByZXR2YWw7CiB9CiAKIGludAotYWRkX3RsdiAodV9jaGFyIHRhZywgdV9jaGFyIGxlbiwgdV9jaGFyICp2YWx1ZSwgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQorYWRkX3RsdiAodV9jaGFyIHRhZywgdV9jaGFyIGxlbiwgdV9jaGFyICogdmFsdWUsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKIHsKIAotICBpZiAoU1RSRUFNX1NJWkUgKHN0cmVhbSkgLSBzdHJlYW1fZ2V0X3B1dHAgKHN0cmVhbSkgIDwgbGVuICsgMikgewotICAgIHpsb2dfd2FybiAoIk5vIHJvb20gZm9yIFRMViBvZiB0eXBlICVkIiwgdGFnKTsKLSAgICByZXR1cm4gSVNJU19XQVJOSU5HOwotICB9CisgIGlmIChTVFJFQU1fU0laRSAoc3RyZWFtKSAtIHN0cmVhbV9nZXRfcHV0cCAoc3RyZWFtKSA8IGxlbiArIDIpCisgICAgeworICAgICAgemxvZ193YXJuICgiTm8gcm9vbSBmb3IgVExWIG9mIHR5cGUgJWQiLCB0YWcpOworICAgICAgcmV0dXJuIElTSVNfV0FSTklORzsKKyAgICB9CiAKLSAgc3RyZWFtX3B1dGMgKHN0cmVhbSwgdGFnKTsgIC8qIFRBRyAqLwotICBzdHJlYW1fcHV0YyAoc3RyZWFtLCBsZW4pOyAgLyogTEVOR1RIICovCi0gIHN0cmVhbV9wdXQgKHN0cmVhbSwgdmFsdWUsIChpbnQpbGVuKTsgLyogVkFMVUUgKi8KKyAgc3RyZWFtX3B1dGMgKHN0cmVhbSwgdGFnKTsJLyogVEFHICovCisgIHN0cmVhbV9wdXRjIChzdHJlYW0sIGxlbik7CS8qIExFTkdUSCAqLworICBzdHJlYW1fcHV0IChzdHJlYW0sIHZhbHVlLCAoaW50KSBsZW4pOwkvKiBWQUxVRSAqLwogCiAjaWZkZWYgRVhUUkVNRV9ERUJVRwogICB6bG9nX2luZm8gKCJBZGRlZCBUTFYgJWQgbGVuICVkIiwgdGFnLCBsZW4pOwpAQCAtNzAxLDkzICs3NjYsOTYgQEAKICAgcmV0dXJuIElTSVNfT0s7CiB9CiAKLQogaW50Ci10bHZfYWRkX2FyZWFfYWRkcnMgKHN0cnVjdCBsaXN0ICphcmVhX2FkZHJzLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pIAordGx2X2FkZF9hcmVhX2FkZHJzIChzdHJ1Y3QgbGlzdCAqYXJlYV9hZGRycywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQogewogICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgIHN0cnVjdCBhcmVhX2FkZHIgKmFyZWFfYWRkcjsKIAotICB1X2NoYXIgdmFsdWUgWzI1NV07CisgIHVfY2hhciB2YWx1ZVsyNTVdOwogICB1X2NoYXIgKnBvcyA9IHZhbHVlOwotICAKLSAgZm9yIChub2RlID0gbGlzdGhlYWQgKGFyZWFfYWRkcnMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsgCi0gICAgYXJlYV9hZGRyID0gZ2V0ZGF0YSAobm9kZSk7Ci0gICAgaWYgKHBvcyAtIHZhbHVlICsgYXJlYV9hZGRyLT5hZGRyX2xlbiA+IDI1NSkKLSAgICAgIGdvdG8gZXJyOwotICAgICpwb3MgPSBhcmVhX2FkZHItPmFkZHJfbGVuOwotICAgIHBvcyArKzsKLSAgICBtZW1jcHkgKHBvcywgYXJlYV9hZGRyLT5hcmVhX2FkZHIsIChpbnQpYXJlYV9hZGRyLT5hZGRyX2xlbik7Ci0gICAgcG9zICs9IGFyZWFfYWRkci0+YWRkcl9sZW47Ci0gIH0KLSAgCisKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGFyZWFfYWRkcnMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisgICAgeworICAgICAgYXJlYV9hZGRyID0gZ2V0ZGF0YSAobm9kZSk7CisgICAgICBpZiAocG9zIC0gdmFsdWUgKyBhcmVhX2FkZHItPmFkZHJfbGVuID4gMjU1KQorCWdvdG8gZXJyOworICAgICAgKnBvcyA9IGFyZWFfYWRkci0+YWRkcl9sZW47CisgICAgICBwb3MrKzsKKyAgICAgIG1lbWNweSAocG9zLCBhcmVhX2FkZHItPmFyZWFfYWRkciwgKGludCkgYXJlYV9hZGRyLT5hZGRyX2xlbik7CisgICAgICBwb3MgKz0gYXJlYV9hZGRyLT5hZGRyX2xlbjsKKyAgICB9CisKICAgcmV0dXJuIGFkZF90bHYgKEFSRUFfQUREUkVTU0VTLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7CiAKLSBlcnI6CitlcnI6CiAgIHpsb2dfd2FybiAoInRsdl9hZGRfYXJlYV9hZGRycygpOiBUTFYgbG9uZ2VyIHRoYW4gMjU1Iik7CiAgIHJldHVybiBJU0lTX1dBUk5JTkc7CiB9CiAKLWludCB0bHZfYWRkX2lzX25laWdocyAoc3RydWN0IGxpc3QgKmlzX25laWdocywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQoraW50Cit0bHZfYWRkX2lzX25laWdocyAoc3RydWN0IGxpc3QgKmlzX25laWdocywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQogewogICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgIHN0cnVjdCBpc19uZWlnaCAqaXNfbmVpZ2g7Ci0gIHVfY2hhciB2YWx1ZSBbMjU1XTsKKyAgdV9jaGFyIHZhbHVlWzI1NV07CiAgIHVfY2hhciAqcG9zID0gdmFsdWU7CiAgIGludCByZXR2YWw7CiAKLSAgKnBvcyA9ICAwOyAvKmlzX25laWdoLT52aXJ0dWFsOyAqLwotICBwb3MgKys7CisgICpwb3MgPSAwOwkJCS8qaXNfbmVpZ2gtPnZpcnR1YWw7ICovCisgIHBvcysrOwogCi0gIGZvciAobm9kZSA9IGxpc3RoZWFkIChpc19uZWlnaHMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsgCi0gICAgaXNfbmVpZ2ggPSBnZXRkYXRhIChub2RlKTsKLSAgICBpZiAocG9zIC0gdmFsdWUgKyBJU19ORUlHSEJPVVJTX0xFTiA+IDI1NSkgewotICAgICAgcmV0dmFsID0gYWRkX3RsdiAoSVNfTkVJR0hCT1VSUywgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwotICAgICAgaWYgKHJldHZhbCAhPSBJU0lTX09LKQotCXJldHVybiByZXR2YWw7Ci0gICAgICBwb3MgPSB2YWx1ZTsKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGlzX25laWdocyk7IG5vZGU7IG5leHRub2RlIChub2RlKSkKKyAgICB7CisgICAgICBpc19uZWlnaCA9IGdldGRhdGEgKG5vZGUpOworICAgICAgaWYgKHBvcyAtIHZhbHVlICsgSVNfTkVJR0hCT1VSU19MRU4gPiAyNTUpCisJeworCSAgcmV0dmFsID0gYWRkX3RsdiAoSVNfTkVJR0hCT1VSUywgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOworCSAgaWYgKHJldHZhbCAhPSBJU0lTX09LKQorCSAgICByZXR1cm4gcmV0dmFsOworCSAgcG9zID0gdmFsdWU7CisJfQorICAgICAgKnBvcyA9IGlzX25laWdoLT5tZXRyaWNzLm1ldHJpY19kZWZhdWx0OworICAgICAgcG9zKys7CisgICAgICAqcG9zID0gaXNfbmVpZ2gtPm1ldHJpY3MubWV0cmljX2RlbGF5OworICAgICAgcG9zKys7CisgICAgICAqcG9zID0gaXNfbmVpZ2gtPm1ldHJpY3MubWV0cmljX2V4cGVuc2U7CisgICAgICBwb3MrKzsKKyAgICAgICpwb3MgPSBpc19uZWlnaC0+bWV0cmljcy5tZXRyaWNfZXJyb3I7CisgICAgICBwb3MrKzsKKyAgICAgIG1lbWNweSAocG9zLCBpc19uZWlnaC0+bmVpZ2hfaWQsIElTSVNfU1lTX0lEX0xFTiArIDEpOworICAgICAgcG9zICs9IElTSVNfU1lTX0lEX0xFTiArIDE7CiAgICAgfQotICAgICpwb3MgPSBpc19uZWlnaC0+bWV0cmljcy5tZXRyaWNfZGVmYXVsdDsKLSAgICBwb3MgKys7ICAgIAotICAgICpwb3MgPSBpc19uZWlnaC0+bWV0cmljcy5tZXRyaWNfZGVsYXk7Ci0gICAgcG9zICsrOyAgICAKLSAgICAqcG9zID0gaXNfbmVpZ2gtPm1ldHJpY3MubWV0cmljX2V4cGVuc2U7Ci0gICAgcG9zICsrOyAgICAKLSAgICAqcG9zID0gaXNfbmVpZ2gtPm1ldHJpY3MubWV0cmljX2Vycm9yOwotICAgIHBvcyArKzsKLSAgICBtZW1jcHkgKHBvcywgaXNfbmVpZ2gtPm5laWdoX2lkLCBJU0lTX1NZU19JRF9MRU4gKyAxKTsKLSAgICBwb3MgKz0gSVNJU19TWVNfSURfTEVOICsgMTsKLSAgfQogCiAgIHJldHVybiBhZGRfdGx2IChJU19ORUlHSEJPVVJTLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7CiB9CiAKLQogaW50CiB0bHZfYWRkX2xhbl9uZWlnaHMgKHN0cnVjdCBsaXN0ICpsYW5fbmVpZ2hzLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCiB7CiAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKICAgdV9jaGFyICpzbnBhOwotICB1X2NoYXIgdmFsdWUgWzI1NV07CisgIHVfY2hhciB2YWx1ZVsyNTVdOwogICB1X2NoYXIgKnBvcyA9IHZhbHVlOwogICBpbnQgcmV0dmFsOwogCi0gIGZvciAobm9kZSA9IGxpc3RoZWFkIChsYW5fbmVpZ2hzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7IAotICAgIHNucGEgPSBnZXRkYXRhIChub2RlKTsKLSAgICBpZiAocG9zIC0gdmFsdWUgKyBFVEhfQUxFTiA+IDI1NSkgewotICAgICAgcmV0dmFsID0gYWRkX3RsdiAoTEFOX05FSUdIQk9VUlMsIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKLSAgICAgIGlmIChyZXR2YWwgIT0gSVNJU19PSykKLQlyZXR1cm4gcmV0dmFsOwotICAgICAgcG9zID0gdmFsdWU7CisgIGZvciAobm9kZSA9IGxpc3RoZWFkIChsYW5fbmVpZ2hzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorICAgIHsKKyAgICAgIHNucGEgPSBnZXRkYXRhIChub2RlKTsKKyAgICAgIGlmIChwb3MgLSB2YWx1ZSArIEVUSF9BTEVOID4gMjU1KQorCXsKKwkgIHJldHZhbCA9IGFkZF90bHYgKExBTl9ORUlHSEJPVVJTLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7CisJICBpZiAocmV0dmFsICE9IElTSVNfT0spCisJICAgIHJldHVybiByZXR2YWw7CisJICBwb3MgPSB2YWx1ZTsKKwl9CisgICAgICBtZW1jcHkgKHBvcywgc25wYSwgRVRIX0FMRU4pOworICAgICAgcG9zICs9IEVUSF9BTEVOOwogICAgIH0KLSAgICBtZW1jcHkgKHBvcywgc25wYSwgRVRIX0FMRU4pOwotICAgIHBvcyArPSBFVEhfQUxFTjsKLSAgfQogCiAgIHJldHVybiBhZGRfdGx2IChMQU5fTkVJR0hCT1VSUywgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwogfQogCi0KIC8qCiAgIHVfY2hhciB2YWx1ZVsyNTVdOwogICB1X2NoYXIgKnBvcyA9IHZhbHVlOwpAQCAtODA1LDEzICs4NzMsMTMgQEAKIGludAogdGx2X2FkZF9ubHBpZCAoc3RydWN0IG5scGlkcyAqbmxwaWRzLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCiB7Ci0gIAotICByZXR1cm4gYWRkX3RsdiAoUFJPVE9DT0xTX1NVUFBPUlRFRCwgbmxwaWRzLT5jb3VudCwgCi0gICAgICAgICAgICAgICAgICBubHBpZHMtPm5scGlkcywgc3RyZWFtKTsgCisKKyAgcmV0dXJuIGFkZF90bHYgKFBST1RPQ09MU19TVVBQT1JURUQsIG5scGlkcy0+Y291bnQsIG5scGlkcy0+bmxwaWRzLCBzdHJlYW0pOwogfQogCi1pbnQgdGx2X2FkZF9hdXRoaW5mbyAgKGNoYXIgYXV0aF90eXBlLCBjaGFyIGF1dGhfbGVuLCBjaGFyICphdXRoX3ZhbHVlLAotCQkgICAgICAgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQoraW50Cit0bHZfYWRkX2F1dGhpbmZvIChjaGFyIGF1dGhfdHlwZSwgY2hhciBhdXRoX2xlbiwgY2hhciAqYXV0aF92YWx1ZSwKKwkJICBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCiB7CiAgIHVfY2hhciB2YWx1ZVsyNTVdOwogICB1X2NoYXIgKnBvcyA9IHZhbHVlOwpAQCAtODI1LDkgKzg5Myw4IEBACiB0bHZfYWRkX2NoZWNrc3VtIChzdHJ1Y3QgY2hlY2tzdW0gKmNoZWNrc3VtLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCiB7CiAgIHVfY2hhciB2YWx1ZVsyNTVdOwotICB1X2NoYXIgKnBvcyA9IHZhbHVlOyAgCi0gIHJldHVybiBhZGRfdGx2IChDSEVDS1NVTSwgcG9zIC0gdmFsdWUsIAotICAgICAgICAgICAgICAgICAgdmFsdWUsIHN0cmVhbSk7IAorICB1X2NoYXIgKnBvcyA9IHZhbHVlOworICByZXR1cm4gYWRkX3RsdiAoQ0hFQ0tTVU0sIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKIH0KIAogaW50CkBAIC04MzksOTMgKzkwNiwxMDEgQEAKICAgdV9jaGFyICpwb3MgPSB2YWx1ZTsKICAgaW50IHJldHZhbDsKIAotICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoaXBfYWRkcnMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsgCi0gICAgaXB2NCA9IGdldGRhdGEgKG5vZGUpOwotICAgIGlmIChwb3MgLSB2YWx1ZSArIElQVjRfTUFYX0JZVEVMRU4gPiAyNTUpIHsKLSAgICAgIHJldHZhbCA9IGFkZF90bHYgKElQVjRfQUREUiwgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwotICAgICAgaWYgKHJldHZhbCAhPSBJU0lTX09LKQotCXJldHVybiByZXR2YWw7Ci0gICAgICBwb3MgPSB2YWx1ZTsKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGlwX2FkZHJzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorICAgIHsKKyAgICAgIGlwdjQgPSBnZXRkYXRhIChub2RlKTsKKyAgICAgIGlmIChwb3MgLSB2YWx1ZSArIElQVjRfTUFYX0JZVEVMRU4gPiAyNTUpCisJeworCSAgcmV0dmFsID0gYWRkX3RsdiAoSVBWNF9BRERSLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7CisJICBpZiAocmV0dmFsICE9IElTSVNfT0spCisJICAgIHJldHVybiByZXR2YWw7CisJICBwb3MgPSB2YWx1ZTsKKwl9CisgICAgICAqKHVfaW50MzJfdCAqKSBwb3MgPSBpcHY0LT5wcmVmaXguc19hZGRyOworICAgICAgcG9zICs9IElQVjRfTUFYX0JZVEVMRU47CiAgICAgfQotICAgICoodV9pbnQzMl90Kilwb3MgPSBpcHY0LT5wcmVmaXguc19hZGRyOwotICAgIHBvcyArPSBJUFY0X01BWF9CWVRFTEVOOwotICB9Ci0gIAorCiAgIHJldHVybiBhZGRfdGx2IChJUFY0X0FERFIsIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKIH0KIAogaW50CiB0bHZfYWRkX2R5bmFtaWNfaG9zdG5hbWUgKHN0cnVjdCBob3N0bmFtZSAqaG9zdG5hbWUsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKIHsKLSAgcmV0dXJuIGFkZF90bHYgKERZTkFNSUNfSE9TVE5BTUUsIGhvc3RuYW1lLT5uYW1lbGVuLCBob3N0bmFtZS0+bmFtZSwgc3RyZWFtKTsKKyAgcmV0dXJuIGFkZF90bHYgKERZTkFNSUNfSE9TVE5BTUUsIGhvc3RuYW1lLT5uYW1lbGVuLCBob3N0bmFtZS0+bmFtZSwKKwkJICBzdHJlYW0pOwogfQogCi1pbnQgCitpbnQKIHRsdl9hZGRfbHNwX2VudHJpZXMgKHN0cnVjdCBsaXN0ICpsc3BzLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCiB7CiAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKICAgc3RydWN0IGlzaXNfbHNwICpsc3A7Ci0gIHVfY2hhciB2YWx1ZSBbMjU1XTsKKyAgdV9jaGFyIHZhbHVlWzI1NV07CiAgIHVfY2hhciAqcG9zID0gdmFsdWU7CiAgIGludCByZXR2YWw7CiAKLSAgZm9yIChub2RlID0gbGlzdGhlYWQgKGxzcHMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsgCi0gICAgbHNwID0gZ2V0ZGF0YSAobm9kZSk7Ci0gICAgaWYgKHBvcyAtIHZhbHVlICsgTFNQX0VOVFJJRVNfTEVOID4gMjU1KSB7Ci0gICAgICByZXR2YWwgPSBhZGRfdGx2IChMU1BfRU5UUklFUywgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwotICAgICAgaWYgKHJldHZhbCAhPSBJU0lTX09LKQotCXJldHVybiByZXR2YWw7Ci0gICAgICBwb3MgPSB2YWx1ZTsKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGxzcHMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisgICAgeworICAgICAgbHNwID0gZ2V0ZGF0YSAobm9kZSk7CisgICAgICBpZiAocG9zIC0gdmFsdWUgKyBMU1BfRU5UUklFU19MRU4gPiAyNTUpCisJeworCSAgcmV0dmFsID0gYWRkX3RsdiAoTFNQX0VOVFJJRVMsIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKKwkgIGlmIChyZXR2YWwgIT0gSVNJU19PSykKKwkgICAgcmV0dXJuIHJldHZhbDsKKwkgIHBvcyA9IHZhbHVlOworCX0KKyAgICAgICooKHVfaW50MTZfdCAqKSBwb3MpID0gbHNwLT5sc3BfaGVhZGVyLT5yZW1fbGlmZXRpbWU7CisgICAgICBwb3MgKz0gMjsKKyAgICAgIG1lbWNweSAocG9zLCBsc3AtPmxzcF9oZWFkZXItPmxzcF9pZCwgSVNJU19TWVNfSURfTEVOICsgMik7CisgICAgICBwb3MgKz0gSVNJU19TWVNfSURfTEVOICsgMjsKKyAgICAgICooKHVfaW50MzJfdCAqKSBwb3MpID0gbHNwLT5sc3BfaGVhZGVyLT5zZXFfbnVtOworICAgICAgcG9zICs9IDQ7CisgICAgICAqKCh1X2ludDE2X3QgKikgcG9zKSA9IGxzcC0+bHNwX2hlYWRlci0+Y2hlY2tzdW07CisgICAgICBwb3MgKz0gMjsKICAgICB9Ci0gICAgKigodV9pbnQxNl90Kilwb3MpID0gbHNwLT5sc3BfaGVhZGVyLT5yZW1fbGlmZXRpbWU7Ci0gICAgcG9zICs9IDI7Ci0gICAgbWVtY3B5IChwb3MsIGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkLCBJU0lTX1NZU19JRF9MRU4gKyAyKTsKLSAgICBwb3MgKz0gSVNJU19TWVNfSURfTEVOICsgMjsKLSAgICAqKCh1X2ludDMyX3QqKXBvcykgPSBsc3AtPmxzcF9oZWFkZXItPnNlcV9udW07Ci0gICAgcG9zICs9IDQ7ICAgIAotICAgICooKHVfaW50MTZfdCopcG9zKSA9IGxzcC0+bHNwX2hlYWRlci0+Y2hlY2tzdW07Ci0gICAgcG9zICs9IDI7Ci0gIH0KLSAgCisKICAgcmV0dXJuIGFkZF90bHYgKExTUF9FTlRSSUVTLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7CiB9CiAKLWludCAKK2ludAogdGx2X2FkZF9pcHY0X3JlYWNocyAoc3RydWN0IGxpc3QgKmlwdjRfcmVhY2hzLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCiB7CiAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKICAgc3RydWN0IGlwdjRfcmVhY2hhYmlsaXR5ICpyZWFjaDsKLSAgdV9jaGFyIHZhbHVlIFsyNTVdOworICB1X2NoYXIgdmFsdWVbMjU1XTsKICAgdV9jaGFyICpwb3MgPSB2YWx1ZTsKICAgaW50IHJldHZhbDsKIAotICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoaXB2NF9yZWFjaHMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsgCi0gICAgcmVhY2ggPSBnZXRkYXRhIChub2RlKTsKLSAgICBpZiAocG9zIC0gdmFsdWUgKyBJUFY0X1JFQUNIX0xFTiA+IDI1NSkgewotICAgICAgcmV0dmFsID0gYWRkX3RsdiAoSVBWNF9JTlRfUkVBQ0hBQklMSVRZLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7Ci0gICAgICBpZiAocmV0dmFsICE9IElTSVNfT0spCi0JcmV0dXJuIHJldHZhbDsKLSAgICAgIHBvcyA9IHZhbHVlOworICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoaXB2NF9yZWFjaHMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisgICAgeworICAgICAgcmVhY2ggPSBnZXRkYXRhIChub2RlKTsKKyAgICAgIGlmIChwb3MgLSB2YWx1ZSArIElQVjRfUkVBQ0hfTEVOID4gMjU1KQorCXsKKwkgIHJldHZhbCA9CisJICAgIGFkZF90bHYgKElQVjRfSU5UX1JFQUNIQUJJTElUWSwgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOworCSAgaWYgKHJldHZhbCAhPSBJU0lTX09LKQorCSAgICByZXR1cm4gcmV0dmFsOworCSAgcG9zID0gdmFsdWU7CisJfQorICAgICAgKnBvcyA9IHJlYWNoLT5tZXRyaWNzLm1ldHJpY19kZWZhdWx0OworICAgICAgcG9zKys7CisgICAgICAqcG9zID0gcmVhY2gtPm1ldHJpY3MubWV0cmljX2RlbGF5OworICAgICAgcG9zKys7CisgICAgICAqcG9zID0gcmVhY2gtPm1ldHJpY3MubWV0cmljX2V4cGVuc2U7CisgICAgICBwb3MrKzsKKyAgICAgICpwb3MgPSByZWFjaC0+bWV0cmljcy5tZXRyaWNfZXJyb3I7CisgICAgICBwb3MrKzsKKyAgICAgICoodV9pbnQzMl90ICopIHBvcyA9IHJlYWNoLT5wcmVmaXguc19hZGRyOworICAgICAgcG9zICs9IElQVjRfTUFYX0JZVEVMRU47CisgICAgICAqKHVfaW50MzJfdCAqKSBwb3MgPSByZWFjaC0+bWFzay5zX2FkZHI7CisgICAgICBwb3MgKz0gSVBWNF9NQVhfQllURUxFTjsKICAgICB9Ci0gICAgKnBvcyA9IHJlYWNoLT5tZXRyaWNzLm1ldHJpY19kZWZhdWx0OwotICAgIHBvcyArKzsgICAgCi0gICAgKnBvcyA9IHJlYWNoLT5tZXRyaWNzLm1ldHJpY19kZWxheTsKLSAgICBwb3MgKys7ICAgIAotICAgICpwb3MgPSByZWFjaC0+bWV0cmljcy5tZXRyaWNfZXhwZW5zZTsKLSAgICBwb3MgKys7ICAgIAotICAgICpwb3MgPSByZWFjaC0+bWV0cmljcy5tZXRyaWNfZXJyb3I7Ci0gICAgcG9zICsrOwotICAgKih1X2ludDMyX3QqKXBvcyA9IHJlYWNoLT5wcmVmaXguc19hZGRyOwotICAgIHBvcyArPSBJUFY0X01BWF9CWVRFTEVOOwotICAgKih1X2ludDMyX3QqKXBvcyA9IHJlYWNoLT5tYXNrLnNfYWRkcjsKLSAgICBwb3MgKz0gSVBWNF9NQVhfQllURUxFTjsKLSAgfSAgICAKLSAgCi0gIAorCisKICAgcmV0dXJuIGFkZF90bHYgKElQVjRfSU5UX1JFQUNIQUJJTElUWSwgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwogfQogCi0jaWZkZWYgSEFWRV9JUFY2IAorI2lmZGVmIEhBVkVfSVBWNgogaW50CiB0bHZfYWRkX2lwdjZfYWRkcnMgKHN0cnVjdCBsaXN0ICppcHY2X2FkZHJzLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCiB7CkBAIC05MzQsMTkgKzEwMDksMjEgQEAKICAgdV9jaGFyIHZhbHVlWzI1NV07CiAgIHVfY2hhciAqcG9zID0gdmFsdWU7CiAgIGludCByZXR2YWw7Ci0gIAotICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoaXB2Nl9hZGRycyk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgeyAKLSAgICBpcHY2ID0gZ2V0ZGF0YSAobm9kZSk7Ci0gICAgaWYgKHBvcyAtIHZhbHVlICsgSVBWNl9NQVhfQllURUxFTiA+IDI1NSkgewotICAgICAgcmV0dmFsID0gYWRkX3RsdiAoSVBWNl9BRERSLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7Ci0gICAgICBpZiAocmV0dmFsICE9IElTSVNfT0spCi0JcmV0dXJuIHJldHZhbDsKLSAgICAgIHBvcyA9IHZhbHVlOworCisgIGZvciAobm9kZSA9IGxpc3RoZWFkIChpcHY2X2FkZHJzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorICAgIHsKKyAgICAgIGlwdjYgPSBnZXRkYXRhIChub2RlKTsKKyAgICAgIGlmIChwb3MgLSB2YWx1ZSArIElQVjZfTUFYX0JZVEVMRU4gPiAyNTUpCisJeworCSAgcmV0dmFsID0gYWRkX3RsdiAoSVBWNl9BRERSLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7CisJICBpZiAocmV0dmFsICE9IElTSVNfT0spCisJICAgIHJldHVybiByZXR2YWw7CisJICBwb3MgPSB2YWx1ZTsKKwl9CisgICAgICBtZW1jcHkgKHBvcywgaXB2Ni0+cHJlZml4LnM2X2FkZHIsIElQVjZfTUFYX0JZVEVMRU4pOworICAgICAgcG9zICs9IElQVjZfTUFYX0JZVEVMRU47CiAgICAgfQotICAgIG1lbWNweSAocG9zLCBpcHY2LT5wcmVmaXguczZfYWRkciwgSVBWNl9NQVhfQllURUxFTik7Ci0gICAgcG9zICs9IElQVjZfTUFYX0JZVEVMRU47Ci0gIH0KLSAgCisKICAgcmV0dXJuIGFkZF90bHYgKElQVjZfQUREUiwgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwogfQogCkBAIC05NTgsMjYgKzEwMzUsMjggQEAKICAgdV9jaGFyIHZhbHVlWzI1NV07CiAgIHVfY2hhciAqcG9zID0gdmFsdWU7CiAgIGludCByZXR2YWwsIHByZWZpeF9vY3RldHM7Ci0gCi0gIGZvciAobm9kZSA9IGxpc3RoZWFkIChpcHY2X3JlYWNocyk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgeyAKLSAgICBpcDZyZWFjaCA9IGdldGRhdGEgKG5vZGUpOwotICAgIGlmIChwb3MgLSB2YWx1ZSArIElQVjZfTUFYX0JZVEVMRU4gKyA2ID4gMjU1KSB7Ci0gICAgICByZXR2YWwgPSBhZGRfdGx2IChJUFY2X1JFQUNIQUJJTElUWSwgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwotICAgICAgaWYgKHJldHZhbCAhPSBJU0lTX09LKQotCXJldHVybiByZXR2YWw7Ci0gICAgICBwb3MgPSB2YWx1ZTsKKworICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoaXB2Nl9yZWFjaHMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisgICAgeworICAgICAgaXA2cmVhY2ggPSBnZXRkYXRhIChub2RlKTsKKyAgICAgIGlmIChwb3MgLSB2YWx1ZSArIElQVjZfTUFYX0JZVEVMRU4gKyA2ID4gMjU1KQorCXsKKwkgIHJldHZhbCA9IGFkZF90bHYgKElQVjZfUkVBQ0hBQklMSVRZLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7CisJICBpZiAocmV0dmFsICE9IElTSVNfT0spCisJICAgIHJldHVybiByZXR2YWw7CisJICBwb3MgPSB2YWx1ZTsKKwl9CisgICAgICAqKHVpbnQzMl90ICopIHBvcyA9IGlwNnJlYWNoLT5tZXRyaWM7CisgICAgICBwb3MgKz0gNDsKKyAgICAgICpwb3MgPSBpcDZyZWFjaC0+Y29udHJvbF9pbmZvOworICAgICAgcG9zKys7CisgICAgICBwcmVmaXhfb2N0ZXRzID0gKChpcDZyZWFjaC0+cHJlZml4X2xlbiArIDcpIC8gOCk7CisgICAgICAqcG9zID0gaXA2cmVhY2gtPnByZWZpeF9sZW47CisgICAgICBwb3MrKzsKKyAgICAgIG1lbWNweSAocG9zLCBpcDZyZWFjaC0+cHJlZml4LCBwcmVmaXhfb2N0ZXRzKTsKKyAgICAgIHBvcyArPSBwcmVmaXhfb2N0ZXRzOwogICAgIH0KLSAgICAqKHVpbnQzMl90Kilwb3MgPSBpcDZyZWFjaC0+bWV0cmljOwotICAgIHBvcyArPSA0OwotICAgICpwb3MgPSBpcDZyZWFjaC0+Y29udHJvbF9pbmZvOwotICAgIHBvcysrOwotICAgIHByZWZpeF9vY3RldHMgPSAoKGlwNnJlYWNoLT5wcmVmaXhfbGVuICsgNykgLyA4KTsKLSAgICAqcG9zID0gaXA2cmVhY2gtPnByZWZpeF9sZW47Ci0gICAgcG9zKys7Ci0gICAgbWVtY3B5IChwb3MsIGlwNnJlYWNoLT5wcmVmaXgsIHByZWZpeF9vY3RldHMpOwotICAgIHBvcyArPSBwcmVmaXhfb2N0ZXRzOwotICB9Ci0gIAorCiAgIHJldHVybiBhZGRfdGx2IChJUFY2X1JFQUNIQUJJTElUWSwgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwogfQogI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwpAQCAtOTg2LDM2ICsxMDY1LDM4IEBACiB0bHZfYWRkX3BhZGRpbmcgKHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKIHsKICAgdW5zaWduZWQgbG9uZyBwdXRwLCBlbmRwOwotICBpbnQgIGZ1bGxwYWRzLCBpLCBsZWZ0OwotICAKKyAgaW50IGZ1bGxwYWRzLCBpLCBsZWZ0OworCiAgIC8qCiAgICAqIEhvdyBtYW55IHRpbWVzIGNhbiB3ZSBhZGQgZnVsbCBwYWRkaW5nID8KICAgICovCi0gIGZ1bGxwYWRzID0gKFNUUkVBTV9TSVpFKHN0cmVhbSkgLSBzdHJlYW1fZ2V0X2VuZHAgKHN0cmVhbSkpIC8gMjU3OwotICBmb3IgKGkgPSAwOyBpIDwgZnVsbHBhZHM7IGkgKyspIHsKLSAgICBpZiAoIXN0cmVhbV9wdXRjIChzdHJlYW0sICh1X2NoYXIpUEFERElORykpIC8qIFRBRyAqLwotICAgICAgZ290byBlcnI7Ci0gICAgaWYgKCFzdHJlYW1fcHV0YyAoc3RyZWFtLCAodV9jaGFyKTI1NSkpICAgICAvKiBMRU5HSFQgKi8KLSAgICAgIGdvdG8gZXJyOwotICAgIGVuZHAgPSBzdHJlYW1fZ2V0X2VuZHAgKHN0cmVhbSk7Ci0gICAgcHV0cCA9IHN0cmVhbV9nZXRfcHV0cCAoc3RyZWFtKTsKLSAgICBpZiAocHV0cCAhPSBlbmRwKQotICAgICAgemxvZ193YXJuICgidHZsX2FkZF9wYWRkaW5nIGVuZHAgJWxkIHdoaWxlIHB1dHAgJWxkIiwgZW5kcCwgcHV0cCk7Ci0gICAgc3RyZWFtX3NldF9wdXRwIChzdHJlYW0sIHB1dHAgKyAyNTUpOyAgICAgICAvKiBWQUxVRSAqLwotICAgIHN0cmVhbS0+ZW5kcCA9IHN0cmVhbS0+cHV0cDsKLSAgfQotICAKLSAgbGVmdCA9IFNUUkVBTV9TSVpFKHN0cmVhbSkgLSBzdHJlYW1fZ2V0X3B1dHAgKHN0cmVhbSk7Ci0gIAorICBmdWxscGFkcyA9IChTVFJFQU1fU0laRSAoc3RyZWFtKSAtIHN0cmVhbV9nZXRfZW5kcCAoc3RyZWFtKSkgLyAyNTc7CisgIGZvciAoaSA9IDA7IGkgPCBmdWxscGFkczsgaSsrKQorICAgIHsKKyAgICAgIGlmICghc3RyZWFtX3B1dGMgKHN0cmVhbSwgKHVfY2hhcikgUEFERElORykpCS8qIFRBRyAqLworCWdvdG8gZXJyOworICAgICAgaWYgKCFzdHJlYW1fcHV0YyAoc3RyZWFtLCAodV9jaGFyKSAyNTUpKQkvKiBMRU5HSFQgKi8KKwlnb3RvIGVycjsKKyAgICAgIGVuZHAgPSBzdHJlYW1fZ2V0X2VuZHAgKHN0cmVhbSk7CisgICAgICBwdXRwID0gc3RyZWFtX2dldF9wdXRwIChzdHJlYW0pOworICAgICAgaWYgKHB1dHAgIT0gZW5kcCkKKwl6bG9nX3dhcm4gKCJ0dmxfYWRkX3BhZGRpbmcgZW5kcCAlbGQgd2hpbGUgcHV0cCAlbGQiLCBlbmRwLCBwdXRwKTsKKyAgICAgIHN0cmVhbV9zZXRfcHV0cCAoc3RyZWFtLCBwdXRwICsgMjU1KTsJLyogVkFMVUUgKi8KKyAgICAgIHN0cmVhbS0+ZW5kcCA9IHN0cmVhbS0+cHV0cDsKKyAgICB9CisKKyAgbGVmdCA9IFNUUkVBTV9TSVpFIChzdHJlYW0pIC0gc3RyZWFtX2dldF9wdXRwIChzdHJlYW0pOworCiAgIGlmIChsZWZ0IDwgMikKICAgICByZXR1cm4gSVNJU19PSzsKLSAgCi0gIGlmIChsZWZ0ID09IDIpIHsKLSAgICBzdHJlYW1fcHV0YyAoc3RyZWFtLCBQQURESU5HKTsKLSAgICBzdHJlYW1fcHV0YyAoc3RyZWFtLCAwKTsKLSAgICByZXR1cm4gSVNJU19PSzsKLSAgfQotICAKKworICBpZiAobGVmdCA9PSAyKQorICAgIHsKKyAgICAgIHN0cmVhbV9wdXRjIChzdHJlYW0sIFBBRERJTkcpOworICAgICAgc3RyZWFtX3B1dGMgKHN0cmVhbSwgMCk7CisgICAgICByZXR1cm4gSVNJU19PSzsKKyAgICB9CisKICAgc3RyZWFtX3B1dGMgKHN0cmVhbSwgUEFERElORyk7CiAgIHN0cmVhbV9wdXRjIChzdHJlYW0sIGxlZnQgLSAyKTsKICAgc3RyZWFtX3NldF9wdXRwIChzdHJlYW0sIHN0cmVhbV9nZXRfcHV0cCAoc3RyZWFtKSArIGxlZnQgLSAyKTsKQEAgLTEwMjMsNyArMTEwNCw3IEBACiAKICAgcmV0dXJuIElTSVNfT0s7CiAKLSBlcnI6CitlcnI6CiAgIHpsb2dfd2FybiAoInRsdl9hZGRfcGFkZGluZygpOiBubyByb29tIGZvciB0bHYiKTsKICAgcmV0dXJuIElTSVNfV0FSTklORzsKIH0KZGlmZiAtLWdpdCBhL2lzaXNkL2lzaXNfdGx2LmggYi9pc2lzZC9pc2lzX3Rsdi5oCmluZGV4IGUwMzAzODUuLmU0ZmQ5ZTAgMTAwNjQ0Ci0tLSBhL2lzaXNkL2lzaXNfdGx2LmgKKysrIGIvaXNpc2QvaXNpc190bHYuaApAQCAtOTUsODYgKzk1LDk4IEBACiAKICNkZWZpbmUgSVNfTkVJR0hCT1VSU19MRU4gKElTSVNfU1lTX0lEX0xFTiArIDUpCiAjZGVmaW5lIExBTl9ORUlHSEJPVVJTX0xFTiA2Ci0jZGVmaW5lIExTUF9FTlRSSUVTX0xFTiAoMTAgKyBJU0lTX1NZU19JRF9MRU4pIC8qIEZJWE1FOiBzaG91bGQgYmUgZW50cnkgKi8KKyNkZWZpbmUgTFNQX0VOVFJJRVNfTEVOICgxMCArIElTSVNfU1lTX0lEX0xFTikJLyogRklYTUU6IHNob3VsZCBiZSBlbnRyeSAqLwogI2RlZmluZSBJUFY0X1JFQUNIX0xFTiAxMgogI2RlZmluZSBJUFY2X1JFQUNIX0xFTiAyMgogCiAvKiBzdHJ1Y3QgZm9yIG5laWdoYm9yICovCi1zdHJ1Y3QgaXNfbmVpZ2h7Ci0gIHN0cnVjdCBtZXRyaWMgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzOwotICB1X2NoYXIgICAgICAgICBuZWlnaF9pZFtJU0lTX1NZU19JRF9MRU4gKyAxXTsKK3N0cnVjdCBpc19uZWlnaAoreworICBzdHJ1Y3QgbWV0cmljIG1ldHJpY3M7CisgIHVfY2hhciBuZWlnaF9pZFtJU0lTX1NZU19JRF9MRU4gKyAxXTsKIH07CiAKIC8qIHN0cnVjdCBmb3IgdGUgaXMgbmVpZ2hib3IgKi8KLXN0cnVjdCB0ZV9pc19uZWlnaHsKLSAgdV9jaGFyICAgICAgICAgbmVpZ2hfaWRbSVNJU19TWVNfSURfTEVOICsgMV07Ci0gIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgdGVfbWV0cmljWzNdOwotICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgIHN1Yl90bHZzX2xlbmd0aDsKK3N0cnVjdCB0ZV9pc19uZWlnaAoreworICB1X2NoYXIgbmVpZ2hfaWRbSVNJU19TWVNfSURfTEVOICsgMV07CisgIHVfY2hhciB0ZV9tZXRyaWNbM107CisgIHVfY2hhciBzdWJfdGx2c19sZW5ndGg7CiB9OwogCiAvKiBzdHJ1Y3QgZm9yIGVzIG5laWdoYm9ycyAqLwotc3RydWN0IGVzX25laWdoewotICBzdHJ1Y3QgbWV0cmljICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljczsKK3N0cnVjdCBlc19uZWlnaAoreworICBzdHJ1Y3QgbWV0cmljIG1ldHJpY3M7CiAgIC8qIGFwcHJveGltYXRlIHBvc2l0aW9uIG9mIGZpcnN0LCB3ZSB1c2UgdGhlCiAgICAqIGxlbmd0aCAoKHVjaGFyKiltZXRyaWMtMSkgdG8ga25vdyBhbGwgICAgICovCi0gIHVfY2hhciAgICAgICBmaXJzdF9lc19uZWlnaFtJU0lTX1NZU19JRF9MRU5dOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgdV9jaGFyIGZpcnN0X2VzX25laWdoW0lTSVNfU1lTX0lEX0xFTl07CisKIH07CiAKLXN0cnVjdCBwYXJ0aXRpb25fZGVzaWdfbGV2ZWwyX2lzewotICBzdHJ1Y3QgbGlzdCAgICAgICAgICAgICAgICAgKmlzaXNfc3lzdGVtX2lkczsKK3N0cnVjdCBwYXJ0aXRpb25fZGVzaWdfbGV2ZWwyX2lzCit7CisgIHN0cnVjdCBsaXN0ICppc2lzX3N5c3RlbV9pZHM7CiB9OwogCiAvKiBzdHJ1Y3QgZm9yIGxhbiBuZWlnaGJvcnMgKi8KLXN0cnVjdCBsYW5fbmVpZ2h7Ci0gIHVfY2hhciAgICAgICAgICAgICBMQU5fYWRkcls2XTsKK3N0cnVjdCBsYW5fbmVpZ2gKK3sKKyAgdV9jaGFyIExBTl9hZGRyWzZdOwogfTsKIAogLyogc3RydWN0IGZvciBMU1AgZW50cnkgKi8KLXN0cnVjdCBsc3BfZW50cnkgewotICB1X2ludDE2X3QgICAgICAgICAgICAgICAgICByZW1fbGlmZXRpbWU7Ci0gIHVfY2hhciAgICAgIGxzcF9pZFtJU0lTX1NZU19JRF9MRU4gKyAyXTsKLSAgdV9pbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICBzZXFfbnVtOwotICB1X2ludDE2X3QgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworc3RydWN0IGxzcF9lbnRyeQoreworICB1X2ludDE2X3QgcmVtX2xpZmV0aW1lOworICB1X2NoYXIgbHNwX2lkW0lTSVNfU1lTX0lEX0xFTiArIDJdOworICB1X2ludDMyX3Qgc2VxX251bTsKKyAgdV9pbnQxNl90IGNoZWNrc3VtOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIC8qIHN0cnVjdCBmb3IgY2hlY2tzdW0gKi8KLXN0cnVjdCBjaGVja3N1bSB7CitzdHJ1Y3QgY2hlY2tzdW0KK3sKICAgdV9pbnQxNl90IGNoZWNrc3VtOwogfTsKIAogLyogaXB2NCByZWFjaGFiaWxpdHkgKi8KLXN0cnVjdCBpcHY0X3JlYWNoYWJpbGl0eSB7CitzdHJ1Y3QgaXB2NF9yZWFjaGFiaWxpdHkKK3sKICAgc3RydWN0IG1ldHJpYyBtZXRyaWNzOwogICBzdHJ1Y3QgaW5fYWRkciBwcmVmaXg7Ci0gIHN0cnVjdCBpbl9hZGRyICAgbWFzazsKKyAgc3RydWN0IGluX2FkZHIgbWFzazsKIH07CiAKIC8qIHRlIHJvdXRlciBpZCAqLwotc3RydWN0IHRlX3JvdXRlcl9pZCB7Ci0gIHN0cnVjdCBpbl9hZGRyICAgICBpZDsKK3N0cnVjdCB0ZV9yb3V0ZXJfaWQKK3sKKyAgc3RydWN0IGluX2FkZHIgaWQ7CiB9OwogCiAvKiB0ZSBpcHY0IHJlYWNoYWJpbGl0eSAqLwotc3RydWN0IHRlX2lwdjRfcmVhY2hhYmlsaXR5IHsKLSAgdV9pbnQzMl90ICAgIHRlX21ldHJpYzsKLSAgdV9jaGFyICAgICAgICAgY29udHJvbDsKLSAgdV9jaGFyICAgIHByZWZpeF9zdGFydDsgLyogc2luY2UgdGhpcyBpcyB2YXJpYWJsZSBsZW5ndGggYnkgbmF0dXJlIGl0IG9ubHkgKi8KLX07CQkJICAvKiBwb2ludHMgdG8gYW4gYXBwcm94aW1hdGUgbG9jYXRpb24gKi8gCitzdHJ1Y3QgdGVfaXB2NF9yZWFjaGFiaWxpdHkKK3sKKyAgdV9pbnQzMl90IHRlX21ldHJpYzsKKyAgdV9jaGFyIGNvbnRyb2w7CisgIHVfY2hhciBwcmVmaXhfc3RhcnQ7CQkvKiBzaW5jZSB0aGlzIGlzIHZhcmlhYmxlIGxlbmd0aCBieSBuYXR1cmUgaXQgb25seSAqLworfTsJCQkJLyogcG9pbnRzIHRvIGFuIGFwcHJveGltYXRlIGxvY2F0aW9uICovCiAKIAogCi1zdHJ1Y3QgaWRycF9pbmZvIHsKK3N0cnVjdCBpZHJwX2luZm8KK3sKICAgdV9jaGFyIGxlbjsKICAgdV9jaGFyICp2YWx1ZTsKIH07CiAKICNpZmRlZiBIQVZFX0lQVjYKLXN0cnVjdCBpcHY2X3JlYWNoYWJpbGl0eSB7Ci0gIHVfaW50MzJfdCAgICAgICAgICBtZXRyaWM7Ci0gIHVfY2hhciAgICAgICAgICAgICBjb250cm9sX2luZm87IAotICB1X2NoYXIgICAgICAgICAgICAgcHJlZml4X2xlbjsKLSAgdV9jaGFyICAgICAgICAgICAgIHByZWZpeFsxNl07CitzdHJ1Y3QgaXB2Nl9yZWFjaGFiaWxpdHkKK3sKKyAgdV9pbnQzMl90IG1ldHJpYzsKKyAgdV9jaGFyIGNvbnRyb2xfaW5mbzsKKyAgdV9jaGFyIHByZWZpeF9sZW47CisgIHVfY2hhciBwcmVmaXhbMTZdOwogfTsKICNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KIApAQCAtMTkwLDI3ICsyMDIsMjggQEAKIC8qCiAgKiBQb2ludGVyIHRvIGVhY2ggdGx2IHR5cGUsIGZpbGxlZCBieSBwYXJzZV90bHZzKCkKICAqLwotc3RydWN0IHRsdnMgewotICBzdHJ1Y3QgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICphcmVhX2FkZHJzOwotICBzdHJ1Y3QgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaXNfbmVpZ2hzOwotICBzdHJ1Y3QgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAqdGVfaXNfbmVpZ2hzOwotICBzdHJ1Y3QgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXNfbmVpZ2hzOwotICBzdHJ1Y3QgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgKmxzcF9lbnRyaWVzOwotICBzdHJ1Y3QgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICpwcmVmaXhfbmVpZ2hzOwotICBzdHJ1Y3QgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICpsYW5fbmVpZ2hzOwotICBzdHJ1Y3QgY2hlY2tzdW0gICAgICAgICAgICAgICAgICAgICAgICAgKmNoZWNrc3VtOwotICBzdHJ1Y3QgbmxwaWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmxwaWRzOwotICBzdHJ1Y3QgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICppcHY0X2FkZHJzOwotICBzdHJ1Y3QgbGlzdCAgICAgICAgICAgICAgICAgICAgICAqaXB2NF9pbnRfcmVhY2hzOwotICBzdHJ1Y3QgbGlzdCAgICAgICAgICAgICAgICAgICAgICAqaXB2NF9leHRfcmVhY2hzOwotICBzdHJ1Y3QgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgKnRlX2lwdjRfcmVhY2hzOwotICBzdHJ1Y3QgaG9zdG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgKmhvc3RuYW1lOwotICBzdHJ1Y3QgdGVfcm91dGVyX2lkICAgICAgICAgICAgICAgICAgICAqcm91dGVyX2lkOworc3RydWN0IHRsdnMKK3sKKyAgc3RydWN0IGxpc3QgKmFyZWFfYWRkcnM7CisgIHN0cnVjdCBsaXN0ICppc19uZWlnaHM7CisgIHN0cnVjdCBsaXN0ICp0ZV9pc19uZWlnaHM7CisgIHN0cnVjdCBsaXN0ICplc19uZWlnaHM7CisgIHN0cnVjdCBsaXN0ICpsc3BfZW50cmllczsKKyAgc3RydWN0IGxpc3QgKnByZWZpeF9uZWlnaHM7CisgIHN0cnVjdCBsaXN0ICpsYW5fbmVpZ2hzOworICBzdHJ1Y3QgY2hlY2tzdW0gKmNoZWNrc3VtOworICBzdHJ1Y3QgbmxwaWRzICpubHBpZHM7CisgIHN0cnVjdCBsaXN0ICppcHY0X2FkZHJzOworICBzdHJ1Y3QgbGlzdCAqaXB2NF9pbnRfcmVhY2hzOworICBzdHJ1Y3QgbGlzdCAqaXB2NF9leHRfcmVhY2hzOworICBzdHJ1Y3QgbGlzdCAqdGVfaXB2NF9yZWFjaHM7CisgIHN0cnVjdCBob3N0bmFtZSAqaG9zdG5hbWU7CisgIHN0cnVjdCB0ZV9yb3V0ZXJfaWQgKnJvdXRlcl9pZDsKICNpZmRlZiBIQVZFX0lQVjYKLSAgc3RydWN0IGxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAqaXB2Nl9hZGRyczsKLSAgc3RydWN0IGxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICppcHY2X3JlYWNoczsKKyAgc3RydWN0IGxpc3QgKmlwdjZfYWRkcnM7CisgIHN0cnVjdCBsaXN0ICppcHY2X3JlYWNoczsKICNlbmRpZgotICBzdHJ1Y3QgaXNpc19wYXNzd2QgICAgICAgICAgICAgICAgICAgICAgYXV0aF9pbmZvOworICBzdHJ1Y3QgaXNpc19wYXNzd2QgYXV0aF9pbmZvOwogfTsKIAogLyoKQEAgLTI0MCwzMiArMjUzLDI5IEBACiAjZGVmaW5lIFRMVkZMQUdfQ0hFQ0tTVU0gICAgICAgICAgICAgICAgICAoMTw8MjApCiAjZGVmaW5lIFRMVkZMQUdfR1JBQ0VGVUxfUkVTVEFSVCAgICAgICAgICAoMTw8MjEpCiAKLXZvaWQgaW5pdF90bHZzICAoc3RydWN0IHRsdnMgKnRsdnMsIHVpbnQzMl90IGV4cGVjdGVkKTsKLXZvaWQgZnJlZV90bHZzICAoc3RydWN0IHRsdnMgKnRsdnMpOwotaW50ICBwYXJzZV90bHZzIChjaGFyICphcmVhdGFnLCB1X2NoYXIgKnN0cmVhbSwgaW50IHNpemUsIHVfaW50MzJfdCAqZXhwZWN0ZWQsIAotICAgICAgICAgICAgICAgICB1X2ludDMyX3QgKmZvdW5kLCBzdHJ1Y3QgdGx2cyAqdGx2cyk7Ci12b2lkIGZyZWVfdGx2ICAgKHZvaWQgKnZhbCk7Cit2b2lkIGluaXRfdGx2cyAoc3RydWN0IHRsdnMgKnRsdnMsIHVpbnQzMl90IGV4cGVjdGVkKTsKK3ZvaWQgZnJlZV90bHZzIChzdHJ1Y3QgdGx2cyAqdGx2cyk7CitpbnQgcGFyc2VfdGx2cyAoY2hhciAqYXJlYXRhZywgdV9jaGFyICogc3RyZWFtLCBpbnQgc2l6ZSwKKwkJdV9pbnQzMl90ICogZXhwZWN0ZWQsIHVfaW50MzJfdCAqIGZvdW5kLCBzdHJ1Y3QgdGx2cyAqdGx2cyk7Cit2b2lkIGZyZWVfdGx2ICh2b2lkICp2YWwpOwogCi1pbnQgdGx2X2FkZF9hcmVhX2FkZHJzICAgICAgIChzdHJ1Y3QgbGlzdCAqYXJlYV9hZGRycywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKTsKLWludCB0bHZfYWRkX2lzX25laWdocyAgICAgICAgKHN0cnVjdCBsaXN0ICppc19uZWlnaHMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSk7Ci1pbnQgdGx2X2FkZF9sYW5fbmVpZ2hzICAgICAgIChzdHJ1Y3QgbGlzdCAqbGFuX25laWdocywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKTsKLWludCB0bHZfYWRkX25scGlkICAgICAgICAgICAgKHN0cnVjdCBubHBpZHMgKm5scGlkcywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKTsKLWludCB0bHZfYWRkX2NoZWNrc3VtICAgICAgICAgKHN0cnVjdCBjaGVja3N1bSAqY2hlY2tzdW0sIAoraW50IHRsdl9hZGRfYXJlYV9hZGRycyAoc3RydWN0IGxpc3QgKmFyZWFfYWRkcnMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSk7CitpbnQgdGx2X2FkZF9pc19uZWlnaHMgKHN0cnVjdCBsaXN0ICppc19uZWlnaHMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSk7CitpbnQgdGx2X2FkZF9sYW5fbmVpZ2hzIChzdHJ1Y3QgbGlzdCAqbGFuX25laWdocywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKTsKK2ludCB0bHZfYWRkX25scGlkIChzdHJ1Y3QgbmxwaWRzICpubHBpZHMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSk7CitpbnQgdGx2X2FkZF9jaGVja3N1bSAoc3RydWN0IGNoZWNrc3VtICpjaGVja3N1bSwgc3RydWN0IHN0cmVhbSAqc3RyZWFtKTsKK2ludCB0bHZfYWRkX2F1dGhpbmZvIChjaGFyIGF1dGhfdHlwZSwgY2hhciBhdXRobGVuLCBjaGFyICphdXRoX3ZhbHVlLAorCQkgICAgICBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pOworaW50IHRsdl9hZGRfaXBfYWRkcnMgKHN0cnVjdCBsaXN0ICppcF9hZGRycywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKTsKK2ludCB0bHZfYWRkX2R5bmFtaWNfaG9zdG5hbWUgKHN0cnVjdCBob3N0bmFtZSAqaG9zdG5hbWUsCiAJCQkgICAgICBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pOwotaW50IHRsdl9hZGRfYXV0aGluZm8gICAgICAgICAoY2hhciBhdXRoX3R5cGUsIGNoYXIgYXV0aGxlbiwgY2hhciAqYXV0aF92YWx1ZSwKLQkJCSAgICAgIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSk7Ci1pbnQgdGx2X2FkZF9pcF9hZGRycyAgICAgICAgIChzdHJ1Y3QgbGlzdCAqaXBfYWRkcnMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSk7Ci1pbnQgdGx2X2FkZF9keW5hbWljX2hvc3RuYW1lIChzdHJ1Y3QgaG9zdG5hbWUgKmhvc3RuYW1lLHN0cnVjdCBzdHJlYW0gKnN0cmVhbSk7Ci1pbnQgdGx2X2FkZF9sc3BfZW50cmllcyAgICAgIChzdHJ1Y3QgbGlzdCAqbHNwcywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKTsKLWludCB0bHZfYWRkX2lwdjRfcmVhY2hzICAgICAgKHN0cnVjdCBsaXN0ICppcHY0X3JlYWNocywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKTsKK2ludCB0bHZfYWRkX2xzcF9lbnRyaWVzIChzdHJ1Y3QgbGlzdCAqbHNwcywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKTsKK2ludCB0bHZfYWRkX2lwdjRfcmVhY2hzIChzdHJ1Y3QgbGlzdCAqaXB2NF9yZWFjaHMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSk7CiAjaWZkZWYgSEFWRV9JUFY2Ci1pbnQgdGx2X2FkZF9pcHY2X2FkZHJzICAgICAgIChzdHJ1Y3QgbGlzdCAqaXB2Nl9hZGRycywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKTsKLWludCB0bHZfYWRkX2lwdjZfcmVhY2hzICAgICAgKHN0cnVjdCBsaXN0ICppcHY2X3JlYWNocywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKTsKK2ludCB0bHZfYWRkX2lwdjZfYWRkcnMgKHN0cnVjdCBsaXN0ICppcHY2X2FkZHJzLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pOworaW50IHRsdl9hZGRfaXB2Nl9yZWFjaHMgKHN0cnVjdCBsaXN0ICppcHY2X3JlYWNocywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKTsKICNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KIAotaW50IHRsdl9hZGRfcGFkZGluZyAgICAgICAgICAoc3RydWN0IHN0cmVhbSAqc3RyZWFtKTsKK2ludCB0bHZfYWRkX3BhZGRpbmcgKHN0cnVjdCBzdHJlYW0gKnN0cmVhbSk7CiAKICNlbmRpZiAvKiBfWkVCUkFfSVNJU19UTFZfSCAqLwotCi0KLQpkaWZmIC0tZ2l0IGEvaXNpc2QvaXNpc196ZWJyYS5jIGIvaXNpc2QvaXNpc196ZWJyYS5jCmluZGV4IDEzNmQyYjUuLmFkNWEwNTAgMTAwNjQ0Ci0tLSBhL2lzaXNkL2lzaXNfemVicmEuYworKysgYi9pc2lzZC9pc2lzX3plYnJhLmMKQEAgLTQ0LDIwICs0NCwyMCBAQAogCiBleHRlcm4gc3RydWN0IHRocmVhZF9tYXN0ZXIgKm1hc3RlcjsKIAotaW50IAoraW50CiBpc2lzX3plYnJhX2lmX2FkZCAoaW50IGNvbW1hbmQsIHN0cnVjdCB6Y2xpZW50ICp6Y2xpZW50LCB6ZWJyYV9zaXplX3QgbGVuZ3RoKQogewogICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CiAKICAgaWZwID0gemVicmFfaW50ZXJmYWNlX2FkZF9yZWFkICh6Y2xpZW50LT5pYnVmKTsKLSAgCisKIAogICB6bG9nX2luZm8gKCJaZWJyYSBJL0YgYWRkOiAlcyBpbmRleCAlZCBmbGFncyAlbGQgbWV0cmljICVkIG10dSAlZCIsCiAJICAgICBpZnAtPm5hbWUsIGlmcC0+aWZpbmRleCwgaWZwLT5mbGFncywgaWZwLT5tZXRyaWMsIGlmcC0+bXR1KTsKLSAgCisKICAgaWYgKGlmX2lzX3VwIChpZnApKQogICAgIGlzaXNfY3NtX3N0YXRlX2NoYW5nZSAoSUZfVVBfRlJPTV9aLCBjaXJjdWl0X3NjYW5fYnlfaWZwIChpZnApLCBpZnApOwotICAKKwogICByZXR1cm4gMDsKIH0KIApAQCAtNjksMTkgKzY5LDE5IEBACiAKICAgcyA9IHpjbGllbnQtPmlidWY7CiAgIGlmcCA9IHplYnJhX2ludGVyZmFjZV9zdGF0ZV9yZWFkIChzKTsKLSAgCisKICAgaWYgKCFpZnApCiAgICAgcmV0dXJuIDA7CiAKICAgaWYgKGlmX2lzX3VwIChpZnApKQogICAgIHpsb2dfd2FybiAoIlplYnJhOiBnb3QgZGVsZXRlIG9mICVzLCBidXQgaW50ZXJmYWNlIGlzIHN0aWxsIHVwIiwKLSAgICAgICAgICAgICAgIGlmcC0+bmFtZSk7CisJICAgICAgIGlmcC0+bmFtZSk7CiAKICAgemxvZ19pbmZvICgiWmVicmEgSS9GIGRlbGV0ZTogJXMgaW5kZXggJWQgZmxhZ3MgJWxkIG1ldHJpYyAlZCBtdHUgJWQiLAogCSAgICAgaWZwLT5uYW1lLCBpZnAtPmlmaW5kZXgsIGlmcC0+ZmxhZ3MsIGlmcC0+bWV0cmljLCBpZnAtPm10dSk7CiAKICAgaWZfZGVsZXRlIChpZnApOwotICAKKwogICBpc2lzX2NzbV9zdGF0ZV9jaGFuZ2UgKElGX0RPV05fRlJPTV9aLCBjaXJjdWl0X3NjYW5fYnlfaWZwIChpZnApLCBpZnApOwogCiAgIHJldHVybiAwOwpAQCAtMTIwLDEwMyArMTIwLDEwNCBAQAogfQogCiBpbnQKLWlzaXNfemVicmFfaWZfc3RhdGVfdXAgKGludCBjb21tYW5kLCBzdHJ1Y3QgemNsaWVudCAqemNsaWVudCwgCitpc2lzX3plYnJhX2lmX3N0YXRlX3VwIChpbnQgY29tbWFuZCwgc3RydWN0IHpjbGllbnQgKnpjbGllbnQsCiAJCQl6ZWJyYV9zaXplX3QgbGVuZ3RoKQogewogICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7Ci0gIAorCiAgIGlmcCA9IHplYnJhX2ludGVyZmFjZV9pZl9sb29rdXAgKHpjbGllbnQtPmlidWYpOwotICAgIAorCiAgIGlmICghaWZwKQogICAgIHJldHVybiAwOwotICAKLSAgaWYgKGlmX2lzX3VwIChpZnApKSB7Ci0gICAgemVicmFfaW50ZXJmYWNlX2lmX3NldF92YWx1ZSAoemNsaWVudC0+aWJ1ZiwgaWZwKTsKLSAgICBpc2lzX2NpcmN1aXRfdXBkYXRlX3BhcmFtcyAoY2lyY3VpdF9zY2FuX2J5X2lmcCAoaWZwKSwgaWZwKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICAKKworICBpZiAoaWZfaXNfdXAgKGlmcCkpCisgICAgeworICAgICAgemVicmFfaW50ZXJmYWNlX2lmX3NldF92YWx1ZSAoemNsaWVudC0+aWJ1ZiwgaWZwKTsKKyAgICAgIGlzaXNfY2lyY3VpdF91cGRhdGVfcGFyYW1zIChjaXJjdWl0X3NjYW5fYnlfaWZwIChpZnApLCBpZnApOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCiAgIHplYnJhX2ludGVyZmFjZV9pZl9zZXRfdmFsdWUgKHpjbGllbnQtPmlidWYsIGlmcCk7CiAgIGlzaXNfY3NtX3N0YXRlX2NoYW5nZSAoSUZfVVBfRlJPTV9aLCBjaXJjdWl0X3NjYW5fYnlfaWZwIChpZnApLCBpZnApOwotICAKKwogICByZXR1cm4gMDsKIH0KIAotCiBpbnQKLWlzaXNfemVicmFfaWZfc3RhdGVfZG93biAoaW50IGNvbW1hbmQsIHN0cnVjdCB6Y2xpZW50ICp6Y2xpZW50LCAKK2lzaXNfemVicmFfaWZfc3RhdGVfZG93biAoaW50IGNvbW1hbmQsIHN0cnVjdCB6Y2xpZW50ICp6Y2xpZW50LAogCQkJICB6ZWJyYV9zaXplX3QgbGVuZ3RoKQogewogICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7Ci0gIAorCiAgIGlmcCA9IHplYnJhX2ludGVyZmFjZV9pZl9sb29rdXAgKHpjbGllbnQtPmlidWYpOwotICAKKwogICBpZiAoaWZwID09IE5VTEwpCiAgICAgcmV0dXJuIDA7Ci0gIAotICBpZiAoaWZfaXNfdXAgKGlmcCkpIHsKLSAgICB6ZWJyYV9pbnRlcmZhY2VfaWZfc2V0X3ZhbHVlICh6Y2xpZW50LT5pYnVmLCBpZnApOwotICAgIGlzaXNfY3NtX3N0YXRlX2NoYW5nZSAoSUZfRE9XTl9GUk9NX1osIGNpcmN1aXRfc2Nhbl9ieV9pZnAgKGlmcCksIGlmcCk7Ci0gIH0KLSAgCisKKyAgaWYgKGlmX2lzX3VwIChpZnApKQorICAgIHsKKyAgICAgIHplYnJhX2ludGVyZmFjZV9pZl9zZXRfdmFsdWUgKHpjbGllbnQtPmlidWYsIGlmcCk7CisgICAgICBpc2lzX2NzbV9zdGF0ZV9jaGFuZ2UgKElGX0RPV05fRlJPTV9aLCBjaXJjdWl0X3NjYW5fYnlfaWZwIChpZnApLCBpZnApOworICAgIH0KKwogICByZXR1cm4gMDsKIH0KIAogaW50Ci1pc2lzX3plYnJhX2lmX2FkZHJlc3NfYWRkIChpbnQgY29tbWFuZCwgc3RydWN0IHpjbGllbnQgKnpjbGllbnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgemVicmFfc2l6ZV90IGxlbmd0aCkKK2lzaXNfemVicmFfaWZfYWRkcmVzc19hZGQgKGludCBjb21tYW5kLCBzdHJ1Y3QgemNsaWVudCAqemNsaWVudCwKKwkJCSAgIHplYnJhX3NpemVfdCBsZW5ndGgpCiB7CiAgIHN0cnVjdCBjb25uZWN0ZWQgKmM7CiAgIHN0cnVjdCBwcmVmaXggKnA7CiAgIHVfY2hhciBidWZbQlVGU0laXTsKIAotICBjID0gemVicmFfaW50ZXJmYWNlX2FkZHJlc3NfcmVhZCAoWkVCUkFfSU5URVJGQUNFX0FERFJFU1NfQURELCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpjbGllbnQtPmlidWYpOwotICAKKyAgYyA9IHplYnJhX2ludGVyZmFjZV9hZGRyZXNzX3JlYWQgKFpFQlJBX0lOVEVSRkFDRV9BRERSRVNTX0FERCwKKwkJCQkgICAgemNsaWVudC0+aWJ1Zik7CisKICAgaWYgKGMgPT0gTlVMTCkKICAgICByZXR1cm4gMDsKLSAgCisKICAgcCA9IGMtPmFkZHJlc3M7Ci0gIAorCiAgIHByZWZpeDJzdHIgKHAsIGJ1ZiwgQlVGU0laKTsKICNpZmRlZiBFWFRSRU1FX0RFQlVHCi0gIGlmIChwLT5mYW1pbHkgPT0gQUZfSU5FVCkgCisgIGlmIChwLT5mYW1pbHkgPT0gQUZfSU5FVCkKICAgICB6bG9nX2luZm8gKCJjb25uZWN0ZWQgSVAgYWRkcmVzcyAlcyIsIGJ1Zik7CiAjaWZkZWYgSEFWRV9JUFY2CiAgIGlmIChwLT5mYW1pbHkgPT0gQUZfSU5FVDYpCiAgICAgemxvZ19pbmZvICgiY29ubmVjdGVkIElQdjYgYWRkcmVzcyAlcyIsIGJ1Zik7CiAjZW5kaWYgLyogSEFWRV9JUFY2ICovCiAjZW5kaWYgLyogRVhUUkVNRV9ERUJVRyAqLwotICBpc2lzX2NpcmN1aXRfYWRkX2FkZHIgKGNpcmN1aXRfc2Nhbl9ieV9pZnAgKGMtPmlmcCksICBjKTsKKyAgaXNpc19jaXJjdWl0X2FkZF9hZGRyIChjaXJjdWl0X3NjYW5fYnlfaWZwIChjLT5pZnApLCBjKTsKIAogICByZXR1cm4gMDsKIH0KIAogaW50Ci1pc2lzX3plYnJhX2lmX2FkZHJlc3NfZGVsIChpbnQgY29tbWFuZCwgc3RydWN0IHpjbGllbnQgKmNsaWVudCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB6ZWJyYV9zaXplX3QgbGVuZ3RoKQoraXNpc196ZWJyYV9pZl9hZGRyZXNzX2RlbCAoaW50IGNvbW1hbmQsIHN0cnVjdCB6Y2xpZW50ICpjbGllbnQsCisJCQkgICB6ZWJyYV9zaXplX3QgbGVuZ3RoKQogewogICBzdHJ1Y3QgY29ubmVjdGVkICpjOwogICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CiAKLSAgYyA9IHplYnJhX2ludGVyZmFjZV9hZGRyZXNzX3JlYWQgKFpFQlJBX0lOVEVSRkFDRV9BRERSRVNTX0RFTEVURSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6Y2xpZW50LT5pYnVmKTsKLSAgCisgIGMgPSB6ZWJyYV9pbnRlcmZhY2VfYWRkcmVzc19yZWFkIChaRUJSQV9JTlRFUkZBQ0VfQUREUkVTU19ERUxFVEUsCisJCQkJICAgIHpjbGllbnQtPmlidWYpOworCiAgIGlmIChjID09IE5VTEwpCiAgICAgcmV0dXJuIDA7Ci0gIAorCiAgIGlmcCA9IGMtPmlmcDsKLSAgCisKICAgY29ubmVjdGVkX2ZyZWUgKGMpOwotICAKKwogICBpc2lzX2NpcmN1aXRfZGVsX2FkZHIgKGNpcmN1aXRfc2Nhbl9ieV9pZnAgKGlmcCksIGMpOwotICAKKwogICByZXR1cm4gMDsKIH0KIAogdm9pZAotaXNpc196ZWJyYV9yb3V0ZV9hZGRfaXB2NCAoc3RydWN0IHByZWZpeCAqcHJlZml4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpc2lzX3JvdXRlX2luZm8gKnJvdXRlX2luZm8pCitpc2lzX3plYnJhX3JvdXRlX2FkZF9pcHY0IChzdHJ1Y3QgcHJlZml4ICpwcmVmaXgsCisJCQkgICBzdHJ1Y3QgaXNpc19yb3V0ZV9pbmZvICpyb3V0ZV9pbmZvKQogewogICB1X2NoYXIgbWVzc2FnZSwgZmxhZ3M7CiAgIGludCBwc2l6ZTsKQEAgLTIyNyw4MyArMjI4LDg5IEBACiAgIGlmIChDSEVDS19GTEFHIChyb3V0ZV9pbmZvLT5mbGFnLCBJU0lTX1JPVVRFX0ZMQUdfWkVCUkFfU1lOQykpCiAgICAgcmV0dXJuOwogCi0gIGlmICh6Y2xpZW50LT5yZWRpc3RbWkVCUkFfUk9VVEVfSVNJU10pIHsKLSAgICBtZXNzYWdlID0gMDsKLSAgICBmbGFncyA9IDA7Ci0gICAgCi0gICAgU0VUX0ZMQUcgKG1lc3NhZ2UsIFpBUElfTUVTU0FHRV9ORVhUSE9QKTsKLSAgICBTRVRfRkxBRyAobWVzc2FnZSwgWkFQSV9NRVNTQUdFX01FVFJJQyk7Ci0jaWYgMAotICAgIFNFVF9GTEFHIChtZXNzYWdlLCBaQVBJX01FU1NBR0VfRElTVEFOQ0UpOwotI2VuZGlmCi0gICAgCi0gICAgc3RyZWFtID0gemNsaWVudC0+b2J1ZjsKLSAgICBzdHJlYW1fcmVzZXQgKHN0cmVhbSk7Ci0gICAgLyogTGVuZ3RoIHBsYWNlIGhvbGRlci4gKi8KLSAgICBzdHJlYW1fcHV0dyAoc3RyZWFtLCAwKTsKLSAgICAvKiBjb21tYW5kICovCi0gICAgc3RyZWFtX3B1dGMgKHN0cmVhbSwgWkVCUkFfSVBWNF9ST1VURV9BREQpOwotICAgIC8qIHR5cGUgKi8KLSAgICBzdHJlYW1fcHV0YyAoc3RyZWFtLCBaRUJSQV9ST1VURV9JU0lTKTsKLSAgICAvKiBmbGFncyAqLwotICAgIHN0cmVhbV9wdXRjIChzdHJlYW0sIGZsYWdzKTsKLSAgICAvKiBtZXNzYWdlICovCi0gICAgc3RyZWFtX3B1dGMgKHN0cmVhbSwgbWVzc2FnZSk7Ci0gICAgLyogcHJlZml4IGluZm9ybWF0aW9uICovCi0gICAgcHNpemUgPSBQU0laRSAocHJlZml4LT5wcmVmaXhsZW4pOwotICAgIHN0cmVhbV9wdXRjIChzdHJlYW0sIHByZWZpeC0+cHJlZml4bGVuKTsKLSAgICBzdHJlYW1fd3JpdGUgKHN0cmVhbSwgKHVfY2hhciAqKSZwcmVmaXgtPnUucHJlZml4NCwgcHNpemUpOyAgICAgIAorICBpZiAoemNsaWVudC0+cmVkaXN0W1pFQlJBX1JPVVRFX0lTSVNdKQorICAgIHsKKyAgICAgIG1lc3NhZ2UgPSAwOworICAgICAgZmxhZ3MgPSAwOwogCi0gICAgc3RyZWFtX3B1dGMgKHN0cmVhbSwgbGlzdGNvdW50IChyb3V0ZV9pbmZvLT5uZXh0aG9wcykpOwotICAgIAotICAgIC8qIE5leHRob3AsIGlmaW5kZXgsIGRpc3RhbmNlIGFuZCBtZXRyaWMgaW5mb3JtYXRpb24gKi8KLSAgICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAocm91dGVfaW5mby0+bmV4dGhvcHMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICAgIG5leHRob3AgPSBnZXRkYXRhIChub2RlKTsKLSAgICAgIC8qIEZJWE1FOiBjYW4gaXQgYmUgPyAqLwotICAgICAgaWYgKG5leHRob3AtPmlwLnNfYWRkciAhPSBJTkFERFJfQU5ZKSB7Ci0gICAgICAgIHN0cmVhbV9wdXRjIChzdHJlYW0sIFpFQlJBX05FWFRIT1BfSVBWNCk7Ci0gICAgICAgIHN0cmVhbV9wdXRfaW5fYWRkciAoc3RyZWFtLCAmbmV4dGhvcC0+aXApOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RyZWFtX3B1dGMgKHN0cmVhbSwgWkVCUkFfTkVYVEhPUF9JRklOREVYKTsKLSAgICAgICAgc3RyZWFtX3B1dGwgKHN0cmVhbSwgbmV4dGhvcC0+aWZpbmRleCk7Ci0gICAgICB9Ci0gICAgfQorICAgICAgU0VUX0ZMQUcgKG1lc3NhZ2UsIFpBUElfTUVTU0FHRV9ORVhUSE9QKTsKKyAgICAgIFNFVF9GTEFHIChtZXNzYWdlLCBaQVBJX01FU1NBR0VfTUVUUklDKTsKICNpZiAwCi0gICAgaWYgKENIRUNLX0ZMQUcgKG1lc3NhZ2UsIFpBUElfTUVTU0FHRV9ESVNUQU5DRSkpCi0gICAgICBzdHJlYW1fcHV0YyAoc3RyZWFtLCByb3V0ZV9pbmZvLT5kZXB0aCk7CisgICAgICBTRVRfRkxBRyAobWVzc2FnZSwgWkFQSV9NRVNTQUdFX0RJU1RBTkNFKTsKICNlbmRpZgotICAgIGlmIChDSEVDS19GTEFHIChtZXNzYWdlLCBaQVBJX01FU1NBR0VfTUVUUklDKSkKLSAgICAgIHN0cmVhbV9wdXRsIChzdHJlYW0sIHJvdXRlX2luZm8tPmNvc3QpOwotICAgIAotICAgIHN0cmVhbV9wdXR3X2F0IChzdHJlYW0sIDAsIHN0cmVhbV9nZXRfZW5kcCAoc3RyZWFtKSk7Ci0gICAgd3JpdGVuICh6Y2xpZW50LT5zb2NrLCBzdHJlYW0tPmRhdGEsIHN0cmVhbV9nZXRfZW5kcCAoc3RyZWFtKSk7Ci0gIH0KKworICAgICAgc3RyZWFtID0gemNsaWVudC0+b2J1ZjsKKyAgICAgIHN0cmVhbV9yZXNldCAoc3RyZWFtKTsKKyAgICAgIC8qIExlbmd0aCBwbGFjZSBob2xkZXIuICovCisgICAgICBzdHJlYW1fcHV0dyAoc3RyZWFtLCAwKTsKKyAgICAgIC8qIGNvbW1hbmQgKi8KKyAgICAgIHN0cmVhbV9wdXRjIChzdHJlYW0sIFpFQlJBX0lQVjRfUk9VVEVfQUREKTsKKyAgICAgIC8qIHR5cGUgKi8KKyAgICAgIHN0cmVhbV9wdXRjIChzdHJlYW0sIFpFQlJBX1JPVVRFX0lTSVMpOworICAgICAgLyogZmxhZ3MgKi8KKyAgICAgIHN0cmVhbV9wdXRjIChzdHJlYW0sIGZsYWdzKTsKKyAgICAgIC8qIG1lc3NhZ2UgKi8KKyAgICAgIHN0cmVhbV9wdXRjIChzdHJlYW0sIG1lc3NhZ2UpOworICAgICAgLyogcHJlZml4IGluZm9ybWF0aW9uICovCisgICAgICBwc2l6ZSA9IFBTSVpFIChwcmVmaXgtPnByZWZpeGxlbik7CisgICAgICBzdHJlYW1fcHV0YyAoc3RyZWFtLCBwcmVmaXgtPnByZWZpeGxlbik7CisgICAgICBzdHJlYW1fd3JpdGUgKHN0cmVhbSwgKHVfY2hhciAqKSAmIHByZWZpeC0+dS5wcmVmaXg0LCBwc2l6ZSk7CisKKyAgICAgIHN0cmVhbV9wdXRjIChzdHJlYW0sIGxpc3Rjb3VudCAocm91dGVfaW5mby0+bmV4dGhvcHMpKTsKKworICAgICAgLyogTmV4dGhvcCwgaWZpbmRleCwgZGlzdGFuY2UgYW5kIG1ldHJpYyBpbmZvcm1hdGlvbiAqLworICAgICAgZm9yIChub2RlID0gbGlzdGhlYWQgKHJvdXRlX2luZm8tPm5leHRob3BzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKQorCXsKKwkgIG5leHRob3AgPSBnZXRkYXRhIChub2RlKTsKKwkgIC8qIEZJWE1FOiBjYW4gaXQgYmUgPyAqLworCSAgaWYgKG5leHRob3AtPmlwLnNfYWRkciAhPSBJTkFERFJfQU5ZKQorCSAgICB7CisJICAgICAgc3RyZWFtX3B1dGMgKHN0cmVhbSwgWkVCUkFfTkVYVEhPUF9JUFY0KTsKKwkgICAgICBzdHJlYW1fcHV0X2luX2FkZHIgKHN0cmVhbSwgJm5leHRob3AtPmlwKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgc3RyZWFtX3B1dGMgKHN0cmVhbSwgWkVCUkFfTkVYVEhPUF9JRklOREVYKTsKKwkgICAgICBzdHJlYW1fcHV0bCAoc3RyZWFtLCBuZXh0aG9wLT5pZmluZGV4KTsKKwkgICAgfQorCX0KKyNpZiAwCisgICAgICBpZiAoQ0hFQ0tfRkxBRyAobWVzc2FnZSwgWkFQSV9NRVNTQUdFX0RJU1RBTkNFKSkKKwlzdHJlYW1fcHV0YyAoc3RyZWFtLCByb3V0ZV9pbmZvLT5kZXB0aCk7CisjZW5kaWYKKyAgICAgIGlmIChDSEVDS19GTEFHIChtZXNzYWdlLCBaQVBJX01FU1NBR0VfTUVUUklDKSkKKwlzdHJlYW1fcHV0bCAoc3RyZWFtLCByb3V0ZV9pbmZvLT5jb3N0KTsKKworICAgICAgc3RyZWFtX3B1dHdfYXQgKHN0cmVhbSwgMCwgc3RyZWFtX2dldF9lbmRwIChzdHJlYW0pKTsKKyAgICAgIHdyaXRlbiAoemNsaWVudC0+c29jaywgc3RyZWFtLT5kYXRhLCBzdHJlYW1fZ2V0X2VuZHAgKHN0cmVhbSkpOworICAgIH0KIH0KIAogdm9pZAotaXNpc196ZWJyYV9yb3V0ZV9kZWxfaXB2NCAoc3RydWN0IHByZWZpeCAqcHJlZml4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpc2lzX3JvdXRlX2luZm8gKnJvdXRlX2luZm8pCitpc2lzX3plYnJhX3JvdXRlX2RlbF9pcHY0IChzdHJ1Y3QgcHJlZml4ICpwcmVmaXgsCisJCQkgICBzdHJ1Y3QgaXNpc19yb3V0ZV9pbmZvICpyb3V0ZV9pbmZvKQogewogICBzdHJ1Y3QgemFwaV9pcHY0IGFwaTsKICAgc3RydWN0IHByZWZpeF9pcHY0IHByZWZpeDQ7Ci0gIAotICBpZiAoemNsaWVudC0+cmVkaXN0W1pFQlJBX1JPVVRFX0lTSVNdKSB7Ci0gICAgYXBpLnR5cGUgPSBaRUJSQV9ST1VURV9JU0lTOwotICAgIGFwaS5mbGFncyA9IDA7Ci0gICAgYXBpLm1lc3NhZ2UgPSAwOwotICAgIHByZWZpeDQuZmFtaWx5ID0gQUZfSU5FVDsKLSAgICBwcmVmaXg0LnByZWZpeGxlbiA9IHByZWZpeC0+cHJlZml4bGVuOwotICAgIHByZWZpeDQucHJlZml4ID0gcHJlZml4LT51LnByZWZpeDQ7Ci0gICAgemFwaV9pcHY0X3JvdXRlIChaRUJSQV9JUFY0X1JPVVRFX0RFTEVURSwgemNsaWVudCwgJnByZWZpeDQsICZhcGkpOwotICB9Ci0gIAorCisgIGlmICh6Y2xpZW50LT5yZWRpc3RbWkVCUkFfUk9VVEVfSVNJU10pCisgICAgeworICAgICAgYXBpLnR5cGUgPSBaRUJSQV9ST1VURV9JU0lTOworICAgICAgYXBpLmZsYWdzID0gMDsKKyAgICAgIGFwaS5tZXNzYWdlID0gMDsKKyAgICAgIHByZWZpeDQuZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgIHByZWZpeDQucHJlZml4bGVuID0gcHJlZml4LT5wcmVmaXhsZW47CisgICAgICBwcmVmaXg0LnByZWZpeCA9IHByZWZpeC0+dS5wcmVmaXg0OworICAgICAgemFwaV9pcHY0X3JvdXRlIChaRUJSQV9JUFY0X1JPVVRFX0RFTEVURSwgemNsaWVudCwgJnByZWZpeDQsICZhcGkpOworICAgIH0KKwogICByZXR1cm47CiB9CiAKICNpZmRlZiBIQVZFX0lQVjYKIHZvaWQKIGlzaXNfemVicmFfcm91dGVfYWRkX2lwdjYgKHN0cnVjdCBwcmVmaXggKnByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpc2lzX3JvdXRlX2luZm8gKnJvdXRlX2luZm8pCisJCQkgICBzdHJ1Y3QgaXNpc19yb3V0ZV9pbmZvICpyb3V0ZV9pbmZvKQogewogICBzdHJ1Y3QgemFwaV9pcHY2IGFwaTsKICAgc3RydWN0IGluNl9hZGRyICoqbmV4dGhvcF9saXN0OwpAQCAtMzE1LDcgKzMyMiw3IEBACiAKICAgaWYgKENIRUNLX0ZMQUcgKHJvdXRlX2luZm8tPmZsYWcsIElTSVNfUk9VVEVfRkxBR19aRUJSQV9TWU5DKSkKICAgICByZXR1cm47Ci0gIAorCiAgIGFwaS50eXBlID0gWkVCUkFfUk9VVEVfSVNJUzsKICAgYXBpLmZsYWdzID0gMDsKICAgYXBpLm1lc3NhZ2UgPSAwOwpAQCAtMzI5LDYxICszMzYsNjYgQEAKICNlbmRpZgogICBhcGkubmV4dGhvcF9udW0gPSBsaXN0Y291bnQgKHJvdXRlX2luZm8tPm5leHRob3BzNik7CiAgIGFwaS5pZmluZGV4X251bSA9IGxpc3Rjb3VudCAocm91dGVfaW5mby0+bmV4dGhvcHM2KTsKLSAgCisKICAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBuZXh0aG9wX2xpc3QgKi8KICAgc2l6ZSA9IHNpemVvZiAoc3RydWN0IGlzaXNfbmV4dGhvcDYgKikgKiBsaXN0Y291bnQgKHJvdXRlX2luZm8tPm5leHRob3BzNik7CiAgIG5leHRob3BfbGlzdCA9IChzdHJ1Y3QgaW42X2FkZHIgKiopIFhNQUxMT0MgKE1UWVBFX0lTSVNfVE1QLCBzaXplKTsKLSAgaWYgKCFuZXh0aG9wX2xpc3QpIHsKLSAgICB6bG9nX2VyciAoImlzaXNfemVicmFfYWRkX3JvdXRlX2lwdjY6IG91dCBvZiBtZW1vcnkhIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIAorICBpZiAoIW5leHRob3BfbGlzdCkKKyAgICB7CisgICAgICB6bG9nX2VyciAoImlzaXNfemVicmFfYWRkX3JvdXRlX2lwdjY6IG91dCBvZiBtZW1vcnkhIik7CisgICAgICByZXR1cm47CisgICAgfQorCiAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgaWZpbmRleF9saXN0ICovCiAgIHNpemUgPSBzaXplb2YgKHVuc2lnbmVkIGludCkgKiBsaXN0Y291bnQgKHJvdXRlX2luZm8tPm5leHRob3BzNik7CiAgIGlmaW5kZXhfbGlzdCA9ICh1bnNpZ25lZCBpbnQgKikgWE1BTExPQyAoTVRZUEVfSVNJU19UTVAsIHNpemUpOwotICBpZiAoIWlmaW5kZXhfbGlzdCkgewotICAgIHpsb2dfZXJyICgiaXNpc196ZWJyYV9hZGRfcm91dGVfaXB2Njogb3V0IG9mIG1lbW9yeSEiKTsKLSAgICBYRlJFRSAoTVRZUEVfSVNJU19UTVAsIG5leHRob3BfbGlzdCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIAorICBpZiAoIWlmaW5kZXhfbGlzdCkKKyAgICB7CisgICAgICB6bG9nX2VyciAoImlzaXNfemVicmFfYWRkX3JvdXRlX2lwdjY6IG91dCBvZiBtZW1vcnkhIik7CisgICAgICBYRlJFRSAoTVRZUEVfSVNJU19UTVAsIG5leHRob3BfbGlzdCk7CisgICAgICByZXR1cm47CisgICAgfQorCiAgIC8qIGZvciBlYWNoIG5leHRob3AgKi8KICAgaSA9IDA7Ci0gIGZvciAobm9kZSA9IGxpc3RoZWFkIChyb3V0ZV9pbmZvLT5uZXh0aG9wczYpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICBuZXh0aG9wNiA9IGdldGRhdGEgKG5vZGUpOwotICAgIAotICAgIGlmICghSU42X0lTX0FERFJfTElOS0xPQ0FMICgmbmV4dGhvcDYtPmlwNikgJiYKLSAgICAgICAgIUlONl9JU19BRERSX1VOU1BFQ0lGSUVEICgmbmV4dGhvcDYtPmlwNikpIHsKLSAgICAgIGFwaS5uZXh0aG9wX251bS0tOwotICAgICAgYXBpLmlmaW5kZXhfbnVtLS07Ci0gICAgICBjb250aW51ZTsKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKHJvdXRlX2luZm8tPm5leHRob3BzNik7IG5vZGU7IG5leHRub2RlIChub2RlKSkKKyAgICB7CisgICAgICBuZXh0aG9wNiA9IGdldGRhdGEgKG5vZGUpOworCisgICAgICBpZiAoIUlONl9JU19BRERSX0xJTktMT0NBTCAoJm5leHRob3A2LT5pcDYpICYmCisJICAhSU42X0lTX0FERFJfVU5TUEVDSUZJRUQgKCZuZXh0aG9wNi0+aXA2KSkKKwl7CisJICBhcGkubmV4dGhvcF9udW0tLTsKKwkgIGFwaS5pZmluZGV4X251bS0tOworCSAgY29udGludWU7CisJfQorCisgICAgICBuZXh0aG9wX2xpc3RbaV0gPSAmbmV4dGhvcDYtPmlwNjsKKyAgICAgIGlmaW5kZXhfbGlzdFtpXSA9IG5leHRob3A2LT5pZmluZGV4OworICAgICAgaSsrOwogICAgIH0KLSAgICAKLSAgICBuZXh0aG9wX2xpc3RbaV0gPSAmbmV4dGhvcDYtPmlwNjsKLSAgICBpZmluZGV4X2xpc3RbaV0gPSBuZXh0aG9wNi0+aWZpbmRleDsKLSAgICBpKys7Ci0gIH0KLSAgCisKICAgYXBpLm5leHRob3AgPSBuZXh0aG9wX2xpc3Q7CiAgIGFwaS5pZmluZGV4ID0gaWZpbmRleF9saXN0OwotICAKLSAgaWYgKGFwaS5uZXh0aG9wX251bSAmJiBhcGkuaWZpbmRleF9udW0pIHsKLSAgICBwcmVmaXg2LmZhbWlseSA9IEFGX0lORVQ2OwotICAgIHByZWZpeDYucHJlZml4bGVuID0gcHJlZml4LT5wcmVmaXhsZW47Ci0gICAgbWVtY3B5ICgmcHJlZml4Ni5wcmVmaXgsICZwcmVmaXgtPnUucHJlZml4Niwgc2l6ZW9mIChzdHJ1Y3QgaW42X2FkZHIpKTsKLSAgICB6YXBpX2lwdjZfcm91dGUgKFpFQlJBX0lQVjZfUk9VVEVfQURELCB6Y2xpZW50LCAmcHJlZml4NiwgJmFwaSk7Ci0gICAgU0VUX0ZMQUcgKHJvdXRlX2luZm8tPmZsYWcsIElTSVNfUk9VVEVfRkxBR19aRUJSQV9TWU5DKTsKLSAgfQotICAKKworICBpZiAoYXBpLm5leHRob3BfbnVtICYmIGFwaS5pZmluZGV4X251bSkKKyAgICB7CisgICAgICBwcmVmaXg2LmZhbWlseSA9IEFGX0lORVQ2OworICAgICAgcHJlZml4Ni5wcmVmaXhsZW4gPSBwcmVmaXgtPnByZWZpeGxlbjsKKyAgICAgIG1lbWNweSAoJnByZWZpeDYucHJlZml4LCAmcHJlZml4LT51LnByZWZpeDYsIHNpemVvZiAoc3RydWN0IGluNl9hZGRyKSk7CisgICAgICB6YXBpX2lwdjZfcm91dGUgKFpFQlJBX0lQVjZfUk9VVEVfQURELCB6Y2xpZW50LCAmcHJlZml4NiwgJmFwaSk7CisgICAgICBTRVRfRkxBRyAocm91dGVfaW5mby0+ZmxhZywgSVNJU19ST1VURV9GTEFHX1pFQlJBX1NZTkMpOworICAgIH0KKwogICBYRlJFRSAoTVRZUEVfSVNJU19UTVAsIG5leHRob3BfbGlzdCk7CiAgIFhGUkVFIChNVFlQRV9JU0lTX1RNUCwgaWZpbmRleF9saXN0KTsKLSAgCisKICAgcmV0dXJuOwogfQogCiB2b2lkCi1pc2lzX3plYnJhX3JvdXRlX2RlbF9pcHY2IChzdHJ1Y3QgcHJlZml4ICpwcmVmaXgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlzaXNfcm91dGVfaW5mbyAqcm91dGVfaW5mbykKK2lzaXNfemVicmFfcm91dGVfZGVsX2lwdjYgKHN0cnVjdCBwcmVmaXggKnByZWZpeCwKKwkJCSAgIHN0cnVjdCBpc2lzX3JvdXRlX2luZm8gKnJvdXRlX2luZm8pCiB7CiAgIHN0cnVjdCB6YXBpX2lwdjYgYXBpOwogICBzdHJ1Y3QgaW42X2FkZHIgKipuZXh0aG9wX2xpc3Q7CkBAIC0zOTUsNyArNDA3LDcgQEAKIAogICBpZiAoQ0hFQ0tfRkxBRyAocm91dGVfaW5mby0+ZmxhZywgSVNJU19ST1VURV9GTEFHX1pFQlJBX1NZTkMpKQogICAgIHJldHVybjsKLSAgCisKICAgYXBpLnR5cGUgPSBaRUJSQV9ST1VURV9JU0lTOwogICBhcGkuZmxhZ3MgPSAwOwogICBhcGkubWVzc2FnZSA9IDA7CkBAIC00MDMsNjQgKzQxNSw2NiBAQAogICBTRVRfRkxBRyAoYXBpLm1lc3NhZ2UsIFpBUElfTUVTU0FHRV9JRklOREVYKTsKICAgYXBpLm5leHRob3BfbnVtID0gbGlzdGNvdW50IChyb3V0ZV9pbmZvLT5uZXh0aG9wczYpOwogICBhcGkuaWZpbmRleF9udW0gPSBsaXN0Y291bnQgKHJvdXRlX2luZm8tPm5leHRob3BzNik7Ci0gIAorCiAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgbmV4dGhvcF9saXN0ICovCiAgIHNpemUgPSBzaXplb2YgKHN0cnVjdCBpc2lzX25leHRob3A2ICopICogbGlzdGNvdW50IChyb3V0ZV9pbmZvLT5uZXh0aG9wczYpOwogICBuZXh0aG9wX2xpc3QgPSAoc3RydWN0IGluNl9hZGRyICoqKSBYTUFMTE9DIChNVFlQRV9JU0lTX1RNUCwgc2l6ZSk7Ci0gIGlmICghbmV4dGhvcF9saXN0KSB7Ci0gICAgemxvZ19lcnIgKCJpc2lzX3plYnJhX3JvdXRlX2RlbF9pcHY2OiBvdXQgb2YgbWVtb3J5ISIpOwotICAgIHJldHVybjsKLSAgfQotICAKKyAgaWYgKCFuZXh0aG9wX2xpc3QpCisgICAgeworICAgICAgemxvZ19lcnIgKCJpc2lzX3plYnJhX3JvdXRlX2RlbF9pcHY2OiBvdXQgb2YgbWVtb3J5ISIpOworICAgICAgcmV0dXJuOworICAgIH0KKwogICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIGlmaW5kZXhfbGlzdCAqLwogICBzaXplID0gc2l6ZW9mICh1bnNpZ25lZCBpbnQpICogbGlzdGNvdW50IChyb3V0ZV9pbmZvLT5uZXh0aG9wczYpOwogICBpZmluZGV4X2xpc3QgPSAodW5zaWduZWQgaW50ICopIFhNQUxMT0MgKE1UWVBFX0lTSVNfVE1QLCBzaXplKTsKLSAgaWYgKCFpZmluZGV4X2xpc3QpIHsKLSAgICB6bG9nX2VyciAoImlzaXNfemVicmFfcm91dGVfZGVsX2lwdjY6IG91dCBvZiBtZW1vcnkhIik7Ci0gICAgWEZSRUUgKE1UWVBFX0lTSVNfVE1QLCBuZXh0aG9wX2xpc3QpOwotICAgIHJldHVybjsKLSAgfQotICAKKyAgaWYgKCFpZmluZGV4X2xpc3QpCisgICAgeworICAgICAgemxvZ19lcnIgKCJpc2lzX3plYnJhX3JvdXRlX2RlbF9pcHY2OiBvdXQgb2YgbWVtb3J5ISIpOworICAgICAgWEZSRUUgKE1UWVBFX0lTSVNfVE1QLCBuZXh0aG9wX2xpc3QpOworICAgICAgcmV0dXJuOworICAgIH0KKwogICAvKiBmb3IgZWFjaCBuZXh0aG9wICovCiAgIGkgPSAwOwotICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAocm91dGVfaW5mby0+bmV4dGhvcHM2KTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7Ci0gICAgbmV4dGhvcDYgPSBnZXRkYXRhIChub2RlKTsKLSAgICAKLSAgICBpZiAoIUlONl9JU19BRERSX0xJTktMT0NBTCAoJm5leHRob3A2LT5pcDYpICYmCi0gICAgICAgICFJTjZfSVNfQUREUl9VTlNQRUNJRklFRCAoJm5leHRob3A2LT5pcDYpKSB7Ci0gICAgICBhcGkubmV4dGhvcF9udW0tLTsKLSAgICAgIGFwaS5pZmluZGV4X251bS0tOwotICAgICAgY29udGludWU7CisgIGZvciAobm9kZSA9IGxpc3RoZWFkIChyb3V0ZV9pbmZvLT5uZXh0aG9wczYpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisgICAgeworICAgICAgbmV4dGhvcDYgPSBnZXRkYXRhIChub2RlKTsKKworICAgICAgaWYgKCFJTjZfSVNfQUREUl9MSU5LTE9DQUwgKCZuZXh0aG9wNi0+aXA2KSAmJgorCSAgIUlONl9JU19BRERSX1VOU1BFQ0lGSUVEICgmbmV4dGhvcDYtPmlwNikpCisJeworCSAgYXBpLm5leHRob3BfbnVtLS07CisJICBhcGkuaWZpbmRleF9udW0tLTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgbmV4dGhvcF9saXN0W2ldID0gJm5leHRob3A2LT5pcDY7CisgICAgICBpZmluZGV4X2xpc3RbaV0gPSBuZXh0aG9wNi0+aWZpbmRleDsKKyAgICAgIGkrKzsKICAgICB9Ci0gICAgCi0gICAgbmV4dGhvcF9saXN0W2ldID0gJm5leHRob3A2LT5pcDY7Ci0gICAgaWZpbmRleF9saXN0W2ldID0gbmV4dGhvcDYtPmlmaW5kZXg7Ci0gICAgaSsrOwotICB9Ci0gIAorCiAgIGFwaS5uZXh0aG9wID0gbmV4dGhvcF9saXN0OwogICBhcGkuaWZpbmRleCA9IGlmaW5kZXhfbGlzdDsKLSAgCi0gIGlmIChhcGkubmV4dGhvcF9udW0gJiYgYXBpLmlmaW5kZXhfbnVtKSB7Ci0gICAgcHJlZml4Ni5mYW1pbHkgPSBBRl9JTkVUNjsKLSAgICBwcmVmaXg2LnByZWZpeGxlbiA9IHByZWZpeC0+cHJlZml4bGVuOwotICAgIG1lbWNweSAoJnByZWZpeDYucHJlZml4LCAmcHJlZml4LT51LnByZWZpeDYsIHNpemVvZiAoc3RydWN0IGluNl9hZGRyKSk7Ci0gICAgemFwaV9pcHY2X3JvdXRlIChaRUJSQV9JUFY2X1JPVVRFX0RFTEVURSwgemNsaWVudCwgJnByZWZpeDYsICZhcGkpOwotICAgIFVOU0VUX0ZMQUcgKHJvdXRlX2luZm8tPmZsYWcsIElTSVNfUk9VVEVfRkxBR19aRUJSQV9TWU5DKTsKLSAgfQotICAKLSAgWEZSRUUgKE1UWVBFX0lTSVNfVE1QLCBuZXh0aG9wX2xpc3QpOwotICBYRlJFRSAoTVRZUEVfSVNJU19UTVAsIGlmaW5kZXhfbGlzdCk7ICAKLX0KIAorICBpZiAoYXBpLm5leHRob3BfbnVtICYmIGFwaS5pZmluZGV4X251bSkKKyAgICB7CisgICAgICBwcmVmaXg2LmZhbWlseSA9IEFGX0lORVQ2OworICAgICAgcHJlZml4Ni5wcmVmaXhsZW4gPSBwcmVmaXgtPnByZWZpeGxlbjsKKyAgICAgIG1lbWNweSAoJnByZWZpeDYucHJlZml4LCAmcHJlZml4LT51LnByZWZpeDYsIHNpemVvZiAoc3RydWN0IGluNl9hZGRyKSk7CisgICAgICB6YXBpX2lwdjZfcm91dGUgKFpFQlJBX0lQVjZfUk9VVEVfREVMRVRFLCB6Y2xpZW50LCAmcHJlZml4NiwgJmFwaSk7CisgICAgICBVTlNFVF9GTEFHIChyb3V0ZV9pbmZvLT5mbGFnLCBJU0lTX1JPVVRFX0ZMQUdfWkVCUkFfU1lOQyk7CisgICAgfQorCisgIFhGUkVFIChNVFlQRV9JU0lTX1RNUCwgbmV4dGhvcF9saXN0KTsKKyAgWEZSRUUgKE1UWVBFX0lTSVNfVE1QLCBpZmluZGV4X2xpc3QpOworfQogCiAjZW5kaWYgLyogSEFWRV9JUFY2ICovCiAKLQotCiB2b2lkCiBpc2lzX3plYnJhX3JvdXRlX3VwZGF0ZSAoc3RydWN0IHByZWZpeCAqcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpc2lzX3JvdXRlX2luZm8gKnJvdXRlX2luZm8pCisJCQkgc3RydWN0IGlzaXNfcm91dGVfaW5mbyAqcm91dGVfaW5mbykKIHsKICAgaWYgKHpjbGllbnQtPnNvY2sgPCAwKQogICAgIHJldHVybjsKQEAgLTQ2OCwyNyArNDgyLDI5IEBACiAgIGlmICghemNsaWVudC0+cmVkaXN0W1pFQlJBX1JPVVRFX0lTSVNdKQogICAgIHJldHVybjsKIAotICBpZiAoQ0hFQ0tfRkxBRyAocm91dGVfaW5mby0+ZmxhZywgSVNJU19ST1VURV9GTEFHX0FDVElWRSkpIHsKLSAgICBpZiAocHJlZml4LT5mYW1pbHkgPT0gQUZfSU5FVCkKLSAgICAgIGlzaXNfemVicmFfcm91dGVfYWRkX2lwdjQgKHByZWZpeCwgcm91dGVfaW5mbyk7CisgIGlmIChDSEVDS19GTEFHIChyb3V0ZV9pbmZvLT5mbGFnLCBJU0lTX1JPVVRFX0ZMQUdfQUNUSVZFKSkKKyAgICB7CisgICAgICBpZiAocHJlZml4LT5mYW1pbHkgPT0gQUZfSU5FVCkKKwlpc2lzX3plYnJhX3JvdXRlX2FkZF9pcHY0IChwcmVmaXgsIHJvdXRlX2luZm8pOwogI2lmZGVmIEhBVkVfSVBWNgotICAgIGVsc2UgaWYgKHByZWZpeC0+ZmFtaWx5ID09IEFGX0lORVQ2KQotICAgICAgaXNpc196ZWJyYV9yb3V0ZV9hZGRfaXB2NiAocHJlZml4LCByb3V0ZV9pbmZvKTsKKyAgICAgIGVsc2UgaWYgKHByZWZpeC0+ZmFtaWx5ID09IEFGX0lORVQ2KQorCWlzaXNfemVicmFfcm91dGVfYWRkX2lwdjYgKHByZWZpeCwgcm91dGVfaW5mbyk7CiAjZW5kaWYgLyogSEFWRV9JUFY2ICovCi0gIH0gZWxzZSB7IAotICAgIGlmIChwcmVmaXgtPmZhbWlseSA9PSBBRl9JTkVUKQotICAgICAgaXNpc196ZWJyYV9yb3V0ZV9kZWxfaXB2NCAocHJlZml4LCByb3V0ZV9pbmZvKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAocHJlZml4LT5mYW1pbHkgPT0gQUZfSU5FVCkKKwlpc2lzX3plYnJhX3JvdXRlX2RlbF9pcHY0IChwcmVmaXgsIHJvdXRlX2luZm8pOwogI2lmZGVmIEhBVkVfSVBWNgotICAgIGVsc2UgaWYgKHByZWZpeC0+ZmFtaWx5ID09IEFGX0lORVQ2KQotICAgICAgaXNpc196ZWJyYV9yb3V0ZV9kZWxfaXB2NiAocHJlZml4LCByb3V0ZV9pbmZvKTsKKyAgICAgIGVsc2UgaWYgKHByZWZpeC0+ZmFtaWx5ID09IEFGX0lORVQ2KQorCWlzaXNfemVicmFfcm91dGVfZGVsX2lwdjYgKHByZWZpeCwgcm91dGVfaW5mbyk7CiAjZW5kaWYgLyogSEFWRV9JUFY2ICovCi0gIH0KKyAgICB9CiAgIHJldHVybjsKIH0KIAotCiBpbnQKLWlzaXNfemVicmFfcmVhZF9pcHY0IChpbnQgY29tbWFuZCwgc3RydWN0IHpjbGllbnQgKnpjbGllbnQsIAoraXNpc196ZWJyYV9yZWFkX2lwdjQgKGludCBjb21tYW5kLCBzdHJ1Y3QgemNsaWVudCAqemNsaWVudCwKIAkJICAgICAgemVicmFfc2l6ZV90IGxlbmd0aCkKIHsKICAgc3RydWN0IHN0cmVhbSAqc3RyZWFtOwpAQCAtNTAxLDQyICs1MTcsNDMgQEAKICAgbWVtc2V0ICgmcCwgMCwgc2l6ZW9mIChzdHJ1Y3QgcHJlZml4X2lwdjQpKTsKICAgaWZpbmRleCA9IDA7CiAKLSAgYXBpLnR5cGUgICAgPSBzdHJlYW1fZ2V0YyAoc3RyZWFtKTsKLSAgYXBpLmZsYWdzICAgPSBzdHJlYW1fZ2V0YyAoc3RyZWFtKTsKKyAgYXBpLnR5cGUgPSBzdHJlYW1fZ2V0YyAoc3RyZWFtKTsKKyAgYXBpLmZsYWdzID0gc3RyZWFtX2dldGMgKHN0cmVhbSk7CiAgIGFwaS5tZXNzYWdlID0gc3RyZWFtX2dldGMgKHN0cmVhbSk7CiAKICAgcC5mYW1pbHkgPSBBRl9JTkVUOwogICBwLnByZWZpeGxlbiA9IHN0cmVhbV9nZXRjIChzdHJlYW0pOwogICBzdHJlYW1fZ2V0ICgmcC5wcmVmaXgsIHN0cmVhbSwgUFNJWkUgKHAucHJlZml4bGVuKSk7Ci0gIAotICBpZiAoQ0hFQ0tfRkxBRyAoYXBpLm1lc3NhZ2UsIFpBUElfTUVTU0FHRV9ORVhUSE9QKSkgeworCisgIGlmIChDSEVDS19GTEFHIChhcGkubWVzc2FnZSwgWkFQSV9NRVNTQUdFX05FWFRIT1ApKQorICAgIHsKICAgICAgIGFwaS5uZXh0aG9wX251bSA9IHN0cmVhbV9nZXRjIChzdHJlYW0pOwogICAgICAgbmV4dGhvcC5zX2FkZHIgPSBzdHJlYW1fZ2V0X2lwdjQgKHN0cmVhbSk7Ci0gIH0KLSAgaWYgKENIRUNLX0ZMQUcgKGFwaS5tZXNzYWdlLCBaQVBJX01FU1NBR0VfSUZJTkRFWCkpIHsKLSAgICBhcGkuaWZpbmRleF9udW0gPSBzdHJlYW1fZ2V0YyAoc3RyZWFtKTsKLSAgICBpZmluZGV4ID0gc3RyZWFtX2dldGwgKHN0cmVhbSk7Ci0gIH0KKyAgICB9CisgIGlmIChDSEVDS19GTEFHIChhcGkubWVzc2FnZSwgWkFQSV9NRVNTQUdFX0lGSU5ERVgpKQorICAgIHsKKyAgICAgIGFwaS5pZmluZGV4X251bSA9IHN0cmVhbV9nZXRjIChzdHJlYW0pOworICAgICAgaWZpbmRleCA9IHN0cmVhbV9nZXRsIChzdHJlYW0pOworICAgIH0KICAgaWYgKENIRUNLX0ZMQUcgKGFwaS5tZXNzYWdlLCBaQVBJX01FU1NBR0VfRElTVEFOQ0UpKQogICAgIGFwaS5kaXN0YW5jZSA9IHN0cmVhbV9nZXRjIChzdHJlYW0pOwogICBpZiAoQ0hFQ0tfRkxBRyAoYXBpLm1lc3NhZ2UsIFpBUElfTUVTU0FHRV9NRVRSSUMpKQogICAgIGFwaS5tZXRyaWMgPSBzdHJlYW1fZ2V0bCAoc3RyZWFtKTsKICAgZWxzZQogICAgIGFwaS5tZXRyaWMgPSAwOwotICAKLSAgaWYgKGNvbW1hbmQgPT0gWkVCUkFfSVBWNF9ST1VURV9BREQpIHsKLSAgICB6bG9nX2luZm8gKCJJUHY0IFJvdXRlIGFkZCBmcm9tIFoiKTsKLSAgfQorCisgIGlmIChjb21tYW5kID09IFpFQlJBX0lQVjRfUk9VVEVfQUREKQorICAgIHsKKyAgICAgIHpsb2dfaW5mbyAoIklQdjQgUm91dGUgYWRkIGZyb20gWiIpOworICAgIH0KIAogICByZXR1cm4gMDsKIH0KIAotCi1pbnQgCi1pc2lzX3plYnJhX3JlYWRfaXB2NiAoaW50IGNvbW1hbmQsIHN0cnVjdCB6Y2xpZW50ICp6Y2xpZW50LCAKK2ludAoraXNpc196ZWJyYV9yZWFkX2lwdjYgKGludCBjb21tYW5kLCBzdHJ1Y3QgemNsaWVudCAqemNsaWVudCwKIAkJICAgICAgemVicmFfc2l6ZV90IGxlbmd0aCkKIHsKLQogICByZXR1cm4gMDsKIH0KIApAQCAtNTUwLDE2ICs1NjcsMTUgQEAKIH0KIAogaW50Ci1pc2lzX3JlZGlzdHJpYnV0ZV9kZWZhdWx0X3NldChpbnQgcm91dGV0eXBlLCBpbnQgbWV0cmljX3R5cGUsIGludCBtZXRyaWNfdmFsdWUpCitpc2lzX3JlZGlzdHJpYnV0ZV9kZWZhdWx0X3NldCAoaW50IHJvdXRldHlwZSwgaW50IG1ldHJpY190eXBlLAorCQkJICAgICAgIGludCBtZXRyaWNfdmFsdWUpCiB7CiAgIHJldHVybiAwOwogfQogCi0KIHZvaWQKIGlzaXNfemVicmFfaW5pdCAoKQogewotICAKICAgemNsaWVudCA9IHpjbGllbnRfbmV3ICgpOwogICB6Y2xpZW50X2luaXQgKHpjbGllbnQsIFpFQlJBX1JPVVRFX0lTSVMpOwogICB6Y2xpZW50LT5pbnRlcmZhY2VfYWRkID0gaXNpc196ZWJyYV9pZl9hZGQ7CkBAIC01ODEsMTcgKzU5Nyw5IEBACiB2b2lkCiBpc2lzX3plYnJhX2ZpbmlzaCAoKQogewotCiAgIHpjbGllbnRfc3RvcCAoemNsaWVudCk7CiAgIHpjbGllbnRfZnJlZSAoemNsaWVudCk7CiAgIHpjbGllbnQgPSAoc3RydWN0IHpjbGllbnQgKikgTlVMTDsKIAogICByZXR1cm47CiB9Ci0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2lzaXNkL2lzaXNfemVicmEuaCBiL2lzaXNkL2lzaXNfemVicmEuaAppbmRleCBmYWJmNzIwLi4wZGNlNzk5IDEwMDY0NAotLS0gYS9pc2lzZC9pc2lzX3plYnJhLmgKKysrIGIvaXNpc2QvaXNpc196ZWJyYS5oCkBAIC0yNiw4ICsyNiw4IEBACiAKIHZvaWQgaXNpc196ZWJyYV9pbml0ICh2b2lkKTsKIHZvaWQgaXNpc196ZWJyYV9maW5pc2ggKHZvaWQpOwotdm9pZCBpc2lzX3plYnJhX3JvdXRlX3VwZGF0ZSAoc3RydWN0IHByZWZpeCAqcHJlZml4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpc2lzX3JvdXRlX2luZm8gKnJvdXRlX2luZm8pOwordm9pZCBpc2lzX3plYnJhX3JvdXRlX3VwZGF0ZSAoc3RydWN0IHByZWZpeCAqcHJlZml4LAorCQkJICAgICAgc3RydWN0IGlzaXNfcm91dGVfaW5mbyAqcm91dGVfaW5mbyk7CiBpbnQgaXNpc19kaXN0cmlidXRlX2xpc3RfdXBkYXRlIChpbnQgcm91dGV0eXBlKTsKIAogI2VuZGlmIC8qIF9aRUJSQV9JU0lTX1pFQlJBX0ggKi8KZGlmZiAtLWdpdCBhL2lzaXNkL2lzaXNkLmMgYi9pc2lzZC9pc2lzZC5jCmluZGV4IDhkMGIzYTIuLjNjNDk5ZGMgMTAwNjQ0Ci0tLSBhL2lzaXNkL2lzaXNkLmMKKysrIGIvaXNpc2QvaXNpc2QuYwpAQCAtNTYsMTkgKzU2LDE2IEBACiAKICNpZmRlZiBUT1BPTE9HWV9HRU5FUkFURQogI2luY2x1ZGUgInNwZ3JpZC5oIgotdV9jaGFyIERFRkFVTFRfVE9QT0xPR1lfQkFTRUlTWzZdID0gezB4RkUsIDB4RUQsIDB4RkUsIDB4RUQsIDB4MDAsIDB4MDB9OwordV9jaGFyIERFRkFVTFRfVE9QT0xPR1lfQkFTRUlTWzZdID0geyAweEZFLCAweEVELCAweEZFLCAweEVELCAweDAwLCAweDAwIH07CiAjZW5kaWYgLyogVE9QT0xPR1lfR0VORVJBVEUgKi8KIAotCiBzdHJ1Y3QgaXNpcyAqaXNpcyA9IE5VTEw7CiBzdHJ1Y3QgdGhyZWFkX21hc3RlciAqbWFzdGVyOwogCi0KIHZvaWQKIGlzaXNfbmV3ICh1bnNpZ25lZCBsb25nIHByb2Nlc3NfaWQpCiB7Ci0gIAotICBpc2lzID0gWE1BTExPQyAoTVRZUEVfSVNJUywgc2l6ZW9mKHN0cnVjdCBpc2lzKSk7CisgIGlzaXMgPSBYTUFMTE9DIChNVFlQRV9JU0lTLCBzaXplb2YgKHN0cnVjdCBpc2lzKSk7CiAgIGJ6ZXJvIChpc2lzLCBzaXplb2YgKHN0cnVjdCBpc2lzKSk7CiAgIC8qCiAgICAqIERlZmF1bHQgdmFsdWVzCkBAIC04NiwxNSArODMsMTQgQEAKICAgLyoKICAgICogdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgZm9yIGZ1bGwgZGVidWdzCiAgICAqLwotICAgLyogaXNpcy0+ZGVidWdzID0gMHhGRkZGOyAqLyAgCisgIC8qIGlzaXMtPmRlYnVncyA9IDB4RkZGRjsgKi8KIH0KIAogc3RydWN0IGlzaXNfYXJlYSAqCiBpc2lzX2FyZWFfY3JlYXRlICgpCiB7Ci0KICAgc3RydWN0IGlzaXNfYXJlYSAqYXJlYTsKLSAgCisKICAgYXJlYSA9IFhNQUxMT0MgKE1UWVBFX0lTSVNfQVJFQSwgc2l6ZW9mIChzdHJ1Y3QgaXNpc19hcmVhKSk7CiAgIG1lbXNldCAoYXJlYSwgMCwgc2l6ZW9mIChzdHJ1Y3QgaXNpc19hcmVhKSk7CiAKQEAgLTExMSw3ICsxMDcsNyBAQAogICAgKi8KICAgYXJlYS0+bHNwZGJbMF0gPSBsc3BfZGJfaW5pdCAoKTsKICAgYXJlYS0+bHNwZGJbMV0gPSBsc3BfZGJfaW5pdCAoKTsKLSAgCisKICAgc3BmdHJlZV9hcmVhX2luaXQgKGFyZWEpOwogICBhcmVhLT5yb3V0ZV90YWJsZSA9IHJvdXRlX3RhYmxlX2luaXQgKCk7CiAjaWZkZWYgSEFWRV9JUFY2CkBAIC0xMTksMTcgKzExNSwxNyBAQAogI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwogICBhcmVhLT5jaXJjdWl0X2xpc3QgPSBsaXN0X25ldyAoKTsKICAgYXJlYS0+YXJlYV9hZGRycyA9IGxpc3RfbmV3ICgpOwotICBUSFJFQURfVElNRVJfT04obWFzdGVyLCBhcmVhLT50X3RpY2ssIGxzcF90aWNrLCBhcmVhLCAxKTsKKyAgVEhSRUFEX1RJTUVSX09OIChtYXN0ZXIsIGFyZWEtPnRfdGljaywgbHNwX3RpY2ssIGFyZWEsIDEpOwogICBhcmVhLT5mbGFncy5tYXhpbmRleCA9IC0xOwogICAvKgogICAgKiBEZWZhdWx0IHZhbHVlcwogICAgKi8KLSAgYXJlYS0+bWF4X2xzcF9saWZldGltZVswXSA9IE1BWF9BR0U7IC8qIDEyMDAgKi8KLSAgYXJlYS0+bWF4X2xzcF9saWZldGltZVsxXSA9IE1BWF9BR0U7IC8qIDEyMDAgKi8KKyAgYXJlYS0+bWF4X2xzcF9saWZldGltZVswXSA9IE1BWF9BR0U7CS8qIDEyMDAgKi8KKyAgYXJlYS0+bWF4X2xzcF9saWZldGltZVsxXSA9IE1BWF9BR0U7CS8qIDEyMDAgKi8KICAgYXJlYS0+bHNwX2dlbl9pbnRlcnZhbFswXSA9IExTUF9HRU5fSU5URVJWQUxfREVGQVVMVDsKICAgYXJlYS0+bHNwX2dlbl9pbnRlcnZhbFsxXSA9IExTUF9HRU5fSU5URVJWQUxfREVGQVVMVDsKLSAgYXJlYS0+bHNwX3JlZnJlc2hbMF0gPSBNQVhfTFNQX0dFTl9JTlRFUlZBTDsgLyogOTAwICovCi0gIGFyZWEtPmxzcF9yZWZyZXNoWzFdID0gTUFYX0xTUF9HRU5fSU5URVJWQUw7IC8qIDkwMCAqLworICBhcmVhLT5sc3BfcmVmcmVzaFswXSA9IE1BWF9MU1BfR0VOX0lOVEVSVkFMOwkvKiA5MDAgKi8KKyAgYXJlYS0+bHNwX3JlZnJlc2hbMV0gPSBNQVhfTFNQX0dFTl9JTlRFUlZBTDsJLyogOTAwICovCiAgIGFyZWEtPm1pbl9zcGZfaW50ZXJ2YWxbMF0gPSBNSU5JTVVNX1NQRl9JTlRFUlZBTDsKICAgYXJlYS0+bWluX3NwZl9pbnRlcnZhbFsxXSA9IE1JTklNVU1fU1BGX0lOVEVSVkFMOwogICBhcmVhLT5keW5ob3N0bmFtZSA9IDE7CkBAIC0xNDksODEgKzE0NSw4MyBAQAogewogICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOwogICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7Ci0gIAorCiAgIExJU1RfTE9PUCAoaXNpcy0+YXJlYV9saXN0LCBhcmVhLCBub2RlKQogICAgIGlmICgoYXJlYS0+YXJlYV90YWcgPT0gTlVMTCAmJiBhcmVhX3RhZyA9PSBOVUxMKSB8fAotCShhcmVhLT5hcmVhX3RhZyAmJiBhcmVhX3RhZyAmJiBzdHJjbXAgKGFyZWEtPmFyZWFfdGFnLCBhcmVhX3RhZykgPT0gMCkpCi0gICAgICByZXR1cm4gYXJlYTsKLSAgCisJKGFyZWEtPmFyZWFfdGFnICYmIGFyZWFfdGFnCisJICYmIHN0cmNtcCAoYXJlYS0+YXJlYV90YWcsIGFyZWFfdGFnKSA9PSAwKSkKKyAgICByZXR1cm4gYXJlYTsKKwogICByZXR1cm4gTlVMTDsKIH0KIAotaW50IAoraW50CiBpc2lzX2FyZWFfZ2V0IChzdHJ1Y3QgdnR5ICp2dHksIGNoYXIgKmFyZWFfdGFnKQogewotCiAgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWE7Ci0gIAorCiAgIGFyZWEgPSBpc2lzX2FyZWFfbG9va3VwIChhcmVhX3RhZyk7Ci0gIAotICBpZiAoYXJlYSkgewotICAgIHZ0eS0+bm9kZSA9IElTSVNfTk9ERTsKLSAgICB2dHktPmluZGV4ID0gYXJlYTsKLSAgICByZXR1cm4gQ01EX1NVQ0NFU1M7Ci0gIH0KLSAgCisKKyAgaWYgKGFyZWEpCisgICAgeworICAgICAgdnR5LT5ub2RlID0gSVNJU19OT0RFOworICAgICAgdnR5LT5pbmRleCA9IGFyZWE7CisgICAgICByZXR1cm4gQ01EX1NVQ0NFU1M7CisgICAgfQorCiAgIGFyZWEgPSBpc2lzX2FyZWFfY3JlYXRlICgpOwogICBhcmVhLT5hcmVhX3RhZyA9IHN0cmR1cCAoYXJlYV90YWcpOwogICBsaXN0bm9kZV9hZGQgKGlzaXMtPmFyZWFfbGlzdCwgYXJlYSk7Ci0gIAorCiAgIHpsb2dfaW5mbyAoIm5ldyBJUy1JUyBhcmVhIGluc3RhbmNlICVzIiwgYXJlYS0+YXJlYV90YWcpOwogCiAgIHZ0eS0+bm9kZSA9IElTSVNfTk9ERTsKICAgdnR5LT5pbmRleCA9IGFyZWE7Ci0gIAorCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KIAogaW50CiBpc2lzX2FyZWFfZGVzdHJveSAoc3RydWN0IHZ0eSAqdnR5LCBjaGFyICphcmVhX3RhZykKIHsKLSAgCiAgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWE7CiAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKICAgc3RydWN0IGlzaXNfY2lyY3VpdCAqY2lyY3VpdDsKIAogICBhcmVhID0gaXNpc19hcmVhX2xvb2t1cCAoYXJlYV90YWcpOwotICAKLSAgaWYgKGFyZWEgPT0gTlVMTCkgewotICAgIHZ0eV9vdXQgKHZ0eSwgIkNhbid0IGZpbmQgSVNJUyBpbnN0YW5jZSAlcyIsIFZUWV9ORVdMSU5FKTsKLSAgICByZXR1cm4gQ01EX1dBUk5JTkc7Ci0gIH0KIAotICBpZiAoYXJlYS0+Y2lyY3VpdF9saXN0KSB7Ci0gICAgbm9kZSA9IGxpc3RoZWFkIChhcmVhLT5jaXJjdWl0X2xpc3QpOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICBjaXJjdWl0ID0gZ2V0ZGF0YSAobm9kZSk7Ci0gICAgICBuZXh0bm9kZSAobm9kZSk7Ci0gICAgICBpc2lzX2NpcmN1aXRfZGVsIChjaXJjdWl0KTsKKyAgaWYgKGFyZWEgPT0gTlVMTCkKKyAgICB7CisgICAgICB2dHlfb3V0ICh2dHksICJDYW4ndCBmaW5kIElTSVMgaW5zdGFuY2UgJXMiLCBWVFlfTkVXTElORSk7CisgICAgICByZXR1cm4gQ01EX1dBUk5JTkc7CiAgICAgfQotICAgIGxpc3RfZGVsZXRlIChhcmVhLT5jaXJjdWl0X2xpc3QpOwotICB9CisKKyAgaWYgKGFyZWEtPmNpcmN1aXRfbGlzdCkKKyAgICB7CisgICAgICBub2RlID0gbGlzdGhlYWQgKGFyZWEtPmNpcmN1aXRfbGlzdCk7CisgICAgICB3aGlsZSAobm9kZSkKKwl7CisJICBjaXJjdWl0ID0gZ2V0ZGF0YSAobm9kZSk7CisJICBuZXh0bm9kZSAobm9kZSk7CisJICBpc2lzX2NpcmN1aXRfZGVsIChjaXJjdWl0KTsKKwl9CisgICAgICBsaXN0X2RlbGV0ZSAoYXJlYS0+Y2lyY3VpdF9saXN0KTsKKyAgICB9CiAgIGxpc3Rub2RlX2RlbGV0ZSAoaXNpcy0+YXJlYV9saXN0LCBhcmVhKTsKLSAgVEhSRUFEX1RJTUVSX09GRihhcmVhLT50X3RpY2spOworICBUSFJFQURfVElNRVJfT0ZGIChhcmVhLT50X3RpY2spOwogICBpZiAoYXJlYS0+dF9yZW1vdmVfYWdlZCkKICAgICB0aHJlYWRfY2FuY2VsIChhcmVhLT50X3JlbW92ZV9hZ2VkKTsKLSAgVEhSRUFEX1RJTUVSX09GRihhcmVhLT50X2xzcF9yZWZyZXNoWzBdKTsKLSAgVEhSRUFEX1RJTUVSX09GRihhcmVhLT50X2xzcF9yZWZyZXNoWzFdKTsKKyAgVEhSRUFEX1RJTUVSX09GRiAoYXJlYS0+dF9sc3BfcmVmcmVzaFswXSk7CisgIFRIUkVBRF9USU1FUl9PRkYgKGFyZWEtPnRfbHNwX3JlZnJlc2hbMV0pOwogCiAgIFhGUkVFIChNVFlQRV9JU0lTX0FSRUEsIGFyZWEpOwotICAKKwogICByZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKLWludCAKLWFyZWFfbmV0X3RpdGxlIChzdHJ1Y3QgdnR5ICp2dHkgLCBjaGFyICpuZXRfdGl0bGUpCitpbnQKK2FyZWFfbmV0X3RpdGxlIChzdHJ1Y3QgdnR5ICp2dHksIGNoYXIgKm5ldF90aXRsZSkKIHsKLSAgCiAgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWE7CiAgIHN0cnVjdCBhcmVhX2FkZHIgKmFkZHI7CiAgIHN0cnVjdCBhcmVhX2FkZHIgKmFkZHJwOwpAQCAtMjMyLDYyICsyMzAsNzMgQEAKICAgdV9jaGFyIGJ1ZmZbMjU1XTsKICAgYXJlYSA9IHZ0eS0+aW5kZXg7CiAKLSAgaWYgKCFhcmVhKSB7Ci0gICAgdnR5X291dCAodnR5LCAiQ2FuJ3QgZmluZCBJU0lTIGluc3RhbmNlICVzIiwgVlRZX05FV0xJTkUpOwotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQorICBpZiAoIWFyZWEpCisgICAgeworICAgICAgdnR5X291dCAodnR5LCAiQ2FuJ3QgZmluZCBJU0lTIGluc3RhbmNlICVzIiwgVlRZX05FV0xJTkUpOworICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KIAogICAvKiBXZSBjaGVjayB0aGF0IHdlIGFyZSBub3Qgb3ZlciB0aGUgbWF4aW1hbCBudW1iZXIgb2YgYWRkcmVzc2VzICovCi0gIGlmIChsaXN0Y291bnQgKGFyZWEtPmFyZWFfYWRkcnMpID49IGlzaXMtPm1heF9hcmVhX2FkZHJzKSB7Ci0gICAgdnR5X291dCAodnR5LCAiTWF4aW11bSBvZiBhcmVhIGFkZHJlc3NlcyAoJWQpIGFscmVhZHkgcmVhY2hlZCAlcyIsCi0JICAgICBpc2lzLT5tYXhfYXJlYV9hZGRycywgVlRZX05FV0xJTkUpOwotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQorICBpZiAobGlzdGNvdW50IChhcmVhLT5hcmVhX2FkZHJzKSA+PSBpc2lzLT5tYXhfYXJlYV9hZGRycykKKyAgICB7CisgICAgICB2dHlfb3V0ICh2dHksICJNYXhpbXVtIG9mIGFyZWEgYWRkcmVzc2VzICglZCkgYWxyZWFkeSByZWFjaGVkICVzIiwKKwkgICAgICAgaXNpcy0+bWF4X2FyZWFfYWRkcnMsIFZUWV9ORVdMSU5FKTsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CiAKICAgYWRkciA9IFhNQUxMT0MgKE1UWVBFX0lTSVNfQVJFQV9BRERSLCBzaXplb2YgKHN0cnVjdCBhcmVhX2FkZHIpKTsKICAgYWRkci0+YWRkcl9sZW4gPSBkb3Rmb3JtYXQyYnVmZiAoYnVmZiwgbmV0X3RpdGxlKTsKICAgbWVtY3B5IChhZGRyLT5hcmVhX2FkZHIsIGJ1ZmYsIGFkZHItPmFkZHJfbGVuKTsKICNpZmRlZiBFWFRSRU1FX0RFQlVHCi0gIHpsb2dfaW5mbyAoImFkZGVkIGFyZWEgYWRkcmVzcyAlcyBmb3IgYXJlYSAlcyAoYWRkcmVzcyBsZW5ndGggJWQpIiwgCisgIHpsb2dfaW5mbyAoImFkZGVkIGFyZWEgYWRkcmVzcyAlcyBmb3IgYXJlYSAlcyAoYWRkcmVzcyBsZW5ndGggJWQpIiwKIAkgICAgIG5ldF90aXRsZSwgYXJlYS0+YXJlYV90YWcsIGFkZHItPmFkZHJfbGVuKTsKICNlbmRpZiAvKiBFWFRSRU1FX0RFQlVHICovCi0gIGlmIChhZGRyLT5hZGRyX2xlbiA8IDggfHwgYWRkci0+YWRkcl9sZW4gPiAyMCkgewotICAgIHpsb2dfd2FybiAoImFyZWEgYWRkcmVzcyBtdXN0IGJlIGF0IGxlYXN0IDguLjIwIG9jdGV0cyBsb25nICglZCkiLAotCSAgICAgICBhZGRyLT5hZGRyX2xlbik7Ci0gICAgWEZSRUUgKE1UWVBFX0lTSVNfQVJFQV9BRERSLCBhZGRyKTsKLSAgICByZXR1cm4gQ01EX1dBUk5JTkc7Ci0gIH0KLQotICBpZiAoaXNpcy0+c3lzaWRfc2V0ID09IDApIHsKLSAgICAvKgotICAgICAqIEZpcnN0IGFyZWEgYWRkcmVzcyAtIGdldCB0aGUgU3lzdGVtSUQgZm9yIHRoaXMgcm91dGVyCi0gICAgICovCi0gICAgbWVtY3B5IChpc2lzLT5zeXNpZCwgR0VUU1lTSUQoYWRkciwgSVNJU19TWVNfSURfTEVOKSwgSVNJU19TWVNfSURfTEVOKTsKLSAgICBpc2lzLT5zeXNpZF9zZXQgPSAxOwotICAgIHpsb2dfaW5mbyAoIlJvdXRlciBoYXMgU3lzdGVtSUQgJXMiLCBzeXNpZF9wcmludCAoaXNpcy0+c3lzaWQpKTsKLSAgfSBlbHNlIHsKLSAgICAvKgotICAgICAqIENoZWNrIHRoYXQgdGhlIFN5c3RlbUlEIHBvcnRpb25zIG1hdGNoCi0gICAgICovCi0gICAgaWYgKG1lbWNtcCAoaXNpcy0+c3lzaWQsIEdFVFNZU0lEKGFkZHIsIElTSVNfU1lTX0lEX0xFTiksCi0JCSBJU0lTX1NZU19JRF9MRU4pKSB7Ci0gICAgICB2dHlfb3V0ICh2dHksICJTeXN0ZW0gSUQgbXVzdCBub3QgY2hhbmdlIHdoZW4gZGVmaW5pbmcgYWRkaXRpb25hbCBhcmVhIgotICAgICAgICAgICAgICAgIiBhZGRyZXNzZXMlcyIsIFZUWV9ORVdMSU5FKTsKKyAgaWYgKGFkZHItPmFkZHJfbGVuIDwgOCB8fCBhZGRyLT5hZGRyX2xlbiA+IDIwKQorICAgIHsKKyAgICAgIHpsb2dfd2FybiAoImFyZWEgYWRkcmVzcyBtdXN0IGJlIGF0IGxlYXN0IDguLjIwIG9jdGV0cyBsb25nICglZCkiLAorCQkgYWRkci0+YWRkcl9sZW4pOwogICAgICAgWEZSRUUgKE1UWVBFX0lTSVNfQVJFQV9BRERSLCBhZGRyKTsKICAgICAgIHJldHVybiBDTURfV0FSTklORzsKICAgICB9CiAKLSAgICAvKiBub3cgd2Ugc2VlIHRoYXQgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIHRoaXMgYWRkcmVzcyAqLwotICAgIExJU1RfTE9PUCAoYXJlYS0+YXJlYV9hZGRycywgYWRkcnAsIG5vZGUpIHsKLSAgICAgIGlmICgoYWRkcnAtPmFkZHJfbGVuKyBJU0lTX1NZU19JRF9MRU4gKyAxKSA9PSAoYWRkci0+YWRkcl9sZW4pKSB7Ci0gICAgICAgICBpZiAoIW1lbWNtcCAoYWRkcnAtPmFyZWFfYWRkciwgYWRkci0+YXJlYV9hZGRyLGFkZHItPmFkZHJfbGVuKSkgewotICAgICAgICAgIFhGUkVFIChNVFlQRV9JU0lTX0FSRUFfQUREUiwgYWRkcik7Ci0gICAgICAgICAgcmV0dXJuIENNRF9TVUNDRVNTOyAvKiBzaWxlbnQgZmFpbCAqLwotICAgICAgICB9Ci0gICAgICB9CisgIGlmIChpc2lzLT5zeXNpZF9zZXQgPT0gMCkKKyAgICB7CisgICAgICAvKgorICAgICAgICogRmlyc3QgYXJlYSBhZGRyZXNzIC0gZ2V0IHRoZSBTeXN0ZW1JRCBmb3IgdGhpcyByb3V0ZXIKKyAgICAgICAqLworICAgICAgbWVtY3B5IChpc2lzLT5zeXNpZCwgR0VUU1lTSUQgKGFkZHIsIElTSVNfU1lTX0lEX0xFTiksIElTSVNfU1lTX0lEX0xFTik7CisgICAgICBpc2lzLT5zeXNpZF9zZXQgPSAxOworICAgICAgemxvZ19pbmZvICgiUm91dGVyIGhhcyBTeXN0ZW1JRCAlcyIsIHN5c2lkX3ByaW50IChpc2lzLT5zeXNpZCkpOwogICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBDaGVjayB0aGF0IHRoZSBTeXN0ZW1JRCBwb3J0aW9ucyBtYXRjaAorICAgICAgICovCisgICAgICBpZiAobWVtY21wIChpc2lzLT5zeXNpZCwgR0VUU1lTSUQgKGFkZHIsIElTSVNfU1lTX0lEX0xFTiksCisJCSAgSVNJU19TWVNfSURfTEVOKSkKKwl7CisJICB2dHlfb3V0ICh2dHksCisJCSAgICJTeXN0ZW0gSUQgbXVzdCBub3QgY2hhbmdlIHdoZW4gZGVmaW5pbmcgYWRkaXRpb25hbCBhcmVhIgorCQkgICAiIGFkZHJlc3NlcyVzIiwgVlRZX05FV0xJTkUpOworCSAgWEZSRUUgKE1UWVBFX0lTSVNfQVJFQV9BRERSLCBhZGRyKTsKKwkgIHJldHVybiBDTURfV0FSTklORzsKKwl9CiAKLSAgfQorICAgICAgLyogbm93IHdlIHNlZSB0aGF0IHdlIGRvbid0IGFscmVhZHkgaGF2ZSB0aGlzIGFkZHJlc3MgKi8KKyAgICAgIExJU1RfTE9PUCAoYXJlYS0+YXJlYV9hZGRycywgYWRkcnAsIG5vZGUpCisgICAgICB7CisJaWYgKChhZGRycC0+YWRkcl9sZW4gKyBJU0lTX1NZU19JRF9MRU4gKyAxKSA9PSAoYWRkci0+YWRkcl9sZW4pKQorCSAgeworCSAgICBpZiAoIW1lbWNtcCAoYWRkcnAtPmFyZWFfYWRkciwgYWRkci0+YXJlYV9hZGRyLCBhZGRyLT5hZGRyX2xlbikpCisJICAgICAgeworCQlYRlJFRSAoTVRZUEVfSVNJU19BUkVBX0FERFIsIGFkZHIpOworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CS8qIHNpbGVudCBmYWlsICovCisJICAgICAgfQorCSAgfQorICAgICAgfQorCisgICAgfQogICAvKgogICAgKiBGb3JnZXQgdGhlIHN5c3RlbUlEIHBhcnQgb2YgdGhlIGFkZHJlc3MKICAgICovCkBAIC0yOTUsMTAgKzMwNCwxMSBAQAogICBsaXN0bm9kZV9hZGQgKGFyZWEtPmFyZWFfYWRkcnMsIGFkZHIpOwogCiAgIC8qIG9ubHkgbm93IHdlIGNhbiBzYWZlbHkgZ2VuZXJhdGUgb3VyIExTUHMgZm9yIHRoaXMgYXJlYSAqLwotICBpZiAobGlzdGNvdW50KGFyZWEtPmFyZWFfYWRkcnMpID4gMCkgewotICAgIGxzcF9sMV9nZW5lcmF0ZSAoYXJlYSk7Ci0gICAgbHNwX2wyX2dlbmVyYXRlIChhcmVhKTsKLSAgfQorICBpZiAobGlzdGNvdW50IChhcmVhLT5hcmVhX2FkZHJzKSA+IDApCisgICAgeworICAgICAgbHNwX2wxX2dlbmVyYXRlIChhcmVhKTsKKyAgICAgIGxzcF9sMl9nZW5lcmF0ZSAoYXJlYSk7CisgICAgfQogCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KQEAgLTMwNyw0OCArMzE3LDUwIEBACiBhcmVhX2NsZWFyX25ldF90aXRsZSAoc3RydWN0IHZ0eSAqdnR5LCBjaGFyICpuZXRfdGl0bGUpCiB7CiAgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWE7Ci0gIHN0cnVjdCBhcmVhX2FkZHIgIGFkZHIsICphZGRycCA9IE5VTEw7CisgIHN0cnVjdCBhcmVhX2FkZHIgYWRkciwgKmFkZHJwID0gTlVMTDsKICAgc3RydWN0IGxpc3Rub2RlICpub2RlOwogICB1X2NoYXIgYnVmZlsyNTVdOwogCiAgIGFyZWEgPSB2dHktPmluZGV4OwotICBpZiAoIWFyZWEpIHsKLSAgICB2dHlfb3V0ICh2dHksICJDYW4ndCBmaW5kIElTSVMgaW5zdGFuY2UgJXMiLCBWVFlfTkVXTElORSk7Ci0gICAgcmV0dXJuIENNRF9XQVJOSU5HOwotICB9Ci0gIAorICBpZiAoIWFyZWEpCisgICAgeworICAgICAgdnR5X291dCAodnR5LCAiQ2FuJ3QgZmluZCBJU0lTIGluc3RhbmNlICVzIiwgVlRZX05FV0xJTkUpOworICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KKwogICBhZGRyLmFkZHJfbGVuID0gZG90Zm9ybWF0MmJ1ZmYgKGJ1ZmYsIG5ldF90aXRsZSk7Ci0gIGlmIChhZGRyLmFkZHJfbGVuIDwgOCB8fCBhZGRyLmFkZHJfbGVuID4gMjApIHsKLSAgICB2dHlfb3V0ICh2dHksICJVbnN1cHBvcnRlZCBhcmVhIGFkZHJlc3MgbGVuZ3RoICVkLCBzaG91bGQgYmUgOC4uLjIwICVzIiwgCi0JICAgICBhZGRyLmFkZHJfbGVuLCBWVFlfTkVXTElORSk7Ci0gICAgcmV0dXJuIENNRF9XQVJOSU5HOwotICB9Ci0gIAotICBtZW1jcHkoYWRkci5hcmVhX2FkZHIsIGJ1ZmYsIChpbnQpYWRkci5hZGRyX2xlbik7IAotICAKKyAgaWYgKGFkZHIuYWRkcl9sZW4gPCA4IHx8IGFkZHIuYWRkcl9sZW4gPiAyMCkKKyAgICB7CisgICAgICB2dHlfb3V0ICh2dHksICJVbnN1cHBvcnRlZCBhcmVhIGFkZHJlc3MgbGVuZ3RoICVkLCBzaG91bGQgYmUgOC4uLjIwICVzIiwKKwkgICAgICAgYWRkci5hZGRyX2xlbiwgVlRZX05FV0xJTkUpOworICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KKworICBtZW1jcHkgKGFkZHIuYXJlYV9hZGRyLCBidWZmLCAoaW50KSBhZGRyLmFkZHJfbGVuKTsKKwogICBMSVNUX0xPT1AgKGFyZWEtPmFyZWFfYWRkcnMsIGFkZHJwLCBub2RlKQogICAgIGlmIChhZGRycC0+YWRkcl9sZW4gPT0gYWRkci5hZGRyX2xlbiAmJgogCSFtZW1jbXAgKGFkZHJwLT5hcmVhX2FkZHIsIGFkZHIuYXJlYV9hZGRyLCBhZGRyLmFkZHJfbGVuKSkKLSAgICAgIGJyZWFrOwotICAKLSAgaWYgKCFhZGRycCkgewotICAgIHZ0eV9vdXQgKHZ0eSwgIk5vIGFyZWEgYWRkcmVzcyAlcyBmb3IgYXJlYSAlcyAlcyIsIG5ldF90aXRsZSwgCi0JICAgICBhcmVhLT5hcmVhX3RhZywgVlRZX05FV0xJTkUpOwotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQotICAKKyAgICBicmVhazsKKworICBpZiAoIWFkZHJwKQorICAgIHsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIk5vIGFyZWEgYWRkcmVzcyAlcyBmb3IgYXJlYSAlcyAlcyIsIG5ldF90aXRsZSwKKwkgICAgICAgYXJlYS0+YXJlYV90YWcsIFZUWV9ORVdMSU5FKTsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CisKICAgbGlzdG5vZGVfZGVsZXRlIChhcmVhLT5hcmVhX2FkZHJzLCBhZGRycCk7Ci0gIAorCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KIAotCiAvKgogICogJ3Nob3cgY2xucyBuZWlnaGJvcnMnIGNvbW1hbmQKICAqLwogCiBpbnQKLXNob3dfY2xuc19uZWlnaCAoc3RydWN0IHZ0eSAqdnR5LCBjaGFyIGRldGFpbCkgCitzaG93X2NsbnNfbmVpZ2ggKHN0cnVjdCB2dHkgKnZ0eSwgY2hhciBkZXRhaWwpCiB7CiAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZV9hcmVhLCAqbm9kZV9jaXJjOwogICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOwpAQCAtMzU2LDUzICszNjgsNjkgQEAKICAgc3RydWN0IGxpc3QgKmRiOwogICBpbnQgaTsKIAotICBpZiAoIWlzaXMpIHsKLSAgICB2dHlfb3V0ICh2dHksICJJUy1JUyBSb3V0aW5nIFByb2Nlc3Mgbm90IGVuYWJsZWQlcyIsIFZUWV9ORVdMSU5FKTsKLSAgICByZXR1cm4gQ01EX1NVQ0NFU1M7Ci0gIH0KKyAgaWYgKCFpc2lzKQorICAgIHsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIklTLUlTIFJvdXRpbmcgUHJvY2VzcyBub3QgZW5hYmxlZCVzIiwgVlRZX05FV0xJTkUpOworICAgICAgcmV0dXJuIENNRF9TVUNDRVNTOworICAgIH0KIAogICBmb3IgKG5vZGVfYXJlYSA9IGxpc3RoZWFkIChpc2lzLT5hcmVhX2xpc3QpOyBub2RlX2FyZWE7Ci0gICAgICAgbmV4dG5vZGUgKG5vZGVfYXJlYSkpIHsKLSAgICBhcmVhID0gZ2V0ZGF0YSAobm9kZV9hcmVhKTsKLSAgICB2dHlfb3V0ICh2dHksICJBcmVhICVzOiVzIiwgYXJlYS0+YXJlYV90YWcsIFZUWV9ORVdMSU5FKTsKKyAgICAgICBuZXh0bm9kZSAobm9kZV9hcmVhKSkKKyAgICB7CisgICAgICBhcmVhID0gZ2V0ZGF0YSAobm9kZV9hcmVhKTsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIkFyZWEgJXM6JXMiLCBhcmVhLT5hcmVhX3RhZywgVlRZX05FV0xJTkUpOwogCi0gICAgaWYgKGRldGFpbD09SVNJU19VSV9MRVZFTF9CUklFRikKLSAgICAgIHZ0eV9vdXQgKHZ0eSwgIiAgU3lzdGVtIElkICAgICAgICAgICBJbnRlcmZhY2UgICBMICBTdGF0ZSAgICAgICAgIgotICAgICAgICAgICAgICAgIkhvbGR0aW1lIFNOUEElcyIsIFZUWV9ORVdMSU5FKTsKKyAgICAgIGlmIChkZXRhaWwgPT0gSVNJU19VSV9MRVZFTF9CUklFRikKKwl2dHlfb3V0ICh2dHksICIgIFN5c3RlbSBJZCAgICAgICAgICAgSW50ZXJmYWNlICAgTCAgU3RhdGUgICAgICAgICIKKwkJICJIb2xkdGltZSBTTlBBJXMiLCBWVFlfTkVXTElORSk7CiAKLSAgICBmb3IgKG5vZGVfY2lyYyA9IGxpc3RoZWFkIChhcmVhLT5jaXJjdWl0X2xpc3QpOyBub2RlX2NpcmM7Ci0gICAgICAgICBuZXh0bm9kZSAobm9kZV9jaXJjKSkgewotICAgICAgY2lyY3VpdCA9IGdldGRhdGEgKG5vZGVfY2lyYyk7ICAgICAgCi0gICAgICBpZiAoY2lyY3VpdC0+Y2lyY190eXBlID09IENJUkNVSVRfVF9CUk9BRENBU1QpIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAgIGRiID0gY2lyY3VpdC0+dS5iYy5hZGpkYltpXTsKLSAgICAgICAgICBpZiAoZGIgJiYgZGItPmNvdW50KSB7Ci0gICAgICAgICAgICBpZiAoZGV0YWlsID09IElTSVNfVUlfTEVWRUxfQlJJRUYpCi0gICAgICAgICAgICAgIGlzaXNfYWRqZGJfaXRlcmF0ZSAoZGIsICh2b2lkICgqKSAoc3RydWN0IGlzaXNfYWRqYWNlbmN5ICosIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNpc19hZGpfcHJpbnRfdnR5LCB2dHkpOwkgIAotICAgICAgICAgICAgaWYgKGRldGFpbCA9PSBJU0lTX1VJX0xFVkVMX0RFVEFJTCkKLSAgICAgICAgICAgICAgaXNpc19hZGpkYl9pdGVyYXRlIChkYiwgKHZvaWQgKCopIChzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2lzX2Fkal9wcmludF92dHlfZGV0YWlsLCB2dHkpOwkgIAotICAgICAgICAgICAgaWYgKGRldGFpbCA9PSBJU0lTX1VJX0xFVkVMX0VYVEVOU0lWRSkKLSAgICAgICAgICAgICAgaXNpc19hZGpkYl9pdGVyYXRlIChkYiwgKHZvaWQgKCopIChzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzaXNfYWRqX3ByaW50X3Z0eV9leHRlbnNpdmUsIHZ0eSk7CSAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSA9PSBDSVJDVUlUX1RfUDJQICYmIAotICAgICAgICAgICAgICAgICBjaXJjdWl0LT51LnAycC5uZWlnaGJvcikgewotICAgICAgICBpZiAoZGV0YWlsPT1JU0lTX1VJX0xFVkVMX0JSSUVGKQotCSAgaXNpc19hZGpfcDJwX3ByaW50X3Z0eSAoY2lyY3VpdC0+dS5wMnAubmVpZ2hib3IsIHZ0eSk7Ci0JaWYgKGRldGFpbD09SVNJU19VSV9MRVZFTF9ERVRBSUwpCi0gICAgICAgICAgaXNpc19hZGpfcDJwX3ByaW50X3Z0eV9kZXRhaWwgKGNpcmN1aXQtPnUucDJwLm5laWdoYm9yLCB2dHkpOwotICAgICAgICBpZiAoZGV0YWlsPT1JU0lTX1VJX0xFVkVMX0VYVEVOU0lWRSkKLSAgICAgICAgICBpc2lzX2Fkal9wMnBfcHJpbnRfdnR5X2V4dGVuc2l2ZSAoY2lyY3VpdC0+dS5wMnAubmVpZ2hib3IsIHZ0eSk7Ci0gICAgICB9ICAgICAKKyAgICAgIGZvciAobm9kZV9jaXJjID0gbGlzdGhlYWQgKGFyZWEtPmNpcmN1aXRfbGlzdCk7IG5vZGVfY2lyYzsKKwkgICBuZXh0bm9kZSAobm9kZV9jaXJjKSkKKwl7CisJICBjaXJjdWl0ID0gZ2V0ZGF0YSAobm9kZV9jaXJjKTsKKwkgIGlmIChjaXJjdWl0LT5jaXJjX3R5cGUgPT0gQ0lSQ1VJVF9UX0JST0FEQ0FTVCkKKwkgICAgeworCSAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCXsKKwkJICBkYiA9IGNpcmN1aXQtPnUuYmMuYWRqZGJbaV07CisJCSAgaWYgKGRiICYmIGRiLT5jb3VudCkKKwkJICAgIHsKKwkJICAgICAgaWYgKGRldGFpbCA9PSBJU0lTX1VJX0xFVkVMX0JSSUVGKQorCQkJaXNpc19hZGpkYl9pdGVyYXRlIChkYiwKKwkJCQkJICAgICh2b2lkICgqKQorCQkJCQkgICAgIChzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKiwKKwkJCQkJICAgICAgdm9pZCAqKSkgaXNpc19hZGpfcHJpbnRfdnR5LAorCQkJCQkgICAgdnR5KTsKKwkJICAgICAgaWYgKGRldGFpbCA9PSBJU0lTX1VJX0xFVkVMX0RFVEFJTCkKKwkJCWlzaXNfYWRqZGJfaXRlcmF0ZSAoZGIsCisJCQkJCSAgICAodm9pZCAoKikKKwkJCQkJICAgICAoc3RydWN0IGlzaXNfYWRqYWNlbmN5ICosCisJCQkJCSAgICAgIHZvaWQgKikpCisJCQkJCSAgICBpc2lzX2Fkal9wcmludF92dHlfZGV0YWlsLCB2dHkpOworCQkgICAgICBpZiAoZGV0YWlsID09IElTSVNfVUlfTEVWRUxfRVhURU5TSVZFKQorCQkJaXNpc19hZGpkYl9pdGVyYXRlIChkYiwKKwkJCQkJICAgICh2b2lkICgqKQorCQkJCQkgICAgIChzdHJ1Y3QgaXNpc19hZGphY2VuY3kgKiwKKwkJCQkJICAgICAgdm9pZCAqKSkKKwkJCQkJICAgIGlzaXNfYWRqX3ByaW50X3Z0eV9leHRlbnNpdmUsCisJCQkJCSAgICB2dHkpOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKGNpcmN1aXQtPmNpcmNfdHlwZSA9PSBDSVJDVUlUX1RfUDJQICYmCisJCSAgIGNpcmN1aXQtPnUucDJwLm5laWdoYm9yKQorCSAgICB7CisJICAgICAgaWYgKGRldGFpbCA9PSBJU0lTX1VJX0xFVkVMX0JSSUVGKQorCQlpc2lzX2Fkal9wMnBfcHJpbnRfdnR5IChjaXJjdWl0LT51LnAycC5uZWlnaGJvciwgdnR5KTsKKwkgICAgICBpZiAoZGV0YWlsID09IElTSVNfVUlfTEVWRUxfREVUQUlMKQorCQlpc2lzX2Fkal9wMnBfcHJpbnRfdnR5X2RldGFpbCAoY2lyY3VpdC0+dS5wMnAubmVpZ2hib3IsIHZ0eSk7CisJICAgICAgaWYgKGRldGFpbCA9PSBJU0lTX1VJX0xFVkVMX0VYVEVOU0lWRSkKKwkJaXNpc19hZGpfcDJwX3ByaW50X3Z0eV9leHRlbnNpdmUgKGNpcmN1aXQtPnUucDJwLm5laWdoYm9yLAorCQkJCQkJICB2dHkpOworCSAgICB9CisJfQogICAgIH0KLSAgfQotICAKKwogICByZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKQEAgLTQxMyw3ICs0NDEsNyBAQAogICAgICAgICJjbG5zIG5ldHdvcmsgaW5mb3JtYXRpb25cbiIKICAgICAgICAiQ0xOUyBuZWlnaGJvciBhZGphY2VuY2llc1xuIikKIHsKLSAgcmV0dXJuIHNob3dfY2xuc19uZWlnaCh2dHksIElTSVNfVUlfTEVWRUxfQlJJRUYpOworICByZXR1cm4gc2hvd19jbG5zX25laWdoICh2dHksIElTSVNfVUlfTEVWRUxfQlJJRUYpOwogfQogCiBBTElBUyAoc2hvd19jbG5zX25laWdoYm9ycywKQEAgLTQzMSw3ICs0NTksNyBAQAogICAgICAgICJDTE5TIG5laWdoYm9yIGFkamFjZW5jaWVzXG4iCiAgICAgICAgInNob3cgZGV0YWlsZWQgaW5mb3JtYXRpb25cbiIpCiB7Ci0gIHJldHVybiBzaG93X2NsbnNfbmVpZ2godnR5LCBJU0lTX1VJX0xFVkVMX0RFVEFJTCk7CisgIHJldHVybiBzaG93X2NsbnNfbmVpZ2ggKHZ0eSwgSVNJU19VSV9MRVZFTF9ERVRBSUwpOwogfQogCiBBTElBUyAoc2hvd19jbG5zX25laWdoYm9yc19kZXRhaWwsCkBAIC00NDEsNTMgKzQ2OSw0OSBAQAogICAgICAgICJJUy1JUyBuZXR3b3JrIGluZm9ybWF0aW9uXG4iCiAgICAgICAgIklTLUlTIG5laWdoYm9yIGFkamFjZW5jaWVzXG4iCiAgICAgICAgInNob3cgZGV0YWlsZWQgaW5mb3JtYXRpb25cbiIpCi0KIC8qCiAgKiAnaXNpcyBkZWJ1ZycsICdzaG93IGRlYnVnZ2luZycKICAqLwotCiB2b2lkCiBwcmludF9kZWJ1ZyAoc3RydWN0IHZ0eSAqdnR5LCBpbnQgZmxhZ3MsIGludCBvbm9mZikKIHsKICAgY2hhciBvbm9mZnNbNF07CiAgIGlmIChvbm9mZikKLSAgICBzdHJjcHkgKG9ub2Zmcywib24iKTsKKyAgICBzdHJjcHkgKG9ub2ZmcywgIm9uIik7CiAgIGVsc2UKLSAgICBzdHJjcHkgKG9ub2Zmcywib2ZmIik7CisgICAgc3RyY3B5IChvbm9mZnMsICJvZmYiKTsKIAogICBpZiAoZmxhZ3MgJiBERUJVR19BREpfUEFDS0VUUykKLSAgICB2dHlfb3V0ICh2dHksIklTLUlTIEFkamFjZW5jeSByZWxhdGVkIHBhY2tldHMgZGVidWdnaW5nIGlzICVzJXMiLCBvbm9mZnMsIAotICAgICAgICAgICAgIFZUWV9ORVdMSU5FKTsKKyAgICB2dHlfb3V0ICh2dHksICJJUy1JUyBBZGphY2VuY3kgcmVsYXRlZCBwYWNrZXRzIGRlYnVnZ2luZyBpcyAlcyVzIiwgb25vZmZzLAorCSAgICAgVlRZX05FV0xJTkUpOwogICBpZiAoZmxhZ3MgJiBERUJVR19DSEVDS1NVTV9FUlJPUlMpCi0gICAgdnR5X291dCAodnR5LCJJUy1JUyBjaGVja3N1bSBlcnJvcnMgZGVidWdnaW5nIGlzICVzJXMiLCBvbm9mZnMsIAotICAgICAgICAgICAgIFZUWV9ORVdMSU5FKTsKKyAgICB2dHlfb3V0ICh2dHksICJJUy1JUyBjaGVja3N1bSBlcnJvcnMgZGVidWdnaW5nIGlzICVzJXMiLCBvbm9mZnMsCisJICAgICBWVFlfTkVXTElORSk7CiAgIGlmIChmbGFncyAmIERFQlVHX0xPQ0FMX1VQREFURVMpCi0gICAgdnR5X291dCAodnR5LCJJUy1JUyBsb2NhbCB1cGRhdGVzIGRlYnVnZ2luZyBpcyAlcyVzIiwgb25vZmZzLCAKLSAgICAgICAgICAgICBWVFlfTkVXTElORSk7CisgICAgdnR5X291dCAodnR5LCAiSVMtSVMgbG9jYWwgdXBkYXRlcyBkZWJ1Z2dpbmcgaXMgJXMlcyIsIG9ub2ZmcywKKwkgICAgIFZUWV9ORVdMSU5FKTsKICAgaWYgKGZsYWdzICYgREVCVUdfUFJPVE9DT0xfRVJST1JTKQotICAgIHZ0eV9vdXQgKHZ0eSwiSVMtSVMgcHJvdG9jb2wgZXJyb3JzIGRlYnVnZ2luZyBpcyAlcyVzIiwgb25vZmZzLCAKLSAgICAgICAgICAgICBWVFlfTkVXTElORSk7CisgICAgdnR5X291dCAodnR5LCAiSVMtSVMgcHJvdG9jb2wgZXJyb3JzIGRlYnVnZ2luZyBpcyAlcyVzIiwgb25vZmZzLAorCSAgICAgVlRZX05FV0xJTkUpOwogICBpZiAoZmxhZ3MgJiBERUJVR19TTlBfUEFDS0VUUykKLSAgICB2dHlfb3V0ICh2dHksIklTLUlTIENTTlAvUFNOUCBwYWNrZXRzIGRlYnVnZ2luZyBpcyAlcyVzIiwgb25vZmZzLCAKLSAgICAgICAgICAgICBWVFlfTkVXTElORSk7CisgICAgdnR5X291dCAodnR5LCAiSVMtSVMgQ1NOUC9QU05QIHBhY2tldHMgZGVidWdnaW5nIGlzICVzJXMiLCBvbm9mZnMsCisJICAgICBWVFlfTkVXTElORSk7CiAgIGlmIChmbGFncyAmIERFQlVHX1NQRl9FVkVOVFMpCi0gICAgdnR5X291dCAodnR5LCJJUy1JUyBTUEYgZXZlbnRzIGRlYnVnZ2luZyBpcyAlcyVzIiwgb25vZmZzLCAKLSAgICAgICAgICAgICBWVFlfTkVXTElORSk7CisgICAgdnR5X291dCAodnR5LCAiSVMtSVMgU1BGIGV2ZW50cyBkZWJ1Z2dpbmcgaXMgJXMlcyIsIG9ub2ZmcywgVlRZX05FV0xJTkUpOwogICBpZiAoZmxhZ3MgJiBERUJVR19TUEZfU1RBVFMpCi0gICAgdnR5X291dCAodnR5LCJJUy1JUyBTUEYgVGltaW5nIGFuZCBTdGF0aXN0aWNzIERhdGEgZGVidWdnaW5nIGlzICVzJXMiLCAKLSAgICAgICAgICAgICBvbm9mZnMsIFZUWV9ORVdMSU5FKTsKKyAgICB2dHlfb3V0ICh2dHksICJJUy1JUyBTUEYgVGltaW5nIGFuZCBTdGF0aXN0aWNzIERhdGEgZGVidWdnaW5nIGlzICVzJXMiLAorCSAgICAgb25vZmZzLCBWVFlfTkVXTElORSk7CiAgIGlmIChmbGFncyAmIERFQlVHX1NQRl9UUklHR0VSUykKLSAgICB2dHlfb3V0ICh2dHksIklTLUlTIFNQRiB0cmlnZ2VyaW5nIGV2ZW50cyBkZWJ1Z2dpbmcgaXMgJXMlcyIsIG9ub2ZmcywgCi0gICAgICAgICAgICAgVlRZX05FV0xJTkUpOworICAgIHZ0eV9vdXQgKHZ0eSwgIklTLUlTIFNQRiB0cmlnZ2VyaW5nIGV2ZW50cyBkZWJ1Z2dpbmcgaXMgJXMlcyIsIG9ub2ZmcywKKwkgICAgIFZUWV9ORVdMSU5FKTsKICAgaWYgKGZsYWdzICYgREVCVUdfVVBEQVRFX1BBQ0tFVFMpCi0gICAgdnR5X291dCAodnR5LCJJUy1JUyBVcGRhdGUgcmVsYXRlZCBwYWNrZXQgZGVidWdnaW5nIGlzICVzJXMiLCBvbm9mZnMsIAotICAgICAgICAgICAgIFZUWV9ORVdMSU5FKTsKKyAgICB2dHlfb3V0ICh2dHksICJJUy1JUyBVcGRhdGUgcmVsYXRlZCBwYWNrZXQgZGVidWdnaW5nIGlzICVzJXMiLCBvbm9mZnMsCisJICAgICBWVFlfTkVXTElORSk7CiAgIGlmIChmbGFncyAmIERFQlVHX1JURV9FVkVOVFMpCi0gICAgdnR5X291dCAodnR5LCJJUy1JUyBSb3V0ZSByZWxhdGVkIGRlYnVnZ2luIGlzICVzJXMiLCBvbm9mZnMsIAotICAgICAgICAgICAgIFZUWV9ORVdMSU5FKTsKKyAgICB2dHlfb3V0ICh2dHksICJJUy1JUyBSb3V0ZSByZWxhdGVkIGRlYnVnZ2luIGlzICVzJXMiLCBvbm9mZnMsCisJICAgICBWVFlfTkVXTElORSk7CiAgIGlmIChmbGFncyAmIERFQlVHX0VWRU5UUykKLSAgICB2dHlfb3V0ICh2dHksIklTLUlTIEV2ZW50IGRlYnVnZ2luZyBpcyAlcyVzIiwgb25vZmZzLCAKLSAgICAgICAgICAgICBWVFlfTkVXTElORSk7CisgICAgdnR5X291dCAodnR5LCAiSVMtSVMgRXZlbnQgZGVidWdnaW5nIGlzICVzJXMiLCBvbm9mZnMsIFZUWV9ORVdMSU5FKTsKIAogfQogCkBAIC00OTcsMTcgKzUyMSwxNiBAQAogICAgICAgIFNIT1dfU1RSCiAgICAgICAgIlN0YXRlIG9mIGVhY2ggZGVidWdnaW5nIG9wdGlvblxuIikKIHsKLSAgdnR5X291dCAodnR5LCJJUy1JUzolcyIsIFZUWV9ORVdMSU5FKTsKKyAgdnR5X291dCAodnR5LCAiSVMtSVM6JXMiLCBWVFlfTkVXTElORSk7CiAgIHByaW50X2RlYnVnICh2dHksIGlzaXMtPmRlYnVncywgMSk7CiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KIAogLyogRGVidWcgbm9kZS4gKi8KLXN0YXRpYyBzdHJ1Y3QgY21kX25vZGUgZGVidWdfbm9kZSA9Ci17CitzdGF0aWMgc3RydWN0IGNtZF9ub2RlIGRlYnVnX25vZGUgPSB7CiAgIERFQlVHX05PREUsCi0gIiIsCi0gMQorICAiIiwKKyAgMQogfTsKIAogc3RhdGljIGludApAQCAtNTE2LDYxICs1MzksNjEgQEAKICAgaW50IHdyaXRlID0gMDsKICAgaW50IGZsYWdzID0gaXNpcy0+ZGVidWdzOwogCi0gIGlmIChmbGFncyAmIERFQlVHX0FESl9QQUNLRVRTKSB7Ci0gICAgdnR5X291dCAodnR5LCAiZGVidWcgaXNpcyBhZGotcGFja2V0cyVzIiwKLSAgICAgICAgICAgICBWVFlfTkVXTElORSk7Ci0gICAgd3JpdGUrKzsKLSAgfQotICBpZiAoZmxhZ3MgJiBERUJVR19DSEVDS1NVTV9FUlJPUlMpIHsKLSAgICB2dHlfb3V0ICh2dHksICJkZWJ1ZyBpc2lzIGNoZWNrc3VtLWVycm9ycyVzIiwKLSAgICAgICAgICAgICBWVFlfTkVXTElORSk7Ci0gICAgd3JpdGUrKzsKLSAgfQotICBpZiAoZmxhZ3MgJiBERUJVR19MT0NBTF9VUERBVEVTKSB7Ci0gICAgdnR5X291dCAodnR5LCAiZGVidWcgaXNpcyBsb2NhbC11cGRhdGVzJXMiLAotICAgICAgICAgICAgIFZUWV9ORVdMSU5FKTsKLSAgICB3cml0ZSsrOwotICB9Ci0gIGlmIChmbGFncyAmIERFQlVHX1BST1RPQ09MX0VSUk9SUykgewotICAgIHZ0eV9vdXQgKHZ0eSwgImRlYnVnIGlzaXMgcHJvdG9jb2wtZXJyb3JzJXMiLCAgCi0gICAgICAgICAgICAgVlRZX05FV0xJTkUpOwotICAgIHdyaXRlKys7Ci0gIH0KLSAgaWYgKGZsYWdzICYgREVCVUdfU05QX1BBQ0tFVFMpIHsKLSAgICB2dHlfb3V0ICh2dHksICJkZWJ1ZyBpc2lzIHNucC1wYWNrZXRzJXMiLAotICAgICAgICAgICAgIFZUWV9ORVdMSU5FKTsKLSAgICB3cml0ZSsrOwotICB9Ci0gIGlmIChmbGFncyAmIERFQlVHX1NQRl9FVkVOVFMpIHsKLSAgICB2dHlfb3V0ICh2dHksICJkZWJ1ZyBpc2lzIHNwZi1ldmVudHMlcyIsCi0gICAgICAgICAgICAgVlRZX05FV0xJTkUpOwotICAgIHdyaXRlKys7Ci0gIH0KLSAgaWYgKGZsYWdzICYgREVCVUdfU1BGX1NUQVRTKSB7Ci0gICAgdnR5X291dCAodnR5LCAiZGVidWcgaXNpcyBzcGYtc3RhdGlzdGljcyVzIiwKLSAgICAgICAgICAgICBWVFlfTkVXTElORSk7Ci0gICAgd3JpdGUrKzsKLSAgfQotICBpZiAoZmxhZ3MgJiBERUJVR19TUEZfVFJJR0dFUlMpIHsKLSAgICB2dHlfb3V0ICh2dHksICJkZWJ1ZyBpc2lzIHNwZi10cmlnZ2VycyVzIiwKLSAgICAgICAgICAgICBWVFlfTkVXTElORSk7Ci0gICAgd3JpdGUrKzsKLSAgfQotICBpZiAoZmxhZ3MgJiBERUJVR19VUERBVEVfUEFDS0VUUykgewotICAgIHZ0eV9vdXQgKHZ0eSwgImRlYnVnIGlzaXMgdXBkYXRlLXBhY2tldHMlcyIsCi0gICAgICAgICAgICAgVlRZX05FV0xJTkUpOwotICAgIHdyaXRlKys7Ci0gIH0KLSAgaWYgKGZsYWdzICYgREVCVUdfUlRFX0VWRU5UUykgewotICAgIHZ0eV9vdXQgKHZ0eSwgImRlYnVnIGlzaXMgcm91dGUtZXZlbnRzJXMiLAotICAgICAgICAgICAgIFZUWV9ORVdMSU5FKTsKLSAgICB3cml0ZSsrOwotICB9Ci0gIGlmIChmbGFncyAmIERFQlVHX0VWRU5UUykgewotICAgIHZ0eV9vdXQgKHZ0eSwgImRlYnVnIGlzaXMgZXZlbnRzJXMiLAotICAgICAgICAgICAgIFZUWV9ORVdMSU5FKTsKLSAgICB3cml0ZSsrOwotICB9CisgIGlmIChmbGFncyAmIERFQlVHX0FESl9QQUNLRVRTKQorICAgIHsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgImRlYnVnIGlzaXMgYWRqLXBhY2tldHMlcyIsIFZUWV9ORVdMSU5FKTsKKyAgICAgIHdyaXRlKys7CisgICAgfQorICBpZiAoZmxhZ3MgJiBERUJVR19DSEVDS1NVTV9FUlJPUlMpCisgICAgeworICAgICAgdnR5X291dCAodnR5LCAiZGVidWcgaXNpcyBjaGVja3N1bS1lcnJvcnMlcyIsIFZUWV9ORVdMSU5FKTsKKyAgICAgIHdyaXRlKys7CisgICAgfQorICBpZiAoZmxhZ3MgJiBERUJVR19MT0NBTF9VUERBVEVTKQorICAgIHsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgImRlYnVnIGlzaXMgbG9jYWwtdXBkYXRlcyVzIiwgVlRZX05FV0xJTkUpOworICAgICAgd3JpdGUrKzsKKyAgICB9CisgIGlmIChmbGFncyAmIERFQlVHX1BST1RPQ09MX0VSUk9SUykKKyAgICB7CisgICAgICB2dHlfb3V0ICh2dHksICJkZWJ1ZyBpc2lzIHByb3RvY29sLWVycm9ycyVzIiwgVlRZX05FV0xJTkUpOworICAgICAgd3JpdGUrKzsKKyAgICB9CisgIGlmIChmbGFncyAmIERFQlVHX1NOUF9QQUNLRVRTKQorICAgIHsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgImRlYnVnIGlzaXMgc25wLXBhY2tldHMlcyIsIFZUWV9ORVdMSU5FKTsKKyAgICAgIHdyaXRlKys7CisgICAgfQorICBpZiAoZmxhZ3MgJiBERUJVR19TUEZfRVZFTlRTKQorICAgIHsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgImRlYnVnIGlzaXMgc3BmLWV2ZW50cyVzIiwgVlRZX05FV0xJTkUpOworICAgICAgd3JpdGUrKzsKKyAgICB9CisgIGlmIChmbGFncyAmIERFQlVHX1NQRl9TVEFUUykKKyAgICB7CisgICAgICB2dHlfb3V0ICh2dHksICJkZWJ1ZyBpc2lzIHNwZi1zdGF0aXN0aWNzJXMiLCBWVFlfTkVXTElORSk7CisgICAgICB3cml0ZSsrOworICAgIH0KKyAgaWYgKGZsYWdzICYgREVCVUdfU1BGX1RSSUdHRVJTKQorICAgIHsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgImRlYnVnIGlzaXMgc3BmLXRyaWdnZXJzJXMiLCBWVFlfTkVXTElORSk7CisgICAgICB3cml0ZSsrOworICAgIH0KKyAgaWYgKGZsYWdzICYgREVCVUdfVVBEQVRFX1BBQ0tFVFMpCisgICAgeworICAgICAgdnR5X291dCAodnR5LCAiZGVidWcgaXNpcyB1cGRhdGUtcGFja2V0cyVzIiwgVlRZX05FV0xJTkUpOworICAgICAgd3JpdGUrKzsKKyAgICB9CisgIGlmIChmbGFncyAmIERFQlVHX1JURV9FVkVOVFMpCisgICAgeworICAgICAgdnR5X291dCAodnR5LCAiZGVidWcgaXNpcyByb3V0ZS1ldmVudHMlcyIsIFZUWV9ORVdMSU5FKTsKKyAgICAgIHdyaXRlKys7CisgICAgfQorICBpZiAoZmxhZ3MgJiBERUJVR19FVkVOVFMpCisgICAgeworICAgICAgdnR5X291dCAodnR5LCAiZGVidWcgaXNpcyBldmVudHMlcyIsIFZUWV9ORVdMSU5FKTsKKyAgICAgIHdyaXRlKys7CisgICAgfQogCiAgIHJldHVybiB3cml0ZTsKIH0KQEAgLTU4MCwxMSArNjAzLDEwIEBACiAgICAgICAgImRlYnVnIGlzaXMgYWRqLXBhY2tldHMiLAogICAgICAgIERFQlVHX1NUUgogICAgICAgICJJUy1JUyBpbmZvcm1hdGlvblxuIgotICAgICAgICJJUy1JUyBBZGphY2VuY3kgcmVsYXRlZCBwYWNrZXRzXG4iCi0gICAgICAgKQorICAgICAgICJJUy1JUyBBZGphY2VuY3kgcmVsYXRlZCBwYWNrZXRzXG4iKQogewogICBpc2lzLT5kZWJ1Z3MgfD0gREVCVUdfQURKX1BBQ0tFVFM7Ci0gIHByaW50X2RlYnVnICh2dHksREVCVUdfQURKX1BBQ0tFVFMsMSk7CisgIHByaW50X2RlYnVnICh2dHksIERFQlVHX0FESl9QQUNLRVRTLCAxKTsKIAogICByZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CkBAIC01OTQsMjQgKzYxNiwyMCBAQAogICAgICAgICJubyBkZWJ1ZyBpc2lzIGFkai1wYWNrZXRzIiwKICAgICAgICBVTkRFQlVHX1NUUgogICAgICAgICJJUy1JUyBpbmZvcm1hdGlvblxuIgotICAgICAgICJJUy1JUyBBZGphY2VuY3kgcmVsYXRlZCBwYWNrZXRzXG4iCi0gICAgICAgKQorICAgICAgICJJUy1JUyBBZGphY2VuY3kgcmVsYXRlZCBwYWNrZXRzXG4iKQogewotCiAgIGlzaXMtPmRlYnVncyAmPSB+REVCVUdfQURKX1BBQ0tFVFM7CiAgIHByaW50X2RlYnVnICh2dHksIERFQlVHX0FESl9QQUNLRVRTLCAwKTsKIAogICByZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKLQogREVGVU4gKGRlYnVnX2lzaXNfY3N1bSwKICAgICAgICBkZWJ1Z19pc2lzX2NzdW1fY21kLAogICAgICAgICJkZWJ1ZyBpc2lzIGNoZWNrc3VtLWVycm9ycyIsCiAgICAgICAgREVCVUdfU1RSCiAgICAgICAgIklTLUlTIGluZm9ybWF0aW9uXG4iCi0gICAgICAgIklTLUlTIExTUCBjaGVja3N1bSBlcnJvcnNcbiIKLSAgICAgICApCisgICAgICAgIklTLUlTIExTUCBjaGVja3N1bSBlcnJvcnNcbiIpCiB7CiAgIGlzaXMtPmRlYnVncyB8PSBERUJVR19DSEVDS1NVTV9FUlJPUlM7CiAgIHByaW50X2RlYnVnICh2dHksIERFQlVHX0NIRUNLU1VNX0VSUk9SUywgMSk7CkBAIC02MjQsMTIgKzY0MiwxMSBAQAogICAgICAgICJubyBkZWJ1ZyBpc2lzIGNoZWNrc3VtLWVycm9ycyIsCiAgICAgICAgVU5ERUJVR19TVFIKICAgICAgICAiSVMtSVMgaW5mb3JtYXRpb25cbiIKLSAgICAgICAiSVMtSVMgTFNQIGNoZWNrc3VtIGVycm9yc1xuIgotICAgICAgICkKKyAgICAgICAiSVMtSVMgTFNQIGNoZWNrc3VtIGVycm9yc1xuIikKIHsKICAgaXNpcy0+ZGVidWdzICY9IH5ERUJVR19DSEVDS1NVTV9FUlJPUlM7CiAgIHByaW50X2RlYnVnICh2dHksIERFQlVHX0NIRUNLU1VNX0VSUk9SUywgMCk7Ci0gIAorCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KIApAQCAtNjM4LDggKzY1NSw3IEBACiAgICAgICAgImRlYnVnIGlzaXMgbG9jYWwtdXBkYXRlcyIsCiAgICAgICAgREVCVUdfU1RSCiAgICAgICAgIklTLUlTIGluZm9ybWF0aW9uXG4iCi0gICAgICAgIklTLUlTIGxvY2FsIHVwZGF0ZSBwYWNrZXRzXG4iCi0gICAgICAgKQorICAgICAgICJJUy1JUyBsb2NhbCB1cGRhdGUgcGFja2V0c1xuIikKIHsKICAgaXNpcy0+ZGVidWdzIHw9IERFQlVHX0xPQ0FMX1VQREFURVM7CiAgIHByaW50X2RlYnVnICh2dHksIERFQlVHX0xPQ0FMX1VQREFURVMsIDEpOwpAQCAtNjUyLDIyICs2NjgsMjAgQEAKICAgICAgICAibm8gZGVidWcgaXNpcyBsb2NhbC11cGRhdGVzIiwKICAgICAgICBVTkRFQlVHX1NUUgogICAgICAgICJJUy1JUyBpbmZvcm1hdGlvblxuIgotICAgICAgICJJUy1JUyBsb2NhbCB1cGRhdGUgcGFja2V0c1xuIgotICAgICAgICkKKyAgICAgICAiSVMtSVMgbG9jYWwgdXBkYXRlIHBhY2tldHNcbiIpCiB7CiAgIGlzaXMtPmRlYnVncyAmPSB+REVCVUdfTE9DQUxfVVBEQVRFUzsKLSAgcHJpbnRfZGVidWcgKHZ0eSwgREVCVUdfTE9DQUxfVVBEQVRFUyAsIDApOwotICAKKyAgcHJpbnRfZGVidWcgKHZ0eSwgREVCVUdfTE9DQUxfVVBEQVRFUywgMCk7CisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCiBERUZVTiAoZGVidWdfaXNpc19lcnIsCiAgICAgICAgZGVidWdfaXNpc19lcnJfY21kLAotICAgICAgICJkZWJ1ZyBpc2lzIHByb3RvY29sLWVycm9ycyIsICAKKyAgICAgICAiZGVidWcgaXNpcyBwcm90b2NvbC1lcnJvcnMiLAogICAgICAgIERFQlVHX1NUUgogICAgICAgICJJUy1JUyBpbmZvcm1hdGlvblxuIgotICAgICAgICJJUy1JUyBMU1AgcHJvdG9jb2wgZXJyb3JzXG4iCi0gICAgICAgKQorICAgICAgICJJUy1JUyBMU1AgcHJvdG9jb2wgZXJyb3JzXG4iKQogewogICBpc2lzLT5kZWJ1Z3MgfD0gREVCVUdfUFJPVE9DT0xfRVJST1JTOwogICBwcmludF9kZWJ1ZyAodnR5LCBERUJVR19QUk9UT0NPTF9FUlJPUlMsIDEpOwpAQCAtNjgwLDEyICs2OTQsMTEgQEAKICAgICAgICAibm8gZGVidWcgaXNpcyBwcm90b2NvbC1lcnJvcnMiLAogICAgICAgIFVOREVCVUdfU1RSCiAgICAgICAgIklTLUlTIGluZm9ybWF0aW9uXG4iCi0gICAgICAgIklTLUlTIExTUCBwcm90b2NvbCBlcnJvcnNcbiIKLSAgICAgICApCisgICAgICAgIklTLUlTIExTUCBwcm90b2NvbCBlcnJvcnNcbiIpCiB7CiAgIGlzaXMtPmRlYnVncyAmPSB+REVCVUdfUFJPVE9DT0xfRVJST1JTOwogICBwcmludF9kZWJ1ZyAodnR5LCBERUJVR19QUk9UT0NPTF9FUlJPUlMsIDApOwotICAKKwogICByZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKQEAgLTY5NCw4ICs3MDcsNyBAQAogICAgICAgICJkZWJ1ZyBpc2lzIHNucC1wYWNrZXRzIiwKICAgICAgICBERUJVR19TVFIKICAgICAgICAiSVMtSVMgaW5mb3JtYXRpb25cbiIKLSAgICAgICAiSVMtSVMgQ1NOUC9QU05QIHBhY2tldHNcbiIKLSAgICAgICApCisgICAgICAgIklTLUlTIENTTlAvUFNOUCBwYWNrZXRzXG4iKQogewogICBpc2lzLT5kZWJ1Z3MgfD0gREVCVUdfU05QX1BBQ0tFVFM7CiAgIHByaW50X2RlYnVnICh2dHksIERFQlVHX1NOUF9QQUNLRVRTLCAxKTsKQEAgLTcwOCwyNCArNzIwLDIwIEBACiAgICAgICAgIm5vIGRlYnVnIGlzaXMgc25wLXBhY2tldHMiLAogICAgICAgIFVOREVCVUdfU1RSCiAgICAgICAgIklTLUlTIGluZm9ybWF0aW9uXG4iCi0gICAgICAgIklTLUlTIENTTlAvUFNOUCBwYWNrZXRzXG4iCi0gICAgICAgKQorICAgICAgICJJUy1JUyBDU05QL1BTTlAgcGFja2V0c1xuIikKIHsKLSAgaXNpcy0+ZGVidWdzICY9IH5ERUJVR19TTlBfUEFDS0VUUyA7CisgIGlzaXMtPmRlYnVncyAmPSB+REVCVUdfU05QX1BBQ0tFVFM7CiAgIHByaW50X2RlYnVnICh2dHksIERFQlVHX1NOUF9QQUNLRVRTLCAwKTsKLSAgCisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCi0KLQogREVGVU4gKGRlYnVnX2lzaXNfdXBkLAogICAgICAgIGRlYnVnX2lzaXNfdXBkX2NtZCwKICAgICAgICAiZGVidWcgaXNpcyB1cGRhdGUtcGFja2V0cyIsCiAgICAgICAgREVCVUdfU1RSCiAgICAgICAgIklTLUlTIGluZm9ybWF0aW9uXG4iCi0gICAgICAgIklTLUlTIFVwZGF0ZSByZWxhdGVkIHBhY2tldHNcbiIKLSAgICAgICApCisgICAgICAgIklTLUlTIFVwZGF0ZSByZWxhdGVkIHBhY2tldHNcbiIpCiB7CiAgIGlzaXMtPmRlYnVncyB8PSBERUJVR19VUERBVEVfUEFDS0VUUzsKICAgcHJpbnRfZGVidWcgKHZ0eSwgREVCVUdfVVBEQVRFX1BBQ0tFVFMsIDEpOwpAQCAtNzM4LDI2ICs3NDYsMjMgQEAKICAgICAgICAibm8gZGVidWcgaXNpcyB1cGRhdGUtcGFja2V0cyIsCiAgICAgICAgVU5ERUJVR19TVFIKICAgICAgICAiSVMtSVMgaW5mb3JtYXRpb25cbiIKLSAgICAgICAiSVMtSVMgVXBkYXRlIHJlbGF0ZWQgcGFja2V0c1xuIgotICAgICAgICkKKyAgICAgICAiSVMtSVMgVXBkYXRlIHJlbGF0ZWQgcGFja2V0c1xuIikKIHsKICAgaXNpcy0+ZGVidWdzICY9IH5ERUJVR19VUERBVEVfUEFDS0VUUzsKICAgcHJpbnRfZGVidWcgKHZ0eSwgREVCVUdfVVBEQVRFX1BBQ0tFVFMsIDApOwotICAKKwogICByZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKLQogREVGVU4gKGRlYnVnX2lzaXNfc3BmZXZlbnRzLAogICAgICAgIGRlYnVnX2lzaXNfc3BmZXZlbnRzX2NtZCwKICAgICAgICAiZGVidWcgaXNpcyBzcGYtZXZlbnRzIiwKICAgICAgICBERUJVR19TVFIKICAgICAgICAiSVMtSVMgaW5mb3JtYXRpb25cbiIKLSAgICAgICAiSVMtSVMgU2hvcnRlc3QgUGF0aCBGaXJzdCBFdmVudHNcbiIKLSAgICAgICApCisgICAgICAgIklTLUlTIFNob3J0ZXN0IFBhdGggRmlyc3QgRXZlbnRzXG4iKQogewogICBpc2lzLT5kZWJ1Z3MgfD0gREVCVUdfU1BGX0VWRU5UUzsKLSAgcHJpbnRfZGVidWcgKHZ0eSwgREVCVUdfU1BGX0VWRU5UUyAsIDEpOworICBwcmludF9kZWJ1ZyAodnR5LCBERUJVR19TUEZfRVZFTlRTLCAxKTsKIAogICByZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CkBAIC03NjcsMTIgKzc3MiwxMSBAQAogICAgICAgICJubyBkZWJ1ZyBpc2lzIHNwZi1ldmVudHMiLAogICAgICAgIFVOREVCVUdfU1RSCiAgICAgICAgIklTLUlTIGluZm9ybWF0aW9uXG4iCi0gICAgICAgIklTLUlTIFNob3J0ZXN0IFBhdGggRmlyc3QgRXZlbnRzXG4iCi0gICAgICAgKQorICAgICAgICJJUy1JUyBTaG9ydGVzdCBQYXRoIEZpcnN0IEV2ZW50c1xuIikKIHsKICAgaXNpcy0+ZGVidWdzICY9IH5ERUJVR19TUEZfRVZFTlRTOwotICBwcmludF9kZWJ1ZyAodnR5LCBERUJVR19TUEZfRVZFTlRTICwgMCk7Ci0gIAorICBwcmludF9kZWJ1ZyAodnR5LCBERUJVR19TUEZfRVZFTlRTLCAwKTsKKwogICByZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKQEAgLTc4Miw4ICs3ODYsNyBAQAogICAgICAgICJkZWJ1ZyBpc2lzIHNwZi1zdGF0aXN0aWNzICIsCiAgICAgICAgREVCVUdfU1RSCiAgICAgICAgIklTLUlTIGluZm9ybWF0aW9uXG4iCi0gICAgICAgIklTLUlTIFNQRiBUaW1pbmcgYW5kIFN0YXRpc3RpYyBEYXRhXG4iCi0gICAgICAgKQorICAgICAgICJJUy1JUyBTUEYgVGltaW5nIGFuZCBTdGF0aXN0aWMgRGF0YVxuIikKIHsKICAgaXNpcy0+ZGVidWdzIHw9IERFQlVHX1NQRl9TVEFUUzsKICAgcHJpbnRfZGVidWcgKHZ0eSwgREVCVUdfU1BGX1NUQVRTLCAxKTsKQEAgLTc5NiwxMiArNzk5LDExIEBACiAgICAgICAgIm5vIGRlYnVnIGlzaXMgc3BmLXN0YXRpc3RpY3MiLAogICAgICAgIFVOREVCVUdfU1RSCiAgICAgICAgIklTLUlTIGluZm9ybWF0aW9uXG4iCi0gICAgICAgIklTLUlTIFNQRiBUaW1pbmcgYW5kIFN0YXRpc3RpYyBEYXRhXG4iCi0gICAgICAgKQorICAgICAgICJJUy1JUyBTUEYgVGltaW5nIGFuZCBTdGF0aXN0aWMgRGF0YVxuIikKIHsKICAgaXNpcy0+ZGVidWdzICY9IH5ERUJVR19TUEZfU1RBVFM7CiAgIHByaW50X2RlYnVnICh2dHksIERFQlVHX1NQRl9TVEFUUywgMCk7Ci0gIAorCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KIApAQCAtODEwLDggKzgxMiw3IEBACiAgICAgICAgImRlYnVnIGlzaXMgc3BmLXRyaWdnZXJzIiwKICAgICAgICBERUJVR19TVFIKICAgICAgICAiSVMtSVMgaW5mb3JtYXRpb25cbiIKLSAgICAgICAiSVMtSVMgU1BGIHRyaWdnZXJpbmcgZXZlbnRzXG4iCi0gICAgICAgKQorICAgICAgICJJUy1JUyBTUEYgdHJpZ2dlcmluZyBldmVudHNcbiIpCiB7CiAgIGlzaXMtPmRlYnVncyB8PSBERUJVR19TUEZfVFJJR0dFUlM7CiAgIHByaW50X2RlYnVnICh2dHksIERFQlVHX1NQRl9UUklHR0VSUywgMSk7CkBAIC04MjQsMTIgKzgyNSwxMSBAQAogICAgICAgICJubyBkZWJ1ZyBpc2lzIHNwZi10cmlnZ2VycyIsCiAgICAgICAgVU5ERUJVR19TVFIKICAgICAgICAiSVMtSVMgaW5mb3JtYXRpb25cbiIKLSAgICAgICAiSVMtSVMgU1BGIHRyaWdnZXJpbmcgZXZlbnRzXG4iCi0gICAgICAgKQorICAgICAgICJJUy1JUyBTUEYgdHJpZ2dlcmluZyBldmVudHNcbiIpCiB7CiAgIGlzaXMtPmRlYnVncyAmPSB+REVCVUdfU1BGX1RSSUdHRVJTOwogICBwcmludF9kZWJ1ZyAodnR5LCBERUJVR19TUEZfVFJJR0dFUlMsIDApOwotICAKKwogICByZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKQEAgLTgzOCw4ICs4MzgsNyBAQAogICAgICAgICJkZWJ1ZyBpc2lzIHJvdXRlLWV2ZW50cyIsCiAgICAgICAgREVCVUdfU1RSCiAgICAgICAgIklTLUlTIGluZm9ybWF0aW9uXG4iCi0gICAgICAgIklTLUlTIFJvdXRlIHJlbGF0ZWQgZXZlbnRzXG4iCi0gICAgICAgKQorICAgICAgICJJUy1JUyBSb3V0ZSByZWxhdGVkIGV2ZW50c1xuIikKIHsKICAgaXNpcy0+ZGVidWdzIHw9IERFQlVHX1JURV9FVkVOVFM7CiAgIHByaW50X2RlYnVnICh2dHksIERFQlVHX1JURV9FVkVOVFMsIDEpOwpAQCAtODUyLDEyICs4NTEsMTEgQEAKICAgICAgICAibm8gZGVidWcgaXNpcyByb3V0ZS1ldmVudHMiLAogICAgICAgIFVOREVCVUdfU1RSCiAgICAgICAgIklTLUlTIGluZm9ybWF0aW9uXG4iCi0gICAgICAgIklTLUlTIFJvdXRlIHJlbGF0ZWQgZXZlbnRzXG4iCi0gICAgICAgKQorICAgICAgICJJUy1JUyBSb3V0ZSByZWxhdGVkIGV2ZW50c1xuIikKIHsKICAgaXNpcy0+ZGVidWdzICY9IH5ERUJVR19SVEVfRVZFTlRTOwogICBwcmludF9kZWJ1ZyAodnR5LCBERUJVR19SVEVfRVZFTlRTLCAwKTsKLSAgCisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC04NjYsOCArODY0LDcgQEAKICAgICAgICAiZGVidWcgaXNpcyBldmVudHMiLAogICAgICAgIERFQlVHX1NUUgogICAgICAgICJJUy1JUyBpbmZvcm1hdGlvblxuIgotICAgICAgICJJUy1JUyAgRXZlbnRzXG4iCi0gICAgICAgKQorICAgICAgICJJUy1JUyAgRXZlbnRzXG4iKQogewogICBpc2lzLT5kZWJ1Z3MgfD0gREVCVUdfRVZFTlRTOwogICBwcmludF9kZWJ1ZyAodnR5LCBERUJVR19FVkVOVFMsIDEpOwpAQCAtODgwLDE2ICs4NzcsMTQgQEAKICAgICAgICAibm8gZGVidWcgaXNpcyBldmVudHMiLAogICAgICAgIFVOREVCVUdfU1RSCiAgICAgICAgIklTLUlTIGluZm9ybWF0aW9uXG4iCi0gICAgICAgIklTLUlTIEV2ZW50c1xuIgotICAgICAgICkKKyAgICAgICAiSVMtSVMgRXZlbnRzXG4iKQogewogICBpc2lzLT5kZWJ1Z3MgJj0gfkRFQlVHX0VWRU5UUzsKICAgcHJpbnRfZGVidWcgKHZ0eSwgREVCVUdfRVZFTlRTLCAwKTsKLSAgCisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCi0KIERFRlVOIChzaG93X2hvc3RuYW1lLAogICAgICAgIHNob3dfaG9zdG5hbWVfY21kLAogICAgICAgICJzaG93IGlzaXMgaG9zdG5hbWUiLApAQCAtODk4LDUxICs4OTMsNDcgQEAKICAgICAgICAiSVMtSVMgRHluYW1pYyBob3N0bmFtZSBtYXBwaW5nXG4iKQogewogICBkeW5obl9wcmludF9hbGwgKHZ0eSk7Ci0gIAorCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KIAotCiBERUZVTiAoc2hvd19kYXRhYmFzZSwKICAgICAgICBzaG93X2RhdGFiYXNlX2NtZCwKICAgICAgICAic2hvdyBpc2lzIGRhdGFiYXNlIiwKLSAgICAgICBTSE9XX1NUUgotICAgICAgICJJUy1JUyBpbmZvcm1hdGlvblxuIgotICAgICAgICJJUy1JUyBsaW5rIHN0YXRlIGRhdGFiYXNlXG4iKQorICAgICAgIFNIT1dfU1RSICJJUy1JUyBpbmZvcm1hdGlvblxuIiAiSVMtSVMgbGluayBzdGF0ZSBkYXRhYmFzZVxuIikKIHsKICAgc3RydWN0IGxpc3Rub2RlICpub2RlOwogICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOwotICBpbnQgbGV2ZWwsbHNwX2NvdW50OworICBpbnQgbGV2ZWwsIGxzcF9jb3VudDsKIAogICBpZiAoaXNpcy0+YXJlYV9saXN0LT5jb3VudCA9PSAwKQogICAgIHJldHVybiBDTURfU1VDQ0VTUzsKLSAgCi0gIGZvciAobm9kZSA9IGxpc3RoZWFkIChpc2lzLT5hcmVhX2xpc3QpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKLSAgICBhcmVhID0gZ2V0ZGF0YSAobm9kZSk7Ci0gICAgdnR5X291dCAodnR5LCAiQXJlYSAlczolcyIsIGFyZWEtPmFyZWFfdGFnID8gYXJlYS0+YXJlYV90YWcgOiAibnVsbCIsCi0gICAgICAgICAgICAgVlRZX05FV0xJTkUpOwotICAgIGZvciAobGV2ZWw9MDtsZXZlbDxJU0lTX0xFVkVMUztsZXZlbCsrKSB7Ci0gICAgICBpZiAoYXJlYS0+bHNwZGJbbGV2ZWxdICYmIGRpY3RfY291bnQgKGFyZWEtPmxzcGRiW2xldmVsXSkgPiAwKSB7Ci0gICAgICAgIHZ0eV9vdXQgKHZ0eSwiSVMtSVMgTGV2ZWwtJWQgbGluay1zdGF0ZSBkYXRhYmFzZTolcyIsIGxldmVsKzEsIAotICAgICAgICAgICAgICAgICBWVFlfTkVXTElORSk7CiAKLSAgICAgICAgbHNwX2NvdW50ID0gbHNwX3ByaW50X2FsbCAodnR5LCBhcmVhLT5sc3BkYltsZXZlbF0sCi0JCQkJICAgSVNJU19VSV9MRVZFTF9CUklFRiwKLQkJCQkgICBhcmVhLT5keW5ob3N0bmFtZSk7CisgIGZvciAobm9kZSA9IGxpc3RoZWFkIChpc2lzLT5hcmVhX2xpc3QpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpCisgICAgeworICAgICAgYXJlYSA9IGdldGRhdGEgKG5vZGUpOworICAgICAgdnR5X291dCAodnR5LCAiQXJlYSAlczolcyIsIGFyZWEtPmFyZWFfdGFnID8gYXJlYS0+YXJlYV90YWcgOiAibnVsbCIsCisJICAgICAgIFZUWV9ORVdMSU5FKTsKKyAgICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IElTSVNfTEVWRUxTOyBsZXZlbCsrKQorCXsKKwkgIGlmIChhcmVhLT5sc3BkYltsZXZlbF0gJiYgZGljdF9jb3VudCAoYXJlYS0+bHNwZGJbbGV2ZWxdKSA+IDApCisJICAgIHsKKwkgICAgICB2dHlfb3V0ICh2dHksICJJUy1JUyBMZXZlbC0lZCBsaW5rLXN0YXRlIGRhdGFiYXNlOiVzIiwKKwkJICAgICAgIGxldmVsICsgMSwgVlRZX05FV0xJTkUpOwogCi0JdnR5X291dCAodnR5LCIlcyAgICAldSBMU1BzJXMlcyIsCi0JCSBWVFlfTkVXTElORSwKLQkJIGxzcF9jb3VudCwKLQkJIFZUWV9ORVdMSU5FLAotCQkgVlRZX05FV0xJTkUpOwotICAgICAgfQorCSAgICAgIGxzcF9jb3VudCA9IGxzcF9wcmludF9hbGwgKHZ0eSwgYXJlYS0+bHNwZGJbbGV2ZWxdLAorCQkJCQkgSVNJU19VSV9MRVZFTF9CUklFRiwKKwkJCQkJIGFyZWEtPmR5bmhvc3RuYW1lKTsKKworCSAgICAgIHZ0eV9vdXQgKHZ0eSwgIiVzICAgICV1IExTUHMlcyVzIiwKKwkJICAgICAgIFZUWV9ORVdMSU5FLCBsc3BfY291bnQsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSk7CisJICAgIH0KKwl9CiAgICAgfQotICB9CiAKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCi0KIERFRlVOIChzaG93X2RhdGFiYXNlX2RldGFpbCwKICAgICAgICBzaG93X2RhdGFiYXNlX2RldGFpbF9jbWQsCiAgICAgICAgInNob3cgaXNpcyBkYXRhYmFzZSBkZXRhaWwiLApAQCAtOTU3LDI3ICs5NDgsMjcgQEAKICAgaWYgKGlzaXMtPmFyZWFfbGlzdC0+Y291bnQgPT0gMCkKICAgICByZXR1cm4gQ01EX1NVQ0NFU1M7CiAKLSAgZm9yIChub2RlID0gbGlzdGhlYWQgKGlzaXMtPmFyZWFfbGlzdCk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgewotICAgIGFyZWEgPSBnZXRkYXRhIChub2RlKTsKLSAgICB2dHlfb3V0ICh2dHksICJBcmVhICVzOiVzIiwgYXJlYS0+YXJlYV90YWcgPyBhcmVhLT5hcmVhX3RhZyA6ICJudWxsIiwKLSAgICAgICAgICAgICBWVFlfTkVXTElORSk7Ci0gICAgZm9yIChsZXZlbD0wO2xldmVsPElTSVNfTEVWRUxTO2xldmVsKyspIHsKLSAgICAgIGlmIChhcmVhLT5sc3BkYltsZXZlbF0gJiYgZGljdF9jb3VudCAoYXJlYS0+bHNwZGJbbGV2ZWxdKSA+IDApIHsKLSAgICAgICAgdnR5X291dCAodnR5LCJJUy1JUyBMZXZlbC0lZCBMaW5rIFN0YXRlIERhdGFiYXNlOiVzIiwgbGV2ZWwrMSwgCi0gICAgICAgICAgICAgICAgIFZUWV9ORVdMSU5FKTsKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGlzaXMtPmFyZWFfbGlzdCk7IG5vZGU7IG5leHRub2RlIChub2RlKSkKKyAgICB7CisgICAgICBhcmVhID0gZ2V0ZGF0YSAobm9kZSk7CisgICAgICB2dHlfb3V0ICh2dHksICJBcmVhICVzOiVzIiwgYXJlYS0+YXJlYV90YWcgPyBhcmVhLT5hcmVhX3RhZyA6ICJudWxsIiwKKwkgICAgICAgVlRZX05FV0xJTkUpOworICAgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgSVNJU19MRVZFTFM7IGxldmVsKyspCisJeworCSAgaWYgKGFyZWEtPmxzcGRiW2xldmVsXSAmJiBkaWN0X2NvdW50IChhcmVhLT5sc3BkYltsZXZlbF0pID4gMCkKKwkgICAgeworCSAgICAgIHZ0eV9vdXQgKHZ0eSwgIklTLUlTIExldmVsLSVkIExpbmsgU3RhdGUgRGF0YWJhc2U6JXMiLAorCQkgICAgICAgbGV2ZWwgKyAxLCBWVFlfTkVXTElORSk7CiAKLSAgICAgICAgbHNwX2NvdW50ID0gbHNwX3ByaW50X2FsbCAodnR5LCBhcmVhLT5sc3BkYltsZXZlbF0sCi0JCQkJICAgSVNJU19VSV9MRVZFTF9ERVRBSUwsCi0JCQkJICAgYXJlYS0+ZHluaG9zdG5hbWUpOworCSAgICAgIGxzcF9jb3VudCA9IGxzcF9wcmludF9hbGwgKHZ0eSwgYXJlYS0+bHNwZGJbbGV2ZWxdLAorCQkJCQkgSVNJU19VSV9MRVZFTF9ERVRBSUwsCisJCQkJCSBhcmVhLT5keW5ob3N0bmFtZSk7CiAKLQl2dHlfb3V0ICh2dHksIiVzICAgICV1IExTUHMlcyVzIiwKLQkJIFZUWV9ORVdMSU5FLAotCQkgbHNwX2NvdW50LAotCQkgVlRZX05FV0xJTkUsCi0JCSBWVFlfTkVXTElORSk7Ci0gICAgICB9CisJICAgICAgdnR5X291dCAodnR5LCAiJXMgICAgJXUgTFNQcyVzJXMiLAorCQkgICAgICAgVlRZX05FV0xJTkUsIGxzcF9jb3VudCwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FKTsKKwkgICAgfQorCX0KICAgICB9Ci0gIH0KIAogICByZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CkBAIC05ODgsMTMgKzk3OSwxMSBAQAogREVGVU4gKHJvdXRlcl9pc2lzLAogICAgICAgIHJvdXRlcl9pc2lzX2NtZCwKICAgICAgICAicm91dGVyIGlzaXMgV09SRCIsCi0gICAgICAgIFJPVVRFUl9TVFIKKyAgICAgICBST1VURVJfU1RSCiAgICAgICAgIklTTyBJUy1JU1xuIgogICAgICAgICJJU08gUm91dGluZyBhcmVhIHRhZyIpCiB7Ci0KICAgcmV0dXJuIGlzaXNfYXJlYV9nZXQgKHZ0eSwgYXJndlswXSk7Ci0gIAogfQogCiAvKiAKQEAgLTEwMDMsMTEgKzk5Miw3IEBACiBERUZVTiAobm9fcm91dGVyX2lzaXMsCiAgICAgICAgbm9fcm91dGVyX2lzaXNfY21kLAogICAgICAgICJubyByb3V0ZXIgaXNpcyBXT1JEIiwKLSAgICAgICAibm9cbiIKLSAgICAgICBST1VURVJfU1RSCi0gICAgICAgIklTTyBJUy1JU1xuIgotICAgICAgICJJU08gUm91dGluZyBhcmVhIHRhZyIpCi0KKyAgICAgICAibm9cbiIgUk9VVEVSX1NUUiAiSVNPIElTLUlTXG4iICJJU08gUm91dGluZyBhcmVhIHRhZyIpCiB7CiAgIHJldHVybiBpc2lzX2FyZWFfZGVzdHJveSAodnR5LCBhcmd2WzBdKTsKIH0KQEAgLTEwMTksMTIgKzEwMDQsMTEgQEAKICAgICAgICBuZXRfY21kLAogICAgICAgICJuZXQgV09SRCIsCiAgICAgICAgIkEgTmV0d29yayBFbnRpdHkgVGl0bGUgZm9yIHRoaXMgcHJvY2VzcyAoT1NJIG9ubHkpXG4iCi0gICAgICAgIlhYLlhYWFguIC4uLiAuWFhYLlhYICBOZXR3b3JrIGVudGl0eSB0aXRsZSAoTkVUKVxuIiApCisgICAgICAgIlhYLlhYWFguIC4uLiAuWFhYLlhYICBOZXR3b3JrIGVudGl0eSB0aXRsZSAoTkVUKVxuIikKIHsKICAgcmV0dXJuIGFyZWFfbmV0X3RpdGxlICh2dHksIGFyZ3ZbMF0pOwogfQogCi0KIC8qCiAgKiAnbm8gbmV0JyBjb21tYW5kCiAgKi8KQEAgLTEwMzMsNyArMTAxNyw3IEBACiAgICAgICAgIm5vIG5ldCBXT1JEIiwKICAgICAgICBOT19TVFIKICAgICAgICAiQSBOZXR3b3JrIEVudGl0eSBUaXRsZSBmb3IgdGhpcyBwcm9jZXNzIChPU0kgb25seSlcbiIKLSAgICAgICAiWFguWFhYWC4gLi4uIC5YWFguWFggIE5ldHdvcmsgZW50aXR5IHRpdGxlIChORVQpXG4iICkKKyAgICAgICAiWFguWFhYWC4gLi4uIC5YWFguWFggIE5ldHdvcmsgZW50aXR5IHRpdGxlIChORVQpXG4iKQogewogICByZXR1cm4gYXJlYV9jbGVhcl9uZXRfdGl0bGUgKHZ0eSwgYXJndlswXSk7CiB9CkBAIC0xMDQyLDI3ICsxMDI2LDI5IEBACiAgICAgICAgYXJlYV9wYXNzd2RfY21kLAogICAgICAgICJhcmVhLXBhc3N3b3JkIFdPUkQiLAogICAgICAgICJDb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uIHBhc3N3b3JkIGZvciBhbiBhcmVhXG4iCi0gICAgICAgIkFyZWEgcGFzc3dvcmRcbiIgKQorICAgICAgICJBcmVhIHBhc3N3b3JkXG4iKQogewogICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOwogICBpbnQgbGVuOwogCiAgIGFyZWEgPSB2dHktPmluZGV4OwogCi0gIGlmICghYXJlYSkgewotICAgIHZ0eV9vdXQgKHZ0eSwgIkNhbnQgZmluZCBJUy1JUyBpbnN0YW5jZSVzIiwgVlRZX05FV0xJTkUpOwotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQotICAKKyAgaWYgKCFhcmVhKQorICAgIHsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIkNhbnQgZmluZCBJUy1JUyBpbnN0YW5jZSVzIiwgVlRZX05FV0xJTkUpOworICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KKwogICBsZW4gPSBzdHJsZW4gKGFyZ3ZbMF0pOwotICBpZiAobGVuID4gMjU0KSB7Ci0gICAgdnR5X291dCAodnR5LCAiVG9vIGxvbmcgYXJlYSBwYXNzd29yZCAoPjI1NCklcyIsIFZUWV9ORVdMSU5FKTsKLSAgICByZXR1cm4gQ01EX1dBUk5JTkc7Ci0gIH0KLSAgYXJlYS0+YXJlYV9wYXNzd2QubGVuID0gKHVfY2hhcilsZW47CisgIGlmIChsZW4gPiAyNTQpCisgICAgeworICAgICAgdnR5X291dCAodnR5LCAiVG9vIGxvbmcgYXJlYSBwYXNzd29yZCAoPjI1NCklcyIsIFZUWV9ORVdMSU5FKTsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CisgIGFyZWEtPmFyZWFfcGFzc3dkLmxlbiA9ICh1X2NoYXIpIGxlbjsKICAgYXJlYS0+YXJlYV9wYXNzd2QudHlwZSA9IElTSVNfUEFTU1dEX1RZUEVfQ0xFQVJUWFQ7CiAgIHN0cm5jcHkgKGFyZWEtPmFyZWFfcGFzc3dkLnBhc3N3ZCwgYXJndlswXSwgMjU1KTsKLSAgCisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC0xMDczLDQ5ICsxMDU5LDUwIEBACiAgICAgICAgIkNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24gcGFzc3dvcmQgZm9yIGFuIGFyZWFcbiIpCiB7CiAgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWE7Ci0gIAorCiAgIGFyZWEgPSB2dHktPmluZGV4OwogCi0gIGlmICghYXJlYSkgewotICAgIHZ0eV9vdXQgKHZ0eSwgIkNhbnQgZmluZCBJUy1JUyBpbnN0YW5jZSVzIiwgVlRZX05FV0xJTkUpOwotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQotICAKKyAgaWYgKCFhcmVhKQorICAgIHsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIkNhbnQgZmluZCBJUy1JUyBpbnN0YW5jZSVzIiwgVlRZX05FV0xJTkUpOworICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KKwogICBtZW1zZXQgKCZhcmVhLT5hcmVhX3Bhc3N3ZCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaXNpc19wYXNzd2QpKTsKIAogICByZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKLQogREVGVU4gKGRvbWFpbl9wYXNzd2QsCiAgICAgICAgZG9tYWluX3Bhc3N3ZF9jbWQsCiAgICAgICAgImRvbWFpbi1wYXNzd29yZCBXT1JEIiwKICAgICAgICAiU2V0IHRoZSBhdXRoZW50aWNhdGlvbiBwYXNzd29yZCBmb3IgYSByb3V0aW5nIGRvbWFpblxuIgotICAgICAgICJSb3V0aW5nIGRvbWFpbiBwYXNzd29yZFxuIiApCisgICAgICAgIlJvdXRpbmcgZG9tYWluIHBhc3N3b3JkXG4iKQogewogICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOwogICBpbnQgbGVuOwogCiAgIGFyZWEgPSB2dHktPmluZGV4OwogCi0gIGlmICghYXJlYSkgewotICAgIHZ0eV9vdXQgKHZ0eSwgIkNhbnQgZmluZCBJUy1JUyBpbnN0YW5jZSVzIiwgVlRZX05FV0xJTkUpOwotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQotICAgIAorICBpZiAoIWFyZWEpCisgICAgeworICAgICAgdnR5X291dCAodnR5LCAiQ2FudCBmaW5kIElTLUlTIGluc3RhbmNlJXMiLCBWVFlfTkVXTElORSk7CisgICAgICByZXR1cm4gQ01EX1dBUk5JTkc7CisgICAgfQorCiAgIGxlbiA9IHN0cmxlbiAoYXJndlswXSk7Ci0gIGlmIChsZW4gPiAyNTQpIHsKLSAgICB2dHlfb3V0ICh2dHksICJUb28gbG9uZyBhcmVhIHBhc3N3b3JkICg+MjU0KSVzIiwgVlRZX05FV0xJTkUpOwotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQotICBhcmVhLT5kb21haW5fcGFzc3dkLmxlbiA9ICh1X2NoYXIpbGVuOworICBpZiAobGVuID4gMjU0KQorICAgIHsKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIlRvbyBsb25nIGFyZWEgcGFzc3dvcmQgKD4yNTQpJXMiLCBWVFlfTkVXTElORSk7CisgICAgICByZXR1cm4gQ01EX1dBUk5JTkc7CisgICAgfQorICBhcmVhLT5kb21haW5fcGFzc3dkLmxlbiA9ICh1X2NoYXIpIGxlbjsKICAgYXJlYS0+ZG9tYWluX3Bhc3N3ZC50eXBlID0gSVNJU19QQVNTV0RfVFlQRV9DTEVBUlRYVDsKICAgc3RybmNweSAoYXJlYS0+ZG9tYWluX3Bhc3N3ZC5wYXNzd2QsIGFyZ3ZbMF0sIDI1NSk7Ci0gIAorCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KIAotCiBERUZVTiAobm9fZG9tYWluX3Bhc3N3ZCwKICAgICAgICBub19kb21haW5fcGFzc3dkX2NtZCwKICAgICAgICAibm8gZG9tYWluLXBhc3N3b3JkIFdPUkQiLApAQCAtMTEyMywxNiArMTExMCwxNyBAQAogICAgICAgICJTZXQgdGhlIGF1dGhlbnRpY2F0aW9uIHBhc3N3b3JkIGZvciBhIHJvdXRpbmcgZG9tYWluXG4iKQogewogICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOwotICAKKwogICBhcmVhID0gdnR5LT5pbmRleDsKIAotICBpZiAoIWFyZWEpIHsKLSAgICB2dHlfb3V0ICh2dHksICJDYW50IGZpbmQgSVMtSVMgaW5zdGFuY2UlcyIsIFZUWV9ORVdMSU5FKTsKLSAgICByZXR1cm4gQ01EX1dBUk5JTkc7Ci0gIH0KLSAgCisgIGlmICghYXJlYSkKKyAgICB7CisgICAgICB2dHlfb3V0ICh2dHksICJDYW50IGZpbmQgSVMtSVMgaW5zdGFuY2UlcyIsIFZUWV9ORVdMSU5FKTsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CisKICAgbWVtc2V0ICgmYXJlYS0+ZG9tYWluX3Bhc3N3ZCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaXNpc19wYXNzd2QpKTsKLSAgCisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC0xMTQ5LDE5ICsxMTM3LDIxIEBACiAKICAgYXJlYSA9IHZ0eS0+aW5kZXg7CiAKLSAgaWYgKCFhcmVhKSB7Ci0gICAgdnR5X291dCAodnR5LCAiQ2FudCBmaW5kIElTLUlTIGluc3RhbmNlJXMiLCBWVFlfTkVXTElORSk7Ci0gICAgcmV0dXJuIENNRF9XQVJOSU5HOwotICB9CisgIGlmICghYXJlYSkKKyAgICB7CisgICAgICB2dHlfb3V0ICh2dHksICJDYW50IGZpbmQgSVMtSVMgaW5zdGFuY2UlcyIsIFZUWV9ORVdMSU5FKTsKKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CiAKLSAgdHlwZSA9IHN0cmluZzJjaXJjdWl0X3QgKGFyZ3ZbMF0pOyAKLSAgaWYgKCF0eXBlKSB7Ci0gICAgdnR5X291dCAodnR5LCAiVW5rbm93biBJUyBsZXZlbCAlcyIsIFZUWV9ORVdMSU5FKTsKLSAgICByZXR1cm4gQ01EX1NVQ0NFU1M7Ci0gIH0KKyAgdHlwZSA9IHN0cmluZzJjaXJjdWl0X3QgKGFyZ3ZbMF0pOworICBpZiAoIXR5cGUpCisgICAgeworICAgICAgdnR5X291dCAodnR5LCAiVW5rbm93biBJUyBsZXZlbCAlcyIsIFZUWV9ORVdMSU5FKTsKKyAgICAgIHJldHVybiBDTURfU1VDQ0VTUzsKKyAgICB9CiAKICAgaXNpc19ldmVudF9zeXN0ZW1fdHlwZV9jaGFuZ2UgKGFyZWEsIHR5cGUpOwotICAKKwogICByZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKQEAgLTExNzQsMTggKzExNjQsMTcgQEAKICAgICAgICAiQWN0IGFzIGJvdGggYSBzdGF0aW9uIHJvdXRlciBhbmQgYW4gYXJlYSByb3V0ZXJcbiIKICAgICAgICAiQWN0IGFzIGFuIGFyZWEgcm91dGVyIG9ubHlcbiIpCiB7Ci0gIAogICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOwogICBpbnQgdHlwZTsKIAogICBhcmVhID0gdnR5LT5pbmRleDsKICAgYXNzZXJ0IChhcmVhKTsKLSAgCisKICAgLyoKICAgICogUHV0IHRoZSBpcy10eXBlIGJhY2sgdG8gZGVmYXVsdC4gV2hpY2ggaXMgbGV2ZWwtMS0yIG9uIGZpcnN0CiAgICAqIGNpcmN1aXQgZm9yIHRoZSBhcmVhIGxldmVsLTEgZm9yIHRoZSByZXN0CiAgICAqLwotICBpZiAoZ2V0ZGF0YSAobGlzdGhlYWQgKGlzaXMtPmFyZWFfbGlzdCkpID09IGFyZWEgKSAKKyAgaWYgKGdldGRhdGEgKGxpc3RoZWFkIChpc2lzLT5hcmVhX2xpc3QpKSA9PSBhcmVhKQogICAgIHR5cGUgPSBJU19MRVZFTF8xX0FORF8yOwogICBlbHNlCiAgICAgdHlwZSA9IElTX0xFVkVMXzE7CkBAIC0xMjA2LDcgKzExOTUsNyBAQAogCiAgIGFyZWEgPSB2dHktPmluZGV4OwogICBhc3NlcnQgKGFyZWEpOwotICAKKwogICBpbnRlcnZhbCA9IGF0b2kgKGFyZ3ZbMF0pOwogICBhcmVhLT5sc3BfZ2VuX2ludGVydmFsWzBdID0gaW50ZXJ2YWw7CiAgIGFyZWEtPmxzcF9nZW5faW50ZXJ2YWxbMV0gPSBpbnRlcnZhbDsKQEAgLTEyMTgsMTQgKzEyMDcsMTMgQEAKICAgICAgICBub19sc3BfZ2VuX2ludGVydmFsX2NtZCwKICAgICAgICAibm8gbHNwLWdlbi1pbnRlcnZhbCIsCiAgICAgICAgTk9fU1RSCi0gICAgICAgIk1pbmltdW0gaW50ZXJ2YWwgYmV0d2VlbiByZWdlbmVyYXRpbmcgc2FtZSBMU1BcbiIKLSAgICAgICApCisgICAgICAgIk1pbmltdW0gaW50ZXJ2YWwgYmV0d2VlbiByZWdlbmVyYXRpbmcgc2FtZSBMU1BcbiIpCiB7CiAgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWE7CiAKICAgYXJlYSA9IHZ0eS0+aW5kZXg7CiAgIGFzc2VydCAoYXJlYSk7Ci0gIAorCiAgIGFyZWEtPmxzcF9nZW5faW50ZXJ2YWxbMF0gPSBMU1BfR0VOX0lOVEVSVkFMX0RFRkFVTFQ7CiAgIGFyZWEtPmxzcF9nZW5faW50ZXJ2YWxbMV0gPSBMU1BfR0VOX0lOVEVSVkFMX0RFRkFVTFQ7CiAKQEAgLTEyMzcsMjMgKzEyMjUsMjEgQEAKICAgICAgICAibm8gbHNwLWdlbi1pbnRlcnZhbCA8MS0xMjA+IiwKICAgICAgICBOT19TVFIKICAgICAgICAiTWluaW11bSBpbnRlcnZhbCBiZXR3ZWVuIHJlZ2VuZXJhdGluZyBzYW1lIExTUFxuIgotICAgICAgICJNaW5pbXVtIGludGVydmFsIGluIHNlY29uZHNcbiIKLSAgICAgICApCisgICAgICAgIk1pbmltdW0gaW50ZXJ2YWwgaW4gc2Vjb25kc1xuIikKIAogREVGVU4gKGxzcF9nZW5faW50ZXJ2YWxfbDEsCiAgICAgICAgbHNwX2dlbl9pbnRlcnZhbF9sMV9jbWQsCiAgICAgICAgImxzcC1nZW4taW50ZXJ2YWwgbGV2ZWwtMSA8MS0xMjA+IiwKICAgICAgICAiTWluaW11bSBpbnRlcnZhbCBiZXR3ZWVuIHJlZ2VuZXJhdGluZyBzYW1lIExTUFxuIgogICAgICAgICJTZXQgaW50ZXJ2YWwgZm9yIGxldmVsIDEgb25seVxuIgotICAgICAgICJNaW5pbXVtIGludGVydmFsIGluIHNlY29uZHNcbiIKLSAgICAgICApCisgICAgICAgIk1pbmltdW0gaW50ZXJ2YWwgaW4gc2Vjb25kc1xuIikKIHsKICAgc3RydWN0IGlzaXNfYXJlYSAqYXJlYTsKICAgdWludDE2X3QgaW50ZXJ2YWw7CiAKICAgYXJlYSA9IHZ0eS0+aW5kZXg7CiAgIGFzc2VydCAoYXJlYSk7Ci0gIAorCiAgIGludGVydmFsID0gYXRvaSAoYXJndlswXSk7CiAgIGFyZWEtPmxzcF9nZW5faW50ZXJ2YWxbMF0gPSBpbnRlcnZhbDsKIApAQCAtMTI2NSwxNSArMTI1MSwxMyBAQAogICAgICAgICJubyBsc3AtZ2VuLWludGVydmFsIGxldmVsLTEiLAogICAgICAgIE5PX1NUUgogICAgICAgICJNaW5pbXVtIGludGVydmFsIGJldHdlZW4gcmVnZW5lcmF0aW5nIHNhbWUgTFNQXG4iCi0gICAgICAgIlNldCBpbnRlcnZhbCBmb3IgbGV2ZWwgMSBvbmx5XG4iCi0KLSAgICAgICApCisgICAgICAgIlNldCBpbnRlcnZhbCBmb3IgbGV2ZWwgMSBvbmx5XG4iKQogewogICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOwogCiAgIGFyZWEgPSB2dHktPmluZGV4OwogICBhc3NlcnQgKGFyZWEpOwotICAKKwogICBhcmVhLT5sc3BfZ2VuX2ludGVydmFsWzBdID0gTFNQX0dFTl9JTlRFUlZBTF9ERUZBVUxUOwogCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKQEAgLTEyODUsMjQgKzEyNjksMjEgQEAKICAgICAgICBOT19TVFIKICAgICAgICAiTWluaW11bSBpbnRlcnZhbCBiZXR3ZWVuIHJlZ2VuZXJhdGluZyBzYW1lIExTUFxuIgogICAgICAgICJTZXQgaW50ZXJ2YWwgZm9yIGxldmVsIDEgb25seVxuIgotICAgICAgICJNaW5pbXVtIGludGVydmFsIGluIHNlY29uZHNcbiIKLSAgICAgICApCi0KKyAgICAgICAiTWluaW11bSBpbnRlcnZhbCBpbiBzZWNvbmRzXG4iKQogCiBERUZVTiAobHNwX2dlbl9pbnRlcnZhbF9sMiwKICAgICAgICBsc3BfZ2VuX2ludGVydmFsX2wyX2NtZCwKICAgICAgICAibHNwLWdlbi1pbnRlcnZhbCBsZXZlbC0yIDwxLTEyMD4iLAogICAgICAgICJNaW5pbXVtIGludGVydmFsIGJldHdlZW4gcmVnZW5lcmF0aW5nIHNhbWUgTFNQXG4iCiAgICAgICAgIlNldCBpbnRlcnZhbCBmb3IgbGV2ZWwgMiBvbmx5XG4iCi0gICAgICAgIk1pbmltdW0gaW50ZXJ2YWwgaW4gc2Vjb25kc1xuIgotICAgICAgICkKKyAgICAgICAiTWluaW11bSBpbnRlcnZhbCBpbiBzZWNvbmRzXG4iKQogewogICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOwogICBpbnQgaW50ZXJ2YWw7CiAKICAgYXJlYSA9IHZ0eS0+aW5kZXg7CiAgIGFzc2VydCAoYXJlYSk7Ci0gIAorCiAgIGludGVydmFsID0gYXRvaSAoYXJndlswXSk7CiAgIGFyZWEtPmxzcF9nZW5faW50ZXJ2YWxbMV0gPSBpbnRlcnZhbDsKIApAQCAtMTMxNCwxNSArMTI5NSwxNCBAQAogICAgICAgICJubyBsc3AtZ2VuLWludGVydmFsIGxldmVsLTIiLAogICAgICAgIE5PX1NUUgogICAgICAgICJNaW5pbXVtIGludGVydmFsIGJldHdlZW4gcmVnZW5lcmF0aW5nIHNhbWUgTFNQXG4iCi0gICAgICAgIlNldCBpbnRlcnZhbCBmb3IgbGV2ZWwgMiBvbmx5XG4iCi0gICAgICAgKQorICAgICAgICJTZXQgaW50ZXJ2YWwgZm9yIGxldmVsIDIgb25seVxuIikKIHsKICAgc3RydWN0IGlzaXNfYXJlYSAqYXJlYTsKICAgaW50IGludGVydmFsOwogCiAgIGFyZWEgPSB2dHktPmluZGV4OwogICBhc3NlcnQgKGFyZWEpOwotICAKKwogICBpbnRlcnZhbCA9IGF0b2kgKGFyZ3ZbMF0pOwogICBhcmVhLT5sc3BfZ2VuX2ludGVydmFsWzFdID0gTFNQX0dFTl9JTlRFUlZBTF9ERUZBVUxUOwogCkBAIC0xMzM1LDkgKzEzMTUsNyBAQAogICAgICAgIE5PX1NUUgogICAgICAgICJNaW5pbXVtIGludGVydmFsIGJldHdlZW4gcmVnZW5lcmF0aW5nIHNhbWUgTFNQXG4iCiAgICAgICAgIlNldCBpbnRlcnZhbCBmb3IgbGV2ZWwgMiBvbmx5XG4iCi0gICAgICAgIk1pbmltdW0gaW50ZXJ2YWwgaW4gc2Vjb25kc1xuIgotICAgICAgICkKLSAgICAgCisgICAgICAgIk1pbmltdW0gaW50ZXJ2YWwgaW4gc2Vjb25kc1xuIikKIAogREVGVU4gKG1ldHJpY19zdHlsZSwKICAgICAgICBtZXRyaWNfc3R5bGVfY21kLApAQCAtMTM1MCw3ICsxMzI4LDcgQEAKIAogICBhcmVhID0gdnR5LT5pbmRleDsKICAgYXNzZXJ0IChhcmVhKTsKLSAgaWYgKCFzdHJjbXAoYXJndlswXSwid2lkZSIpKQorICBpZiAoIXN0cmNtcCAoYXJndlswXSwgIndpZGUiKSkKICAgICBhcmVhLT5uZXdtZXRyaWMgPSAxOwogICBlbHNlCiAgICAgYXJlYS0+bmV3bWV0cmljID0gMDsKQEAgLTEzNzEsNyArMTM0OSw3IEBACiAgIGFyZWEgPSB2dHktPmluZGV4OwogICBhc3NlcnQgKGFyZWEpOwogCi0gIGlmICghc3RyY21wKGFyZ3ZbMF0sIndpZGUiKSkKKyAgaWYgKCFzdHJjbXAgKGFyZ3ZbMF0sICJ3aWRlIikpCiAgICAgYXJlYS0+bmV3bWV0cmljID0gMDsKICAgZWxzZQogICAgIGFyZWEtPm5ld21ldHJpYyA9IDE7CkBAIC0xMzgzLDE1ICsxMzYxLDE1IEBACiAgICAgICAgZHluYW1pY19ob3N0bmFtZV9jbWQsCiAgICAgICAgImhvc3RuYW1lIGR5bmFtaWMiLAogICAgICAgICJEeW5hbWljIGhvc3RuYW1lIGZvciBJUy1JU1xuIgotICAgICAgICJEeW5hbWljIGhvc3RuYW1lXG4iKSAKKyAgICAgICAiRHluYW1pYyBob3N0bmFtZVxuIikKIHsKICAgc3RydWN0IGlzaXNfYXJlYSAqYXJlYTsKIAogICBhcmVhID0gdnR5LT5pbmRleDsKICAgYXNzZXJ0IChhcmVhKTsKLSAgCisKICAgYXJlYS0+ZHluaG9zdG5hbWUgPSAxOwotICAKKwogICByZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKQEAgLTE0MDAsMTUgKzEzNzgsMTUgQEAKICAgICAgICAibm8gaG9zdG5hbWUgZHluYW1pYyIsCiAgICAgICAgTk9fU1RSCiAgICAgICAgIkR5bmFtaWMgaG9zdG5hbWUgZm9yIElTLUlTXG4iCi0gICAgICAgIkR5bmFtaWMgaG9zdG5hbWVcbiIpIAorICAgICAgICJEeW5hbWljIGhvc3RuYW1lXG4iKQogewogICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOwogCiAgIGFyZWEgPSB2dHktPmluZGV4OwogICBhc3NlcnQgKGFyZWEpOwotICAKKwogICBhcmVhLT5keW5ob3N0bmFtZSA9IDA7Ci0gIAorCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KIApAQCAtMTQyMCwxMiArMTM5OCwxMiBAQAogewogICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOwogICB1X2ludDE2X3QgaW50ZXJ2YWw7Ci0gIAorCiAgIGFyZWEgPSB2dHktPmluZGV4OwogICBpbnRlcnZhbCA9IGF0b2kgKGFyZ3ZbMF0pOwogICBhcmVhLT5taW5fc3BmX2ludGVydmFsWzBdID0gaW50ZXJ2YWw7CiAgIGFyZWEtPm1pbl9zcGZfaW50ZXJ2YWxbMV0gPSBpbnRlcnZhbDsKLSAgCisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC0xNDMzLDE2ICsxNDExLDE1IEBACiAgICAgICAgbm9fc3BmX2ludGVydmFsX2NtZCwKICAgICAgICAibm8gc3BmLWludGVydmFsIiwKICAgICAgICBOT19TVFIKLSAgICAgICAiTWluaW11bSBpbnRlcnZhbCBiZXR3ZWVuIFNQRiBjYWxjdWxhdGlvbnNcbiIKLSAgICAgICApCisgICAgICAgIk1pbmltdW0gaW50ZXJ2YWwgYmV0d2VlbiBTUEYgY2FsY3VsYXRpb25zXG4iKQogewogICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOwotICAKKwogICBhcmVhID0gdnR5LT5pbmRleDsKIAogICBhcmVhLT5taW5fc3BmX2ludGVydmFsWzBdID0gTUlOSU1VTV9TUEZfSU5URVJWQUw7CiAgIGFyZWEtPm1pbl9zcGZfaW50ZXJ2YWxbMV0gPSBNSU5JTVVNX1NQRl9JTlRFUlZBTDsKLSAgCisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC0xNDUxLDggKzE0MjgsNyBAQAogICAgICAgICJubyBzcGYtaW50ZXJ2YWwgPDEtMTIwPiIsCiAgICAgICAgTk9fU1RSCiAgICAgICAgIk1pbmltdW0gaW50ZXJ2YWwgYmV0d2VlbiBTUEYgY2FsY3VsYXRpb25zXG4iCi0gICAgICAgIk1pbmltdW0gaW50ZXJ2YWwgYmV0d2VlbiBjb25zZWN1dGl2ZSBTUEZzIGluIHNlY29uZHNcbiIKLSAgICAgICApCisgICAgICAgIk1pbmltdW0gaW50ZXJ2YWwgYmV0d2VlbiBjb25zZWN1dGl2ZSBTUEZzIGluIHNlY29uZHNcbiIpCiAKIERFRlVOIChzcGZfaW50ZXJ2YWxfbDEsCiAgICAgICAgc3BmX2ludGVydmFsX2wxX2NtZCwKQEAgLTE0NjMsMTEgKzE0MzksMTEgQEAKIHsKICAgc3RydWN0IGlzaXNfYXJlYSAqYXJlYTsKICAgdV9pbnQxNl90IGludGVydmFsOwotICAKKwogICBhcmVhID0gdnR5LT5pbmRleDsKICAgaW50ZXJ2YWwgPSBhdG9pIChhcmd2WzBdKTsKICAgYXJlYS0+bWluX3NwZl9pbnRlcnZhbFswXSA9IGludGVydmFsOwotICAKKwogICByZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKQEAgLTE0NzksMTEgKzE0NTUsMTEgQEAKICAgICAgICAiU2V0IGludGVydmFsIGZvciBsZXZlbCAxIG9ubHlcbiIpCiB7CiAgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWE7Ci0gIAorCiAgIGFyZWEgPSB2dHktPmluZGV4OwogCiAgIGFyZWEtPm1pbl9zcGZfaW50ZXJ2YWxbMF0gPSBNSU5JTVVNX1NQRl9JTlRFUlZBTDsKLSAgCisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC0xNTA0LDExICsxNDgwLDExIEBACiB7CiAgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWE7CiAgIHVfaW50MTZfdCBpbnRlcnZhbDsKLSAgCisKICAgYXJlYSA9IHZ0eS0+aW5kZXg7CiAgIGludGVydmFsID0gYXRvaSAoYXJndlswXSk7CiAgIGFyZWEtPm1pbl9zcGZfaW50ZXJ2YWxbMV0gPSBpbnRlcnZhbDsKLSAgCisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC0xNTIwLDExICsxNDk2LDExIEBACiAgICAgICAgIlNldCBpbnRlcnZhbCBmb3IgbGV2ZWwgMiBvbmx5XG4iKQogewogICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOwotICAKKwogICBhcmVhID0gdnR5LT5pbmRleDsKIAogICBhcmVhLT5taW5fc3BmX2ludGVydmFsWzFdID0gTUlOSU1VTV9TUEZfSU5URVJWQUw7Ci0gIAorCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KIApAQCAtMTUzNiw3ICsxNTEyLDYgQEAKICAgICAgICAiU2V0IGludGVydmFsIGZvciBsZXZlbCAyIG9ubHlcbiIKICAgICAgICAiTWluaW11bSBpbnRlcnZhbCBiZXR3ZWVuIGNvbnNlY3V0aXZlIFNQRnMgaW4gc2Vjb25kc1xuIikKIAotCiAjaWZkZWYgVE9QT0xPR1lfR0VORVJBVEUKIERFRlVOICh0b3BvbG9neV9nZW5lcmF0ZV9ncmlkLAogICAgICAgIHRvcG9sb2d5X2dlbmVyYXRlX2dyaWRfY21kLApAQCAtMTU1OCwxNSArMTUzMywxNiBAQAogICBhcmVhID0gdnR5LT5pbmRleDsKICAgYXNzZXJ0IChhcmVhKTsKIAotICBpZiAoIXNwZ3JpZF9jaGVja19wYXJhbXMgKHZ0eSwgYXJnYywgYXJndikpIHsKLSAgICBpZiAoYXJlYS0+dG9wb2xvZ3kpCi0gICAgICBsaXN0X2RlbGV0ZSAoYXJlYS0+dG9wb2xvZ3kpOwotICAgIGFyZWEtPnRvcG9sb2d5ID0gbGlzdF9uZXcoKTsKLSAgICBtZW1jcHkoYXJlYS0+dG9wX3BhcmFtcyx2dHktPmJ1ZiwyMDApOwotICAgIGdlbl9zcGdyaWRfdG9wb2xvZ3kgKHZ0eSwgYXJlYS0+dG9wb2xvZ3kpOwotICAgIHJlbW92ZV90b3BvbG9neV9sc3BzIChhcmVhKTsKLSAgICBnZW5lcmF0ZV90b3BvbG9neV9sc3BzIChhcmVhKTsKLSAgfQorICBpZiAoIXNwZ3JpZF9jaGVja19wYXJhbXMgKHZ0eSwgYXJnYywgYXJndikpCisgICAgeworICAgICAgaWYgKGFyZWEtPnRvcG9sb2d5KQorCWxpc3RfZGVsZXRlIChhcmVhLT50b3BvbG9neSk7CisgICAgICBhcmVhLT50b3BvbG9neSA9IGxpc3RfbmV3ICgpOworICAgICAgbWVtY3B5IChhcmVhLT50b3BfcGFyYW1zLCB2dHktPmJ1ZiwgMjAwKTsKKyAgICAgIGdlbl9zcGdyaWRfdG9wb2xvZ3kgKHZ0eSwgYXJlYS0+dG9wb2xvZ3kpOworICAgICAgcmVtb3ZlX3RvcG9sb2d5X2xzcHMgKGFyZWEpOworICAgICAgZ2VuZXJhdGVfdG9wb2xvZ3lfbHNwcyAoYXJlYSk7CisgICAgfQogCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KQEAgLTE1ODIsMTQgKzE1NTgsMTggQEAKICAgc3RydWN0IGxpc3Rub2RlICpub2RlOwogICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGUyOwogICBzdHJ1Y3QgYXJjICphcmM7Ci0gIExJU1RfTE9PUCAoaXNpcy0+YXJlYV9saXN0LCBhcmVhLCBub2RlKSB7Ci0gICAgaWYgKGFyZWEtPnRvcG9sb2d5KSB7Ci0gICAgICB2dHlfb3V0ICh2dHksICJUb3BvbG9neSBmb3IgaXNpcyBhcmVhOiVzJXMiLGFyZWEtPmFyZWFfdGFnLCBWVFlfTkVXTElORSk7Ci0gICAgICBMSVNUX0xPT1AgKGFyZWEtPnRvcG9sb2d5LCBhcmMsIG5vZGUyKSB7Ci0gICAgICAgIHZ0eV9vdXQgKHZ0eSwgImEgICVsZCAgICVsZCAgICVsZCVzIixhcmMtPmZyb21fbm9kZSwgYXJjLT50b19ub2RlLCAKLQkJIGFyYy0+ZGlzdGFuY2UsIFZUWV9ORVdMSU5FKTsKKyAgTElTVF9MT09QIChpc2lzLT5hcmVhX2xpc3QsIGFyZWEsIG5vZGUpCisgIHsKKyAgICBpZiAoYXJlYS0+dG9wb2xvZ3kpCisgICAgICB7CisJdnR5X291dCAodnR5LCAiVG9wb2xvZ3kgZm9yIGlzaXMgYXJlYTolcyVzIiwgYXJlYS0+YXJlYV90YWcsCisJCSBWVFlfTkVXTElORSk7CisJTElTVF9MT09QIChhcmVhLT50b3BvbG9neSwgYXJjLCBub2RlMikKKwl7CisJICB2dHlfb3V0ICh2dHksICJhICAlbGQgICAlbGQgICAlbGQlcyIsIGFyYy0+ZnJvbV9ub2RlLCBhcmMtPnRvX25vZGUsCisJCSAgIGFyYy0+ZGlzdGFuY2UsIFZUWV9ORVdMSU5FKTsKKwl9CiAgICAgICB9Ci0gICAgfQogICB9CiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KQEAgLTE1OTcsMTMgKzE1NzcsMTMgQEAKIC8qCiAgKiAndG9wb2xvZ3kgYmFzZS1pcycgY29tbWFuZAogICovCi1ERUZVTiAodG9wb2xvZ3lfYmFzZWlzICwKK0RFRlVOICh0b3BvbG9neV9iYXNlaXMsCiAgICAgICAgdG9wb2xvZ3lfYmFzZWlzX2NtZCwKICAgICAgICAidG9wb2xvZ3kgYmFzZS1pcyBXT1JEIiwKICAgICAgICAiVG9wb2xvZ3kgZm9yIElTLUlTXG4iCiAgICAgICAgIlRvcG9sb2d5IGZvciBJUy1JU1xuIgogICAgICAgICJBIE5ldHdvcmsgSVMgQmFzZSBmb3IgdGhpcyB0b3BvbG9neSIKLSAgICAgICAiWFguWFhYWC5YWFhYLlhYIE5ldHdvcmsgZW50aXR5IHRpdGxlIChORVQpXG4iICkKKyAgICAgICAiWFguWFhYWC5YWFhYLlhYIE5ldHdvcmsgZW50aXR5IHRpdGxlIChORVQpXG4iKQogewogICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOwogICB1X2NoYXIgYnVmZltJU0lTX1NZU19JRF9MRU5dOwpAQCAtMTYxMSwxMCArMTU5MSwxMSBAQAogICBhcmVhID0gdnR5LT5pbmRleDsKICAgYXNzZXJ0IChhcmVhKTsKIAotICBpZiAoc3lzaWQyYnVmZiAoYnVmZiwgYXJndlswXSkpIHsKLSAgICBzeXNpZDJidWZmIChhcmVhLT50b3BvbG9neV9iYXNlaXMsIGFyZ3ZbMF0pOwotICB9Ci0gIAorICBpZiAoc3lzaWQyYnVmZiAoYnVmZiwgYXJndlswXSkpCisgICAgeworICAgICAgc3lzaWQyYnVmZiAoYXJlYS0+dG9wb2xvZ3lfYmFzZWlzLCBhcmd2WzBdKTsKKyAgICB9CisKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC0xNjI2LDE0ICsxNjA3LDE0IEBACiAgICAgICAgIm5vIHRvcG9sb2d5IGJhc2UtaXMgV09SRCIsCiAgICAgICAgTk9fU1RSCiAgICAgICAgIkEgTmV0d29yayBFbnRpdHkgVGl0bGUgZm9yIHRoaXMgcHJvY2VzcyAoT1NJIG9ubHkpIgotICAgICAgICJYWC5YWFhYLiAuLi4gLlhYWC5YWCAgTmV0d29yayBlbnRpdHkgdGl0bGUgKE5FVClcbiIgKQorICAgICAgICJYWC5YWFhYLiAuLi4gLlhYWC5YWCAgTmV0d29yayBlbnRpdHkgdGl0bGUgKE5FVClcbiIpCiB7CiAgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWE7CiAKICAgYXJlYSA9IHZ0eS0+aW5kZXg7CiAgIGFzc2VydCAoYXJlYSk7CiAKLSAgbWVtY3B5KGFyZWEtPnRvcG9sb2d5X2Jhc2VpcywgREVGQVVMVF9UT1BPTE9HWV9CQVNFSVMsIElTSVNfU1lTX0lEX0xFTik7CisgIG1lbWNweSAoYXJlYS0+dG9wb2xvZ3lfYmFzZWlzLCBERUZBVUxUX1RPUE9MT0dZX0JBU0VJUywgSVNJU19TWVNfSURfTEVOKTsKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCkBAIC0xNjQzLDQxICsxNjI0LDQxIEBACiAgICAgICAgbHNwX2xpZmV0aW1lX2NtZCwKICAgICAgICAibHNwLWxpZmV0aW1lIDwzODAtNjU1MzU+IiwKICAgICAgICAiTWF4aW11bSBMU1AgbGlmZXRpbWVcbiIKLSAgICAgICAiTFNQIGxpZmV0aW1lIGluIHNlY29uZHNcbiIKLSAgICAgICApCisgICAgICAgIkxTUCBsaWZldGltZSBpbiBzZWNvbmRzXG4iKQogewogICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOwogICB1aW50MTZfdCBpbnRlcnZhbDsKIAogICBhcmVhID0gdnR5LT5pbmRleDsKICAgYXNzZXJ0IChhcmVhKTsKLSAgCisKICAgaW50ZXJ2YWwgPSBhdG9pIChhcmd2WzBdKTsKIAotICBpZiAoaW50ZXJ2YWwgPCBJU0lTX01JTl9MU1BfTElGRVRJTUUpIHsKLSAgICB2dHlfb3V0ICh2dHksICJMU1AgbGlmZXRpbWUgKCV1cykgYmVsb3cgJXVzJXMiLAotCSAgICAgaW50ZXJ2YWwsCi0JICAgICBJU0lTX01JTl9MU1BfTElGRVRJTUUsCi0JICAgICBWVFlfTkVXTElORSk7CisgIGlmIChpbnRlcnZhbCA8IElTSVNfTUlOX0xTUF9MSUZFVElNRSkKKyAgICB7CisgICAgICB2dHlfb3V0ICh2dHksICJMU1AgbGlmZXRpbWUgKCV1cykgYmVsb3cgJXVzJXMiLAorCSAgICAgICBpbnRlcnZhbCwgSVNJU19NSU5fTFNQX0xJRkVUSU1FLCBWVFlfTkVXTElORSk7CiAKLSAgICByZXR1cm4gQ01EX1dBUk5JTkc7Ci0gIH0KKyAgICAgIHJldHVybiBDTURfV0FSTklORzsKKyAgICB9CiAKIAogICBhcmVhLT5tYXhfbHNwX2xpZmV0aW1lWzBdID0gaW50ZXJ2YWw7CiAgIGFyZWEtPm1heF9sc3BfbGlmZXRpbWVbMV0gPSBpbnRlcnZhbDsKLSAgYXJlYS0+bHNwX3JlZnJlc2hbMF0gPSBpbnRlcnZhbC0zMDA7Ci0gIGFyZWEtPmxzcF9yZWZyZXNoWzFdID0gaW50ZXJ2YWwtMzAwOworICBhcmVhLT5sc3BfcmVmcmVzaFswXSA9IGludGVydmFsIC0gMzAwOworICBhcmVhLT5sc3BfcmVmcmVzaFsxXSA9IGludGVydmFsIC0gMzAwOwogCi0gIGlmIChhcmVhLT50X2xzcF9yZWZyZXNoWzBdKSB7Ci0gICAgdGhyZWFkX2NhbmNlbCAoYXJlYS0+dF9sc3BfcmVmcmVzaFswXSk7Ci0gICAgdGhyZWFkX2V4ZWN1dGUgKG1hc3RlciwgbHNwX3JlZnJlc2hfbDEsIGFyZWEsIDApOwotICB9CisgIGlmIChhcmVhLT50X2xzcF9yZWZyZXNoWzBdKQorICAgIHsKKyAgICAgIHRocmVhZF9jYW5jZWwgKGFyZWEtPnRfbHNwX3JlZnJlc2hbMF0pOworICAgICAgdGhyZWFkX2V4ZWN1dGUgKG1hc3RlciwgbHNwX3JlZnJlc2hfbDEsIGFyZWEsIDApOworICAgIH0KIAotICBpZiAoYXJlYS0+dF9sc3BfcmVmcmVzaFsxXSkgewotICAgIHRocmVhZF9jYW5jZWwgKGFyZWEtPnRfbHNwX3JlZnJlc2hbMV0pOwotICAgIHRocmVhZF9leGVjdXRlIChtYXN0ZXIsIGxzcF9yZWZyZXNoX2wyLCBhcmVhLCAwKTsKLSAgfQorICBpZiAoYXJlYS0+dF9sc3BfcmVmcmVzaFsxXSkKKyAgICB7CisgICAgICB0aHJlYWRfY2FuY2VsIChhcmVhLT50X2xzcF9yZWZyZXNoWzFdKTsKKyAgICAgIHRocmVhZF9leGVjdXRlIChtYXN0ZXIsIGxzcF9yZWZyZXNoX2wyLCBhcmVhLCAwKTsKKyAgICB9CiAKIAogICByZXR1cm4gQ01EX1NVQ0NFU1M7CkBAIC0xNjg3LDE4ICsxNjY4LDE3IEBACiAgICAgICAgbm9fbHNwX2xpZmV0aW1lX2NtZCwKICAgICAgICAibm8gbHNwLWxpZmV0aW1lIiwKICAgICAgICBOT19TVFIKLSAgICAgICAiTFNQIGxpZmV0aW1lIGluIHNlY29uZHNcbiIKLSAgICAgICApCisgICAgICAgIkxTUCBsaWZldGltZSBpbiBzZWNvbmRzXG4iKQogewogICBzdHJ1Y3QgaXNpc19hcmVhICphcmVhOwogCiAgIGFyZWEgPSB2dHktPmluZGV4OwogICBhc3NlcnQgKGFyZWEpOwotICAKLSAgYXJlYS0+bWF4X2xzcF9saWZldGltZVswXSA9IE1BWF9BR0U7ICAgICAgICAgIC8qIDEyMDBzICovCi0gIGFyZWEtPm1heF9sc3BfbGlmZXRpbWVbMV0gPSBNQVhfQUdFOyAgICAgICAgICAvKiAxMjAwcyAqLyAKLSAgYXJlYS0+bHNwX3JlZnJlc2hbMF0gPSBNQVhfTFNQX0dFTl9JTlRFUlZBTDsgIC8qICA5MDBzICovCi0gIGFyZWEtPmxzcF9yZWZyZXNoWzFdID0gTUFYX0xTUF9HRU5fSU5URVJWQUw7ICAvKiAgOTAwcyAqLworCisgIGFyZWEtPm1heF9sc3BfbGlmZXRpbWVbMF0gPSBNQVhfQUdFOwkvKiAxMjAwcyAqLworICBhcmVhLT5tYXhfbHNwX2xpZmV0aW1lWzFdID0gTUFYX0FHRTsJLyogMTIwMHMgKi8KKyAgYXJlYS0+bHNwX3JlZnJlc2hbMF0gPSBNQVhfTFNQX0dFTl9JTlRFUlZBTDsJLyogIDkwMHMgKi8KKyAgYXJlYS0+bHNwX3JlZnJlc2hbMV0gPSBNQVhfTFNQX0dFTl9JTlRFUlZBTDsJLyogIDkwMHMgKi8KIAogICByZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CkBAIC0xNzA4LDM2ICsxNjg4LDMzIEBACiAgICAgICAgIm5vIGxzcC1saWZldGltZSA8MzgwLTY1NTM1PiIsCiAgICAgICAgTk9fU1RSCiAgICAgICAgIk1heGltdW0gTFNQIGxpZmV0aW1lXG4iCi0gICAgICAgIkxTUCBsaWZldGltZSBpbiBzZWNvbmRzXG4iCi0gICAgICAgKQorICAgICAgICJMU1AgbGlmZXRpbWUgaW4gc2Vjb25kc1xuIikKIAogREVGVU4gKGxzcF9saWZldGltZV9sMSwKICAgICAgICBsc3BfbGlmZXRpbWVfbDFfY21kLAogICAgICAgICJsc3AtbGlmZXRpbWUgbGV2ZWwtMSA8MzgwLTY1NTM1PiIsCiAgICAgICAgIk1heGltdW0gTFNQIGxpZmV0aW1lIGZvciBMZXZlbCAxIG9ubHlcbiIKLSAgICAgICAiTFNQIGxpZmV0aW1lIGZvciBMZXZlbCAxIG9ubHkgaW4gc2Vjb25kc1xuIgotICAgICAgICkKKyAgICAgICAiTFNQIGxpZmV0aW1lIGZvciBMZXZlbCAxIG9ubHkgaW4gc2Vjb25kc1xuIikKIHsKICAgc3RydWN0IGlzaXNfYXJlYSAqYXJlYTsKICAgdWludDE2X3QgaW50ZXJ2YWw7CiAKICAgYXJlYSA9IHZ0eS0+aW5kZXg7CiAgIGFzc2VydCAoYXJlYSk7Ci0gIAorCiAgIGludGVydmFsID0gYXRvaSAoYXJndlswXSk7CiAKLSAgaWYgKGludGVydmFsIDwgSVNJU19NSU5fTFNQX0xJRkVUSU1FKSB7Ci0gICAgdnR5X291dCAodnR5LCAiTGV2ZWwtMSBMU1AgbGlmZXRpbWUgKCV1cykgYmVsb3cgJXVzJXMiLAotCSAgICAgaW50ZXJ2YWwsCi0JICAgICBJU0lTX01JTl9MU1BfTElGRVRJTUUsCi0JICAgICBWVFlfTkVXTElORSk7CisgIGlmIChpbnRlcnZhbCA8IElTSVNfTUlOX0xTUF9MSUZFVElNRSkKKyAgICB7CisgICAgICB2dHlfb3V0ICh2dHksICJMZXZlbC0xIExTUCBsaWZldGltZSAoJXVzKSBiZWxvdyAldXMlcyIsCisJICAgICAgIGludGVydmFsLCBJU0lTX01JTl9MU1BfTElGRVRJTUUsIFZUWV9ORVdMSU5FKTsKIAotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQorICAgICAgcmV0dXJuIENNRF9XQVJOSU5HOworICAgIH0KIAogCiAgIGFyZWEtPm1heF9sc3BfbGlmZXRpbWVbMF0gPSBpbnRlcnZhbDsKLSAgYXJlYS0+bHNwX3JlZnJlc2hbMF0gPSBpbnRlcnZhbC0zMDA7CisgIGFyZWEtPmxzcF9yZWZyZXNoWzBdID0gaW50ZXJ2YWwgLSAzMDA7CiAKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQpAQCAtMTc0NiwxNiArMTcyMywxNSBAQAogICAgICAgIG5vX2xzcF9saWZldGltZV9sMV9jbWQsCiAgICAgICAgIm5vIGxzcC1saWZldGltZSBsZXZlbC0xIiwKICAgICAgICBOT19TVFIKLSAgICAgICAiTFNQIGxpZmV0aW1lIGZvciBMZXZlbCAxIG9ubHkgaW4gc2Vjb25kc1xuIgotICAgICAgICkKKyAgICAgICAiTFNQIGxpZmV0aW1lIGZvciBMZXZlbCAxIG9ubHkgaW4gc2Vjb25kc1xuIikKIHsKICAgc3RydWN0IGlzaXNfYXJlYSAqYXJlYTsKIAogICBhcmVhID0gdnR5LT5pbmRleDsKICAgYXNzZXJ0IChhcmVhKTsKLSAgCi0gIGFyZWEtPm1heF9sc3BfbGlmZXRpbWVbMF0gPSBNQVhfQUdFOyAgICAgICAgICAvKiAxMjAwcyAqLyAKLSAgYXJlYS0+bHNwX3JlZnJlc2hbMF0gPSBNQVhfTFNQX0dFTl9JTlRFUlZBTDsgIC8qICA5MDBzICovCisKKyAgYXJlYS0+bWF4X2xzcF9saWZldGltZVswXSA9IE1BWF9BR0U7CS8qIDEyMDBzICovCisgIGFyZWEtPmxzcF9yZWZyZXNoWzBdID0gTUFYX0xTUF9HRU5fSU5URVJWQUw7CS8qICA5MDBzICovCiAKICAgcmV0dXJuIENNRF9TVUNDRVNTOwogfQpAQCAtMTc2NSwzMyArMTc0MSwyOSBAQAogICAgICAgICJubyBsc3AtbGlmZXRpbWUgbGV2ZWwtMSA8MzgwLTY1NTM1PiIsCiAgICAgICAgTk9fU1RSCiAgICAgICAgIk1heGltdW0gTFNQIGxpZmV0aW1lIGZvciBMZXZlbCAxIG9ubHlcbiIKLSAgICAgICAiTFNQIGxpZmV0aW1lIGZvciBMZXZlbCAxIG9ubHkgaW4gc2Vjb25kc1xuIgotICAgICAgICkKKyAgICAgICAiTFNQIGxpZmV0aW1lIGZvciBMZXZlbCAxIG9ubHkgaW4gc2Vjb25kc1xuIikKIAogREVGVU4gKGxzcF9saWZldGltZV9sMiwKICAgICAgICBsc3BfbGlmZXRpbWVfbDJfY21kLAogICAgICAgICJsc3AtbGlmZXRpbWUgbGV2ZWwtMiA8MzgwLTY1NTM1PiIsCiAgICAgICAgIk1heGltdW0gTFNQIGxpZmV0aW1lIGZvciBMZXZlbCAyIG9ubHlcbiIKLSAgICAgICAiTFNQIGxpZmV0aW1lIGZvciBMZXZlbCAyIG9ubHkgaW4gc2Vjb25kc1xuIgotICAgICAgICkKKyAgICAgICAiTFNQIGxpZmV0aW1lIGZvciBMZXZlbCAyIG9ubHkgaW4gc2Vjb25kc1xuIikKIHsKICAgc3RydWN0IGlzaXNfYXJlYSAqYXJlYTsKICAgdWludDE2X3QgaW50ZXJ2YWw7CiAKICAgYXJlYSA9IHZ0eS0+aW5kZXg7CiAgIGFzc2VydCAoYXJlYSk7Ci0gIAorCiAgIGludGVydmFsID0gYXRvaSAoYXJndlswXSk7CiAKLSAgaWYgKGludGVydmFsIDwgSVNJU19NSU5fTFNQX0xJRkVUSU1FKSB7Ci0gICAgdnR5X291dCAodnR5LCAiTGV2ZWwtMiBMU1AgbGlmZXRpbWUgKCV1cykgYmVsb3cgJXVzJXMiLAotCSAgICAgaW50ZXJ2YWwsCi0JICAgICBJU0lTX01JTl9MU1BfTElGRVRJTUUsCi0JICAgICBWVFlfTkVXTElORSk7CisgIGlmIChpbnRlcnZhbCA8IElTSVNfTUlOX0xTUF9MSUZFVElNRSkKKyAgICB7CisgICAgICB2dHlfb3V0ICh2dHksICJMZXZlbC0yIExTUCBsaWZldGltZSAoJXVzKSBiZWxvdyAldXMlcyIsCisJICAgICAgIGludGVydmFsLCBJU0lTX01JTl9MU1BfTElGRVRJTUUsIFZUWV9ORVdMSU5FKTsKIAotICAgIHJldHVybiBDTURfV0FSTklORzsKLSAgfQotCisgICAgICByZXR1cm4gQ01EX1dBUk5JTkc7CisgICAgfQogCiAgIGFyZWEtPm1heF9sc3BfbGlmZXRpbWVbMV0gPSBpbnRlcnZhbDsKICAgYXJlYS0+bHNwX3JlZnJlc2hbMV0gPSBpbnRlcnZhbCAtIDMwMDsKQEAgLTE4MDMsMTYgKzE3NzUsMTUgQEAKICAgICAgICBub19sc3BfbGlmZXRpbWVfbDJfY21kLAogICAgICAgICJubyBsc3AtbGlmZXRpbWUgbGV2ZWwtMiIsCiAgICAgICAgTk9fU1RSCi0gICAgICAgIkxTUCBsaWZldGltZSBmb3IgTGV2ZWwgMiBvbmx5IGluIHNlY29uZHNcbiIKLSAgICAgICApCisgICAgICAgIkxTUCBsaWZldGltZSBmb3IgTGV2ZWwgMiBvbmx5IGluIHNlY29uZHNcbiIpCiB7CiAgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWE7CiAKICAgYXJlYSA9IHZ0eS0+aW5kZXg7CiAgIGFzc2VydCAoYXJlYSk7Ci0gIAotICBhcmVhLT5tYXhfbHNwX2xpZmV0aW1lWzFdID0gTUFYX0FHRTsgICAgICAgICAgLyogMTIwMHMgKi8gCi0gIGFyZWEtPmxzcF9yZWZyZXNoWzFdID0gTUFYX0xTUF9HRU5fSU5URVJWQUw7ICAvKiAgOTAwcyAqLworCisgIGFyZWEtPm1heF9sc3BfbGlmZXRpbWVbMV0gPSBNQVhfQUdFOwkvKiAxMjAwcyAqLworICBhcmVhLT5sc3BfcmVmcmVzaFsxXSA9IE1BWF9MU1BfR0VOX0lOVEVSVkFMOwkvKiAgOTAwcyAqLwogCiAgIHJldHVybiBDTURfU1VDQ0VTUzsKIH0KQEAgLTE4MjIsMTI3ICsxNzkzLDE0OSBAQAogICAgICAgICJubyBsc3AtbGlmZXRpbWUgbGV2ZWwtMiA8MzgwLTY1NTM1PiIsCiAgICAgICAgTk9fU1RSCiAgICAgICAgIk1heGltdW0gTFNQIGxpZmV0aW1lIGZvciBMZXZlbCAyIG9ubHlcbiIKLSAgICAgICAiTFNQIGxpZmV0aW1lIGZvciBMZXZlbCAyIG9ubHkgaW4gc2Vjb25kc1xuIgotICAgICAgICkKLQotCi0KKyAgICAgICAiTFNQIGxpZmV0aW1lIGZvciBMZXZlbCAyIG9ubHkgaW4gc2Vjb25kc1xuIikKIAogLyogSVMtSVMgY29uZmlndXJhdGlvbiB3cml0ZSBmdW5jdGlvbiAqLwogaW50CiBpc2lzX2NvbmZpZ193cml0ZSAoc3RydWN0IHZ0eSAqdnR5KQogewogICBpbnQgd3JpdGUgPSAwOwotICAKLSAgaWYgKGlzaXMgIT0gTlVMTCkgewotICAgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWE7Ci0gICAgc3RydWN0IGxpc3Rub2RlICpub2RlOwotICAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTI7CiAKLSAgICBMSVNUX0xPT1AgKGlzaXMtPmFyZWFfbGlzdCwgYXJlYSwgbm9kZSkgewotICAgICAgLyogSVNJUyAtIEFyZWEgbmFtZSAqLwotICAgICAgdnR5X291dCAodnR5LCAicm91dGVyIGlzaXMgJXMlcyIsYXJlYS0+YXJlYV90YWcsIFZUWV9ORVdMSU5FKTsKLSAgICAgIHdyaXRlKys7Ci0gICAgICAvKiBJU0lTIC0gTmV0ICovCi0gICAgICBpZiAobGlzdGNvdW50IChhcmVhLT5hcmVhX2FkZHJzKSA+IDApIHsKLSAgICAgICAgc3RydWN0IGFyZWFfYWRkciAqYXJlYV9hZGRyOwotICAgICAgICBMSVNUX0xPT1AgKGFyZWEtPmFyZWFfYWRkcnMsIGFyZWFfYWRkciwgbm9kZTIpIHsKLSAgICAgICAgICB2dHlfb3V0ICh2dHksICIgbmV0ICVzJXMiLCAKLQkJICAgaXNvbmV0X3ByaW50IChhcmVhX2FkZHItPmFyZWFfYWRkciwgCi0JCQkJIGFyZWFfYWRkci0+YWRkcl9sZW4gKyBJU0lTX1NZU19JRF9MRU4gKyAxKSwgCi0JCSAgIFZUWV9ORVdMSU5FKTsKLSAgICAgICAgICB3cml0ZSArKzsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLyogSVNJUyAtIER5bmFtaWMgaG9zdG5hbWUgLSBEZWZhdWx0cyB0byB0cnVlIHNvIG9ubHkgZGlzcGxheSBpZiBmYWxzZSovCi0gICAgICBpZiAoIWFyZWEtPmR5bmhvc3RuYW1lKSB7Ci0gICAgICAgIHZ0eV9vdXQgKHZ0eSwgIiBubyBob3N0bmFtZSBkeW5hbWljJXMiLCBWVFlfTkVXTElORSk7Ci0gICAgICAgIHdyaXRlICsrOwotICAgICAgfQotICAgICAgLyogSVNJUyAtIE1ldHJpYy1TdHlsZSAtIHdoZW4gdHJ1ZSBkaXNwbGF5cyB3aWRlICovCi0gICAgICBpZiAoYXJlYS0+bmV3bWV0cmljKSB7Ci0gICAgICAgIHZ0eV9vdXQgKHZ0eSwgIiBtZXRyaWMtc3R5bGUgd2lkZSVzIiwgVlRZX05FV0xJTkUpOwotICAgICAgICB3cml0ZSArKzsKLSAgICAgIH0KLSAgICAgIC8qIElTSVMgLSBBcmVhIGlzLXR5cGUgKGxldmVsLTEtMiBpcyBkZWZhdWx0KSAqLwotICAgICAgaWYgKGFyZWEtPmlzX3R5cGUgID09IElTX0xFVkVMXzEpIHsKLSAgICAgICAgdnR5X291dCAodnR5LCAiIGlzLXR5cGUgbGV2ZWwtMSVzIiwgVlRZX05FV0xJTkUpOwotICAgICAgICB3cml0ZSArKzsKLSAgICAgIH0gZWxzZSB7aWYgKGFyZWEtPmlzX3R5cGUgID09IElTX0xFVkVMXzIpIHsKLSAgICAgICAgdnR5X291dCAodnR5LCAiIGlzLXR5cGUgbGV2ZWwtMi1vbmx5JXMiLCBWVFlfTkVXTElORSk7Ci0gICAgICAgIHdyaXRlICsrOwotICAgICAgfX0KLSAgICAgIC8qIElTSVMgLSBMc3AgZ2VuZXJhdGlvbiBpbnRlcnZhbCAqLwotICAgICAgaWYgKGFyZWEtPmxzcF9nZW5faW50ZXJ2YWxbMF0gPT0gIGFyZWEtPmxzcF9nZW5faW50ZXJ2YWxbMV0pIHsKLQlpZiAoYXJlYS0+bHNwX2dlbl9pbnRlcnZhbFswXSAhPSBMU1BfR0VOX0lOVEVSVkFMX0RFRkFVTFQpIHsKLQkgIHZ0eV9vdXQgKHZ0eSwgIiBsc3AtZ2VuLWludGVydmFsICVkJXMiLCBhcmVhLT5sc3BfZ2VuX2ludGVydmFsWzBdLCAKLSAgICAgICAgICAgICAgICAgICBWVFlfTkVXTElORSk7Ci0JICB3cml0ZSArKzsKLSAgICAgIH19IGVsc2UgewotICAgICAgICBpZiAoYXJlYS0+bHNwX2dlbl9pbnRlcnZhbFswXSAhPSBMU1BfR0VOX0lOVEVSVkFMX0RFRkFVTFQpIHsKLSAgICAgICAgICB2dHlfb3V0ICh2dHksICIgbHNwLWdlbi1pbnRlcnZhbCBsZXZlbC0xICVkJXMiLCAKLSAgICAgICAgICAgICAgICAgICBhcmVhLT5sc3BfZ2VuX2ludGVydmFsWzBdLCBWVFlfTkVXTElORSk7Ci0gICAgICAgICAgd3JpdGUgKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFyZWEtPmxzcF9nZW5faW50ZXJ2YWxbMV0gIT0gTFNQX0dFTl9JTlRFUlZBTF9ERUZBVUxUKSB7Ci0gICAgICAgICAgdnR5X291dCAodnR5LCAiIGxzcC1nZW4taW50ZXJ2YWwgbGV2ZWwtMiAlZCVzIiwgCi0gICAgICAgICAgICAgICAgICAgYXJlYS0+bHNwX2dlbl9pbnRlcnZhbFsxXSwgVlRZX05FV0xJTkUpOwotICAgICAgICAgIHdyaXRlICsrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvKiBJU0lTIC0gTFNQIGxpZmV0aW1lICovCi0gICAgICBpZiAoYXJlYS0+bWF4X2xzcF9saWZldGltZVswXSA9PSBhcmVhLT5tYXhfbHNwX2xpZmV0aW1lWzFdKSB7Ci0JaWYgKGFyZWEtPm1heF9sc3BfbGlmZXRpbWVbMF0gIT0gTUFYX0FHRSkgewotCXZ0eV9vdXQgKHZ0eSwgIiBsc3AtbGlmZXRpbWUgJXUlcyIsIGFyZWEtPm1heF9sc3BfbGlmZXRpbWVbMF0sIAotICAgICAgICAgICAgICAgICBWVFlfTkVXTElORSk7Ci0Jd3JpdGUgKys7Ci0gICAgICB9fSBlbHNlIHsKLQlpZiAoYXJlYS0+bWF4X2xzcF9saWZldGltZVswXSAhPSBNQVhfQUdFKSB7Ci0JdnR5X291dCAodnR5LCAiIGxzcC1saWZldGltZSBsZXZlbC0xICV1JXMiLCBhcmVhLT5tYXhfbHNwX2xpZmV0aW1lWzBdLAotICAgICAgICAgICAgICAgICBWVFlfTkVXTElORSk7Ci0Jd3JpdGUgKys7Ci0JfQotCWlmIChhcmVhLT5tYXhfbHNwX2xpZmV0aW1lWzFdICE9IE1BWF9BR0UpIHsKLQl2dHlfb3V0ICh2dHksICIgbHNwLWxpZmV0aW1lIGxldmVsLTIgJXUlcyIsIGFyZWEtPm1heF9sc3BfbGlmZXRpbWVbMV0sCi0gICAgICAgICAgICAgICAgIFZUWV9ORVdMSU5FKTsKLQl3cml0ZSArKzsKLQl9Ci0gICAgICB9ICAgICAKLSAgICAgICNpZmRlZiBUT1BPTE9HWV9HRU5FUkFURQotICAgICAgLyogc2VlbXMgd2Ugc2F2ZSB0aGUgd2hvbGUgY29tbWFuZCBsaW5lIGhlcmUgKi8KLSAgICAgIGlmIChhcmVhLT50b3BfcGFyYW1zKSB7Ci0gICAgICAgIHZ0eV9vdXQgKHZ0eSwgIiAlcyVzIixhcmVhLT50b3BfcGFyYW1zLCBWVFlfTkVXTElORSk7Ci0gICAgICAgIHdyaXRlICsrOwotICAgICAgfQorICBpZiAoaXNpcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN0cnVjdCBpc2lzX2FyZWEgKmFyZWE7CisgICAgICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CisgICAgICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGUyOwogCi0gICAgICBpZiAobWVtY21wKGFyZWEtPnRvcG9sb2d5X2Jhc2VpcywgREVGQVVMVF9UT1BPTE9HWV9CQVNFSVMsIAotCQkgSVNJU19TWVNfSURfTEVOKSkgewotICAgICAgICB2dHlfb3V0ICh2dHksICIgdG9wb2xvZ3kgYmFzZV9pcyAlcyVzIiwgCi0JCSBzeXNpZF9wcmludCAoYXJlYS0+dG9wb2xvZ3lfYmFzZWlzKSwgVlRZX05FV0xJTkUpOwotICAgICAgICB3cml0ZSArKzsKLSAgICAgIH0KKyAgICAgIExJU1RfTE9PUCAoaXNpcy0+YXJlYV9saXN0LCBhcmVhLCBub2RlKQorICAgICAgeworCS8qIElTSVMgLSBBcmVhIG5hbWUgKi8KKwl2dHlfb3V0ICh2dHksICJyb3V0ZXIgaXNpcyAlcyVzIiwgYXJlYS0+YXJlYV90YWcsIFZUWV9ORVdMSU5FKTsKKwl3cml0ZSsrOworCS8qIElTSVMgLSBOZXQgKi8KKwlpZiAobGlzdGNvdW50IChhcmVhLT5hcmVhX2FkZHJzKSA+IDApCisJICB7CisJICAgIHN0cnVjdCBhcmVhX2FkZHIgKmFyZWFfYWRkcjsKKwkgICAgTElTVF9MT09QIChhcmVhLT5hcmVhX2FkZHJzLCBhcmVhX2FkZHIsIG5vZGUyKQorCSAgICB7CisJICAgICAgdnR5X291dCAodnR5LCAiIG5ldCAlcyVzIiwKKwkJICAgICAgIGlzb25ldF9wcmludCAoYXJlYV9hZGRyLT5hcmVhX2FkZHIsCisJCQkJICAgICBhcmVhX2FkZHItPmFkZHJfbGVuICsgSVNJU19TWVNfSURfTEVOICsKKwkJCQkgICAgIDEpLCBWVFlfTkVXTElORSk7CisJICAgICAgd3JpdGUrKzsKKwkgICAgfQorCSAgfQorCS8qIElTSVMgLSBEeW5hbWljIGhvc3RuYW1lIC0gRGVmYXVsdHMgdG8gdHJ1ZSBzbyBvbmx5IGRpc3BsYXkgaWYgZmFsc2UgKi8KKwlpZiAoIWFyZWEtPmR5bmhvc3RuYW1lKQorCSAgeworCSAgICB2dHlfb3V0ICh2dHksICIgbm8gaG9zdG5hbWUgZHluYW1pYyVzIiwgVlRZX05FV0xJTkUpOworCSAgICB3cml0ZSsrOworCSAgfQorCS8qIElTSVMgLSBNZXRyaWMtU3R5bGUgLSB3aGVuIHRydWUgZGlzcGxheXMgd2lkZSAqLworCWlmIChhcmVhLT5uZXdtZXRyaWMpCisJICB7CisJICAgIHZ0eV9vdXQgKHZ0eSwgIiBtZXRyaWMtc3R5bGUgd2lkZSVzIiwgVlRZX05FV0xJTkUpOworCSAgICB3cml0ZSsrOworCSAgfQorCS8qIElTSVMgLSBBcmVhIGlzLXR5cGUgKGxldmVsLTEtMiBpcyBkZWZhdWx0KSAqLworCWlmIChhcmVhLT5pc190eXBlID09IElTX0xFVkVMXzEpCisJICB7CisJICAgIHZ0eV9vdXQgKHZ0eSwgIiBpcy10eXBlIGxldmVsLTElcyIsIFZUWV9ORVdMSU5FKTsKKwkgICAgd3JpdGUrKzsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGlmIChhcmVhLT5pc190eXBlID09IElTX0xFVkVMXzIpCisJICAgICAgeworCQl2dHlfb3V0ICh2dHksICIgaXMtdHlwZSBsZXZlbC0yLW9ubHklcyIsIFZUWV9ORVdMSU5FKTsKKwkJd3JpdGUrKzsKKwkgICAgICB9CisJICB9CisJLyogSVNJUyAtIExzcCBnZW5lcmF0aW9uIGludGVydmFsICovCisJaWYgKGFyZWEtPmxzcF9nZW5faW50ZXJ2YWxbMF0gPT0gYXJlYS0+bHNwX2dlbl9pbnRlcnZhbFsxXSkKKwkgIHsKKwkgICAgaWYgKGFyZWEtPmxzcF9nZW5faW50ZXJ2YWxbMF0gIT0gTFNQX0dFTl9JTlRFUlZBTF9ERUZBVUxUKQorCSAgICAgIHsKKwkJdnR5X291dCAodnR5LCAiIGxzcC1nZW4taW50ZXJ2YWwgJWQlcyIsCisJCQkgYXJlYS0+bHNwX2dlbl9pbnRlcnZhbFswXSwgVlRZX05FV0xJTkUpOworCQl3cml0ZSsrOworCSAgICAgIH0KKwkgIH0KKwllbHNlCisJICB7CisJICAgIGlmIChhcmVhLT5sc3BfZ2VuX2ludGVydmFsWzBdICE9IExTUF9HRU5fSU5URVJWQUxfREVGQVVMVCkKKwkgICAgICB7CisJCXZ0eV9vdXQgKHZ0eSwgIiBsc3AtZ2VuLWludGVydmFsIGxldmVsLTEgJWQlcyIsCisJCQkgYXJlYS0+bHNwX2dlbl9pbnRlcnZhbFswXSwgVlRZX05FV0xJTkUpOworCQl3cml0ZSsrOworCSAgICAgIH0KKwkgICAgaWYgKGFyZWEtPmxzcF9nZW5faW50ZXJ2YWxbMV0gIT0gTFNQX0dFTl9JTlRFUlZBTF9ERUZBVUxUKQorCSAgICAgIHsKKwkJdnR5X291dCAodnR5LCAiIGxzcC1nZW4taW50ZXJ2YWwgbGV2ZWwtMiAlZCVzIiwKKwkJCSBhcmVhLT5sc3BfZ2VuX2ludGVydmFsWzFdLCBWVFlfTkVXTElORSk7CisJCXdyaXRlKys7CisJICAgICAgfQorCSAgfQorCS8qIElTSVMgLSBMU1AgbGlmZXRpbWUgKi8KKwlpZiAoYXJlYS0+bWF4X2xzcF9saWZldGltZVswXSA9PSBhcmVhLT5tYXhfbHNwX2xpZmV0aW1lWzFdKQorCSAgeworCSAgICBpZiAoYXJlYS0+bWF4X2xzcF9saWZldGltZVswXSAhPSBNQVhfQUdFKQorCSAgICAgIHsKKwkJdnR5X291dCAodnR5LCAiIGxzcC1saWZldGltZSAldSVzIiwgYXJlYS0+bWF4X2xzcF9saWZldGltZVswXSwKKwkJCSBWVFlfTkVXTElORSk7CisJCXdyaXRlKys7CisJICAgICAgfQorCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgaWYgKGFyZWEtPm1heF9sc3BfbGlmZXRpbWVbMF0gIT0gTUFYX0FHRSkKKwkgICAgICB7CisJCXZ0eV9vdXQgKHZ0eSwgIiBsc3AtbGlmZXRpbWUgbGV2ZWwtMSAldSVzIiwKKwkJCSBhcmVhLT5tYXhfbHNwX2xpZmV0aW1lWzBdLCBWVFlfTkVXTElORSk7CisJCXdyaXRlKys7CisJICAgICAgfQorCSAgICBpZiAoYXJlYS0+bWF4X2xzcF9saWZldGltZVsxXSAhPSBNQVhfQUdFKQorCSAgICAgIHsKKwkJdnR5X291dCAodnR5LCAiIGxzcC1saWZldGltZSBsZXZlbC0yICV1JXMiLAorCQkJIGFyZWEtPm1heF9sc3BfbGlmZXRpbWVbMV0sIFZUWV9ORVdMSU5FKTsKKwkJd3JpdGUrKzsKKwkgICAgICB9CisJICB9CisjaWZkZWYgVE9QT0xPR1lfR0VORVJBVEUKKwkvKiBzZWVtcyB3ZSBzYXZlIHRoZSB3aG9sZSBjb21tYW5kIGxpbmUgaGVyZSAqLworCWlmIChhcmVhLT50b3BfcGFyYW1zKQorCSAgeworCSAgICB2dHlfb3V0ICh2dHksICIgJXMlcyIsIGFyZWEtPnRvcF9wYXJhbXMsIFZUWV9ORVdMSU5FKTsKKwkgICAgd3JpdGUrKzsKKwkgIH0KIAotICAgICAgI2VuZGlmIC8qIFRPUE9MT0dZX0dFTkVSQVRFICovCisJaWYgKG1lbWNtcCAoYXJlYS0+dG9wb2xvZ3lfYmFzZWlzLCBERUZBVUxUX1RPUE9MT0dZX0JBU0VJUywKKwkJICAgIElTSVNfU1lTX0lEX0xFTikpCisJICB7CisJICAgIHZ0eV9vdXQgKHZ0eSwgIiB0b3BvbG9neSBiYXNlX2lzICVzJXMiLAorCQkgICAgIHN5c2lkX3ByaW50IChhcmVhLT50b3BvbG9neV9iYXNlaXMpLCBWVFlfTkVXTElORSk7CisJICAgIHdyaXRlKys7CisJICB9CisKKyNlbmRpZiAvKiBUT1BPTE9HWV9HRU5FUkFURSAqLworICAgICAgfQogICAgIH0KLSAgfQotICAKKwogICByZXR1cm4gd3JpdGU7CiB9CiAKLXN0cnVjdCBjbWRfbm9kZSBpc2lzX25vZGUgPQoteworc3RydWN0IGNtZF9ub2RlIGlzaXNfbm9kZSA9IHsKICAgSVNJU19OT0RFLAogICAiJXMoY29uZmlnLXJvdXRlcikjICIsCiAgIDEKIH07CiAKLXZvaWQgCit2b2lkCiBpc2lzX2luaXQgKCkKIHsKLQogICAvKiBJbnN0YWxsIElTLUlTIHRvcCBub2RlICovCiAgIGluc3RhbGxfbm9kZSAoJmlzaXNfbm9kZSwgaXNpc19jb25maWdfd3JpdGUpOwotICAKKwogICBpbnN0YWxsX2VsZW1lbnQgKFZJRVdfTk9ERSwgJnNob3dfY2xuc19uZWlnaGJvcnNfY21kKTsKICAgaW5zdGFsbF9lbGVtZW50IChWSUVXX05PREUsICZzaG93X2lzaXNfbmVpZ2hib3JzX2NtZCk7CiAgIGluc3RhbGxfZWxlbWVudCAoVklFV19OT0RFLCAmc2hvd19jbG5zX25laWdoYm9yc19kZXRhaWxfY21kKTsKQEAgLTE5NjIsNyArMTk1NSw3IEBACiAgIGluc3RhbGxfZWxlbWVudCAoRU5BQkxFX05PREUsICZzaG93X2RhdGFiYXNlX2RldGFpbF9jbWQpOwogICBpbnN0YWxsX2VsZW1lbnQgKEVOQUJMRV9OT0RFLCAmc2hvd19kZWJ1Z2dpbmdfY21kKTsKIAotICBpbnN0YWxsX25vZGUoJmRlYnVnX25vZGUsIGNvbmZpZ193cml0ZV9kZWJ1Zyk7CisgIGluc3RhbGxfbm9kZSAoJmRlYnVnX25vZGUsIGNvbmZpZ193cml0ZV9kZWJ1Zyk7CiAKICAgaW5zdGFsbF9lbGVtZW50IChFTkFCTEVfTk9ERSwgJmRlYnVnX2lzaXNfYWRqX2NtZCk7CiAgIGluc3RhbGxfZWxlbWVudCAoRU5BQkxFX05PREUsICZub19kZWJ1Z19pc2lzX2Fkal9jbWQpOwpAQCAtMjA0Niw3ICsyMDM5LDcgQEAKICAgaW5zdGFsbF9lbGVtZW50IChJU0lTX05PREUsICZzcGZfaW50ZXJ2YWxfbDJfY21kKTsKICAgaW5zdGFsbF9lbGVtZW50IChJU0lTX05PREUsICZub19zcGZfaW50ZXJ2YWxfbDJfY21kKTsKICAgaW5zdGFsbF9lbGVtZW50IChJU0lTX05PREUsICZub19zcGZfaW50ZXJ2YWxfbDJfYXJnX2NtZCk7Ci0gIAorCiAgIGluc3RhbGxfZWxlbWVudCAoSVNJU19OT0RFLCAmbHNwX2xpZmV0aW1lX2NtZCk7CiAgIGluc3RhbGxfZWxlbWVudCAoSVNJU19OT0RFLCAmbm9fbHNwX2xpZmV0aW1lX2NtZCk7CiAgIGluc3RhbGxfZWxlbWVudCAoSVNJU19OT0RFLCAmbm9fbHNwX2xpZmV0aW1lX2FyZ19jbWQpOwpAQCAtMjA3MCwxNCArMjA2Myw4IEBACiAgIGluc3RhbGxfZWxlbWVudCAoRU5BQkxFX05PREUsICZzaG93X2lzaXNfdG9wb2xvZ3lfY21kKTsKICNlbmRpZiAvKiBUT1BPTE9HWV9HRU5FUkFURSAqLwogCi0gIGlzaXNfbmV3KDApOworICBpc2lzX25ldyAoMCk7CiAgIGlzaXNfY2lyY3VpdF9pbml0ICgpOwogICBpc2lzX3plYnJhX2luaXQgKCk7CiAgIGlzaXNfc3BmX2NtZHNfaW5pdCAoKTsKIH0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2lzaXNkL2lzaXNkLmggYi9pc2lzZC9pc2lzZC5oCmluZGV4IDNjYTQyMWEuLmYxMDkzY2MgMTAwNjQ0Ci0tLSBhL2lzaXNkL2lzaXNkLmgKKysrIGIvaXNpc2QvaXNpc2QuaApAQCAtMzIsNyArMzIsOCBAQAogLyogSWYgeW91IHdhbnQgdG9wb2xvZ3kgc3R1ZmYgY29tcGlsZWQgaW4gKi8KIC8qICNkZWZpbmUgVE9QT0xPR1lfR0VORVJBVEUgKi8KIAotc3RydWN0IHJtYXB7CitzdHJ1Y3Qgcm1hcAorewogICBjaGFyICpuYW1lOwogICBzdHJ1Y3Qgcm91dGVfbWFwICptYXA7CiB9OwpAQCAtNDEsNTggKzQyLDYyIEBACiB7CiAgIHVfbG9uZyBwcm9jZXNzX2lkOwogICBpbnQgc3lzaWRfc2V0OwotICB1X2NoYXIgc3lzaWRbSVNJU19TWVNfSURfTEVOXTsgICAgLyogU3lzdGVtSUQgZm9yIHRoaXMgSVMgKi8KLSAgc3RydWN0IGxpc3QgKmFyZWFfbGlzdDsgICAgICAgICAgIC8qIGxpc3Qgb2YgSVMtSVMgYXJlYXMgKi8KKyAgdV9jaGFyIHN5c2lkW0lTSVNfU1lTX0lEX0xFTl07CS8qIFN5c3RlbUlEIGZvciB0aGlzIElTICovCisgIHN0cnVjdCBsaXN0ICphcmVhX2xpc3Q7CS8qIGxpc3Qgb2YgSVMtSVMgYXJlYXMgKi8KICAgc3RydWN0IGxpc3QgKmluaXRfY2lyY19saXN0OwotICBzdHJ1Y3QgbGlzdCAqbmV4dGhvcHM7ICAgICAgICAgICAgLyogSVB2NCBuZXh0IGhvcHMgZnJvbSB0aGlzIElTICovCisgIHN0cnVjdCBsaXN0ICpuZXh0aG9wczsJLyogSVB2NCBuZXh0IGhvcHMgZnJvbSB0aGlzIElTICovCiAjaWZkZWYgSEFWRV9JUFY2Ci0gIHN0cnVjdCBsaXN0ICAqbmV4dGhvcHM2OyAgICAgICAgICAvKiBJUHY2IG5leHQgaG9wcyBmcm9tIHRoaXMgSVMgKi8KLSNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KLSAgdV9jaGFyIG1heF9hcmVhX2FkZHJzOyAgICAgICAgICAgIC8qIG1heGltdW1BcmVhQWRyZXNzZXMgKi8KLSAgc3RydWN0IGFyZWFfYWRkciAqbWFuX2FyZWFfYWRkcnM7IC8qIG1hbnVhbEFyZWFBZGRyZXNzZXMgKi8KLSAgdV9pbnQzMl90IGRlYnVnczsgICAgICAgICAgICAgICAgIC8qIGJpdG1hcCBmb3IgZGVidWcgKi8KLSAgdGltZV90IHVwdGltZTsgICAgICAgICAgICAgICAgICAgIC8qIHdoZW4gZGlkIHdlIHN0YXJ0ICovCi0gIAorICBzdHJ1Y3QgbGlzdCAqbmV4dGhvcHM2OwkvKiBJUHY2IG5leHQgaG9wcyBmcm9tIHRoaXMgSVMgKi8KKyNlbmRpZgkJCQkvKiBIQVZFX0lQVjYgKi8KKyAgdV9jaGFyIG1heF9hcmVhX2FkZHJzOwkvKiBtYXhpbXVtQXJlYUFkcmVzc2VzICovCisgIHN0cnVjdCBhcmVhX2FkZHIgKm1hbl9hcmVhX2FkZHJzOwkvKiBtYW51YWxBcmVhQWRkcmVzc2VzICovCisgIHVfaW50MzJfdCBkZWJ1Z3M7CQkvKiBiaXRtYXAgZm9yIGRlYnVnICovCisgIHRpbWVfdCB1cHRpbWU7CQkvKiB3aGVuIGRpZCB3ZSBzdGFydCAqLworCiAgIC8qIFJlZGlzdHJpYnV0ZWQgZXh0ZXJuYWwgaW5mb3JtYXRpb24uICovCiAgIHN0cnVjdCByb3V0ZV90YWJsZSAqZXh0ZXJuYWxfaW5mb1taRUJSQV9ST1VURV9NQVggKyAxXTsKICAgLyogUmVkaXN0cmlidXRlIG1ldHJpYyBpbmZvLiAqLwotICBzdHJ1Y3QgewotICAgIGludCB0eXBlOyAgICAgICAgICAgICAgICAgICAvKiBJbnRlcm5hbCBvciBFeHRlcm5hbCAgKi8KLSAgICBpbnQgdmFsdWU7ICAgICAgICAgICAgICAgICAgLyogbWV0cmljIHZhbHVlICovCi0gIH0gZG1ldHJpYyBbWkVCUkFfUk9VVEVfTUFYICsgMV07CisgIHN0cnVjdAorICB7CisgICAgaW50IHR5cGU7CQkJLyogSW50ZXJuYWwgb3IgRXh0ZXJuYWwgICovCisgICAgaW50IHZhbHVlOwkJCS8qIG1ldHJpYyB2YWx1ZSAqLworICB9IGRtZXRyaWNbWkVCUkFfUk9VVEVfTUFYICsgMV07CiAKLSAgc3RydWN0IHsKKyAgc3RydWN0CisgIHsKICAgICBjaGFyICpuYW1lOwogICAgIHN0cnVjdCByb3V0ZV9tYXAgKm1hcDsKLSAgfSBybWFwIFtaRUJSQV9ST1VURV9NQVggKyAxXTsKKyAgfSBybWFwW1pFQlJBX1JPVVRFX01BWCArIDFdOwogI2lmZGVmIEhBVkVfSVBWNgotICBzdHJ1Y3QgewotICAgIHN0cnVjdCB7CisgIHN0cnVjdAorICB7CisgICAgc3RydWN0CisgICAgewogICAgICAgY2hhciAqbmFtZTsKICAgICAgIHN0cnVjdCByb3V0ZV9tYXAgKm1hcDsKLSAgICB9IHJtYXAgW1pFQlJBX1JPVVRFX01BWCArIDFdOworICAgIH0gcm1hcFtaRUJSQV9ST1VURV9NQVggKyAxXTsKICAgfSBpbmV0Nl9hZm1vZGU7CiAjZW5kaWYKIH07CiAKLXN0cnVjdCBpc2lzX2FyZWEgCitzdHJ1Y3QgaXNpc19hcmVhCiB7Ci0gIHN0cnVjdCBpc2lzICppc2lzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmFjayBwb2ludGVyICovCi0gIGRpY3RfdCAqbHNwZGJbSVNJU19MRVZFTFNdOyAgICAgICAgICAgICAgICAgLyogbGluay1zdGF0ZSBkYnMgKi8KLSAgc3RydWN0IGlzaXNfc3BmdHJlZSAqc3BmdHJlZVtJU0lTX0xFVkVMU107ICAvKiBUaGUgdjQgU1BUcyAqLwotICBzdHJ1Y3Qgcm91dGVfdGFibGUgKnJvdXRlX3RhYmxlOyAgICAgICAgICAgIC8qIElQdjQgcm91dGVzICovCisgIHN0cnVjdCBpc2lzICppc2lzOwkJLyogYmFjayBwb2ludGVyICovCisgIGRpY3RfdCAqbHNwZGJbSVNJU19MRVZFTFNdOwkvKiBsaW5rLXN0YXRlIGRicyAqLworICBzdHJ1Y3QgaXNpc19zcGZ0cmVlICpzcGZ0cmVlW0lTSVNfTEVWRUxTXTsJLyogVGhlIHY0IFNQVHMgKi8KKyAgc3RydWN0IHJvdXRlX3RhYmxlICpyb3V0ZV90YWJsZTsJLyogSVB2NCByb3V0ZXMgKi8KICNpZmRlZiBIQVZFX0lQVjYKLSAgc3RydWN0IGlzaXNfc3BmdHJlZSAqc3BmdHJlZTZbSVNJU19MRVZFTFNdOyAvKiBUaGUgdjQgU1BUcyAqLwotICBzdHJ1Y3Qgcm91dGVfdGFibGUgKnJvdXRlX3RhYmxlNjsgICAgICAgICAgIC8qIElQdjYgcm91dGVzICovCisgIHN0cnVjdCBpc2lzX3NwZnRyZWUgKnNwZnRyZWU2W0lTSVNfTEVWRUxTXTsJLyogVGhlIHY0IFNQVHMgKi8KKyAgc3RydWN0IHJvdXRlX3RhYmxlICpyb3V0ZV90YWJsZTY7CS8qIElQdjYgcm91dGVzICovCiAjZW5kaWYKICAgaW50IG1pbl9iY2FzdF9tdHU7Ci0gIHN0cnVjdCBsaXN0ICpjaXJjdWl0X2xpc3Q7ICAgICAgICAgICAgICAgICAgLyogSVMtSVMgY2lyY3VpdHMgKi8KLSAgc3RydWN0IGZsYWdzIGZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgIAotICBzdHJ1Y3QgdGhyZWFkICp0X3RpY2s7ICAgICAgICAgICAgICAgICAgICAgIC8qIExTUCB3YWxrZXIgKi8KLSAgc3RydWN0IHRocmVhZCAqdF9yZW1vdmVfYWdlZDsgICAgICAgICAgICAgIAorICBzdHJ1Y3QgbGlzdCAqY2lyY3VpdF9saXN0OwkvKiBJUy1JUyBjaXJjdWl0cyAqLworICBzdHJ1Y3QgZmxhZ3MgZmxhZ3M7CisgIHN0cnVjdCB0aHJlYWQgKnRfdGljazsJLyogTFNQIHdhbGtlciAqLworICBzdHJ1Y3QgdGhyZWFkICp0X3JlbW92ZV9hZ2VkOwogICBpbnQgbHNwX3JlZ2VuZXJhdGVfcGVuZGluZ1tJU0lTX0xFVkVMU107CiAgIHN0cnVjdCB0aHJlYWQgKnRfbHNwX3JlZnJlc2hbSVNJU19MRVZFTFNdOwotICAKKwogICAvKgogICAgKiBDb25maWd1cmFibGVzIAogICAgKi8KQEAgLTEwMSwzNCArMTA2LDM0IEBACiAgIC8qIGRvIHdlIHN1cHBvcnQgZHluYW1pYyBob3N0bmFtZXM/ICAqLwogICBjaGFyIGR5bmhvc3RuYW1lOwogICAvKiBkbyB3ZSBzdXBwb3J0IG5ldyBzdHlsZSBtZXRyaWNzPyAgKi8KLSAgY2hhciBuZXdtZXRyaWM7ICAKKyAgY2hhciBuZXdtZXRyaWM7CiAgIC8qIGlkZW50aWZpZXMgdGhlIHJvdXRpbmcgaW5zdGFuY2UgICAqLwotICBjaGFyICphcmVhX3RhZzsgIAorICBjaGFyICphcmVhX3RhZzsKICAgLyogYXJlYSBhZGRyZXNzZXMgZm9yIHRoaXMgYXJlYSAgICAgICovCi0gIHN0cnVjdCBsaXN0ICphcmVhX2FkZHJzOyAgCi0gIHVfaW50MTZfdCBtYXhfbHNwX2xpZmV0aW1lW0lTSVNfTEVWRUxTXTsgICAgICAgICAKLSAgY2hhciBpc190eXBlOyAgLyogbGV2ZWwtMSBsZXZlbC0xLTIgb3IgbGV2ZWwtMi1vbmx5ICovCisgIHN0cnVjdCBsaXN0ICphcmVhX2FkZHJzOworICB1X2ludDE2X3QgbWF4X2xzcF9saWZldGltZVtJU0lTX0xFVkVMU107CisgIGNoYXIgaXNfdHlwZTsJCQkvKiBsZXZlbC0xIGxldmVsLTEtMiBvciBsZXZlbC0yLW9ubHkgKi8KICAgdV9pbnQxNl90IGxzcF9yZWZyZXNoW0lTSVNfTEVWRUxTXTsKICAgLyogbWluaW11bSB0aW1lIGFsbG93ZWQgYmVmb3JlIGxzcCByZXRyYW5zbWlzc2lvbiAqLwogICB1X2ludDE2X3QgbHNwX2dlbl9pbnRlcnZhbFtJU0lTX0xFVkVMU107CiAgIC8qIG1pbiBpbnRlcnZhbCBiZXR3ZWVuIGJldHdlZW4gY29uc2VxdXRpdmUgU1BGcyAqLwotICB1X2ludDE2X3QgbWluX3NwZl9pbnRlcnZhbFtJU0lTX0xFVkVMU107IAorICB1X2ludDE2X3QgbWluX3NwZl9pbnRlcnZhbFtJU0lTX0xFVkVMU107CiAgIC8qIHRoZSBwZXJjZW50YWdlIG9mIExTUCBtdHUgc2l6ZSB1c2VkLCBiZWZvcmUgZ2VuZXJhdGluZyBhIG5ldyBmcmFnICovCi0gIGludCBsc3BfZnJhZ190aHJlc2hvbGQ7IAorICBpbnQgbHNwX2ZyYWdfdGhyZXNob2xkOwogICBpbnQgaXBfY2lyY3VpdHM7CiAjaWZkZWYgSEFWRV9JUFY2CiAgIGludCBpcHY2X2NpcmN1aXRzOwotI2VuZGlmIC8qIEhBVkVfSVBWNiAqLworI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAqLwogICAvKiBDb3VudGVycyAqLwogICB1X2ludDMyX3QgY2lyY3VpdF9zdGF0ZV9jaGFuZ2VzOwogI2lmZGVmIFRPUE9MT0dZX0dFTkVSQVRFCi0gIHN0cnVjdCBsaXN0ICAgICAgICAgICAgICAgICAgICp0b3BvbG9neTsKLSAgY2hhciAgIHRvcG9sb2d5X2Jhc2Vpc1tJU0lTX1NZU19JRF9MRU5dOyAvKiBpcyBmb3IgdGhlIGZpcnN0IGlzIGVtdWxhdGVkICAqLwotICBjaGFyICAgICAgICAgICAgICAgICAgICB0b3BfcGFyYW1zWzIwMF07IC8qIEZJWE1FOiB3aGF0IGlzIHJlYXNvbmFibGU/ICAgICovCi0jZW5kaWYgLyogVE9QT0xPR1lfR0VORVJBVEUgKi8KKyAgc3RydWN0IGxpc3QgKnRvcG9sb2d5OworICBjaGFyIHRvcG9sb2d5X2Jhc2Vpc1tJU0lTX1NZU19JRF9MRU5dOwkvKiBpcyBmb3IgdGhlIGZpcnN0IGlzIGVtdWxhdGVkICAqLworICBjaGFyIHRvcF9wYXJhbXNbMjAwXTsJCS8qIEZJWE1FOiB3aGF0IGlzIHJlYXNvbmFibGU/ICAgICovCisjZW5kaWYJCQkJLyogVE9QT0xPR1lfR0VORVJBVEUgKi8KIH07CiAKLXZvaWQgaXNpc19pbml0KHZvaWQpOwordm9pZCBpc2lzX2luaXQgKHZvaWQpOwogc3RydWN0IGlzaXNfYXJlYSAqaXNpc19hcmVhX2xvb2t1cCAoY2hhciAqKTsKIAogI2RlZmluZSBERUJVR19BREpfUEFDS0VUUyAgICAgICAgICAgICAgICAoMTw8MCkKZGlmZiAtLWdpdCBhL2lzaXNkL2lzb19jaGVja3N1bS5jIGIvaXNpc2QvaXNvX2NoZWNrc3VtLmMKaW5kZXggZDBiYjhhNy4uZTY1ZjZlZiAxMDA2NDQKLS0tIGEvaXNpc2QvaXNvX2NoZWNrc3VtLmMKKysrIGIvaXNpc2QvaXNvX2NoZWNrc3VtLmMKQEAgLTQ2LDggKzQ2LDggQEAKICAqLwogCiBpbnQKLWlzb19jc3VtX3ZlcmlmeSAodV9jaGFyICpidWZmZXIsIGludCBsZW4sIHVpbnQxNl90ICpjc3VtKQoteyAKK2lzb19jc3VtX3ZlcmlmeSAodV9jaGFyICogYnVmZmVyLCBpbnQgbGVuLCB1aW50MTZfdCAqIGNzdW0pCit7CiAgIHVfaW50OF90ICpwOwogICB1X2ludDMyX3QgYzA7CiAgIHVfaW50MzJfdCBjMTsKQEAgLTcwLDI4ICs3MCwyOCBAQAogICAgKi8KICAgaWYgKGMwID09IDAgfHwgYzEgPT0gMCkKICAgICByZXR1cm4gMTsKLSAgCisKICAgLyoKICAgICogT3RoZXJ3aXNlIGluaXRpYWxpemUgdG8gemVybyBhbmQgY2FsY3VsYXRlLi4uCiAgICAqLwogICBjMCA9IDA7CiAgIGMxID0gMDsKIAotICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICBjMCA9IGMwICsgKihwKyspOwotICAgIGMxICs9IGMwOwotICB9CisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICB7CisgICAgICBjMCA9IGMwICsgKihwKyspOworICAgICAgYzEgKz0gYzA7CisgICAgfQogCiAgIGMwID0gYzAgJSAyNTU7CiAgIGMxID0gYzEgJSAyNTU7Ci0gIAotICBpZiAoIGMwID09IDAgJiYgYzEgPT0gMCkKKworICBpZiAoYzAgPT0gMCAmJiBjMSA9PSAwKQogICAgIHJldHVybiAwOwogCiAgIHJldHVybiAxOwogfQogCi0KIC8qCiAgKiBDcmVhdGVzIHRoZSBjaGVja3N1bS4gKmNzdW0gcG9pbnRzIHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hlY2tzdW0gaW4gdGhlIAogICogUERVLiAKQEAgLTEwMiw3ICsxMDIsNyBAQAogICovCiAjZGVmaW5lIEZJWEVEX0NPREUKIHVfaW50MTZfdAotaXNvX2NzdW1fY3JlYXRlICh1X2NoYXIgKmJ1ZmZlciwgaW50IGxlbiwgdV9pbnQxNl90IG4pCitpc29fY3N1bV9jcmVhdGUgKHVfY2hhciAqIGJ1ZmZlciwgaW50IGxlbiwgdV9pbnQxNl90IG4pCiB7CiAKICAgdV9pbnQ4X3QgKnA7CkBAIC0xMTIsNyArMTEyLDcgQEAKICAgdV9pbnQzMl90IGMwOwogICB1X2ludDMyX3QgYzE7CiAgIHVfaW50MTZfdCBjaGVja3N1bTsKLSAgdV9pbnQxNl90ICAqY3N1bTsKKyAgdV9pbnQxNl90ICpjc3VtOwogICBpbnQgaTsKIAogICBjaGVja3N1bSA9IDA7CkBAIC0xMjAsNDAgKzEyMCw0NiBAQAogICAvKgogICAgKiBaZXJvIHRoZSBjc3VtIGluIHRoZSBwYWNrZXQuCiAgICAqLwotICBjc3VtID0gKHVfaW50MTZfdCopKGJ1ZmZlciArIG4pOworICBjc3VtID0gKHVfaW50MTZfdCAqKSAoYnVmZmVyICsgbik7CiAgICooY3N1bSkgPSBjaGVja3N1bTsKIAogICAvKiBmb3IgdGhlIGxpbWl0YXRpb24gb2Ygb3VyIGltcGxlbWVudGF0aW9uICovCi0gIGlmIChsZW4gPiA1MDAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KKyAgaWYgKGxlbiA+IDUwMDApCisgICAgeworICAgICAgcmV0dXJuIDA7CisgICAgfQogCiAgIHAgPSBidWZmZXI7CiAgIGMwID0gMDsKICAgYzEgPSAwOwogCi0gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgIGMwID0gYzAgKyAqKHArKyk7Ci0gICAgYzEgKz0gYzA7Ci0gIH0KKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgIHsKKyAgICAgIGMwID0gYzAgKyAqKHArKyk7CisgICAgICBjMSArPSBjMDsKKyAgICB9CiAKICAgYzAgPSBjMCAlIDI1NTsKICAgYzEgPSBjMSAlIDI1NTsKIAotICBtdWwgPSAobGVuIC0gbikqKGMwKTsKLSAgCisgIG11bCA9IChsZW4gLSBuKSAqIChjMCk7CisKICNpZmRlZiBGSVhFRF9DT0RFCiAgIHggPSBtdWwgLSBjMCAtIGMxOwogICB5ID0gYzEgLSBtdWwgLSAxOwogCi0gIGlmICggeSA+PSAwICkgeSsrOwotICBpZiAoIHggPCAwICkgeC0tOworICBpZiAoeSA+PSAwKQorICAgIHkrKzsKKyAgaWYgKHggPCAwKQorICAgIHgtLTsKIAogICB4ICU9IDI1NTsKICAgeSAlPSAyNTU7CiAKLSAgaWYgKHggPT0gMCkgeCA9IDI1NTsKLSAgaWYgKHkgPT0gMCkgeSA9IDI1NTsKKyAgaWYgKHggPT0gMCkKKyAgICB4ID0gMjU1OworICBpZiAoeSA9PSAwKQorICAgIHkgPSAyNTU7CiAKICAgeCAmPSAweDAwRkY7CiAKQEAgLTE2NiwxMiArMTcyLDE0IEBACiAgIHkgPSBjMSAtIG11bCAtIDE7CiAgIHkgJT0gMjU1OwogCi0gIGlmICh4ID09IDApIHggPSAyNTU7Ci0gIGlmICh5ID09IDApIHkgPSAyNTU7CisgIGlmICh4ID09IDApCisgICAgeCA9IDI1NTsKKyAgaWYgKHkgPT0gMCkKKyAgICB5ID0gMjU1OwogCiAgIGNoZWNrc3VtID0gKCh5IDw8IDgpIHwgeCk7CiAjZW5kaWYKLSAgCisKICAgLyoKICAgICogTm93IHdlIHdyaXRlIHRoaXMgdG8gdGhlIHBhY2tldAogICAgKi8KQEAgLTE4MSwxMiArMTg5LDggQEAKICAgcmV0dXJuIGNoZWNrc3VtOwogfQogCi0KIGludAotaXNvX2NzdW1fbW9kaWZ5ICh1X2NoYXIgKmJ1ZmZlciwgaW50IGxlbiwgdWludDE2X3QgKmNzdW0pCitpc29fY3N1bV9tb2RpZnkgKHVfY2hhciAqIGJ1ZmZlciwgaW50IGxlbiwgdWludDE2X3QgKiBjc3VtKQogewotICAKICAgcmV0dXJuIDA7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvaXNpc2QvaXNvX2NoZWNrc3VtLmggYi9pc2lzZC9pc29fY2hlY2tzdW0uaAppbmRleCBjZjYwMGE4Li5iYTBkMTk4IDEwMDY0NAotLS0gYS9pc2lzZC9pc29fY2hlY2tzdW0uaAorKysgYi9pc2lzZC9pc29fY2hlY2tzdW0uaApAQCAtMjMsNyArMjMsNyBAQAogI2lmbmRlZiBfWkVCUkFfSVNPX0NTVU1fSAogI2RlZmluZSBfWkVCUkFfSVNPX0NTVU1fSAogCi1pbnQgaXNvX2NzdW1fdmVyaWZ5ICh1X2NoYXIgKmJ1ZmZlciwgaW50IGxlbiwgdWludDE2X3QgKmNzdW0pOwotdV9pbnQxNl90IGlzb19jc3VtX2NyZWF0ZSAodV9jaGFyICpidWZmZXIsIGludCBsZW4sIHVfaW50MTZfdCBuKTsKK2ludCBpc29fY3N1bV92ZXJpZnkgKHVfY2hhciAqIGJ1ZmZlciwgaW50IGxlbiwgdWludDE2X3QgKiBjc3VtKTsKK3VfaW50MTZfdCBpc29fY3N1bV9jcmVhdGUgKHVfY2hhciAqIGJ1ZmZlciwgaW50IGxlbiwgdV9pbnQxNl90IG4pOwogCiAjZW5kaWYgLyogX1pFQlJBX0lTT19DU1VNX0ggKi8K