LyoKICogc25tcF92YXJfcm91dGUuYyAtIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5hbWVkIHZhcmlhYmxlLgogKgogKgogKi8KLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCglDb3B5cmlnaHQgMTk4OCwgMTk4OSBieSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQoJQ29weXJpZ2h0IDE5ODkJVEdWLCBJbmNvcnBvcmF0ZWQKCgkJICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgYW5kIFRHViBub3QgYmUgdXNlZAppbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCndpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KCkNNVSBBTkQgVEdWIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLApJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCkVWRU5UIFNIQUxMIENNVSBPUiBUR1YgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgpVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgpQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qCiAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgY29weXJpZ2h0ZWQgYnk6CiAqIENvcHlyaWdodCCpIDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zIHNwZWNpZmllZCBpbiB0aGUgQ09QWUlORyBmaWxlCiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhlIE5ldC1TTk1QIHBhY2thZ2UuCiAqLwoKLyoKICogYWRkaXRpb25zLCBmaXhlcyBhbmQgZW5oYW5jZW1lbnRzIGZvciBMaW51eCBieSBFcmlrIFNjaG9lbmZlbGRlcgogKiAoc2Nob2VuZnJAaWJyLmNzLnR1LWJzLmRlKSAxOTk0LzE5OTUuCiAqIExpbnV4IGFkZGl0aW9ucyB0YWtlbiBmcm9tIENNVSB0byBVQ0Qgc3RhY2sgYnkgSmVubmlmZXIgQnJheSBvZiBPcmlnaW4KICogKGpicmF5QG9yaWdpbi1hdC5jby51aykgMTk5NwogKiBTdXBwb3J0IGZvciBzeXNjdGwoe0NUTF9ORVQsUEZfUk9VVEUsLi4uKSBieSBTaW1vbiBMZWluZW4KICogKHNpbW9uQHN3aXRjaC5jaCkgMTk5NwogKi8KCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KCiNpbmNsdWRlICJyb3V0ZV9oZWFkZXJzLmgiCiNkZWZpbmUgQ0FDSEVfVElNRSAoMTIwKSAgICAgICAgLyogU2Vjb25kcyAqLwoKI2lmICFkZWZpbmVkKE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwpCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L25ldC1zbm1wLWFnZW50LWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9hdXRvX25saXN0Lmg+CiNpbmNsdWRlIDxuZXQtc25tcC9kYXRhX2FjY2Vzcy9pbnRlcmZhY2UuaD4KCiNpbmNsdWRlICJpcC5oIgojaW5jbHVkZSAia2VybmVsLmgiCiNpbmNsdWRlICJpbnRlcmZhY2VzLmgiCiNpbmNsdWRlICJzdHJ1Y3QuaCIKCiNpZm5kZWYgIE1JTgojZGVmaW5lICBNSU4oYSxiKSAgICAgICAgICAgICAgICAgICAgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKI2VuZGlmCgojaWZkZWYgaHB1eDExCiNpbmNsdWRlIDxzeXMvbWliLmg+CiNpbmNsdWRlIDxuZXRpbmV0L21pYl9rZXJuLmg+CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eCAqLwoKZXh0ZXJuIFdyaXRlTWV0aG9kIHdyaXRlX3J0ZTsKCiNpZiAhZGVmaW5lZCAoV0lOMzIpICYmICFkZWZpbmVkIChjeWd3aW4pCgojaWZkZWYgVVNFX1NZU0NUTF9ST1VURV9EVU1QCgpzdGF0aWMgdm9pZCAgICAgUm91dGVfU2Nhbl9SZWxvYWQodm9pZCk7CgpzdGF0aWMgdW5zaWduZWQgY2hhciAqYWxsX3JvdXRlcyA9IDA7CnN0YXRpYyB1bnNpZ25lZCBjaGFyICphbGxfcm91dGVzX2VuZDsKc3RhdGljIHNpemVfdCAgIGFsbF9yb3V0ZXNfc2l6ZTsKCmV4dGVybiBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmdldF9hZGRyZXNzKGNvbnN0IHZvaWQgKiwgaW50LCBpbnQpOwpleHRlcm4gY29uc3Qgc3RydWN0IGluX2FkZHIgKmdldF9pbl9hZGRyZXNzKGNvbnN0IHZvaWQgKiwgaW50LCBpbnQpOwoKLyoKICogdmFyX2lwUm91dGVFbnRyeSguLi4KICogQXJndW1lbnRzOgogKiB2cCAgICAgICAgICAgSU4gICAgICAtIHBvaW50ZXIgdG8gdmFyaWFibGUgZW50cnkgdGhhdCBwb2ludHMgaGVyZQogKiBuYW1lICAgICAgICAgIElOL09VVCAgLSBJTi9uYW1lIHJlcXVlc3RlZCwgT1VUL25hbWUgZm91bmQKICogbGVuZ3RoICAgICAgICBJTi9PVVQgIC0gbGVuZ3RoIG9mIElOL09VVCBvaWQncyAKICogZXhhY3QgICAgICAgICBJTiAgICAgIC0gVFJVRSBpZiBhbiBleGFjdCBtYXRjaCB3YXMgcmVxdWVzdGVkCiAqIHZhcl9sZW4gICAgICAgT1VUICAgICAtIGxlbmd0aCBvZiB2YXJpYWJsZSBvciAwIGlmIGZ1bmN0aW9uIHJldHVybmVkCiAqIHdyaXRlX21ldGhvZCAgb3V0ICAgICAtIHBvaW50ZXIgdG8gZnVuY3Rpb24gdG8gc2V0IHZhcmlhYmxlLCBvdGhlcndpc2UgMAogKi8KdV9jaGFyICAgICAgICAgKgp2YXJfaXBSb3V0ZUVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIC8qCiAgICAgKiBvYmplY3QgaWRlbnRpZmllciBpcyBvZiBmb3JtOgogICAgICogMS4zLjYuMS4yLjEuNC4yMS4xLjEuQS5CLkMuRCwgIHdoZXJlIEEuQi5DLkQgaXMgSVAgYWRkcmVzcy4KICAgICAqIElQQUREUiBzdGFydHMgYXQgb2Zmc2V0IDEwLgogICAgICovCiAgICBzdHJ1Y3QgcnRfbXNnaGRyICpydHAsICpzYXZlUnRwID0gMDsKICAgIHJlZ2lzdGVyIGludCAgICBTYXZlX1ZhbGlkLCByZXN1bHQ7CiAgICBzdGF0aWMgaW50ICAgICAgc2F2ZU5hbWVMZW4gPSAwLCBzYXZlRXhhY3QgPSAwOwogICAgc3RhdGljIG9pZCAgICAgIHNhdmVOYW1lW01BWF9PSURfTEVOXSwgQ3VycmVudFtNQVhfT0lEX0xFTl07CiAgICB1X2NoYXIgICAgICAgICAqY3A7CiAgICB1X2NoYXIgICAgICAgICAqYXA7CiAgICBvaWQgICAgICAgICAgICAqb3A7CiAgICBzdGF0aWMgaW5fYWRkcl90IGFkZHJfcmV0OwoKICAgICp3cml0ZV9tZXRob2QgPSBOVUxMOyAgLyogd3JpdGVfcnRlOyAgWFhYOiAgU0VUIHN1cHBvcnQgbm90IHJlYWxseSBpbXBsZW1lbnRlZCAqLwoKI2lmIDAKICAvKiogCiAgKiogdGhpcyBvcHRpbWlzYXRpb24gZmFpbHMsIGlmIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgcm91dGUgYXZhaWwuCiAgKiogaXQgaXMgYSB2ZXJ5IHNwZWNpYWwgY2FzZSwgYnV0IGJldHRlciBsZWF2ZSBpdCBvdXQgLi4uCiAgKiovCiNpZiAwCiAgICBpZiAocnRzaXplIDw9IDEpCiAgICAgICAgU2F2ZV9WYWxpZCA9IDA7CiAgICBlbHNlCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMCAqLwogICAgICAgIC8qCiAgICAgICAgICogIE9QVElNSVpBVElPTjoKICAgICAgICAgKgogICAgICAgICAqICBJZiB0aGUgbmFtZSB3YXMgdGhlIHNhbWUgYXMgdGhlIGxhc3QgbmFtZSwgd2l0aCB0aGUgcG9zc2libGUKICAgICAgICAgKiAgZXhjZXB0aW9uIG9mIHRoZSBbOV10aCB0b2tlbiwgdGhlbiBkb24ndCByZWFkIHRoZSByb3V0aW5nIHRhYmxlCiAgICAgICAgICoKICAgICAgICAgKi8KCiAgICBpZiAoKHNhdmVOYW1lTGVuID09ICpsZW5ndGgpICYmIChzYXZlRXhhY3QgPT0gZXhhY3QpKSB7CiAgICAgICAgcmVnaXN0ZXIgaW50ICAgIHRlbXAgPSBuYW1lWzldOwogICAgICAgIG5hbWVbOV0gPSAwOwogICAgICAgIFNhdmVfVmFsaWQgPQogICAgICAgICAgICAoc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBzYXZlTmFtZSwgc2F2ZU5hbWVMZW4pID09IDApOwogICAgICAgIG5hbWVbOV0gPSB0ZW1wOwogICAgfSBlbHNlCiAgICAgICAgU2F2ZV9WYWxpZCA9IDA7CgogICAgaWYgKFNhdmVfVmFsaWQgJiYgc2F2ZVJ0cCkgewogICAgICAgIHJlZ2lzdGVyIGludCAgICB0ZW1wID0gbmFtZVs5XTsgLyogRml4IHVwICdsb3dlc3QnIGZvdW5kIGVudHJ5ICovCiAgICAgICAgbWVtY3B5KChjaGFyICopIG5hbWUsIChjaGFyICopIEN1cnJlbnQsIDE0ICogc2l6ZW9mKG9pZCkpOwogICAgICAgIG5hbWVbOV0gPSB0ZW1wOwogICAgICAgICpsZW5ndGggPSAxNDsKICAgICAgICBydHAgPSBzYXZlUnRwOwogICAgfSBlbHNlIHsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwICovCiAgICAgICAgLyoKICAgICAgICAgKiBmaWxsIGluIG9iamVjdCBwYXJ0IG9mIG5hbWUgZm9yIGN1cnJlbnQgKGxlc3Mgc2l6ZW9mIGluc3RhbmNlIHBhcnQpIAogICAgICAgICAqLwoKICAgICAgICBtZW1jcHkoKGNoYXIgKikgQ3VycmVudCwgKGNoYXIgKikgdnAtPm5hbWUsCiAgICAgICAgICAgICAgIChpbnQpICh2cC0+bmFtZWxlbikgKiBzaXplb2Yob2lkKSk7CgojaWYgMAogICAgICAgIC8qCiAgICAgICAgICogIE9ubHkgcmVsb2FkIGlmIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgd2lsZGNhcmQKICAgICAgICAgKi8KICAgICAgICBpZiAoKmxlbmd0aCA8IDE0KSB7CiAgICAgICAgICAgIFJvdXRlX1NjYW5fUmVsb2FkKCk7CiAgICAgICAgfQojZWxzZQogICAgICAgIFJvdXRlX1NjYW5fUmVsb2FkKCk7CiNlbmRpZgogICAgICAgIGZvciAoYXAgPSBhbGxfcm91dGVzOyBhcCA8IGFsbF9yb3V0ZXNfZW5kOyBhcCArPSBydHAtPnJ0bV9tc2dsZW4pIHsKICAgICAgICAgICAgcnRwID0gKHN0cnVjdCBydF9tc2doZHIgKikgYXA7CiAgICAgICAgICAgIGlmIChydHAtPnJ0bV90eXBlID09IDApCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgaWYgKHJ0cC0+cnRtX3ZlcnNpb24gIT0gUlRNX1ZFUlNJT04pIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICAgICAicm91dGluZyBzb2NrZXQgbWVzc2FnZSB2ZXJzaW9uIG1pc21hdGNoICglZCBpbnN0ZWFkIG9mICVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cC0+cnRtX3ZlcnNpb24sIFJUTV9WRVJTSU9OKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChydHAtPnJ0bV90eXBlICE9IFJUTV9HRVQpIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICAgICAicm91dGluZyBzb2NrZXQgcmV0dXJuZWQgbWVzc2FnZSBvdGhlciB0aGFuIEdFVCAoJWQpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgcnRwLT5ydG1fdHlwZSk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShydHAtPnJ0bV9hZGRycyAmIFJUQV9EU1QpKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGNwID0gKHVfY2hhciAqKSBnZXRfaW5fYWRkcmVzcygoc3RydWN0IHNvY2thZGRyICopIChydHAgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cC0+cnRtX2FkZHJzLCBSVEFfRFNUKTsKICAgICAgICAgICAgaWYgKGNwID09IE5VTEwpCiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAgICAgICAgIG9wID0gQ3VycmVudCArIDEwOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwoKICAgICAgICAgICAgcmVzdWx0ID0gc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBDdXJyZW50LCAxNCk7CiAgICAgICAgICAgIGlmICgoZXhhY3QgJiYgKHJlc3VsdCA9PSAwKSkgfHwgKCFleGFjdCAmJiAocmVzdWx0IDwgMCkpKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChhcCA+PSBhbGxfcm91dGVzX2VuZCB8fCBydHAtPnJ0bV90eXBlID09IDApCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIC8qCiAgICAgICAgICogIFNhdmUgaW4gdGhlICdjYWNoZScKICAgICAgICAgKi8KICAgICAgICBtZW1jcHkoKGNoYXIgKikgc2F2ZU5hbWUsIChjaGFyICopIG5hbWUsCiAgICAgICAgICAgICAgIFNOTVBfTUlOKCpsZW5ndGgsIE1BWF9PSURfTEVOKSAqIHNpemVvZihvaWQpKTsKICAgICAgICBzYXZlTmFtZVs5XSA9ICdcMCc7CiAgICAgICAgc2F2ZU5hbWVMZW4gPSAqbGVuZ3RoOwogICAgICAgIHNhdmVFeGFjdCA9IGV4YWN0OwogICAgICAgIHNhdmVSdHAgPSBydHA7CiAgICAgICAgLyoKICAgICAgICAgKiAgUmV0dXJuIHRoZSBuYW1lCiAgICAgICAgICovCiAgICAgICAgbWVtY3B5KChjaGFyICopIG5hbWUsIChjaGFyICopIEN1cnJlbnQsIDE0ICogc2l6ZW9mKG9pZCkpOwogICAgICAgICpsZW5ndGggPSAxNDsKI2lmIDAKICAgIH0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwICovCgogICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZ19yZXR1cm4pOwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIElQUk9VVEVERVNUOgogICAgCSp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBnZXRfaW5fYWRkcmVzcygoc3RydWN0IHNvY2thZGRyICopIChydHAgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHAtPnJ0bV9hZGRycywgUlRBX0RTVCk7CiAgICBjYXNlIElQUk9VVEVJRklOREVYOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgcnRwLT5ydG1faW5kZXg7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzE6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAocnRwLT5ydG1fZmxhZ3MgJiBSVEZfVVApID8gMSA6IDA7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzI6CiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IC0xOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUMzOgojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAtMTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDNDoKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gLTE7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzU6CiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IC0xOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVORVhUSE9QOgogICAgCSp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKICAgIAlyZXR1cm4gKHVfY2hhciAqKSBnZXRfaW5fYWRkcmVzcygoc3RydWN0IHNvY2thZGRyICopIChydHAgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHAtPnJ0bV9hZGRycywgUlRBX0dBVEVXQVkpOwogICAgY2FzZSBJUFJPVVRFVFlQRToKICAgICAgICBpZiAocnRwLT5ydG1fZmxhZ3MgJiBSVEZfVVApIHsKICAgICAgICAgICAgaWYgKHJ0cC0+cnRtX2ZsYWdzICYgUlRGX0dBVEVXQVkpIHsKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gNDsgICAgICAgIC8qICBpbmRpcmVjdCg0KSAgKi8KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMzsgICAgICAgIC8qICBkaXJlY3QoMykgICovCiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsb25nX3JldHVybiA9IDI7ICAgIC8qICBpbnZhbGlkKDIpICAqLwogICAgICAgIH0KICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFUFJPVE86CiAgICAgICAgbG9uZ19yZXR1cm4gPSAocnRwLT5ydG1fZmxhZ3MgJiBSVEZfRFlOQU1JQykKICAgICAgICAgICAgPyAxMCA6IChydHAtPnJ0bV9mbGFncyAmIFJURl9TVEFUSUMpCiAgICAgICAgICAgID8gMiA6IChydHAtPnJ0bV9mbGFncyAmIFJURl9EWU5BTUlDKSA/IDQgOiAxOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVBR0U6CiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IDA7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1BU0s6CiAgICAJKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOyAgIAkgICAgIAogICAgICAgIGlmIChydHAtPnJ0bV9mbGFncyAmIFJURl9IT1NUKSB7CiAgICAgICAgICAgIGFkZHJfcmV0ID0gMHgwMDAwMDAwMTsKICAgICAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBnZXRfaW5fYWRkcmVzcygoc3RydWN0IHNvY2thZGRyICopIChydHAgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRwLT5ydG1fYWRkcnMsIFJUQV9ORVRNQVNLKTsKICAgICAgICB9CiAgICBjYXNlIElQUk9VVEVJTkZPOgogICAgICAgICp2YXJfbGVuID0gbnVsbE9pZExlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBudWxsT2lkOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2lwUm91dGVFbnRyeVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBVU0VfU1lTQ1RMX1JPVVRFX0RVTVAgKi8KCiNpZmRlZiBocHV4MTEKc3RhdGljIGludCAgICAgIHJ0c2l6ZSA9IDA7CnN0YXRpYyBtaWJfaXBSb3V0ZUVudCAqcnQgPSAobWliX2lwUm91dGVFbnQgKikgMDsKc3RhdGljIHZvaWQgICAgIFJvdXRlX1NjYW5fUmVsb2FkKHZvaWQpOwojZWxpZiAhZGVmaW5lZChzb2xhcmlzMikKc3RhdGljIFJURU5UUlkgKipydGhlYWQgPSBOVUxMOwpzdGF0aWMgaW50ICAgICAgcnRzaXplID0gMCwgcnRhbGxvY2F0ZSA9IDA7CgpzdGF0aWMgdm9pZCAgICAgUm91dGVfU2Nhbl9SZWxvYWQodm9pZCk7CgpSVEVOVFJZICoqbmV0c25tcF9nZXRfcm91dGVzKHNpemVfdCAqc2l6ZSkgewogICAgUm91dGVfU2Nhbl9SZWxvYWQoKTsKICAgIGlmIChzaXplKQogICAgICAgICpzaXplID0gcnRzaXplOwogICAgcmV0dXJuIHJ0aGVhZDsKfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwoKI2lmICEoZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChzb2xhcmlzMikgfHwgZGVmaW5lZChocHV4MTEpKSAmJiBkZWZpbmVkKFJUSE9TVF9TWU1CT0wpICYmIGRlZmluZWQoUlRORVRfU1lNQk9MKQojZGVmaW5lIE5VTV9ST1VURV9TWU1CT0xTIDIKc3RhdGljIGNoYXIgICAgKnJvdXRlX3N5bWJvbHNbXSA9IHsKICAgIFJUSE9TVF9TWU1CT0wsCiAgICBSVE5FVF9TWU1CT0wKfTsKI2VuZGlmCiNlbmRpZgoKI2lmZGVmIFVTRV9TWVNDVExfUk9VVEVfRFVNUAoKdm9pZAppbml0X3Zhcl9yb3V0ZSh2b2lkKQp7CiNpZmRlZiBzb2xhcmlzMgogICAgaW5pdF9rZXJuZWxfc3Vub3M1KCk7CiNlbmRpZgp9CgpzdGF0aWMgdm9pZApSb3V0ZV9TY2FuX1JlbG9hZCh2b2lkKQp7CiAgICBzaXplX3QgICAgICAgICAgc2l6ZSA9IDA7CiAgICBpbnQgICAgICAgICAgICAgbmFtZVtdID0geyBDVExfTkVULCBQRl9ST1VURSwgMCwgMCwgTkVUX1JUX0RVTVAsIDAgfTsKCiAgICBpZiAoc3lzY3RsKG5hbWUsIHNpemVvZihuYW1lKSAvIHNpemVvZihpbnQpLCAwLCAmc2l6ZSwgMCwgMCkgPT0gLTEpIHsKICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAic3lzY3RsKENUTF9ORVQsUEZfUk9VVEUsMCwwLE5FVF9SVF9EVU1QLDApXG4iKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGFsbF9yb3V0ZXMgPT0gMCB8fCBhbGxfcm91dGVzX3NpemUgPCBzaXplKSB7CiAgICAgICAgICAgIGlmIChhbGxfcm91dGVzICE9IDApIHsKICAgICAgICAgICAgICAgIGZyZWUoYWxsX3JvdXRlcyk7CiAgICAgICAgICAgICAgICBhbGxfcm91dGVzID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKGFsbF9yb3V0ZXMgPSBtYWxsb2Moc2l6ZSkpID09IDApIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICAgICAib3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIHJvdXRlIHRhYmxlXG4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhbGxfcm91dGVzX3NpemUgPSBzaXplOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNpemUgPSBhbGxfcm91dGVzX3NpemU7CiAgICAgICAgfQogICAgICAgIGlmIChzeXNjdGwobmFtZSwgc2l6ZW9mKG5hbWUpIC8gc2l6ZW9mKGludCksCiAgICAgICAgICAgICAgICAgICBhbGxfcm91dGVzLCAmc2l6ZSwgMCwgMCkgPT0gLTEpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgInN5c2N0bChDVExfTkVULFBGX1JPVVRFLDAsMCxORVRfUlRfRFVNUCwwKVxuIik7CiAgICAgICAgfQogICAgICAgIGFsbF9yb3V0ZXNfZW5kID0gYWxsX3JvdXRlcyArIHNpemU7CiAgICB9Cn0KCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IFVTRV9TWVNDVExfUk9VVEVfRFVNUCAqLwoKdm9pZAppbml0X3Zhcl9yb3V0ZSh2b2lkKQp7CiNpZmRlZiBSVFRBQkxFU19TWU1CT0wKICAgIGF1dG9fbmxpc3QoUlRUQUJMRVNfU1lNQk9MLCAwLCAwKTsKI2VuZGlmCiNpZmRlZiBSVEhBU0hTSVpFX1NZTUJPTAogICAgYXV0b19ubGlzdChSVEhBU0hTSVpFX1NZTUJPTCwgMCwgMCk7CiNlbmRpZgojaWZkZWYgUlRIT1NUX1NZTUJPTAogICAgYXV0b19ubGlzdChSVEhPU1RfU1lNQk9MLCAwLCAwKTsKI2VuZGlmCiNpZmRlZiBSVE5FVF9TWU1CT0wKICAgIGF1dG9fbmxpc3QoUlRORVRfU1lNQk9MLCAwLCAwKTsKI2VuZGlmCn0KCiNpZm5kZWYgc29sYXJpczIKCiNpZiBORUVEX0tMR0VUU0EKc3RhdGljIHVuaW9uIHsKICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CiAgICB1X3Nob3J0ICAgICAgICAgZGF0YVsxMjhdOwp9IGtsZ2V0c2F0bXA7CgpzdHJ1Y3Qgc29ja2FkZHJfaW4gKgprbGdldHNhKHN0cnVjdCBzb2NrYWRkcl9pbiAqZHN0KQp7CiAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChkc3QsIChjaGFyICopICZrbGdldHNhdG1wLnNpbiwgc2l6ZW9mIGtsZ2V0c2F0bXAuc2luKSkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGlmIChrbGdldHNhdG1wLnNpbi5zaW5fbGVuID4gc2l6ZW9mKGtsZ2V0c2F0bXAuc2luKSkgewogICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGRzdCwgKGNoYXIgKikgJmtsZ2V0c2F0bXAuc2luLCBrbGdldHNhdG1wLnNpbi5zaW5fbGVuKSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFyX3JvdXRlIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAoJmtsZ2V0c2F0bXAuc2luKTsKfQojZW5kaWYKCnVfY2hhciAgICAgICAgICoKdmFyX2lwUm91dGVFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgLyoKICAgICAqIG9iamVjdCBpZGVudGlmaWVyIGlzIG9mIGZvcm06CiAgICAgKiAxLjMuNi4xLjIuMS40LjIxLjEuMS5BLkIuQy5ELCAgd2hlcmUgQS5CLkMuRCBpcyBJUCBhZGRyZXNzLgogICAgICogSVBBRERSIHN0YXJ0cyBhdCBvZmZzZXQgMTAuCiAgICAgKi8KICAgIHJlZ2lzdGVyIGludCAgICBTYXZlX1ZhbGlkLCByZXN1bHQsIFJ0SW5kZXg7CiAgICBzdGF0aWMgaW50ICAgICAgc2F2ZU5hbWVMZW4gPSAwLCBzYXZlRXhhY3QgPSAwLCBzYXZlUnRJbmRleCA9IDA7CiAgICBzdGF0aWMgb2lkICAgICAgc2F2ZU5hbWVbTUFYX09JRF9MRU5dLCBDdXJyZW50W01BWF9PSURfTEVOXTsKICAgIHVfY2hhciAgICAgICAgICpjcDsKICAgIG9pZCAgICAgICAgICAgICpvcDsKICAgIHN0YXRpYyBpbl9hZGRyX3QgYWRkcl9yZXQ7CiNpZiBORUVEX0tMR0VUU0EKICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2E7CiNlbmRpZgojaWYgIWRlZmluZWQobGludXgpICYmICFkZWZpbmVkKGhwdXgxMSkKICAgIHN0cnVjdCBpZm5ldCAgICBydF9pZm5ldDsKICAgIHN0cnVjdCBpbl9pZmFkZHIgcnRfaWZuZXRhZGRyOwojZW5kaWYKCiAgICAqd3JpdGVfbWV0aG9kID0gTlVMTDsgIC8qIHdyaXRlX3J0ZTsgIFhYWDogIFNFVCBzdXBwb3J0IG5vdCByZWFsbHkgaW1wbGVtZW50ZWQgKi8KCiAgICAvKiogCiAgICAgKiogdGhpcyBvcHRpbWlzYXRpb24gZmFpbHMsIGlmIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgcm91dGUgYXZhaWwuCiAgICAgKiogaXQgaXMgYSB2ZXJ5IHNwZWNpYWwgY2FzZSwgYnV0IGJldHRlciBsZWF2ZSBpdCBvdXQgLi4uCiAgICAgKiovCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgc2F2ZU5hbWVMZW4gPSAwOwojZW5kaWYKICAgIGlmIChydHNpemUgPD0gMSkKICAgICAgICBTYXZlX1ZhbGlkID0gMDsKICAgIGVsc2UKICAgICAgICAvKgogICAgICAgICAqICBPUFRJTUlaQVRJT046CiAgICAgICAgICoKICAgICAgICAgKiAgSWYgdGhlIG5hbWUgd2FzIHRoZSBzYW1lIGFzIHRoZSBsYXN0IG5hbWUsIHdpdGggdGhlIHBvc3NpYmxlCiAgICAgICAgICogIGV4Y2VwdGlvbiBvZiB0aGUgWzlddGggdG9rZW4sIHRoZW4gZG9uJ3QgcmVhZCB0aGUgcm91dGluZyB0YWJsZQogICAgICAgICAqCiAgICAgICAgICovCgogICAgaWYgKChzYXZlTmFtZUxlbiA9PSAqbGVuZ3RoKSAmJiAoc2F2ZUV4YWN0ID09IGV4YWN0KSkgewogICAgICAgIHJlZ2lzdGVyIGludCAgICB0ZW1wID0gbmFtZVs5XTsKICAgICAgICBuYW1lWzldID0gMDsKICAgICAgICBTYXZlX1ZhbGlkID0KICAgICAgICAgICAgKHNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgc2F2ZU5hbWUsIHNhdmVOYW1lTGVuKSA9PSAwKTsKICAgICAgICBuYW1lWzldID0gdGVtcDsKICAgIH0gZWxzZQogICAgICAgIFNhdmVfVmFsaWQgPSAwOwoKICAgIGlmIChTYXZlX1ZhbGlkKSB7CiAgICAgICAgcmVnaXN0ZXIgaW50ICAgIHRlbXAgPSBuYW1lWzldOyAvKiBGaXggdXAgJ2xvd2VzdCcgZm91bmQgZW50cnkgKi8KICAgICAgICBtZW1jcHkoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgQ3VycmVudCwgMTQgKiBzaXplb2Yob2lkKSk7CiAgICAgICAgbmFtZVs5XSA9IHRlbXA7CiAgICAgICAgKmxlbmd0aCA9IDE0OwogICAgICAgIFJ0SW5kZXggPSBzYXZlUnRJbmRleDsKICAgIH0gZWxzZSB7CiAgICAgICAgLyoKICAgICAgICAgKiBmaWxsIGluIG9iamVjdCBwYXJ0IG9mIG5hbWUgZm9yIGN1cnJlbnQgKGxlc3Mgc2l6ZW9mIGluc3RhbmNlIHBhcnQpIAogICAgICAgICAqLwoKICAgICAgICBtZW1jcHkoKGNoYXIgKikgQ3VycmVudCwgKGNoYXIgKikgdnAtPm5hbWUsCiAgICAgICAgICAgICAgIChpbnQpICh2cC0+bmFtZWxlbikgKiBzaXplb2Yob2lkKSk7CgojaWYgMAogICAgICAgIC8qCiAgICAgICAgICogIE9ubHkgcmVsb2FkIGlmIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgd2lsZGNhcmQKICAgICAgICAgKi8KICAgICAgICBpZiAoKmxlbmd0aCA8IDE0KSB7CiAgICAgICAgICAgIFJvdXRlX1NjYW5fUmVsb2FkKCk7CiAgICAgICAgfQojZWxzZQogICAgICAgIFJvdXRlX1NjYW5fUmVsb2FkKCk7CiNlbmRpZgogICAgICAgIGZvciAoUnRJbmRleCA9IDA7IFJ0SW5kZXggPCBydHNpemU7IFJ0SW5kZXgrKykgewojaWYgTkVFRF9LTEdFVFNBCiAgICAgICAgICAgIHNhID0ga2xnZXRzYSgoc3RydWN0IHNvY2thZGRyX2luICopIHJ0aGVhZFtSdEluZGV4XS0+cnRfZHN0KTsKICAgICAgICAgICAgY3AgPSAodV9jaGFyICopICYgKHNhLT5zaW5fYWRkci5zX2FkZHIpOwojZWxpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICAgICAgY3AgPSAodV9jaGFyICopICYgcnRbUnRJbmRleF0uRGVzdDsKI2Vsc2UKICAgICAgICAgICAgY3AgPSAodV9jaGFyICopICYKICAgICAgICAgICAgICAgICgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmKHJ0aGVhZFtSdEluZGV4XS0+cnRfZHN0KSktPgogICAgICAgICAgICAgICAgIHNpbl9hZGRyLnNfYWRkcik7CiNlbmRpZgogICAgICAgICAgICBvcCA9IEN1cnJlbnQgKyAxMDsKICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKCiAgICAgICAgICAgIHJlc3VsdCA9IHNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgQ3VycmVudCwgMTQpOwogICAgICAgICAgICBpZiAoKGV4YWN0ICYmIChyZXN1bHQgPT0gMCkpIHx8ICghZXhhY3QgJiYgKHJlc3VsdCA8IDApKSkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoUnRJbmRleCA+PSBydHNpemUpCiAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CiAgICAgICAgLyoKICAgICAgICAgKiAgU2F2ZSBpbiB0aGUgJ2NhY2hlJwogICAgICAgICAqLwogICAgICAgIG1lbWNweSgoY2hhciAqKSBzYXZlTmFtZSwgKGNoYXIgKikgbmFtZSwKICAgICAgICAgICAgICAgU05NUF9NSU4oKmxlbmd0aCwgTUFYX09JRF9MRU4pICogc2l6ZW9mKG9pZCkpOwogICAgICAgIHNhdmVOYW1lWzldID0gMDsKICAgICAgICBzYXZlTmFtZUxlbiA9ICpsZW5ndGg7CiAgICAgICAgc2F2ZUV4YWN0ID0gZXhhY3Q7CiAgICAgICAgc2F2ZVJ0SW5kZXggPSBSdEluZGV4OwogICAgICAgIC8qCiAgICAgICAgICogIFJldHVybiB0aGUgbmFtZQogICAgICAgICAqLwogICAgICAgIG1lbWNweSgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBDdXJyZW50LCAxNCAqIHNpemVvZihvaWQpKTsKICAgICAgICAqbGVuZ3RoID0gMTQ7CiAgICB9CgogICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZ19yZXR1cm4pOwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIElQUk9VVEVERVNUOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKI2lmIE5FRURfS0xHRVRTQQogICAgICAgIHNhID0ga2xnZXRzYSgoc3RydWN0IHNvY2thZGRyX2luICopIHJ0aGVhZFtSdEluZGV4XS0+cnRfZHN0KTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIChzYS0+c2luX2FkZHIuc19hZGRyKTsKI2VsaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgYWRkcl9yZXQgPSBydFtSdEluZGV4XS5EZXN0OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CiNlbHNlCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmcnRoZWFkW1J0SW5kZXhdLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydF9kc3QpLT5zaW5fYWRkci5zX2FkZHI7CiNlbmRpZgogICAgY2FzZSBJUFJPVVRFSUZJTkRFWDoKI2lmZGVmIGhwdXgxMQogICAgICAgIGxvbmdfcmV0dXJuID0gcnRbUnRJbmRleF0uSWZJbmRleDsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIHJ0aGVhZFtSdEluZGV4XS0+cnRfdW5pdDsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzE6CiNpZmRlZiBocHV4MTEKICAgICAgICBsb25nX3JldHVybiA9IHJ0W1J0SW5kZXhdLk1ldHJpYzE7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAocnRoZWFkW1J0SW5kZXhdLT5ydF9mbGFncyAmIFJURl9HQVRFV0FZKSA/IDEgOiAwOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDMjoKI2lmZGVmIGhwdXgxMQogICAgICAgIGxvbmdfcmV0dXJuID0gcnRbUnRJbmRleF0uTWV0cmljMjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwojZWxpZiBkZWZpbmVkKE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTKQogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IC0xOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUMzOgojaWZkZWYgaHB1eDExCiAgICAgICAgbG9uZ19yZXR1cm4gPSBydFtSdEluZGV4XS5NZXRyaWMzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiNlbGlmIGRlZmluZWQoTkVUU05NUF9OT19EVU1NWV9WQUxVRVMpCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gLTE7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzQ6CiNpZmRlZiBocHV4MTEKICAgICAgICBsb25nX3JldHVybiA9IHJ0W1J0SW5kZXhdLk1ldHJpYzQ7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKI2VsaWYgZGVmaW5lZChORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUykKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAtMTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDNToKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gLTE7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU5FWFRIT1A6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwojaWYgTkVFRF9LTEdFVFNBCiAgICAgICAgc2EgPSBrbGdldHNhKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgcnRoZWFkW1J0SW5kZXhdLT5ydF9nYXRld2F5KTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIChzYS0+c2luX2FkZHIuc19hZGRyKTsKI2VsaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgYWRkcl9yZXQgPSBydFtSdEluZGV4XS5OZXh0SG9wOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CiNlbHNlCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmcnRoZWFkW1J0SW5kZXhdLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydF9nYXRld2F5KS0+c2luX2FkZHIuc19hZGRyOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICpic2QgKi8KICAgIGNhc2UgSVBST1VURVRZUEU6CiNpZmRlZiBocHV4MTEKICAgICAgICBsb25nX3JldHVybiA9IHJ0W1J0SW5kZXhdLlR5cGU7CiNlbHNlCiAgICAgICAgaWYgKHJ0aGVhZFtSdEluZGV4XS0+cnRfZmxhZ3MgJiBSVEZfVVApIHsKICAgICAgICAgICAgaWYgKHJ0aGVhZFtSdEluZGV4XS0+cnRfZmxhZ3MgJiBSVEZfR0FURVdBWSkgewogICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSA0OyAgICAgICAgLyogIGluZGlyZWN0KDQpICAqLwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAzOyAgICAgICAgLyogIGRpcmVjdCgzKSAgKi8KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMjsgICAgLyogIGludmFsaWQoMikgICovCiAgICAgICAgfQojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFUFJPVE86CiNpZmRlZiBocHV4MTEKICAgICAgICBsb25nX3JldHVybiA9IHJ0W1J0SW5kZXhdLlByb3RvOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gKHJ0aGVhZFtSdEluZGV4XS0+cnRfZmxhZ3MgJiBSVEZfRFlOQU1JQykgPyA0IDogMjsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURUFHRToKI2lmZGVmIGhwdXgxMQogICAgICAgIGxvbmdfcmV0dXJuID0gcnRbUnRJbmRleF0uQWdlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiNlbGlmIGRlZmluZWQoTkVUU05NUF9OT19EVU1NWV9WQUxVRVMpCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gMDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUFTSzoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiNpZiBORUVEX0tMR0VUU0EKICAgICAgICAvKgogICAgICAgICAqIFhYWCAtIEFsbW9zdCBjZXJ0YWlubHkgbm90IHJpZ2h0CiAgICAgICAgICogYnV0IEkgZG9uJ3QgaGF2ZSBhIHN1aXRhYmxlIHN5c3RlbSB0byB0ZXN0IHRoaXMgb24gCiAgICAgICAgICovCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBhZGRyX3JldCA9IDA7CiNlbGlmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGFkZHJfcmV0ID0gcnRbUnRJbmRleF0uTWFzazsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGFkZHJfcmV0OwojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICFORUVEX0tMR0VUU0EgJiYgIWhwdXgxMSAqLwogICAgICAgIGlmICgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmcnRoZWFkW1J0SW5kZXhdLT5ydF9kc3QpLT5zaW5fYWRkci4KICAgICAgICAgICAgc19hZGRyID09IDApCiAgICAgICAgICAgIGFkZHJfcmV0ID0gMDsgICAgLyogRGVmYXVsdCByb3V0ZSAqLwogICAgICAgIGVsc2UgewojaWZuZGVmIGxpbnV4CiAgICAgICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKHJ0aGVhZFtSdEluZGV4XS0+cnRfaWZwLAogICAgICAgICAgICAgICAgICAgIChjaGFyICopICZydF9pZm5ldCwgc2l6ZW9mKHJ0X2lmbmV0KSkpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKHJ0X2lmbmV0LmlmX2FkZHJsaXN0LAogICAgICAgICAgICAgICAgICAgIChjaGFyICopICZydF9pZm5ldGFkZHIsIHNpemVvZihydF9pZm5ldGFkZHIpKSkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3Zhcl9yb3V0ZSIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGFkZHJfcmV0ID0gcnRfaWZuZXRhZGRyLmlhX3N1Ym5ldG1hc2s7CiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGludXggKi8KICAgICAgICAgICAgY3AgPSAodV9jaGFyICopICYKICAgICAgICAgICAgICAgICgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmKHJ0aGVhZFtSdEluZGV4XS0+cnRfZHN0KSktPgogICAgICAgICAgICAgICAgIHNpbl9hZGRyLnNfYWRkcik7CiAgICAgICAgICAgIHJldHVybiAodV9jaGFyICopICYKICAgICAgICAgICAgICAgICgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmKHJ0aGVhZFtSdEluZGV4XS0+cnRfZ2VubWFzaykpLT4KICAgICAgICAgICAgICAgICBzaW5fYWRkci5zX2FkZHIpOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpbnV4ICovCiAgICAgICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FRURfS0xHRVRTQSAqLwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CiAgICBjYXNlIElQUk9VVEVJTkZPOgogICAgICAgICp2YXJfbGVuID0gbnVsbE9pZExlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBudWxsT2lkOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2lwUm91dGVFbnRyeVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCgpzdGF0aWMgaW50CklQX0NtcF9Sb3V0ZSh2b2lkICphZGRyLCB2b2lkICplcCkKewogICAgbWliMl9pcFJvdXRlRW50cnlfdCAqRXAgPSBlcCwgKkFkZHIgPSBhZGRyOwoKICAgIGlmICgoRXAtPmlwUm91dGVEZXN0ID09IEFkZHItPmlwUm91dGVEZXN0KSAmJgogICAgICAgIChFcC0+aXBSb3V0ZU5leHRIb3AgPT0gQWRkci0+aXBSb3V0ZU5leHRIb3ApICYmCiAgICAgICAgKEVwLT5pcFJvdXRlVHlwZSA9PSBBZGRyLT5pcFJvdXRlVHlwZSkgJiYKICAgICAgICAoRXAtPmlwUm91dGVQcm90byA9PSBBZGRyLT5pcFJvdXRlUHJvdG8pICYmCiAgICAgICAgKEVwLT5pcFJvdXRlTWFzayA9PSBBZGRyLT5pcFJvdXRlTWFzaykgJiYKICAgICAgICAoRXAtPmlwUm91dGVJbmZvLnJlX21heF9mcmFnID09IEFkZHItPmlwUm91dGVJbmZvLnJlX21heF9mcmFnKSAmJgogICAgICAgIChFcC0+aXBSb3V0ZUluZm8ucmVfcnR0ID09IEFkZHItPmlwUm91dGVJbmZvLnJlX3J0dCkgJiYKICAgICAgICAoRXAtPmlwUm91dGVJbmZvLnJlX3JlZiA9PSBBZGRyLT5pcFJvdXRlSW5mby5yZV9yZWYpICYmCiAgICAgICAgKEVwLT5pcFJvdXRlSW5mby5yZV9mcmFnX2ZsYWcgPT0gQWRkci0+aXBSb3V0ZUluZm8ucmVfZnJhZ19mbGFnKSAmJgogICAgICAgIChFcC0+aXBSb3V0ZUluZm8ucmVfc3JjX2FkZHIgPT0gQWRkci0+aXBSb3V0ZUluZm8ucmVfc3JjX2FkZHIpICYmCiAgICAgICAgKEVwLT5pcFJvdXRlSW5mby5yZV9pcmVfdHlwZSA9PSBBZGRyLT5pcFJvdXRlSW5mby5yZV9pcmVfdHlwZSkgJiYKICAgICAgICAoRXAtPmlwUm91dGVJbmZvLnJlX29icGt0ID09IEFkZHItPmlwUm91dGVJbmZvLnJlX29icGt0KSAmJgogICAgICAgIChFcC0+aXBSb3V0ZUluZm8ucmVfaWJwa3QgPT0gQWRkci0+aXBSb3V0ZUluZm8ucmVfaWJwa3QpCiAgICAgICAgKQogICAgICAgIHJldHVybiAoMCk7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuICgxKTsgICAgICAgICAgICAgLyogTm90IGZvdW5kICovCn0KCnVfY2hhciAgICAgICAgICoKdmFyX2lwUm91dGVFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgLyoKICAgICAqIG9iamVjdCBpZGVudGlmaWVyIGlzIG9mIGZvcm06CiAgICAgKiAxLjMuNi4xLjIuMS40LjIxLjEuMS5BLkIuQy5ELCAgd2hlcmUgQS5CLkMuRCBpcyBJUCBhZGRyZXNzLgogICAgICogSVBBRERSIHN0YXJ0cyBhdCBvZmZzZXQgMTAuCiAgICAgKi8KI2RlZmluZSBJUF9ST1VURU5BTUVfTEVOR1RICTE0CiNkZWZpbmUJSVBfUk9VVEVBRERSX09GRgkxMAogICAgb2lkICAgICAgICAgICAgIGN1cnJlbnRbSVBfUk9VVEVOQU1FX0xFTkdUSF0sCiAgICAgICAgbG93ZXN0W0lQX1JPVVRFTkFNRV9MRU5HVEhdOwogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgb2lkICAgICAgICAgICAgKm9wOwogICAgbWliMl9pcFJvdXRlRW50cnlfdCBMb3dlbnRyeSwgTmV4dGVudHJ5LCBlbnRyeTsKICAgIGludCAgICAgICAgICAgICBGb3VuZCA9IDA7CiAgICByZXFfZSAgICAgICAgICAgcmVxX3R5cGU7CiAgICBzdGF0aWMgaW5fYWRkcl90IGFkZHJfcmV0OwoKICAgICp3cml0ZV9tZXRob2QgPSBOVUxMOyAgLyogd3JpdGVfcnRlOyAgWFhYOiAgU0VUIHN1cHBvcnQgbm90IHJlYWxseSBpbXBsZW1lbnRlZCAqLwoKICAgIC8qCiAgICAgKiBmaWxsIGluIG9iamVjdCBwYXJ0IG9mIG5hbWUgZm9yIGN1cnJlbnQgKGxlc3Mgc2l6ZW9mIGluc3RhbmNlIHBhcnQpIAogICAgICovCgogICAgbWVtY3B5KChjaGFyICopIGN1cnJlbnQsIChjaGFyICopIHZwLT5uYW1lLCB2cC0+bmFtZWxlbiAqIHNpemVvZihvaWQpKTsKICAgIGlmICgqbGVuZ3RoID09IElQX1JPVVRFTkFNRV9MRU5HVEgpIC8qIEFzc3VtZSB0aGF0IHRoZSBpbnB1dCBuYW1lIGlzIHRoZSBsb3dlc3QgKi8KICAgICAgICBtZW1jcHkoKGNoYXIgKikgbG93ZXN0LCAoY2hhciAqKSBuYW1lLAogICAgICAgICAgICAgICBJUF9ST1VURU5BTUVfTEVOR1RIICogc2l6ZW9mKG9pZCkpOwogICAgZWxzZSB7CiAgICAgICAgbmFtZVtJUF9ST1VURUFERFJfT0ZGXSA9IChvaWQpIC0gMTsgICAgIC8qIEdyaGhoOiB0byBwcmV2ZW50IGFjY2lkZW50YWwgY29tcGFyaXNvbiA6LSggKi8KCWxvd2VzdFswXSA9IDB4ZmY7CiAgICB9CiAgICBmb3IgKE5leHRlbnRyeS5pcFJvdXRlRGVzdCA9ICh1X2xvbmcpIC0gMiwgcmVxX3R5cGUgPSBHRVRfRklSU1Q7OwogICAgICAgICBOZXh0ZW50cnkgPSBlbnRyeSwgcmVxX3R5cGUgPSBHRVRfTkVYVCkgewogICAgICAgIGlmIChnZXRNaWJzdGF0KE1JQl9JUF9ST1VURSwgJmVudHJ5LCBzaXplb2YobWliMl9pcFJvdXRlRW50cnlfdCksCiAgICAgICAgICAgICAgICAgICAgICAgcmVxX3R5cGUsICZJUF9DbXBfUm91dGUsICZOZXh0ZW50cnkpICE9IDApCiAgICAgICAgICAgIGJyZWFrOwojaWZkZWYgSEFWRV9ERUZJTkVEX0lSRV9DQUNIRQogICAgICAgIGlmKGVudHJ5LmlwUm91dGVJbmZvLnJlX2lyZV90eXBlJklSRV9DQUNIRSkKICAgICAgICAgICAgY29udGludWU7CiNlbmRpZiAvKiBIQVZFX0RFRklORURfSVJFX0NBQ0hFICovCiAgICAgICAgQ09QWV9JUEFERFIoY3AsICh1X2NoYXIgKikgJiBlbnRyeS5pcFJvdXRlRGVzdCwgb3AsCiAgICAgICAgICAgICAgICAgICAgY3VycmVudCArIElQX1JPVVRFQUREUl9PRkYpOwogICAgICAgIGlmIChleGFjdCkgewogICAgICAgICAgICBpZiAoc25tcF9vaWRfY29tcGFyZQogICAgICAgICAgICAgICAgKGN1cnJlbnQsIElQX1JPVVRFTkFNRV9MRU5HVEgsIG5hbWUsICpsZW5ndGgpID09IDApIHsKICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBsb3dlc3QsIChjaGFyICopIGN1cnJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgSVBfUk9VVEVOQU1FX0xFTkdUSCAqIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgICAgIExvd2VudHJ5ID0gZW50cnk7CiAgICAgICAgICAgICAgICBGb3VuZCsrOwogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8qIG5vIG5lZWQgdG8gc2VhcmNoIGZ1cnRoZXIgKi8KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgoc25tcF9vaWRfY29tcGFyZQogICAgICAgICAgICAgICAgIChjdXJyZW50LCBJUF9ST1VURU5BTUVfTEVOR1RILCBuYW1lLCAqbGVuZ3RoKSA+IDApCiAgICAgICAgICAgICAgICAmJiAoKE5leHRlbnRyeS5pcFJvdXRlRGVzdCA9PSAodV9sb25nKSAtIDIpCiAgICAgICAgICAgICAgICAgICAgfHwKICAgICAgICAgICAgICAgICAgICAoc25tcF9vaWRfY29tcGFyZQogICAgICAgICAgICAgICAgICAgICAoY3VycmVudCwgSVBfUk9VVEVOQU1FX0xFTkdUSCwgbG93ZXN0LAogICAgICAgICAgICAgICAgICAgICAgSVBfUk9VVEVOQU1FX0xFTkdUSCkgPCAwKQogICAgICAgICAgICAgICAgICAgIHx8CiAgICAgICAgICAgICAgICAgICAgKHNubXBfb2lkX2NvbXBhcmUKICAgICAgICAgICAgICAgICAgICAgKG5hbWUsIElQX1JPVVRFTkFNRV9MRU5HVEgsIGxvd2VzdCwKICAgICAgICAgICAgICAgICAgICAgIElQX1JPVVRFTkFNRV9MRU5HVEgpID09IDApKSkgewoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBpZiBuZXcgb25lIGlzIGdyZWF0ZXIgdGhhbiBpbnB1dCBhbmQgY2xvc2VyIHRvIGlucHV0IHRoYW4KICAgICAgICAgICAgICAgICAqICogcHJldmlvdXMgbG93ZXN0LCBhbmQgaXMgbm90IGVxdWFsIHRvIGl0LCBzYXZlIHRoaXMgb25lIGFzIHRoZSAibmV4dCIgb25lLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgbG93ZXN0LCAoY2hhciAqKSBjdXJyZW50LAogICAgICAgICAgICAgICAgICAgICAgIElQX1JPVVRFTkFNRV9MRU5HVEggKiBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgICAgICBMb3dlbnRyeSA9IGVudHJ5OwogICAgICAgICAgICAgICAgRm91bmQrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGlmIChGb3VuZCA9PSAwKQogICAgICAgIHJldHVybiAoTlVMTCk7CiAgICBtZW1jcHkoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgbG93ZXN0LAogICAgICAgICAgIElQX1JPVVRFTkFNRV9MRU5HVEggKiBzaXplb2Yob2lkKSk7CiAgICAqbGVuZ3RoID0gSVBfUk9VVEVOQU1FX0xFTkdUSDsKICAgICp2YXJfbGVuID0gc2l6ZW9mKGxvbmdfcmV0dXJuKTsKCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBJUFJPVVRFREVTVDoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAgICAgYWRkcl9yZXQgPSBMb3dlbnRyeS5pcFJvdXRlRGVzdDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGFkZHJfcmV0OwogICAgY2FzZSBJUFJPVVRFSUZJTkRFWDoKI2lmZGVmIE5FVFNOTVBfSU5DTFVERV9JRlRBQkxFX1JFV1JJVEVTCiAgICAgICAgTG93ZW50cnkuaXBSb3V0ZUlmSW5kZXgub19ieXRlc1tMb3dlbnRyeS5pcFJvdXRlSWZJbmRleC5vX2xlbmd0aF0gPSAnXDAnOwogICAgICAgIGxvbmdfcmV0dXJuID0KICAgICAgICAgICAgbmV0c25tcF9hY2Nlc3NfaW50ZXJmYWNlX2luZGV4X2ZpbmQoCiAgICAgICAgICAgICAgICBMb3dlbnRyeS5pcFJvdXRlSWZJbmRleC5vX2J5dGVzKTsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9CiAgICAgICAgICAgSW50ZXJmYWNlX0luZGV4X0J5X05hbWUoTG93ZW50cnkuaXBSb3V0ZUlmSW5kZXgub19ieXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb3dlbnRyeS5pcFJvdXRlSWZJbmRleC5vX2xlbmd0aCk7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUMxOgogICAgICAgIGxvbmdfcmV0dXJuID0gTG93ZW50cnkuaXBSb3V0ZU1ldHJpYzE7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzI6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBMb3dlbnRyeS5pcFJvdXRlTWV0cmljMjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDMzoKICAgICAgICBsb25nX3JldHVybiA9IExvd2VudHJ5LmlwUm91dGVNZXRyaWMzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUM0OgogICAgICAgIGxvbmdfcmV0dXJuID0gTG93ZW50cnkuaXBSb3V0ZU1ldHJpYzQ7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU5FWFRIT1A6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwogICAgICAgIGFkZHJfcmV0ID0gTG93ZW50cnkuaXBSb3V0ZU5leHRIb3A7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKICAgIGNhc2UgSVBST1VURVRZUEU6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBMb3dlbnRyeS5pcFJvdXRlVHlwZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFUFJPVE86CiAgICAgICAgbG9uZ19yZXR1cm4gPSBMb3dlbnRyeS5pcFJvdXRlUHJvdG87CiAgICAgICAgaWYgKGxvbmdfcmV0dXJuID09IC0xKQogICAgICAgICAgICBsb25nX3JldHVybiA9IDE7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURUFHRToKICAgICAgICBsb25nX3JldHVybiA9IExvd2VudHJ5LmlwUm91dGVBZ2U7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1BU0s6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwogICAgICAgIGFkZHJfcmV0ID0gTG93ZW50cnkuaXBSb3V0ZU1hc2s7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9pcFJvdXRlRW50cnlcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9OwogICAgcmV0dXJuIE5VTEw7Cn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29sYXJpczIgLSB2YXJfSVByb3V0ZSAqLwoKI2lmbmRlZiBzb2xhcmlzMgpzdGF0aWMgaW50ICAgICAgcXNvcnRfY29tcGFyZShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7CiNlbmRpZgoKI2lmIGRlZmluZWQoUlRFTlRSWV80XzQpIHx8IGRlZmluZWQoUlRFTlRSWV9SVF9ORVhUKSB8fCBkZWZpbmVkIChocHV4MTEpCgojaWYgZGVmaW5lZChSVEVOVFJZXzRfNCkgJiYgIWRlZmluZWQoaHB1eDExKQp2b2lkCmxvYWRfcnRlbnRyaWVzKHN0cnVjdCByYWRpeF9ub2RlICpwdCkKewogICAgc3RydWN0IHJhZGl4X25vZGUgbm9kZTsKICAgIFJURU5UUlkgICAgICAgICBydDsKICAgIHN0cnVjdCBpZm5ldCAgICBpZm5ldDsKICAgIGNoYXIgICAgICAgICAgICBuYW1lWzE2XSwgdGVtcFsxNl07CiNpZiAhSEFWRV9TVFJVQ1RfSUZORVRfSUZfWE5BTUUKICAgIHJlZ2lzdGVyIGNoYXIgICpjcDsKI2VuZGlmCgogICAgaWYgKCFORVRTTk1QX0tMT09LVVAocHQsIChjaGFyICopICZub2RlLCBzaXplb2Yoc3RydWN0IHJhZGl4X25vZGUpKSkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAobm9kZS5ybl9iID49IDApIHsKICAgICAgICBsb2FkX3J0ZW50cmllcyhub2RlLnJuX3IpOwogICAgICAgIGxvYWRfcnRlbnRyaWVzKG5vZGUucm5fbCk7CiAgICB9IGVsc2UgewogICAgICAgIGlmIChub2RlLnJuX2ZsYWdzICYgUk5GX1JPT1QpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogcm9vdCBub2RlIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKG5vZGUucm5fZHVwZWRrZXkpCiAgICAgICAgICAgICAgICBsb2FkX3J0ZW50cmllcyhub2RlLnJuX2R1cGVka2V5KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvKgogICAgICAgICAqIGdldCB0aGUgcm91dGUgCiAgICAgICAgICovCiAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAocHQsIChjaGFyICopICZydCwgc2l6ZW9mKFJURU5UUlkpKSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFyX3JvdXRlIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChydC5ydF9pZnAgIT0gMCkgewogICAgICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChydC5ydF9pZnAsIChjaGFyICopICZpZm5ldCwgc2l6ZW9mKGlmbmV0KSkpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQojaWYgSEFWRV9TVFJVQ1RfSUZORVRfSUZfWE5BTUUKI2lmIGRlZmluZWQobmV0YnNkMSkgfHwgZGVmaW5lZChvcGVuYnNkMikKICAgICAgICAgICAgc3RybGNweShuYW1lLCBpZm5ldC5pZl94bmFtZSwgc2l6ZW9mKG5hbWUpKTsKI2Vsc2UKICAgICAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAoaWZuZXQuaWZfeG5hbWUsIG5hbWUsIHNpemVvZiBuYW1lKSkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3Zhcl9yb3V0ZSIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiNlbmRpZgogICAgICAgICAgICBuYW1lW3NpemVvZihuYW1lKSAtIDFdID0gJ1wwJzsKI2Vsc2UKICAgICAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAoaWZuZXQuaWZfbmFtZSwgbmFtZSwgc2l6ZW9mIG5hbWUpKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFyX3JvdXRlIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmFtZVtzaXplb2YobmFtZSkgLSAxXSA9ICdcMCc7CiAgICAgICAgICAgIGNwID0gKGNoYXIgKikgc3RyY2hyKG5hbWUsICdcMCcpOwogICAgICAgICAgICBzdHJpbmdfYXBwZW5kX2ludChjcCwgaWZuZXQuaWZfdW5pdCk7CiNlbmRpZgogICAgICAgICAgICBJbnRlcmZhY2VfU2Nhbl9Jbml0KCk7CiAgICAgICAgICAgIHJ0LnJ0X3VuaXQgPSAwOwogICAgICAgICAgICB3aGlsZSAoSW50ZXJmYWNlX1NjYW5fTmV4dAogICAgICAgICAgICAgICAgICAgKChzaG9ydCAqKSAmKHJ0LnJ0X3VuaXQpLCB0ZW1wLCBOVUxMLCBOVUxMKSAhPSAwKSB7CiAgICAgICAgICAgICAgICBpZiAoc3RyY21wKG5hbWUsIHRlbXApID09IDApCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiNpZiBDSEVDS19SVF9GTEFHUwogICAgICAgIGlmICgoKHJ0LnJ0X2ZsYWdzICYgUlRGX0NMT05JTkcpICE9IFJURl9DTE9OSU5HKQogICAgICAgICAgICAmJiAoKHJ0LnJ0X2ZsYWdzICYgUlRGX0xMSU5GTykgIT0gUlRGX0xMSU5GTykpIHsKI2VuZGlmCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGNoZWNrIGZvciBzcGFjZSBhbmQgbWFsbG9jIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHJ0c2l6ZSA+PSBydGFsbG9jYXRlKSB7CiAgICAgICAgICAgICAgICBydGhlYWQgPQogICAgICAgICAgICAgICAgICAgIChSVEVOVFJZICoqKSByZWFsbG9jKChjaGFyICopIHJ0aGVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogcnRhbGxvY2F0ZSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFJURU5UUlkgKikpOwogICAgICAgICAgICAgICAgbWVtc2V0KChjaGFyICopICZydGhlYWRbcnRhbGxvY2F0ZV0sICgwKSwKICAgICAgICAgICAgICAgICAgICAgICBydGFsbG9jYXRlICogc2l6ZW9mKFJURU5UUlkgKikpOwoKICAgICAgICAgICAgICAgIHJ0YWxsb2NhdGUgKj0gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXJ0aGVhZFtydHNpemVdKQogICAgICAgICAgICAgICAgcnRoZWFkW3J0c2l6ZV0gPSAoUlRFTlRSWSAqKSBtYWxsb2Moc2l6ZW9mKFJURU5UUlkpKTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogICAgICBBZGQgdGhpcyB0byB0aGUgZGF0YWJhc2UKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBydGhlYWRbcnRzaXplXSwgKGNoYXIgKikgJnJ0LCBzaXplb2YoUlRFTlRSWSkpOwogICAgICAgICAgICBydHNpemUrKzsKI2lmIENIRUNLX1JUX0ZMQUdTCiAgICAgICAgfQojZW5kaWYKCiAgICAgICAgaWYgKG5vZGUucm5fZHVwZWRrZXkpCiAgICAgICAgICAgIGxvYWRfcnRlbnRyaWVzKG5vZGUucm5fZHVwZWRrZXkpOwogICAgfQp9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUlRFTlRSWV80XzQgJiYgIWhwdXgxMSAqLwoKc3RhdGljIHZvaWQKUm91dGVfU2Nhbl9SZWxvYWQodm9pZCkKewojaWZkZWYgaHB1eDExCgogICAgaW50ICAgICAgICAgICAgIGZkOwogICAgc3RydWN0IG5tcGFybXMgIHA7CiAgICBpbnQgICAgICAgICAgICAgdmFsOwogICAgdW5zaWduZWQgaW50ICAgIHVsZW47CiAgICBpbnQgICAgICAgICAgICAgcmV0OwoKICAgIGlmIChydCkKICAgICAgICBmcmVlKHJ0KTsKICAgIHJ0ID0gKG1pYl9pcFJvdXRlRW50ICopIDA7CiAgICBydHNpemUgPSAwOwoKICAgIGlmICgoZmQgPSBvcGVuX21pYigiL2Rldi9pcCIsIE9fUkRPTkxZLCAwLCBOTV9BU1lOQ19PRkYpKSA+PSAwKSB7CiAgICAgICAgcC5vYmppZCA9IElEX2lwUm91dGVOdW1FbnQ7CiAgICAgICAgcC5idWZmZXIgPSAodm9pZCAqKSAmdmFsOwogICAgICAgIHVsZW4gPSBzaXplb2YoaW50KTsKICAgICAgICBwLmxlbiA9ICZ1bGVuOwogICAgICAgIGlmICgocmV0ID0gZ2V0X21pYl9pbmZvKGZkLCAmcCkpID09IDApCiAgICAgICAgICAgIHJ0c2l6ZSA9IHZhbDsKCiAgICAgICAgaWYgKHJ0c2l6ZSA+IDApIHsKICAgICAgICAgICAgdWxlbiA9ICh1bnNpZ25lZCkgcnRzaXplICpzaXplb2YobWliX2lwUm91dGVFbnQpOwogICAgICAgICAgICBydCA9IChtaWJfaXBSb3V0ZUVudCAqKSBtYWxsb2ModWxlbik7CiAgICAgICAgICAgIHAub2JqaWQgPSBJRF9pcFJvdXRlVGFibGU7CiAgICAgICAgICAgIHAuYnVmZmVyID0gKHZvaWQgKikgcnQ7CiAgICAgICAgICAgIHAubGVuID0gJnVsZW47CiAgICAgICAgICAgIGlmICgocmV0ID0gZ2V0X21pYl9pbmZvKGZkLCAmcCkpIDwgMCkKICAgICAgICAgICAgICAgIHJ0c2l6ZSA9IDA7CiAgICAgICAgfQoKICAgICAgICBjbG9zZV9taWIoZmQpOwogICAgfQoKICAgIC8qCiAgICAgKiAgU29ydCBpdCEKICAgICAqLwogICAgcXNvcnQoKGNoYXIgKikgcnQsIHJ0c2l6ZSwgc2l6ZW9mKHJ0WzBdKSwKI2lmZGVmIF9fU1REQ19fCiAgICAgICAgICAoaW50ICgqKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpIHFzb3J0X2NvbXBhcmUKI2Vsc2UKICAgICAgICAgIHFzb3J0X2NvbXBhcmUKI2VuZGlmCiAgICAgICAgKTsKCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDExICovCiNpZiBkZWZpbmVkKFJURU5UUllfNF80KQogICAgc3RydWN0IHJhZGl4X25vZGVfaGVhZCBoZWFkLCAqcnRfdGFibGVbQUZfTUFYICsgMV07CiAgICBpbnQgICAgICAgICAgICAgaTsKI2Vsc2UKICAgIFJURU5UUlkgICAgICAgKipyb3V0ZWhhc2gsIG1iOwogICAgcmVnaXN0ZXIgUlRFTlRSWSAqbTsKICAgIFJURU5UUlkgICAgICAgICpydDsKICAgIHN0cnVjdCBpZm5ldCAgICBpZm5ldDsKICAgIGludCAgICAgICAgICAgICBpLCB0YWJsZTsKICAgIHJlZ2lzdGVyIGNoYXIgICpjcDsKICAgIGNoYXIgICAgICAgICAgICBuYW1lWzE2XSwgdGVtcFsxNl07CiAgICBpbnQgICAgICAgICAgICAgaGFzaHNpemU7CiNlbmRpZgogICAgc3RhdGljIGludCAgICAgIFRpbWVfT2ZfTGFzdF9SZWxvYWQgPSAwOwogICAgc3RydWN0IHRpbWV2YWwgIG5vdzsKCiAgICBnZXR0aW1lb2ZkYXkoJm5vdywgKHN0cnVjdCB0aW1lem9uZSAqKSAwKTsKICAgIGlmIChUaW1lX09mX0xhc3RfUmVsb2FkICsgQ0FDSEVfVElNRSA+IG5vdy50dl9zZWMpCiAgICAgICAgcmV0dXJuOwogICAgVGltZV9PZl9MYXN0X1JlbG9hZCA9IG5vdy50dl9zZWM7CgogICAgLyoKICAgICAqICogIE1ha2VzIHN1cmUgd2UgaGF2ZSBTT01FIHNwYWNlIGFsbG9jYXRlZCBmb3IgbmV3IHJvdXRpbmcgZW50cmllcwogICAgICovCiAgICBpZiAoIXJ0aGVhZCkgewogICAgICAgIHJ0aGVhZCA9IChSVEVOVFJZICoqKSBtYWxsb2MoMTAwICogc2l6ZW9mKFJURU5UUlkgKikpOwogICAgICAgIGlmICghcnRoZWFkKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJyb3V0ZSB0YWJsZSBtYWxsb2MgZmFpbFxuIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbWVtc2V0KChjaGFyICopIHJ0aGVhZCwgKDApLCAxMDAgKiBzaXplb2YoUlRFTlRSWSAqKSk7CiAgICAgICAgcnRhbGxvY2F0ZSA9IDEwMDsKICAgIH0KCiAgICAvKgogICAgICogcmVzZXQgdGhlIHJvdXRpbmcgdGFibGUgc2l6ZSB0byB6ZXJvIC0tIHdhcyBhIENNVSBtZW1vcnkgbGVhayAKICAgICAqLwogICAgcnRzaXplID0gMDsKCiNpZmRlZiBSVEVOVFJZXzRfNAogICAgLyoKICAgICAqIHJ0ZW50cnkgaXMgYSBCU0QgNC40IGNvbXBhdCAKICAgICAqLwoKI2lmICFkZWZpbmVkKEFGX1VOU1BFQykKI2RlZmluZSBBRl9VTlNQRUMgQUZfSU5FVAojZW5kaWYKCiAgICBhdXRvX25saXN0KFJUVEFCTEVTX1NZTUJPTCwgKGNoYXIgKikgcnRfdGFibGUsIHNpemVvZihydF90YWJsZSkpOwogICAgZm9yIChpID0gMDsgaSA8PSBBRl9NQVg7IGkrKykgewogICAgICAgIGlmIChydF90YWJsZVtpXSA9PSAwKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBpZiAoTkVUU05NUF9LTE9PS1VQKHJ0X3RhYmxlW2ldLCAoY2hhciAqKSAmaGVhZCwgc2l6ZW9mKGhlYWQpKSkgewogICAgICAgICAgICBsb2FkX3J0ZW50cmllcyhoZWFkLnJuaF90cmVldG9wKTsKICAgICAgICB9CiAgICB9CgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJ0ZW50cnkgaXMgYSBCU0QgNC4zIGNvbXBhdCAqLwogICAgZm9yICh0YWJsZSA9IDA7IHRhYmxlIDwgTlVNX1JPVVRFX1NZTUJPTFM7IHRhYmxlKyspIHsKICAgICAgICBhdXRvX25saXN0KFJUSEFTSFNJWkVfU1lNQk9MLCAoY2hhciAqKSAmaGFzaHNpemUsCiAgICAgICAgICAgICAgICAgICBzaXplb2YoaGFzaHNpemUpKTsKICAgICAgICByb3V0ZWhhc2ggPSAoUlRFTlRSWSAqKikgbWFsbG9jKGhhc2hzaXplICogc2l6ZW9mKHN0cnVjdCBtYnVmICopKTsKICAgICAgICBhdXRvX25saXN0KHJvdXRlX3N5bWJvbHNbdGFibGVdLCAoY2hhciAqKSByb3V0ZWhhc2gsCiAgICAgICAgICAgICAgICAgICBoYXNoc2l6ZSAqIHNpemVvZihzdHJ1Y3QgbWJ1ZiAqKSk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGhhc2hzaXplOyBpKyspIHsKICAgICAgICAgICAgaWYgKHJvdXRlaGFzaFtpXSA9PSAwKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIG0gPSByb3V0ZWhhc2hbaV07CiAgICAgICAgICAgIHdoaWxlIChtKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogICAgICBEaWcgdGhlIHJvdXRlIG91dCBvZiB0aGUga2VybmVsLi4uCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKG0sIChjaGFyICopICZtYiwgc2l6ZW9mKG1iKSkpIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFyX3JvdXRlIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbSA9IG1iLnJ0X25leHQ7CgogICAgICAgICAgICAgICAgcnQgPSAmbWI7CiAgICAgICAgICAgICAgICBpZiAocnQtPnJ0X2lmcCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAocnQtPnJ0X2lmcCwgKGNoYXIgKikgJmlmbmV0LCBzaXplb2YoaWZuZXQpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFyX3JvdXRlIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAoaWZuZXQuaWZfbmFtZSwgbmFtZSwgMTYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBuYW1lWzE1XSA9ICdcMCc7CiAgICAgICAgICAgICAgICAgICAgY3AgPSAoY2hhciAqKSBzdHJjaHIobmFtZSwgJ1wwJyk7CiAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2FwcGVuZF9pbnQoY3AsIGlmbmV0LmlmX3VuaXQpOwoKICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2VfU2Nhbl9Jbml0KCk7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKEludGVyZmFjZV9TY2FuX05leHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzaG9ydCAqKSAmcnQtPnJ0X3VuaXQsIHRlbXAsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAobmFtZSwgdGVtcCkgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiAgICAgIEFsbG9jYXRlIGEgYmxvY2sgdG8gaG9sZCBpdCBhbmQgYWRkIGl0IHRvIHRoZSBkYXRhYmFzZQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAocnRzaXplID49IHJ0YWxsb2NhdGUpIHsKICAgICAgICAgICAgICAgICAgICBydGhlYWQgPQogICAgICAgICAgICAgICAgICAgICAgICAoUlRFTlRSWSAqKikgcmVhbGxvYygoY2hhciAqKSBydGhlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBydGFsbG9jYXRlICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFJURU5UUlkgKikpOwogICAgICAgICAgICAgICAgICAgIG1lbXNldCgoY2hhciAqKSAmcnRoZWFkW3J0YWxsb2NhdGVdLCAoMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0YWxsb2NhdGUgKiBzaXplb2YoUlRFTlRSWSAqKSk7CgogICAgICAgICAgICAgICAgICAgIHJ0YWxsb2NhdGUgKj0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghcnRoZWFkW3J0c2l6ZV0pCiAgICAgICAgICAgICAgICAgICAgcnRoZWFkW3J0c2l6ZV0gPSAoUlRFTlRSWSAqKSBtYWxsb2Moc2l6ZW9mKFJURU5UUlkpKTsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiAgICAgIEFkZCB0aGlzIHRvIHRoZSBkYXRhYmFzZQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgcnRoZWFkW3J0c2l6ZV0sIChjaGFyICopIHJ0LAogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihSVEVOVFJZKSk7CiAgICAgICAgICAgICAgICBydHNpemUrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmcmVlKHJvdXRlaGFzaCk7CiAgICB9CiNlbmRpZgogICAgLyoKICAgICAqICBTb3J0IGl0IQogICAgICovCiAgICBxc29ydCgoY2hhciAqKSBydGhlYWQsIHJ0c2l6ZSwgc2l6ZW9mKHJ0aGVhZFswXSksCiNpZmRlZiBfX1NURENfXwogICAgICAgICAgKGludCAoKikoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKSBxc29ydF9jb21wYXJlCiNlbHNlCiAgICAgICAgICBxc29ydF9jb21wYXJlCiNlbmRpZgogICAgICAgICk7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDExICovCn0KCiNlbHNlCgojaWYgSEFWRV9TWVNfTUJVRl9ICnN0YXRpYyB2b2lkClJvdXRlX1NjYW5fUmVsb2FkKHZvaWQpCnsKICAgIHN0cnVjdCBtYnVmICAgKipyb3V0ZWhhc2gsIG1iOwogICAgcmVnaXN0ZXIgc3RydWN0IG1idWYgKm07CiAgICBzdHJ1Y3QgaWZuZXQgICAgaWZuZXQ7CiAgICBSVEVOVFJZICAgICAgICAqcnQ7CiAgICBpbnQgICAgICAgICAgICAgaSwgdGFibGU7CiAgICByZWdpc3RlciBjaGFyICAqY3A7CiAgICBjaGFyICAgICAgICAgICAgbmFtZVsxNl0sIHRlbXBbMTZdOwogICAgc3RhdGljIGludCAgICAgIFRpbWVfT2ZfTGFzdF9SZWxvYWQgPSAwOwogICAgc3RydWN0IHRpbWV2YWwgIG5vdzsKICAgIGludCAgICAgICAgICAgICBoYXNoc2l6ZTsKCiAgICBnZXR0aW1lb2ZkYXkoJm5vdywgKHN0cnVjdCB0aW1lem9uZSAqKSAwKTsKICAgIGlmIChUaW1lX09mX0xhc3RfUmVsb2FkICsgQ0FDSEVfVElNRSA+IG5vdy50dl9zZWMpCiAgICAgICAgcmV0dXJuOwogICAgVGltZV9PZl9MYXN0X1JlbG9hZCA9IG5vdy50dl9zZWM7CgogICAgLyoKICAgICAqICBNYWtlcyBzdXJlIHdlIGhhdmUgU09NRSBzcGFjZSBhbGxvY2F0ZWQgZm9yIG5ldyByb3V0aW5nIGVudHJpZXMKICAgICAqLwogICAgaWYgKCFydGhlYWQpIHsKICAgICAgICBydGhlYWQgPSAoUlRFTlRSWSAqKikgbWFsbG9jKDEwMCAqIHNpemVvZihSVEVOVFJZICopKTsKICAgICAgICBpZiAoIXJ0aGVhZCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAicm91dGUgdGFibGUgbWFsbG9jIGZhaWxcbiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIG1lbXNldCgoY2hhciAqKSBydGhlYWQsICgwKSwgMTAwICogc2l6ZW9mKFJURU5UUlkgKikpOwogICAgICAgIHJ0YWxsb2NhdGUgPSAxMDA7CiAgICB9CgogICAgLyoKICAgICAqIHJlc2V0IHRoZSByb3V0aW5nIHRhYmxlIHNpemUgdG8gemVybyAtLSB3YXMgYSBDTVUgbWVtb3J5IGxlYWsgCiAgICAgKi8KICAgIHJ0c2l6ZSA9IDA7CgogICAgZm9yICh0YWJsZSA9IDA7IHRhYmxlIDwgTlVNX1JPVVRFX1NZTUJPTFM7IHRhYmxlKyspIHsKI2lmZGVmIHN1blYzCiAgICAgICAgaGFzaHNpemUgPSBSVEhBU0hTSVo7CiNlbHNlCiAgICAgICAgYXV0b19ubGlzdChSVEhBU0hTSVpFX1NZTUJPTCwgKGNoYXIgKikgJmhhc2hzaXplLAogICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhc2hzaXplKSk7CiNlbmRpZgogICAgICAgIHJvdXRlaGFzaCA9CiAgICAgICAgICAgIChzdHJ1Y3QgbWJ1ZiAqKikgbWFsbG9jKGhhc2hzaXplICogc2l6ZW9mKHN0cnVjdCBtYnVmICopKTsKICAgICAgICBhdXRvX25saXN0KHJvdXRlX3N5bWJvbHNbdGFibGVdLCAoY2hhciAqKSByb3V0ZWhhc2gsCiAgICAgICAgICAgICAgICAgICBoYXNoc2l6ZSAqIHNpemVvZihzdHJ1Y3QgbWJ1ZiAqKSk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGhhc2hzaXplOyBpKyspIHsKICAgICAgICAgICAgaWYgKHJvdXRlaGFzaFtpXSA9PSAwKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIG0gPSByb3V0ZWhhc2hbaV07CiAgICAgICAgICAgIHdoaWxlIChtKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogIERpZyB0aGUgcm91dGUgb3V0IG9mIHRoZSBrZXJuZWwuLi4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAobSwgKGNoYXIgKikgJm1iLCBzaXplb2YobWIpKSkgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtID0gbWIubV9uZXh0OwogICAgICAgICAgICAgICAgcnQgPSBtdG9kKCZtYiwgUlRFTlRSWSAqKTsKCiAgICAgICAgICAgICAgICBpZiAocnQtPnJ0X2lmcCAhPSAwKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKHJ0LT5ydF9pZnAsIChjaGFyICopICZpZm5ldCwgc2l6ZW9mKGlmbmV0KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3Zhcl9yb3V0ZSIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGlmbmV0LmlmX25hbWUsIG5hbWUsIDE2KSkgewogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFyX3JvdXRlIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbmFtZVsxNV0gPSAnXDAnOwogICAgICAgICAgICAgICAgICAgIGNwID0gKGNoYXIgKikgc3RyY2hyKG5hbWUsICdcMCcpOwogICAgICAgICAgICAgICAgICAgIHN0cmluZ19hcHBlbmRfaW50KGNwLCBpZm5ldC5pZl91bml0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RyY21wKG5hbWUsICJsbzAiKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlX1NjYW5fSW5pdCgpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChJbnRlcmZhY2VfU2Nhbl9OZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc2hvcnQgKikgJnJ0LT5ydF91bml0LCB0ZW1wLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyY21wKG5hbWUsIHRlbXApID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogIEFsbG9jYXRlIGEgYmxvY2sgdG8gaG9sZCBpdCBhbmQgYWRkIGl0IHRvIHRoZSBkYXRhYmFzZQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAocnRzaXplID49IHJ0YWxsb2NhdGUpIHsKICAgICAgICAgICAgICAgICAgICBydGhlYWQgPQogICAgICAgICAgICAgICAgICAgICAgICAoUlRFTlRSWSAqKikgcmVhbGxvYygoY2hhciAqKSBydGhlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBydGFsbG9jYXRlICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFJURU5UUlkgKikpOwogICAgICAgICAgICAgICAgICAgIG1lbXNldCgoY2hhciAqKSAmcnRoZWFkW3J0YWxsb2NhdGVdLCAoMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0YWxsb2NhdGUgKiBzaXplb2YoUlRFTlRSWSAqKSk7CgogICAgICAgICAgICAgICAgICAgIHJ0YWxsb2NhdGUgKj0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghcnRoZWFkW3J0c2l6ZV0pCiAgICAgICAgICAgICAgICAgICAgcnRoZWFkW3J0c2l6ZV0gPSAoUlRFTlRSWSAqKSBtYWxsb2Moc2l6ZW9mKFJURU5UUlkpKTsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiAqICAgICAgQWRkIHRoaXMgdG8gdGhlIGRhdGFiYXNlCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBydGhlYWRbcnRzaXplXSwgKGNoYXIgKikgcnQsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFJURU5UUlkpKTsKICAgICAgICAgICAgICAgIHJ0c2l6ZSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZyZWUocm91dGVoYXNoKTsKICAgIH0KICAgIC8qCiAgICAgKiAgU29ydCBpdCEKICAgICAqLwogICAgcXNvcnQoKGNoYXIgKikgcnRoZWFkLCBydHNpemUsIHNpemVvZihydGhlYWRbMF0pLCBxc29ydF9jb21wYXJlKTsKfQojZWxzZQojaWZkZWYgbGludXgKc3RhdGljIHZvaWQKUm91dGVfU2Nhbl9SZWxvYWQodm9pZCkKewogICAgRklMRSAgICAgICAgICAgKmluOwogICAgY2hhciAgICAgICAgICAgIGxpbmVbMjU2XTsKICAgIHN0cnVjdCBydGVudHJ5ICpydDsKICAgIGNoYXIgICAgICAgICAgICBuYW1lWzE2XTsKICAgIHN0YXRpYyBpbnQgICAgICBUaW1lX09mX0xhc3RfUmVsb2FkID0gMDsKICAgIHN0cnVjdCB0aW1ldmFsICBub3c7CgogICAgZ2V0dGltZW9mZGF5KCZub3csIChzdHJ1Y3QgdGltZXpvbmUgKikgMCk7CiAgICBpZiAoVGltZV9PZl9MYXN0X1JlbG9hZCArIENBQ0hFX1RJTUUgPiBub3cudHZfc2VjKQogICAgICAgIHJldHVybjsKICAgIFRpbWVfT2ZfTGFzdF9SZWxvYWQgPSBub3cudHZfc2VjOwoKICAgIC8qCiAgICAgKiAgTWFrZXMgc3VyZSB3ZSBoYXZlIFNPTUUgc3BhY2UgYWxsb2NhdGVkIGZvciBuZXcgcm91dGluZyBlbnRyaWVzCiAgICAgKi8KICAgIGlmICghcnRoZWFkKSB7CiAgICAgICAgcnRoZWFkID0gKHN0cnVjdCBydGVudHJ5ICoqKSBjYWxsb2MoMTAwLCBzaXplb2Yoc3RydWN0IHJ0ZW50cnkgKikpOwogICAgICAgIGlmICghcnRoZWFkKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJyb3V0ZSB0YWJsZSBtYWxsb2MgZmFpbFxuIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcnRhbGxvY2F0ZSA9IDEwMDsKICAgIH0KCiAgICAvKgogICAgICogZmV0Y2ggcm91dGVzIGZyb20gdGhlIHByb2MgZmlsZS1zeXN0ZW06CiAgICAgKi8KCiAgICBydHNpemUgPSAwOwoKICAgIGlmICghKGluID0gZm9wZW4oIi9wcm9jL25ldC9yb3V0ZSIsICJyIikpKSB7CiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgImNhbm5vdCBvcGVuIC9wcm9jL25ldC9yb3V0ZSAtIGJ1cnBzXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgaW4pKSB7CiAgICAgICAgc3RydWN0IHJ0ZW50cnkgIHJ0ZW50OwogICAgICAgIGNoYXIgICAgICAgICAgICBydGVudF9uYW1lWzMyXTsKICAgICAgICBpbnQgICAgICAgICAgICAgcmVmY250LCBmbGFncywgbWV0cmljOwogICAgICAgIHVuc2lnbmVkICAgICAgICB1c2U7CgogICAgICAgIHJ0ID0gJnJ0ZW50OwogICAgICAgIG1lbXNldCgoY2hhciAqKSBydCwgKDApLCBzaXplb2YoKnJ0KSk7CiAgICAgICAgcnQtPnJ0X2RldiA9IHJ0ZW50X25hbWU7CgogICAgICAgIC8qCiAgICAgICAgICogYXMgd2l0aCAxLjk5LjE0OgogICAgICAgICAqIElmYWNlIERlc3QgR1cgRmxhZ3MgUmVmQ250IFVzZSBNZXRyaWMgTWFzayBNVFUgV2luIElSVFQKICAgICAgICAgKiBldGgwIDBBMEEwQTBBIDAwMDAwMDAwIDA1IDAgMCAwIEZGRkZGRkZGIDE1MDAgMCAwIAogICAgICAgICAqLwogICAgICAgIGlmICg4ICE9IHNzY2FuZihsaW5lLCAiJXMgJXggJXggJXggJXUgJWQgJWQgJXggJSpkICUqZCAlKmRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ0LT5ydF9kZXYsCiAgICAgICAgICAgICAgICAgICAgICAgICYoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJihydGVudC5ydF9kc3QpKS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2FkZHIuc19hZGRyKSwKICAgICAgICAgICAgICAgICAgICAgICAgJigoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmKHJ0ZW50LnJ0X2dhdGV3YXkpKS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2FkZHIuc19hZGRyKSwKICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICogWFhYOiBmaXggdHlwZSBvZiB0aGUgYXJncyAKICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgJnJlZmNudCwgJnVzZSwgJm1ldHJpYywKICAgICAgICAgICAgICAgICAgICAgICAgJigoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmKHJ0ZW50LnJ0X2dlbm1hc2spKS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2FkZHIuc19hZGRyKSkpCiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICBzdHJsY3B5KG5hbWUsIHJ0LT5ydF9kZXYsIHNpemVvZihuYW1lKSk7CgogICAgICAgIHJ0LT5ydF9mbGFncyA9IGZsYWdzLCBydC0+cnRfcmVmY250ID0gcmVmY250OwogICAgICAgIHJ0LT5ydF91c2UgPSB1c2UsIHJ0LT5ydF9tZXRyaWMgPSBtZXRyaWM7CgogICAgICAgIHJ0LT5ydF91bml0ID0gbmV0c25tcF9hY2Nlc3NfaW50ZXJmYWNlX2luZGV4X2ZpbmQobmFtZSk7CgogICAgICAgIC8qCiAgICAgICAgICogIEFsbG9jYXRlIGEgYmxvY2sgdG8gaG9sZCBpdCBhbmQgYWRkIGl0IHRvIHRoZSBkYXRhYmFzZQogICAgICAgICAqLwogICAgICAgIGlmIChydHNpemUgPj0gcnRhbGxvY2F0ZSkgewogICAgICAgICAgICBydGhlYWQgPSAoc3RydWN0IHJ0ZW50cnkgKiopIHJlYWxsb2MoKGNoYXIgKikgcnRoZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIHJ0YWxsb2NhdGUgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBydGVudHJ5ICopKTsKICAgICAgICAgICAgbWVtc2V0KCZydGhlYWRbcnRhbGxvY2F0ZV0sIDAsCiAgICAgICAgICAgICAgICAgICBydGFsbG9jYXRlICogc2l6ZW9mKHN0cnVjdCBydGVudHJ5ICopKTsKICAgICAgICAgICAgcnRhbGxvY2F0ZSAqPSAyOwogICAgICAgIH0KICAgICAgICBpZiAoIXJ0aGVhZFtydHNpemVdKQogICAgICAgICAgICBydGhlYWRbcnRzaXplXSA9CiAgICAgICAgICAgICAgICAoc3RydWN0IHJ0ZW50cnkgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRlbnRyeSkpOwogICAgICAgIC8qCiAgICAgICAgICogIEFkZCB0aGlzIHRvIHRoZSBkYXRhYmFzZQogICAgICAgICAqLwogICAgICAgIG1lbWNweSgoY2hhciAqKSBydGhlYWRbcnRzaXplXSwgKGNoYXIgKikgcnQsCiAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgcnRlbnRyeSkpOwogICAgICAgIHJ0c2l6ZSsrOwogICAgfQoKICAgIGZjbG9zZShpbik7CgogICAgLyoKICAgICAqICBTb3J0IGl0IQogICAgICovCiAgICBxc29ydCgoY2hhciAqKSBydGhlYWQsIHJ0c2l6ZSwgc2l6ZW9mKHJ0aGVhZFswXSksIHFzb3J0X2NvbXBhcmUpOwp9CiNlbmRpZgojZW5kaWYKI2VuZGlmCgoKI2lmbmRlZiBzb2xhcmlzMgovKgogKiAgICAgIENyZWF0ZSBhIGhvc3QgdGFibGUKICovCiNpZmRlZiBocHV4MTEKc3RhdGljIGludApxc29ydF9jb21wYXJlKGNvbnN0IHZvaWQgKnYxLCBjb25zdCB2b2lkICp2MikKewogICAgY29uc3QgbWliX2lwUm91dGVFbnQgKnIxID0gKGNvbnN0IG1pYl9pcFJvdXRlRW50ICopIHYxOwogICAgY29uc3QgbWliX2lwUm91dGVFbnQgKnIyID0gKGNvbnN0IG1pYl9pcFJvdXRlRW50ICopIHYyOwogICAgLyoKICAgICAqICAgICAgRG8gdGhlIGNvbXBhcmlzb24KICAgICAqLwogICAgaWYgKHIxLT5EZXN0ID09IHIyLT5EZXN0KQogICAgICAgIHJldHVybiAoMCk7CiAgICBpZiAocjEtPkRlc3QgID4gcjItPkRlc3QpCiAgICAgICAgcmV0dXJuICgxKTsKICAgIHJldHVybiAoLTEpOwp9CiNlbHNlCnN0YXRpYyBpbnQKcXNvcnRfY29tcGFyZShjb25zdCB2b2lkICp2MSwgY29uc3Qgdm9pZCAqdjIpCnsKICAgIFJURU5UUlkgKiBjb25zdCAqcjEgPSAoUlRFTlRSWSAqIGNvbnN0ICopIHYxOwogICAgUlRFTlRSWSAqIGNvbnN0ICpyMiA9IChSVEVOVFJZICogY29uc3QgKikgdjI7CiNpZiBORUVEX0tMR0VUU0EKICAgIHJlZ2lzdGVyIHVfbG9uZyBkc3QxID0KICAgICAgICBudG9obChrbGdldHNhKChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgKCpyMSktPnJ0X2RzdCktPgogICAgICAgICAgICAgIHNpbl9hZGRyLnNfYWRkcik7CiAgICByZWdpc3RlciB1X2xvbmcgZHN0MiA9CiAgICAgICAgbnRvaGwoa2xnZXRzYSgoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopICgqcjIpLT5ydF9kc3QpLT4KICAgICAgICAgICAgICBzaW5fYWRkci5zX2FkZHIpOwojZWxzZQogICAgcmVnaXN0ZXIgdV9sb25nIGRzdDEgPQogICAgICAgIG50b2hsKCgoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopICYoKCpyMSktPnJ0X2RzdCkpLT5zaW5fYWRkci4KICAgICAgICAgICAgICBzX2FkZHIpOwogICAgcmVnaXN0ZXIgdV9sb25nIGRzdDIgPQogICAgICAgIG50b2hsKCgoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopICYoKCpyMiktPnJ0X2RzdCkpLT5zaW5fYWRkci4KICAgICAgICAgICAgICBzX2FkZHIpOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FRURfS0xHRVRTQSAqLwoKICAgIC8qCiAgICAgKiAgICAgIERvIHRoZSBjb21wYXJpc29uCiAgICAgKi8KICAgIGlmIChkc3QxID09IGRzdDIpCiAgICAgICAgcmV0dXJuICgwKTsKICAgIGlmIChkc3QxID4gZHN0MikKICAgICAgICByZXR1cm4gKDEpOwogICAgcmV0dXJuICgtMSk7Cn0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTEgKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgVVNFX1NZU0NUTF9ST1VURV9EVU1QICovCgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdJTjMyIGN5Z3dpbiAqLwojaW5jbHVkZSA8aXBobHBhcGkuaD4KI2lmbmRlZiBNSUJfSVBQUk9UT19ORVRNR01UCiNkZWZpbmUgTUlCX0lQUFJPVE9fTkVUTUdNVCAzCiNlbmRpZgoKUE1JQl9JUEZPUldBUkRST1cgcm91dGVfcm93OwppbnQgICAgICAgICAgICAgY3JlYXRlX2ZsYWc7CnZvaWQKaW5pdF92YXJfcm91dGUodm9pZCkKewp9Cgp1X2NoYXIgICAgICAgICAqCnZhcl9pcFJvdXRlRW50cnkoc3RydWN0IHZhcmlhYmxlICp2cCwKICAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgLyoKICAgICAqIG9iamVjdCBpZGVudGlmaWVyIGlzIG9mIGZvcm06CiAgICAgKiAxLjMuNi4xLjIuMS40LjIxLjEuPy5BLkIuQy5ELCAgd2hlcmUgQS5CLkMuRCBpcyBJUCBhZGRyZXNzLgogICAgICogSVBBRERSIHN0YXJ0cyBhdCBvZmZzZXQgMTAuCiAgICAgKi8KICAgIHJlZ2lzdGVyIGludCAgICBTYXZlX1ZhbGlkLCByZXN1bHQsIFJ0SW5kZXggPSAwOwogICAgc3RhdGljIGludCAgICAgIHNhdmVOYW1lTGVuID0gMCwgc2F2ZUV4YWN0ID0gMCwgc2F2ZVJ0SW5kZXggPQogICAgICAgIDAsIHJ0c2l6ZSA9IDA7CiAgICBzdGF0aWMgb2lkICAgICAgc2F2ZU5hbWVbTUFYX09JRF9MRU5dLCBDdXJyZW50W01BWF9PSURfTEVOXTsKICAgIHVfY2hhciAgICAgICAgICpjcDsKICAgIG9pZCAgICAgICAgICAgICpvcDsKICAgIERXT1JEICAgICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKICAgIERXT1JEICAgICAgICAgICBkd0FjdHVhbFNpemUgPSAwOwogICAgc3RhdGljIFBNSUJfSVBGT1JXQVJEVEFCTEUgcElwUnRyVGFibGUgPSBOVUxMOwogICAgc3RydWN0IHRpbWV2YWwgIG5vdzsKICAgIHN0YXRpYyBsb25nICAgICBUaW1lX09mX0xhc3RfUmVsb2FkID0gMDsKICAgIHN0YXRpYyBpbl9hZGRyX3QgYWRkcl9yZXQ7CgoKICAgIC8qKiAKICAgICAqKiB0aGlzIG9wdGltaXNhdGlvbiBmYWlscywgaWYgdGhlcmUgaXMgb25seSBhIHNpbmdsZSByb3V0ZSBhdmFpbC4KICAgICAqKiBpdCBpcyBhIHZlcnkgc3BlY2lhbCBjYXNlLCBidXQgYmV0dGVyIGxlYXZlIGl0IG91dCAuLi4KICAgICAqKi8KI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICBzYXZlTmFtZUxlbiA9IDA7CiNlbmRpZgogICAgaWYgKHJvdXRlX3JvdyA9PSBOVUxMKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBGcmVlIGFsbG9jYXRlZCBtZW1vcnkgaW4gY2FzZSBvZiBTRVQgcmVxdWVzdCdzIEZSRUUgcGhhc2UgCiAgICAgICAgICovCiAgICAgICAgcm91dGVfcm93ID0gKFBNSUJfSVBGT1JXQVJEUk9XKSBtYWxsb2Moc2l6ZW9mKE1JQl9JUEZPUldBUkRST1cpKTsKICAgIH0KICAgIGdldHRpbWVvZmRheSgmbm93LCAoc3RydWN0IHRpbWV6b25lICopIDApOwogICAgaWYgKChydHNpemUgPD0gMSkgfHwgKFRpbWVfT2ZfTGFzdF9SZWxvYWQgKyA1IDw9IG5vdy50dl9zZWMpKQogICAgICAgIFNhdmVfVmFsaWQgPSAwOwogICAgZWxzZQogICAgICAgIC8qCiAgICAgICAgICogIE9QVElNSVpBVElPTjoKICAgICAgICAgKgogICAgICAgICAqICBJZiB0aGUgbmFtZSB3YXMgdGhlIHNhbWUgYXMgdGhlIGxhc3QgbmFtZSwgd2l0aCB0aGUgcG9zc2libGUKICAgICAgICAgKiAgZXhjZXB0aW9uIG9mIHRoZSBbOV10aCB0b2tlbiwgdGhlbiBkb24ndCByZWFkIHRoZSByb3V0aW5nIHRhYmxlCiAgICAgICAgICoKICAgICAgICAgKi8KCiAgICBpZiAoKHNhdmVOYW1lTGVuID09IChpbnQpICpsZW5ndGgpICYmIChzYXZlRXhhY3QgPT0gZXhhY3QpKSB7CiAgICAgICAgcmVnaXN0ZXIgaW50ICAgIHRlbXAgPSBuYW1lWzldOwogICAgICAgIG5hbWVbOV0gPSAwOwogICAgICAgIFNhdmVfVmFsaWQgPQogICAgICAgICAgICAoc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBzYXZlTmFtZSwgc2F2ZU5hbWVMZW4pID09IDApOwogICAgICAgIG5hbWVbOV0gPSB0ZW1wOwogICAgfSBlbHNlCiAgICAgICAgU2F2ZV9WYWxpZCA9IDA7CgogICAgaWYgKFNhdmVfVmFsaWQpIHsKICAgICAgICByZWdpc3RlciBpbnQgICAgdGVtcCA9IG5hbWVbOV07IC8qIEZpeCB1cCAnbG93ZXN0JyBmb3VuZCBlbnRyeSAqLwogICAgICAgIG1lbWNweSgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBDdXJyZW50LCAxNCAqIHNpemVvZihvaWQpKTsKICAgICAgICBuYW1lWzldID0gdGVtcDsKICAgICAgICAqbGVuZ3RoID0gMTQ7CiAgICAgICAgUnRJbmRleCA9IHNhdmVSdEluZGV4OwogICAgfSBlbHNlIHsKICAgICAgICAvKgogICAgICAgICAqIGZpbGwgaW4gb2JqZWN0IHBhcnQgb2YgbmFtZSBmb3IgY3VycmVudChsZXNzIHNpemVvZiBpbnN0YW5jZSBwYXJ0KSAKICAgICAgICAgKi8KCiAgICAgICAgbWVtY3B5KChjaGFyICopIEN1cnJlbnQsIChjaGFyICopIHZwLT5uYW1lLAogICAgICAgICAgICAgICAoaW50KSAodnAtPm5hbWVsZW4pICogc2l6ZW9mKG9pZCkpOwoKCiAgICAgICAgaWYgKChUaW1lX09mX0xhc3RfUmVsb2FkICsgNSA8PSBub3cudHZfc2VjKQogICAgICAgICAgICB8fCAocElwUnRyVGFibGUgPT0gTlVMTCkpIHsKICAgICAgICAgICAgaWYgKHBJcFJ0clRhYmxlICE9IE5VTEwpCiAgICAgICAgICAgICAgICBmcmVlKHBJcFJ0clRhYmxlKTsKICAgICAgICAgICAgVGltZV9PZl9MYXN0X1JlbG9hZCA9IG5vdy50dl9zZWM7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHF1ZXJ5IGZvciBidWZmZXIgc2l6ZSBuZWVkZWQgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzdGF0dXMgPSBHZXRJcEZvcndhcmRUYWJsZShwSXBSdHJUYWJsZSwgJmR3QWN0dWFsU2l6ZSwgVFJVRSk7CiAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUikgewogICAgICAgICAgICAgICAgcElwUnRyVGFibGUgPSAoUE1JQl9JUEZPUldBUkRUQUJMRSkgbWFsbG9jKGR3QWN0dWFsU2l6ZSk7CiAgICAgICAgICAgICAgICBpZiAocElwUnRyVGFibGUgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogR2V0IHRoZSBzb3J0ZWQgSVAgUm91dGUgVGFibGUgCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0KICAgICAgICAgICAgICAgICAgICAgICAgR2V0SXBGb3J3YXJkVGFibGUocElwUnRyVGFibGUsICZkd0FjdHVhbFNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgcnRzaXplID0gcElwUnRyVGFibGUtPmR3TnVtRW50cmllczsKICAgICAgICAgICAgZm9yIChSdEluZGV4ID0gMDsgUnRJbmRleCA8IHJ0c2l6ZTsgUnRJbmRleCsrKSB7CiAgICAgICAgICAgICAgICBjcCA9ICh1X2NoYXIgKikgJiBwSXBSdHJUYWJsZS0+dGFibGVbUnRJbmRleF0uCiAgICAgICAgICAgICAgICAgICAgZHdGb3J3YXJkRGVzdDsKICAgICAgICAgICAgICAgIG9wID0gQ3VycmVudCArIDEwOwogICAgICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAgICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKCiAgICAgICAgICAgICAgICByZXN1bHQgPSBzbm1wX29pZF9jb21wYXJlKG5hbWUsICpsZW5ndGgsIEN1cnJlbnQsIDE0KTsKICAgICAgICAgICAgICAgIGlmICgoZXhhY3QgJiYgKHJlc3VsdCA9PSAwKSkgfHwgKCFleGFjdCAmJiAocmVzdWx0IDwgMCkpKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChSdEluZGV4ID49IHJ0c2l6ZSkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBmb3IgY3JlYXRpb24gb2YgbmV3IHJvdywgb25seSBpcE5ldFRvTWVkaWFUYWJsZSBjYXNlIGlzIGNvbnNpZGVyZWQgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoKmxlbmd0aCA9PSAxNCkgewogICAgICAgICAgICAgICAgdV9jaGFyICAgICAgICAgICBkZXN0X2FkZHJbNF07CiAgICAgICAgICAgICAgICBNSUJfSVBGT1JXQVJEUk9XIHRlbXBfcm93OwoKICAgICAgICAgICAgICAgIGNyZWF0ZV9mbGFnID0gMTsKICAgICAgICAgICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9ydGU7CiAgICAgICAgICAgICAgICBkZXN0X2FkZHJbMF0gPSAodV9jaGFyKSBuYW1lWzEwXTsKICAgICAgICAgICAgICAgIGRlc3RfYWRkclsxXSA9ICh1X2NoYXIpIG5hbWVbMTFdOwogICAgICAgICAgICAgICAgZGVzdF9hZGRyWzJdID0gKHVfY2hhcikgbmFtZVsxMl07CiAgICAgICAgICAgICAgICBkZXN0X2FkZHJbM10gPSAodV9jaGFyKSBuYW1lWzEzXTsKICAgICAgICAgICAgICAgIG1lbXNldCgmdGVtcF9yb3csIDAsIHNpemVvZih0ZW1wX3JvdykpOwogICAgICAgICAgICAgICAgdGVtcF9yb3cuZHdGb3J3YXJkRGVzdCA9ICooKERXT1JEICopIGRlc3RfYWRkcik7CiAgICAgICAgICAgICAgICB0ZW1wX3Jvdy5kd0ZvcndhcmRQb2xpY3kgPSAwOwogICAgICAgICAgICAgICAgdGVtcF9yb3cuZHdGb3J3YXJkUHJvdG8gPSBNSUJfSVBQUk9UT19ORVRNR01UOwogICAgICAgICAgICAgICAgKnJvdXRlX3JvdyA9IHRlbXBfcm93OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZyZWUocElwUnRyVGFibGUpOwogICAgICAgICAgICBwSXBSdHJUYWJsZSA9IE5VTEw7CiAgICAgICAgICAgIHJ0c2l6ZSA9IDA7CiAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CiAgICAgICAgfQogICAgICAgIGNyZWF0ZV9mbGFnID0gMDsKICAgICAgICAvKgogICAgICAgICAqICBTYXZlIGluIHRoZSAnY2FjaGUnCiAgICAgICAgICovCiAgICAgICAgbWVtY3B5KChjaGFyICopIHNhdmVOYW1lLCAoY2hhciAqKSBuYW1lLAogICAgICAgICAgICAgICBTTk1QX01JTigqbGVuZ3RoLCBNQVhfT0lEX0xFTikgKiBzaXplb2Yob2lkKSk7CiAgICAgICAgc2F2ZU5hbWVbOV0gPSAwOwogICAgICAgIHNhdmVOYW1lTGVuID0gKmxlbmd0aDsKICAgICAgICBzYXZlRXhhY3QgPSBleGFjdDsKICAgICAgICBzYXZlUnRJbmRleCA9IFJ0SW5kZXg7CgogICAgICAgIC8qCiAgICAgICAgICogIFJldHVybiB0aGUgbmFtZQogICAgICAgICAqLwogICAgICAgIG1lbWNweSgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBDdXJyZW50LCAxNCAqIHNpemVvZihvaWQpKTsKICAgICAgICAqbGVuZ3RoID0gMTQ7CiAgICB9CiAgICAqdmFyX2xlbiA9IHNpemVvZihsb25nX3JldHVybik7CiAgICAqcm91dGVfcm93ID0gcElwUnRyVGFibGUtPnRhYmxlW1J0SW5kZXhdOwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIElQUk9VVEVERVNUOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcnRlOwogICAgICAgIGFkZHJfcmV0ID0gcElwUnRyVGFibGUtPnRhYmxlW1J0SW5kZXhdLmR3Rm9yd2FyZERlc3Q7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKICAgIGNhc2UgSVBST1VURUlGSU5ERVg6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3J0ZTsKICAgICAgICBsb25nX3JldHVybiA9IHBJcFJ0clRhYmxlLT50YWJsZVtSdEluZGV4XS5kd0ZvcndhcmRJZkluZGV4OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUMxOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9ydGU7CiAgICAgICAgbG9uZ19yZXR1cm4gPSBwSXBSdHJUYWJsZS0+dGFibGVbUnRJbmRleF0uZHdGb3J3YXJkTWV0cmljMTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDMjoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcnRlOwogICAgICAgIGxvbmdfcmV0dXJuID0gcElwUnRyVGFibGUtPnRhYmxlW1J0SW5kZXhdLmR3Rm9yd2FyZE1ldHJpYzI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzM6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3J0ZTsKICAgICAgICBsb25nX3JldHVybiA9IHBJcFJ0clRhYmxlLT50YWJsZVtSdEluZGV4XS5kd0ZvcndhcmRNZXRyaWMzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUM0OgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9ydGU7CiAgICAgICAgbG9uZ19yZXR1cm4gPSBwSXBSdHJUYWJsZS0+dGFibGVbUnRJbmRleF0uZHdGb3J3YXJkTWV0cmljNDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDNToKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcnRlOwogICAgICAgIGxvbmdfcmV0dXJuID0gcElwUnRyVGFibGUtPnRhYmxlW1J0SW5kZXhdLmR3Rm9yd2FyZE1ldHJpYzU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU5FWFRIT1A6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9ydGU7CiAgICAgICAgYWRkcl9yZXQgPSBwSXBSdHJUYWJsZS0+dGFibGVbUnRJbmRleF0uZHdGb3J3YXJkTmV4dEhvcDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGFkZHJfcmV0OwogICAgY2FzZSBJUFJPVVRFVFlQRToKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcnRlOwogICAgICAgIGxvbmdfcmV0dXJuID0gcElwUnRyVGFibGUtPnRhYmxlW1J0SW5kZXhdLmR3Rm9yd2FyZFR5cGU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURVBST1RPOgogICAgICAgIGxvbmdfcmV0dXJuID0gcElwUnRyVGFibGUtPnRhYmxlW1J0SW5kZXhdLmR3Rm9yd2FyZFByb3RvOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVBR0U6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3J0ZTsKICAgICAgICBsb25nX3JldHVybiA9IHBJcFJ0clRhYmxlLT50YWJsZVtSdEluZGV4XS5kd0ZvcndhcmRBZ2U7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1BU0s6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3J0ZTsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAgICAgYWRkcl9yZXQgPSBwSXBSdHJUYWJsZS0+dGFibGVbUnRJbmRleF0uZHdGb3J3YXJkTWFzazsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGFkZHJfcmV0OwogICAgY2FzZSBJUFJPVVRFSU5GTzoKICAgICAgICAqdmFyX2xlbiA9IG51bGxPaWRMZW47CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgbnVsbE9pZDsKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9pcFJvdXRlRW50cnlcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXSU4zMiBjeWd3aW4gKi8KCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9DQU5fVVNFX1NZU0NUTCAqLwoKc3RhdGljClRBSUxRX0hFQUQoLCBzbm1wcnQpCiAgICBydGhlYWQ7CiAgICAgc3RhdGljIGNoYXIgICAgKnJ0YnVmOwogICAgIHN0YXRpYyBzaXplX3QgICBydGJ1ZmxlbjsKICAgICBzdGF0aWMgdGltZV90ICAgbGFzdHRpbWU7CgogICAgIHN0cnVjdCBzbm1wcnQgewogICAgICAgICBUQUlMUV9FTlRSWShzbm1wcnQpIGxpbms7CiAgICAgICAgIHN0cnVjdCBydF9tc2doZHIgKmhkcjsKICAgICAgICAgc3RydWN0IGluX2FkZHIgIGRlc3Q7CiAgICAgICAgIHN0cnVjdCBpbl9hZGRyICBnYXRld2F5OwogICAgICAgICBzdHJ1Y3QgaW5fYWRkciAgbmV0bWFzazsKICAgICAgICAgaW50ICAgICAgICAgICAgIGluZGV4OwogICAgICAgICBzdHJ1Y3QgaW5fYWRkciAgaWZhOwogICAgIH07CgogICAgIHN0YXRpYyB2b2lkCiAgICAgICAgICAgICAgICAgICAgIHJ0bXNnKHN0cnVjdCBydF9tc2doZHIgKnJ0bSkKewogICAgc3RydWN0IHNubXBydCAgKnJ0OwogICAgc3RydWN0IHNvY2thZGRyICpzYTsKICAgIGludCAgICAgICAgICAgICBiaXQsIGdvdGRlc3QsIGdvdG1hc2s7CgogICAgcnQgPSBtYWxsb2Moc2l6ZW9mICpydCk7CiAgICBpZiAocnQgPT0gMCkKICAgICAgICByZXR1cm47CiAgICBydC0+aGRyID0gcnRtOwogICAgcnQtPmlmYS5zX2FkZHIgPSAwOwogICAgcnQtPmRlc3QgPSBydC0+Z2F0ZXdheSA9IHJ0LT5uZXRtYXNrID0gcnQtPmlmYTsKICAgIHJ0LT5pbmRleCA9IHJ0bS0+cnRtX2luZGV4OwoKICAgIGdvdGRlc3QgPSBnb3RtYXNrID0gMDsKICAgIHNhID0gKHN0cnVjdCBzb2NrYWRkciAqKSAocnRtICsgMSk7CiAgICBmb3IgKGJpdCA9IDE7ICgoY2hhciAqKSBzYSA8IChjaGFyICopIHJ0bSArIHJ0bS0+cnRtX21zZ2xlbikgJiYgYml0OwogICAgICAgICBiaXQgPDw9IDEpIHsKICAgICAgICBpZiAoKHJ0bS0+cnRtX2FkZHJzICYgYml0KSA9PSAwKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBzd2l0Y2ggKGJpdCkgewogICAgICAgIGNhc2UgUlRBX0RTVDoKI2RlZmluZSBzYXRvc2luKHNhKSAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKShzYSkpCiAgICAgICAgICAgIHJ0LT5kZXN0ID0gc2F0b3NpbihzYSktPnNpbl9hZGRyOwogICAgICAgICAgICBnb3RkZXN0ID0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBSVEFfR0FURVdBWToKICAgICAgICAgICAgaWYgKHNhLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkKICAgICAgICAgICAgICAgIHJ0LT5nYXRld2F5ID0gc2F0b3NpbihzYSktPnNpbl9hZGRyOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFJUQV9ORVRNQVNLOgogICAgICAgICAgICBpZiAoc2EtPnNhX2xlbiA+PSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfaW4sIHNpbl9hZGRyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydC0+bmV0bWFzayA9IHNhdG9zaW4oc2EpLT5zaW5fYWRkcjsKICAgICAgICAgICAgZ290bWFzayA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUlRBX0lGQToKICAgICAgICAgICAgaWYgKHNhLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkKICAgICAgICAgICAgICAgIHJ0LT5pZmEgPSBzYXRvc2luKHNhKS0+c2luX2FkZHI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvKgogICAgICAgICAqIGZyb20gcnRzb2NrLmMgCiAgICAgICAgICovCiNkZWZpbmUgUk9VTkRVUChhKSBcCiAgICAgICAgKChhKSA+IDAgPyAoMSArICgoKGEpIC0gMSkgfCAoc2l6ZW9mKGxvbmcpIC0gMSkpKSA6IHNpemVvZihsb25nKSkKICAgICAgICBzYSA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgKChjaGFyICopIHNhICsgUk9VTkRVUChzYS0+c2FfbGVuKSk7CiAgICB9CiAgICBpZiAoIWdvdGRlc3QpIHsKICAgICAgICAvKgogICAgICAgICAqIFhYWCBjYW4ndCBoYXBwZW4gaWYgY29kZSBhYm92ZSBpcyBjb3JyZWN0IAogICAgICAgICAqLwogICAgICAgIHNubXBfbG9nKExPR19FUlIsICJyb3V0ZSBubyBkZXN0P1xuIik7CiAgICAgICAgZnJlZShydCk7CiAgICB9IGVsc2UgewogICAgICAgIC8qCiAgICAgICAgICogSWYgbm8gbWFzayBwcm92aWRlZCwgaXQgd2FzIGEgaG9zdCByb3V0ZS4gCiAgICAgICAgICovCiAgICAgICAgaWYgKCFnb3RtYXNrKQogICAgICAgICAgICBydC0+bmV0bWFzay5zX2FkZHIgPSB+MDsKICAgICAgICBUQUlMUV9JTlNFUlRfVEFJTCgmcnRoZWFkLCBydCwgbGluayk7CiAgICB9Cn0KCnN0YXRpYyBpbnQKc3Vja19rcnQoaW50IGZvcmNlKQp7CiAgICB0aW1lX3QgICAgICAgICAgbm93OwogICAgc3RydWN0IHNubXBydCAgKnJ0LCAqbmV4dDsKICAgIHNpemVfdCAgICAgICAgICBsZW47CiAgICBzdGF0aWMgaW50ICAgICAgbmFtZVs2XSA9CiAgICAgICAgeyBDVExfTkVULCBQRl9ST1VURSwgMCwgQUZfSU5FVCwgTkVUX1JUX0RVTVAsIDAgfTsKICAgIGNoYXIgICAgICAgICAgICpjcDsKICAgIHN0cnVjdCBydF9tc2doZHIgKnJ0bTsKCiAgICB0aW1lKCZub3cpOwogICAgaWYgKG5vdyA8IChsYXN0dGltZSArIENBQ0hFX1RJTUUpICYmICFmb3JjZSkKICAgICAgICByZXR1cm4gMDsKICAgIGxhc3R0aW1lID0gbm93OwoKICAgIGZvciAocnQgPSBydGhlYWQudHFoX2ZpcnN0OyBydDsgcnQgPSBuZXh0KSB7CiAgICAgICAgbmV4dCA9IHJ0LT5saW5rLnRxZV9uZXh0OwogICAgICAgIGZyZWUocnQpOwogICAgfQogICAgVEFJTFFfSU5JVCgmcnRoZWFkKTsKCiAgICBpZiAoc3lzY3RsKG5hbWUsIDYsIDAsICZsZW4sIDAsIDApIDwgMCkgewogICAgICAgIHN5c2xvZyhMT0dfV0FSTklORywgInN5c2N0bCBuZXQtcm91dGUtZHVtcDogJW0iKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgaWYgKGxlbiA+IHJ0YnVmbGVuKSB7CiAgICAgICAgY2hhciAgICAgICAgICAgKm5ld2J1ZjsKICAgICAgICBuZXdidWYgPSByZWFsbG9jKHJ0YnVmLCBsZW4pOwogICAgICAgIGlmIChuZXdidWYgPT0gMCkKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIHJ0YnVmID0gbmV3YnVmOwogICAgICAgIHJ0YnVmbGVuID0gbGVuOwogICAgfQoKICAgIGlmIChzeXNjdGwobmFtZSwgNiwgcnRidWYsICZsZW4sIDAsIDApIDwgMCkgewogICAgICAgIHN5c2xvZyhMT0dfV0FSTklORywgInN5c2N0bCBuZXQtcm91dGUtZHVtcDogJW0iKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgY3AgPSBydGJ1ZjsKICAgIHdoaWxlIChjcCA8IHJ0YnVmICsgbGVuKSB7CiAgICAgICAgcnRtID0gKHN0cnVjdCBydF9tc2doZHIgKikgY3A7CiAgICAgICAgLyoKICAgICAgICAgKiBOQjoKICAgICAgICAgKiBZb3UgbWlnaHQgd2FudCB0byBleGNsdWRlIHJvdXRlcyB3aXRoIFJURl9XQVNDTE9ORUQKICAgICAgICAgKiBzZXQuICBUaGlzIGtlZXBzIHRoZSBjbG9uZWQgaG9zdCByb3V0ZXMgKGFuZCB0aHVzIGFsc28KICAgICAgICAgKiBBUlAgZW50cmllcykgb3V0IG9mIHRoZSByb3V0aW5nIHRhYmxlLiAgVGh1cywgaXQgYWxzbwogICAgICAgICAqIHByZXNlbnRzIG1hbmFnZW1lbnQgc3RhdGlvbnMgd2l0aCBhbiBpbmNvbXBsZXRlIHZpZXcuCiAgICAgICAgICogSSBiZWxpZXZlIHRoYXQgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIGZvciBhIG1hbmFnZW1lbnQKICAgICAgICAgKiBzdGF0aW9uIHRvIGV4YW1pbmUgKGFuZCBwZXJoYXBzIGRlbGV0ZSkgc3VjaCByb3V0ZXMuCiAgICAgICAgICovCiAgICAgICAgaWYgKHJ0bS0+cnRtX3ZlcnNpb24gPT0gUlRNX1ZFUlNJT04gJiYgcnRtLT5ydG1fdHlwZSA9PSBSVE1fR0VUKQogICAgICAgICAgICBydG1zZyhydG0pOwogICAgICAgIGNwICs9IHJ0bS0+cnRtX21zZ2xlbjsKICAgIH0KICAgIHJldHVybiAwOwp9Cgp1X2NoYXIgICAgICAgICAqCnZhcl9pcFJvdXRlRW50cnkoc3RydWN0IHZhcmlhYmxlICogdnAsCiAgICAgICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIC8qCiAgICAgKiBvYmplY3QgaWRlbnRpZmllciBpcyBvZiBmb3JtOgogICAgICogMS4zLjYuMS4yLjEuNC4yMS4xLjEuQS5CLkMuRCwgIHdoZXJlIEEuQi5DLkQgaXMgSVAgYWRkcmVzcy4KICAgICAqIElQQUREUiBzdGFydHMgYXQgb2Zmc2V0IDEwLgogICAgICovCiAgICBpbnQgICAgICAgICAgICAgU2F2ZV9WYWxpZCwgcmVzdWx0OwogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgb2lkICAgICAgICAgICAgKm9wOwogICAgc3RydWN0IHNubXBydCAgKnJ0OwogICAgc3RhdGljIHN0cnVjdCBzbm1wcnQgKnNhdmVydDsKICAgIHN0YXRpYyBpbnQgICAgICBzYXZlTmFtZUxlbiwgc2F2ZUV4YWN0OwogICAgc3RhdGljIG9pZCAgICAgIHNhdmVOYW1lWzE0XSwgQ3VycmVudFsxNF07CiAgICBzdGF0aWMgaW5fYWRkcl90IGFkZHJfcmV0OwogICAgCiAgICAqd3JpdGVfbWV0aG9kID0gTlVMTDsgIC8qIHdyaXRlX3J0ZTsgIFhYWDogIFNFVCBzdXBwb3J0IG5vdCByZWFsbHkgaW1wbGVtZW50ZWQgKi8KCiNpZiAwCiAgICAvKgogICAgICogICAgICBPUFRJTUlaQVRJT046CiAgICAgKgogICAgICogICAgICBJZiB0aGUgbmFtZSB3YXMgdGhlIHNhbWUgYXMgdGhlIGxhc3QgbmFtZSwgd2l0aCB0aGUgcG9zc2libGUKICAgICAqICAgICAgZXhjZXB0aW9uIG9mIHRoZSBbOV10aCB0b2tlbiwgdGhlbiBkb24ndCByZWFkIHRoZSByb3V0aW5nIHRhYmxlCiAgICAgKgogICAgICovCgogICAgaWYgKChzYXZlTmFtZUxlbiA9PSAqbGVuZ3RoKSAmJiAoc2F2ZUV4YWN0ID09IGV4YWN0KSkgewogICAgICAgIGludCAgICAgICAgICAgICB0ZW1wID0gbmFtZVs5XTsKICAgICAgICBuYW1lWzldID0gMDsKICAgICAgICBTYXZlX1ZhbGlkID0KICAgICAgICAgICAgIXNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgc2F2ZU5hbWUsIHNhdmVOYW1lTGVuKTsKICAgICAgICBuYW1lWzldID0gdGVtcDsKICAgIH0gZWxzZSB7CiAgICAgICAgU2F2ZV9WYWxpZCA9IDA7CiAgICB9CiNlbHNlCiAgICBTYXZlX1ZhbGlkID0gMDsKI2VuZGlmCgogICAgaWYgKFNhdmVfVmFsaWQpIHsKICAgICAgICBpbnQgICAgICAgICAgICAgdGVtcCA9IG5hbWVbOV07CiAgICAgICAgbWVtY3B5KG5hbWUsIEN1cnJlbnQsIDE0ICogc2l6ZW9mKG9pZCkpOwogICAgICAgIG5hbWVbOV0gPSB0ZW1wOwogICAgICAgICpsZW5ndGggPSAxNDsKICAgICAgICBydCA9IHNhdmVydDsKICAgIH0gZWxzZSB7CiAgICAgICAgLyoKICAgICAgICAgKiBmaWxsIGluIG9iamVjdCBwYXJ0IG9mIG5hbWUgZm9yIGN1cnJlbnQKICAgICAgICAgKiAobGVzcyBzaXplb2YgaW5zdGFuY2UgcGFydCkgCiAgICAgICAgICovCgogICAgICAgIG1lbWNweShDdXJyZW50LCB2cC0+bmFtZSwgU05NUF9NSU4oc2l6ZW9mKEN1cnJlbnQpLCAoaW50KSh2cC0+bmFtZWxlbikgKiBzaXplb2Yob2lkKSkpOwoKICAgICAgICBzdWNrX2tydCgwKTsKCiAgICAgICAgZm9yIChydCA9IHJ0aGVhZC50cWhfZmlyc3Q7IHJ0OyBydCA9IHJ0LT5saW5rLnRxZV9uZXh0KSB7CiAgICAgICAgICAgIG9wID0gQ3VycmVudCArIDEwOwogICAgICAgICAgICBjcCA9ICh1X2NoYXIgKikgJiBydC0+ZGVzdDsKICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAgICAgcmVzdWx0ID0gc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBDdXJyZW50LCAxNCk7CiAgICAgICAgICAgIGlmICgoZXhhY3QgJiYgKHJlc3VsdCA9PSAwKSkKICAgICAgICAgICAgICAgIHx8ICghZXhhY3QgJiYgKHJlc3VsdCA8IDApKSkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAocnQgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgICAgIC8qCiAgICAgICAgICogIFNhdmUgaW4gdGhlICdjYWNoZScKICAgICAgICAgKi8KICAgICAgICBtZW1jcHkoc2F2ZU5hbWUsIG5hbWUsIFNOTVBfTUlOKHNpemVvZihzYXZlTmFtZSksICpsZW5ndGggKiBzaXplb2Yob2lkKSkpOwogICAgICAgIHNhdmVOYW1lWzldID0gMDsKICAgICAgICBzYXZlTmFtZUxlbiA9ICpsZW5ndGg7CiAgICAgICAgc2F2ZUV4YWN0ID0gZXhhY3Q7CiAgICAgICAgc2F2ZXJ0ID0gcnQ7CgogICAgICAgIC8qCiAgICAgICAgICogIFJldHVybiB0aGUgbmFtZQogICAgICAgICAqLwogICAgICAgIG1lbWNweShuYW1lLCBDdXJyZW50LCAxNCAqIHNpemVvZihvaWQpKTsKICAgICAgICAqbGVuZ3RoID0gMTQ7CiAgICB9CgogICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZ19yZXR1cm4pOwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIElQUk9VVEVERVNUOgogICAgICAgIGFkZHJfcmV0ID0gcnQtPmRlc3Quc19hZGRyOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGFkZHJfcmV0OwoKICAgIGNhc2UgSVBST1VURUlGSU5ERVg6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBydC0+aW5kZXg7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKCiAgICBjYXNlIElQUk9VVEVNRVRSSUMxOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHJ0LT5oZHItPnJ0bV9mbGFncyAmIFJURl9HQVRFV0FZKSA/IDEgOiAwOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUMyOgogICAgICAgIGxvbmdfcmV0dXJuID0gcnQtPmhkci0+cnRtX3JteC5ybXhfcnR0OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUMzOgogICAgICAgIGxvbmdfcmV0dXJuID0gcnQtPmhkci0+cnRtX3JteC5ybXhfcnR0dmFyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUM0OgogICAgICAgIGxvbmdfcmV0dXJuID0gcnQtPmhkci0+cnRtX3JteC5ybXhfc3N0aHJlc2g7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzU6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBydC0+aGRyLT5ydG1fcm14LnJteF9tdHU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKCiAgICBjYXNlIElQUk9VVEVORVhUSE9QOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKICAgICAgICBpZiAocnQtPmdhdGV3YXkuc19hZGRyID09IDAgJiYgcnQtPmlmYS5zX2FkZHIgPT0gMCkKICAgICAgICAgICAgYWRkcl9yZXQgPSAwOwogICAgICAgIGVsc2UgaWYgKHJ0LT5nYXRld2F5LnNfYWRkciA9PSAwKQogICAgICAgICAgICBhZGRyX3JldCA9IHJ0LT5pZmEuc19hZGRyOwogICAgICAgIGVsc2UKICAgICAgICAgICAgYWRkcl9yZXQgPSBydC0+Z2F0ZXdheS5zX2FkZHI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKCiAgICBjYXNlIElQUk9VVEVUWVBFOgogICAgICAgIGlmIChydC0+aGRyLT5ydG1fZmxhZ3MgJiBSVEZfVVApIHsKICAgICAgICAgICAgaWYgKHJ0LT5oZHItPnJ0bV9mbGFncyAmIFJURl9HQVRFV0FZKSB7CiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IDQ7ICAgICAgICAvKiAgaW5kaXJlY3QoNCkgICovCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IDM7ICAgICAgICAvKiAgZGlyZWN0KDMpICAqLwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAyOyAgICAvKiAgaW52YWxpZCgyKSAgKi8KICAgICAgICB9CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKCiAgICBjYXNlIElQUk9VVEVQUk9UTzoKICAgICAgICBsb25nX3JldHVybiA9IChydC0+aGRyLT5ydG1fZmxhZ3MgJiBSVEZfRFlOQU1JQykgPyA0IDogMjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwoKICAgIGNhc2UgSVBST1VURUFHRToKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gMDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwoKICAgIGNhc2UgSVBST1VURU1BU0s6CiAgICAgICAgYWRkcl9yZXQgPSBydC0+bmV0bWFzay5zX2FkZHI7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CgogICAgY2FzZSBJUFJPVVRFSU5GTzoKICAgICAgICAqdmFyX2xlbiA9IG51bGxPaWRMZW47CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgbnVsbE9pZDsKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9pcFJvdXRlRW50cnlcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKdm9pZAppbml0X3Zhcl9yb3V0ZSh2b2lkKQp7CiAgICA7Cn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9DQU5fVVNFX1NZU0NUTCAqLwoKI2lmIGRlZmluZWQoSEFWRV9TWVNfU1lTQ1RMX0gpICYmICFkZWZpbmVkKGxpbnV4KQovKgogKiBnZXRfYWRkcmVzcygpCiAqIAogKiBUcmF2ZXJzZSB0aGUgYWRkcmVzcyBzdHJ1Y3R1cmVzIGFmdGVyIGEgcm91dGluZyBzb2NrZXQgbWVzc2FnZSBhbmQKICogZXh0cmFjdCBhIHNwZWNpZmljIG9uZS4KICogCiAqIFNvbWUgb2YgdGhpcyBpcyBwZWN1bGlhciB0byBJUklYIDYuMiwgd2hpY2ggZG9lc24ndCBoYXZlIHNhX2xlbiBpbgogKiB0aGUgc29ja2FkZHIgc3RydWN0dXJlIHlldC4gIFdpdGggc2FfbGVuLCBza2lwcGluZyBhbiBhZGRyZXNzIGVudHJ5CiAqIHdvdWxkIGJlIG11Y2ggZWFzaWVyLgogKi8KI2luY2x1ZGUgPHN5cy91bi5oPgoKLyoKICogcmV0dXJucyB0aGUgbGVuZ3RoIG9mIGEgc29ja2V0IHN0cnVjdHVyZSAKICovCgpzaXplX3QKc25tcF9zb2NrZXRfbGVuZ3RoKGludCBmYW1pbHkpCnsKICAgIHNpemVfdCAgICAgICAgICBsZW5ndGg7CgogICAgc3dpdGNoIChmYW1pbHkpIHsKI2lmbmRlZiBjeWd3aW4KI2lmICFkZWZpbmVkIChXSU4zMikgJiYgIWRlZmluZWQgKGN5Z3dpbikKI2lmZGVmIEFGX1VOSVgKICAgIGNhc2UgQUZfVU5JWDoKICAgICAgICBsZW5ndGggPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3VuKTsKICAgICAgICBicmVhazsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBRl9VTklYICovCiNlbmRpZgojZW5kaWYKCiNpZm5kZWYgYWl4MwojaWZkZWYgQUZfTElOSwogICAgY2FzZSBBRl9MSU5LOgojaWZkZWYgX01BWF9TQV9MRU4KICAgICAgICBsZW5ndGggPSBfTUFYX1NBX0xFTjsKI2VsaWYgU09DS19NQVhBRERSTEVOCiAgICAgICAgbGVuZ3RoID0gU09DS19NQVhBRERSTEVOOwojZWxzZQogICAgICAgIGxlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfZGwpOwojZW5kaWYKICAgICAgICBicmVhazsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBRl9MSU5LICovCiNlbmRpZgoKICAgIGNhc2UgQUZfSU5FVDoKICAgICAgICBsZW5ndGggPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcik7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIGxlbmd0aDsKfQoKY29uc3Qgc3RydWN0IHNvY2thZGRyICoKZ2V0X2FkZHJlc3MoY29uc3Qgdm9pZCAqX2FwLCBpbnQgYWRkcmVzc2VzLCBpbnQgd2FudGVkKQp7CiAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFwID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSBfYXA7CiAgICBpbnQgICAgICAgICAgICAgaWluZGV4OwogICAgaW50ICAgICAgICAgICAgIGJpdG1hc2s7CgogICAgZm9yIChpaW5kZXggPSAwLCBiaXRtYXNrID0gMTsKICAgICAgICAgaWluZGV4IDwgUlRBWF9NQVg7ICsraWluZGV4LCBiaXRtYXNrIDw8PSAxKSB7CiAgICAgICAgaWYgKGJpdG1hc2sgPT0gd2FudGVkKSB7CiAgICAgICAgICAgIGlmIChiaXRtYXNrICYgYWRkcmVzc2VzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoYml0bWFzayAmIGFkZHJlc3NlcykgewogICAgICAgICAgICB1bnNpZ25lZCAgICAgICAgbGVuZ3RoID0KICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgc25tcF9zb2NrZXRfbGVuZ3RoKGFwLT5zYV9mYW1pbHkpOwogICAgICAgICAgICB3aGlsZSAobGVuZ3RoICUgc2l6ZW9mKGxvbmcpICE9IDApCiAgICAgICAgICAgICAgICArK2xlbmd0aDsKICAgICAgICAgICAgYXAgPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopICgoY29uc3QgY2hhciAqKSBhcCArIGxlbmd0aCk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qCiAqIGdldF9pbl9hZGRyZXNzKCkKICogCiAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciB0aGUgc3BlY2lhbCBjYXNlIG9mIGdldF9hZGRyZXNzIHdoZXJlIGFuCiAqIEFGX0lORVQgYWRkcmVzcyBpcyBkZXNpcmVkLCBhbmQgd2UncmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBpbl9hZGRyCiAqIHBhcnQuCiAqLwpjb25zdCBzdHJ1Y3QgaW5fYWRkciAqCmdldF9pbl9hZGRyZXNzKGNvbnN0IHZvaWQgKmFwLCBpbnQgYWRkcmVzc2VzLCBpbnQgd2FudGVkKQp7CiAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmE7CgogICAgYSA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgZ2V0X2FkZHJlc3MoYXAsIGFkZHJlc3Nlcywgd2FudGVkKTsKICAgIGlmIChhID09IE5VTEwpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKGEtPnNpbl9mYW1pbHkgIT0gQUZfSU5FVCkgewogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsCiAgICAgICAgICAgICAgICAgICAgInVua25vd24gc29ja2V0IGZhbWlseSAlZCBbQUZfSU5FVCBleHBlY3RlZF0gaW4gdmFyX2lwUm91dGVFbnRyeS5cbiIsCiAgICAgICAgICAgICAgICAgICAgYS0+c2luX2ZhbWlseSkpOwogICAgfQogICAgcmV0dXJuICZhLT5zaW5fYWRkcjsKfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhBVkVfU1lTX1NZU0NUTF9IICovCg==