LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgaXJsYW5fZmlsdGVyLmMKICogVmVyc2lvbjogICAgICAgCiAqIERlc2NyaXB0aW9uOiAgIAogKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCiAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogQ3JlYXRlZCBhdDogICAgRnJpIEphbiAyOSAxMToxNjozOCAxOTk5CiAqIE1vZGlmaWVkIGF0OiAgIFNhdCBPY3QgMzAgMTI6NTg6NDUgMTk5OQogKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIAogKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqICAgICAgCiAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCiAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKiAgCiAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCiAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KICogICAgIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fY29tbW9uLmg+CgovKgogKiBGdW5jdGlvbiBpcmxhbl9maWx0ZXJfcmVxdWVzdCAoc2VsZiwgc2tiKQogKgogKiAgICBIYW5kbGUgZmlsdGVyIHJlcXVlc3QgZnJvbSBjbGllbnQgcGVlciBkZXZpY2UKICoKICovCnZvaWQgaXJsYW5fZmlsdGVyX3JlcXVlc3Qoc3RydWN0IGlybGFuX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoKCWlmICgoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX3R5cGUgPT0gSVJMQU5fRElSRUNURUQpICYmIAoJICAgIChzZWxmLT5wcm92aWRlci5maWx0ZXJfb3BlcmF0aW9uID09IERZTkFNSUMpKQoJewoJCUlSREFfREVCVUcoMCwgIkdpdmluZyBwZWVyIGEgZHluYW1pYyBFdGhlcm5ldCBhZGRyZXNzXG4iKTsKCQlzZWxmLT5wcm92aWRlci5tYWNfYWRkcmVzc1swXSA9IDB4NDA7CgkJc2VsZi0+cHJvdmlkZXIubWFjX2FkZHJlc3NbMV0gPSAweDAwOwoJCXNlbGYtPnByb3ZpZGVyLm1hY19hZGRyZXNzWzJdID0gMHgwMDsKCQlzZWxmLT5wcm92aWRlci5tYWNfYWRkcmVzc1szXSA9IDB4MDA7CgkJCgkJLyogVXNlIGFyYml0cmF0aW9uIHZhbHVlIHRvIGdlbmVyYXRlIE1BQyBhZGRyZXNzICovCgkJaWYgKHNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlID09IEFDQ0VTU19QRUVSKSB7CgkJCXNlbGYtPnByb3ZpZGVyLm1hY19hZGRyZXNzWzRdID0gCgkJCQlzZWxmLT5wcm92aWRlci5zZW5kX2FyYl92YWwgJiAweGZmOwoJCQlzZWxmLT5wcm92aWRlci5tYWNfYWRkcmVzc1s1XSA9IAoJCQkJKHNlbGYtPnByb3ZpZGVyLnNlbmRfYXJiX3ZhbCA+PiA4KSAmIDB4ZmY7CgkJfSBlbHNlIHsKCQkJLyogSnVzdCBnZW5lcmF0ZSBzb21ldGhpbmcgZm9yIG5vdyAqLwoJCQlnZXRfcmFuZG9tX2J5dGVzKHNlbGYtPnByb3ZpZGVyLm1hY19hZGRyZXNzKzQsIDEpOwoJCQlnZXRfcmFuZG9tX2J5dGVzKHNlbGYtPnByb3ZpZGVyLm1hY19hZGRyZXNzKzUsIDEpOwoJCX0KCgkJc2tiLT5kYXRhWzBdID0gMHgwMDsgLyogU3VjY2VzcyAqLwoJCXNrYi0+ZGF0YVsxXSA9IDB4MDM7CgkJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfTU9ERSIsICJOT05FIik7CgkJaXJsYW5faW5zZXJ0X3Nob3J0X3BhcmFtKHNrYiwgIk1BWF9FTlRSWSIsIDB4MDAwMSk7CgkJaXJsYW5faW5zZXJ0X2FycmF5X3BhcmFtKHNrYiwgIkZJTFRFUl9FTlRSWSIsIAoJCQkJCSBzZWxmLT5wcm92aWRlci5tYWNfYWRkcmVzcywgNik7CgkJcmV0dXJuOwoJfQoJCglpZiAoKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl90eXBlID09IElSTEFOX0RJUkVDVEVEKSAmJiAKCSAgICAoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX21vZGUgPT0gRklMVEVSKSkKCXsKCQlJUkRBX0RFQlVHKDAsICJEaXJlY3RlZCBmaWx0ZXIgb25cbiIpOwoJCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIFN1Y2Nlc3MgKi8KCQlza2ItPmRhdGFbMV0gPSAweDAwOwoJCXJldHVybjsKCX0KCWlmICgoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX3R5cGUgPT0gSVJMQU5fRElSRUNURUQpICYmIAoJICAgIChzZWxmLT5wcm92aWRlci5maWx0ZXJfbW9kZSA9PSBOT05FKSkKCXsKCQlJUkRBX0RFQlVHKDAsICJEaXJlY3RlZCBmaWx0ZXIgb2ZmXG4iKTsKCQlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBTdWNjZXNzICovCgkJc2tiLT5kYXRhWzFdID0gMHgwMDsKCQlyZXR1cm47Cgl9CgoJaWYgKChzZWxmLT5wcm92aWRlci5maWx0ZXJfdHlwZSA9PSBJUkxBTl9CUk9BRENBU1QpICYmIAoJICAgIChzZWxmLT5wcm92aWRlci5maWx0ZXJfbW9kZSA9PSBGSUxURVIpKQoJewoJCUlSREFfREVCVUcoMCwgIkJyb2FkY2FzdCBmaWx0ZXIgb25cbiIpOwoJCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIFN1Y2Nlc3MgKi8KCQlza2ItPmRhdGFbMV0gPSAweDAwOwoJCXJldHVybjsKCX0KCWlmICgoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX3R5cGUgPT0gSVJMQU5fQlJPQURDQVNUKSAmJiAKCSAgICAoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX21vZGUgPT0gTk9ORSkpCgl7CgkJSVJEQV9ERUJVRygwLCAiQnJvYWRjYXN0IGZpbHRlciBvZmZcbiIpOwoJCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIFN1Y2Nlc3MgKi8KCQlza2ItPmRhdGFbMV0gPSAweDAwOwoJCXJldHVybjsKCX0KCWlmICgoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX3R5cGUgPT0gSVJMQU5fTVVMVElDQVNUKSAmJiAKCSAgICAoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX21vZGUgPT0gRklMVEVSKSkKCXsKCQlJUkRBX0RFQlVHKDAsICJNdWx0aWNhc3QgZmlsdGVyIG9uXG4iKTsKCQlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBTdWNjZXNzICovCgkJc2tiLT5kYXRhWzFdID0gMHgwMDsKCQlyZXR1cm47Cgl9CglpZiAoKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl90eXBlID09IElSTEFOX01VTFRJQ0FTVCkgJiYgCgkgICAgKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl9tb2RlID09IE5PTkUpKQoJewoJCUlSREFfREVCVUcoMCwgIk11bHRpY2FzdCBmaWx0ZXIgb2ZmXG4iKTsKCQlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBTdWNjZXNzICovCgkJc2tiLT5kYXRhWzFdID0gMHgwMDsKCQlyZXR1cm47Cgl9CglpZiAoKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl90eXBlID09IElSTEFOX01VTFRJQ0FTVCkgJiYgCgkgICAgKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl9vcGVyYXRpb24gPT0gR0VUKSkKCXsKCQlJUkRBX0RFQlVHKDAsICJNdWx0aWNhc3QgZmlsdGVyIGdldFxuIik7CgkJc2tiLT5kYXRhWzBdID0gMHgwMDsgLyogU3VjY2Vzcz8gKi8KCQlza2ItPmRhdGFbMV0gPSAweDAyOwoJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX01PREUiLCAiTk9ORSIpOwoJCWlybGFuX2luc2VydF9zaG9ydF9wYXJhbShza2IsICJNQVhfRU5UUlkiLCAxNik7CgkJcmV0dXJuOwoJfQoJc2tiLT5kYXRhWzBdID0gMHgwMDsgLyogQ29tbWFuZCBub3Qgc3VwcG9ydGVkICovCglza2ItPmRhdGFbMV0gPSAweDAwOwoKCUlSREFfREVCVUcoMCwgIk5vdCBpbXBsZW1lbnRlZCFcbiIpOwp9CgovKgogKiBGdW5jdGlvbiBjaGVja19yZXF1ZXN0X3BhcmFtIChzZWxmLCBwYXJhbSwgdmFsdWUpCiAqCiAqICAgIENoZWNrIHBhcmFtZXRlcnMgaW4gcmVxdWVzdCBmcm9tIHBlZXIgZGV2aWNlCiAqCiAqLwp2b2lkIGlybGFuX2NoZWNrX2NvbW1hbmRfcGFyYW0oc3RydWN0IGlybGFuX2NiICpzZWxmLCBjaGFyICpwYXJhbSwgY2hhciAqdmFsdWUpCnsKCV9fdTggKmJ5dGVzOwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCWJ5dGVzID0gdmFsdWU7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCglJUkRBX0RFQlVHKDQsICIlcywgJXNcbiIsIHBhcmFtLCB2YWx1ZSk7CgoJLyoKCSAqICBUaGlzIGlzIGV4cGVyaW1lbnRhbCEhIERCLgoJICovCgkgaWYgKHN0cmNtcChwYXJhbSwgIk1PREUiKSA9PSAwKSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgkJc2VsZi0+dXNlX3VkYXRhID0gVFJVRTsKCQlyZXR1cm47Cgl9CgoJLyoKCSAqICBGSUxURVJfVFlQRQoJICovCglpZiAoc3RyY21wKHBhcmFtLCAiRklMVEVSX1RZUEUiKSA9PSAwKSB7CgkJaWYgKHN0cmNtcCh2YWx1ZSwgIkRJUkVDVEVEIikgPT0gMCkgewoJCQlzZWxmLT5wcm92aWRlci5maWx0ZXJfdHlwZSA9IElSTEFOX0RJUkVDVEVEOwoJCQlyZXR1cm47CgkJfQoJCWlmIChzdHJjbXAodmFsdWUsICJNVUxUSUNBU1QiKSA9PSAwKSB7CgkJCXNlbGYtPnByb3ZpZGVyLmZpbHRlcl90eXBlID0gSVJMQU5fTVVMVElDQVNUOwoJCQlyZXR1cm47CgkJfQoJCWlmIChzdHJjbXAodmFsdWUsICJCUk9BRENBU1QiKSA9PSAwKSB7CgkJCXNlbGYtPnByb3ZpZGVyLmZpbHRlcl90eXBlID0gSVJMQU5fQlJPQURDQVNUOwoJCQlyZXR1cm47CgkJfQoJfQoJLyoKCSAqICBGSUxURVJfTU9ERQoJICovCglpZiAoc3RyY21wKHBhcmFtLCAiRklMVEVSX01PREUiKSA9PSAwKSB7CgkJaWYgKHN0cmNtcCh2YWx1ZSwgIkFMTCIpID09IDApIHsKCQkJc2VsZi0+cHJvdmlkZXIuZmlsdGVyX21vZGUgPSBBTEw7CgkJCXJldHVybjsKCQl9CgkJaWYgKHN0cmNtcCh2YWx1ZSwgIkZJTFRFUiIpID09IDApIHsKCQkJc2VsZi0+cHJvdmlkZXIuZmlsdGVyX21vZGUgPSBGSUxURVI7CgkJCXJldHVybjsKCQl9CgkJaWYgKHN0cmNtcCh2YWx1ZSwgIk5PTkUiKSA9PSAwKSB7CgkJCXNlbGYtPnByb3ZpZGVyLmZpbHRlcl9tb2RlID0gRklMVEVSOwoJCQlyZXR1cm47CgkJfQoJfQoJLyoKCSAqICBGSUxURVJfT1BFUkFUSU9OCgkgKi8KCWlmIChzdHJjbXAocGFyYW0sICJGSUxURVJfT1BFUkFUSU9OIikgPT0gMCkgewoJCWlmIChzdHJjbXAodmFsdWUsICJEWU5BTUlDIikgPT0gMCkgewoJCQlzZWxmLT5wcm92aWRlci5maWx0ZXJfb3BlcmF0aW9uID0gRFlOQU1JQzsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoc3RyY21wKHZhbHVlLCAiR0VUIikgPT0gMCkgewoJCQlzZWxmLT5wcm92aWRlci5maWx0ZXJfb3BlcmF0aW9uID0gR0VUOwoJCQlyZXR1cm47CgkJfQoJfQp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9wcmludF9maWx0ZXIgKGZpbHRlcl90eXBlLCBidWYpCiAqCiAqICAgIFByaW50IHN0YXR1cyBvZiBmaWx0ZXIuIFVzZWQgYnkgL3Byb2MgZmlsZSBzeXN0ZW0KICoKICovCiNpZmRlZiBDT05GSUdfUFJPQ19GUwojZGVmaW5lIE1BU0syU1RSKG0scykJeyAubWFzayA9IG0sIC5zdHIgPSBzIH0KCnZvaWQgaXJsYW5fcHJpbnRfZmlsdGVyKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBpbnQgZmlsdGVyX3R5cGUpCnsKCXN0YXRpYyBzdHJ1Y3QgewoJCWludCBtYXNrOwoJCWNvbnN0IGNoYXIgKnN0cjsKCX0gZmlsdGVyX21hc2syc3RyW10gPSB7CgkJTUFTSzJTVFIoSVJMQU5fRElSRUNURUQsCSJESVJFQ1RFRCIpLAoJCU1BU0syU1RSKElSTEFOX0ZVTkNUSU9OQUwsCSJGVU5DVElPTkFMIiksCgkJTUFTSzJTVFIoSVJMQU5fR1JPVVAsCQkiR1JPVVAiKSwKCQlNQVNLMlNUUihJUkxBTl9NQUNfRlJBTUUsCSJNQUNfRlJBTUUiKSwKCQlNQVNLMlNUUihJUkxBTl9NVUxUSUNBU1QsCSJNVUxUSUNBU1QiKSwKCQlNQVNLMlNUUihJUkxBTl9CUk9BRENBU1QsCSJCUk9BRENBU1QiKSwKCQlNQVNLMlNUUihJUkxBTl9JUFhfU09DS0VULAkiSVBYX1NPQ0tFVCIpLAoJCU1BU0syU1RSKDAsCQkJTlVMTCkKCX0sICpwOwoKCWZvciAocCA9IGZpbHRlcl9tYXNrMnN0cjsgcC0+c3RyOyBwKyspIHsKCQlpZiAoZmlsdGVyX3R5cGUgJiBwLT5tYXNrKQoJCQlzZXFfcHJpbnRmKHNlcSwgIiVzICIsIHAtPnN0cik7Cgl9CglzZXFfcHV0YyhzZXEsICdcbicpOwp9CiN1bmRlZiBNQVNLMlNUUgojZW5kaWYK