LyogICRWRVI6IHZiY2MgKGljLmMpICRSZXZpc2lvbjogMS42NSAkICAqLwoKI2luY2x1ZGUgInZiYy5oIgojaW5jbHVkZSAib3B0LmgiCgojZGVmaW5lIFJOT1NBVkUgMzIgLyogcmVnaXN0ZXIgZG9lcyBub3QgaGF2ZSB0byBiZSBzYXZlZCBhY3Jvc3MgY2FsbCAqLwojZGVmaW5lIFJIQUxGICAgNjQgLyogaGFsZiBvZiBhIHJlZ2lzdGVyIHBhaXIgd2FzIGFscmVhZHkgYWxsb2NhdGVkICovCgpzdGF0aWMgY2hhciBGSUxFX1tdPV9fRklMRV9fOwoKc3RhdGljIElDICpmaXJzdF9wdXNoZWQ7CnN0YXRpYyB1bnNpZ25lZCBpbnQgb3B1c2hlZDsKc3RhdGljIGludCB2b2xhdGlsZV9jb252ZXJ0OwoKaW50IGRvX2FyaXRoKG5wLElDICosbnAsb2JqICopOwpzdGF0aWMgb2JqICpwb3N0b3Bfb2JqOwpzdGF0aWMgaW50IHBvc3RvcF90eXBlOwpucCBnZW5fbGliY2FsbChjaGFyICpmbmFtZSxucCBhcmcxLHR5cGUgKnQxLG5wIGFyZzIsdHlwZSAqdDIpOwoKc3RhdGljIHZvaWQgaGFuZGxlX3JlZ2xpc3QocmVnYXJnc19saXN0ICosb2JqICopOwoKc3RhdGljIHZvaWQgZml4X3B1c2hpYyhJQyAqKnB1c2hpYyxJQyAqbmV3KQp7CiAgSUMgKnA9bGFzdF9pYzsKICB3aGlsZShwJiZwLT5jb2RlPT1GUkVFUkVHKSBwPXAtPnByZXY7CiAgaWYobmV3PT0qcHVzaGljJiZuZXchPXApewogICAgaWYoREVCVUcmMSl7CiAgICAgIHByaW50ZigicHVzaGljIGNvbnZlcnRlZCB0bzpcbiIpOwogICAgICBwcmljMihzdGRvdXQscCk7CiAgICB9CiAgICAqcHVzaGljPXA7CiAgfQp9CgojaWYgSEFWRV9MSUJDQUxMUwovKiBhdm9pZCBjYWxsaW5nIHVzZV9saWJjYWxsIHdpdGggaWxsZWdhbCBvcGVyYW5kcyAqLwpzdGF0aWMgY2hhciAqdXNlX2xpYmNhbGxfd3JhcChpbnQgYyxpbnQgdCxpbnQgdDIpCnsKICBpZihvcHRmbGFncyYyKQogICAgcmV0dXJuIDA7CgogIGlmKGM9PVBNVUxUKSBjPU1VTFQ7CiAgaWYoKGM+PU9SJiZjPD1BTkQpfHwoYz49TFNISUZUJiZjPD1LT01QTEVNRU5UKXx8Yz09Q09NUEFSRXx8Yz09Q09OVkVSVHx8Yz09TUlOVVN8fGM9PVRFU1QpCiAgICByZXR1cm4gdXNlX2xpYmNhbGwoYyx0LHQyKTsKICByZXR1cm4gMDsKfQojZW5kaWYKCnZvaWQgZ2VuX3Rlc3Qob2JqICpvLGludCB0LGludCBicmFuY2gsaW50IGxhYmVsKQovKiAgR2VuZXJpZXJ0IGVpbiB0ZXN0IG8sIGJyYW5jaCBsYWJlbCB1bmQgcGFzc3QgYXVmLCBkYXNzICAgICAgKi8KLyogIGtlaW4gVEVTVCBjb25zdCBnZW5lcmllcnQgd2lyZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCnsKICBJQyAqbmV3OwogIGlmKG8tPmZsYWdzJktPTlNUKXsKICAgIGV2YWxfY29uc3QoJm8tPnZhbCx0KTsKICAgIGlmKHpsZGVxdG8odmxkb3VibGUsZDJ6bGQoMC4wKSkmJnptZXF0byh2bWF4LGwyem0oMEwpKSYmenVtZXF0byh2dW1heCx1bDJ6dW0oMFVMKSkpewogICAgICBpZihicmFuY2g9PUJFUSkgYnJhbmNoPUJSQTsgZWxzZSBicmFuY2g9MDsKICAgIH1lbHNlewogICAgICBpZihicmFuY2g9PUJORSkgYnJhbmNoPUJSQTsgZWxzZSBicmFuY2g9MDsKICAgIH0KICB9ZWxzZXsKI2lmIEhBVkVfTElCQ0FMTFMKICAgIHN0YXRpYyBub2RlIG49e1RFU1R9LG5uPXtSRUlOVEVSUFJFVH07CiAgICBzdGF0aWMgdHlwZSBudCxpdD17SU5UfTsKICAgIGNoYXIgKmxpYm5hbWU7CiAgICBuLmxlZnQ9Jm5uOwogICAgbi5udHlwPSZpdDsKICAgIG5uLm50eXA9Jm50OwogICAgbnQuZmxhZ3M9dDsKICAgIG4ubz1ubi5vPSpvOwogICAgaWYobGlibmFtZT11c2VfbGliY2FsbF93cmFwKFRFU1QsdCwwKSl7CiAgICAgIG5ldz1uZXdfSUMoKTsKICAgICAgbmV3LT5jb2RlPVRFU1Q7CiAgICAgIG5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CiAgICAgIG5ldy0+dHlwZj1JTlQ7CiAgICAgIG5ldy0+cTE9Z2VuX2xpYmNhbGwobGlibmFtZSwmbm4sJm50LDAsMCktPm87CiAgICAgIGFkZF9JQyhuZXcpOwogICAgfWVsc2V7CiNlbmRpZgogICAgICBuZXc9bmV3X0lDKCk7CiAgICAgIG5ldy0+Y29kZT1URVNUOwogICAgICBuZXctPnEyLmZsYWdzPW5ldy0+ei5mbGFncz0wOwogICAgICBuZXctPnR5cGY9dDsKICAgICAgbmV3LT5xMT0qbzsKICAgICAgYWRkX0lDKG5ldyk7CiNpZiBIQVZFX0xJQkNBTExTCiAgICB9CiNlbmRpZgogIH0KICBpZihicmFuY2gpewogICAgbmV3PW5ld19JQygpOwogICAgbmV3LT5jb2RlPWJyYW5jaDsKICAgIG5ldy0+dHlwZj1sYWJlbDsKICAgIGFkZF9JQyhuZXcpOwogIH0KfQoKLyogcmVtb3ZlIGEgZnJlZXJlZyBpZiBhIHNjcmF0Y2ggcmVnaXN0ZXIgaXMgbmVlZGVkIG1vcmUgdGhhbiBvbmNlICovCnN0YXRpYyB2b2lkIGtlZXBfcmVnKGludCByKQp7CiAgSUMgKm47CiAgaWYobm9jb2RlKSByZXR1cm47CiAgbj1sYXN0X2ljOwogIHdoaWxlKG4pewogICAgaWYobi0+Y29kZT09Q0FMTCYmcmVnc2NyYXRjaFtyXSl7CiAgICAgIElDICpyZXQ7CiAgICAgIHJlZ3Nbcl09MTsKICAgICAgc2F2ZXNjcmF0Y2goTU9WRUZST01SRUcsbi0+cHJldiwwLCZuLT5xMSk7CiAgICAgIHJldD1uLT5uZXh0OwogICAgICB3aGlsZShyZXQtPmNvZGU9PUFMTE9DUkVHfHxyZXQtPmNvZGU9PUZSRUVSRUcpCiAgICAgICAgcmV0PXJldC0+bmV4dDsKICAgICAgaWYocmV0LT5jb2RlPT1HRVRSRVRVUk4pewogICAgICAgIGlmKChyZXQtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnJldC0+ei5yZWc9PXIpIAogICAgICAgICAgcmV0LT56LmZsYWdzJj1+UkVHOwogICAgICB9ZWxzZQogICAgICAgIHJldD1yZXQtPnByZXY7CiAgICAgIHNhdmVzY3JhdGNoKE1PVkVUT1JFRyxyZXQsMCwmbi0+cTEpOwogICAgfQogICAgaWYobi0+Y29kZT09RlJFRVJFRyYmbi0+cTEucmVnPT1yKXsKICAgICAgcmVtb3ZlX0lDKG4pOwogICAgICBpZighbm9jb2RlKQogICAgICAgIHJlZ3Nbcl09MTsKICAgICAgYnJlYWs7CiAgICB9CiAgICBuPW4tPnByZXY7CiAgfQp9CgovKiBHZW5lcmF0ZSBjb2RlIHRvIGluc2VydCBhIGJpdGZpZWxkICovCnZvaWQgaW5zZXJ0X2JpdGZpZWxkKG9iaiAqZGVzdCxvYmogKnNyYyxvYmogKnZhbCxpbnQgYmZzLGludCBiZm8saW50IHQsaW50IGlzY2xlYXIpCnsKICAvKkZJWE1FOiBzaG9ydGN1dCBiZWFjaHRlbj8gKi8KICBJQyAqbmV3OwogIG9iaiB0bXAxLHRtcDIsdG1wMzsKICBpbnQgdm1lcms7CiAgYmZvPWJmbGF5b3V0KGJmbyxiZnMsdCk7CiAgaWYoKGRlc3QtPmZsYWdzJlJFRykmJiFyZWdzW2Rlc3QtPnJlZ10pCiAgICBrZWVwX3JlZyhkZXN0LT5yZWcpOwogIG5ldz1uZXdfSUMoKTsKICBuZXctPmNvZGU9QU5EOwogIG5ldy0+dHlwZj10OwogIG5ldy0+cTE9KnNyYzsKICBuZXctPnExLmZsYWdzJj1+U0NSQVRDSDsKICBuZXctPnEyLmZsYWdzPUtPTlNUOwogIGd2YWwudm1heD16bXN1Yih6bWxzaGlmdChsMnptKDFMKSxsMnptKChpbnQpYmZzKSksbDJ6bSgxTCkpOwogIGV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKICBpbnNlcnRfY29uc3QoJm5ldy0+cTIudmFsLHQpOwogIGdldF9zY3JhdGNoKCZuZXctPnosdCwwLDApOwogIHRtcDE9bmV3LT56OwogIGlmKChuZXctPnExLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKICAgIGNhbGMoQU5ELG5ldy0+dHlwZiwmbmV3LT5xMS52YWwsJm5ldy0+cTIudmFsLCZuZXctPnExLnZhbCwwKTsKICAgIG5ldy0+Y29kZT1BU1NJR047CiAgICBuZXctPnEyLmZsYWdzPTA7CiAgICBuZXctPnEyLnZhbC52bWF4PXNpemV0YWJbbmV3LT50eXBmJk5RXTsKICB9CiAgKnZhbD10bXAxOwogIHZtZXJrPXZhbC0+ZmxhZ3M7CiAgdG1wMS5mbGFncyY9flNDUkFUQ0g7CiAgYWRkX0lDKG5ldyk7CiAgaWYoYmZvIT0wKXsKICAgIG5ldz1uZXdfSUMoKTsKICAgIG5ldy0+Y29kZT1MU0hJRlQ7CiAgICBuZXctPnR5cGY9dDsKICAgIG5ldy0+dHlwZjI9SU5UOwogICAgbmV3LT5xMT10bXAxOwogICAgbmV3LT5xMi5mbGFncz1LT05TVDsKICAgIG5ldy0+cTIudmFsLnZpbnQ9em0yemkobDJ6bSgobG9uZyliZm8pKTsKICAgIGdldF9zY3JhdGNoKCZuZXctPnosdCwwLDApOwogICAgdG1wMz1uZXctPno7CiAgICBhZGRfSUMobmV3KTsKICB9ZWxzZXsKICAgIHRtcDM9dG1wMTsKICB9CiAgaWYoIWlzY2xlYXIpewogICAgbmV3PW5ld19JQygpOwogICAgbmV3LT5jb2RlPUFORDsKICAgIG5ldy0+dHlwZj10OwogICAgbmV3LT5xMT0qZGVzdDsKICAgIG5ldy0+cTEuZmxhZ3MmPX5TQ1JBVENIOwogICAgbmV3LT5xMi5mbGFncz1LT05TVDsKICAgIGd2YWwudm1heD16bWtvbXBsKHptbHNoaWZ0KHptc3ViKHptbHNoaWZ0KGwyem0oMUwpLGwyem0oKGludCliZnMpKSxsMnptKDFMKSksbDJ6bSgobG9uZyliZm8pKSk7CiAgICBldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CiAgICBpbnNlcnRfY29uc3QoJm5ldy0+cTIudmFsLHQpOwogICAgZ2V0X3NjcmF0Y2goJm5ldy0+eix0LDAsMCk7CiAgICB0bXAyPW5ldy0+ejsKICAgIGFkZF9JQyhuZXcpOwogIH0KICBuZXc9bmV3X0lDKCk7CiAgbmV3LT5jb2RlPU9SOwogIG5ldy0+dHlwZj10OwogIGlmKGlzY2xlYXIpCiAgICBuZXctPnExPSpkZXN0OwogIGVsc2UKICAgIG5ldy0+cTE9dG1wMjsKICBuZXctPnEyPXRtcDM7CiAgbmV3LT56PSpkZXN0OwogIGFkZF9JQyhuZXcpOwogIGlmKGRlc3QtPmZsYWdzJihSRUd8U0NSQVRDSCkpIGZyZWVfcmVnKGRlc3QtPnJlZyk7CiAgdmFsLT5mbGFncz12bWVyazsKfQoKdm9pZCBpbmxpbmVfbWVtY3B5KG5wIHosbnAgcSx6bWF4IHNpemUpCi8qICBmdWVndCBlaW4gQVNTSUdOLUlDIGVpbiwgZGFzIG1lbWNweSh6LHEsc2l6ZSkgZW50c3ByaWNodCAgICAqLwp7CiAgICBJQyAqbmV3PW5ld19JQygpOwogICAgaWYoIUlTUE9JTlRFUih6LT5udHlwLT5mbGFncykpIHtlcnJvcigzOSk7cmV0dXJuO30KICAgIGlmKCFJU1BPSU5URVIocS0+bnR5cC0+ZmxhZ3MpKSB7ZXJyb3IoMzkpO3JldHVybjt9CgogICAgaWYoei0+ZmxhZ3M9PUFERFJFU1N8fHotPmZsYWdzPT1BRERSRVNTQXx8ei0+ZmxhZ3M9PUFERFJFU1NTKXsKICAgICAgZ2VuX0lDKHosMCwwKTsKICAgICAgbmV3LT56PXotPmxlZnQtPm87CiAgICAgIGlmKHotPmZsYWdzIT1BRERSRVNTUyYmei0+bGVmdC0+ZmxhZ3M9PUlERU5USUZJRVImJmlzX3ZsZW5ndGgoei0+bGVmdC0+bnR5cCkpewoJLyogdmFyaWFibGUgbGVuZ3RoIGFycmF5ICovCgluZXctPnouZmxhZ3N8PURSRUZPQko7CgluZXctPnouZHR5cD1QT0lOVEVSX1RZUEUoei0+bnR5cC0+bmV4dCk7CiAgICAgIH0KICAgIH1lbHNlewogICAgICBnZW5fSUMoeiwwLDApOwogICAgICBpZih6LT5vLmZsYWdzJkRSRUZPQkopewogICAgICAgIElDICpuMj1uZXdfSUMoKTsKICAgICAgICBuMi0+Y29kZT1BU1NJR047CiAgICAgICAgbjItPnR5cGY9cS0+bnR5cC0+ZmxhZ3M7CiAgICAgICAgbjItPnExPXotPm87CiAgICAgICAgZ2V0X3NjcmF0Y2goJm4yLT56LHotPm50eXAtPmZsYWdzLHotPm50eXAtPm5leHQtPmZsYWdzLHotPm50eXApOwogICAgICAgIG4yLT5xMi5mbGFncz0wOwogICAgICAgIG4yLT5xMi52YWwudm1heD1zaXpldGFiW1BPSU5URVJfVFlQRSh6LT5udHlwLT5uZXh0KV07CiAgICAgICAgbmV3LT56PW4yLT56OwogICAgICAgIGFkZF9JQyhuMik7CiAgICAgIH1lbHNlewogICAgICAgIG5ldy0+ej16LT5vOwogICAgICB9CiAgICAgIGlmKG5ldy0+ei5mbGFncyZWQVJBRFIpewoJbmV3LT56LmZsYWdzJj1+VkFSQURSOyAKICAgICAgfWVsc2V7CgluZXctPnouZmxhZ3N8PURSRUZPQko7CgluZXctPnouZHR5cD1QT0lOVEVSX1RZUEUoei0+bnR5cC0+bmV4dCk7CiAgICAgIH0KICAgIH0KICAgIGlmKHotPm50eXAtPm5leHQtPmZsYWdzJlZPTEFUSUxFKXsKICAgICAgaWYobmV3LT56LmZsYWdzJkRSRUZPQkopCgluZXctPnouZHR5cHw9UFZPTEFUSUxFOwogICAgfQogICAgaWYocS0+ZmxhZ3M9PUFERFJFU1N8fHEtPmZsYWdzPT1BRERSRVNTQXx8cS0+ZmxhZ3M9PUFERFJFU1NTKXsKICAgICAgZ2VuX0lDKHEsMCwwKTsKICAgICAgbmV3LT5xMT1xLT5sZWZ0LT5vOwogICAgICBpZihxLT5mbGFncyE9QUREUkVTU1MmJnEtPmxlZnQtPmZsYWdzPT1JREVOVElGSUVSJiZpc192bGVuZ3RoKHEtPmxlZnQtPm50eXApKXsKCS8qIHZhcmlhYmxlIGxlbmd0aCBhcnJheSAqLwoJbmV3LT5xMS5mbGFnc3w9RFJFRk9CSjsKCW5ldy0+cTEuZHR5cD1QT0lOVEVSX1RZUEUocS0+bnR5cC0+bmV4dCk7CiAgICAgIH0KICAgIH1lbHNleyAgICAKICAgICAgZ2VuX0lDKHEsMCwwKTsKICAgICAgaWYocS0+by5mbGFncyZEUkVGT0JKKXsKICAgICAgICBJQyAqbjI9bmV3X0lDKCk7CiAgICAgICAgbjItPmNvZGU9QVNTSUdOOwogICAgICAgIG4yLT50eXBmPXEtPm50eXAtPmZsYWdzOwogICAgICAgIG4yLT5xMT1xLT5vOwogICAgICAgIGdldF9zY3JhdGNoKCZuMi0+eixxLT5udHlwLT5mbGFncyxxLT5udHlwLT5uZXh0LT5mbGFncyxxLT5udHlwKTsKICAgICAgICBuMi0+cTIuZmxhZ3M9MDsKICAgICAgICBuMi0+cTIudmFsLnZtYXg9c2l6ZXRhYltQT0lOVEVSX1RZUEUocS0+bnR5cC0+bmV4dCldOwoKICAgICAgICBuZXctPnExPW4yLT56OwogICAgICAgIGFkZF9JQyhuMik7CiAgICAgIH1lbHNlewogICAgICAgIG5ldy0+cTE9cS0+bzsKICAgICAgfQogICAgICBpZihuZXctPnExLmZsYWdzJlZBUkFEUil7CgluZXctPnExLmZsYWdzJj1+VkFSQURSOwogICAgICB9ZWxzZXsKCW5ldy0+cTEuZmxhZ3N8PURSRUZPQko7CgluZXctPnExLmR0eXA9UE9JTlRFUl9UWVBFKHEtPm50eXAtPm5leHQpOwogICAgICB9CiAgICB9CiAgICBpZihxLT5udHlwLT5uZXh0LT5mbGFncyZWT0xBVElMRSl7CiAgICAgIGlmKG5ldy0+cTEuZmxhZ3MmRFJFRk9CSikKCW5ldy0+cTEuZHR5cHw9UFZPTEFUSUxFOwogICAgfQogICAgbmV3LT5jb2RlPUFTU0lHTjsKICAgIG5ldy0+dHlwZj1VTlNJR05FRHxDSEFSOwogICAgbmV3LT5xMi5mbGFncz0wOwogICAgbmV3LT5xMi52YWwudm1heD1zaXplOwoKICAgIGlmKCF6bWVxdG8oc2l6ZSxaMCkpCiAgICAgIGFkZF9JQyhuZXcpOwp9Cgp2b2lkIGFkZF9JQyhJQyAqbmV3KQovKiAgZnVlZ3QgZWluIElDIGVpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KewogICAgaW50IGNvZGU7CiAgICBpZighbmV3KSByZXR1cm47CiAgICBpZihub2NvZGUpIHsKI2lmZGVmIEhBVkVfTUlTUkEKLyogcmVtb3ZlZCAqLwojZW5kaWYKICAgICAgLypmcmVlKG5ldyk7Ki8gLyogYnVpbGRpbmcgYSBsaXN0IHRvIGZyZWUgbGF0ZXIgd291bGQgYmUgbmljZS4uLiAqLwogICAgICByZXR1cm47CiAgICB9CiAgICBuZXctPm5leHQ9MDsKICAgIG5ldy0+cTEuYW09bmV3LT5xMi5hbT1uZXctPnouYW09MDsKICAgIG5ldy0+bGluZT1saW5lOyBuZXctPmZpbGU9ZmlsZW5hbWU7CiAgICBjb2RlPW5ldy0+Y29kZTsKICAgIGlmKGNvZGU+PUJFUSYmY29kZTw9QlJBKSBuZXctPnExLmZsYWdzPW5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CiAgICBpZihjb2RlPT1BTExPQ1JFR3x8Y29kZT09RlJFRVJFR3x8Y29kZT09U0FWRVJFR1N8fGNvZGU9PVJFU1RPUkVSRUdTKSBuZXctPnR5cGY9MDsKICAgIGlmKERFQlVHJjY0KXsgcHJpYyhzdGRvdXQsZmlyc3RfaWMpO3ByaW50ZigibmV3XG4iKTtwcmljMihzdGRvdXQsbmV3KTtwcmludGYoIi1cbiIpO30KICAgIGlmKG5ldy0+cTEuZmxhZ3MmVkFSKXsKICAgICAgICBpZighbmV3LT5xMS52KSAKCSAgaWVycm9yKDApOwogICAgICAgIG5ldy0+cTEudi0+ZmxhZ3N8PVVTRURBU1NPVVJDRTsKICAgICAgICBpZihjb2RlPT1BRERSRVNTfHwobmV3LT5xMS5mbGFncyZWQVJBRFIpKQoJICBpZighaXNfdmxlbmd0aChuZXctPnExLnYtPnZ0eXApKQoJICAgIG5ldy0+cTEudi0+ZmxhZ3N8PVVTRURBU0FEUjsKICAgICAgICBuZXctPnExLnYtPnByaW9yaXR5Kz1jdXJyZW50cHJpOwogICAgfQogICAgaWYobmV3LT5xMi5mbGFncyZWQVIpewogICAgICAgIGlmKCFuZXctPnEyLnYpIGllcnJvcigwKTsKICAgICAgICBuZXctPnEyLnYtPmZsYWdzfD1VU0VEQVNTT1VSQ0U7CiAgICAgICAgaWYoY29kZT09QUREUkVTU3x8KG5ldy0+cTIuZmxhZ3MmVkFSQURSKSkKICAgCSAgaWYoIWlzX3ZsZW5ndGgobmV3LT5xMi52LT52dHlwKSkKCSAgICBuZXctPnEyLnYtPmZsYWdzfD1VU0VEQVNBRFI7CiAgICAgICAgbmV3LT5xMi52LT5wcmlvcml0eSs9Y3VycmVudHByaTsKICAgIH0KICAgIGlmKG5ldy0+ei5mbGFncyZWQVIpewogICAgICAgIGlmKCFuZXctPnoudikgaWVycm9yKDApOwogICAgICAgIGlmKG5ldy0+ei5mbGFncyZEUkVGT0JKKQoJICBuZXctPnoudi0+ZmxhZ3N8PVVTRURBU1NPVVJDRTsKCWVsc2UKCSAgbmV3LT56LnYtPmZsYWdzfD1VU0VEQVNERVNUOwogICAgICAgIG5ldy0+ei52LT5wcmlvcml0eSs9Y3VycmVudHByaTsKICAgIH0KICAgIGlmKGJsb2NrX3ZsYVtuZXN0aW5nXSl7CiAgICAgIC8qIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGJsb2NrcyB3aXRoIHZhcmlhYmxlLWxlbmd0aCBhcnJheXMgKi8KICAgICAgbGxpc3QgKnA7CiAgICAgIGlmKG5ldy0+Y29kZT09TEFCRUwpewoJcD1teW1hbGxvYyhMU0laRSk7CglwLT5sYWJlbD1uZXctPnR5cGY7CglwLT5uZXh0PXZsYWRlZmxhYmVsc1tuZXN0aW5nXTsKCXZsYWRlZmxhYmVsc1tuZXN0aW5nXT1wOwogICAgICB9ZWxzZSBpZigwJiZuZXctPmNvZGU9PUJSQSYmIShuZXctPmZsYWdzJkxPT1BfQ09ORF9UUlVFKSl7CglwPW15bWFsbG9jKExTSVpFKTsKCXAtPmxhYmVsPW5ldy0+dHlwZjsKCXAtPm5leHQ9dmxham1wbGFiZWxzW25lc3RpbmddOwoJdmxham1wbGFiZWxzW25lc3RpbmddPXA7CglwPXZsYWRlZmxhYmVsc1tuZXN0aW5nXTsKCXdoaWxlKHApewoJICBpZihwLT5sYWJlbD09bmV3LT50eXBmKQoJICAgIGJyZWFrOwoJICBwPXAtPm5leHQ7Cgl9CglpZighcCl7IAoJICAvKiBsYWJlbCBub3QgZGVjbGFyZWQgaW4gdGhpcyBibG9jayBzbyBmYXI7CgkgICAgIHJlLWFkanVzdCBzdGFjaywgYnV0IHN0b3JlIHRoZSBwb3NpdGlvbiAtIGxhYmVsIG1heSBiZQoJICAgICBkZWNsYXJlZCBsYXRlciBpbiB0aGUgc2FtZSBibG9jayBhbmQgYWRqdXN0ZW1lbnQgbXVzdCBiZQoJICAgICByZW1vdmVkICovCgkgIHZsYWFkanVzdF9saXN0ICp2bDsKCSAgSUMgKmZpcnN0OwoJICBmaXJzdD1sYXN0X2ljOwoJICBmcmVldmwoKTsKCSAgZmlyc3Q9Zmlyc3QtPm5leHQ7CgkgIHZsPW15bWFsbG9jKHNpemVvZigqdmwpKTsKCSAgdmwtPmJyYW5jaD1uZXc7CgkgIHZsLT5maXJzdD1maXJzdDsKCSAgdmwtPm5leHQ9dmxhYWRqdXN0c1tuZXN0aW5nXTsKCSAgdmxhYWRqdXN0c1tuZXN0aW5nXT12bDsKCX0KICAgICAgfQogICAgfQogICAgaWYoLyooY19mbGFnc192YWxbMF0ubCYyKSYmKi9jb2RlPT1MQUJFTCl7CiAgICAvKiAgZW50ZmVybnQgU3BydWVuZ2UgenUgZGlyZWt0IGZvbGdlbmRlbiBMYWJlbHMgICAgKi8KICAgICAgICBJQyAqcD1sYXN0X2ljOwogICAgICAgIHdoaWxlKHApewogICAgICAgICAgICBpZihwLT50eXBmPT1uZXctPnR5cGYmJnAtPmNvZGU+PUJFUSYmcC0+Y29kZTw9QlJBKXsKICAgICAgICAgICAgICAgIElDICpuOwoJCWlmKHAtPmNvZGUhPUJSQSl7CgkJICBJQyAqY21wPXAtPnByZXY7CgkJICB3aGlsZShjbXAmJmNtcC0+Y29kZT09RlJFRVJFRykgY21wPWNtcC0+cHJldjsKCQkgIGlmKGNtcC0+Y29kZT09VEVTVCl7CgkJICAgIGlmKGlzX3ZvbGF0aWxlX29iaigmY21wLT5xMSkpCgkJICAgICAgYnJlYWs7CgkJICAgIGVsc2V7CgkJICAgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJwcmVjZWRpbmcgdGVzdCByZW1vdmVkXG4iKTsKCQkgICAgICByZW1vdmVfSUMoY21wKTsKCQkgICAgfQoJCSAgfWVsc2UgaWYoY21wLT5jb2RlPT1DT01QQVJFKXsKCQkgICAgaWYoaXNfdm9sYXRpbGVfb2JqKCZjbXAtPnExKXx8aXNfdm9sYXRpbGVfb2JqKCZjbXAtPnEyKSkKCQkgICAgICBicmVhazsKCQkgICAgZWxzZXsKCQkgICAgICBpZihERUJVRyYxKSBwcmludGYoInByZWNlZGluZyBjb21wYXJlIHJlbW92ZWRcbiIpOwoJCSAgICAgIHJlbW92ZV9JQyhjbXApOwoJCSAgICB9CgkJICB9ZWxzZQoJCSAgICBicmVhazsKCQl9CgkJaWYodmxhYWRqdXN0c1tuZXN0aW5nXSl7CgkJICAvKiByZW1vdmUgaXQgZnJvbSB2bGFhZGp1c3RzLWxpc3RzLCBpZiBuZWNlc3NhcnkgKi8KCQkgIHZsYWFkanVzdF9saXN0ICp2bD12bGFhZGp1c3RzW25lc3RpbmddOwoJCSAgd2hpbGUodmwpewoJCSAgICBpZih2bC0+YnJhbmNoPT1wKXsKCQkgICAgICBJQyAqbnA9dmwtPmJyYW5jaC0+cHJldjsKCQkgICAgICB3aGlsZShucCE9dmwtPmZpcnN0LT5wcmV2KXsKCQkJaWYoIW5wKSBpZXJyb3IoMCk7CgkJCW5wLT5jb2RlPU5PUDsKCQkJbnAtPnExLmZsYWdzPW5wLT5xMi5mbGFncz1ucC0+ei5mbGFncz0wOwoJCQlucD1ucC0+cHJldjsKCQkgICAgICB9CgkJICAgICAgdmwtPmJyYW5jaD0wOwoJCSAgICB9CgkJICAgIHZsPXZsLT5uZXh0OwoJCSAgfQoJCX0KICAgICAgICAgICAgICAgIGlmKERFQlVHJjEpIHByaW50ZigiJXMgbCVkIGRlbGV0ZWRcbiIsZW5hbWVbcC0+Y29kZV0scC0+dHlwZik7CiAgICAgICAgICAgICAgICBuPXAtPm5leHQ7CiAgICAgICAgICAgICAgICByZW1vdmVfSUMocCk7CiAgICAgICAgICAgICAgICBwPW47CiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgaWYocC0+Y29kZSE9TEFCRUwpIGJyZWFrOwogICAgICAgICAgICAgICAgcD1wLT5wcmV2OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYobGFzdF9pYyl7CiAgICAgICAgaWYoY29kZT09QVNTSUdOKXsKICAgICAgICAgICAgaWYoKGxhc3RfaWMtPnouZmxhZ3MmKFJFR3xTQ1JBVENIfERSRUZPQkopKT09KFJFR3xTQ1JBVENIKSYmKG5ldy0+cTEuZmxhZ3M9PWxhc3RfaWMtPnouZmxhZ3MpJiZsYXN0X2ljLT56LnJlZz09bmV3LT5xMS5yZWcvKiYmbGFzdF9pYy0+Y29kZSE9Q0FMTCovKXsKICAgICAgICAgICAgICAgIGlmKFVTRVEyQVNafHwhKGxhc3RfaWMtPnEyLmZsYWdzJlJFRyl8fCEobmV3LT56LmZsYWdzJlJFRyl8fGxhc3RfaWMtPnEyLnJlZyE9bmV3LT56LnJlZyl7CiAgICAgICAgICAgICAgICAgICAgaWYoVVNFUTJBU1p8fCEobGFzdF9pYy0+cTIuZmxhZ3MmVkFSKXx8IShuZXctPnouZmxhZ3MmVkFSKXx8bGFzdF9pYy0+cTIudiE9bmV3LT56LnYpewogICAgICAgICAgICAgICAgICAgIC8qICB2ZXJiaW5kZXQgb3AgYSxiLT5yZWcsbW92ZSByZWctPmMgenUgb3AgYSxiLT5jICAqLwogICAgICAgICAgICAgICAgICAgIC8qICBoaWVyIGZlaGx0IGFiZXIgbm9jaCBSZWdpc3RlcmZyZWlnYWJlICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2ljLT56PW5ldy0+ejsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJtb3ZlIGFuZCBvcCBjb21iaW5lZFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKChuZXctPnExLmZsYWdzJihTQ1JBVENIfFJFRykpPT0oU0NSQVRDSHxSRUcpJiYobmV3LT5xMS5yZWchPW5ldy0+ei5yZWd8fCEobmV3LT56LmZsYWdzJlJFRykpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9yZWcobmV3LT5xMS5yZWcpOwogICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG5ldyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoKGxhc3RfaWMtPnouZmxhZ3MmKFZBUnxTQ1JBVENIfERSRUZPQkopKT09KFZBUnxTQ1JBVENIKSYmKG5ldy0+cTEuZmxhZ3M9PWxhc3RfaWMtPnouZmxhZ3MpJiZsYXN0X2ljLT56LnY9PW5ldy0+cTEudi8qJiZsYXN0X2ljLT5jb2RlIT1DQUxMKi8pewogICAgICAgICAgICAgICAgaWYoVVNFUTJBU1p8fCEobGFzdF9pYy0+cTIuZmxhZ3MmUkVHKXx8IShuZXctPnouZmxhZ3MmUkVHKXx8bGFzdF9pYy0+cTIucmVnIT1uZXctPnoucmVnKXsKICAgICAgICAgICAgICAgICAgICBpZihVU0VRMkFTWnx8IShsYXN0X2ljLT5xMi5mbGFncyZWQVIpfHwhKG5ldy0+ei5mbGFncyZWQVIpfHxsYXN0X2ljLT5xMi52IT1uZXctPnoudil7CiAgICAgICAgICAgICAgICAgICAgLyogIHZlcmJpbmRldCBvcCBhLGItPnNjcmF0Y2gsbW92ZSBzY3JhdGNoLT5jIHp1IG9wIGEsYi0+YyAgKi8KICAgICAgICAgICAgICAgICAgICAvKiAgaGllciBmZWhsdCBhYmVyIG5vY2ggUmVnaXN0ZXJmcmVpZ2FiZSAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9pYy0+ej1uZXctPno7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKERFQlVHJjEpIHByaW50ZigibW92ZSBhbmQgb3AgY29tYmluZWQoMilcbiIpOwovKiAgICAgICAgICAgICAgICAgICAgICAgIGlmKChuZXctPnExLmZsYWdzJihTQ1JBVENIfFJFRykpPT0oU0NSQVRDSHxSRUcpJiYobmV3LT5xMS5yZWchPW5ldy0+ei5yZWd8fCEobmV3LT56LmZsYWdzJlJFRykpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9yZWcobmV3LT5xMS5yZWcpOyovCiAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUobmV3KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgaWYobGFzdF9pYy0+Y29kZT09QlJBKXsKICAgICAgICAgICAgaWYoIWRvbnRkZWxldGUmJmNvZGUhPUxBQkVMJiZjb2RlIT1BTExPQ1JFRyYmY29kZSE9RlJFRVJFRyl7CiAgICAgICAgICAgIC8qICBsb2VzY2h0IGFsbGVzIG5hY2ggYnJhIGJpcyBlaW4gTGFiZWwga29tbXQgICovCiAgICAgICAgICAgIC8qICBtb21lbnRhbiBub2NoIG5pY2h0IHBlcmZla3QsIGRhIGVzIGJlaSBhbGxvYy9mcmVlcmVnIHN0b3BwdCAqLwogICAgICAgICAgICAgICAgZnJlZShuZXcpOwojaWZkZWYgSEFWRV9NSVNSQQovKiByZW1vdmVkICovCiNlbmRpZgogICAgICAgICAgICAgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJVbnJlYWNoYWJsZSBTdGF0ZW1lbnQgZGVsZXRlZFxuIik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYobGFzdF9pYy0+cHJldiYmY29kZT09TEFCRUwpewogICAgICAgICAgICAvKiAgZXJzZXR6dCBiY2MgbDE7YnJhIGwyO2wxIGR1cmNoIGIhY2MgbDIgICAgICAqLwogICAgICAgICAgICAgICAgaWYobGFzdF9pYy0+cHJldi0+Y29kZT49QkVRJiZsYXN0X2ljLT5wcmV2LT5jb2RlPD1CR1QmJm5ldy0+dHlwZj09bGFzdF9pYy0+cHJldi0+dHlwZil7CgkJICBpZihsYXN0X2ljLT5uZXh0KSBwcmljMihzdGRvdXQsbGFzdF9pYy0+bmV4dCk7CiAgICAgICAgICAgICAgICAgICAgaWYoREVCVUcmMSkgcHJpbnRmKCIlcyBsJWQ7JXMgbCVkOyBzdWJzdGl0dXRlZFxuIixlbmFtZVtsYXN0X2ljLT5wcmV2LT5jb2RlXSxsYXN0X2ljLT5wcmV2LT50eXBmLGVuYW1lW2xhc3RfaWMtPmNvZGVdLGxhc3RfaWMtPnR5cGYpOwogICAgICAgICAgICAgICAgICAgIGlmKGxhc3RfaWMtPnByZXYtPmNvZGUmMSkgCgkJICAgICAgbGFzdF9pYy0+cHJldi0+Y29kZS0tOwoJCSAgICBlbHNlCgkJICAgICAgbGFzdF9pYy0+cHJldi0+Y29kZSsrOwogICAgICAgICAgICAgICAgICAgIGxhc3RfaWMtPnByZXYtPnR5cGY9bGFzdF9pYy0+dHlwZjsKICAgICAgICAgICAgICAgICAgICBsYXN0X2ljPWxhc3RfaWMtPnByZXY7CgkJICAgIGZyZWUobGFzdF9pYy0+bmV4dCk7CiAgICAgICAgICAgICAgICAgICAgbGFzdF9pYy0+bmV4dD1uZXc7bmV3LT5wcmV2PWxhc3RfaWM7CiAgICAgICAgICAgICAgICAgICAgbGFzdF9pYz1uZXc7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQovKiAgICAgICAgfSovCiAgICAgICAgbmV3LT5wcmV2PWxhc3RfaWM7CiAgICAgICAgbGFzdF9pYy0+bmV4dD1uZXc7CiAgICAgICAgbGFzdF9pYz1uZXc7CiAgICB9ZWxzZXsKICAgICAgICBsYXN0X2ljPW5ldztmaXJzdF9pYz1uZXc7bmV3LT5wcmV2PTA7CiAgICB9CiAgICBpY19jb3VudCsrOwoKI2lmIEhBVkVfUE9GMk9QVAogICAgaWYoKChuZXctPmNvZGU9PU1VTFQpfHwoKG5ldy0+Y29kZT09RElWfHxuZXctPmNvZGU9PU1PRCkmJihuZXctPnR5cGYmVU5TSUdORUQpKSkmJihuZXctPnEyLmZsYWdzJktPTlNUKSYmSVNJTlQobmV3LT50eXBmKSl7CiAgICAgIC8qICBlcnNldHp0IG11bCBldGMuIG1pdCBad2VpZXJwb3RlbnplbiAgICAgKi8KICAgICAgbG9uZyBsbjsKICAgICAgZXZhbF9jb25zdCgmbmV3LT5xMi52YWwsbmV3LT50eXBmKTsKICAgICAgaWYoem1sZXEobDJ6bSgwTCksdm1heCkmJnp1bWxlcSh1bDJ6dW0oMFVMKSx2dW1heCkpewoJaWYobG49Z2V0X3BvZjIodnVtYXgpKXsKCSAgaWYobmV3LT5jb2RlPT1NT0QpewoJICAgIHZtYXg9em1zdWIodm1heCxsMnptKDFMKSk7CgkgICAgbmV3LT5jb2RlPUFORDsKCSAgfWVsc2V7CgkgICAgaWYobmV3LT5jb2RlPT1ESVYpIG5ldy0+Y29kZT1SU0hJRlQ7IGVsc2UgbmV3LT5jb2RlPUxTSElGVDsKCSAgICB2bWF4PWwyem0obG4tMSk7CgkgIH0KCSAgZ3ZhbC52bWF4PXZtYXg7CgkgIGV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKCSAgaW5zZXJ0X2NvbnN0KCZuZXctPnEyLnZhbCxuZXctPnR5cGYpOwoJICBuZXctPnR5cGYyPW5ldy0+dHlwZjsKCX0KICAgICAgfQogICAgfQojZW5kaWYKCiAgICAvKiAgTWVya2VuLCBvbiBGbGllc3Nrb21tYSBiZW51dHp0IHd1cmRlICAgICovCiAgICBpZihjb2RlIT1MQUJFTCYmKGNvZGU8QkVRfHxjb2RlPkJSQSkpewogICAgICAgIGlmKElTRkxPQVQobmV3LT50eXBmKSkgZmxvYXRfdXNlZD0xOwogICAgICAgIGlmKGNvZGU9PUNPTlZFUlQmJklTRkxPQVQobmV3LT50eXBmMikpIGZsb2F0X3VzZWQ9MTsKICAgIH0KICAgIGlmKChuZXctPnExLmZsYWdzJihTQ1JBVENIfFJFRykpPT0oU0NSQVRDSHxSRUcpJiYoIShuZXctPnouZmxhZ3MmUkVHKXx8bmV3LT5xMS5yZWchPW5ldy0+ei5yZWcpKQogICAgICAgIGZyZWVfcmVnKG5ldy0+cTEucmVnKTsKICAgIGlmKChuZXctPnEyLmZsYWdzJihTQ1JBVENIfFJFRykpPT0oU0NSQVRDSHxSRUcpJiYoIShuZXctPnouZmxhZ3MmUkVHKXx8bmV3LT5xMi5yZWchPW5ldy0+ei5yZWcpKQogICAgICAgIGZyZWVfcmVnKG5ldy0+cTIucmVnKTsKfQoKbnAgZ2VuX2xpYmNhbGwoY2hhciAqZm5hbWUsbnAgYXJnMSx0eXBlICp0MSxucCBhcmcyLHR5cGUgKnQyKQovKiBnZW5lcmF0ZSBjYWxsIHRvIGEgbGlicmFyeSBmdW5jdGlvbiAoZW11bGF0ZSBvcGVyYXRpb24pICovCnsKICBucCBuZXc7IAogIGFyZ3VtZW50X2xpc3QgKmFsPTAsKnQ7CiAgbmV3PW5ld19ub2RlKCk7CiAgbmV3LT5mbGFncz1DQUxMOwogIG5ldy0+cmlnaHQ9MDsKICBuZXctPmxlZnQ9bmV3X25vZGUoKTsKICBuZXctPmxlZnQtPmZsYWdzPUlERU5USUZJRVI7CiAgbmV3LT5sZWZ0LT5sZWZ0PW5ldy0+bGVmdC0+cmlnaHQ9MDsKICBuZXctPmxlZnQtPmlkZW50aWZpZXI9YWRkX2lkZW50aWZpZXIoZm5hbWUsc3RybGVuKGZuYW1lKSk7CiAgbmV3LT5sZWZ0LT5udHlwPTA7CiAgbmV3LT5sZWZ0LT5zaWRlZng9MDsKICBuZXctPmxlZnQtPnZhbC52bWF4PWwyem0oMEwpOyAKICBuZXctPmFsaXN0PTA7CiAgaWYoYXJnMSl7CiAgICBhbD1teW1hbGxvYyhzaXplb2YoKmFsKSk7CiAgICBpZihwb3N0b3Bfb2JqKXsKICAgICAgYWwtPmFyZz1uZXdfbm9kZSgpOwogICAgICBhbC0+YXJnLT5vPSpwb3N0b3Bfb2JqOwogICAgICBhbC0+YXJnLT5udHlwPW5ld190eXAoKTsKICAgICAgYWwtPmFyZy0+bnR5cC0+ZmxhZ3M9cG9zdG9wX3R5cGU7CiAgICAgIGFsLT5hcmctPmZsYWdzPVJFSU5URVJQUkVUOwogICAgfWVsc2UKICAgICAgYWwtPmFyZz1hcmcxOwogICAgYWwtPm5leHQ9MDsKICAgIGlmKHQxKXsKICAgICAgbnAgY252PW5ld19ub2RlKCk7CiAgICAgIGNudi0+ZmxhZ3M9Q0FTVDsKICAgICAgY252LT5sZWZ0PWFyZzE7CiAgICAgIGNudi0+cmlnaHQ9MDsKICAgICAgY252LT5udHlwPXQxOwogICAgICBhbC0+YXJnPWNudjsKICAgIH0KICB9CiAgaWYoYXJnMil7CiAgICB0PW15bWFsbG9jKHNpemVvZigqdCkpOwogICAgdC0+YXJnPWFyZzI7CiAgICB0LT5uZXh0PTA7CiAgICBhbC0+bmV4dD10OwogICAgaWYodDIpewogICAgICBucCBjbnY9bmV3X25vZGUoKTsKICAgICAgY252LT5mbGFncz1DQVNUOwogICAgICBjbnYtPmxlZnQ9YXJnMjsKICAgICAgY252LT5yaWdodD0wOwogICAgICBjbnYtPm50eXA9dDI7CiAgICAgIHQtPmFyZz1jbnY7CiAgICB9CiAgfQogIG5ldy0+YWxpc3Q9YWw7CiAgLyogS2FubiBtYW4gdHlwZV9leHByIG5vY2htYWwgYXVmIGRpZSBBcmd1bWVudGUgYW53ZW5kZW4/ICovCiAgaWYodDF8fHQyKQogICAgbm9fY2FzdF9mcmVlPTE7CiAgaWYoIXR5cGVfZXhwcmVzc2lvbihuZXcsMCkpCiAgICBpZXJyb3IoMCk7IAogIG5vX2Nhc3RfZnJlZT0wOwogIGdlbl9JQyhuZXcsMCwwKTsKICByZXR1cm4gbmV3Owp9CgoKdm9pZCBnZW5fSUMobnAgcCxpbnQgbHRydWUsaW50IGxmYWxzZSkKLyogIEVyemV1Z3QgZWluZSBJQy1MaXN0ZSBhdXMgZWluZXIgZXhwcmVzc2lvbiAgICAgICovCnsKICAgIElDICpuZXc7IHJlZ2FyZ3NfbGlzdCAqcmw7CiAgICBpZighcCkgcmV0dXJuOwoKICAgIGlmKHAtPmZsYWdzPT1TVFJJTkcpewogICAgICAgIFZhciAqdj0wOwoJaWYobWVyZ2Vfc3RyaW5ncyl7CgkgIGZvcih2PWZpcnN0X3ZhclswXTt2O3Y9di0+bmV4dCl7CgkgICAgaWYodi0+dnR5cC0+ZmxhZ3M9PUFSUkFZJiYodi0+dnR5cC0+bmV4dC0+ZmxhZ3MmU1RSSU5HQ09OU1QpJiZ6bWxlcShwLT5udHlwLT5zaXplLHYtPnZ0eXAtPnNpemUpKXsKCSAgICAgIHptYXggaTtjb25zdF9saXN0ICpjbDE9cC0+Y2wsKmNsMj12LT5jbGlzdDsKCSAgICAgIGZvcihpPVowOyF6bWxlcShwLT5udHlwLT5zaXplLGkpJiZjbDEmJmNsMjtjbDE9Y2wxLT5uZXh0LGNsMj1jbDItPm5leHQsaT16bWFkZChpLFoxKSl7CgkJaWYoIXp1bWVxdG8oenVjMnp1bShjbDEtPm90aGVyLT52YWwudnVjaGFyKSx6dWMyenVtKGNsMi0+b3RoZXItPnZhbC52dWNoYXIpKSkKCQkgIGJyZWFrOwoJICAgICAgfQoJICAgICAgaWYoem1sZXEocC0+bnR5cC0+c2l6ZSxpKSkgYnJlYWs7CgkgICAgfQoJICB9Cgl9CglpZighdil7CgkgIHAtPm8udj1hZGRfdmFyKGVtcHR5LGNsb25lX3R5cChwLT5udHlwKSxTVEFUSUMscC0+Y2wpOwoJICBwLT5vLnYtPmZsYWdzfD1ERUZJTkVEOwoJfWVsc2UKCSAgcC0+by52PXY7CiAgICAgICAgcC0+by5mbGFncz1WQVI7CiAgICAgICAgcC0+by5yZWc9MDsKICAgICAgICBwLT5vLnZhbD1wLT52YWw7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYocC0+ZmxhZ3M9PUxJVEVSQUwpewogICAgICBpbnQgc2M7CiAgICAgIGlmKG5lc3Rpbmc9PTB8fChpc19jb25zdChwLT5udHlwKSYmem1lcXRvKHAtPnZhbC52bWF4LGwyem0oMEwpKSkpCglzYz1TVEFUSUM7CiAgICAgIGVsc2UKCXNjPUFVVE87CiAgICAgIHAtPm8udj1hZGRfdmFyKGVtcHR5LGNsb25lX3R5cChwLT5udHlwKSxzYyxwLT5jbCk7CiAgICAgIHAtPm8udi0+ZmxhZ3N8PURFRklORUQ7CiAgICAgIHAtPm8uZmxhZ3M9VkFSOwogICAgICBwLT5vLnJlZz0wOwogICAgICBwLT5vLnZhbC52bWF4PWwyem0oMEwpOwogICAgICBpZihzYz09QVVUTykKCWluaXRfbG9jYWxfY29tcG91bmQocC0+by52KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYocC0+ZmxhZ3M9PUlERU5USUZJRVIpewovKiAgICAgICAgcC0+by52PWZpbmRfdmFyKHAtPmlkZW50aWZpZXIsMCk7Ki8KICAgICAgICBwLT5vLmZsYWdzPVZBUjsKICAgICAgICBwLT5vLnJlZz0wOwogICAgICAgIHAtPm8udmFsPXAtPnZhbDsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZihwLT5mbGFncz09Q0VYUFJ8fHAtPmZsYWdzPT1QQ0VYUFIpewogICAgICAgIGlmKHAtPmxlZnQpewogICAgICAgICAgICBpZihwLT5sZWZ0LT5mbGFncz09UE9TVElOQykgcC0+bGVmdC0+ZmxhZ3M9UFJFSU5DOwogICAgICAgICAgICBpZihwLT5sZWZ0LT5mbGFncz09UE9TVERFQykgcC0+bGVmdC0+ZmxhZ3M9UFJFREVDOwogICAgICAgICAgICBnZW5fSUMocC0+bGVmdCwwLDApOwogICAgICAgICAgICBpZigocC0+bGVmdC0+by5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSkgZnJlZV9yZWcocC0+bGVmdC0+by5yZWcpOwogICAgICAgIH0KICAgICAgICBpZihwLT5yaWdodCl7CiAgICAgICAgICAgIGlmKHAtPnJpZ2h0LT5mbGFncz09UE9TVElOQykgcC0+cmlnaHQtPmZsYWdzPVBSRUlOQzsKICAgICAgICAgICAgaWYocC0+cmlnaHQtPmZsYWdzPT1QT1NUREVDKSBwLT5yaWdodC0+ZmxhZ3M9UFJFREVDOwogICAgICAgICAgICBnZW5fSUMocC0+cmlnaHQsMCwwKTsKICAgICAgICAgICAgaWYoKHAtPnJpZ2h0LT5vLmZsYWdzJihTQ1JBVENIfFJFRykpPT0oU0NSQVRDSHxSRUcpKSBmcmVlX3JlZyhwLT5yaWdodC0+by5yZWcpOwogICAgICAgIH0KICAgICAgICBwLT5vLmZsYWdzPUtPTlNUOwogICAgICAgIHAtPm8udmFsPXAtPnZhbDsKICAgICAgICBwLT5vLnJlZz0wOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmKHAtPmZsYWdzPT1LT01NQSl7CiAgICAgICAgaWYocC0+bGVmdC0+c2lkZWZ4KXsKICAgICAgICAgICAgZ2VuX0lDKHAtPmxlZnQsMCwwKTsKICAgICAgICAgICAgaWYoKHAtPmxlZnQtPm8uZmxhZ3MmKFNDUkFUQ0h8UkVHKSk9PShTQ1JBVENIfFJFRykpIGZyZWVfcmVnKHAtPmxlZnQtPm8ucmVnKTsKICAgICAgICB9ZWxzZSBpZighKHAtPmxlZnQtPm50eXAtPmZsYWdzJlZPTEFUSUxFKSkgCgkgIGVycm9yKDEyOSk7CiAgICAgICAgZ2VuX0lDKHAtPnJpZ2h0LDAsMCk7CiAgICAgICAgcC0+bz1wLT5yaWdodC0+bzsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZihwLT5mbGFncz09UkVJTlRFUlBSRVQpewogICAgICBpZihwLT5sZWZ0KXsKCWdlbl9JQyhwLT5sZWZ0LDAsMCk7CglwLT5vPXAtPmxlZnQtPm87CiAgICAgIH0KICAgICAgLyogaWYgbm8gbGVmdCwgZG8gbm90aGluZywgdXNlIGp1c3Qgb2JqZWN0ICovCiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmKHAtPmZsYWdzPT1DQVNUKXsKICAgICAgZ2VuX0lDKHAtPmxlZnQsMCwwKTsKICAgICAgaWYoKHAtPm50eXAtPmZsYWdzJk5RKT09Vk9JRCl7CglpZigocC0+bGVmdC0+by5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSkgZnJlZV9yZWcocC0+bGVmdC0+by5yZWcpOwoJcC0+by5mbGFncz0wOwogICAgICB9ZWxzZXsKCWlmKElTUE9JTlRFUihwLT5udHlwLT5mbGFncykmJihwLT5udHlwLT5uZXh0LT5mbGFncyZWT0xBVElMRSkpCgkgIHZvbGF0aWxlX2NvbnZlcnQ9MTsKCWNvbnZlcnQocC0+bGVmdCxwLT5udHlwLT5mbGFncyk7CglpZih2b2xhdGlsZV9jb252ZXJ0KXsKCSAgaWYoKHAtPmxlZnQtPm8uZmxhZ3MmVkFSKSYmcC0+bGVmdC0+by52LT52dHlwLT5uZXh0KQoJICAgIHAtPmxlZnQtPm8udi0+dnR5cC0+bmV4dC0+ZmxhZ3N8PVZPTEFUSUxFOwoJICB2b2xhdGlsZV9jb252ZXJ0PTA7Cgl9CglwLT5vPXAtPmxlZnQtPm87CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgaWYocC0+ZmxhZ3M9PUZJUlNURUxFTUVOVCl7CiAgICAgICAgZ2VuX0lDKHAtPmxlZnQsMCwwKTsKICAgICAgICBwLT5vPXAtPmxlZnQtPm87CiAgICAgICAgcmV0dXJuOwogICAgfQoKI2lmIEhBVkVfUE9GMk9QVAogICAgaWYoKChwLT5mbGFncz09TVVMVHx8cC0+ZmxhZ3M9PVBNVUxUKXx8KChwLT5mbGFncz09RElWfHxwLT5mbGFncz09TU9EKSYmKHAtPm50eXAtPmZsYWdzJlVOU0lHTkVEKSkpJiYocC0+cmlnaHQtPmZsYWdzPT1DRVhQUnx8cC0+cmlnaHQtPmZsYWdzPT1QQ0VYUFIpJiZJU0lOVChwLT5udHlwLT5mbGFncykpewogICAgICAvKiAgZXJzZXR6dCBtdWwgZXRjLiBtaXQgWndlaWVycG90ZW56ZW4gICAgICovCiAgICAgIGxvbmcgbG47CiAgICAgIGV2YWxfY29uc3RuKHAtPnJpZ2h0KTsKICAgICAgaWYoem1sZXEobDJ6bSgwTCksdm1heCkmJnp1bWxlcSh1bDJ6dW0oMFVMKSx2dW1heCkpewoJaWYobG49Z2V0X3BvZjIodnVtYXgpKXsKCSAgaWYocC0+ZmxhZ3M9PU1PRCl7CgkgICAgdm1heD16bXN1Yih2bWF4LGwyem0oMUwpKTsKCSAgICBwLT5mbGFncz1BTkQ7CgkgIH1lbHNlewoJICAgIGlmKHAtPmZsYWdzPT1ESVYpIHAtPmZsYWdzPVJTSElGVDsgZWxzZSBwLT5mbGFncz1MU0hJRlQ7CgkgICAgdm1heD1sMnptKGxuLTEpOwoJICB9CgkgIGd2YWwudm1heD12bWF4OwoJICBldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CgkgIGluc2VydF9jb25zdG4ocC0+cmlnaHQpOwoJfQogICAgICB9CiAgICB9CiNlbmRpZgoKI2lmIEhBVkVfTElCQ0FMTFMKICAgIGlmKCEob3B0ZmxhZ3MmMikpewogICAgICBjaGFyICpsaWJuYW1lOwogICAgICBpZihsaWJuYW1lPXVzZV9saWJjYWxsX3dyYXAocC0+ZmxhZ3MscC0+bnR5cC0+ZmxhZ3MsMCkpewoJbnAgbGM7dHlwZSAqdDEsKnQyOwoJaWYocC0+ZmxhZ3M9PUxTSElGVHx8cC0+ZmxhZ3M9PVJTSElGVCl7CgkgIHQxPWNsb25lX3R5cChwLT5udHlwKTsKCSAgdDI9bmV3X3R5cCgpOwoJICB0Mi0+ZmxhZ3M9SU5UOwoJfWVsc2V7CgkgIGlmKHAtPnJpZ2h0KXsKCSAgICB0MT1hcml0aF90eXAocC0+bGVmdC0+bnR5cCxwLT5yaWdodC0+bnR5cCk7CgkgICAgdDI9Y2xvbmVfdHlwKHQxKTsKCSAgfWVsc2V7CgkgICAgdDE9YXJpdGhfdHlwKHAtPmxlZnQtPm50eXAscC0+bGVmdC0+bnR5cCk7CgkgICAgdDI9MDsKCSAgfQoJfQoJbGM9Z2VuX2xpYmNhbGwobGlibmFtZSxwLT5sZWZ0LHQxLHAtPnJpZ2h0LHQyKTsKCSpwPSpsYzsKCWZyZWUobGMpOwoJcmV0dXJuOwogICAgICB9CiAgICB9CiNlbmRpZgogICAgbmV3PW5ld19JQygpOwogICAgbmV3LT50eXBmPXAtPm50eXAtPmZsYWdzOwogICAgbmV3LT5xMS5yZWc9bmV3LT5xMi5yZWc9bmV3LT56LnJlZz0wOwogICAgbmV3LT5xMS5mbGFncz1uZXctPnEyLmZsYWdzPW5ldy0+ei5mbGFncz0wOwogICAgaWYoKHAtPmZsYWdzPj1MU0hJRlQmJnAtPmZsYWdzPD1NT0QpfHwocC0+ZmxhZ3M+PU9SJiZwLT5mbGFnczw9QU5EKXx8cC0+ZmxhZ3M9PVBNVUxUKXsKICAgICAgZG9fYXJpdGgocCxuZXcsMCwwKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYocC0+ZmxhZ3M9PUNPTlRFTlQpewogICAgICAgIGdlbl9JQyhwLT5sZWZ0LDAsMCk7CiAgICAgICAgaWYocC0+bGVmdC0+by5mbGFncyZWQVJBRFIpewogICAgICAgICAgICBmcmVlKG5ldyk7CiAgICAgICAgICAgIHAtPm89cC0+bGVmdC0+bzsKICAgICAgICAgICAgcC0+by5mbGFncyY9flZBUkFEUjsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZighKHAtPmxlZnQtPm8uZmxhZ3MmRFJFRk9CSikpewogICAgICAgICAgICBmcmVlKG5ldyk7CiAgICAgICAgICAgIHAtPm89cC0+bGVmdC0+bzsKICAgICAgICAgICAgcC0+by5mbGFnc3w9RFJFRk9CSjsKCSAgICBwLT5vLmR0eXA9cC0+bGVmdC0+bnR5cC0+ZmxhZ3M7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICBpZigocC0+bGVmdC0+by5mbGFncyZTQ1JBVENIKSYmcC0+bGVmdC0+by5kdHlwPT1QT0lOVEVSX1RZUEUocC0+bnR5cCkpewogICAgICAgICAgICBuZXctPno9cC0+bGVmdC0+bzsKICAgICAgICAgICAgbmV3LT56LmZsYWdzJj1+RFJFRk9CSjsKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICBnZXRfc2NyYXRjaCgmbmV3LT56LHAtPmxlZnQtPm50eXAtPmZsYWdzLHAtPm50eXAtPmZsYWdzLHAtPmxlZnQtPm50eXApOwogICAgICAgICAgfQogICAgICAgICAgbmV3LT5jb2RlPUFTU0lHTjtuZXctPnR5cGY9UE9JTlRFUl9UWVBFKHAtPm50eXApOwogICAgICAgICAgbmV3LT5xMT1wLT5sZWZ0LT5vOwogICAgICAgICAgbmV3LT5xMi52YWwudm1heD1zaXpldGFiW25ldy0+dHlwZiZOUV07CiAgICAgICAgICBwLT5vPW5ldy0+ejsKICAgICAgICAgIGFkZF9JQyhuZXcpOwogICAgICAgICAgcC0+by5mbGFnc3w9RFJFRk9CSjsKCSAgcC0+by5kdHlwPVBPSU5URVJfVFlQRShwLT5udHlwKTsKICAgICAgICB9CglpZihwLT5sZWZ0LT5udHlwLT5uZXh0LT5mbGFncyZWT0xBVElMRSkgcC0+by5kdHlwfD1QVk9MQVRJTEU7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYocC0+ZmxhZ3M9PUFTU0lHTil7CiAgICAgIGlmKHAtPmxlZnQtPmZsYWdzPT1CSVRGSUVMRCl7CiAgICAgICAgZ2VuX0lDKHAtPnJpZ2h0LDAsMCk7CiAgICAgICAgZ2VuX0lDKHAtPmxlZnQtPmxlZnQsMCwwKTsKICAgICAgICBjb252ZXJ0KHAtPnJpZ2h0LHAtPm50eXAtPmZsYWdzKTsKICAgICAgICBpbnNlcnRfYml0ZmllbGQoJnAtPmxlZnQtPmxlZnQtPm8sJnAtPnJpZ2h0LT5vLCZwLT5vLHAtPmxlZnQtPmJmcyxwLT5sZWZ0LT5iZm8scC0+bnR5cC0+ZmxhZ3MmTlUsMCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIG5ldy0+Y29kZT1BU1NJR047CiAgICAgIGdlbl9JQyhwLT5yaWdodCwwLDApOwogICAgICBnZW5fSUMocC0+bGVmdCwwLDApOwogICAgICBjb252ZXJ0KHAtPnJpZ2h0LHAtPm50eXAtPmZsYWdzKTsKICAgICAgbmV3LT5xMT1wLT5yaWdodC0+bzsKICAgICAgbmV3LT56PXAtPmxlZnQtPm87CiAgICAgIG5ldy0+cTIudmFsLnZtYXg9c3pvZihwLT5sZWZ0LT5udHlwKTsKICAgICAgcC0+bz1uZXctPno7CiAgICAgIGlmKCFJU1NDQUxBUihwLT5udHlwLT5mbGFncykpCgluZXctPnR5cGYyPXptMmwoZmFsaWduKHAtPm50eXApKTsKICAgICAgYWRkX0lDKG5ldyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmKHAtPmZsYWdzPT1BU1NJR05PUCl7CiAgICAvKiAgZGFzIGhpZXIgaXN0IG5pY2h0IGJlc29uZGVycyBzY2hvZW4gKi8KICAgICAgb2JqIG8scTtJQyAqbjtpbnQgZjtjaGFyICpsaWJuYW1lOwogICAgICBucCBsYzsKICAgICAgaWYocC0+cmlnaHQtPnJpZ2h0PT0wKXsKICAgICAgICAvKiAgc293YXMgd2llIGErPTAgd3VyZGUgd2Vnb3B0aW1pZXJ0ICAgKi8KCWZyZWUobmV3KTsKCXAtPm89cC0+bGVmdC0+bzsKCXJldHVybjsKICAgICAgfQojaWYgSEFWRV9MSUJDQUxMUwogICAgICBpZihsaWJuYW1lPXVzZV9saWJjYWxsX3dyYXAocC0+cmlnaHQtPmZsYWdzLHAtPnJpZ2h0LT5udHlwLT5mbGFncywocC0+cmlnaHQtPmZsYWdzPT1MU0hJRlR8fHAtPnJpZ2h0LT5mbGFncz09UlNISUZUKT9JTlQ6MCkpewoJdHlwZSAqdDEsKnQyOwoJbnAgYTE7CglnZW5fSUMocC0+bGVmdCwwLDApOwoJYTE9bmV3X25vZGUoKTsKCWExLT5vPXAtPmxlZnQtPm87CglhMS0+ZmxhZ3M9UkVJTlRFUlBSRVQ7CglhMS0+by5mbGFncyY9flNDUkFUQ0g7CglhMS0+bnR5cD1jbG9uZV90eXAocC0+bGVmdC0+bnR5cCk7Cgl0MT1jbG9uZV90eXAocC0+cmlnaHQtPm50eXApOwoJaWYocC0+cmlnaHQtPmZsYWdzPT1MU0hJRlR8fHAtPnJpZ2h0LT5mbGFncz09UlNISUZUKXsKCSAgdDI9bmV3X3R5cCgpOwoJICB0Mi0+ZmxhZ3M9SU5UOwoJfWVsc2UKCSAgdDI9Y2xvbmVfdHlwKHQxKTsKCWxjPWdlbl9saWJjYWxsKGxpYm5hbWUsYTEvKnAtPnJpZ2h0LT5sZWZ0Ki8sdDEscC0+cmlnaHQtPnJpZ2h0LHQyKTsKCS8qKnAtPnJpZ2h0PSpsYzsqLwoJbz1wLT5sZWZ0LT5vOwoJZnJlZShhMSk7CgkvKnAtPmxlZnQ9MDsqLwoJLypmcmVlKGxjKTsqLwogICAgICB9ZWxzZQojZW5kaWYKCXsKCSAgbGM9MDsKCSAgZj1kb19hcml0aChwLT5yaWdodCxuZXcscC0+bGVmdCwmbyk7CgkgIGlmKCFmKSBpZXJyb3IoMCk7CgkgIGlmKGY+MSkgaWVycm9yKDApOwoJfQogICAgICBpZigoby5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSYmIXJlZ3Nbby5yZWddKQogICAgICAgIGtlZXBfcmVnKG8ucmVnKTsKICAgICAgaWYobGMpCgljb252ZXJ0KGxjLHAtPm50eXAtPmZsYWdzKTsKICAgICAgZWxzZQoJY29udmVydChwLT5yaWdodCxwLT5udHlwLT5mbGFncyk7CiAgICAgIGlmKHAtPmxlZnQmJnAtPmxlZnQtPmZsYWdzPT1CSVRGSUVMRCl7CglpZihsYykgaWVycm9yKDApOwogICAgICAgIGluc2VydF9iaXRmaWVsZCgmcC0+bGVmdC0+bGVmdC0+bywmcC0+cmlnaHQtPm8sJnAtPm8scC0+bGVmdC0+YmZzLHAtPmxlZnQtPmJmbyxwLT5udHlwLT5mbGFncyZOVSwwKTsKICAgICAgICBpZigocC0+cmlnaHQtPm8uZmxhZ3MmKFJFR3xTQ1JBVENIKSk9PShSRUd8U0NSQVRDSCkmJnJlZ3NbcC0+cmlnaHQtPm8ucmVnXSkKICAgICAgICAgIGZyZWVfcmVnKHAtPnJpZ2h0LT5vLnJlZyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIG5ldz1uZXdfSUMoKTsKICAgICAgbmV3LT50eXBmPXAtPm50eXAtPmZsYWdzOwogICAgICBuZXctPnEyLmZsYWdzPTA7CiAgICAgIG5ldy0+Y29kZT1BU1NJR047CiAgICAgIGlmKGxjKXsKCW5ldy0+cTE9bGMtPm87CgkvKmZyZWUobGMpOyovCiAgICAgIH1lbHNlCgluZXctPnExPXAtPnJpZ2h0LT5vOwogICAgICBuZXctPno9bzsKICAgICAgbmV3LT5xMi52YWwudm1heD1zem9mKHAtPm50eXApOwogICAgICBwLT5vPW5ldy0+ejsKICAgICAgYWRkX0lDKG5ldyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmKHAtPmZsYWdzPT1NSU5VU3x8cC0+ZmxhZ3M9PUtPTVBMRU1FTlQpewogICAgICBuZXctPmNvZGU9cC0+ZmxhZ3M7CiAgICAgIGdlbl9JQyhwLT5sZWZ0LDAsMCk7CiAgICAgIGNvbnZlcnQocC0+bGVmdCxwLT5udHlwLT5mbGFncyk7CiAgICAgIGlmKChwLT5sZWZ0LT5vLmZsYWdzJihTQ1JBVENIfFJFRykpPT0oU0NSQVRDSHxSRUcpJiZyZWdvayhwLT5sZWZ0LT5vLnJlZyxwLT5udHlwLT5mbGFncywwKSl7CgluZXctPno9cC0+bGVmdC0+bzsKCW5ldy0+ei5mbGFncyY9fkRSRUZPQko7CiAgICAgIH1lbHNlewoJZ2V0X3NjcmF0Y2goJm5ldy0+eixwLT5udHlwLT5mbGFncywwLHAtPm50eXApOwogICAgICB9CiAgICAgIG5ldy0+cTE9cC0+bGVmdC0+bzsKICAgICAgcC0+bz1uZXctPno7CiAgICAgIGFkZF9JQyhuZXcpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZihwLT5mbGFncz09QUREUkVTU3x8cC0+ZmxhZ3M9PUFERFJFU1NBfHxwLT5mbGFncz09QUREUkVTU1MpewogICAgICBpZihwLT5mbGFncyE9QUREUkVTU1MmJnAtPmxlZnQtPmZsYWdzPT1JREVOVElGSUVSJiZpc192bGVuZ3RoKHAtPmxlZnQtPm50eXApKXsKCWdlbl9JQyhwLT5sZWZ0LDAsMCk7CglpZighKHAtPmxlZnQtPm8uZmxhZ3MmVkFSKSkKCSAgaWVycm9yKDApOwoJZnJlZShuZXcpOwoJcC0+bz1wLT5sZWZ0LT5vOwoJcmV0dXJuOwogICAgICB9CiAgICAgIG5ldy0+Y29kZT1BRERSRVNTOwogICAgICBuZXctPnR5cGY9cC0+bGVmdC0+bnR5cC0+ZmxhZ3M7CiAgICAgIG5ldy0+dHlwZjI9UE9JTlRFUl9UWVBFKHAtPmxlZnQtPm50eXApOwogICAgICBnZW5fSUMocC0+bGVmdCwwLDApOwogICAgICBpZihwLT5sZWZ0LT5vLmZsYWdzJlZBUikgcC0+bGVmdC0+by52LT5mbGFnc3w9KFVTRURBU1NPVVJDRXxVU0VEQVNERVNUKTsKICAgICAgaWYocC0+bGVmdC0+by5mbGFncyZEUkVGT0JKKXsKCWZyZWUobmV3KTsKCXAtPm89cC0+bGVmdC0+bzsKCXAtPm8uZmxhZ3MmPX5EUkVGT0JKOwoJcmV0dXJuOwogICAgICB9CiAgICAgIGlmKChwLT5sZWZ0LT5vLmZsYWdzJlZBUikmJiEocC0+bGVmdC0+by5mbGFncyZWQVJBRFIpCgkgJiYocC0+bGVmdC0+by52LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk58fHAtPmxlZnQtPm8udi0+c3RvcmFnZV9jbGFzcz09U1RBVElDKSl7CglmcmVlKG5ldyk7CglwLT5vPXAtPmxlZnQtPm87CglwLT5vLmZsYWdzfD1WQVJBRFI7CglyZXR1cm47CiAgICAgIH0KICAgICAgbmV3LT5xMT1wLT5sZWZ0LT5vOwogICAgICBnZXRfc2NyYXRjaCgmbmV3LT56LFBPSU5URVJfVFlQRShwLT5udHlwLT5uZXh0KSxwLT5udHlwLT5uZXh0LT5mbGFncywwKTsKICAgICAgcC0+bz1uZXctPno7CiAgICAgIGFkZF9JQyhuZXcpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZihwLT5mbGFncz09TEFORHx8cC0+ZmxhZ3M9PUxPUil7CiAgICAgICAgaW50IGwxLGwyLGwzLGw0OwovKiAgICAgICAgcHJpbnRmKCIlcyB0cnVlPSVkIGZhbHNlPSVkXG4iLGVuYW1lW3AtPmZsYWdzXSxsdHJ1ZSxsZmFsc2UpOyovCgoJaWYoSVNWRUNUT1IocC0+bnR5cC0+ZmxhZ3MpKXsKCSAgZG9fYXJpdGgocCxuZXcsMCwwKTsKCSAgcmV0dXJuOwoJfQoKICAgICAgICBsMT0rK2xhYmVsOwoJaWYoIWx0cnVlKSB7bDI9KytsYWJlbDtsMz0rK2xhYmVsO2w0PSsrbGFiZWw7fQogICAgICAgIGlmKCFsdHJ1ZSl7CgkgIGlmKHAtPmZsYWdzPT1MQU5EKQoJICAgIGdlbl9JQyhwLT5sZWZ0LGwxLGwzKTsKCSAgZWxzZSAKCSAgICBnZW5fSUMocC0+bGVmdCxsMyxsMSk7CiAgICAgICAgfWVsc2V7CgkgIGlmKHAtPmZsYWdzPT1MQU5EKSAKCSAgICBnZW5fSUMocC0+bGVmdCxsMSxsZmFsc2UpOwoJICBlbHNlIAoJICAgIGdlbl9JQyhwLT5sZWZ0LGx0cnVlLGwxKTsKICAgICAgICB9CiAgICAgICAgaWYocC0+bGVmdC0+by5mbGFncyE9MCl7CiAgICAgICAgICAgIGlmKHAtPmZsYWdzPT1MQU5EKQogICAgICAgICAgICAgICAgZ2VuX3Rlc3QoJnAtPmxlZnQtPm8scC0+bGVmdC0+bnR5cC0+ZmxhZ3MsQkVRLCgoIWx0cnVlKT9sMzpsZmFsc2UpKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZ2VuX3Rlc3QoJnAtPmxlZnQtPm8scC0+bGVmdC0+bnR5cC0+ZmxhZ3MsQk5FLCgoIWx0cnVlKT9sMzpsdHJ1ZSkpOwogICAgICAgIH0KICAgICAgICBnZW5fbGFiZWwobDEpOwogICAgICAgIGlmKCFsdHJ1ZSl7CgkgIGlmKHAtPmZsYWdzPT1MQU5EKSAKCSAgICBnZW5fSUMocC0+cmlnaHQsbDIsbDMpOwoJICBlbHNlCgkgICAgZ2VuX0lDKHAtPnJpZ2h0LGwzLGwyKTsKICAgICAgICB9ZWxzZQoJICBnZW5fSUMocC0+cmlnaHQsbHRydWUsbGZhbHNlKTsKICAgICAgICBpZihwLT5yaWdodC0+by5mbGFncyE9MCl7CiAgICAgICAgICAgIGlmKHAtPmZsYWdzPT1MQU5EKQogICAgICAgICAgICAgICAgZ2VuX3Rlc3QoJnAtPnJpZ2h0LT5vLHAtPnJpZ2h0LT5udHlwLT5mbGFncyxCRVEsKCghbHRydWUpP2wzOmxmYWxzZSkpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBnZW5fdGVzdCgmcC0+cmlnaHQtPm8scC0+cmlnaHQtPm50eXAtPmZsYWdzLEJORSwoKCFsdHJ1ZSk/bDM6bHRydWUpKTsKICAgICAgICB9CiAgICAgICAgaWYoIWx0cnVlKXsKICAgICAgICAgICAgZ2VuX2xhYmVsKGwyKTsKICAgICAgICAgICAgaWYocC0+ZmxhZ3M9PUxBTkQpIGdlbl9jb25kKCZwLT5vLDAsbDMsbDQpOyBlbHNlIGdlbl9jb25kKCZwLT5vLDEsbDMsbDQpOwogICAgICAgIH1lbHNlewogICAgICAgICAgICBuZXc9bmV3X0lDKCk7CiAgICAgICAgICAgIG5ldy0+Y29kZT1CUkE7CiAgICAgICAgICAgIGlmKHAtPmZsYWdzPT1MQU5EKSBuZXctPnR5cGY9bHRydWU7IGVsc2UgbmV3LT50eXBmPWxmYWxzZTsKICAgICAgICAgICAgYWRkX0lDKG5ldyk7CiAgICAgICAgfQogICAgICAgIGlmKGx0cnVlKSBwLT5vLmZsYWdzPTA7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYocC0+ZmxhZ3M9PU5FR0FUSU9OKXsKICAgICAgICBpbnQgbDEsbDIsbDM7CglpZihJU1ZFQ1RPUihwLT5udHlwLT5mbGFncykpewoJICBnZW5fSUMocC0+bGVmdCwwLDApOwoJICBpZigocC0+bGVmdC0+by5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSYmcmVnb2socC0+bGVmdC0+by5yZWcscC0+bnR5cC0+ZmxhZ3MsMCkpewoJICAgIG5ldy0+ej1wLT5sZWZ0LT5vOwoJICAgIG5ldy0+ei5mbGFncyY9fkRSRUZPQko7CgkgIH1lbHNlewoJICAgIGdldF9zY3JhdGNoKCZuZXctPnoscC0+bGVmdC0+bnR5cC0+ZmxhZ3MsMCxwLT5sZWZ0LT5udHlwKTsKCSAgfQoJICBuZXctPnR5cGY9cC0+bGVmdC0+bnR5cC0+ZmxhZ3M7CgkgIG5ldy0+cTE9cC0+bGVmdC0+bzsKCSAgcC0+bz1uZXctPno7CgkgIG5ldy0+Y29kZT1ORUdBVElPTjsKCSAgYWRkX0lDKG5ldyk7CgkgIHJldHVybjsKCX0KICAgICAgICBpZighbHRydWUpIHtsMT0rK2xhYmVsO2wyPSsrbGFiZWw7bDM9KytsYWJlbDt9CiAgICAgICAgaWYobHRydWUpCgkgIGdlbl9JQyhwLT5sZWZ0LGxmYWxzZSxsdHJ1ZSk7CgllbHNlCgkgIGdlbl9JQyhwLT5sZWZ0LGwxLGwzKTsKICAgICAgICBpZighcC0+bGVmdC0+by5mbGFncyl7CgkgIGZyZWUobmV3KTtwLT5vLmZsYWdzPTA7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGdlbl90ZXN0KCZwLT5sZWZ0LT5vLHAtPmxlZnQtPm50eXAtPmZsYWdzLEJORSwoKCFsdHJ1ZSk/bDE6bGZhbHNlKSk7CiAgICAgICAgfQogICAgICAgIGlmKGx0cnVlKXsKICAgICAgICAgICAgbmV3PW5ld19JQygpOwogICAgICAgICAgICBuZXctPmNvZGU9QlJBOwogICAgICAgICAgICBpZighbHRydWUpIG5ldy0+dHlwZj1sMjsgZWxzZSBuZXctPnR5cGY9bHRydWU7CiAgICAgICAgICAgIGFkZF9JQyhuZXcpOwogICAgICAgICAgICBwLT5vLmZsYWdzPTA7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGdlbl9sYWJlbChsMyk7CiAgICAgICAgICAgIGdlbl9jb25kKCZwLT5vLDAsbDEsbDIpOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZihwLT5mbGFncz49RVFVQUwmJnAtPmZsYWdzPD1HUkVBVEVSRVEpewogICAgICBpbnQgbDEsbDIsbDMsdGwsdHI7CiAgICAgIHR5cGUgKmF0PTA7CiAgICAgIGNoYXIgKmxpYm5hbWU7CiAgICAgIGlmKElTVkVDVE9SKHAtPm50eXAtPmZsYWdzKSl7Cglkb19hcml0aChwLG5ldywwLDApOwoJcmV0dXJuOwogICAgICB9CiAgICAgIGlmKCFsdHJ1ZSkge2wxPSsrbGFiZWw7bDI9KytsYWJlbDtsMz0rK2xhYmVsO30KICAgICAgaWYocC0+bGVmdC0+ZmxhZ3M9PUNFWFBSKXsKICAgICAgICAvKiAgS29uc3RhbnRlbiBuYWNoIHJlY2h0cyAgKi8KCW5wIG1lcms7bWVyaz1wLT5sZWZ0O3AtPmxlZnQ9cC0+cmlnaHQ7cC0+cmlnaHQ9bWVyazsKCWlmKHAtPmZsYWdzPT1MRVNTKSBwLT5mbGFncz1HUkVBVEVSOwoJZWxzZSBpZihwLT5mbGFncz09TEVTU0VRKSBwLT5mbGFncz1HUkVBVEVSRVE7CgllbHNlIGlmKHAtPmZsYWdzPT1HUkVBVEVSKSBwLT5mbGFncz1MRVNTOwoJZWxzZSBpZihwLT5mbGFncz09R1JFQVRFUkVRKSBwLT5mbGFncz1MRVNTRVE7CiAgICAgIH0KI2lmIEhBVkVfTElCQ0FMTFMKICAgICAgYXQ9YXJpdGhfdHlwKHAtPmxlZnQtPm50eXAscC0+cmlnaHQtPm50eXApOwogICAgICBpZihsaWJuYW1lPXVzZV9saWJjYWxsX3dyYXAoQ09NUEFSRSxhdC0+ZmxhZ3MsMCkpewoJbmV3LT5xMT1nZW5fbGliY2FsbChsaWJuYW1lLHAtPmxlZnQsYXQscC0+cmlnaHQsY2xvbmVfdHlwKGF0KSktPm87CgluZXctPmNvZGU9Q09NUEFSRTsKCW5ldy0+dHlwZj1MSUJDQUxMX0NNUFRZUEU7CgluZXctPnEyLmZsYWdzPUtPTlNUOwoJZ3ZhbC52bWF4PVowOwoJZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOwoJaW5zZXJ0X2NvbnN0KCZuZXctPnEyLnZhbCxMSUJDQUxMX0NNUFRZUEUpOwogICAgICB9ZWxzZXsKI2VuZGlmCiAgICAgICAgbmV3LT5jb2RlPUNPTVBBUkU7CiAgICAgICAgdGw9cC0+bGVmdC0+bnR5cC0+ZmxhZ3MmTlU7dHI9cC0+cmlnaHQtPm50eXAtPmZsYWdzJk5VOwogICAgICAgIGlmKHAtPnJpZ2h0LT5mbGFncz09Q0VYUFImJklTSU5UKHRyKSYmSVNJTlQodGwpJiZ6bTJsKHNpemV0YWJbdGwmTlFdKTw9em0ybChzaXpldGFiW3RyJk5RXSkmJigodGwmTlEpPj1JTlR8fHNob3J0Y3V0KENPTVBBUkUsdGwpKSl7CgkgIGludCBuZWdhdGl2OwoJICBldmFsX2NvbnN0bihwLT5yaWdodCk7CgkgIGlmKHptbGVxKHZtYXgsbDJ6bSgwTCkpKSBuZWdhdGl2PTE7IGVsc2UgbmVnYXRpdj0wOwoJICBpZigodGwmVU5TSUdORUQpfHwodHImVU5TSUdORUQpKSBuZWdhdGl2PTA7CgkgIGlmKCghbmVnYXRpdnx8em1sZXEodF9taW4odGwpLHZtYXgpKSYmKG5lZ2F0aXZ8fHp1bWxlcSh2dW1heCx0X21heCh0bCkpKSl7CgkgICAgaWYoKHRsJlVOU0lHTkVEKXx8ISh0ciZVTlNJR05FRCl8fHAtPmZsYWdzPT1FUVVBTHx8cC0+ZmxhZ3M9PUlORVFVQUwpewoJICAgICAgY29udmVydChwLT5yaWdodCx0bCk7CgkgICAgICB0cj10bDsKCSAgICB9CgkgIH0KICAgICAgICB9CiAgICAgICAgaWYoSVNBUklUSCh0bCkmJih0bCE9dHJ8fCFzaG9ydGN1dChDT01QQVJFLHRsKSkpewoJICB0eXBlICp0OwoJICB0PWFyaXRoX3R5cChwLT5sZWZ0LT5udHlwLHAtPnJpZ2h0LT5udHlwKTsKCSAgbmV3LT50eXBmPXQtPmZsYWdzOwoJICBmcmVldHlwKHQpOwogICAgICAgIH1lbHNlewoJICBuZXctPnR5cGY9cC0+bGVmdC0+bnR5cC0+ZmxhZ3M7CiAgICAgICAgfQogICAgICAgIGdlbl9JQyhwLT5sZWZ0LDAsMCk7CiAgICAgICAgY29udmVydChwLT5sZWZ0LG5ldy0+dHlwZik7CiAgICAgICAgZ2VuX0lDKHAtPnJpZ2h0LDAsMCk7CiAgICAgICAgY29udmVydChwLT5yaWdodCxuZXctPnR5cGYpOwogICAgICAgIG5ldy0+cTE9cC0+bGVmdC0+bzsKICAgICAgICBuZXctPnEyPXAtPnJpZ2h0LT5vOwogICAgICAgIG5ldy0+ei5mbGFncz0wOwoJaWYocC0+ZmxhZ3M9PUVRVUFMfHxwLT5mbGFncz09SU5FUVVBTCl7CgkgIC8qIGdlbmVyYXRlIFRFU1QsIGlmIHBvc3NpYmxlICovCgkgIGlmKG5ldy0+cTIuZmxhZ3MmS09OU1QpewoJICAgIGV2YWxfY29uc3QoJm5ldy0+cTIudmFsLG5ldy0+dHlwZik7CgkgICAgaWYoem1lcXRvKHZtYXgsbDJ6bSgwTCkpJiZ6dW1lcXRvKHZ1bWF4LHVsMnp1bSgwVUwpKSYmemxkZXF0byh2bGRvdWJsZSxkMnpsZCgwLjApKSl7CgkgICAgICBuZXctPmNvZGU9VEVTVDsKCSAgICAgIG5ldy0+cTIuZmxhZ3M9MDsKCSAgICB9CgkgIH0KCX0KI2lmIEhBVkVfTElCQ0FMTFMKICAgICAgfQojZW5kaWYKICAgICAgZnJlZXR5cChhdCk7CiAgICAgIGFkZF9JQyhuZXcpOwogICAgICBuZXc9bmV3X0lDKCk7CiAgICAgIGlmKHAtPmZsYWdzPT1FUVVBTCkgbmV3LT5jb2RlPUJFUTsKICAgICAgaWYocC0+ZmxhZ3M9PUlORVFVQUwpIG5ldy0+Y29kZT1CTkU7CiAgICAgIGlmKHAtPmZsYWdzPT1MRVNTKSBuZXctPmNvZGU9QkxUOwogICAgICBpZihwLT5mbGFncz09TEVTU0VRKSBuZXctPmNvZGU9QkxFOwogICAgICBpZihwLT5mbGFncz09R1JFQVRFUikgbmV3LT5jb2RlPUJHVDsKICAgICAgaWYocC0+ZmxhZ3M9PUdSRUFURVJFUSkgbmV3LT5jb2RlPUJHRTsKICAgICAgaWYobHRydWUpIG5ldy0+dHlwZj1sdHJ1ZTsgZWxzZSBuZXctPnR5cGY9bDE7CiAgICAgIGFkZF9JQyhuZXcpOwogICAgICBpZihsdHJ1ZSl7CgluZXc9bmV3X0lDKCk7CgluZXctPmNvZGU9QlJBOwoJbmV3LT50eXBmPWxmYWxzZTsKCWFkZF9JQyhuZXcpOwoJcC0+by5mbGFncz0wOwogICAgICB9ZWxzZXsKCWdlbl9sYWJlbChsMyk7CglnZW5fY29uZCgmcC0+bywxLGwxLGwyKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBpZihwLT5mbGFncz09Q0FMTCl7CiAgICAgICAgaW50IHI9MCxyYWRycHVzaD0wOwoJb2JqICpvcCxjZnVuYyxyZXRfb2JqOwoJem1heCBzejsKICAgICAgICBpbnQgbXJlZ3NbTUFYUisxXTsKCUlDICpjYWxsaWM7CiNpZmRlZiBPUkRFUkVEX1BVU0gKICAgICAgICBJQyAqbWVya19mcCwqbHA7Cgl1bnNpZ25lZCBpbnQgbWVya19vcHVzaGVkPW9wdXNoZWQ7CiNlbmRpZgogICAgICAgIGlmKHAtPmxlZnQtPmZsYWdzPT1BRERSRVNTJiZwLT5sZWZ0LT5sZWZ0LT5mbGFncz09SURFTlRJRklFUil7CiAgICAgICAgICAgIFZhciAqdjsKICAgICAgICAgICAgZ2VuX0lDKHAtPmxlZnQsMCwwKTsgcj0xOwogICAgICAgICAgICB2PXAtPmxlZnQtPm8udjsKICAgICAgICAgICAgaWYodi0+ZmkmJnYtPmZpLT5maXJzdF9pYyYmIWNyb3NzX21vZHVsZSYmKGNfZmxhZ3NfdmFsWzBdLmwmNDA5NikpewogICAgICAgICAgICAvKiAgZnVuY3Rpb24gY2FsbCBpbmxpbmluZyAgKi8KICAgICAgICAgICAgICAgIGFyZ3VtZW50X2xpc3QgKmFsOwogICAgICAgICAgICAgICAgVmFyICp2cCwqKmFyZ2wxLCoqYXJnbDI7CiAgICAgICAgICAgICAgICBJQyAqaXA7aW50IGxjOwogICAgICAgICAgICAgICAgaW50IGFyZ19jbnQ9MCxpOwogICAgICAgICAgICAgICAgaWYoREVCVUcmMTAyNCl7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJpbmxpbmluZyBjYWxsIHRvIDwlcz5cbiIsdi0+aWRlbnRpZmllcik7CiAgICAgICAgICAgICAgICAgICAgZm9yKHZwPXYtPmZpLT52YXJzO3ZwO3ZwPXZwLT5uZXh0KQogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzKCVsZCkvJXBcbiIsdnAtPmlkZW50aWZpZXIsem0ybCh2cC0+b2Zmc2V0KSwodm9pZCopdnApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yKHZwPXYtPmZpLT52YXJzO3ZwO3ZwPXZwLT5uZXh0KXsKCQkgIC8qRklYTUU6IHptZXF0byBoaWVyIG9rPyBzaWVoZSBjcm9zc19tb2R1bGVfaW5saW5lICovCgkJICBpZigoem1lcXRvKHZwLT5vZmZzZXQsbDJ6bSgwTCkpfHx2cC0+cmVnKSYmKnZwLT5pZGVudGlmaWVyJiYodnAtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHZwLT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikpIGFyZ19jbnQrKzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKiAgQXJndW1lbnRlIGluIGRpZSBlcnN0ZW4gUGFyYW1ldGVydmFyaWFibGVuIGtvcGllcmVuICovCiAgICAgICAgICAgICAgICBhcmdsMT1teW1hbGxvYyhhcmdfY250KnNpemVvZihWYXIgKikpOwogICAgICAgICAgICAgICAgYXJnbDI9bXltYWxsb2MoYXJnX2NudCpzaXplb2YoVmFyICopKTsKCiAgICAgICAgICAgICAgICBhbD1wLT5hbGlzdDt2cD12LT5maS0+dmFycztpPTA7CiAgICAgICAgICAgICAgICB3aGlsZShhbCl7CgkJICAgIC8qRklYTUU6IHptZXF0byBoaWVyIG9rPyBzaWVoZSBjcm9zc19tb2R1bGVfaW5saW5lICovCgkJICAgIHdoaWxlKHZwJiYoISp2cC0+aWRlbnRpZmllcnx8KCF6bWVxdG8odnAtPm9mZnNldCxsMnptKDBMKSkmJiF2cC0+cmVnKXx8KHZwLT5zdG9yYWdlX2NsYXNzIT1SRUdJU1RFUiYmdnAtPnN0b3JhZ2VfY2xhc3MhPUFVVE8pKSkgdnA9dnAtPm5leHQ7CiAgICAgICAgICAgICAgICAgICAgaWYoIXZwKXsgZXJyb3IoMzkpOyBicmVhazsgfQogICAgICAgICAgICAgICAgICAgIGlmKGk+PWFyZ19jbnQpIGllcnJvcigwKTsKICAgICAgICAgICAgICAgICAgICBpZihERUJVRyYxMDI0KSBwcmludGYoImFyZzogJXMoJWxkKVxuIix2cC0+aWRlbnRpZmllcix6bTJsKHZwLT5vZmZzZXQpKTsKICAgICAgICAgICAgICAgICAgICBhcmdsMVtpXT12cDsKICAgICAgICAgICAgICAgICAgICBhcmdsMltpXT1hZGRfdmFyKGVtcHR5LGNsb25lX3R5cCh2cC0+dnR5cCksdnAtPnN0b3JhZ2VfY2xhc3MsMCk7CiAgICAgICAgICAgICAgICAgICAgaWYoIWFsLT5hcmcpIGllcnJvcigwKTsKICAgICAgICAgICAgICAgICAgICBnZW5fSUMoYWwtPmFyZywwLDApOwogICAgICAgICAgICAgICAgICAgIGNvbnZlcnQoYWwtPmFyZyx2cC0+dnR5cC0+ZmxhZ3MpOwogICAgICAgICAgICAgICAgICAgIG5ldz1uZXdfSUMoKTsKICAgICAgICAgICAgICAgICAgICBuZXctPmNvZGU9QVNTSUdOOwogICAgICAgICAgICAgICAgICAgIG5ldy0+cTE9YWwtPmFyZy0+bzsKICAgICAgICAgICAgICAgICAgICBuZXctPnEyLmZsYWdzPTA7CiAgICAgICAgICAgICAgICAgICAgbmV3LT5xMi52YWwudm1heD1zem9mKHZwLT52dHlwKTsKICAgICAgICAgICAgICAgICAgICBuZXctPnouZmxhZ3M9VkFSOwogICAgICAgICAgICAgICAgICAgIG5ldy0+ei52YWwudm1heD1sMnptKDBMKTsKICAgICAgICAgICAgICAgICAgICBuZXctPnoudj1hcmdsMltpXTsKICAgICAgICAgICAgICAgICAgICBuZXctPnR5cGY9dnAtPnZ0eXAtPmZsYWdzOwoJCSAgICBuZXctPnR5cGYyPWZhbGlnbih2cC0+dnR5cCk7CiAgICAgICAgICAgICAgICAgICAgYWRkX0lDKG5ldyk7CiAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIGFsPWFsLT5uZXh0OwogICAgICAgICAgICAgICAgICAgIHZwPXZwLT5uZXh0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYoaTxhcmdfY250KXsgZXJyb3IoODMpOyBhcmdfY250PWk7fQoKICAgICAgICAgICAgICAgIC8qICBLb3BpZW4gZGVyIFZhcmlhYmxlbiBlcnpldWdlbiAgICovCiAgICAgICAgICAgICAgICBmb3IodnA9di0+ZmktPnZhcnM7dnA7dnA9dnAtPm5leHQpewogICAgICAgICAgICAgICAgICAgIHZwLT5pbmxpbmVfY29weT0wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yKGk9MDtpPGFyZ19jbnQ7aSsrKXsKICAgICAgICAgICAgICAgICAgICBpZihhcmdsMVtpXSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFhcmdsMltpXSkgaWVycm9yKDApOwogICAgICAgICAgICAgICAgICAgICAgICBhcmdsMVtpXS0+aW5saW5lX2NvcHk9YXJnbDJbaV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qICBSdWVja2dhYmV3ZXJ0ICAgKi8KICAgICAgICAgICAgICAgIGlmKChwLT5udHlwLT5mbGFncyZOUSkhPVZPSUQpewogICAgICAgICAgICAgICAgICAgIHAtPm8uZmxhZ3M9U0NSQVRDSHxWQVI7CiAgICAgICAgICAgICAgICAgICAgcC0+by5yZWc9MDtwLT5vLnZhbC52bWF4PWwyem0oMEwpOwogICAgICAgICAgICAgICAgICAgIHAtPm8udj1hZGRfdmFyKGVtcHR5LGNsb25lX3R5cChwLT5udHlwKSxBVVRPLDApOwogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgcC0+by5mbGFncz0wOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZyZWUoYXJnbDEpOwogICAgICAgICAgICAgICAgZnJlZShhcmdsMik7CgogICAgICAgICAgICAgICAgLyogIENvZGUgZWluZnVlZ2VuIHVuZCBMYWJlbHMgdW1zY2hyZWliZW4gICAqLwogICAgICAgICAgICAgICAgaXA9di0+ZmktPmZpcnN0X2ljO2xjPTA7CiAgICAgICAgICAgICAgICB3aGlsZShpcCl7CiAgICAgICAgICAgICAgICAgICAgVmFyICppdjsKICAgICAgICAgICAgICAgICAgICBpbnQgYzsKICAgICAgICAgICAgICAgICAgICBuZXc9bmV3X0lDKCk7CgkJICAgICpuZXc9KmlwOwoJCSAgICBpcC0+Y29weT1uZXc7CiAgICAgICAgICAgICAgICAgICAgYz1pcC0+Y29kZTsKICAgICAgICAgICAgICAgICAgICAvKiAgZXZ0bC4gaXN0IGVpbiBJQyBwcmFrdGlzY2ggZWluIFNFVFJFVFVSTiwgZmFsbHMgZGFzICovCiAgICAgICAgICAgICAgICAgICAgLyogIFJ1ZWNrZ2FiZXppZWwgdWViZXIgUGFyYW1ldGVyemVpZ2VyIGFuZ2VzcHIuIHdpcmQgICAqLwogICAgICAgICAgICAgICAgICAgIGlmKGlwLT56LmZsYWdzJlZBUil7CiAgICAgICAgICAgICAgICAgICAgICBpdj1pcC0+ei52OwogICAgICAgICAgICAgICAgICAgICAgaWYoaXYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fGl2LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEqaXYtPmlkZW50aWZpZXImJnptZXF0byhpdi0+b2Zmc2V0LGwyem0oMEwpKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3LT56PXAtPm87CiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpdi0+aW5saW5lX2NvcHkpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXYtPmlubGluZV9jb3B5PWFkZF92YXIoZW1wdHksY2xvbmVfdHlwKGl2LT52dHlwKSxpdi0+c3RvcmFnZV9jbGFzcywwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2LT5pbmxpbmVfY29weS0+cmVnPWl2LT5yZWc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+ei52PWl2LT5pbmxpbmVfY29weTsKICAgICAgICAgICAgICAgICAgICAgICAgfS8qZWxzZSBpZihpdi0+aW5saW5lX2NvcHkpIGllcnJvcigwKTsqLwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvKiAgS29waWVuIGFsbGVyIGF1dG8vcmVnaXN0ZXIgVmFyaWFibGVuIGVyemV1Z2VuICAgKi8KICAgICAgICAgICAgICAgICAgICBpZihpcC0+cTEuZmxhZ3MmVkFSKXsKICAgICAgICAgICAgICAgICAgICAgIGl2PWlwLT5xMS52OwogICAgICAgICAgICAgICAgICAgICAgaWYoaXYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fGl2LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpdi0+aW5saW5lX2NvcHkpewogICAgICAgICAgICAgICAgICAgICAgICAgIGl2LT5pbmxpbmVfY29weT1hZGRfdmFyKGVtcHR5LGNsb25lX3R5cChpdi0+dnR5cCksaXYtPnN0b3JhZ2VfY2xhc3MsMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaXYtPmlubGluZV9jb3B5LT5yZWc9aXYtPnJlZzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBuZXctPnExLnY9aXYtPmlubGluZV9jb3B5OwogICAgICAgICAgICAgICAgICAgICAgfS8qZWxzZSBpZihpdi0+aW5saW5lX2NvcHkpIGllcnJvcigwKTsqLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZihpcC0+cTIuZmxhZ3MmVkFSKXsKICAgICAgICAgICAgICAgICAgICAgIGl2PWlwLT5xMi52OwogICAgICAgICAgICAgICAgICAgICAgaWYoaXYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fGl2LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpdi0+aW5saW5lX2NvcHkpewogICAgICAgICAgICAgICAgICAgICAgICAgIGl2LT5pbmxpbmVfY29weT1hZGRfdmFyKGVtcHR5LGNsb25lX3R5cChpdi0+dnR5cCksaXYtPnN0b3JhZ2VfY2xhc3MsMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaXYtPmlubGluZV9jb3B5LT5yZWc9aXYtPnJlZzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBuZXctPnEyLnY9aXYtPmlubGluZV9jb3B5OwogICAgICAgICAgICAgICAgICAgICAgfS8qZWxzZSBpZihpdi0+aW5saW5lX2NvcHkpIGllcnJvcigwKTsqLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZihjPT1DQUxMKXsKCQkgICAgICBpbnQgaTsKCQkgICAgICBmdW5jdGlvbl9jYWxscys9Y3VycmVudHByaTsKCQkgICAgICBuZXctPmFyZ19saXN0PW15bWFsbG9jKHNpemVvZigqbmV3LT5hcmdfbGlzdCkqbmV3LT5hcmdfY250KTsKCQkgICAgICBmb3IoaT0wO2k8bmV3LT5hcmdfY250O2krKykgbmV3LT5hcmdfbGlzdFtpXT1pcC0+YXJnX2xpc3RbaV0tPmNvcHk7CgkJICAgIH0KICAgICAgICAgICAgICAgICAgICBpZihjPT1MQUJFTHx8KGM+PUJFUSYmYzw9QlJBKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5ldy0+dHlwZj5sYykgbGM9bmV3LT50eXBmOwogICAgICAgICAgICAgICAgICAgICAgICBuZXctPnR5cGYrPWxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZihjPT1TRVRSRVRVUk4pewogICAgICAgICAgICAgICAgICAgICAgICBuZXctPmNvZGU9QVNTSUdOOwogICAgICAgICAgICAgICAgICAgICAgICBuZXctPno9cC0+bzsKICAgICAgICAgICAgICAgICAgICB9CgkJICAgIGFkZF9JQyhuZXcpOwogICAgICAgICAgICAgICAgICAgIGlwPWlwLT5uZXh0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGFiZWwrPWxjOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qICBlaW5pZ2Ugc3BlemllbGxlIElubGluZS1GdW5rdGlvbmVuOyBkYXMgc2V0enQgdm9yYXVzLCBkYXNzICAqLwogICAgICAgICAgICAvKiAgZGllc2UgaW4gZGVuIEhlYWRlcmZpbGVzIHBhc3NlbmQgZGVrbGFyaWVydCB3ZXJkZW4gICAgICAgICAgKi8KICAgICAgICAgICAgaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKCSAgICAgICAgaWYoKG9wdGZsYWdzJjIpJiYoIXN0cmNtcCh2LT5pZGVudGlmaWVyLCJzdHJsZW4iKXx8IXN0cmNtcCh2LT5pZGVudGlmaWVyLCJfX2FzbV9zdHJsZW4iKSkmJnAtPmFsaXN0JiZwLT5hbGlzdC0+YXJnKXsKICAgICAgICAgICAgICAgICAgICBucCBuPXAtPmFsaXN0LT5hcmc7CiAgICAgICAgICAgICAgICAgICAgaWYobi0+ZmxhZ3M9PUFERFJFU1NBJiZuLT5sZWZ0LT5mbGFncz09U1RSSU5HJiZ6bWVxdG8obi0+bGVmdC0+dmFsLnZtYXgsbDJ6bSgwTCkpKXsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfbGlzdCAqY2w7enVtYXggbGVuPXVsMnp1bSgwVUwpOwogICAgICAgICAgICAgICAgICAgICAgICBjbD1uLT5sZWZ0LT5jbDsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoY2wpewoJCQkgIGlmKHptZXF0byhsMnptKDBMKSx6YzJ6bShjbC0+b3RoZXItPnZhbC52Y2hhcikpKSBicmVhazsKCQkJICBsZW49enVtYWRkKGxlbix1bDJ6dW0oMVVMKSk7CgkJCSAgY2w9Y2wtPm5leHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcC0+by52YWwudnVtYXg9bGVuOwogICAgICAgICAgICAgICAgICAgICAgICBldmFsX2NvbnN0KCZwLT5vLnZhbCxVTlNJR05FRHxNQVhJTlQpOwogICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRfY29uc3RuKHApOwogICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRfY29uc3QoJnAtPm8udmFsLHAtPm50eXAtPmZsYWdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZmxhZ3M9Q0VYUFI7CiAgICAgICAgICAgICAgICAgICAgICAgIHAtPm8uZmxhZ3M9S09OU1Q7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYoaW5saW5lX21lbWNweV9zej4wJiYob3B0ZmxhZ3MmMikpewoJCSAgICBpZigoIXN0cmNtcCh2LT5pZGVudGlmaWVyLCJzdHJjcHkiKXx8IXN0cmNtcCh2LT5pZGVudGlmaWVyLCJfX2FzbV9zdHJjcHkiKSkmJnAtPmFsaXN0JiZwLT5hbGlzdC0+bmV4dCYmcC0+YWxpc3QtPm5leHQtPmFyZyl7CiAgICAgICAgICAgICAgICAgICAgICAgIG5wIG49cC0+YWxpc3QtPm5leHQtPmFyZzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYobi0+ZmxhZ3M9PUFERFJFU1NBJiZuLT5sZWZ0LT5mbGFncz09U1RSSU5HJiZ6bWVxdG8obi0+bGVmdC0+dmFsLnZtYXgsbDJ6bSgwTCkpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2xpc3QgKmNsO3ptYXggbGVuPWwyem0oMEwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w9bi0+bGVmdC0+Y2w7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShjbCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuPXptYWRkKGxlbixsMnptKDFMKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoem1lcXRvKHpjMnptKGNsLT5vdGhlci0+dmFsLnZjaGFyKSxsMnptKDBMKSkpIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsPWNsLT5uZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoem1sZXEobGVuLGwyem0oKGxvbmcpaW5saW5lX21lbWNweV9zeikpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVfbWVtY3B5KHAtPmFsaXN0LT5hcmcsbixsZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPm89cC0+YWxpc3QtPmFyZy0+bzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYoIXN0cmNtcCh2LT5pZGVudGlmaWVyLCJtZW1jcHkiKXx8IXN0cmNtcCh2LT5pZGVudGlmaWVyLCJfX2FzbV9tZW1jcHkiKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHAtPmFsaXN0JiZwLT5hbGlzdC0+bmV4dCYmcC0+YWxpc3QtPm5leHQtPm5leHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgJiZwLT5hbGlzdC0+bmV4dC0+bmV4dC0+YXJnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICYmcC0+YWxpc3QtPm5leHQtPm5leHQtPmFyZy0+ZmxhZ3M9PUNFWFBSKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWxfY29uc3RuKHAtPmFsaXN0LT5uZXh0LT5uZXh0LT5hcmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoem1sZXEodm1heCxsMnptKChsb25nKWlubGluZV9tZW1jcHlfc3opKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lX21lbWNweShwLT5hbGlzdC0+YXJnLHAtPmFsaXN0LT5uZXh0LT5hcmcsdm1heCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+bz1wLT5hbGlzdC0+YXJnLT5vOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBybD0wOwogICAgICAgIGlmKCEob3B0ZmxhZ3MmMikpewogICAgICAgICAgaW50IHI7CiAgICAgICAgICBmb3Iocj0xO3I8PU1BWFI7cisrKXttcmVnc1tyXT1yZWdzW3JdO3JlZ3Nbcl0mPX4oUk5PU0FWRXxSSEFMRik7fQogICAgICAgIH1lbHNlewoJICBnZW5fSUMocC0+bGVmdCwwLDApOwoJfQojaWZkZWYgT1JERVJFRF9QVVNICiAgICAgICAgbWVya19mcD1maXJzdF9wdXNoZWQ7CiAgICAgICAgZmlyc3RfcHVzaGVkPTA7CiAgICAgICAgbHA9bGFzdF9pYzsKI2VuZGlmCiNpZmRlZiBIQVZFX1JFR1BBUk1TCiAgICAgICAgaWYoIWZmcmV0dXJuKHAtPm50eXApJiYocC0+bnR5cC0+ZmxhZ3MmTlEpIT1WT0lEKXsKICAgICAgICAgIElDICpuZXcyO3N0YXRpYyB0eXBlIHB0eXA9ezB9OwoJICB0cmVnX2hhbmRsZSByZWdfaGFuZGxlPWVtcHR5X3JlZ19oYW5kbGU7CgkgIGludCByZWc7CgkgIHB0eXAubmV4dD1wLT5udHlwOwoJICBwdHlwLmZsYWdzPVBPSU5URVJfVFlQRShwLT5udHlwKTsKCSAgcmVnPXJlZ19wYXJtKCZyZWdfaGFuZGxlLCZwdHlwLDAscC0+bGVmdC0+bnR5cC0+bmV4dCk7CgkgIGlmKHJlZyl7CgkgICAgbmV3Mj1uZXdfSUMoKTsKCSAgICBuZXcyLT5jb2RlPUFERFJFU1M7CgkgICAgbmV3Mi0+dHlwZj1wLT5udHlwLT5mbGFnczsKCSAgICBuZXcyLT50eXBmMj1QT0lOVEVSX1RZUEUocC0+bnR5cCk7CgkgICAgbmV3Mi0+cTEuZmxhZ3M9VkFSOwoJICAgIG5ldzItPnExLnY9YWRkX3ZhcihlbXB0eSxjbG9uZV90eXAocC0+bnR5cCksQVVUTywwKTsKCSAgICBuZXcyLT5xMS52YWwudm1heD1sMnptKDBMKTsKCSAgICBvcD0mbmV3Mi0+cTE7CgkgICAgbmV3Mi0+cTIuZmxhZ3M9MDsKCSAgICBnZXRfc2NyYXRjaCgmbmV3Mi0+eixQT0lOVEVSX1RZUEUocC0+bnR5cCkscC0+bnR5cC0+ZmxhZ3MsMCk7CgkgICAgcmV0X29iaj1uZXcyLT56OwoJICAgIGFkZF9JQyhuZXcyKTsKCSAgICBzej1wdXNoX2FyZ3MocC0+YWxpc3QscC0+bGVmdC0+bnR5cC0+bmV4dC0+ZXhhY3QsMCwmcmwsJnJlZ19oYW5kbGUsJnJldF9vYmoscC0+bnR5cCxyZWcscC0+bGVmdC0+bnR5cCk7CgkgICAgaWYob3B0ZmxhZ3MmMikKCSAgICAgIGhhbmRsZV9yZWdsaXN0KHJsLCZyZXRfb2JqKTsKCSAgfWVsc2V7CgkgICAgc3o9cHVzaF9hcmdzKHAtPmFsaXN0LHAtPmxlZnQtPm50eXAtPm5leHQtPmV4YWN0LDAsJnJsLCZyZWdfaGFuZGxlLDAscC0+bnR5cCxyZWcscC0+bGVmdC0+bnR5cCk7CgkgICAgcmFkcnB1c2g9MTsKCSAgICBpZihvcHRmbGFncyYyKQoJICAgICAgaGFuZGxlX3JlZ2xpc3QocmwsMCk7CgkgIH0KCX1lbHNlewoJICB0cmVnX2hhbmRsZSByZWdfaGFuZGxlPWVtcHR5X3JlZ19oYW5kbGU7CgkgIHN6PXB1c2hfYXJncyhwLT5hbGlzdCxwLT5sZWZ0LT5udHlwLT5uZXh0LT5leGFjdCwwLCZybCwmcmVnX2hhbmRsZSwwLDAsLTEscC0+bGVmdC0+bnR5cCk7CgkgIGlmKG9wdGZsYWdzJjIpCgkgICAgaGFuZGxlX3JlZ2xpc3QocmwsMCk7Cgl9CiNlbHNlCiAgICAgICAgc3o9cHVzaF9hcmdzKHAtPmFsaXN0LHAtPmxlZnQtPm50eXAtPm5leHQtPmV4YWN0LDAsJnJsKTsKCWlmKG9wdGZsYWdzJjIpCgkgIGhhbmRsZV9yZWdsaXN0KHJsLDApOwojZW5kaWYKICAgICAgICBpZighciYmIShvcHRmbGFncyYyKSkgZ2VuX0lDKHAtPmxlZnQsMCwwKTsKICAgICAgICBpZighKHAtPmxlZnQtPm8uZmxhZ3MmRFJFRk9CSikpewogICAgICAgICAgICBmcmVlKG5ldyk7CiAgICAgICAgICAgIHAtPm89cC0+bGVmdC0+bzsKICAgICAgICAgICAgaWYocC0+by5mbGFncyZWQVJBRFIpewoJICAgICAgcC0+by5mbGFncyY9flZBUkFEUjsKCSAgICB9ZWxzZXsKCSAgICAgIHAtPm8uZmxhZ3N8PURSRUZPQko7CgkgICAgICBwLT5vLmR0eXA9cC0+bGVmdC0+bnR5cC0+ZmxhZ3M7CgkgICAgfQogICAgICAgIH1lbHNlewogICAgICAgICAgICBpZihwLT5sZWZ0LT5vLmZsYWdzJlZBUkFEUil7CiAgICAgICAgICAgICAgICBmcmVlKG5ldyk7CiAgICAgICAgICAgICAgICBwLT5vPXAtPmxlZnQtPm87CiAgICAgICAgICAgICAgICBwLT5vLmZsYWdzJj1+VkFSQURSOwogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIGlmKChwLT5sZWZ0LT5vLmZsYWdzJlNDUkFUQ0gpJiZwLT5udHlwLT5mbGFncz09cC0+bGVmdC0+bnR5cC0+ZmxhZ3MpewoJCSAgbmV3LT56PXAtPmxlZnQtPm87CgkJICBuZXctPnouZmxhZ3MmPX5EUkVGT0JKOwogICAgICAgICAgICAgICAgfWVsc2V7CgkJICBnZXRfc2NyYXRjaCgmbmV3LT56LHAtPmxlZnQtPm50eXAtPmZsYWdzLEZVTktULHAtPmxlZnQtPm50eXApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbmV3LT5jb2RlPUFTU0lHTjsKCQluZXctPnR5cGY9cC0+bGVmdC0+bnR5cC0+ZmxhZ3M7CiAgICAgICAgICAgICAgICBuZXctPnExPXAtPmxlZnQtPm87CiAgICAgICAgICAgICAgICBuZXctPnEyLnZhbC52bWF4PXNpemV0YWJbbmV3LT50eXBmJk5RXTsKICAgICAgICAgICAgICAgIG5ldy0+cTIuZmxhZ3M9MDsKICAgICAgICAgICAgICAgIHAtPm89bmV3LT56OwogICAgICAgICAgICAgICAgYWRkX0lDKG5ldyk7CiAgICAgICAgICAgICAgICBwLT5vLmZsYWdzfD1EUkVGT0JKOwoJCXAtPm8uZHR5cD1wLT5sZWZ0LT5udHlwLT5mbGFnczsKICAgICAgICAgICAgfQogICAgICAgIH0KLyogICAgICAgICAgICBwLT5sZWZ0LT5vLmZsYWdzLT1EUkVGT0JKfFZBUkFEUjsgV2FzIHNvbGx0ZSBkYXM/PyAgICAqLwoKI2lmIDAKICAgICAgICBpZihvcHRmbGFncyYyKXsKICAgICAgICAgICAgd2hpbGUocmwpewogICAgICAgICAgICAgICAgcmVnYXJnc19saXN0ICptOwogICAgICAgICAgICAgICAgbmV3PW5ld19JQygpOwogICAgICAgICAgICAgICAgbmV3LT5jb2RlPU5PUDsKICAgICAgICAgICAgICAgIG5ldy0+cTEuZmxhZ3M9VkFSOwogICAgICAgICAgICAgICAgbmV3LT5xMS52PXJsLT52OwogICAgICAgICAgICAgICAgbmV3LT5xMS52YWwudm1heD1sMnptKDBMKTsKICAgICAgICAgICAgICAgIG5ldy0+dHlwZj0wOwogICAgICAgICAgICAgICAgbmV3LT5xMi5mbGFncz1uZXctPnouZmxhZ3M9MDsKICAgICAgICAgICAgICAgIGFkZF9JQyhuZXcpOwogICAgICAgICAgICAgICAgbT1ybC0+bmV4dDtmcmVlKHJsKTtybD1tOwogICAgICAgICAgICB9CiAgICAgICAgfQojZW5kaWYKCiAgICAgICAgLyogIGdlZ2ViZW5lbmZhbGxzIEFkcmVzc2UgZGVzIFppZWxzIGF1ZiBkZW4gU3RhY2sgICovCiNpZmRlZiBIQVZFX1JFR1BBUk1TCglpZihyYWRycHVzaCkKI2Vsc2UKICAgICAgICBpZighZmZyZXR1cm4ocC0+bnR5cCkmJihwLT5udHlwLT5mbGFncyZOUSkhPVZPSUQpCiNlbmRpZgoJewojaWYgZGVmaW5lZChPUkRFUkVEX1BVU0gpICYmIGRlZmluZWQoSEFWRV9SRUdQQVJNUykKCSAgaWVycm9yKDApOwojZW5kaWYKCSAgbmV3PW5ld19JQygpOwoJICBuZXctPmNvZGU9QUREUkVTUzsKCSAgbmV3LT50eXBmPXAtPm50eXAtPmZsYWdzOwoJICBuZXctPnR5cGYyPVBPSU5URVJfVFlQRShwLT5udHlwKTsKCSAgbmV3LT5xMS5mbGFncz1WQVI7CgkgIG5ldy0+cTEudj1hZGRfdmFyKGVtcHR5LGNsb25lX3R5cChwLT5udHlwKSxBVVRPLDApOwoJICBuZXctPnExLnZhbC52bWF4PWwyem0oMEwpOwoJICBvcD0mbmV3LT5xMTsKCSAgbmV3LT5xMi5mbGFncz0wOwoJICBnZXRfc2NyYXRjaCgmbmV3LT56LFBPSU5URVJfVFlQRShwLT5udHlwKSxwLT5udHlwLT5mbGFncywwKTsKCSAgcmV0X29iaj1uZXctPno7CgkgIGFkZF9JQyhuZXcpOwoJICBuZXc9bmV3X0lDKCk7CgkgIG5ldy0+Y29kZT1QVVNIOwoJICBuZXctPnR5cGY9UE9JTlRFUl9UWVBFKHAtPm50eXApOwoJICBuZXctPnExPXJldF9vYmo7CgkgIG5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CgkgIG5ldy0+cTIudmFsLnZtYXg9c2l6ZXRhYltuZXctPnR5cGYmTlFdOwoJICBuZXctPnoudmFsLnZtYXg9bmV3LT5xMi52YWwudm1heDsKCSAgYWRkX0lDKG5ldyk7CgkgIHN6PXptYWRkKHN6LHNpemV0YWJbbmV3LT50eXBmJk5RXSk7CiAgICAgICAgfQoKICAgICAgICAvKiAgU2NyYXRjaHJlZ2lzdGVyIGV2dGwuIHNpY2hlcm4gICAqLwoJY2Z1bmM9cC0+bzsKICAgICAgICBpZighbm9jb2RlKQoJICBzYXZlc2NyYXRjaChNT1ZFRlJPTVJFRyxsYXN0X2ljLDAsJmNmdW5jKTsKICAgICAgICBmdW5jdGlvbl9jYWxscys9Y3VycmVudHByaTsKICAgICAgICBuZXc9bmV3X0lDKCk7CiAgICAgICAgbmV3LT5jb2RlPUNBTEw7CgljYWxsaWM9bmV3OwoJaWYocC0+YWxpc3QpewoJICAvKiBpbnNlcnQgbGlzdCBvZiBhcmd1bWVudCBJQ3MgKi8KCSAgaW50IGk9MDsKCSAgYXJndW1lbnRfbGlzdCAqYT1wLT5hbGlzdDsKCSAgd2hpbGUoYSl7aSsrO2E9YS0+bmV4dDt9CgkgIG5ldy0+YXJnX2NudD1pOwoJICBuZXctPmFyZ19saXN0PW15bWFsbG9jKHNpemVvZigqbmV3LT5hcmdfbGlzdCkqaSk7CgkgIGZvcihhPXAtPmFsaXN0LGk9MDthO2E9YS0+bmV4dCxpKyspIG5ldy0+YXJnX2xpc3RbaV09YS0+cHVzaGljOwoJfWVsc2V7CgkgIG5ldy0+YXJnX2NudD0wOwoJICBuZXctPmFyZ19saXN0PTA7Cgl9CiAgICAgICAgbmV3LT50eXBmPUZVTktUOwogICAgICAgIG5ldy0+cTE9cC0+bzsKICAgICAgICBuZXctPnEyLmZsYWdzPW5ldy0+ei5mbGFncz0wOwogICAgICAgIG5ldy0+cTIudmFsLnZtYXg9c3o7IC8qICBHcm9lc3NlIGRlciBQYXJhbWV0ZXIgYXVmIGRlbSBTdGFjayAqLwogICAgICAgIGFkZF9JQyhuZXcpOwoKCS8vcHJpYzIoc3Rkb3V0LG5ldyk7CgogICAgICAgIGlmKG9wdGZsYWdzJjIpewogICAgICAgICAgICB3aGlsZShybCl7CiAgICAgICAgICAgICAgICByZWdhcmdzX2xpc3QgKm07CiAgICAgICAgICAgICAgICBuZXc9bmV3X0lDKCk7CiAgICAgICAgICAgICAgICBuZXctPmNvZGU9Tk9QOwogICAgICAgICAgICAgICAgbmV3LT5xMS5mbGFncz1WQVI7CiAgICAgICAgICAgICAgICBuZXctPnExLnY9cmwtPnY7CiAgICAgICAgICAgICAgICBuZXctPnExLnZhbC52bWF4PWwyem0oMEwpOwogICAgICAgICAgICAgICAgbmV3LT50eXBmPTA7CiAgICAgICAgICAgICAgICBuZXctPnEyLmZsYWdzPW5ldy0+ei5mbGFncz0wOwogICAgICAgICAgICAgICAgYWRkX0lDKG5ldyk7CiAgICAgICAgICAgICAgICBtPXJsLT5uZXh0O2ZyZWUocmwpO3JsPW07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHI9MDsKICAgICAgICBpZigocC0+bnR5cC0+ZmxhZ3MmTlEpIT1WT0lEKXsKICAgICAgICAgICAgbmV3PW5ld19JQygpOwogICAgICAgICAgICBuZXctPmNvZGU9R0VUUkVUVVJOOwogICAgICAgICAgICBuZXctPnExLmZsYWdzPW5ldy0+cTIuZmxhZ3M9MDsKICAgICAgICAgICAgbmV3LT5xMS5yZWc9ZmZyZXR1cm4ocC0+bnR5cCk7CiAgICAgICAgICAgIG5ldy0+cTIudmFsLnZtYXg9c3pvZihwLT5udHlwKTsKICAgICAgICAgICAgbmV3LT50eXBmPXAtPm50eXAtPmZsYWdzOwogICAgICAgICAgICBpZihmZnJldHVybihwLT5udHlwKSl7CiAgICAgICAgICAgICAgaW50IHQ9cC0+bnR5cC0+ZmxhZ3MmTlE7CiAgICAgICAgICAgICAgaWYoSVNTVFJVQ1QodCl8fElTVU5JT04odCkpewogICAgICAgICAgICAgICAgbmV3LT56LnY9YWRkX3ZhcihlbXB0eSxjbG9uZV90eXAocC0+bnR5cCksQVVUTywwKTsKICAgICAgICAgICAgICAgIG5ldy0+ei5mbGFncz1WQVI7CiAgICAgICAgICAgICAgICBuZXctPnoudmFsLnZtYXg9bDJ6bSgwTCk7CiAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICBpZihvcHRmbGFncyYyKXsKICAgICAgICAgICAgICAgICAgZ2V0X3NjcmF0Y2goJm5ldy0+eixwLT5udHlwLT5mbGFncywwLHAtPm50eXApOwogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgIC8qIFN1Y2hlIGdlZWlnbmV0ZXMgUmVnaXN0ZXIsIHVtIFJ1ZWNrZ2FiZXdlcnQgenUgc3BlaWNoZXJuLiAqLwogICAgICAgICAgICAgICAgICByZWdhcmdzX2xpc3QgKmwyOwogICAgICAgICAgICAgICAgICBpbnQgcjsKICAgICAgICAgICAgICAgICAgcj1uZXctPnExLnJlZzsKICAgICAgICAgICAgICAgICAgaWYocmVnc1tyXXx8IXJlZ29rKHIscC0+bnR5cC0+ZmxhZ3MsMCl8fChyZWdfcGFpcihyLCZycCkmJihyZWdzW3JwLnIxXXx8cmVnc1tycC5yMl0pKSl7CiAgICAgICAgICAgICAgICAgICAgcj0wOwogICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICBmb3IobDI9cmw7bDI7bDI9bDItPm5leHQpewogICAgICAgICAgICAgICAgICAgICAgaWYobDItPnYmJmFicyhsMi0+cmVnKT09cikge3I9MDticmVhazt9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmKHI9PTApewogICAgICAgICAgICAgICAgICAgIGZvcihyPTE7cjw9TUFYUjtyKyspewogICAgICAgICAgICAgICAgICAgICAgaWYoIXJlZ3Nbcl0mJnJlZ29rKHIscC0+bnR5cC0+ZmxhZ3MsMCkmJighcmVnX3BhaXIociwmcnApfHwoIXJlZ3NbcnAucjFdJiYhcmVnc1tycC5yMl0pKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsMj1ybDtsMjtsMj1sMi0+bmV4dCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobDItPnYmJmFicyhsMi0+cmVnKT09cikgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYobDIpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYocj49MSYmcjw9TUFYUil7CiAgICAgICAgICAgICAgICAgICAgYWxsb2NfaGFyZHJlZyhyKTsKICAgICAgICAgICAgICAgICAgICBuZXctPnouZmxhZ3M9KFJFR3xTQ1JBVENIKTsKICAgICAgICAgICAgICAgICAgICBuZXctPnoucmVnPXI7CiAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgIGdldF9zY3JhdGNoKCZuZXctPnoscC0+bnR5cC0+ZmxhZ3MsMCxwLT5udHlwKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgbmV3LT56PSpvcDsKICAgICAgICAgICAgaWYoKG5ldy0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKSByPW5ldy0+ei5yZWc7CiAgICAgICAgICAgIHAtPm89bmV3LT56OwogICAgICAgICAgICBhZGRfSUMobmV3KTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgcC0+by5mbGFncz0wOwogICAgICAgIH0KICAgICAgICAvKiAgU2NyYXRjaHJlZ2lzdGVyIGV2dGwuIHdpZWRlcmhlcnN0ZWxsZW4gICovCiAgICAgICAgaWYoIW5vY29kZSkKCSAgc2F2ZXNjcmF0Y2goTU9WRVRPUkVHLGxhc3RfaWMsciwmY2Z1bmMpOwogICAgICAgIGlmKCEob3B0ZmxhZ3MmMikpewogICAgICAgICAgaW50IHI7CiAgICAgICAgICBmb3Iocj0xO3I8PU1BWFI7cisrKXsKICAgICAgICAgICAgaWYocmVnc1tyXSkKICAgICAgICAgICAgICByZWdzW3JdfD0obXJlZ3Nbcl0mUk5PU0FWRSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qICBFdnRsLiBnZXNwZWljaGVydGUgUmVnaXN0ZXJhcmd1bWVudGUgd2llZGVyaGVyc3RlbGxlbi4gICovCiAgICAgICAgd2hpbGUocmwpewogICAgICAgICAgICByZWdhcmdzX2xpc3QgKm07CiAgICAgICAgICAgIGlmKHJsLT52KXsKCSAgICAgIGludCByOwoJICAgICAgZm9yKHI9TUFYUjtyPj0xO3ItLSl7CgkJaWYocmVnc1tyXSYmcmVnX3BhaXIociwmcnApJiYocnAucjE9PWFicyhybC0+cmVnKXx8cnAucjI9PWFicyhybC0+cmVnKSkpCgkJICBicmVhazsKCSAgICAgIH0KCSAgICAgIGlmKHI8PTEpIHI9YWJzKHJsLT5yZWcpOwoJICAgICAgbmV3PW5ld19JQygpOwoJICAgICAgbmV3LT5jb2RlPU1PVkVUT1JFRzsKCSAgICAgIG5ldy0+dHlwZj0wOwoJICAgICAgbmV3LT5xMS5mbGFncz1WQVJ8RE9OVFJFR0lTVEVSSVpFOwoJICAgICAgbmV3LT5xMS52PXJsLT52OwoJICAgICAgbmV3LT5xMS52YWwudm1heD1sMnptKDBMKTsKCSAgICAgIG5ldy0+ei5mbGFncz1SRUc7CgkgICAgICBpZihybC0+cnNhdmVkKQoJCW5ldy0+ei5yZWc9cmwtPnJzYXZlZDsKCSAgICAgIGVsc2UKCQluZXctPnoucmVnPWFicyhyKTsKCSAgICAgIG5ldy0+cTIuZmxhZ3M9MDsKCSAgICAgIG5ldy0+cTIudmFsLnZtYXg9cmVnc2l6ZVtyXTsKCSAgICAgIGFkZF9JQyhuZXcpOwoJICAgICAgaWYocmwtPnJzYXZlZCkKCQlmcmVlX3JlZyhhYnMocmwtPnJlZykpOwogICAgICAgICAgICB9ZWxzZXsKCSAgICAgIGZyZWVfcmVnKGFicyhybC0+cmVnKSk7CgkgICAgfQogICAgICAgICAgICBtPXJsLT5uZXh0O2ZyZWUocmwpO3JsPW07CiAgICAgICAgfQojaWZkZWYgT1JERVJFRF9QVVNICiAgICAgICAgLyogSWYgYXJndW1lbnRzIGhhdmUgYmVlbiBwdXNoZWQgbmVzdGVkIHdlIGhhdmUgdG8gY29weSB0aGVtIGFuZCAqLwogICAgICAgIC8qIHB1c2ggdGhlbSBsYXRlci4gKi8KICAgICAgICBpZihtZXJrX2ZwJiZvcHVzaGVkIT1tZXJrX29wdXNoZWQpewogICAgICAgICAgSUMgKnAsKm09MCwqbnA7CiAgICAgICAgICBpZighbHApIGllcnJvcigwKTsKICAgICAgICAgIGZvcihwPW1lcmtfZnA7cDspewogICAgICAgICAgICBucD1wLT5uZXh0OwogICAgICAgICAgICBpZihwLT5jb2RlPT1QVVNIKXsKICAgICAgICAgICAgICBuZXc9bmV3X0lDKCk7CiAgICAgICAgICAgICAgKm5ldz0qcDsKCSAgICAgIC8qIGJlIGNhcmVmdWwgYWJvdXQgdGhlIGFkZHJlc3MgYmVjYXVzZSBvZiBhcmdfbGlzdCEgKi8KCSAgICAgIGlmKHAtPnByZXYpIHAtPnByZXYtPm5leHQ9bmV3OwoJICAgICAgbmV3LT5wcmV2PXAtPnByZXY7CgkgICAgICBpZihwLT5uZXh0KSBwLT5uZXh0LT5wcmV2PW5ldzsKCSAgICAgIG5ldy0+bmV4dD1wLT5uZXh0OwoJICAgICAgaWYocD09bGFzdF9pYykgbGFzdF9pYz1uZXc7CgkgICAgICBpZihwPT1maXJzdF9pYykgZmlyc3RfaWM9bmV3OwogICAgICAgICAgICAgIGlmKG5ldy0+cTEuZmxhZ3MmJiEocC0+ZmxhZ3MmT1JERVJFRF9QVVNIX0NPUFkpKXsKICAgICAgICAgICAgICAgIG5ldy0+Y29kZT1BU1NJR047CiAgICAgICAgICAgICAgICBuZXctPnouZmxhZ3M9VkFSOwogICAgICAgICAgICAgICAgbmV3LT56LnZhbC52bWF4PWwyem0oMEwpOwoJCS8qIHR5cCBhbGxvY2F0ZWQgaW4gcHVzaF9hcmdzIGFuZCBub3QgdXNlZCB0aGVyZSAqLwoJCS8qCQlpZighcC0+aXR5cCkgaWVycm9yKDApOyovCgkJbmV3LT56LnY9YWRkX3RtcF92YXIoY2xvbmVfdHlwKHAtPml0eXApKTsgLypGSVhNRT8/Ki8KICAgICAgICAgICAgICAgIHAtPnExPW5ldy0+ejsKCQkvKgkJcC0+aXR5cD0wOyovCiAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICByZW1vdmVfSUMobmV3KTsKICAgICAgICAgICAgICB9CgkgICAgICBwLT5uZXh0PXAtPnByZXY9MDsKCSAgICAgIHAtPmZsYWdzfD1PUkRFUkVEX1BVU0hfQ09QWTsKICAgICAgICAgICAgICBhZGRfSUMocCk7CiAgICAgICAgICAgICAgaWYoIW0mJiFub2NvZGUpIG09cDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihwPT1scCkgYnJlYWs7CiAgICAgICAgICAgIHA9bnA7CiAgICAgICAgICB9CiAgICAgICAgICBpZighbSkgaWVycm9yKDApOwogICAgICAgICAgZmlyc3RfcHVzaGVkPW07CiAgICAgICAgfWVsc2UKICAgICAgICAgIGZpcnN0X3B1c2hlZD1tZXJrX2ZwOwojZW5kaWYKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZihwLT5mbGFncz49UFJFSU5DJiZwLT5mbGFnczw9UE9TVERFQyl7CiAgICAgICAgb2JqIG87CiNpZiBIQVZFX0xJQkNBTExTCgljaGFyICpsaWJuYW1lOwoJbm9kZSB0bj17QUREfSxvbmU9e0NFWFBSfTsKI2VuZGlmCiAgICAgICAgZ2VuX0lDKHAtPmxlZnQsMCwwKTsKICAgICAgICBpZigocC0+ZmxhZ3M9PVBPU1RJTkN8fHAtPmZsYWdzPT1QT1NUREVDKSl7CgkgIC8qbmV3PW5ld19JQygpOyovCiAgICAgICAgICAgIG5ldy0+Y29kZT1BU1NJR047CiAgICAgICAgICAgIG5ldy0+dHlwZj1wLT5udHlwLT5mbGFnczsKICAgICAgICAgICAgbmV3LT5xMi52YWwudm1heD1zaXpldGFiW3AtPm50eXAtPmZsYWdzJk5RXTsKICAgICAgICAgICAgbmV3LT5xMT1wLT5sZWZ0LT5vOwoJICAgIHBvc3RvcF9vYmo9Jm5ldy0+cTE7CgkgICAgcG9zdG9wX3R5cGU9bmV3LT50eXBmOwogICAgICAgICAgICBuZXctPnExLmZsYWdzJj1+U0NSQVRDSDsKICAgICAgICAgICAgZ2V0X3NjcmF0Y2goJm5ldy0+eixwLT5sZWZ0LT5udHlwLT5mbGFncywwLHAtPmxlZnQtPm50eXApOwogICAgICAgICAgICBuZXctPnEyLmZsYWdzPTA7CiAgICAgICAgICAgIG89bmV3LT56OwogICAgICAgICAgICBhZGRfSUMobmV3KTsKICAgICAgICAgICAgbmV3PW5ld19JQygpOwogICAgICAgIH1lbHNlCgkgIG89cC0+bGVmdC0+bzsKI2lmIEhBVkVfTElCQ0FMTFMKCWlmKHAtPmZsYWdzPT1QUkVERUN8fHAtPmZsYWdzPT1QT1NUREVDKQoJICB0bi5mbGFncz1TVUI7Cgl0bi5sZWZ0PXAtPmxlZnQ7Cgl0bi5yaWdodD0mb25lOwoJdG4ubnR5cD1wLT5udHlwOwoJb25lLmZsYWdzPUNFWFBSOwoJb25lLm50eXA9cC0+bnR5cDsKCWd2YWwudm1heD1sMnptKDFMKTsKCWV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKCWluc2VydF9jb25zdCgmb25lLnZhbCxwLT5udHlwLT5mbGFncyZOVSk7CglpZihsaWJuYW1lPXVzZV9saWJjYWxsX3dyYXAodG4uZmxhZ3MsdG4ubnR5cC0+ZmxhZ3MsMCkpewoJICBucCBsYzsKCSAgbGM9Z2VuX2xpYmNhbGwobGlibmFtZSxwLT5sZWZ0LDAsJm9uZSwwKTsKCSAgbmV3PW5ld19JQygpOwoJICBuZXctPmNvZGU9QVNTSUdOOwoJICBuZXctPnR5cGY9cC0+bnR5cC0+ZmxhZ3M7CgkgIG5ldy0+cTIudmFsLnZtYXg9c2l6ZXRhYltwLT5udHlwLT5mbGFncyZOUV07CgkgIG5ldy0+cTE9bGMtPm87CgkgIG5ldy0+cTEuZmxhZ3MmPX5TQ1JBVENIOwoJICBuZXctPno9cC0+bGVmdC0+bzsKCSAgYWRkX0lDKG5ldyk7CgkgIG5ldz1uZXdfSUMoKTsKCSAgZnJlZShsYyk7Cgl9ZWxzZQojZW5kaWYKICAgICAgICBpZihJU1BPSU5URVIocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXsKICAgICAgICAgICAgaWYocC0+ZmxhZ3M9PVBSRUlOQ3x8cC0+ZmxhZ3M9PVBPU1RJTkMpCgkgICAgICBuZXctPmNvZGU9QURESTJQOyAKCSAgICBlbHNlCgkgICAgICBuZXctPmNvZGU9U1VCSUZQOwogICAgICAgICAgICB2bWF4PXN6b2YocC0+bGVmdC0+bnR5cC0+bmV4dCk7CiAgICAgICAgICAgIG5ldy0+cTIudmFsLnZpbnQ9em0yemkodm1heCk7CiAgICAgICAgICAgIG5ldy0+dHlwZj1JTlQ7CgkgICAgbmV3LT50eXBmMj1wLT5sZWZ0LT5udHlwLT5mbGFnczsKICAgICAgICAgICAgbmV3LT5xMT1wLT5sZWZ0LT5vOwogICAgICAgICAgICBuZXctPno9cC0+bGVmdC0+bzsKICAgICAgICAgICAgbmV3LT5xMi5mbGFncz1LT05TVDsKICAgICAgICAgICAgYWRkX0lDKG5ldyk7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGlmKHAtPmZsYWdzPT1QUkVJTkN8fHAtPmZsYWdzPT1QT1NUSU5DKQoJICAgICAgbmV3LT5jb2RlPUFERDsKCSAgICBlbHNlIAoJICAgICAgbmV3LT5jb2RlPVNVQjsKICAgICAgICAgICAgbmV3LT50eXBmPXAtPm50eXAtPmZsYWdzOwogICAgICAgICAgICBuZXctPnExPXAtPmxlZnQtPm87CiAgICAgICAgICAgIG5ldy0+ej1wLT5sZWZ0LT5vOwogICAgICAgICAgICBuZXctPnEyLmZsYWdzPUtPTlNUOwoJICAgIGd2YWwudmludD16bTJ6aShsMnptKDFMKSk7CgkgICAgZXZhbF9jb25zdCgmZ3ZhbCxJTlQpOwoJICAgIGluc2VydF9jb25zdCgmbmV3LT5xMi52YWwsbmV3LT50eXBmKTsKICAgICAgICAgICAgYWRkX0lDKG5ldyk7CiAgICAgICAgfQogICAgICAgIGlmKHAtPmxlZnQtPmZsYWdzPT1CSVRGSUVMRCl7CiAgICAgICAgICBpbnNlcnRfYml0ZmllbGQoJnAtPmxlZnQtPmxlZnQtPm8sJm5ldy0+eiwmcC0+byxwLT5sZWZ0LT5iZnMscC0+bGVmdC0+YmZvLHAtPm50eXAtPmZsYWdzLDApOwogICAgICAgICAgaWYocC0+ZmxhZ3MhPVBPU1RJTkMmJnAtPmZsYWdzIT1QT1NUREVDKXsKICAgICAgICAgICAgbz1wLT5vOwogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGlmKChwLT5vLmZsYWdzJihSRUd8U0NSQVRDSCkpPT0oUkVHfFNDUkFUQ0gpKQogICAgICAgICAgICAgIGZyZWVfcmVnKHAtPm8ucmVnKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYocC0+ZmxhZ3M9PVBPU1RJTkN8fHAtPmZsYWdzPT1QT1NUREVDfHxwLT5sZWZ0LT5mbGFncz09QklURklFTEQpewogICAgICAgICAgaWYoKHAtPmxlZnQtPm8uZmxhZ3MmKFNDUkFUQ0h8UkVHKSk9PShTQ1JBVENIfFJFRykpIAogICAgICAgICAgICBmcmVlX3JlZyhwLT5sZWZ0LT5vLnJlZyk7CiAgICAgICAgfQoKCXBvc3RvcF9vYmo9MDsKICAgICAgICBwLT5vPW87CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYocC0+ZmxhZ3M9PUNPTkQpewogICAgICAgIGludCBsdHJ1ZSxsZmFsc2UsbG91dDsKICAgICAgICBsdHJ1ZT0rK2xhYmVsO2xmYWxzZT0rK2xhYmVsO2xvdXQ9KytsYWJlbDsKICAgICAgICBnZW5fSUMocC0+bGVmdCxsdHJ1ZSxsZmFsc2UpOwogICAgICAgIGlmKCFwLT5sZWZ0LT5vLmZsYWdzKXsKICAgICAgICAgICAgZnJlZShuZXcpOwogICAgICAgIH1lbHNlewogICAgICAgICAgICBpZihwLT5sZWZ0LT5mbGFncyE9Q0VYUFIpewogICAgICAgICAgICAgICAgZ2VuX3Rlc3QoJnAtPmxlZnQtPm8scC0+bGVmdC0+bnR5cC0+ZmxhZ3MsQkVRLGxmYWxzZSk7CiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgZXZhbF9jb25zdG4ocC0+bGVmdCk7CiAgICAgICAgICAgICAgICBpZih6bWVxdG8odm1heCxsMnptKDBMKSkmJnp1bWVxdG8odnVtYXgsdWwyenVtKDBVTCkpJiZ6bGRlcXRvKHZsZG91YmxlLGQyemxkKDAuMCkpKXsKICAgICAgICAgICAgICAgICAgICBnZW5fSUMocC0+cmlnaHQtPnJpZ2h0LDAsMCk7CiAgICAgICAgICAgICAgICAgICAgcC0+bz1wLT5yaWdodC0+cmlnaHQtPm87CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICBnZW5fSUMocC0+cmlnaHQtPmxlZnQsMCwwKTsKICAgICAgICAgICAgICAgICAgICBwLT5vPXAtPnJpZ2h0LT5sZWZ0LT5vOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGdlbl9sYWJlbChsdHJ1ZSk7CiAgICAgICAgZ2VuX0lDKHAtPnJpZ2h0LT5sZWZ0LDAsMCk7CiAgICAgICAgaWYoKHAtPm50eXAtPmZsYWdzJk5RKSE9Vk9JRCl7CiAgICAgICAgICAgIGNvbnZlcnQocC0+cmlnaHQtPmxlZnQscC0+bnR5cC0+ZmxhZ3MpOwogICAgICAgICAgICBpZigocC0+cmlnaHQtPmxlZnQtPm8uZmxhZ3MmKFNDUkFUQ0h8RFJFRk9CSikpPT1TQ1JBVENIKXsKICAgICAgICAgICAgICAgIHAtPm89cC0+cmlnaHQtPmxlZnQtPm87CiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgZ2V0X3NjcmF0Y2goJnAtPm8scC0+bnR5cC0+ZmxhZ3MsMCxwLT5udHlwKTsKICAgICAgICAgICAgICAgIG5ldz1uZXdfSUMoKTsKICAgICAgICAgICAgICAgIG5ldy0+Y29kZT1BU1NJR047CiAgICAgICAgICAgICAgICBuZXctPnExPXAtPnJpZ2h0LT5sZWZ0LT5vOwogICAgICAgICAgICAgICAgbmV3LT56PXAtPm87CiAgICAgICAgICAgICAgICBuZXctPnEyLmZsYWdzPTA7CiAgICAgICAgICAgICAgICBuZXctPnEyLnZhbC52bWF4PXN6b2YocC0+bnR5cCk7CiAgICAgICAgICAgICAgICBuZXctPnR5cGY9cC0+bnR5cC0+ZmxhZ3M7CiAgICAgICAgICAgICAgICBwLT5vPW5ldy0+ejsKICAgICAgICAgICAgICAgIGFkZF9JQyhuZXcpOwogICAgICAgICAgICB9CiAgICAgICAgfWVsc2UKCSAgcC0+by5mbGFncz0wOwogICAgICAgIG5ldz1uZXdfSUMoKTsKICAgICAgICBuZXctPmNvZGU9QlJBOwogICAgICAgIG5ldy0+dHlwZj1sb3V0OwogICAgICAgIGFkZF9JQyhuZXcpOwogICAgICAgIGdlbl9sYWJlbChsZmFsc2UpOwogICAgICAgIGdlbl9JQyhwLT5yaWdodC0+cmlnaHQsMCwwKTsKICAgICAgICBpZigocC0+bnR5cC0+ZmxhZ3MmTlEpIT1WT0lEKXsKICAgICAgICAgICAgY29udmVydChwLT5yaWdodC0+cmlnaHQscC0+bnR5cC0+ZmxhZ3MpOwogICAgICAgICAgICBuZXc9bmV3X0lDKCk7CiAgICAgICAgICAgIG5ldy0+Y29kZT1BU1NJR047CiAgICAgICAgICAgIG5ldy0+cTE9cC0+cmlnaHQtPnJpZ2h0LT5vOwogICAgICAgICAgICBuZXctPno9cC0+bzsKICAgICAgICAgICAgbmV3LT5xMi5mbGFncz0wOwogICAgICAgICAgICBuZXctPnEyLnZhbC52bWF4PXN6b2YocC0+bnR5cCk7CiAgICAgICAgICAgIG5ldy0+dHlwZj1wLT5udHlwLT5mbGFnczsKICAgICAgICAgICAgYWRkX0lDKG5ldyk7CiAgICAgICAgfQogICAgICAgIGdlbl9sYWJlbChsb3V0KTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZihwLT5mbGFncz09QklURklFTEQpewogICAgICBpbnQgbHNjLHJzYyxiZm87CiAgICAgIG9iaiB0bXA7CiAgICAgIGJmbz1iZmxheW91dChwLT5iZm8scC0+YmZzLHAtPm50eXAtPmZsYWdzKTsKICAgICAgbHNjPXptMmwoem1tdWx0KHNpemV0YWJbcC0+bnR5cC0+ZmxhZ3MmTlFdLGNoYXJfYml0KSktcC0+YmZzLWJmbzsKICAgICAgcnNjPWxzYytiZm87CiAgICAgIGdlbl9JQyhwLT5sZWZ0LDAsMCk7CiAgICAgIG5ldy0+Y29kZT1MU0hJRlQ7CiAgICAgIG5ldy0+dHlwZj1wLT5udHlwLT5mbGFnczsKICAgICAgbmV3LT50eXBmMj1JTlQ7CiAgICAgIG5ldy0+cTE9cC0+bGVmdC0+bzsKICAgICAgbmV3LT5xMi5mbGFncz1LT05TVDsKICAgICAgbmV3LT5xMi52YWwudmludD16bTJ6aShsMnptKChsb25nKWxzYykpOwogICAgICBnZXRfc2NyYXRjaCgmbmV3LT56LG5ldy0+dHlwZiwwLDApOwogICAgICB0bXA9bmV3LT56OwogICAgICBhZGRfSUMobmV3KTsKICAgICAgbmV3PW5ld19JQygpOwogICAgICBuZXctPmNvZGU9UlNISUZUOwogICAgICBuZXctPnR5cGY9cC0+bnR5cC0+ZmxhZ3M7CiAgICAgIG5ldy0+dHlwZjI9SU5UOwogICAgICBuZXctPnExPXRtcDsKICAgICAgbmV3LT5xMi5mbGFncz1LT05TVDsKICAgICAgbmV3LT5xMi52YWwudmludD16bTJ6aShsMnptKChsb25nKXJzYykpOwogICAgICBuZXctPno9dG1wOwogICAgICBwLT5vPW5ldy0+ejsKICAgICAgYWRkX0lDKG5ldyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHByaW50ZigiT3BlcmF0aW9uOiAlZD0lc1xuIixwLT5mbGFncyxlbmFtZVtwLT5mbGFnc10pOwogICAgaWVycm9yKDApOwogICAgZnJlZShuZXcpOwogICAgcC0+by5mbGFncz0wOwp9CgpzdGF0aWMgdm9pZCBoYW5kbGVfcmVnbGlzdChyZWdhcmdzX2xpc3QgKm5ybCxvYmogKnJhZHIpCnsKICBJQyAqbmV3OwogIC8qICBMZXR6dGVzIEFyZ3VtZW50OyBqZXR6dCBpbiBSZWdpc3RlciBsYWRlbi4gICovCiNpZmRlZiBIQVZFX1JFR1BBUk1TCiAgaW50IGRpZHJhZHI9MDsKI2VuZGlmCiAgd2hpbGUobnJsKXsKICAgIG5ldz1uZXdfSUMoKTsKICAgIG5ldy0+Y29kZT1BU1NJR047CiAgICBuZXctPnR5cGY9bnJsLT52LT52dHlwLT5mbGFncy8qfFZPTEFUSUxFKi87CiAgICBuZXctPnExLmZsYWdzPVZBUjsKICAgIG5ldy0+cTEudj1ucmwtPnY7CiAgICBuZXctPnExLnZhbC52bWF4PWwyem0oMEwpOwogICAgbmV3LT5xMi5mbGFncz0wOwogICAgbmV3LT5xMi52YWwudm1heD1zem9mKG5ybC0+di0+dnR5cCk7CiAgICBuZXctPnouZmxhZ3M9VkFSOwogICAgbmV3LT56LnZhbC52bWF4PWwyem0oMEwpOwogICAgbmV3LT56LnY9YWRkX3ZhcihlbXB0eSxjbG9uZV90eXAobnJsLT52LT52dHlwKSxBVVRPLDApOwogICAgbmV3LT56LnYtPnJlZz1ucmwtPnJlZzsKICAgIG5ldy0+ei52LT52dHlwLT5mbGFnc3w9Vk9MQVRJTEU7CiAgICBucmwtPnY9bmV3LT56LnY7CiAgICBhZGRfSUMobmV3KTsKICAgIAojaWZkZWYgSEFWRV9SRUdQQVJNUwogICAgaWYocmFkciYmIWRpZHJhZHIpewogICAgICBkaWRyYWRyPTE7CiAgICB9ZWxzZXsKI2VuZGlmCiAgICAgIG5ybC0+YWwtPnB1c2hpYz1uZXc7CiAgICAgIGZpeF9wdXNoaWMoJm5ybC0+YWwtPnB1c2hpYyxuZXcpOwojaWZkZWYgSEFWRV9SRUdQQVJNUwogICAgfQojZW5kaWYKICAgIG5ybD1ucmwtPm5leHQ7CiAgfQp9CgojaWZkZWYgSEFWRV9SRUdQQVJNUwp6bWF4IHB1c2hfYXJncyhhcmd1bWVudF9saXN0ICphbCxzdHJ1Y3RfZGVjbGFyYXRpb24gKnNkLGludCBuLHJlZ2FyZ3NfbGlzdCAqKnJsLHRyZWdfaGFuZGxlICpyZWdfaGFuZGxlLG9iaiAqcmFkcix0eXBlICpydHlwZSxpbnQgcnJlZyx0eXBlICpma3QpCiNlbHNlCnptYXggcHVzaF9hcmdzKGFyZ3VtZW50X2xpc3QgKmFsLHN0cnVjdF9kZWNsYXJhdGlvbiAqc2QsaW50IG4scmVnYXJnc19saXN0ICoqcmwpCiNlbmRpZgovKiAgTGVndCBkaWUgQXJndW1lbnRlIGVpbmVzIEZ1bmt0aW9uc2F1ZnJ1ZnMgaW4gdW1nZWtlaHJ0ZXIgUmVpaGVuZm9sZ2UgICAgKi8KLyogIGF1ZiBkZW4gU3RhY2suIEVzIHdpcmQgSW50ZWdlci1FcndlaXRlcnVuZyB2b3JnZW5vbW1lbiB1bmQgZmxvYXQgd2lyZCAgICovCi8qICBuYWNoIGRvdWJsZSBrb252ZXJ0aWVydCwgZmFsbHMga2VpbiBQcm90b3R5cGUgZGEgaXN0LiAgICAgICAgICAgICAgICAgICAqLwp7CiAgICBpbnQgdCxyZWcscmVncHVzaCxldmFsdWF0ZWQ9MDt0eXBlICpmdDsKICAgIElDICpuZXc7cmVnYXJnc19saXN0ICpucmw7em1heCBzeixyc3osb2Y7b2JqICphcmc7CiNpZmRlZiBIQVZFX1JFR1BBUk1TCiAgICBpbnQgc3RkcmVnOwogICAgaWYoIWFsJiYhcmFkcikgcmV0dXJuKDApOwogICAgaWYocmFkcil7CiAgICAgIHN0ZHJlZz1ycmVnOwogICAgfWVsc2V7CiAgICAgIGlmKG48c2QtPmNvdW50KXsKICAgICAgICBzdGRyZWc9cmVnX3Bhcm0ocmVnX2hhbmRsZSwoKnNkLT5zbClbbl0uc3R5cCwwLGZrdC0+bmV4dCk7CiAgICAgIH1lbHNlewogICAgICAgIGlmKHNkLT5jb3VudCkKICAgICAgICAgIHN0ZHJlZz1yZWdfcGFybShyZWdfaGFuZGxlLGFsLT5hcmctPm50eXAsMSxma3QtPm5leHQpOwogICAgICAgIGVsc2V7CgkgIGlmKHNob3J0X3B1c2gmJklTSU5UKGFsLT5hcmctPm50eXAtPmZsYWdzKSl7CgkgICAgc3RhdGljIHR5cGUgdDsKCSAgICB0LmZsYWdzPWludF9lcncoYWwtPmFyZy0+bnR5cC0+ZmxhZ3MpOwoJICAgIHN0ZHJlZz1yZWdfcGFybShyZWdfaGFuZGxlLCZ0LDAsZmt0LT5uZXh0KTsKCSAgfWVsc2V7CgkgICAgc3RkcmVnPXJlZ19wYXJtKHJlZ19oYW5kbGUsYWwtPmFyZy0+bnR5cCwwLGZrdC0+bmV4dCk7CgkgIH0KCX0KICAgICAgfQogICAgfQogICAgcmVnPXN0ZHJlZzsKI2Vsc2UKICAgIGlmKCFhbCkgcmV0dXJuKDApOwogICAgcmVnPTA7CiNlbmRpZgojaWZkZWYgSEFWRV9SRUdQQVJNUwogICAgaWYoIXJhZHIpewojZW5kaWYKICAgICAgaWYoIWFsLT5hcmcpIGllcnJvcigwKTsKICAgICAgaWYoIXNkKSBpZXJyb3IoMCk7CiAgICAgIGlmKG48c2QtPmNvdW50KXsKICAgICAgICBmdD1jbG9uZV90eXAoKCpzZC0+c2wpW25dLnN0eXApO3N6PXN6b2YoZnQpOwoJdD1mdC0+ZmxhZ3M7CiAgICAgICAgcmVnPSgqc2QtPnNsKVtuXS5yZWc7CiAgICAgIH1lbHNlewogICAgICAgIGZ0PWNsb25lX3R5cChhbC0+YXJnLT5udHlwKTtzej1zem9mKGZ0KTsKCXQ9ZnQtPmZsYWdzOwogICAgICB9CiAgICAgIGlmKElTSU5UKHQpKXsKCWlmKG4+PXNkLT5jb3VudHx8IXNob3J0X3B1c2gpCgkgIHQ9aW50X2Vydyh0KTsKCWZ0LT5mbGFncz10OwoJc3o9c2l6ZXRhYlt0Jk5RXTsKICAgICAgfQogICAgICBpZigodCZOUSk9PUZMT0FUJiZuPj1zZC0+Y291bnQpIHt0PURPVUJMRTtmdC0+ZmxhZ3M9dDtzej1zaXpldGFiW3QmTlFdO30KI2lmZGVmIEhBVkVfUkVHUEFSTVMKICAgIH1lbHNlewogICAgICBmdD1uZXdfdHlwKCk7CiAgICAgIGZ0LT5mbGFncz10PVBPSU5URVJfVFlQRShydHlwZSk7CiAgICAgIGZ0LT5uZXh0PWNsb25lX3R5cChydHlwZSk7CiAgICAgIHN6PXNpemV0YWJbdCZOUV07CiAgICB9CiNlbmRpZgogICAgaWYocmVnPDApIHtyZWc9LXJlZztyZWdwdXNoPTE7fSBlbHNlIHJlZ3B1c2g9MDsKICAgIHJzej1zejsKICAgIHN6PXptbXVsdCh6bWRpdih6bWFkZChzeix6bXN1YihzdGFja2FsaWduLGwyem0oMUwpKSksc3RhY2thbGlnbiksc3RhY2thbGlnbik7CiNpZmRlZiBPUkRFUkVEX1BVU0gKICAgIGlmKHJlZz09MHx8cmVncHVzaCl7CiAgICAgIG5ldz1uZXdfSUMoKTsKI2lmZGVmIEhBVkVfUkVHUEFSTVMKICAgICAgaWYoIXJhZHImJiFldmFsdWF0ZWQpewojZW5kaWYKICAgICAgICBnZW5fSUMoYWwtPmFyZywwLDApOwogICAgICAgIGNvbnZlcnQoYWwtPmFyZyx0KTsKICAgICAgICBldmFsdWF0ZWQ9MTsKICAgICAgICBuZXctPnExPWFsLT5hcmctPm87CglhbC0+cHVzaGljPW5ldzsKI2lmZGVmIEhBVkVfUkVHUEFSTVMKICAgICAgfWVsc2UKICAgICAgICBuZXctPnExPSpyYWRyOwojZW5kaWYKICAgICAgLyogIFBhcmFtZXRlcnVlYmVyZ2FiZSB1ZWJlciBTdGFjay4gKi8KICAgICAgbmV3LT5jb2RlPVBVU0g7CiAgICAgIG5ldy0+dHlwZj10OwogICAgICBuZXctPml0eXA9ZnQ7CiAgICAgIG5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CiAgICAgIG5ldy0+cTIudmFsLnZtYXg9c3o7CiAgICAgIG5ldy0+ei52YWwudm1heD1yc3o7CiAgICAgIGlmKHJlZ3B1c2gpewogICAgICAgIGlmKGNfZmxhZ3NbMjZdJlVTRURGTEFHKXsKICAgICAgICAgIG5ldy0+cTEuYW09bmV3LT5xMi5hbT1uZXctPnouYW09MDsKICAgICAgICAgIG5ldy0+bGluZT1saW5lOyBuZXctPmZpbGU9ZmlsZW5hbWU7CiAgICAgICAgICBpbnNlcnRfSUMobGFzdF9pYyxuZXcpOwogICAgICAgIH1lbHNlewogICAgICAgICAgbmV3LT5xMS5mbGFncz0wOwogICAgICAgICAgYWRkX0lDKG5ldyk7CgkgIGlmKGFsKSBmaXhfcHVzaGljKCZhbC0+cHVzaGljLG5ldyk7CiAgICAgICAgfQogICAgICB9ZWxzZXsKICAgICAgICBhZGRfSUMobmV3KTsKCWlmKGFsKSBmaXhfcHVzaGljKCZhbC0+cHVzaGljLG5ldyk7CiAgICAgIH0KICAgICAgb3B1c2hlZCsrOwogICAgICBpZighZmlyc3RfcHVzaGVkJiYhbm9jb2RlKSBmaXJzdF9wdXNoZWQ9bmV3OwogICAgICBpZihhbCYmIWFsLT5uZXh0JiYhcmVncHVzaCkgcmV0dXJuIHN6OwogICAgfQojZW5kaWYKI2lmZGVmIEhBVkVfUkVHUEFSTVMKICAgIGlmKHJhZHIpewogICAgICBpZihhbCkgb2Y9cHVzaF9hcmdzKGFsLHNkLDAscmwscmVnX2hhbmRsZSwwLDAsMCxma3QpOyBlbHNlIG9mPWwyem0oMEwpOwogICAgfWVsc2V7CiAgICAgIGlmKGFsLT5uZXh0KSBvZj1wdXNoX2FyZ3MoYWwtPm5leHQsc2QsbisxLHJsLHJlZ19oYW5kbGUsMCwwLDAsZmt0KTsgZWxzZSBvZj1sMnptKDBMKTsKICAgIH0KI2Vsc2UKICAgIGlmKGFsLT5uZXh0KSBvZj1wdXNoX2FyZ3MoYWwtPm5leHQsc2QsbisxLHJsKTsgZWxzZSBvZj1sMnptKDBMKTsKI2VuZGlmCiNpZmRlZiBPUkRFUkVEX1BVU0gKICAgIGlmKHJlZz09MCkgcmV0dXJuIHptYWRkKG9mLHN6KTsKI2VuZGlmCgogICAgaWYocmVncHVzaCkgb2Y9em1hZGQob2Ysc3opOwoKI2lmZGVmIEhBVkVfUkVHUEFSTVMKICAgIGlmKHJhZHIpewogICAgICBhcmc9cmFkcjsKICAgIH1lbHNlewogICAgICBpZighZXZhbHVhdGVkKXsKICAgICAgICBnZW5fSUMoYWwtPmFyZywwLDApOwogICAgICAgIGNvbnZlcnQoYWwtPmFyZyx0KTsKICAgICAgICBldmFsdWF0ZWQ9MTsKICAgICAgfQogICAgICBhcmc9JmFsLT5hcmctPm87CiAgICB9CiNlbHNlCiAgICBpZighZXZhbHVhdGVkKXsKICAgICAgZ2VuX0lDKGFsLT5hcmcsMCwwKTsKICAgICAgY29udmVydChhbC0+YXJnLHQpOwogICAgICBldmFsdWF0ZWQ9MTsKICAgIH0KICAgIGFyZz0mYWwtPmFyZy0+bzsKI2VuZGlmCiNpZm5kZWYgT1JERVJFRF9QVVNICiAgICBpZihyZWc9PTB8fHJlZ3B1c2gpewogICAgICAgIC8qICBQYXJhbWV0ZXJ1ZWJlcmdhYmUgdWViZXIgU3RhY2suICovCiAgICAgICAgbmV3PW5ld19JQygpOwogICAgICAgIG5ldy0+Y29kZT1QVVNIOwogICAgICAgIG5ldy0+dHlwZj10OwogICAgICAgIG5ldy0+cTE9KmFyZzsKICAgICAgICBpZihyZWdwdXNoJiYhKGNfZmxhZ3NbMjZdJlVTRURGTEFHKSkgbmV3LT5xMS5mbGFncz0wOwogICAgICAgIG5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CiAgICAgICAgbmV3LT5xMi52YWwudm1heD1zejsKCW5ldy0+ei52YWwudm1heD1yc3o7CiAgICAgICAgYWRkX0lDKG5ldyk7CglhbC0+cHVzaGljPW5ldzsKCWZpeF9wdXNoaWMoJmFsLT5wdXNoaWMsbmV3KTsKICAgICAgICBpZighcmVncHVzaCkgcmV0dXJuKHptYWRkKG9mLHN6KSk7CiAgICB9CiNlbmRpZgogICAgaWYocmVnKXsKICAgICAgICAvKiAgUGFyYW1ldGVydWViZXJnYWJlIGluIFJlZ2lzdGVyLiAqLwogICAgICAgIFZhciAqdj0wOyB0eXBlICp0MjsKCWludCByc2F2ZWQ9MDsKICAgICAgICBpZihvcHRmbGFncyYyKXsKICAgICAgICAvKiAgVmVyc2lvbiBmdWVyIE9wdGltaXplci4gKi8KICAgICAgICAgICAgdDI9bmV3X3R5cCgpOwogICAgICAgICAgICB0Mi0+ZmxhZ3M9dDsKICAgICAgICAgICAgaWYoSVNQT0lOVEVSKHQpKXsKICAgICAgICAgICAgICAgIHQyLT5uZXh0PW5ld190eXAoKTsKICAgICAgICAgICAgICAgIHQyLT5uZXh0LT5mbGFncz1WT0lEOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHY9YWRkX3ZhcihlbXB0eSx0MixBVVRPLDApOwogICAgICAgICAgICBuZXc9bmV3X0lDKCk7CiAgICAgICAgICAgIG5ldy0+Y29kZT1BU1NJR047CiAgICAgICAgICAgIG5ldy0+dHlwZj10OwogICAgICAgICAgICBuZXctPnExPSphcmc7CiAgICAgICAgICAgIG5ldy0+cTIuZmxhZ3M9MDsKICAgICAgICAgICAgbmV3LT5xMi52YWwudm1heD1zaXpldGFiW3QmTlFdOwogICAgICAgICAgICBuZXctPnouZmxhZ3M9VkFSOwogICAgICAgICAgICBuZXctPnoudj12OwogICAgICAgICAgICBuZXctPnoudmFsLnZtYXg9bDJ6bSgwTCk7CiAgICAgICAgICAgIGFkZF9JQyhuZXcpOwogICAgICAgICAgICBucmw9bXltYWxsb2Moc2l6ZW9mKCpucmwpKTsKICAgICAgICAgICAgbnJsLT5uZXh0PSpybDsKICAgICAgICAgICAgbnJsLT5yZWc9cmVnOwogICAgICAgICAgICBucmwtPnY9djsKCSAgICBucmwtPmFsPWFsOwogICAgICAgICAgICAqcmw9bnJsOwogICAgICAgICAgICByZXR1cm4gb2Y7CiAgICAgICAgfWVsc2V7CiAgICAgICAgLyogIE5pY2h0LW9wdGltaWVyZW5kZSBWZXJzaW9uLiAqLwoKCSAgaWYoREVCVUcmMTYpewoJICAgIHByaW50ZigicmVnWyVzXT0lZCAiLHJlZ25hbWVzW3JlZ10scmVnc1tyZWddKTsKCSAgICBpZihyZWdfcGFpcihyZWcsJnJwKSkKCSAgICAgIHByaW50ZigicmVnWyVzXT0lZCByZWdbJXNdPSVkICIscmVnbmFtZXNbcnAucjFdLHJlZ3NbcnAucjFdLHJlZ25hbWVzW3JwLnIyXSxyZWdzW3JwLnIyXSk7CgkgICAgcHJpbnRmKCJcbiIpOwoJICB9CgkgIGlmKHJlZ19wYWlyKHJlZywmcnApJiYoYXJnLT5mbGFncyYoUkVHfFNDUkFUQ0gpKT09KFJFR3xTQ1JBVENIKSYmKGFyZy0+cmVnPT1ycC5yMXx8YXJnLT5yZWc9PXJwLnIyKSl7CgkgICAgLyogcngtPnJlZ19wYWlyKHJ4LHJ5KTogbWFrZSBhIGNvcHkgKi8KCSAgICBuZXc9bmV3X0lDKCk7CgkgICAgbmV3LT5jb2RlPUFTU0lHTjsKCSAgICBuZXctPnR5cGY9dDsKCSAgICBuZXctPnExPSphcmc7CgkgICAgbmV3LT5xMi5mbGFncz0wOwoJICAgIG5ldy0+cTIudmFsLnZtYXg9c2l6ZXRhYlt0Jk5RXTsKCSAgICBzY3JhdGNoX3ZhcigmbmV3LT56LHQsMCk7CgkgICAgYWRkX0lDKG5ldyk7CgkgICAgKmFyZz1uZXctPno7CgkgICAgZnJlZV9yZWcoYXJnLT5yZWcpOwoJICB9CgkgIGlmKCFyZWdzW3JlZ10mJighcmVnX3BhaXIocmVnLCZycCl8fCghcmVnc1tycC5yMV0mJiFyZWdzW3JwLnIyXSkpJiYhbm9jb2RlKXsKCSAgICBuZXc9bmV3X0lDKCk7CgkgICAgbmV3LT5jb2RlPUFMTE9DUkVHOwoJICAgIG5ldy0+dHlwZj0wOwoJICAgIG5ldy0+cTEuZmxhZ3M9UkVHOwoJICAgIG5ldy0+cTEucmVnPXJlZzsKCSAgICBuZXctPnEyLmZsYWdzPW5ldy0+ei5mbGFncz0wOwoJICAgIGFkZF9JQyhuZXcpOwoJICAgIHJlZ3NbcmVnXT0oMXxSTk9TQVZFKTtyZWd1c2VkW3JlZ10rKzsKCSAgICBpZihERUJVRyYxNikgcHJpbnRmKCJhbGxvY2F0ZWQgJXMgKDEpXG4iLHJlZ25hbWVzW3JlZ10pOwoJICAgIGlmKHJlZ19wYWlyKHJlZywmcnApKXsKCSAgICAgIHJlZ3NbcnAucjFdPTF8Uk5PU0FWRTtyZWd1c2VkW3JwLnIxXSsrOwoJICAgICAgcmVnc1tycC5yMl09MXxSTk9TQVZFO3JlZ3VzZWRbcnAucjJdKys7CgkgICAgfQoJICB9ZWxzZSBpZighcmVnc1tyZWddJiZyZWdfcGFpcihyZWcsJnJwKSYmKHJlZ3NbcnAucjFdfHxyZWdzW3JwLnIyXSkmJiFub2NvZGUpewoJICAgIGludCByPTA7CgkgICAgcmVnYXJnc19saXN0ICpwOwoKCSAgICBuZXc9bmV3X0lDKCk7CgkgICAgbmV3LT5jb2RlPUFMTE9DUkVHOwoJICAgIG5ldy0+dHlwZj0wOwoJICAgIG5ldy0+cTEuZmxhZ3M9UkVHOwoJICAgIG5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CgkgICAgaWYocmVnc1tycC5yMV0pewoJICAgICAgbmV3LT5xMS5yZWc9cnAucjI7CgkgICAgICByPXJwLnIxOwoJICAgICAgcmVnc1tyXXw9UkhBTEY7CgkgICAgfWVsc2V7CgkgICAgICBuZXctPnExLnJlZz1ycC5yMTsKCSAgICAgIHI9cnAucjI7CgkgICAgICByZWdzW3JdfD1SSEFMRjsKCSAgICB9CgkgICAgcmVnc1tuZXctPnExLnJlZ109KDF8Uk5PU0FWRSk7cmVndXNlZFtuZXctPnExLnJlZ10rKzsKCSAgICByZWdzW3JlZ109KDF8Uk5PU0FWRSk7cmVndXNlZFtyZWddKys7CgkgICAgYWRkX0lDKG5ldyk7CgkgICAgaWYoREVCVUcmMTYpIHByaW50ZigiYWxsb2NhdGVkICVzIChoYWxmKVxuIixyZWduYW1lc1tuZXctPnExLnJlZ10pOwoJICAgIHJzYXZlZD1yOwoJICAgIC8qIFRlc3Rlbiwgb2IgUXVlbGxyZWdpc3RlciBnZXNpY2hlcnQgd3VyZGUuIFVuc2Nob2VuLiAqLwoJICAgIGZvcihwPSpybDtwO3A9cC0+bmV4dCl7CgkgICAgICBpbnQgcmk7CgkgICAgICBpZihwLT52JiYocmk9YWJzKHAtPnJlZykpKXsKCQlpZihyaT09cikgYnJlYWs7CgkJaWYocmVnX3BhaXIocmksJnJwKSYmKHJwLnIxPT1yfHxycC5yMj09cikpIGJyZWFrOwoJICAgICAgfQoJICAgIH0KCSAgICAKCSAgICBpZihyJiYhcCl7CgkgICAgICB0Mj1jbG9uZV90eXAocmVndHlwZVtyXSk7CgkgICAgICB2PWFkZF92YXIoZW1wdHksdDIsQVVUTywwKTsKCSAgICAgIHYtPmZsYWdzfD1VU0VEQVNBRFI7CgkgICAgICBuZXc9bmV3X0lDKCk7CgkgICAgICBuZXctPmNvZGU9TU9WRUZST01SRUc7CgkgICAgICBuZXctPnR5cGY9MDsKCSAgICAgIG5ldy0+cTEuZmxhZ3M9UkVHOwoJICAgICAgbmV3LT5xMS5yZWc9cjsKCSAgICAgIG5ldy0+cTIuZmxhZ3M9MDsKCSAgICAgIG5ldy0+cTIudmFsLnZtYXg9cmVnc2l6ZVtyXTsKCSAgICAgIG5ldy0+ei5mbGFncz1WQVJ8RE9OVFJFR0lTVEVSSVpFOwoJICAgICAgbmV3LT56LnY9djsKCSAgICAgIG5ldy0+ei52YWwudm1heD1sMnptKDBMKTsKCSAgICAgIGFkZF9JQyhuZXcpOwoJICAgIH0KCSAgfWVsc2V7CgkgICAgaWYoKGFyZy0+ZmxhZ3MmKFJFR3xTQ1JBVENIKSkhPShSRUd8U0NSQVRDSCl8fGFyZy0+cmVnIT1yZWcpewoJICAgICAgaW50IHI9MDsKICAgICAgICAgICAgICByZWdhcmdzX2xpc3QgKnA7CgoJICAgICAgLyogcmVnaXN0ZXIgcGFpcnMgKi8KCSAgICAgIGlmKHJlZ19wYWlyKHJlZywmcnApKXsKCQlpZihyZWdzW3JlZ118fHJlZ3NbcnAucjFdfHxyZWdzW3JwLnIyXSkgCgkJICByPXJlZzsKCSAgICAgIH1lbHNlewoJCWZvcihyPU1BWFI7cj49MTtyLS0pewoJCSAgaWYocmVnc1tyXSYmcmVnX3BhaXIociwmcnApJiYocnAucjE9PXJlZ3x8cnAucjI9PXJlZykpCgkJICAgIGJyZWFrOwoJCX0KCQlpZihyPDEpIHI9cmVnOwoJICAgICAgfQoKCiAgICAgICAgICAgICAgLyogVGVzdGVuLCBvYiBRdWVsbHJlZ2lzdGVyIGdlc2ljaGVydCB3dXJkZS4gVW5zY2hvZW4uICovCiAgICAgICAgICAgICAgZm9yKHA9KnJsO3A7cD1wLT5uZXh0KXsKICAgICAgICAgICAgICAgIGludCByaTsKICAgICAgICAgICAgICAgIGlmKHAtPnYmJihyaT1hYnMocC0+cmVnKSkpewogICAgICAgICAgICAgICAgICBpZihyaT09cnx8KHJlZ19wYWlyKHIsJnJwKSYmKHJwLnIxPT1yaXx8cnAucjI9PXJpKSkpIHticmVhazt9CiAgICAgICAgICAgICAgICAgIGlmKHJlZ19wYWlyKHJpLCZycCkmJihycC5yMT09cnx8cnAucjI9PXIpKSB7YnJlYWs7fQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYociYmIXApewogICAgICAgICAgICAgICAgdDI9Y2xvbmVfdHlwKHJlZ3R5cGVbcl0pOwogICAgICAgICAgICAgICAgdj1hZGRfdmFyKGVtcHR5LHQyLEFVVE8sMCk7CiAgICAgICAgICAgICAgICB2LT5mbGFnc3w9VVNFREFTQURSOwogICAgICAgICAgICAgICAgbmV3PW5ld19JQygpOwogICAgICAgICAgICAgICAgbmV3LT5jb2RlPU1PVkVGUk9NUkVHOwogICAgICAgICAgICAgICAgbmV3LT50eXBmPTA7CiAgICAgICAgICAgICAgICBuZXctPnExLmZsYWdzPVJFRzsKICAgICAgICAgICAgICAgIG5ldy0+cTEucmVnPXI7CiAgICAgICAgICAgICAgICBuZXctPnEyLmZsYWdzPTA7CiAgICAgICAgICAgICAgICBuZXctPnEyLnZhbC52bWF4PXJlZ3NpemVbcl07CiAgICAgICAgICAgICAgICBuZXctPnouZmxhZ3M9VkFSfERPTlRSRUdJU1RFUklaRTsKICAgICAgICAgICAgICAgIG5ldy0+ei52PXY7CiAgICAgICAgICAgICAgICBuZXctPnoudmFsLnZtYXg9bDJ6bSgwTCk7CiAgICAgICAgICAgICAgICBhZGRfSUMobmV3KTsKICAgICAgICAgICAgICB9CgkgICAgfWVsc2V7CgkgICAgICByZWdzW3JlZ118PVJOT1NBVkU7CgkgICAgfQoJICB9CgkgIG5ldz1uZXdfSUMoKTsKI2lmZGVmIEhBVkVfUkVHUEFSTVMKCSAgICBpZighcmFkcil7CgkgICAgICBhbC0+cHVzaGljPW5ldzsKCSAgICB9CiNlbHNlCgkgICAgYWwtPnB1c2hpYz1uZXc7CiNlbmRpZgoJICAgIG5ldy0+Y29kZT1BU1NJR047CgkgICAgbmV3LT50eXBmPXQ7CiAgICAgICAgICAgIG5ldy0+cTE9KmFyZzsKICAgICAgICAgICAgLyogVGVzdGVuLCBvYiBRdWVsbHJlZ2lzdGVyIGdlc2ljaGVydCB3dXJkZS4gVW5zY2hvZW4uICovCiAgICAgICAgICAgIGlmKChuZXctPnExLmZsYWdzJlJFRykpewogICAgICAgICAgICAgIHJlZ2FyZ3NfbGlzdCAqcDsKICAgICAgICAgICAgICBmb3IocD0qcmw7cDtwPXAtPm5leHQpewoJCWludCByOwogICAgICAgICAgICAgICAgaWYocC0+diYmKHI9YWJzKHAtPnJlZykpKXsKCQkgIGlmKG5ldy0+cTEucmVnPT1yfHwocmVnX3BhaXIobmV3LT5xMS5yZWcsJnJwKSYmKHJwLnIxPT1yfHxycC5yMj09cikpKSB7bmV3LT5xMS52PXAtPnY7bmV3LT5xMS52YWwudm1heD1sMnptKDBMKTticmVhazt9CgkJICAvKkZJWE1FOiBhbmRlcnNydW0gYmVpIExJVFRMRUVORElBTj8/ICovCgkJICBpZihyZWdfcGFpcihyLCZycCkmJnJwLnIxPT1uZXctPnExLnJlZykge25ldy0+cTEudj1wLT52O25ldy0+cTEudmFsLnZtYXg9bDJ6bSgwTCk7YnJlYWs7fQoJCSAgaWYocmVnX3BhaXIociwmcnApJiZycC5yMj09bmV3LT5xMS5yZWcpIHtuZXctPnExLnY9cC0+djtuZXctPnExLnZhbC52bWF4PXJlZ3NpemVbcnAucjFdO2JyZWFrO30KCgkJfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZihwJiZuZXctPnExLnYpewoJCWlmKCEobmV3LT5xMS5mbGFncyZEUkVGT0JKKSYmbXVzdF9jb252ZXJ0KG5ldy0+dHlwZixyZWd0eXBlW25ldy0+cTEucmVnXS0+ZmxhZ3MsMCkpewoJCSAgbmV3LT5jb2RlPUNPTlZFUlQ7CgkJICBuZXctPnR5cGYyPXJlZ3R5cGVbbmV3LT5xMS5yZWddLT5mbGFnczsKCQl9CiAgICAgICAgICAgICAgICBuZXctPnExLmZsYWdzJj1+UkVHOwogICAgICAgICAgICAgICAgbmV3LT5xMS5mbGFnc3w9VkFSOwogICAgICAgICAgICAgICAgLypuZXctPnExLnZhbC52bWF4PWwyem0oMEwpOyovCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CiAgICAgICAgICAgIG5ldy0+cTIudmFsLnZtYXg9c2l6ZXRhYlt0Jk5RXTsKICAgICAgICAgICAgbmV3LT56LmZsYWdzPVJFRzsKICAgICAgICAgICAgbmV3LT56LnJlZz1yZWc7CiAgICAgICAgICAgIGFkZF9JQyhuZXcpOwoJICAgIGlmKGFsKSBmaXhfcHVzaGljKCZhbC0+cHVzaGljLG5ldyk7CiAgICAgICAgICAgIG5ybD1teW1hbGxvYyhzaXplb2YoKm5ybCkpOwogICAgICAgICAgICBucmwtPm5leHQ9KnJsOwogICAgICAgICAgICBucmwtPnJlZz1yZWc7CiAgICAgICAgICAgIG5ybC0+dj12OwoJICAgIG5ybC0+cnNhdmVkPXJzYXZlZDsgLyogaWYgb25seSBwYXJ0IG9mIGEgcGFpciB3YXMgc2F2ZWQgKi8KCSAgICByc2F2ZWQ9MDsKICAgICAgICAgICAgKnJsPW5ybDsKICAgICAgICAgICAgcmV0dXJuIG9mOwogICAgICAgIH0KICAgIH0KfQoKdm9pZCBjb252ZXJ0KG5wIHAsaW50IGYpCi8qICBrb252ZXJ0aWVydCBkYXMgT2JqZWt0IGluIHAtPm8gaW4gYmVzdGltbXRlbiBUeXAgICAgKi8KLyogd2VubiB2b2xhdGlsZV9jb252ZXJ0IGdlc2V0enQgaXN0LCB3aXJkIGltbWVyIElDIGVyemV1Z3QgKi8KewogIElDICpuZXc7CiAgaW50IG89cC0+bnR5cC0+ZmxhZ3M7CiAgaW50IHRvLHRuLG1jLGRyOwogIHN0YXRpYyBub2RlIG4sbm47CiAgc3RhdGljIHR5cGUgbnQ7CiAgY2hhciAqbGlibmFtZTsKICBpZigoZiZOUSk9PVZPSUQpIHJldHVybjsKCiAgaWYocC0+ZmxhZ3M9PUNFWFBSfHxwLT5mbGFncz09UENFWFBSKXsKI2lmZGVmIEhBVkVfTUlTUkEKLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCiNlbmRpZgogICAgZXZhbF9jb25zdG4ocCk7CiAgICBwLT5udHlwLT5mbGFncz1mOwogICAgaW5zZXJ0X2NvbnN0bihwKTsKICAgIHAtPm8udmFsPXAtPnZhbDsKICAgIHJldHVybjsKICB9CiAgaWYoKEFWT0lEX0ZMT0FUX1RPX1VOU0lHTkVEJiZJU0ZMT0FUKG8pJiYoZiZVTlNJR05FRCkpfHwKICAgICAoQVZPSURfVU5TSUdORURfVE9fRkxPQVQmJklTRkxPQVQoZikmJihvJlVOU0lHTkVEKSkpewogICAgdW5pb24gYXR5cHMgdmFsOwogICAgaW50IGwxLGwyLGl0OwogICAgVmFyICp0bXA7CiAgICBucCB0OwogICAgdHlwZSAqdHR5cDsKICAgIGlmKGYmVU5TSUdORUQpCiAgICAgIGl0PWYmTlE7CiAgICBlbHNlCiAgICAgIGl0PW8mTlE7CiAgICB0dHlwPWNsb25lX3R5cChwLT5udHlwKTsKICAgIHR0eXAtPmZsYWdzPWY7CiAgICB0bXA9YWRkX3RtcF92YXIodHR5cCk7CiAgICBuZXc9bmV3X0lDKCk7CiAgICBuZXctPmNvZGU9Q09NUEFSRTsKICAgIG5ldy0+dHlwZj1vOwogICAgbmV3LT5xMT1wLT5vOwogICAgbmV3LT5xMS5mbGFncyY9flNDUkFUQ0g7CiAgICBuZXctPnEyLmZsYWdzPUtPTlNUOwogICAgbmV3LT5xMi52YWwudnVtYXg9dF9tYXhbaXRdOwogICAgZXZhbF9jb25zdCgmbmV3LT5xMi52YWwsTUFYSU5UfFVOU0lHTkVEKTsKICAgIGluc2VydF9jb25zdCgmbmV3LT5xMi52YWwsbyk7CiAgICB2YWw9bmV3LT5xMi52YWw7CiAgICBhZGRfSUMobmV3KTsKICAgIG5ldz1uZXdfSUMoKTsKICAgIG5ldy0+Y29kZT1CTEU7CiAgICBsMT0rK2xhYmVsOwogICAgbmV3LT50eXBmPWwxOwogICAgYWRkX0lDKG5ldyk7CiAgICBuZXc9bmV3X0lDKCk7CiAgICBuZXctPmNvZGU9U1VCOwogICAgbmV3LT50eXBmPW87CiAgICBuZXctPnExPXAtPm87CiAgICBuZXctPnExLmZsYWdzJj1+U0NSQVRDSDsKICAgIG5ldy0+cTIuZmxhZ3M9S09OU1Q7CiAgICBuZXctPnEyLnZhbD12YWw7CiAgICBuZXctPnouZmxhZ3M9VkFSOwogICAgZ2V0X3NjcmF0Y2goJm5ldy0+eixvLDAsMCk7CiAgICB0PW5ld19ub2RlKCk7CiAgICB0LT5udHlwPWNsb25lX3R5cChwLT5udHlwKTsKICAgIHQtPm50eXAtPmZsYWdzJj1+VU5TSUdORUQ7CiAgICB0LT5vPW5ldy0+ejsKICAgIGFkZF9JQyhuZXcpOwogICAgY29udmVydCh0LGYmTlEpOwogICAgbmV3PW5ld19JQygpOwogICAgbmV3LT5jb2RlPUFERDsKICAgIG5ldy0+dHlwZj1mOwogICAgbmV3LT5xMT10LT5vOwogICAgbmV3LT5xMS5mbGFncyY9flNDUkFUQ0g7CiAgICBmcmVldHlwKHQtPm50eXApOwogICAgZnJlZSh0KTsKICAgIG5ldy0+cTIuZmxhZ3M9S09OU1Q7CiAgICBuZXctPnEyLnZhbC52dW1heD10X21heFtpdF07CiAgICBldmFsX2NvbnN0KCZuZXctPnEyLnZhbCxNQVhJTlR8VU5TSUdORUQpOwogICAgaW5zZXJ0X2NvbnN0KCZuZXctPnEyLnZhbCxmKTsKICAgIG5ldy0+ei5mbGFncz1WQVI7CiAgICBuZXctPnoudj10bXA7CiAgICBuZXctPnoudmFsLnZtYXg9bDJ6bSgwTCk7CiAgICBhZGRfSUMobmV3KTsKICAgIG5ldz1uZXdfSUMoKTsKICAgIG5ldy0+Y29kZT1CUkE7CiAgICBsMj0rK2xhYmVsOwogICAgbmV3LT50eXBmPWwyOwogICAgYWRkX0lDKG5ldyk7CiAgICBuZXc9bmV3X0lDKCk7CiAgICBuZXctPmNvZGU9TEFCRUw7CiAgICBuZXctPnR5cGY9bDE7CiAgICBhZGRfSUMobmV3KTsKICAgIHAtPm50eXAtPmZsYWdzJj1+VU5TSUdORUQ7CiAgICBjb252ZXJ0KHAsZiZOUSk7CiAgICBuZXc9bmV3X0lDKCk7CiAgICBuZXctPmNvZGU9QVNTSUdOOwogICAgbmV3LT50eXBmPWY7CiAgICBuZXctPnExPXAtPm87CiAgICBuZXctPnouZmxhZ3M9VkFSOwogICAgbmV3LT56LnY9dG1wOwogICAgbmV3LT56LnZhbC52bWF4PWwyem0oMEwpOwogICAgbmV3LT5xMi52YWwudm1heD1zaXpldGFiW2YmTlFdOwogICAgcC0+bz1uZXctPno7CiAgICBwLT5udHlwLT5mbGFncz1mOwogICAgYWRkX0lDKG5ldyk7CiAgICBuZXc9bmV3X0lDKCk7CiAgICBuZXctPmNvZGU9TEFCRUw7CiAgICBuZXctPnR5cGY9bDI7CiAgICBhZGRfSUMobmV3KTsKICAgIHJldHVybjsKICB9CiAgaWYoSVNWRUNUT1IoZikmJklTU0NBTEFSKG8pKXsKICAgIG89VkVDVFlQRShmKTsKICAgIGNvbnZlcnQocCxvKTsKICB9CiAgaWYoIXZvbGF0aWxlX2NvbnZlcnQmJigobyYoTlUmflVOU0lHTkVEKSk9PShmJihOVSZ+VU5TSUdORUQpKXx8KCEobWM9bXVzdF9jb252ZXJ0KG8sZixjb25zdF9leHByKSkmJihjb25zdF9leHByfHwhKG9wdGZsYWdzJjIpKSkpKXsKICAgIHAtPm50eXAtPmZsYWdzPWY7CiAgICBpZighSVNQT0lOVEVSKGYpJiYhSVNBUlJBWShmKSl7ZnJlZXR5cChwLT5udHlwLT5uZXh0KTtwLT5udHlwLT5uZXh0PTA7fQogICAgcmV0dXJuOwogIH0KICAvKiBkbyBub3QgY3JlYXRlIGRpcmVjdCBjb252ZXJ0cyBiZXR3ZWVuIGZsb2F0IGFuZCBzbWFsbCB0eXBlcwogICAgIGlmIHRoZSBiYWNrZW5kIGRvZXMgbm90IGxpa2UgdGhhdCAqLwogIGlmKElTRkxPQVQobykmJklTSU5UKGYpJiYoZiZOUSk8TUlOX0ZMT0FUX1RPX0lOVF9UWVBFKQogICAgdG49TUlOX0ZMT0FUX1RPX0lOVF9UWVBFfChmJlVOU0lHTkVEKTsKICBlbHNlCiAgICB0bj1mOwogIGxpYm5hbWU9MDsKICBpZihJU0ZMT0FUKGYpJiZJU0lOVChvKSYmKG8mTlEpPE1JTl9JTlRfVE9fRkxPQVRfVFlQRSl7CiNpZiBIQVZFX0xJQkNBTExTCiAgICBpZigobGlibmFtZT11c2VfbGliY2FsbF93cmFwKENPTlZFUlQsdG4sbykpJiZtYyl7CiAgICAgIHRvPW87CiAgICAgIGxpYm5hbWU9dXNlX2xpYmNhbGxfd3JhcChDT05WRVJULHRuLE1JTl9JTlRfVE9fRkxPQVRfVFlQRXwobyZVTlNJR05FRCkpOwogICAgICBpZighbGlibmFtZSkgaWVycm9yKDApOwogICAgfWVsc2UKI2VuZGlmCiAgICB7CiAgICAgIHRvPU1JTl9JTlRfVE9fRkxPQVRfVFlQRXwobyZVTlNJR05FRCk7CiAgICAgIGNvbnZlcnQocCx0byk7CiAgICB9CiAgfWVsc2V7CiAgICB0bz1vOwogIH0KI2lmIEhBVkVfTElCQ0FMTFMKICBuLmZsYWdzPUNPTlZFUlQ7CiAgbi5udHlwPSZudDsKICBudC5mbGFncz1mOwogIG4ubGVmdD0mbm47CiAgbm4ubnR5cD1wLT5udHlwOwogIGlmKChsaWJuYW1lfHwobGlibmFtZT11c2VfbGliY2FsbF93cmFwKENPTlZFUlQsdG4sdG8pKSkmJm1jKXsKICAgIG5vZGUgKm49bmV3X25vZGUoKTsKICAgIG4tPmZsYWdzPVJFSU5URVJQUkVUOwogICAgbi0+bz1wLT5vOwogICAgbi0+bnR5cD1wLT5udHlwOwogICAgcC0+bz1nZW5fbGliY2FsbChsaWJuYW1lLG4scC0+bnR5cCwwLDApLT5vOwogIH1lbHNlewojZW5kaWYKICAgIG5ldz1uZXdfSUMoKTsKICAgIG5ldy0+cTE9cC0+bzsKICAgIG5ldy0+cTIuZmxhZ3M9MDsKICAgIG5ldy0+Y29kZT1DT05WRVJUOwogICAgbmV3LT50eXBmMj10bzsKICAgIG5ldy0+dHlwZj10bjsKICAgIGlmKChwLT5vLmZsYWdzJihTQ1JBVENIfFJFRykpIT0oU0NSQVRDSHxSRUcpfHwhcmVnb2socC0+by5yZWcsdG4sMCkpewogICAgICBnZXRfc2NyYXRjaCgmbmV3LT56LHRuLDAsMCk7CiAgICB9ZWxzZXsKICAgICAgbmV3LT56PXAtPm87bmV3LT56LmZsYWdzJj1+RFJFRk9CSjsKICAgIH0KICAgIHAtPm89bmV3LT56OwogICAgLyogaG1tLi4uICovCiAgICBpZighbWMmJmxpYm5hbWUpewogICAgICBuZXctPmNvZGU9QVNTSUdOOwogICAgICBuZXctPnEyLnZhbC52bWF4PXNpemV0YWJbdG4mTlFdOwogICAgfQogICAgYWRkX0lDKG5ldyk7CiNpZiBIQVZFX0xJQkNBTExTCiAgfQojZW5kaWYKICBpZihmIT10bil7CiAgICBwLT5udHlwLT5mbGFncz10bjsKICAgIGNvbnZlcnQocCxmKTsKICB9Cn0KCnZvaWQgYWxsb2NfaGFyZHJlZyhpbnQgcikKLyogIEJlbGVndCBSZWdpc3RlciByLiAgKi8KewogIElDICpuZXc7CiAgaWYobm9jb2RlKSByZXR1cm47CiAgaWYoREVCVUcmMTYpIHByaW50ZigiYWxsb2NhdGVkICVzXG4iLHJlZ25hbWVzW3JdKTsKICByZWdzW3JdPTE7cmVndXNlZFtyXSsrOwogIG5ldz1uZXdfSUMoKTsKICBuZXctPmNvZGU9QUxMT0NSRUc7CiAgbmV3LT50eXBmPTA7CiAgbmV3LT5xMS5mbGFncz1SRUc7CiAgbmV3LT5xMS5yZWc9cjsKICBuZXctPnEyLmZsYWdzPW5ldy0+ei5mbGFncz0wOwogIGFkZF9JQyhuZXcpOwogIGlmKHJlZ19wYWlyKHIsJnJwKSl7CiAgICByZWdzW3JwLnIxXT0xO3JlZ3VzZWRbcnAucjFdKys7CiAgICByZWdzW3JwLnIyXT0xO3JlZ3VzZWRbcnAucjJdKys7CiAgfQp9CgppbnQgYWxsb2NyZWcoaW50IGYsaW50IG1vZGUpCi8qICBGb3JkZXJ0IFJlZ2lzdGVyIGZ1ZXIgVHlwIGYgYW4uICAgICAgICAgICAgICAgICAgICAgKi8KewogIGludCBpLHI9MCxwcmlvPS0xOwogIGlmKG5vY29kZSkgcmV0dXJuKDEpOwogIGZvcihpPTE7aTw9TUFYUjtpKyspewogICAgaWYoIXJlZ3NbaV0mJnJlZ19wcmlvW2ldPnByaW8mJnJlZ29rKGksZixtb2RlKSYmKCFyZWdfcGFpcihpLCZycCl8fCghcmVnc1tycC5yMV0mJiFyZWdzW3JwLnIyXSkpKXsKICAgICAgcj1pOwogICAgICBwcmlvPXJlZ19wcmlvW2ldOwogICAgfQogIH0KICBpZihyKXsKICAgIGlmKERFQlVHJjE2KSBwcmludGYoImFsbG9jICVzXG4iLHJlZ25hbWVzW3JdKTsKICAgIGFsbG9jX2hhcmRyZWcocik7CiAgICByZXR1cm4gcjsKICB9CiAgaWYoREVCVUcmMSkgcHJpbnRmKCJDb3VsZG4ndCBhbGxvY2F0ZSByZWdpc3RlciBmb3IgdHlwZSAlZFxuIixmKTsKICByZXR1cm4gMDsKfQp2b2lkIGZyZWVfcmVnKGludCByKQovKiAgR2lidCBSZWdpc3RlciByIGZyZWkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCnsKICAgIElDICpuZXc7CiAgICBpZighcnx8bm9jb2RlKSByZXR1cm47CiAgICBpZihyZWdzW3JdPT0wJiYhY3Jvc3NfbW9kdWxlKQogICAgICB7cHJpbnRmKCJSZWdpc3RlciAlZCglcyk6XG4iLHIscmVnbmFtZXNbcl0pO2llcnJvcigwKTt9CiAgICBpZihERUJVRyYxNikgcHJpbnRmKCJmcmVlZCAlc1xuIixyZWduYW1lc1tyXSk7CiAgICBuZXc9bmV3X0lDKCk7CiAgICBuZXctPmNvZGU9RlJFRVJFRzsKICAgIG5ldy0+dHlwZj0wOwogICAgbmV3LT5xMS5mbGFncz1SRUc7CiAgICBuZXctPnExLnJlZz1yOwogICAgbmV3LT5xMi5mbGFncz1uZXctPnouZmxhZ3M9MDsKICAgIHJlZ3Nbcl09MDsKICAgIGlmKHJlZ19wYWlyKHIsJnJwKSl7CiAgICAgIGlmKHJlZ3NbcnAucjFdJlJIQUxGKXsKCWlmKERFQlVHJjE2KSBwcmludGYoImtlZXAgJXNcbiIscmVnbmFtZXNbcnAucjFdKTsKCXJlZ3NbcnAucjFdJj1+UkhBTEY7CgluZXctPnExLnJlZz1ycC5yMjsKICAgICAgfWVsc2UKCXJlZ3NbcnAucjFdPTA7CiAgICAgIGlmKHJlZ3NbcnAucjJdJlJIQUxGKXsKCWlmKERFQlVHJjE2KSBwcmludGYoImtlZXAgJXNcbiIscmVnbmFtZXNbcnAucjJdKTsKCXJlZ3NbcnAucjJdJj1+UkhBTEY7CgluZXctPnExLnJlZz1ycC5yMTsKICAgICAgfWVsc2UKCXJlZ3NbcnAucjJdPTA7CiAgICB9CiAgICBhZGRfSUMobmV3KTsKfQp2b2lkIGdlbl9sYWJlbChpbnQgbCkKLyogIEVyemV1Z3QgZWluIExhYmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwp7CiAgICBJQyAqbmV3OwogICAgbmV3PW5ld19JQygpOwogICAgbmV3LT5jb2RlPUxBQkVMOwogICAgbmV3LT50eXBmPWw7CiAgICBuZXctPnExLmZsYWdzPW5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CiAgICBhZGRfSUMobmV3KTsKfQp2b2lkIGdlbl9jb25kKG9iaiAqcCxpbnQgbSxpbnQgbDEsaW50IGwyKQovKiAgR2VuZXJpZXJ0IGNvZGUsIGRlciAwIG9kZXIgMSBpbiBSZWdpc3RlciBzY2hyZWlidC4gU2NocmVpYnQgb2JqIG5hY2ggcC4gKi8KewogICAgSUMgKm5ldzsKICAgIG9iaiBvbWVyazsKICAgIG5ldz1uZXdfSUMoKTsKICAgIG5ldy0+Y29kZT1BU1NJR047CiAgICBuZXctPnR5cGY9SU5UOwogICAgbmV3LT5xMS5mbGFncz1LT05TVDsKICAgIG5ldy0+cTIuZmxhZ3M9MDsKICAgIG5ldy0+cTIudmFsLnZtYXg9c2l6ZXRhYltJTlRdOwogICAgaWYoIW0pIHZtYXg9bDJ6bSgxTCk7IGVsc2Ugdm1heD1sMnptKDBMKTsKICAgIG5ldy0+cTEudmFsLnZpbnQ9em0yemkodm1heCk7CiAgICBnZXRfc2NyYXRjaCgmbmV3LT56LElOVCwwLDApOwogICAgb21lcms9bmV3LT56OwogICAgYWRkX0lDKG5ldyk7CiAgICBuZXc9bmV3X0lDKCk7CiAgICBuZXctPmNvZGU9QlJBOwogICAgbmV3LT50eXBmPWwyOwogICAgYWRkX0lDKG5ldyk7CiAgICBnZW5fbGFiZWwobDEpOwogICAgbmV3PW5ld19JQygpOwogICAgbmV3LT5jb2RlPUFTU0lHTjsKICAgIG5ldy0+dHlwZj1JTlQ7CiAgICBuZXctPnExLmZsYWdzPUtPTlNUOwogICAgbmV3LT5xMi5mbGFncz0wOwogICAgbmV3LT5xMi52YWwudm1heD1zaXpldGFiW0lOVF07CiAgICBpZighbSkgdm1heD1sMnptKDBMKTsgZWxzZSB2bWF4PWwyem0oMUwpOwogICAgbmV3LT5xMS52YWwudmludD16bTJ6aSh2bWF4KTsKICAgIG5ldy0+ej1vbWVyazsKLyogICAgbmV3LT56LnJlZz1yOwogICAgbmV3LT56LmZsYWdzPVNDUkFUQ0h8UkVHOyovCiAgICBhZGRfSUMobmV3KTsKICAgIGdlbl9sYWJlbChsMik7CiAgICAqcD1vbWVyazsKfQp2b2lkIHNjcmF0Y2hfdmFyKG9iaiAqbyxpbnQgdCx0eXBlICp0eXApCi8qICBsaWVmZXJ0IGVpbmUgdGVtcG9yYWVyZSBWYXJpYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgbmljaHQgZWZmaXppZW50LCBhYmVyIHdlciBoYXQgc2Nob24gc28gd2VuaWcgUmVnaXN0ZXIuLi4gICAgKi8KewogIHR5cGUgKm50OwogIGlmKCFJU1NDQUxBUih0KSYmIUlTVkVDVE9SKHQpKXsKICAgIGlmKCF0eXApIGllcnJvcigwKTsKICAgIG50PWNsb25lX3R5cCh0eXApOwogIH1lbHNlewogICAgbnQ9bmV3X3R5cCgpOwogICAgbnQtPmZsYWdzPXQ7CiAgICBpZihJU1BPSU5URVIodCkpewogICAgICBudC0+bmV4dD1uZXdfdHlwKCk7CiAgICAgIG50LT5uZXh0LT5mbGFncz1WT0lEOwogICAgfQogIH0KICBvLT5mbGFncz1TQ1JBVENIfFZBUjtvLT5yZWc9MDsKICBvLT52PWFkZF92YXIoZW1wdHksbnQsQVVUTywwKTsKICBvLT52YWwudm1heD1sMnptKDBMKTsKfQp2b2lkIGdldF9zY3JhdGNoKG9iaiAqbyxpbnQgdDEsaW50IHQyLHR5cGUgKnR5cCkKLyogIGxpZWZlcnQgZWluIFNjcmF0Y2hyZWdpc3RlciBvZGVyIGVpbmUgU2NyYXRjaHZhcmlhYmxlICAgICAgICovCnsKICAgIGlmKCEob3B0ZmxhZ3MmMikmJihvLT5yZWc9YWxsb2NyZWcodDEsdDIpKSl7CiAgICAgICAgby0+ZmxhZ3M9U0NSQVRDSHxSRUc7CiAgICB9ZWxzZXsKICAgICAgICBzY3JhdGNoX3ZhcihvLHQxLHR5cCk7CiAgICB9Cn0KaW50IGRvX2FyaXRoKG5wIHAsSUMgKm5ldyxucCBkZXN0LG9iaiAqbykKLyogIGVyemV1Z3QgSUMgbmV3IGZ1ZXIgZWluZW4gYXJpdGhtZXRpc2NoZW4gS25vdGVuIHVuZCBzcGVpY2hlcnQgZGFzICAgKi8KLyogIFJlc3VsdGF0IHZvbSBVbnRlcmtub3RlbiBkZXN0IGluIG8gKGZ1ZXIgYSBvcD0gYikgICAgICAgICAgICAgICAqLwovKiAgbGllZmVydCAwLCB3ZW5uIGRlc3QgbmljaHQgZ2VmdW5kZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCnsKICAgIGludCBmPTAsbWZsYWdzOwogICAgbmV3LT5jb2RlPXAtPmZsYWdzOwogICAgaWYobmV3LT5jb2RlPT1QTVVMVCkgbmV3LT5jb2RlPU1VTFQ7CiAgICBnZW5fSUMocC0+bGVmdCwwLDApOwogICAgaWYoZGVzdCYmcC0+bGVmdD09ZGVzdCl7CiAgICAgICpvPXAtPmxlZnQtPm87ZisrOwogICAgICBpZihwLT5sZWZ0LT5mbGFncz09QklURklFTEQpewogICAgICAgICpvPXAtPmxlZnQtPmxlZnQtPm87CiAgICAgICAgaWYoKG8tPmZsYWdzJihSRUd8U0NSQVRDSCkpPT0oUkVHfFNDUkFUQ0gpKQogICAgICAgICAga2VlcF9yZWcoby0+cmVnKTsKICAgICAgfQogICAgfQogICAgZ2VuX0lDKHAtPnJpZ2h0LDAsMCk7CiAgICBpZihkZXN0JiZwLT5yaWdodD09ZGVzdCkgeypvPXAtPnJpZ2h0LT5vO2YrKzt9CiAgICBpZihkZXN0KXsKICAgICAgbWZsYWdzPWRlc3QtPm8uZmxhZ3M7CiAgICAgIGlmKHAtPmxlZnQtPmZsYWdzIT1CSVRGSUVMRCkgCiAgICAgICAgZGVzdC0+by5mbGFncyY9KH5TQ1JBVENIKTsKICAgIH0KCiAgICBpZihJU1BPSU5URVIocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpJiZJU1BPSU5URVIocC0+cmlnaHQtPm50eXAtPmZsYWdzKSl7CiAgICAvKiAgU3VidHJhaGllcmVuIHp3ZWllciBQb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgaW50IGR0PVBUUkRJRkZfVChwLT5sZWZ0LT5udHlwLT5mbGFncyk7CiAgICAgIGlmKHAtPmZsYWdzIT1TVUIpIGllcnJvcigwKTsKICAgICAgbmV3LT50eXBmPWR0OwogICAgICBuZXctPnR5cGYyPXAtPmxlZnQtPm50eXAtPmZsYWdzOwogICAgICBuZXctPmNvZGU9U1VCUEZQOwogICAgICBuZXctPnExPXAtPmxlZnQtPm87CiAgICAgIG5ldy0+cTI9cC0+cmlnaHQtPm87CiAgICAgIGlmKCFkZXN0JiYocC0+bGVmdC0+by5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSYmcmVnb2socC0+bGVmdC0+by5yZWcsZHQsMCkpewoJbmV3LT56PXAtPmxlZnQtPm87CgluZXctPnouZmxhZ3MmPX5EUkVGT0JKOwogICAgICB9ZWxzZXsKCWlmKFVTRVEyQVNaJiYocC0+cmlnaHQtPm8uZmxhZ3MmKFNDUkFUQ0h8UkVHKSk9PShTQ1JBVENIfFJFRykmJnJlZ29rKHAtPnJpZ2h0LT5vLnJlZyxkdCwwKSl7CgkgIG5ldy0+ej1wLT5yaWdodC0+bzsKCSAgbmV3LT56LmZsYWdzJj0ofkRSRUZPQkopOwoJfWVsc2V7CgkgIGdldF9zY3JhdGNoKCZuZXctPnosZHQsMCwwKTsKCX0KICAgICAgfQogICAgICBwLT5vPW5ldy0+ejsKICAgICAgYWRkX0lDKG5ldyk7CiAgICAgIGlmKCF6bWxlcShzem9mKHAtPmxlZnQtPm50eXAtPm5leHQpLGwyem0oMUwpKSl7Cglsb25nIGxuOwoJbmV3PW5ld19JQygpOwoJbmV3LT5xMT1wLT5vOwoJbmV3LT5xMi5mbGFncz1LT05TVDsKCWd2YWwudm1heD1zem9mKHAtPmxlZnQtPm50eXAtPm5leHQpOwoJZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOwoJaWYobG49Z2V0X3BvZjIodnVtYXgpKXsKCSAgLyogRGl2aXNpb24gaW1tZXIgb2huZSBSZXN0LCBkYWhlciBzaGlmdCBt9mdsaWNoICovCgkgIC8qIFRPRE86IEhhYmVuIHdpciBUYXJnZXRzIG9obmUgYXJpdGguIHNoaWZ0IHJpZ2h0PyAqLwoJICBndmFsLnZtYXg9bDJ6bShsbi0xKTsKCSAgZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOwoJICBpbnNlcnRfY29uc3QoJm5ldy0+cTIudmFsLElOVCk7CgkgIG5ldy0+dHlwZjI9SU5UOwoJICBuZXctPmNvZGU9UlNISUZUOwoJfWVsc2V7CgkgIGluc2VydF9jb25zdCgmbmV3LT5xMi52YWwsZHQpOwoJICBuZXctPmNvZGU9RElWOwoJfQoJbmV3LT56PXAtPm87CgluZXctPnR5cGY9ZHQ7CglhZGRfSUMobmV3KTsKICAgICAgfQogICAgICBpZihkZXN0KSBkZXN0LT5vLmZsYWdzPW1mbGFnczsKICAgICAgcmV0dXJuIGY7CiAgICB9CiAgICBpZigocC0+ZmxhZ3M9PUFERHx8cC0+ZmxhZ3M9PVNVQikmJihJU1BPSU5URVIocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpfHxJU1BPSU5URVIocC0+cmlnaHQtPm50eXAtPmZsYWdzKSkpewogICAgICAvKiAgQWRkaWVyZW4gdW5kIFN1YnRyYWhpZXJlbiBlaW5lcyBJbnRlZ2VycyB6dSBlaW5lbSBQb2ludGVyICAgKi8KICAgICAgaWYocC0+ZmxhZ3M9PUFERCl7CgluZXctPmNvZGU9QURESTJQOwoJaWYoIUlTUE9JTlRFUihwLT5sZWZ0LT5udHlwLT5mbGFncykpewoJICBucCB0bXA9cC0+bGVmdDsKCSAgcC0+bGVmdD1wLT5yaWdodDsKCSAgcC0+cmlnaHQ9dG1wOwoJfQogICAgICB9ZWxzZQoJbmV3LT5jb2RlPVNVQklGUDsKICAgICAgbmV3LT50eXBmPXAtPnJpZ2h0LT5udHlwLT5mbGFnczsKICAgICAgbmV3LT50eXBmMj1wLT5udHlwLT5mbGFnczsKICAgICAgbmV3LT5xMT1wLT5sZWZ0LT5vOwogICAgICAvKiAga2xlaW5lcmUgVHlwZW4gYWxzIE1JTkFEREkyUCBlcnN0IGluIGRpZXNlbiB3YW5kZWxuICovCiAgICAgIGlmKG5ldy0+dHlwZiZVTlNJR05FRCl7CglpZigobmV3LT50eXBmJk5RKTwoTUlOQUREVUkyUCZOUSkpe2NvbnZlcnQocC0+cmlnaHQsTUlOQUREVUkyUCk7bmV3LT50eXBmPU1JTkFERFVJMlA7fQogICAgICB9ZWxzZXsKCWlmKChuZXctPnR5cGYmTlEpPE1JTkFEREkyUCl7Y29udmVydChwLT5yaWdodCxNSU5BRERJMlApO25ldy0+dHlwZj1NSU5BRERJMlA7fQogICAgICB9CiAgICAgIC8qICBncm9lc3NlcmUgVHlwZW4gYWxzIE1BWEFEREkyUCBlcnN0IGluIGRpZXNlbiB3YW5kZWxuICovCiAgICAgIGlmKG5ldy0+dHlwZiZVTlNJR05FRCl7CglpZigobmV3LT50eXBmJk5RKT4oTUFYQURESTJQJk5RKSl7Y29udmVydChwLT5yaWdodCxNQVhBRERVSTJQKTtuZXctPnR5cGY9TUFYQUREVUkyUDt9ICAgICAgCiAgICAgIH1lbHNlewoJaWYoKG5ldy0+dHlwZiZOUSk+TUFYQURESTJQKXtjb252ZXJ0KHAtPnJpZ2h0LE1BWEFEREkyUCk7bmV3LT50eXBmPU1BWEFEREkyUDt9ICAgICAgCiAgICAgIH0KICAgICAgaWYoKHAtPmxlZnQtPm8uZmxhZ3MmVkFSQURSKSYmKHAtPnJpZ2h0LT5vLmZsYWdzJktPTlNUKSl7CglldmFsX2NvbnN0KCZwLT5yaWdodC0+by52YWwscC0+cmlnaHQtPm50eXAtPmZsYWdzKTsKCXAtPm89cC0+bGVmdC0+bzsKCXAtPm8udmFsLnZtYXg9em1hZGQodm1heCxwLT5sZWZ0LT5vLnZhbC52bWF4KTsKCWZyZWUobmV3KTsKCXJldHVybiBmOwogICAgICB9CiAgICAgIG5ldy0+cTI9cC0+cmlnaHQtPm87CiAgICAgIGlmKCFkZXN0JiYocC0+bGVmdC0+by5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSYmcmVnb2sobmV3LT5xMS5yZWcsUE9JTlRFUl9UWVBFKHAtPmxlZnQtPm50eXAtPm5leHQpLHAtPmxlZnQtPm50eXAtPm5leHQtPmZsYWdzKSl7CgluZXctPno9cC0+bGVmdC0+bzsKCW5ldy0+ei5mbGFncyY9KH5EUkVGT0JKKTsKICAgICAgfWVsc2V7CgkvKmdldF9zY3JhdGNoKCZuZXctPnosUE9JTlRFUl9UWVBFKHAtPmxlZnQtPm50eXAtPm5leHQpLHAtPmxlZnQtPm50eXAtPm5leHQtPmZsYWdzLDApOyovCglnZXRfc2NyYXRjaCgmbmV3LT56LHAtPm50eXAtPmZsYWdzLHAtPm50eXAtPm5leHQtPmZsYWdzLDApOwogICAgICB9CiAgICAgIHAtPm89bmV3LT56OwogICAgICBhZGRfSUMobmV3KTsKICAgICAgaWYoZGVzdCkgZGVzdC0+by5mbGFncz1tZmxhZ3M7CiAgICAgIHJldHVybiBmOwogICAgfQogICAgaWYoIUlTVkVDVE9SKHAtPm50eXAtPmZsYWdzKXx8IUlTVkVDVE9SKHAtPmxlZnQtPm50eXAtPmZsYWdzKSkKICAgICAgY29udmVydChwLT5sZWZ0LHAtPm50eXAtPmZsYWdzKTsKICAgIGlmKHAtPmZsYWdzPT1MU0hJRlR8fHAtPmZsYWdzPT1SU0hJRlQpewogICAgICBpZihzaG9ydGN1dChwLT5mbGFncyxwLT5sZWZ0LT5udHlwLT5mbGFncyZOVSkpewoJY29udmVydChwLT5yaWdodCxwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpOwoJbmV3LT50eXBmMj1wLT5yaWdodC0+bnR5cC0+ZmxhZ3M7CiAgICAgIH1lbHNlewoJY29udmVydChwLT5yaWdodCxJTlQpOwoJbmV3LT50eXBmMj1JTlQ7CiAgICAgIH0KI2lmIDAKICAgICAgdHlwZSAqc3Q7CiAgICAgIHN0PWNsb25lX3R5cChwLT5yaWdodC0+bnR5cCk7CiAgICAgIC8qc3QtPmZsYWdzPWludF9lcncoc3QtPmZsYWdzKTsqLwogICAgICBzdC0+ZmxhZ3M9SU5UOwogICAgICBjb252ZXJ0KHAtPnJpZ2h0LHN0LT5mbGFncyk7CiAgICAgIG5ldy0+dHlwZjI9c3QtPmZsYWdzOwogICAgICBmcmVldHlwKHN0KTsKI2VuZGlmCiAgICB9ZWxzZXsKICAgICAgaWYoIUlTVkVDVE9SKHAtPm50eXAtPmZsYWdzKXx8IUlTVkVDVE9SKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpCgljb252ZXJ0KHAtPnJpZ2h0LHAtPm50eXAtPmZsYWdzKTsKICAgIH0KICAgIG5ldy0+cTE9cC0+bGVmdC0+bzsKICAgIG5ldy0+cTI9cC0+cmlnaHQtPm87CiAgICBpZihJU1ZFQ1RPUihwLT5udHlwLT5mbGFncykpewogICAgICBuZXctPnR5cGY9cC0+bGVmdC0+bnR5cC0+ZmxhZ3M7CiAgICAgIG5ldy0+dHlwZjI9cC0+bnR5cC0+ZmxhZ3M7CiAgICB9ZWxzZQogICAgICBuZXctPnR5cGY9cC0+bnR5cC0+ZmxhZ3M7CiAgICAvKiAgQmVpIGRlc3QhPTAsIGQuaC4gQVNTSUdOT1AsIGRhcmYgcTEgbmljaHQgYWxzIFppZWwgYmVudXp0IHdlcmRlbiEgICovCiAgICBpZighZGVzdCYmKG5ldy0+cTEuZmxhZ3MmKFNDUkFUQ0h8UkVHKSk9PShTQ1JBVENIfFJFRykmJnJlZ29rKG5ldy0+cTEucmVnLHAtPm50eXAtPmZsYWdzLDApKXsKICAgICAgbmV3LT56PW5ldy0+cTE7CiAgICAgIG5ldy0+ei5mbGFncyY9fkRSRUZPQko7CiAgICB9ZWxzZXsKICAgICAgaWYoKG5ldy0+cTIuZmxhZ3MmU0NSQVRDSCkmJnJlZ29rKG5ldy0+cTIucmVnLHAtPm50eXAtPmZsYWdzLDApKXsKCWlmKChwLT5mbGFncz49T1ImJnAtPmZsYWdzPD1BTkQpfHxwLT5mbGFncz09QUREfHxwLT5mbGFncz09TVVMVHx8cC0+ZmxhZ3M9PVBNVUxUKXsKCSAgLyogIGJlaSBrb21tdXRhdGl2ZW4gT3BlcmF0b3JlbiB2ZXJ0YXVzY2hlbiAgICAgKi8KCSAgbmV3LT56PW5ldy0+cTI7CgkgIG5ldy0+cTI9bmV3LT5xMTsKCSAgbmV3LT5xMT1uZXctPno7CgkgIG5ldy0+ei5mbGFncyY9fkRSRUZPQko7Cgl9ZWxzZXsKCSAgaWYoVVNFUTJBU1opewoJICAgIG5ldy0+ej1uZXctPnEyOwoJICAgIG5ldy0+ei5mbGFncyY9fkRSRUZPQko7CgkgIH1lbHNlewoJICAgIGdldF9zY3JhdGNoKCZuZXctPnosbmV3LT50eXBmLDAsMCk7CgkgIH0KCX0KICAgICAgfWVsc2V7CglnZXRfc2NyYXRjaCgmbmV3LT56LG5ldy0+dHlwZiwwLDApOwogICAgICB9CiAgICB9CiAgICBwLT5vPW5ldy0+ejsKICAgIGFkZF9JQyhuZXcpOwogICAgaWYoZGVzdCl7CiAgICAgIGRlc3QtPm8uZmxhZ3M9bWZsYWdzOwogICAgICAvKgogICAgICBpZigoZGVzdC0+by5mbGFncyZSRUcpJiYhcmVnc1tkZXN0LT5vLnJlZ10pCiAgICAgICAga2VlcF9yZWcoZGVzdC0+by5yZWcpOwogICAgICAqLwogICAgfQoKICAgIHJldHVybiBmOwp9CnZvaWQgc2F2ZXNjcmF0Y2goaW50IGNvZGUsSUMgKnAsaW50IGRvbnRzYXZlLG9iaiAqbykKLyogIHNwZWljaGVydCBTY3JhdGNocmVnaXN0ZXIgYnp3LiBzdGVsbHQgc2llIHdpZWRlciBoZXIgKGplIG5hY2ggY29kZSAgKi8KLyogIGVudHdlZGVyIE1PVkVGUk9NUkVHIG9kZXIgTU9WRVRPUkVHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KewogIGludCBpLHMsZSxiLGRzMSxkczI7SUMgKm5ldzsKICBpZihjb2RlPT1NT1ZFVE9SRUcpeyBzPTE7ZT1NQVhSKzE7Yj0xO30gZWxzZSB7cz1NQVhSO2U9MDtiPS0xO30KICBpZihyZWdfcGFpcihkb250c2F2ZSwmcnApKXsKICAgIGRzMT1ycC5yMTsKICAgIGRzMj1ycC5yMjsKICB9ZWxzZQogICAgZHMxPWRzMj0wOwogIGZvcihpPXM7aSE9ZTtpKz1iKXsKICAgIGludCBtdXN0c2F2ZT0wOwogICAgaWYoKG8tPmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJm8tPnYtPmZpJiYoby0+di0+ZmktPmZsYWdzJkFMTF9SRUdTKSkKICAgICAgbXVzdHNhdmU9QlRTVChvLT52LT5maS0+cmVnc19tb2RpZmllZCxpKTsKICAgIGVsc2UKICAgICAgbXVzdHNhdmU9cmVnc2NyYXRjaFtpXTsKICAgIGlmKHJlZ3NhW2ldKSBtdXN0c2F2ZT0wOwogICAgaWYobXVzdHNhdmUpIHNpbXBsZV9zY3JhdGNoW2ldPTE7CiAgICBpZihyZWdzW2ldJiYhKHJlZ3NbaV0mUk5PU0FWRSkmJm11c3RzYXZlJiZpIT1kb250c2F2ZSYmaSE9ZHMxJiZpIT1kczImJiFyZWdfcGFpcihpLCZycCkpewogICAgICBpZighcmVnc2J1ZltpXSl7Cgl0eXBlICp0OwoJaWYoY29kZSE9TU9WRUZST01SRUcpIGNvbnRpbnVlOwoJdD1jbG9uZV90eXAocmVndHlwZVtpXSk7CglyZWdzYnVmW2ldPWFkZF92YXIoZW1wdHksdCxBVVRPLDApOwoJcmVnc2J1ZltpXS0+ZmxhZ3N8PVVTRURBU0FEUjsKCXJlZ2JuZXN0aW5nW2ldPW5lc3Rpbmc7CiAgICAgIH0KICAgICAgbmV3PW5ld19JQygpOwogICAgICBuZXctPnR5cGY9bmV3LT5xMi5mbGFncz0wOwogICAgICBuZXctPmxpbmU9MDtuZXctPmZpbGU9MDsKICAgICAgbmV3LT5jb2RlPWNvZGU7CiAgICAgIGlmKGNvZGU9PU1PVkVGUk9NUkVHKXsKCW5ldy0+cTEuZmxhZ3M9UkVHO25ldy0+cTEucmVnPWk7CgluZXctPnouZmxhZ3M9VkFSfERPTlRSRUdJU1RFUklaRTtuZXctPnoudj1yZWdzYnVmW2ldOwoJbmV3LT56LnZhbC52bWF4PWwyem0oMEwpOwogICAgICB9ZWxzZXsKCW5ldy0+ei5mbGFncz1SRUc7bmV3LT56LnJlZz1pOwoJbmV3LT5xMS5mbGFncz1WQVJ8RE9OVFJFR0lTVEVSSVpFO25ldy0+cTEudj1yZWdzYnVmW2ldOwoJbmV3LT5xMS52YWwudm1heD1sMnptKDBMKTsKICAgICAgfQogICAgICBuZXctPnVzZV9jbnQ9bmV3LT5jaGFuZ2VfY250PTA7CiAgICAgIG5ldy0+dXNlX2xpc3Q9bmV3LT5jaGFuZ2VfbGlzdD0wOwogICAgICBpbnNlcnRfSUMocCxuZXcpOwogICAgfQogIH0KfQoK