LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBDb3B5cmlnaHQgMjAwNyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVFguLCBVU0EKICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICogCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAogKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgCiAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgCiAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCiAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiAqIG9mIHRoZSBTb2Z0d2FyZS4KICogCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qCiAqIEF1dGhvcnM6IFRob21hcyBIZWxsc3Ry9m0gPHRob21hcy1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+CiAqLwoKI2lmZGVmIEhBVkVfQ09ORklHX0gKI2luY2x1ZGUgImNvbmZpZy5oIgojZW5kaWYKCiNpbmNsdWRlIDxYMTEvWGxpYi5oPgojaW5jbHVkZSA8WDExL1h1dGlsLmg+CiNpbmNsdWRlIDxkcm0vZHJtLmg+CiNpbmNsdWRlICJ4Zjg2ZHJpLmgiCiNpbmNsdWRlICJ4Zjg2ZHJtLmgiCiNpbmNsdWRlICJzdGRpby5oIgojaW5jbHVkZSAic3lzL3R5cGVzLmgiCiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAic3lzL21tYW4uaCIKCnR5cGVkZWYgc3RydWN0CnsKICAgIGVudW0KICAgIHsKCWhhdmVOb3RoaW5nLAoJaGF2ZURpc3BsYXksCgloYXZlQ29ubmVjdGlvbiwKCWhhdmVEcml2ZXJOYW1lLAoJaGF2ZURldmljZUluZm8sCgloYXZlRFJNLAoJaGF2ZUNvbnRleHQKICAgIH0KICAgIHN0YXRlOwoKICAgIERpc3BsYXkgKmRpc3BsYXk7CiAgICBpbnQgc2NyZWVuOwogICAgZHJtX2hhbmRsZV90IHNBcmVhT2Zmc2V0OwogICAgY2hhciAqY3VyQnVzSUQ7CiAgICBjaGFyICpkcml2ZXJOYW1lOwogICAgaW50IGRybUZEOwogICAgWFZpc3VhbEluZm8gdmlzdWFsSW5mbzsKICAgIFhJRCBpZDsKICAgIGRybV9jb250ZXh0X3QgaHdDb250ZXh0OwogICAgdm9pZCAqZHJpUHJpdjsKICAgIGludCBkcmlQcml2U2l6ZTsKICAgIGludCBmYlNpemU7CiAgICBpbnQgZmJPcmlnaW47CiAgICBpbnQgZmJTdHJpZGU7CiAgICBkcm1faGFuZGxlX3QgZmJIYW5kbGU7CiAgICBpbnQgZGR4RHJpdmVyTWFqb3I7CiAgICBpbnQgZGR4RHJpdmVyTWlub3I7CiAgICBpbnQgZGR4RHJpdmVyUGF0Y2g7Cn0gVGlueURSSUNvbnRleHQ7CgojaWZuZGVmIF9feDg2XzY0X18Kc3RhdGljIHVuc2lnbmVkCmZhc3RyZHRzYyh2b2lkKQp7CiAgICB1bnNpZ25lZCBlYXg7CiAgICBfX2FzbV9fIHZvbGF0aWxlICgiXHQiCgkicHVzaGwgICUlZWJ4XG5cdCIKCSJjcHVpZFxuXHQiICIuYnl0ZSAweDBmLCAweDMxXG5cdCIgInBvcGwgJSVlYnhcbiI6Ij1hIiAoZWF4KQoJOiIwIigwKQoJOiJlY3giLCAiZWR4IiwgImNjIik7CgogICAgcmV0dXJuIGVheDsKfQojZWxzZQpzdGF0aWMgdW5zaWduZWQKZmFzdHJkdHNjKHZvaWQpCnsKICAgIHVuc2lnbmVkIGVheDsKICAgIF9fYXNtX18gdm9sYXRpbGUgKCJcdCIgImNwdWlkXG5cdCIgIi5ieXRlIDB4MGYsIDB4MzFcblx0IjoiPWEiIChlYXgpCgk6IjAiKDApCgk6ImVjeCIsICJlZHgiLCAiZWJ4IiwgImNjIik7CgogICAgcmV0dXJuIGVheDsKfQojZW5kaWYKCnZvaWQKYm1FcnJvcihpbnQgdmFsLCBjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpmdW5jdGlvbiwgaW50IGxpbmUpCnsKICAgIGZwcmludGYoc3RkZXJyLCAiRmF0YWwgdmlkZW8gbWVtb3J5IG1hbmFnZXIgZXJyb3IgXCIlc1wiLlxuIgoJIkNoZWNrIGtlcm5lbCBsb2dzIG9yIHNldCB0aGUgTElCR0xfREVCVUdcbiIKCSJlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBcInZlcmJvc2VcIiBmb3IgbW9yZSBpbmZvLlxuIgoJIkRldGVjdGVkIGluIGZpbGUgJXMsIGxpbmUgJWQsIGZ1bmN0aW9uICVzLlxuIiwKCXN0cmVycm9yKC12YWwpLCBmaWxlLCBsaW5lLCBmdW5jdGlvbik7CiAgICBhYm9ydCgpOwp9CgojZGVmaW5lIEJNX0NLRkFUQUwodmFsKQkJCQkJICAgICAgIFwKICBkb3sJCQkJCQkJICAgICAgIFwKICAgIGludCB0c3RWYWwgPSAodmFsKTsJCQkJCSAgICAgICBcCiAgICBpZiAodHN0VmFsKSAJCQkJCSAgICAgICBcCiAgICAgIGJtRXJyb3IodHN0VmFsLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7ICAgICAgIFwKICB9IHdoaWxlKDApOwoKc3RhdGljIHVuc2lnbmVkCnRpbWVfZGlmZih1bnNpZ25lZCB0LCB1bnNpZ25lZCB0MikKewogICAgcmV0dXJuICgodCA8IHQyKSA/IHQyIC0gdCA6IDB4RkZGRkZGRkZVIC0gKHQgLSB0MiAtIDEpKTsKfQoKc3RhdGljIGludApyZWxlYXNlQ29udGV4dChUaW55RFJJQ29udGV4dCAqIGN0eCkKewogICAgc3dpdGNoIChjdHgtPnN0YXRlKSB7CiAgICBjYXNlIGhhdmVDb250ZXh0OgoJdW5pRFJJRGVzdHJveUNvbnRleHQoY3R4LT5kaXNwbGF5LCBjdHgtPnNjcmVlbiwgY3R4LT5pZCk7CiAgICBjYXNlIGhhdmVEUk06Cglkcm1DbG9zZShjdHgtPmRybUZEKTsKICAgIGNhc2UgaGF2ZURldmljZUluZm86CglYRnJlZShjdHgtPmRyaVByaXYpOwogICAgY2FzZSBoYXZlRHJpdmVyTmFtZToKCVhGcmVlKGN0eC0+ZHJpdmVyTmFtZSk7CiAgICBjYXNlIGhhdmVDb25uZWN0aW9uOgoJWEZyZWUoY3R4LT5jdXJCdXNJRCk7Cgl1bmlEUklDbG9zZUNvbm5lY3Rpb24oY3R4LT5kaXNwbGF5LCBjdHgtPnNjcmVlbik7CiAgICBjYXNlIGhhdmVEaXNwbGF5OgoJWENsb3NlRGlzcGxheShjdHgtPmRpc3BsYXkpOwogICAgZGVmYXVsdDoKCWJyZWFrOwogICAgfQogICAgcmV0dXJuIC0xOwp9CgpzdGF0aWMgdm9pZApyZWFkQnVmKHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKQp7CiAgICB2b2xhdGlsZSB1bnNpZ25lZCAqYnVmMzIgPSAodW5zaWduZWQgKilidWY7CiAgICB1bnNpZ25lZCAqZW5kID0gKHVuc2lnbmVkICopYnVmMzIgKyBzaXplIC8gc2l6ZW9mKCpidWYzMik7CgogICAgd2hpbGUgKGJ1ZjMyIDwgZW5kKSB7Cgkodm9pZCkqYnVmMzIrKzsKICAgIH0KfQoKc3RhdGljIGludApiZW5jaG1hcmtCdWZmZXIoVGlueURSSUNvbnRleHQgKiBjdHgsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKICAgIHVuc2lnbmVkIGxvbmcgKnRpY2tzKQp7CiAgICB1bnNpZ25lZCBsb25nIGN1clRpbWUsIG9sZFRpbWU7CiAgICBpbnQgcmV0OwogICAgZHJtQk8gYnVmOwogICAgdm9pZCAqdmlydHVhbDsKCiAgICAvKgogICAgICogVGVzdCBzeXN0ZW0gbWVtb3J5IG9iamVjdHMuCiAgICAgKi8KCiAgICBvbGRUaW1lID0gZmFzdHJkdHNjKCk7CiAgICBCTV9DS0ZBVEFMKGRybUJPQ3JlYXRlKGN0eC0+ZHJtRkQsIDAsIHNpemUsIDAsIE5VTEwsCgkgICAgZHJtX2JvX3R5cGVfZGMsCgkgICAgRFJNX0JPX0ZMQUdfUkVBRCB8CgkgICAgRFJNX0JPX0ZMQUdfV1JJVEUgfAoJICAgIERSTV9CT19GTEFHX01FTV9MT0NBTCB8IERSTV9CT19GTEFHX05PX01PVkUsIDAsICZidWYpKTsKICAgIGN1clRpbWUgPSBmYXN0cmR0c2MoKTsKICAgICp0aWNrcysrID0gdGltZV9kaWZmKG9sZFRpbWUsIGN1clRpbWUpOwoKICAgIG9sZFRpbWUgPSBmYXN0cmR0c2MoKTsKICAgIEJNX0NLRkFUQUwoZHJtQk9NYXAoY3R4LT5kcm1GRCwgJmJ1ZiwKCSAgICBEUk1fQk9fRkxBR19SRUFEIHwgRFJNX0JPX0ZMQUdfV1JJVEUsIDAsICZ2aXJ0dWFsKSk7CiAgICBjdXJUaW1lID0gZmFzdHJkdHNjKCk7CiAgICAqdGlja3MrKyA9IHRpbWVfZGlmZihvbGRUaW1lLCBjdXJUaW1lKTsKCiAgICBvbGRUaW1lID0gZmFzdHJkdHNjKCk7CiAgICBtZW1zZXQodmlydHVhbCwgMHhGMCwgYnVmLnNpemUpOwogICAgY3VyVGltZSA9IGZhc3RyZHRzYygpOwogICAgKnRpY2tzKysgPSB0aW1lX2RpZmYob2xkVGltZSwgY3VyVGltZSk7CgogICAgb2xkVGltZSA9IGZhc3RyZHRzYygpOwogICAgbWVtc2V0KHZpcnR1YWwsIDB4MEYsIGJ1Zi5zaXplKTsKICAgIGN1clRpbWUgPSBmYXN0cmR0c2MoKTsKICAgICp0aWNrcysrID0gdGltZV9kaWZmKG9sZFRpbWUsIGN1clRpbWUpOwoKICAgIG9sZFRpbWUgPSBmYXN0cmR0c2MoKTsKICAgIHJlYWRCdWYodmlydHVhbCwgYnVmLnNpemUpOwogICAgY3VyVGltZSA9IGZhc3RyZHRzYygpOwogICAgKnRpY2tzKysgPSB0aW1lX2RpZmYob2xkVGltZSwgY3VyVGltZSk7CgogICAgb2xkVGltZSA9IGZhc3RyZHRzYygpOwogICAgQk1fQ0tGQVRBTChkcm1CT1VubWFwKGN0eC0+ZHJtRkQsICZidWYpKTsKICAgIGN1clRpbWUgPSBmYXN0cmR0c2MoKTsKICAgICp0aWNrcysrID0gdGltZV9kaWZmKG9sZFRpbWUsIGN1clRpbWUpOwoKICAgIC8qCiAgICAgKiBUZXN0IFRUIGJvdW5kIGJ1ZmZlciBvYmplY3RzLgogICAgICovCgogICAgQk1fQ0tGQVRBTChkcm1HZXRMb2NrKGN0eC0+ZHJtRkQsIGN0eC0+aHdDb250ZXh0LCAwKSk7CiAgICBvbGRUaW1lID0gZmFzdHJkdHNjKCk7CiAgICBCTV9DS0ZBVEFMKGRybUJPVmFsaWRhdGUoY3R4LT5kcm1GRCwgJmJ1ZiwKCSAgICBEUk1fQk9fRkxBR19NRU1fVFQsIERSTV9CT19NQVNLX01FTSwgRFJNX0JPX0hJTlRfRE9OVF9GRU5DRSkpOwogICAgY3VyVGltZSA9IGZhc3RyZHRzYygpOwogICAgQk1fQ0tGQVRBTChkcm1VbmxvY2soY3R4LT5kcm1GRCwgY3R4LT5od0NvbnRleHQpKTsKICAgICp0aWNrcysrID0gdGltZV9kaWZmKG9sZFRpbWUsIGN1clRpbWUpOwoKICAgIG9sZFRpbWUgPSBmYXN0cmR0c2MoKTsKICAgIEJNX0NLRkFUQUwoZHJtQk9NYXAoY3R4LT5kcm1GRCwgJmJ1ZiwKCSAgICBEUk1fQk9fRkxBR19SRUFEIHwgRFJNX0JPX0ZMQUdfV1JJVEUsIDAsICZ2aXJ0dWFsKSk7CiAgICBjdXJUaW1lID0gZmFzdHJkdHNjKCk7CiAgICAqdGlja3MrKyA9IHRpbWVfZGlmZihvbGRUaW1lLCBjdXJUaW1lKTsKCiAgICBvbGRUaW1lID0gZmFzdHJkdHNjKCk7CiAgICBtZW1zZXQodmlydHVhbCwgMHhGMCwgYnVmLnNpemUpOwogICAgY3VyVGltZSA9IGZhc3RyZHRzYygpOwogICAgKnRpY2tzKysgPSB0aW1lX2RpZmYob2xkVGltZSwgY3VyVGltZSk7CgogICAgb2xkVGltZSA9IGZhc3RyZHRzYygpOwogICAgbWVtc2V0KHZpcnR1YWwsIDB4MEYsIGJ1Zi5zaXplKTsKICAgIGN1clRpbWUgPSBmYXN0cmR0c2MoKTsKICAgICp0aWNrcysrID0gdGltZV9kaWZmKG9sZFRpbWUsIGN1clRpbWUpOwoKICAgIG9sZFRpbWUgPSBmYXN0cmR0c2MoKTsKICAgIHJlYWRCdWYodmlydHVhbCwgYnVmLnNpemUpOwogICAgY3VyVGltZSA9IGZhc3RyZHRzYygpOwogICAgKnRpY2tzKysgPSB0aW1lX2RpZmYob2xkVGltZSwgY3VyVGltZSk7CgogICAgQk1fQ0tGQVRBTChkcm1CT1VubWFwKGN0eC0+ZHJtRkQsICZidWYpKTsKCiAgICBCTV9DS0ZBVEFMKGRybUdldExvY2soY3R4LT5kcm1GRCwgY3R4LT5od0NvbnRleHQsIDApKTsKICAgIG9sZFRpbWUgPSBmYXN0cmR0c2MoKTsKICAgIEJNX0NLRkFUQUwoZHJtQk9WYWxpZGF0ZShjdHgtPmRybUZELCAmYnVmLAoJICAgIERSTV9CT19GTEFHX01FTV9MT0NBTCwgRFJNX0JPX01BU0tfTUVNLCBEUk1fQk9fSElOVF9ET05UX0ZFTkNFKSk7CiAgICBjdXJUaW1lID0gZmFzdHJkdHNjKCk7CiAgICAqdGlja3MrKyA9IHRpbWVfZGlmZihvbGRUaW1lLCBjdXJUaW1lKTsKCiAgICAvKgogICAgICogVGVzdCBjYWNoZWQgYnVmZmVycyBvYmplY3RzLgogICAgICovCgogICAgb2xkVGltZSA9IGZhc3RyZHRzYygpOwogICAgcmV0ID0gZHJtQk9WYWxpZGF0ZShjdHgtPmRybUZELCAmYnVmLAoJRFJNX0JPX0ZMQUdfTUVNX1RUIHwgRFJNX0JPX0ZMQUdfQklORF9DQUNIRUQsCglEUk1fQk9fTUFTS19NRU0gfCBEUk1fQk9fRkxBR19CSU5EX0NBQ0hFRCwgRFJNX0JPX0hJTlRfRE9OVF9GRU5DRSk7CiAgICBjdXJUaW1lID0gZmFzdHJkdHNjKCk7CiAgICBkcm1VbmxvY2soY3R4LT5kcm1GRCwgY3R4LT5od0NvbnRleHQpOwoKICAgIGlmIChyZXQpIHsKCXByaW50ZigiQ291bGRuJ3QgYmluZCBjYWNoZWQuIFByb2JhYmx5IG5vIHN1cHBvcnRcbiIpOwoJQk1fQ0tGQVRBTChkcm1CT0Rlc3Ryb3koY3R4LT5kcm1GRCwgJmJ1ZikpOwoJcmV0dXJuIDE7CiAgICB9CiAgICAqdGlja3MrKyA9IHRpbWVfZGlmZihvbGRUaW1lLCBjdXJUaW1lKTsKCiAgICBvbGRUaW1lID0gZmFzdHJkdHNjKCk7CiAgICBCTV9DS0ZBVEFMKGRybUJPTWFwKGN0eC0+ZHJtRkQsICZidWYsCgkgICAgRFJNX0JPX0ZMQUdfUkVBRCB8IERSTV9CT19GTEFHX1dSSVRFLCAwLCAmdmlydHVhbCkpOwoKICAgIGN1clRpbWUgPSBmYXN0cmR0c2MoKTsKICAgICp0aWNrcysrID0gdGltZV9kaWZmKG9sZFRpbWUsIGN1clRpbWUpOwoKICAgIG9sZFRpbWUgPSBmYXN0cmR0c2MoKTsKICAgIG1lbXNldCh2aXJ0dWFsLCAweEYwLCBidWYuc2l6ZSk7CiAgICBjdXJUaW1lID0gZmFzdHJkdHNjKCk7CiAgICAqdGlja3MrKyA9IHRpbWVfZGlmZihvbGRUaW1lLCBjdXJUaW1lKTsKCiAgICBvbGRUaW1lID0gZmFzdHJkdHNjKCk7CiAgICBtZW1zZXQodmlydHVhbCwgMHgwRiwgYnVmLnNpemUpOwogICAgY3VyVGltZSA9IGZhc3RyZHRzYygpOwogICAgKnRpY2tzKysgPSB0aW1lX2RpZmYob2xkVGltZSwgY3VyVGltZSk7CgogICAgb2xkVGltZSA9IGZhc3RyZHRzYygpOwogICAgcmVhZEJ1Zih2aXJ0dWFsLCBidWYuc2l6ZSk7CiAgICBjdXJUaW1lID0gZmFzdHJkdHNjKCk7CiAgICAqdGlja3MrKyA9IHRpbWVfZGlmZihvbGRUaW1lLCBjdXJUaW1lKTsKCiAgICBCTV9DS0ZBVEFMKGRybUJPVW5tYXAoY3R4LT5kcm1GRCwgJmJ1ZikpOwogICAgQk1fQ0tGQVRBTChkcm1CT0Rlc3Ryb3koY3R4LT5kcm1GRCwgJmJ1ZikpOwoKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgdm9pZAp0ZXN0QUdQKFRpbnlEUklDb250ZXh0ICogY3R4KQp7CiAgICB1bnNpZ25lZCBsb25nIHRpY2tzWzEyOF0sICpwVGlja3M7CiAgICB1bnNpZ25lZCBsb25nIHNpemUgPSA0MDk2ICogMTAyNDsKICAgIGludCByZXQ7CgogICAgcmV0ID0gYmVuY2htYXJrQnVmZmVyKGN0eCwgc2l6ZSwgdGlja3MpOwogICAgaWYgKHJldCA8IDApIHsKCWZwcmludGYoc3RkZXJyLCAiQnVmZmVyIGVycm9yICVzXG4iLCBzdHJlcnJvcigtcmV0KSk7CglyZXR1cm47CiAgICB9CiAgICBwVGlja3MgPSB0aWNrczsKCiAgICBwcmludGYoIkJ1ZmZlciBzaXplICVkIGJ5dGVzXG4iLCBzaXplKTsKICAgIHByaW50ZigiU3lzdGVtIG1lbW9yeSB0aW1pbmdzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKICAgIHByaW50ZigiQ3JlYXRpb24gdG9vayAgICAgICAgICAgICUxMmx1IHRpY2tzXG4iLCAqcFRpY2tzKyspOwogICAgcHJpbnRmKCJNYXBwaW5nIHRvb2sgICAgICAgICAgICAgJTEybHUgdGlja3NcbiIsICpwVGlja3MrKyk7CiAgICBwcmludGYoIldyaXRpbmcgdG9vayAgICAgICAgICAgICAlMTJsdSB0aWNrc1xuIiwgKnBUaWNrcysrKTsKICAgIHByaW50ZigiV3JpdGluZyBBZ2FpbiB0b29rICAgICAgICUxMmx1IHRpY2tzXG4iLCAqcFRpY2tzKyspOwogICAgcHJpbnRmKCJSZWFkaW5nIHRvb2sgICAgICAgICAgICAgJTEybHUgdGlja3NcbiIsICpwVGlja3MrKyk7CiAgICBwcmludGYoIlVubWFwcGluZyB0b29rICAgICAgICAgICAlMTJsdSB0aWNrc1xuIiwgKnBUaWNrcysrKTsKCiAgICBwcmludGYoIlxuVFQgTWVtb3J5IHRpbWluZ3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKICAgIHByaW50ZigiTW92aW5nIHRvIFRUIHRvb2sgICAgICAgICUxMmx1IHRpY2tzXG4iLCAqcFRpY2tzKyspOwogICAgcHJpbnRmKCJNYXBwaW5nIGluIFRUIHRvb2sgICAgICAgJTEybHUgdGlja3NcbiIsICpwVGlja3MrKyk7CiAgICBwcmludGYoIldyaXRpbmcgdG8gVFQgdG9vayAgICAgICAlMTJsdSB0aWNrc1xuIiwgKnBUaWNrcysrKTsKICAgIHByaW50ZigiV3JpdGluZyBhZ2FpbiB0byBUVCB0b29rICUxMmx1IHRpY2tzXG4iLCAqcFRpY2tzKyspOwogICAgcHJpbnRmKCJSZWFkaW5nIGZyb20gVFQgdG9vayAgICAgJTEybHUgdGlja3NcbiIsICpwVGlja3MrKyk7CiAgICBwcmludGYoIk1vdmluZyB0byBzeXN0ZW0gdG9vayAgICAlMTJsdSB0aWNrc1xuIiwgKnBUaWNrcysrKTsKCiAgICBpZiAocmV0ID09IDEpCglyZXR1cm47CgogICAgcHJpbnRmKCJcbkNhY2hlZCBUVCBNZW1vcnkgdGltaW5ncyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CiAgICBwcmludGYoIk1vdmluZyB0byBDVFQgdG9vayAgICAgICAlMTJsdSB0aWNrc1xuIiwgKnBUaWNrcysrKTsKICAgIHByaW50ZigiTWFwcGluZyBpbiBDVFQgdG9vayAgICAgICUxMmx1IHRpY2tzXG4iLCAqcFRpY2tzKyspOwogICAgcHJpbnRmKCJXcml0aW5nIHRvIENUVCB0b29rICAgICAgJTEybHUgdGlja3NcbiIsICpwVGlja3MrKyk7CiAgICBwcmludGYoIlJlLXdyaXRpbmcgdG8gQ1RUIHRvb2sgICAlMTJsdSB0aWNrc1xuIiwgKnBUaWNrcysrKTsKICAgIHByaW50ZigiUmVhZGluZyBmcm9tIENUVCB0b29rICAgICUxMmx1IHRpY2tzXG4iLCAqcFRpY2tzKyspOwogICAgcHJpbnRmKCJcblxuIik7Cn0KCmludAptYWluKCkKewogICAgaW50IHJldCwgc2NyZWVuLCBpc0NhcGFibGU7CiAgICBjaGFyICpkaXNwbGF5TmFtZSA9ICI6MCI7CiAgICBUaW55RFJJQ29udGV4dCBjdHg7CiAgICB1bnNpZ25lZCBtYWdpYzsKCiAgICBjdHguc2NyZWVuID0gMDsKICAgIGN0eC5zdGF0ZSA9IGhhdmVOb3RoaW5nOwogICAgY3R4LmRpc3BsYXkgPSBYT3BlbkRpc3BsYXkoZGlzcGxheU5hbWUpOwogICAgaWYgKCFjdHguZGlzcGxheSkgewoJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBkaXNwbGF5XG4iKTsKCXJldHVybiByZWxlYXNlQ29udGV4dCgmY3R4KTsKICAgIH0KICAgIGN0eC5zdGF0ZSA9IGhhdmVEaXNwbGF5OwoKICAgIHJldCA9Cgl1bmlEUklRdWVyeURpcmVjdFJlbmRlcmluZ0NhcGFibGUoY3R4LmRpc3BsYXksIGN0eC5zY3JlZW4sCgkmaXNDYXBhYmxlKTsKICAgIGlmICghcmV0IHx8ICFpc0NhcGFibGUpIHsKCWZwcmludGYoc3RkZXJyLCAiTm8gRFJJIG9uIHRoaXMgZGlzcGxheTpzY2VlblxuIik7CglyZXR1cm4gcmVsZWFzZUNvbnRleHQoJmN0eCk7CiAgICB9CgogICAgaWYgKCF1bmlEUklPcGVuQ29ubmVjdGlvbihjdHguZGlzcGxheSwgY3R4LnNjcmVlbiwgJmN0eC5zQXJlYU9mZnNldCwKCSAgICAmY3R4LmN1ckJ1c0lEKSkgewoJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBEUkkgY29ubmVjdGlvbi5cbiIpOwoJcmV0dXJuIHJlbGVhc2VDb250ZXh0KCZjdHgpOwogICAgfQogICAgY3R4LnN0YXRlID0gaGF2ZUNvbm5lY3Rpb247CgogICAgaWYgKCF1bmlEUklHZXRDbGllbnREcml2ZXJOYW1lKGN0eC5kaXNwbGF5LCBjdHguc2NyZWVuLAoJICAgICZjdHguZGR4RHJpdmVyTWFqb3IsICZjdHguZGR4RHJpdmVyTWlub3IsCgkgICAgJmN0eC5kZHhEcml2ZXJQYXRjaCwgJmN0eC5kcml2ZXJOYW1lKSkgewoJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZ2V0IERSSSBkcml2ZXIgbmFtZS5cbiIpOwoJcmV0dXJuIHJlbGVhc2VDb250ZXh0KCZjdHgpOwogICAgfQogICAgY3R4LnN0YXRlID0gaGF2ZURyaXZlck5hbWU7CgogICAgaWYgKCF1bmlEUklHZXREZXZpY2VJbmZvKGN0eC5kaXNwbGF5LCBjdHguc2NyZWVuLAoJICAgICZjdHguZmJIYW5kbGUsICZjdHguZmJPcmlnaW4sICZjdHguZmJTaXplLAoJICAgICZjdHguZmJTdHJpZGUsICZjdHguZHJpUHJpdlNpemUsICZjdHguZHJpUHJpdikpIHsKCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGdldCBEUkkgZGV2aWNlIGluZm8uXG4iKTsKCXJldHVybiByZWxlYXNlQ29udGV4dCgmY3R4KTsKICAgIH0KICAgIGN0eC5zdGF0ZSA9IGhhdmVEcml2ZXJOYW1lOwoKICAgIGlmICgoY3R4LmRybUZEID0gZHJtT3BlbihOVUxMLCBjdHguY3VyQnVzSUQpKSA8IDApIHsKCXBlcnJvcigiRFJNIERldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIik7CglyZXR1cm4gcmVsZWFzZUNvbnRleHQoJmN0eCk7CiAgICB9CiAgICBjdHguc3RhdGUgPSBoYXZlRFJNOwoKICAgIGRybUdldE1hZ2ljKGN0eC5kcm1GRCwgJm1hZ2ljKTsKICAgIGlmICghdW5pRFJJQXV0aENvbm5lY3Rpb24oY3R4LmRpc3BsYXksIGN0eC5zY3JlZW4sIG1hZ2ljKSkgewoJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZ2V0IFggc2VydmVyIHRvIGF1dGhlbnRpY2F0ZSB1cy5cbiIpOwoJcmV0dXJuIHJlbGVhc2VDb250ZXh0KCZjdHgpOwogICAgfQoKICAgIHJldCA9IFhNYXRjaFZpc3VhbEluZm8oY3R4LmRpc3BsYXksIGN0eC5zY3JlZW4sIDI0LCBUcnVlQ29sb3IsCgkmY3R4LnZpc3VhbEluZm8pOwogICAgaWYgKCFyZXQpIHsKCXJldCA9IFhNYXRjaFZpc3VhbEluZm8oY3R4LmRpc3BsYXksIGN0eC5zY3JlZW4sIDE2LCBUcnVlQ29sb3IsCgkgICAgJmN0eC52aXN1YWxJbmZvKTsKCWlmICghcmV0KSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZmluZCBhIG1hdGNoaW5nIHZpc3VhbC5cbiIpOwoJICAgIHJldHVybiByZWxlYXNlQ29udGV4dCgmY3R4KTsKCX0KICAgIH0KCiAgICBpZiAoIXVuaURSSUNyZWF0ZUNvbnRleHQoY3R4LmRpc3BsYXksIGN0eC5zY3JlZW4sIGN0eC52aXN1YWxJbmZvLnZpc3VhbCwKCSAgICAmY3R4LmlkLCAmY3R4Lmh3Q29udGV4dCkpIHsKCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGNyZWF0ZSBEUkkgY29udGV4dC5cbiIpOwoJcmV0dXJuIHJlbGVhc2VDb250ZXh0KCZjdHgpOwogICAgfQogICAgY3R4LnN0YXRlID0gaGF2ZUNvbnRleHQ7CgogICAgdGVzdEFHUCgmY3R4KTsKCiAgICByZWxlYXNlQ29udGV4dCgmY3R4KTsKICAgIHByaW50ZigiVGVybWluYXRpbmcgbm9ybWFsbHlcbiIpOwogICAgcmV0dXJuIDA7Cn0K