LyoKICogc25tcF92YXJfcm91dGUuYyAtIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5hbWVkIHZhcmlhYmxlLgogKgogKgogKi8KLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCglDb3B5cmlnaHQgMTk4OCwgMTk4OSBieSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQoJQ29weXJpZ2h0IDE5ODkJVEdWLCBJbmNvcnBvcmF0ZWQKCgkJICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgYW5kIFRHViBub3QgYmUgdXNlZAppbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCndpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KCkNNVSBBTkQgVEdWIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLApJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCkVWRU5UIFNIQUxMIENNVSBPUiBUR1YgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgpVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgpQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qCiAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgY29weXJpZ2h0ZWQgYnk6CiAqIENvcHlyaWdodCCpIDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zIHNwZWNpZmllZCBpbiB0aGUgQ09QWUlORyBmaWxlCiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhlIE5ldC1TTk1QIHBhY2thZ2UuCiAqLwoKLyoKICogYWRkaXRpb25zLCBmaXhlcyBhbmQgZW5oYW5jZW1lbnRzIGZvciBMaW51eCBieSBFcmlrIFNjaG9lbmZlbGRlcgogKiAoc2Nob2VuZnJAaWJyLmNzLnR1LWJzLmRlKSAxOTk0LzE5OTUuCiAqIExpbnV4IGFkZGl0aW9ucyB0YWtlbiBmcm9tIENNVSB0byBVQ0Qgc3RhY2sgYnkgSmVubmlmZXIgQnJheSBvZiBPcmlnaW4KICogKGpicmF5QG9yaWdpbi1hdC5jby51aykgMTk5NwogKiBTdXBwb3J0IGZvciBzeXNjdGwoe0NUTF9ORVQsUEZfUk9VVEUsLi4uKSBieSBTaW1vbiBMZWluZW4KICogKHNpbW9uQHN3aXRjaC5jaCkgMTk5NwogKi8KCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KCiNpbmNsdWRlICJyb3V0ZV9oZWFkZXJzLmgiCiNkZWZpbmUgQ0FDSEVfVElNRSAoMTIwKSAgICAgICAgLyogU2Vjb25kcyAqLwoKI2lmICFkZWZpbmVkKE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwpCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L25ldC1zbm1wLWFnZW50LWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9hdXRvX25saXN0Lmg+CiNpbmNsdWRlIDxuZXQtc25tcC9kYXRhX2FjY2Vzcy9pbnRlcmZhY2UuaD4KCiNpbmNsdWRlICJpcC5oIgojaW5jbHVkZSAia2VybmVsLmgiCiNpbmNsdWRlICJpbnRlcmZhY2VzLmgiCiNpbmNsdWRlICJzdHJ1Y3QuaCIKCiNpZm5kZWYgIE1JTgojZGVmaW5lICBNSU4oYSxiKSAgICAgICAgICAgICAgICAgICAgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKI2VuZGlmCgojaWZkZWYgaHB1eDExCiNpbmNsdWRlIDxzeXMvbWliLmg+CiNpbmNsdWRlIDxuZXRpbmV0L21pYl9rZXJuLmg+CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eCAqLwoKZXh0ZXJuIFdyaXRlTWV0aG9kIHdyaXRlX3J0ZTsKCiNpZiAhZGVmaW5lZCAoV0lOMzIpICYmICFkZWZpbmVkIChjeWd3aW4pCgojaWZkZWYgVVNFX1NZU0NUTF9ST1VURV9EVU1QCgpzdGF0aWMgdm9pZCAgICAgUm91dGVfU2Nhbl9SZWxvYWQodm9pZCk7CgpzdGF0aWMgdW5zaWduZWQgY2hhciAqYWxsX3JvdXRlcyA9IDA7CnN0YXRpYyB1bnNpZ25lZCBjaGFyICphbGxfcm91dGVzX2VuZDsKc3RhdGljIHNpemVfdCAgIGFsbF9yb3V0ZXNfc2l6ZTsKCmV4dGVybiBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmdldF9hZGRyZXNzKGNvbnN0IHZvaWQgKiwgaW50LCBpbnQpOwpleHRlcm4gY29uc3Qgc3RydWN0IGluX2FkZHIgKmdldF9pbl9hZGRyZXNzKGNvbnN0IHZvaWQgKiwgaW50LCBpbnQpOwoKLyoKICogdmFyX2lwUm91dGVFbnRyeSguLi4KICogQXJndW1lbnRzOgogKiB2cCAgICAgICAgICAgSU4gICAgICAtIHBvaW50ZXIgdG8gdmFyaWFibGUgZW50cnkgdGhhdCBwb2ludHMgaGVyZQogKiBuYW1lICAgICAgICAgIElOL09VVCAgLSBJTi9uYW1lIHJlcXVlc3RlZCwgT1VUL25hbWUgZm91bmQKICogbGVuZ3RoICAgICAgICBJTi9PVVQgIC0gbGVuZ3RoIG9mIElOL09VVCBvaWQncyAKICogZXhhY3QgICAgICAgICBJTiAgICAgIC0gVFJVRSBpZiBhbiBleGFjdCBtYXRjaCB3YXMgcmVxdWVzdGVkCiAqIHZhcl9sZW4gICAgICAgT1VUICAgICAtIGxlbmd0aCBvZiB2YXJpYWJsZSBvciAwIGlmIGZ1bmN0aW9uIHJldHVybmVkCiAqIHdyaXRlX21ldGhvZCAgb3V0ICAgICAtIHBvaW50ZXIgdG8gZnVuY3Rpb24gdG8gc2V0IHZhcmlhYmxlLCBvdGhlcndpc2UgMAogKi8KdV9jaGFyICAgICAgICAgKgp2YXJfaXBSb3V0ZUVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIC8qCiAgICAgKiBvYmplY3QgaWRlbnRpZmllciBpcyBvZiBmb3JtOgogICAgICogMS4zLjYuMS4yLjEuNC4yMS4xLjEuQS5CLkMuRCwgIHdoZXJlIEEuQi5DLkQgaXMgSVAgYWRkcmVzcy4KICAgICAqIElQQUREUiBzdGFydHMgYXQgb2Zmc2V0IDEwLgogICAgICovCiAgICBzdHJ1Y3QgcnRfbXNnaGRyICpydHAsICpzYXZlUnRwID0gMDsKICAgIHJlZ2lzdGVyIGludCAgICBTYXZlX1ZhbGlkLCByZXN1bHQ7CiAgICBzdGF0aWMgaW50ICAgICAgc2F2ZU5hbWVMZW4gPSAwLCBzYXZlRXhhY3QgPSAwOwogICAgc3RhdGljIG9pZCAgICAgIHNhdmVOYW1lW01BWF9PSURfTEVOXSwgQ3VycmVudFtNQVhfT0lEX0xFTl07CiAgICB1X2NoYXIgICAgICAgICAqY3A7CiAgICB1X2NoYXIgICAgICAgICAqYXA7CiAgICBvaWQgICAgICAgICAgICAqb3A7CiAgICBzdGF0aWMgaW5fYWRkcl90IGFkZHJfcmV0OwoKICAgICp3cml0ZV9tZXRob2QgPSBOVUxMOyAgLyogd3JpdGVfcnRlOyAgWFhYOiAgU0VUIHN1cHBvcnQgbm90IHJlYWxseSBpbXBsZW1lbnRlZCAqLwoKI2lmIDAKICAvKiogCiAgKiogdGhpcyBvcHRpbWlzYXRpb24gZmFpbHMsIGlmIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgcm91dGUgYXZhaWwuCiAgKiogaXQgaXMgYSB2ZXJ5IHNwZWNpYWwgY2FzZSwgYnV0IGJldHRlciBsZWF2ZSBpdCBvdXQgLi4uCiAgKiovCiNpZiAwCiAgICBpZiAocnRzaXplIDw9IDEpCiAgICAgICAgU2F2ZV9WYWxpZCA9IDA7CiAgICBlbHNlCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMCAqLwogICAgICAgIC8qCiAgICAgICAgICogIE9QVElNSVpBVElPTjoKICAgICAgICAgKgogICAgICAgICAqICBJZiB0aGUgbmFtZSB3YXMgdGhlIHNhbWUgYXMgdGhlIGxhc3QgbmFtZSwgd2l0aCB0aGUgcG9zc2libGUKICAgICAgICAgKiAgZXhjZXB0aW9uIG9mIHRoZSBbOV10aCB0b2tlbiwgdGhlbiBkb24ndCByZWFkIHRoZSByb3V0aW5nIHRhYmxlCiAgICAgICAgICoKICAgICAgICAgKi8KCiAgICBpZiAoKHNhdmVOYW1lTGVuID09ICpsZW5ndGgpICYmIChzYXZlRXhhY3QgPT0gZXhhY3QpKSB7CiAgICAgICAgcmVnaXN0ZXIgaW50ICAgIHRlbXAgPSBuYW1lWzldOwogICAgICAgIG5hbWVbOV0gPSAwOwogICAgICAgIFNhdmVfVmFsaWQgPQogICAgICAgICAgICAoc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBzYXZlTmFtZSwgc2F2ZU5hbWVMZW4pID09IDApOwogICAgICAgIG5hbWVbOV0gPSB0ZW1wOwogICAgfSBlbHNlCiAgICAgICAgU2F2ZV9WYWxpZCA9IDA7CgogICAgaWYgKFNhdmVfVmFsaWQgJiYgc2F2ZVJ0cCkgewogICAgICAgIHJlZ2lzdGVyIGludCAgICB0ZW1wID0gbmFtZVs5XTsgLyogRml4IHVwICdsb3dlc3QnIGZvdW5kIGVudHJ5ICovCiAgICAgICAgbWVtY3B5KChjaGFyICopIG5hbWUsIChjaGFyICopIEN1cnJlbnQsIDE0ICogc2l6ZW9mKG9pZCkpOwogICAgICAgIG5hbWVbOV0gPSB0ZW1wOwogICAgICAgICpsZW5ndGggPSAxNDsKICAgICAgICBydHAgPSBzYXZlUnRwOwogICAgfSBlbHNlIHsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwICovCiAgICAgICAgLyoKICAgICAgICAgKiBmaWxsIGluIG9iamVjdCBwYXJ0IG9mIG5hbWUgZm9yIGN1cnJlbnQgKGxlc3Mgc2l6ZW9mIGluc3RhbmNlIHBhcnQpIAogICAgICAgICAqLwoKICAgICAgICBtZW1jcHkoKGNoYXIgKikgQ3VycmVudCwgKGNoYXIgKikgdnAtPm5hbWUsCiAgICAgICAgICAgICAgIChpbnQpICh2cC0+bmFtZWxlbikgKiBzaXplb2Yob2lkKSk7CgojaWYgMAogICAgICAgIC8qCiAgICAgICAgICogIE9ubHkgcmVsb2FkIGlmIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgd2lsZGNhcmQKICAgICAgICAgKi8KICAgICAgICBpZiAoKmxlbmd0aCA8IDE0KSB7CiAgICAgICAgICAgIFJvdXRlX1NjYW5fUmVsb2FkKCk7CiAgICAgICAgfQojZWxzZQogICAgICAgIFJvdXRlX1NjYW5fUmVsb2FkKCk7CiNlbmRpZgogICAgICAgIGZvciAoYXAgPSBhbGxfcm91dGVzOyBhcCA8IGFsbF9yb3V0ZXNfZW5kOyBhcCArPSBydHAtPnJ0bV9tc2dsZW4pIHsKICAgICAgICAgICAgcnRwID0gKHN0cnVjdCBydF9tc2doZHIgKikgYXA7CiAgICAgICAgICAgIGlmIChydHAtPnJ0bV90eXBlID09IDApCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgaWYgKHJ0cC0+cnRtX3ZlcnNpb24gIT0gUlRNX1ZFUlNJT04pIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICAgICAicm91dGluZyBzb2NrZXQgbWVzc2FnZSB2ZXJzaW9uIG1pc21hdGNoICglZCBpbnN0ZWFkIG9mICVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cC0+cnRtX3ZlcnNpb24sIFJUTV9WRVJTSU9OKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChydHAtPnJ0bV90eXBlICE9IFJUTV9HRVQpIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICAgICAicm91dGluZyBzb2NrZXQgcmV0dXJuZWQgbWVzc2FnZSBvdGhlciB0aGFuIEdFVCAoJWQpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgcnRwLT5ydG1fdHlwZSk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShydHAtPnJ0bV9hZGRycyAmIFJUQV9EU1QpKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGNwID0gKHVfY2hhciAqKSBnZXRfaW5fYWRkcmVzcygoc3RydWN0IHNvY2thZGRyICopIChydHAgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cC0+cnRtX2FkZHJzLCBSVEFfRFNUKTsKICAgICAgICAgICAgaWYgKGNwID09IE5VTEwpCiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAgICAgICAgIG9wID0gQ3VycmVudCArIDEwOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwoKICAgICAgICAgICAgcmVzdWx0ID0gc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBDdXJyZW50LCAxNCk7CiAgICAgICAgICAgIGlmICgoZXhhY3QgJiYgKHJlc3VsdCA9PSAwKSkgfHwgKCFleGFjdCAmJiAocmVzdWx0IDwgMCkpKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChhcCA+PSBhbGxfcm91dGVzX2VuZCB8fCBydHAtPnJ0bV90eXBlID09IDApCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIC8qCiAgICAgICAgICogIFNhdmUgaW4gdGhlICdjYWNoZScKICAgICAgICAgKi8KICAgICAgICBtZW1jcHkoKGNoYXIgKikgc2F2ZU5hbWUsIChjaGFyICopIG5hbWUsCiAgICAgICAgICAgICAgIFNOTVBfTUlOKCpsZW5ndGgsIE1BWF9PSURfTEVOKSAqIHNpemVvZihvaWQpKTsKICAgICAgICBzYXZlTmFtZVs5XSA9ICdcMCc7CiAgICAgICAgc2F2ZU5hbWVMZW4gPSAqbGVuZ3RoOwogICAgICAgIHNhdmVFeGFjdCA9IGV4YWN0OwogICAgICAgIHNhdmVSdHAgPSBydHA7CiAgICAgICAgLyoKICAgICAgICAgKiAgUmV0dXJuIHRoZSBuYW1lCiAgICAgICAgICovCiAgICAgICAgbWVtY3B5KChjaGFyICopIG5hbWUsIChjaGFyICopIEN1cnJlbnQsIDE0ICogc2l6ZW9mKG9pZCkpOwogICAgICAgICpsZW5ndGggPSAxNDsKI2lmIDAKICAgIH0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwICovCgogICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZ19yZXR1cm4pOwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIElQUk9VVEVERVNUOgogICAgCSp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBnZXRfaW5fYWRkcmVzcygoc3RydWN0IHNvY2thZGRyICopIChydHAgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHAtPnJ0bV9hZGRycywgUlRBX0RTVCk7CiAgICBjYXNlIElQUk9VVEVJRklOREVYOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgcnRwLT5ydG1faW5kZXg7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzE6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAocnRwLT5ydG1fZmxhZ3MgJiBSVEZfVVApID8gMSA6IDA7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzI6CiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IC0xOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUMzOgojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAtMTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDNDoKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gLTE7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzU6CiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IC0xOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVORVhUSE9QOgogICAgCSp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKICAgIAlyZXR1cm4gKHVfY2hhciAqKSBnZXRfaW5fYWRkcmVzcygoc3RydWN0IHNvY2thZGRyICopIChydHAgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHAtPnJ0bV9hZGRycywgUlRBX0dBVEVXQVkpOwogICAgY2FzZSBJUFJPVVRFVFlQRToKICAgICAgICBpZiAocnRwLT5ydG1fZmxhZ3MgJiBSVEZfVVApIHsKICAgICAgICAgICAgaWYgKHJ0cC0+cnRtX2ZsYWdzICYgUlRGX0dBVEVXQVkpIHsKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gNDsgICAgICAgIC8qICBpbmRpcmVjdCg0KSAgKi8KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMzsgICAgICAgIC8qICBkaXJlY3QoMykgICovCiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsb25nX3JldHVybiA9IDI7ICAgIC8qICBpbnZhbGlkKDIpICAqLwogICAgICAgIH0KICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFUFJPVE86CiAgICAgICAgbG9uZ19yZXR1cm4gPSAocnRwLT5ydG1fZmxhZ3MgJiBSVEZfRFlOQU1JQykKICAgICAgICAgICAgPyAxMCA6IChydHAtPnJ0bV9mbGFncyAmIFJURl9TVEFUSUMpCiAgICAgICAgICAgID8gMiA6IChydHAtPnJ0bV9mbGFncyAmIFJURl9EWU5BTUlDKSA/IDQgOiAxOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVBR0U6CiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IDA7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1BU0s6CiAgICAJKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOyAgIAkgICAgIAogICAgICAgIGlmIChydHAtPnJ0bV9mbGFncyAmIFJURl9IT1NUKSB7CiAgICAgICAgICAgIGFkZHJfcmV0ID0gMHgwMDAwMDAwMTsKICAgICAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBnZXRfaW5fYWRkcmVzcygoc3RydWN0IHNvY2thZGRyICopIChydHAgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRwLT5ydG1fYWRkcnMsIFJUQV9ORVRNQVNLKTsKICAgICAgICB9CiAgICBjYXNlIElQUk9VVEVJTkZPOgogICAgICAgICp2YXJfbGVuID0gbnVsbE9pZExlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBudWxsT2lkOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2lwUm91dGVFbnRyeVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBVU0VfU1lTQ1RMX1JPVVRFX0RVTVAgKi8KCiNpZmRlZiBocHV4MTEKc3RhdGljIGludCAgICAgIHJ0c2l6ZSA9IDA7CnN0YXRpYyBtaWJfaXBSb3V0ZUVudCAqcnQgPSAobWliX2lwUm91dGVFbnQgKikgMDsKc3RhdGljIHZvaWQgICAgIFJvdXRlX1NjYW5fUmVsb2FkKHZvaWQpOwojZWxpZiAhZGVmaW5lZChzb2xhcmlzMikKc3RhdGljIFJURU5UUlkgKipydGhlYWQgPSBOVUxMOwpzdGF0aWMgaW50ICAgICAgcnRzaXplID0gMCwgcnRhbGxvY2F0ZSA9IDA7CgpzdGF0aWMgdm9pZCAgICAgUm91dGVfU2Nhbl9SZWxvYWQodm9pZCk7CgpSVEVOVFJZICoqbmV0c25tcF9nZXRfcm91dGVzKHNpemVfdCAqc2l6ZSkgewogICAgUm91dGVfU2Nhbl9SZWxvYWQoKTsKICAgIGlmIChzaXplKQogICAgICAgICpzaXplID0gcnRzaXplOwogICAgcmV0dXJuIHJ0aGVhZDsKfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwoKI2lmICEoZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChzb2xhcmlzMikgfHwgZGVmaW5lZChocHV4MTEpKSAmJiBkZWZpbmVkKFJUSE9TVF9TWU1CT0wpICYmIGRlZmluZWQoUlRORVRfU1lNQk9MKQojZGVmaW5lIE5VTV9ST1VURV9TWU1CT0xTIDIKc3RhdGljIGNoYXIgICAgKnJvdXRlX3N5bWJvbHNbXSA9IHsKICAgIFJUSE9TVF9TWU1CT0wsCiAgICBSVE5FVF9TWU1CT0wKfTsKI2VuZGlmCiNlbmRpZgoKI2lmZGVmIFVTRV9TWVNDVExfUk9VVEVfRFVNUAoKdm9pZAppbml0X3Zhcl9yb3V0ZSh2b2lkKQp7CiNpZmRlZiBzb2xhcmlzMgogICAgaW5pdF9rZXJuZWxfc3Vub3M1KCk7CiNlbmRpZgp9CgpzdGF0aWMgdm9pZApSb3V0ZV9TY2FuX1JlbG9hZCh2b2lkKQp7CiAgICBzaXplX3QgICAgICAgICAgc2l6ZSA9IDA7CiAgICBpbnQgICAgICAgICAgICAgbmFtZVtdID0geyBDVExfTkVULCBQRl9ST1VURSwgMCwgMCwgTkVUX1JUX0RVTVAsIDAgfTsKCiAgICBpZiAoc3lzY3RsKG5hbWUsIHNpemVvZihuYW1lKSAvIHNpemVvZihpbnQpLCAwLCAmc2l6ZSwgMCwgMCkgPT0gLTEpIHsKICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAic3lzY3RsKENUTF9ORVQsUEZfUk9VVEUsMCwwLE5FVF9SVF9EVU1QLDApXG4iKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGFsbF9yb3V0ZXMgPT0gMCB8fCBhbGxfcm91dGVzX3NpemUgPCBzaXplKSB7CiAgICAgICAgICAgIGlmIChhbGxfcm91dGVzICE9IDApIHsKICAgICAgICAgICAgICAgIGZyZWUoYWxsX3JvdXRlcyk7CiAgICAgICAgICAgICAgICBhbGxfcm91dGVzID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKGFsbF9yb3V0ZXMgPSBtYWxsb2Moc2l6ZSkpID09IDApIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICAgICAib3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIHJvdXRlIHRhYmxlXG4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhbGxfcm91dGVzX3NpemUgPSBzaXplOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNpemUgPSBhbGxfcm91dGVzX3NpemU7CiAgICAgICAgfQogICAgICAgIGlmIChzeXNjdGwobmFtZSwgc2l6ZW9mKG5hbWUpIC8gc2l6ZW9mKGludCksCiAgICAgICAgICAgICAgICAgICBhbGxfcm91dGVzLCAmc2l6ZSwgMCwgMCkgPT0gLTEpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgInN5c2N0bChDVExfTkVULFBGX1JPVVRFLDAsMCxORVRfUlRfRFVNUCwwKVxuIik7CiAgICAgICAgfQogICAgICAgIGFsbF9yb3V0ZXNfZW5kID0gYWxsX3JvdXRlcyArIHNpemU7CiAgICB9Cn0KCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IFVTRV9TWVNDVExfUk9VVEVfRFVNUCAqLwoKdm9pZAppbml0X3Zhcl9yb3V0ZSh2b2lkKQp7CiNpZmRlZiBSVFRBQkxFU19TWU1CT0wKICAgIGF1dG9fbmxpc3QoUlRUQUJMRVNfU1lNQk9MLCAwLCAwKTsKI2VuZGlmCiNpZmRlZiBSVEhBU0hTSVpFX1NZTUJPTAogICAgYXV0b19ubGlzdChSVEhBU0hTSVpFX1NZTUJPTCwgMCwgMCk7CiNlbmRpZgojaWZkZWYgUlRIT1NUX1NZTUJPTAogICAgYXV0b19ubGlzdChSVEhPU1RfU1lNQk9MLCAwLCAwKTsKI2VuZGlmCiNpZmRlZiBSVE5FVF9TWU1CT0wKICAgIGF1dG9fbmxpc3QoUlRORVRfU1lNQk9MLCAwLCAwKTsKI2VuZGlmCn0KCiNpZm5kZWYgc29sYXJpczIKCiNpZiBORUVEX0tMR0VUU0EKc3RhdGljIHVuaW9uIHsKICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CiAgICB1X3Nob3J0ICAgICAgICAgZGF0YVsxMjhdOwp9IGtsZ2V0c2F0bXA7CgpzdHJ1Y3Qgc29ja2FkZHJfaW4gKgprbGdldHNhKHN0cnVjdCBzb2NrYWRkcl9pbiAqZHN0KQp7CiAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChkc3QsIChjaGFyICopICZrbGdldHNhdG1wLnNpbiwgc2l6ZW9mIGtsZ2V0c2F0bXAuc2luKSkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGlmIChrbGdldHNhdG1wLnNpbi5zaW5fbGVuID4gc2l6ZW9mKGtsZ2V0c2F0bXAuc2luKSkgewogICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGRzdCwgKGNoYXIgKikgJmtsZ2V0c2F0bXAuc2luLCBrbGdldHNhdG1wLnNpbi5zaW5fbGVuKSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFyX3JvdXRlIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAoJmtsZ2V0c2F0bXAuc2luKTsKfQojZW5kaWYKCnVfY2hhciAgICAgICAgICoKdmFyX2lwUm91dGVFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgLyoKICAgICAqIG9iamVjdCBpZGVudGlmaWVyIGlzIG9mIGZvcm06CiAgICAgKiAxLjMuNi4xLjIuMS40LjIxLjEuMS5BLkIuQy5ELCAgd2hlcmUgQS5CLkMuRCBpcyBJUCBhZGRyZXNzLgogICAgICogSVBBRERSIHN0YXJ0cyBhdCBvZmZzZXQgMTAuCiAgICAgKi8KICAgIHJlZ2lzdGVyIGludCAgICBTYXZlX1ZhbGlkLCByZXN1bHQsIFJ0SW5kZXg7CiAgICBzdGF0aWMgc2l6ZV90ICAgc2F2ZU5hbWVMZW4gPSAwOwogICAgc3RhdGljIGludCAgICAgIHNhdmVFeGFjdCA9IDAsIHNhdmVSdEluZGV4ID0gMDsKICAgIHN0YXRpYyBvaWQgICAgICBzYXZlTmFtZVtNQVhfT0lEX0xFTl0sIEN1cnJlbnRbTUFYX09JRF9MRU5dOwogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgb2lkICAgICAgICAgICAgKm9wOwogICAgc3RhdGljIGluX2FkZHJfdCBhZGRyX3JldDsKI2lmIE5FRURfS0xHRVRTQQogICAgc3RydWN0IHNvY2thZGRyX2luICpzYTsKI2VuZGlmCiNpZiAhZGVmaW5lZChsaW51eCkgJiYgIWRlZmluZWQoaHB1eDExKQogICAgc3RydWN0IGlmbmV0ICAgIHJ0X2lmbmV0OwogICAgc3RydWN0IGluX2lmYWRkciBydF9pZm5ldGFkZHI7CiNlbmRpZgoKICAgICp3cml0ZV9tZXRob2QgPSBOVUxMOyAgLyogd3JpdGVfcnRlOyAgWFhYOiAgU0VUIHN1cHBvcnQgbm90IHJlYWxseSBpbXBsZW1lbnRlZCAqLwoKICAgIC8qKiAKICAgICAqKiB0aGlzIG9wdGltaXNhdGlvbiBmYWlscywgaWYgdGhlcmUgaXMgb25seSBhIHNpbmdsZSByb3V0ZSBhdmFpbC4KICAgICAqKiBpdCBpcyBhIHZlcnkgc3BlY2lhbCBjYXNlLCBidXQgYmV0dGVyIGxlYXZlIGl0IG91dCAuLi4KICAgICAqKi8KI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICBzYXZlTmFtZUxlbiA9IDA7CiNlbmRpZgogICAgaWYgKHJ0c2l6ZSA8PSAxKQogICAgICAgIFNhdmVfVmFsaWQgPSAwOwogICAgZWxzZQogICAgICAgIC8qCiAgICAgICAgICogIE9QVElNSVpBVElPTjoKICAgICAgICAgKgogICAgICAgICAqICBJZiB0aGUgbmFtZSB3YXMgdGhlIHNhbWUgYXMgdGhlIGxhc3QgbmFtZSwgd2l0aCB0aGUgcG9zc2libGUKICAgICAgICAgKiAgZXhjZXB0aW9uIG9mIHRoZSBbOV10aCB0b2tlbiwgdGhlbiBkb24ndCByZWFkIHRoZSByb3V0aW5nIHRhYmxlCiAgICAgICAgICoKICAgICAgICAgKi8KCiAgICBpZiAoKHNhdmVOYW1lTGVuID09ICpsZW5ndGgpICYmIChzYXZlRXhhY3QgPT0gZXhhY3QpKSB7CiAgICAgICAgcmVnaXN0ZXIgaW50ICAgIHRlbXAgPSBuYW1lWzldOwogICAgICAgIG5hbWVbOV0gPSAwOwogICAgICAgIFNhdmVfVmFsaWQgPQogICAgICAgICAgICAoc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBzYXZlTmFtZSwgc2F2ZU5hbWVMZW4pID09IDApOwogICAgICAgIG5hbWVbOV0gPSB0ZW1wOwogICAgfSBlbHNlCiAgICAgICAgU2F2ZV9WYWxpZCA9IDA7CgogICAgaWYgKFNhdmVfVmFsaWQpIHsKICAgICAgICByZWdpc3RlciBpbnQgICAgdGVtcCA9IG5hbWVbOV07IC8qIEZpeCB1cCAnbG93ZXN0JyBmb3VuZCBlbnRyeSAqLwogICAgICAgIG1lbWNweSgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBDdXJyZW50LCAxNCAqIHNpemVvZihvaWQpKTsKICAgICAgICBuYW1lWzldID0gdGVtcDsKICAgICAgICAqbGVuZ3RoID0gMTQ7CiAgICAgICAgUnRJbmRleCA9IHNhdmVSdEluZGV4OwogICAgfSBlbHNlIHsKICAgICAgICAvKgogICAgICAgICAqIGZpbGwgaW4gb2JqZWN0IHBhcnQgb2YgbmFtZSBmb3IgY3VycmVudCAobGVzcyBzaXplb2YgaW5zdGFuY2UgcGFydCkgCiAgICAgICAgICovCgogICAgICAgIG1lbWNweSgoY2hhciAqKSBDdXJyZW50LCAoY2hhciAqKSB2cC0+bmFtZSwKICAgICAgICAgICAgICAgKGludCkgKHZwLT5uYW1lbGVuKSAqIHNpemVvZihvaWQpKTsKCiNpZiAwCiAgICAgICAgLyoKICAgICAgICAgKiAgT25seSByZWxvYWQgaWYgdGhpcyBpcyB0aGUgc3RhcnQgb2YgYSB3aWxkY2FyZAogICAgICAgICAqLwogICAgICAgIGlmICgqbGVuZ3RoIDwgMTQpIHsKICAgICAgICAgICAgUm91dGVfU2Nhbl9SZWxvYWQoKTsKICAgICAgICB9CiNlbHNlCiAgICAgICAgUm91dGVfU2Nhbl9SZWxvYWQoKTsKI2VuZGlmCiAgICAgICAgZm9yIChSdEluZGV4ID0gMDsgUnRJbmRleCA8IHJ0c2l6ZTsgUnRJbmRleCsrKSB7CiNpZiBORUVEX0tMR0VUU0EKICAgICAgICAgICAgc2EgPSBrbGdldHNhKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgcnRoZWFkW1J0SW5kZXhdLT5ydF9kc3QpOwogICAgICAgICAgICBjcCA9ICh1X2NoYXIgKikgJiAoc2EtPnNpbl9hZGRyLnNfYWRkcik7CiNlbGlmIGRlZmluZWQoaHB1eDExKQogICAgICAgICAgICBjcCA9ICh1X2NoYXIgKikgJiBydFtSdEluZGV4XS5EZXN0OwojZWxzZQogICAgICAgICAgICBjcCA9ICh1X2NoYXIgKikgJgogICAgICAgICAgICAgICAgKCgoc3RydWN0IHNvY2thZGRyX2luICopICYocnRoZWFkW1J0SW5kZXhdLT5ydF9kc3QpKS0+CiAgICAgICAgICAgICAgICAgc2luX2FkZHIuc19hZGRyKTsKI2VuZGlmCiAgICAgICAgICAgIG9wID0gQ3VycmVudCArIDEwOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwoKICAgICAgICAgICAgcmVzdWx0ID0gc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBDdXJyZW50LCAxNCk7CiAgICAgICAgICAgIGlmICgoZXhhY3QgJiYgKHJlc3VsdCA9PSAwKSkgfHwgKCFleGFjdCAmJiAocmVzdWx0IDwgMCkpKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChSdEluZGV4ID49IHJ0c2l6ZSkKICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgICAgICAvKgogICAgICAgICAqICBTYXZlIGluIHRoZSAnY2FjaGUnCiAgICAgICAgICovCiAgICAgICAgbWVtY3B5KChjaGFyICopIHNhdmVOYW1lLCAoY2hhciAqKSBuYW1lLAogICAgICAgICAgICAgICBTTk1QX01JTigqbGVuZ3RoLCBNQVhfT0lEX0xFTikgKiBzaXplb2Yob2lkKSk7CiAgICAgICAgc2F2ZU5hbWVbOV0gPSAwOwogICAgICAgIHNhdmVOYW1lTGVuID0gKmxlbmd0aDsKICAgICAgICBzYXZlRXhhY3QgPSBleGFjdDsKICAgICAgICBzYXZlUnRJbmRleCA9IFJ0SW5kZXg7CiAgICAgICAgLyoKICAgICAgICAgKiAgUmV0dXJuIHRoZSBuYW1lCiAgICAgICAgICovCiAgICAgICAgbWVtY3B5KChjaGFyICopIG5hbWUsIChjaGFyICopIEN1cnJlbnQsIDE0ICogc2l6ZW9mKG9pZCkpOwogICAgICAgICpsZW5ndGggPSAxNDsKICAgIH0KCiAgICAqdmFyX2xlbiA9IHNpemVvZihsb25nX3JldHVybik7CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgSVBST1VURURFU1Q6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwojaWYgTkVFRF9LTEdFVFNBCiAgICAgICAgc2EgPSBrbGdldHNhKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgcnRoZWFkW1J0SW5kZXhdLT5ydF9kc3QpOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgKHNhLT5zaW5fYWRkci5zX2FkZHIpOwojZWxpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBhZGRyX3JldCA9IHJ0W1J0SW5kZXhdLkRlc3Q7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKI2Vsc2UKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmICgoc3RydWN0IHNvY2thZGRyX2luICopICZydGhlYWRbUnRJbmRleF0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0X2RzdCktPnNpbl9hZGRyLnNfYWRkcjsKI2VuZGlmCiAgICBjYXNlIElQUk9VVEVJRklOREVYOgojaWZkZWYgaHB1eDExCiAgICAgICAgbG9uZ19yZXR1cm4gPSBydFtSdEluZGV4XS5JZkluZGV4OwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgcnRoZWFkW1J0SW5kZXhdLT5ydF91bml0OwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDMToKI2lmZGVmIGhwdXgxMQogICAgICAgIGxvbmdfcmV0dXJuID0gcnRbUnRJbmRleF0uTWV0cmljMTsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9IChydGhlYWRbUnRJbmRleF0tPnJ0X2ZsYWdzICYgUlRGX0dBVEVXQVkpID8gMSA6IDA7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUMyOgojaWZkZWYgaHB1eDExCiAgICAgICAgbG9uZ19yZXR1cm4gPSBydFtSdEluZGV4XS5NZXRyaWMyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiNlbGlmIGRlZmluZWQoTkVUU05NUF9OT19EVU1NWV9WQUxVRVMpCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gLTE7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzM6CiNpZmRlZiBocHV4MTEKICAgICAgICBsb25nX3JldHVybiA9IHJ0W1J0SW5kZXhdLk1ldHJpYzM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKI2VsaWYgZGVmaW5lZChORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUykKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAtMTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDNDoKI2lmZGVmIGhwdXgxMQogICAgICAgIGxvbmdfcmV0dXJuID0gcnRbUnRJbmRleF0uTWV0cmljNDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwojZWxpZiBkZWZpbmVkKE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTKQogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IC0xOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUM1OgojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAtMTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTkVYVEhPUDoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiNpZiBORUVEX0tMR0VUU0EKICAgICAgICBzYSA9IGtsZ2V0c2EoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBydGhlYWRbUnRJbmRleF0tPnJ0X2dhdGV3YXkpOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgKHNhLT5zaW5fYWRkci5zX2FkZHIpOwojZWxpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBhZGRyX3JldCA9IHJ0W1J0SW5kZXhdLk5leHRIb3A7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKI2Vsc2UKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmICgoc3RydWN0IHNvY2thZGRyX2luICopICZydGhlYWRbUnRJbmRleF0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0X2dhdGV3YXkpLT5zaW5fYWRkci5zX2FkZHI7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKmJzZCAqLwogICAgY2FzZSBJUFJPVVRFVFlQRToKI2lmZGVmIGhwdXgxMQogICAgICAgIGxvbmdfcmV0dXJuID0gcnRbUnRJbmRleF0uVHlwZTsKI2Vsc2UKICAgICAgICBpZiAocnRoZWFkW1J0SW5kZXhdLT5ydF9mbGFncyAmIFJURl9VUCkgewogICAgICAgICAgICBpZiAocnRoZWFkW1J0SW5kZXhdLT5ydF9mbGFncyAmIFJURl9HQVRFV0FZKSB7CiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IDQ7ICAgICAgICAvKiAgaW5kaXJlY3QoNCkgICovCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IDM7ICAgICAgICAvKiAgZGlyZWN0KDMpICAqLwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAyOyAgICAvKiAgaW52YWxpZCgyKSAgKi8KICAgICAgICB9CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVQUk9UTzoKI2lmZGVmIGhwdXgxMQogICAgICAgIGxvbmdfcmV0dXJuID0gcnRbUnRJbmRleF0uUHJvdG87CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAocnRoZWFkW1J0SW5kZXhdLT5ydF9mbGFncyAmIFJURl9EWU5BTUlDKSA/IDQgOiAyOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFQUdFOgojaWZkZWYgaHB1eDExCiAgICAgICAgbG9uZ19yZXR1cm4gPSBydFtSdEluZGV4XS5BZ2U7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKI2VsaWYgZGVmaW5lZChORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUykKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNQVNLOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKI2lmIE5FRURfS0xHRVRTQQogICAgICAgIC8qCiAgICAgICAgICogWFhYIC0gQWxtb3N0IGNlcnRhaW5seSBub3QgcmlnaHQKICAgICAgICAgKiBidXQgSSBkb24ndCBoYXZlIGEgc3VpdGFibGUgc3lzdGVtIHRvIHRlc3QgdGhpcyBvbiAKICAgICAgICAgKi8KI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGFkZHJfcmV0ID0gMDsKI2VsaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgYWRkcl9yZXQgPSBydFtSdEluZGV4XS5NYXNrOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIU5FRURfS0xHRVRTQSAmJiAhaHB1eDExICovCiAgICAgICAgaWYgKCgoc3RydWN0IHNvY2thZGRyX2luICopICZydGhlYWRbUnRJbmRleF0tPnJ0X2RzdCktPnNpbl9hZGRyLgogICAgICAgICAgICBzX2FkZHIgPT0gMCkKICAgICAgICAgICAgYWRkcl9yZXQgPSAwOyAgICAvKiBEZWZhdWx0IHJvdXRlICovCiAgICAgICAgZWxzZSB7CiNpZm5kZWYgbGludXgKICAgICAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAocnRoZWFkW1J0SW5kZXhdLT5ydF9pZnAsCiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgJnJ0X2lmbmV0LCBzaXplb2YocnRfaWZuZXQpKSkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3Zhcl9yb3V0ZSIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAocnRfaWZuZXQuaWZfYWRkcmxpc3QsCiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgJnJ0X2lmbmV0YWRkciwgc2l6ZW9mKHJ0X2lmbmV0YWRkcikpKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFyX3JvdXRlIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYWRkcl9yZXQgPSBydF9pZm5ldGFkZHIuaWFfc3VibmV0bWFzazsKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaW51eCAqLwogICAgICAgICAgICBjcCA9ICh1X2NoYXIgKikgJgogICAgICAgICAgICAgICAgKCgoc3RydWN0IHNvY2thZGRyX2luICopICYocnRoZWFkW1J0SW5kZXhdLT5ydF9kc3QpKS0+CiAgICAgICAgICAgICAgICAgc2luX2FkZHIuc19hZGRyKTsKICAgICAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJgogICAgICAgICAgICAgICAgKCgoc3RydWN0IHNvY2thZGRyX2luICopICYocnRoZWFkW1J0SW5kZXhdLT5ydF9nZW5tYXNrKSktPgogICAgICAgICAgICAgICAgIHNpbl9hZGRyLnNfYWRkcik7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGludXggKi8KICAgICAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVFRF9LTEdFVFNBICovCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKICAgIGNhc2UgSVBST1VURUlORk86CiAgICAgICAgKnZhcl9sZW4gPSBudWxsT2lkTGVuOwogICAgICAgIHJldHVybiAodV9jaGFyICopIG51bGxPaWQ7CiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaXBSb3V0ZUVudHJ5XG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29sYXJpczIgKi8KCnN0YXRpYyBpbnQKSVBfQ21wX1JvdXRlKHZvaWQgKmFkZHIsIHZvaWQgKmVwKQp7CiAgICBtaWIyX2lwUm91dGVFbnRyeV90ICpFcCA9IGVwLCAqQWRkciA9IGFkZHI7CgogICAgaWYgKChFcC0+aXBSb3V0ZURlc3QgPT0gQWRkci0+aXBSb3V0ZURlc3QpICYmCiAgICAgICAgKEVwLT5pcFJvdXRlTmV4dEhvcCA9PSBBZGRyLT5pcFJvdXRlTmV4dEhvcCkgJiYKICAgICAgICAoRXAtPmlwUm91dGVUeXBlID09IEFkZHItPmlwUm91dGVUeXBlKSAmJgogICAgICAgIChFcC0+aXBSb3V0ZVByb3RvID09IEFkZHItPmlwUm91dGVQcm90bykgJiYKICAgICAgICAoRXAtPmlwUm91dGVNYXNrID09IEFkZHItPmlwUm91dGVNYXNrKSAmJgogICAgICAgIChFcC0+aXBSb3V0ZUluZm8ucmVfbWF4X2ZyYWcgPT0gQWRkci0+aXBSb3V0ZUluZm8ucmVfbWF4X2ZyYWcpICYmCiAgICAgICAgKEVwLT5pcFJvdXRlSW5mby5yZV9ydHQgPT0gQWRkci0+aXBSb3V0ZUluZm8ucmVfcnR0KSAmJgogICAgICAgIChFcC0+aXBSb3V0ZUluZm8ucmVfcmVmID09IEFkZHItPmlwUm91dGVJbmZvLnJlX3JlZikgJiYKICAgICAgICAoRXAtPmlwUm91dGVJbmZvLnJlX2ZyYWdfZmxhZyA9PSBBZGRyLT5pcFJvdXRlSW5mby5yZV9mcmFnX2ZsYWcpICYmCiAgICAgICAgKEVwLT5pcFJvdXRlSW5mby5yZV9zcmNfYWRkciA9PSBBZGRyLT5pcFJvdXRlSW5mby5yZV9zcmNfYWRkcikgJiYKICAgICAgICAoRXAtPmlwUm91dGVJbmZvLnJlX2lyZV90eXBlID09IEFkZHItPmlwUm91dGVJbmZvLnJlX2lyZV90eXBlKSAmJgogICAgICAgIChFcC0+aXBSb3V0ZUluZm8ucmVfb2Jwa3QgPT0gQWRkci0+aXBSb3V0ZUluZm8ucmVfb2Jwa3QpICYmCiAgICAgICAgKEVwLT5pcFJvdXRlSW5mby5yZV9pYnBrdCA9PSBBZGRyLT5pcFJvdXRlSW5mby5yZV9pYnBrdCkKICAgICAgICApCiAgICAgICAgcmV0dXJuICgwKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gKDEpOyAgICAgICAgICAgICAvKiBOb3QgZm91bmQgKi8KfQoKdV9jaGFyICAgICAgICAgKgp2YXJfaXBSb3V0ZUVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqIHZwLAogICAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICAvKgogICAgICogb2JqZWN0IGlkZW50aWZpZXIgaXMgb2YgZm9ybToKICAgICAqIDEuMy42LjEuMi4xLjQuMjEuMS4xLkEuQi5DLkQsICB3aGVyZSBBLkIuQy5EIGlzIElQIGFkZHJlc3MuCiAgICAgKiBJUEFERFIgc3RhcnRzIGF0IG9mZnNldCAxMC4KICAgICAqLwojZGVmaW5lIElQX1JPVVRFTkFNRV9MRU5HVEgJMTQKI2RlZmluZQlJUF9ST1VURUFERFJfT0ZGCTEwCiAgICBvaWQgICAgICAgICAgICAgY3VycmVudFtJUF9ST1VURU5BTUVfTEVOR1RIXSwKICAgICAgICBsb3dlc3RbSVBfUk9VVEVOQU1FX0xFTkdUSF07CiAgICB1X2NoYXIgICAgICAgICAqY3A7CiAgICBvaWQgICAgICAgICAgICAqb3A7CiAgICBtaWIyX2lwUm91dGVFbnRyeV90IExvd2VudHJ5LCBOZXh0ZW50cnksIGVudHJ5OwogICAgaW50ICAgICAgICAgICAgIEZvdW5kID0gMDsKICAgIHJlcV9lICAgICAgICAgICByZXFfdHlwZTsKICAgIHN0YXRpYyBpbl9hZGRyX3QgYWRkcl9yZXQ7CgogICAgKndyaXRlX21ldGhvZCA9IE5VTEw7ICAvKiB3cml0ZV9ydGU7ICBYWFg6ICBTRVQgc3VwcG9ydCBub3QgcmVhbGx5IGltcGxlbWVudGVkICovCgogICAgLyoKICAgICAqIGZpbGwgaW4gb2JqZWN0IHBhcnQgb2YgbmFtZSBmb3IgY3VycmVudCAobGVzcyBzaXplb2YgaW5zdGFuY2UgcGFydCkgCiAgICAgKi8KCiAgICBtZW1jcHkoKGNoYXIgKikgY3VycmVudCwgKGNoYXIgKikgdnAtPm5hbWUsIHZwLT5uYW1lbGVuICogc2l6ZW9mKG9pZCkpOwogICAgaWYgKCpsZW5ndGggPT0gSVBfUk9VVEVOQU1FX0xFTkdUSCkgLyogQXNzdW1lIHRoYXQgdGhlIGlucHV0IG5hbWUgaXMgdGhlIGxvd2VzdCAqLwogICAgICAgIG1lbWNweSgoY2hhciAqKSBsb3dlc3QsIChjaGFyICopIG5hbWUsCiAgICAgICAgICAgICAgIElQX1JPVVRFTkFNRV9MRU5HVEggKiBzaXplb2Yob2lkKSk7CiAgICBlbHNlIHsKICAgICAgICBuYW1lW0lQX1JPVVRFQUREUl9PRkZdID0gKG9pZCkgLSAxOyAgICAgLyogR3JoaGg6IHRvIHByZXZlbnQgYWNjaWRlbnRhbCBjb21wYXJpc29uIDotKCAqLwoJbG93ZXN0WzBdID0gMHhmZjsKICAgIH0KICAgIGZvciAoTmV4dGVudHJ5LmlwUm91dGVEZXN0ID0gKHVfbG9uZykgLSAyLCByZXFfdHlwZSA9IEdFVF9GSVJTVDs7CiAgICAgICAgIE5leHRlbnRyeSA9IGVudHJ5LCByZXFfdHlwZSA9IEdFVF9ORVhUKSB7CiAgICAgICAgaWYgKGdldE1pYnN0YXQoTUlCX0lQX1JPVVRFLCAmZW50cnksIHNpemVvZihtaWIyX2lwUm91dGVFbnRyeV90KSwKICAgICAgICAgICAgICAgICAgICAgICByZXFfdHlwZSwgJklQX0NtcF9Sb3V0ZSwgJk5leHRlbnRyeSkgIT0gMCkKICAgICAgICAgICAgYnJlYWs7CiNpZmRlZiBIQVZFX0RFRklORURfSVJFX0NBQ0hFCiAgICAgICAgaWYoZW50cnkuaXBSb3V0ZUluZm8ucmVfaXJlX3R5cGUmSVJFX0NBQ0hFKQogICAgICAgICAgICBjb250aW51ZTsKI2VuZGlmIC8qIEhBVkVfREVGSU5FRF9JUkVfQ0FDSEUgKi8KICAgICAgICBDT1BZX0lQQUREUihjcCwgKHVfY2hhciAqKSAmIGVudHJ5LmlwUm91dGVEZXN0LCBvcCwKICAgICAgICAgICAgICAgICAgICBjdXJyZW50ICsgSVBfUk9VVEVBRERSX09GRik7CiAgICAgICAgaWYgKGV4YWN0KSB7CiAgICAgICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlCiAgICAgICAgICAgICAgICAoY3VycmVudCwgSVBfUk9VVEVOQU1FX0xFTkdUSCwgbmFtZSwgKmxlbmd0aCkgPT0gMCkgewogICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIGxvd2VzdCwgKGNoYXIgKikgY3VycmVudCwKICAgICAgICAgICAgICAgICAgICAgICBJUF9ST1VURU5BTUVfTEVOR1RIICogc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgTG93ZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgIEZvdW5kKys7CiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogbm8gbmVlZCB0byBzZWFyY2ggZnVydGhlciAqLwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKChzbm1wX29pZF9jb21wYXJlCiAgICAgICAgICAgICAgICAgKGN1cnJlbnQsIElQX1JPVVRFTkFNRV9MRU5HVEgsIG5hbWUsICpsZW5ndGgpID4gMCkKICAgICAgICAgICAgICAgICYmICgoTmV4dGVudHJ5LmlwUm91dGVEZXN0ID09ICh1X2xvbmcpIC0gMikKICAgICAgICAgICAgICAgICAgICB8fAogICAgICAgICAgICAgICAgICAgIChzbm1wX29pZF9jb21wYXJlCiAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50LCBJUF9ST1VURU5BTUVfTEVOR1RILCBsb3dlc3QsCiAgICAgICAgICAgICAgICAgICAgICBJUF9ST1VURU5BTUVfTEVOR1RIKSA8IDApCiAgICAgICAgICAgICAgICAgICAgfHwKICAgICAgICAgICAgICAgICAgICAoc25tcF9vaWRfY29tcGFyZQogICAgICAgICAgICAgICAgICAgICAobmFtZSwgSVBfUk9VVEVOQU1FX0xFTkdUSCwgbG93ZXN0LAogICAgICAgICAgICAgICAgICAgICAgSVBfUk9VVEVOQU1FX0xFTkdUSCkgPT0gMCkpKSB7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGlmIG5ldyBvbmUgaXMgZ3JlYXRlciB0aGFuIGlucHV0IGFuZCBjbG9zZXIgdG8gaW5wdXQgdGhhbgogICAgICAgICAgICAgICAgICogKiBwcmV2aW91cyBsb3dlc3QsIGFuZCBpcyBub3QgZXF1YWwgdG8gaXQsIHNhdmUgdGhpcyBvbmUgYXMgdGhlICJuZXh0IiBvbmUuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBsb3dlc3QsIChjaGFyICopIGN1cnJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgSVBfUk9VVEVOQU1FX0xFTkdUSCAqIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgICAgIExvd2VudHJ5ID0gZW50cnk7CiAgICAgICAgICAgICAgICBGb3VuZCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKEZvdW5kID09IDApCiAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgIG1lbWNweSgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBsb3dlc3QsCiAgICAgICAgICAgSVBfUk9VVEVOQU1FX0xFTkdUSCAqIHNpemVvZihvaWQpKTsKICAgICpsZW5ndGggPSBJUF9ST1VURU5BTUVfTEVOR1RIOwogICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZ19yZXR1cm4pOwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIElQUk9VVEVERVNUOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKICAgICAgICBhZGRyX3JldCA9IExvd2VudHJ5LmlwUm91dGVEZXN0OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CiAgICBjYXNlIElQUk9VVEVJRklOREVYOgojaWZkZWYgTkVUU05NUF9JTkNMVURFX0lGVEFCTEVfUkVXUklURVMKICAgICAgICBMb3dlbnRyeS5pcFJvdXRlSWZJbmRleC5vX2J5dGVzW0xvd2VudHJ5LmlwUm91dGVJZkluZGV4Lm9fbGVuZ3RoXSA9ICdcMCc7CiAgICAgICAgbG9uZ19yZXR1cm4gPQogICAgICAgICAgICBuZXRzbm1wX2FjY2Vzc19pbnRlcmZhY2VfaW5kZXhfZmluZCgKICAgICAgICAgICAgICAgIExvd2VudHJ5LmlwUm91dGVJZkluZGV4Lm9fYnl0ZXMpOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0KICAgICAgICAgICBJbnRlcmZhY2VfSW5kZXhfQnlfTmFtZShMb3dlbnRyeS5pcFJvdXRlSWZJbmRleC5vX2J5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvd2VudHJ5LmlwUm91dGVJZkluZGV4Lm9fbGVuZ3RoKTsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzE6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBMb3dlbnRyeS5pcFJvdXRlTWV0cmljMTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDMjoKICAgICAgICBsb25nX3JldHVybiA9IExvd2VudHJ5LmlwUm91dGVNZXRyaWMyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUMzOgogICAgICAgIGxvbmdfcmV0dXJuID0gTG93ZW50cnkuaXBSb3V0ZU1ldHJpYzM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzQ6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBMb3dlbnRyeS5pcFJvdXRlTWV0cmljNDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTkVYVEhPUDoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAgICAgYWRkcl9yZXQgPSBMb3dlbnRyeS5pcFJvdXRlTmV4dEhvcDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGFkZHJfcmV0OwogICAgY2FzZSBJUFJPVVRFVFlQRToKICAgICAgICBsb25nX3JldHVybiA9IExvd2VudHJ5LmlwUm91dGVUeXBlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVQUk9UTzoKICAgICAgICBsb25nX3JldHVybiA9IExvd2VudHJ5LmlwUm91dGVQcm90bzsKICAgICAgICBpZiAobG9uZ19yZXR1cm4gPT0gLTEpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFQUdFOgogICAgICAgIGxvbmdfcmV0dXJuID0gTG93ZW50cnkuaXBSb3V0ZUFnZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUFTSzoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAgICAgYWRkcl9yZXQgPSBMb3dlbnRyeS5pcFJvdXRlTWFzazsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGFkZHJfcmV0OwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2lwUm91dGVFbnRyeVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH07CiAgICByZXR1cm4gTlVMTDsKfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb2xhcmlzMiAtIHZhcl9JUHJvdXRlICovCgojaWZuZGVmIHNvbGFyaXMyCnN0YXRpYyBpbnQgICAgICBxc29ydF9jb21wYXJlKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKTsKI2VuZGlmCgojaWYgZGVmaW5lZChSVEVOVFJZXzRfNCkgfHwgZGVmaW5lZChSVEVOVFJZX1JUX05FWFQpIHx8IGRlZmluZWQgKGhwdXgxMSkKCiNpZiBkZWZpbmVkKFJURU5UUllfNF80KSAmJiAhZGVmaW5lZChocHV4MTEpCnZvaWQKbG9hZF9ydGVudHJpZXMoc3RydWN0IHJhZGl4X25vZGUgKnB0KQp7CiAgICBzdHJ1Y3QgcmFkaXhfbm9kZSBub2RlOwogICAgUlRFTlRSWSAgICAgICAgIHJ0OwogICAgc3RydWN0IGlmbmV0ICAgIGlmbmV0OwogICAgY2hhciAgICAgICAgICAgIG5hbWVbMTZdLCB0ZW1wWzE2XTsKI2lmICFIQVZFX1NUUlVDVF9JRk5FVF9JRl9YTkFNRQogICAgcmVnaXN0ZXIgY2hhciAgKmNwOwojZW5kaWYKCiAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChwdCwgKGNoYXIgKikgJm5vZGUsIHNpemVvZihzdHJ1Y3QgcmFkaXhfbm9kZSkpKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3Zhcl9yb3V0ZSIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChub2RlLnJuX2IgPj0gMCkgewogICAgICAgIGxvYWRfcnRlbnRyaWVzKG5vZGUucm5fcik7CiAgICAgICAgbG9hZF9ydGVudHJpZXMobm9kZS5ybl9sKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKG5vZGUucm5fZmxhZ3MgJiBSTkZfUk9PVCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiByb290IG5vZGUgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAobm9kZS5ybl9kdXBlZGtleSkKICAgICAgICAgICAgICAgIGxvYWRfcnRlbnRyaWVzKG5vZGUucm5fZHVwZWRrZXkpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgICogZ2V0IHRoZSByb3V0ZSAKICAgICAgICAgKi8KICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChwdCwgKGNoYXIgKikgJnJ0LCBzaXplb2YoUlRFTlRSWSkpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKHJ0LnJ0X2lmcCAhPSAwKSB7CiAgICAgICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKHJ0LnJ0X2lmcCwgKGNoYXIgKikgJmlmbmV0LCBzaXplb2YoaWZuZXQpKSkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3Zhcl9yb3V0ZSIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiNpZiBIQVZFX1NUUlVDVF9JRk5FVF9JRl9YTkFNRQojaWYgZGVmaW5lZChuZXRic2QxKSB8fCBkZWZpbmVkKG9wZW5ic2QyKQogICAgICAgICAgICBzdHJsY3B5KG5hbWUsIGlmbmV0LmlmX3huYW1lLCBzaXplb2YobmFtZSkpOwojZWxzZQogICAgICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChpZm5ldC5pZl94bmFtZSwgbmFtZSwgc2l6ZW9mIG5hbWUpKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFyX3JvdXRlIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KI2VuZGlmCiAgICAgICAgICAgIG5hbWVbc2l6ZW9mKG5hbWUpIC0gMV0gPSAnXDAnOwojZWxzZQogICAgICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChpZm5ldC5pZl9uYW1lLCBuYW1lLCBzaXplb2YgbmFtZSkpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBuYW1lW3NpemVvZihuYW1lKSAtIDFdID0gJ1wwJzsKICAgICAgICAgICAgY3AgPSAoY2hhciAqKSBzdHJjaHIobmFtZSwgJ1wwJyk7CiAgICAgICAgICAgIHN0cmluZ19hcHBlbmRfaW50KGNwLCBpZm5ldC5pZl91bml0KTsKI2VuZGlmCiAgICAgICAgICAgIEludGVyZmFjZV9TY2FuX0luaXQoKTsKICAgICAgICAgICAgcnQucnRfdW5pdCA9IDA7CiAgICAgICAgICAgIHdoaWxlIChJbnRlcmZhY2VfU2Nhbl9OZXh0CiAgICAgICAgICAgICAgICAgICAoKHNob3J0ICopICYocnQucnRfdW5pdCksIHRlbXAsIE5VTEwsIE5VTEwpICE9IDApIHsKICAgICAgICAgICAgICAgIGlmIChzdHJjbXAobmFtZSwgdGVtcCkgPT0gMCkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KI2lmIENIRUNLX1JUX0ZMQUdTCiAgICAgICAgaWYgKCgocnQucnRfZmxhZ3MgJiBSVEZfQ0xPTklORykgIT0gUlRGX0NMT05JTkcpCiAgICAgICAgICAgICYmICgocnQucnRfZmxhZ3MgJiBSVEZfTExJTkZPKSAhPSBSVEZfTExJTkZPKSkgewojZW5kaWYKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogY2hlY2sgZm9yIHNwYWNlIGFuZCBtYWxsb2MgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAocnRzaXplID49IHJ0YWxsb2NhdGUpIHsKICAgICAgICAgICAgICAgIHJ0aGVhZCA9CiAgICAgICAgICAgICAgICAgICAgKFJURU5UUlkgKiopIHJlYWxsb2MoKGNoYXIgKikgcnRoZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBydGFsbG9jYXRlICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUlRFTlRSWSAqKSk7CiAgICAgICAgICAgICAgICBtZW1zZXQoKGNoYXIgKikgJnJ0aGVhZFtydGFsbG9jYXRlXSwgKDApLAogICAgICAgICAgICAgICAgICAgICAgIHJ0YWxsb2NhdGUgKiBzaXplb2YoUlRFTlRSWSAqKSk7CgogICAgICAgICAgICAgICAgcnRhbGxvY2F0ZSAqPSAyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghcnRoZWFkW3J0c2l6ZV0pCiAgICAgICAgICAgICAgICBydGhlYWRbcnRzaXplXSA9IChSVEVOVFJZICopIG1hbGxvYyhzaXplb2YoUlRFTlRSWSkpOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiAgICAgIEFkZCB0aGlzIHRvIHRoZSBkYXRhYmFzZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIHJ0aGVhZFtydHNpemVdLCAoY2hhciAqKSAmcnQsIHNpemVvZihSVEVOVFJZKSk7CiAgICAgICAgICAgIHJ0c2l6ZSsrOwojaWYgQ0hFQ0tfUlRfRkxBR1MKICAgICAgICB9CiNlbmRpZgoKICAgICAgICBpZiAobm9kZS5ybl9kdXBlZGtleSkKICAgICAgICAgICAgbG9hZF9ydGVudHJpZXMobm9kZS5ybl9kdXBlZGtleSk7CiAgICB9Cn0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSVEVOVFJZXzRfNCAmJiAhaHB1eDExICovCgpzdGF0aWMgdm9pZApSb3V0ZV9TY2FuX1JlbG9hZCh2b2lkKQp7CiNpZmRlZiBocHV4MTEKCiAgICBpbnQgICAgICAgICAgICAgZmQ7CiAgICBzdHJ1Y3Qgbm1wYXJtcyAgcDsKICAgIGludCAgICAgICAgICAgICB2YWw7CiAgICB1bnNpZ25lZCBpbnQgICAgdWxlbjsKICAgIGludCAgICAgICAgICAgICByZXQ7CgogICAgaWYgKHJ0KQogICAgICAgIGZyZWUocnQpOwogICAgcnQgPSAobWliX2lwUm91dGVFbnQgKikgMDsKICAgIHJ0c2l6ZSA9IDA7CgogICAgaWYgKChmZCA9IG9wZW5fbWliKCIvZGV2L2lwIiwgT19SRE9OTFksIDAsIE5NX0FTWU5DX09GRikpID49IDApIHsKICAgICAgICBwLm9iamlkID0gSURfaXBSb3V0ZU51bUVudDsKICAgICAgICBwLmJ1ZmZlciA9ICh2b2lkICopICZ2YWw7CiAgICAgICAgdWxlbiA9IHNpemVvZihpbnQpOwogICAgICAgIHAubGVuID0gJnVsZW47CiAgICAgICAgaWYgKChyZXQgPSBnZXRfbWliX2luZm8oZmQsICZwKSkgPT0gMCkKICAgICAgICAgICAgcnRzaXplID0gdmFsOwoKICAgICAgICBpZiAocnRzaXplID4gMCkgewogICAgICAgICAgICB1bGVuID0gKHVuc2lnbmVkKSBydHNpemUgKnNpemVvZihtaWJfaXBSb3V0ZUVudCk7CiAgICAgICAgICAgIHJ0ID0gKG1pYl9pcFJvdXRlRW50ICopIG1hbGxvYyh1bGVuKTsKICAgICAgICAgICAgcC5vYmppZCA9IElEX2lwUm91dGVUYWJsZTsKICAgICAgICAgICAgcC5idWZmZXIgPSAodm9pZCAqKSBydDsKICAgICAgICAgICAgcC5sZW4gPSAmdWxlbjsKICAgICAgICAgICAgaWYgKChyZXQgPSBnZXRfbWliX2luZm8oZmQsICZwKSkgPCAwKQogICAgICAgICAgICAgICAgcnRzaXplID0gMDsKICAgICAgICB9CgogICAgICAgIGNsb3NlX21pYihmZCk7CiAgICB9CgogICAgLyoKICAgICAqICBTb3J0IGl0IQogICAgICovCiAgICBxc29ydCgoY2hhciAqKSBydCwgcnRzaXplLCBzaXplb2YocnRbMF0pLAojaWZkZWYgX19TVERDX18KICAgICAgICAgIChpbnQgKCopKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkgcXNvcnRfY29tcGFyZQojZWxzZQogICAgICAgICAgcXNvcnRfY29tcGFyZQojZW5kaWYKICAgICAgICApOwoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTEgKi8KI2lmIGRlZmluZWQoUlRFTlRSWV80XzQpCiAgICBzdHJ1Y3QgcmFkaXhfbm9kZV9oZWFkIGhlYWQsICpydF90YWJsZVtBRl9NQVggKyAxXTsKICAgIGludCAgICAgICAgICAgICBpOwojZWxzZQogICAgUlRFTlRSWSAgICAgICAqKnJvdXRlaGFzaCwgbWI7CiAgICByZWdpc3RlciBSVEVOVFJZICptOwogICAgUlRFTlRSWSAgICAgICAgKnJ0OwogICAgc3RydWN0IGlmbmV0ICAgIGlmbmV0OwogICAgaW50ICAgICAgICAgICAgIGksIHRhYmxlOwogICAgcmVnaXN0ZXIgY2hhciAgKmNwOwogICAgY2hhciAgICAgICAgICAgIG5hbWVbMTZdLCB0ZW1wWzE2XTsKICAgIGludCAgICAgICAgICAgICBoYXNoc2l6ZTsKI2VuZGlmCiAgICBzdGF0aWMgaW50ICAgICAgVGltZV9PZl9MYXN0X1JlbG9hZCA9IDA7CiAgICBzdHJ1Y3QgdGltZXZhbCAgbm93OwoKICAgIGdldHRpbWVvZmRheSgmbm93LCAoc3RydWN0IHRpbWV6b25lICopIDApOwogICAgaWYgKFRpbWVfT2ZfTGFzdF9SZWxvYWQgKyBDQUNIRV9USU1FID4gbm93LnR2X3NlYykKICAgICAgICByZXR1cm47CiAgICBUaW1lX09mX0xhc3RfUmVsb2FkID0gbm93LnR2X3NlYzsKCiAgICAvKgogICAgICogKiAgTWFrZXMgc3VyZSB3ZSBoYXZlIFNPTUUgc3BhY2UgYWxsb2NhdGVkIGZvciBuZXcgcm91dGluZyBlbnRyaWVzCiAgICAgKi8KICAgIGlmICghcnRoZWFkKSB7CiAgICAgICAgcnRoZWFkID0gKFJURU5UUlkgKiopIG1hbGxvYygxMDAgKiBzaXplb2YoUlRFTlRSWSAqKSk7CiAgICAgICAgaWYgKCFydGhlYWQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgInJvdXRlIHRhYmxlIG1hbGxvYyBmYWlsXG4iKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBtZW1zZXQoKGNoYXIgKikgcnRoZWFkLCAoMCksIDEwMCAqIHNpemVvZihSVEVOVFJZICopKTsKICAgICAgICBydGFsbG9jYXRlID0gMTAwOwogICAgfQoKICAgIC8qCiAgICAgKiByZXNldCB0aGUgcm91dGluZyB0YWJsZSBzaXplIHRvIHplcm8gLS0gd2FzIGEgQ01VIG1lbW9yeSBsZWFrIAogICAgICovCiAgICBydHNpemUgPSAwOwoKI2lmZGVmIFJURU5UUllfNF80CiAgICAvKgogICAgICogcnRlbnRyeSBpcyBhIEJTRCA0LjQgY29tcGF0IAogICAgICovCgojaWYgIWRlZmluZWQoQUZfVU5TUEVDKQojZGVmaW5lIEFGX1VOU1BFQyBBRl9JTkVUCiNlbmRpZgoKICAgIGF1dG9fbmxpc3QoUlRUQUJMRVNfU1lNQk9MLCAoY2hhciAqKSBydF90YWJsZSwgc2l6ZW9mKHJ0X3RhYmxlKSk7CiAgICBmb3IgKGkgPSAwOyBpIDw9IEFGX01BWDsgaSsrKSB7CiAgICAgICAgaWYgKHJ0X3RhYmxlW2ldID09IDApCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGlmIChORVRTTk1QX0tMT09LVVAocnRfdGFibGVbaV0sIChjaGFyICopICZoZWFkLCBzaXplb2YoaGVhZCkpKSB7CiAgICAgICAgICAgIGxvYWRfcnRlbnRyaWVzKGhlYWQucm5oX3RyZWV0b3ApOwogICAgICAgIH0KICAgIH0KCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcnRlbnRyeSBpcyBhIEJTRCA0LjMgY29tcGF0ICovCiAgICBmb3IgKHRhYmxlID0gMDsgdGFibGUgPCBOVU1fUk9VVEVfU1lNQk9MUzsgdGFibGUrKykgewogICAgICAgIGF1dG9fbmxpc3QoUlRIQVNIU0laRV9TWU1CT0wsIChjaGFyICopICZoYXNoc2l6ZSwKICAgICAgICAgICAgICAgICAgIHNpemVvZihoYXNoc2l6ZSkpOwogICAgICAgIHJvdXRlaGFzaCA9IChSVEVOVFJZICoqKSBtYWxsb2MoaGFzaHNpemUgKiBzaXplb2Yoc3RydWN0IG1idWYgKikpOwogICAgICAgIGF1dG9fbmxpc3Qocm91dGVfc3ltYm9sc1t0YWJsZV0sIChjaGFyICopIHJvdXRlaGFzaCwKICAgICAgICAgICAgICAgICAgIGhhc2hzaXplICogc2l6ZW9mKHN0cnVjdCBtYnVmICopKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGFzaHNpemU7IGkrKykgewogICAgICAgICAgICBpZiAocm91dGVoYXNoW2ldID09IDApCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgbSA9IHJvdXRlaGFzaFtpXTsKICAgICAgICAgICAgd2hpbGUgKG0pIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiAgICAgIERpZyB0aGUgcm91dGUgb3V0IG9mIHRoZSBrZXJuZWwuLi4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAobSwgKGNoYXIgKikgJm1iLCBzaXplb2YobWIpKSkgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtID0gbWIucnRfbmV4dDsKCiAgICAgICAgICAgICAgICBydCA9ICZtYjsKICAgICAgICAgICAgICAgIGlmIChydC0+cnRfaWZwICE9IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChydC0+cnRfaWZwLCAoY2hhciAqKSAmaWZuZXQsIHNpemVvZihpZm5ldCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChpZm5ldC5pZl9uYW1lLCBuYW1lLCAxNikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3Zhcl9yb3V0ZSIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5hbWVbMTVdID0gJ1wwJzsKICAgICAgICAgICAgICAgICAgICBjcCA9IChjaGFyICopIHN0cmNocihuYW1lLCAnXDAnKTsKICAgICAgICAgICAgICAgICAgICBzdHJpbmdfYXBwZW5kX2ludChjcCwgaWZuZXQuaWZfdW5pdCk7CgogICAgICAgICAgICAgICAgICAgIEludGVyZmFjZV9TY2FuX0luaXQoKTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoSW50ZXJmYWNlX1NjYW5fTmV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNob3J0ICopICZydC0+cnRfdW5pdCwgdGVtcCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChuYW1lLCB0ZW1wKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqICAgICAgQWxsb2NhdGUgYSBibG9jayB0byBob2xkIGl0IGFuZCBhZGQgaXQgdG8gdGhlIGRhdGFiYXNlCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmIChydHNpemUgPj0gcnRhbGxvY2F0ZSkgewogICAgICAgICAgICAgICAgICAgIHJ0aGVhZCA9CiAgICAgICAgICAgICAgICAgICAgICAgIChSVEVOVFJZICoqKSByZWFsbG9jKChjaGFyICopIHJ0aGVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIHJ0YWxsb2NhdGUgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUlRFTlRSWSAqKSk7CiAgICAgICAgICAgICAgICAgICAgbWVtc2V0KChjaGFyICopICZydGhlYWRbcnRhbGxvY2F0ZV0sICgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRhbGxvY2F0ZSAqIHNpemVvZihSVEVOVFJZICopKTsKCiAgICAgICAgICAgICAgICAgICAgcnRhbGxvY2F0ZSAqPSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFydGhlYWRbcnRzaXplXSkKICAgICAgICAgICAgICAgICAgICBydGhlYWRbcnRzaXplXSA9IChSVEVOVFJZICopIG1hbGxvYyhzaXplb2YoUlRFTlRSWSkpOwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqICAgICAgQWRkIHRoaXMgdG8gdGhlIGRhdGFiYXNlCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBydGhlYWRbcnRzaXplXSwgKGNoYXIgKikgcnQsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFJURU5UUlkpKTsKICAgICAgICAgICAgICAgIHJ0c2l6ZSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZyZWUocm91dGVoYXNoKTsKICAgIH0KI2VuZGlmCiAgICAvKgogICAgICogIFNvcnQgaXQhCiAgICAgKi8KICAgIHFzb3J0KChjaGFyICopIHJ0aGVhZCwgcnRzaXplLCBzaXplb2YocnRoZWFkWzBdKSwKI2lmZGVmIF9fU1REQ19fCiAgICAgICAgICAoaW50ICgqKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpIHFzb3J0X2NvbXBhcmUKI2Vsc2UKICAgICAgICAgIHFzb3J0X2NvbXBhcmUKI2VuZGlmCiAgICAgICAgKTsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTEgKi8KfQoKI2Vsc2UKCiNpZiBIQVZFX1NZU19NQlVGX0gKc3RhdGljIHZvaWQKUm91dGVfU2Nhbl9SZWxvYWQodm9pZCkKewogICAgc3RydWN0IG1idWYgICAqKnJvdXRlaGFzaCwgbWI7CiAgICByZWdpc3RlciBzdHJ1Y3QgbWJ1ZiAqbTsKICAgIHN0cnVjdCBpZm5ldCAgICBpZm5ldDsKICAgIFJURU5UUlkgICAgICAgICpydDsKICAgIGludCAgICAgICAgICAgICBpLCB0YWJsZTsKICAgIHJlZ2lzdGVyIGNoYXIgICpjcDsKICAgIGNoYXIgICAgICAgICAgICBuYW1lWzE2XSwgdGVtcFsxNl07CiAgICBzdGF0aWMgaW50ICAgICAgVGltZV9PZl9MYXN0X1JlbG9hZCA9IDA7CiAgICBzdHJ1Y3QgdGltZXZhbCAgbm93OwogICAgaW50ICAgICAgICAgICAgIGhhc2hzaXplOwoKICAgIGdldHRpbWVvZmRheSgmbm93LCAoc3RydWN0IHRpbWV6b25lICopIDApOwogICAgaWYgKFRpbWVfT2ZfTGFzdF9SZWxvYWQgKyBDQUNIRV9USU1FID4gbm93LnR2X3NlYykKICAgICAgICByZXR1cm47CiAgICBUaW1lX09mX0xhc3RfUmVsb2FkID0gbm93LnR2X3NlYzsKCiAgICAvKgogICAgICogIE1ha2VzIHN1cmUgd2UgaGF2ZSBTT01FIHNwYWNlIGFsbG9jYXRlZCBmb3IgbmV3IHJvdXRpbmcgZW50cmllcwogICAgICovCiAgICBpZiAoIXJ0aGVhZCkgewogICAgICAgIHJ0aGVhZCA9IChSVEVOVFJZICoqKSBtYWxsb2MoMTAwICogc2l6ZW9mKFJURU5UUlkgKikpOwogICAgICAgIGlmICghcnRoZWFkKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJyb3V0ZSB0YWJsZSBtYWxsb2MgZmFpbFxuIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbWVtc2V0KChjaGFyICopIHJ0aGVhZCwgKDApLCAxMDAgKiBzaXplb2YoUlRFTlRSWSAqKSk7CiAgICAgICAgcnRhbGxvY2F0ZSA9IDEwMDsKICAgIH0KCiAgICAvKgogICAgICogcmVzZXQgdGhlIHJvdXRpbmcgdGFibGUgc2l6ZSB0byB6ZXJvIC0tIHdhcyBhIENNVSBtZW1vcnkgbGVhayAKICAgICAqLwogICAgcnRzaXplID0gMDsKCiAgICBmb3IgKHRhYmxlID0gMDsgdGFibGUgPCBOVU1fUk9VVEVfU1lNQk9MUzsgdGFibGUrKykgewojaWZkZWYgc3VuVjMKICAgICAgICBoYXNoc2l6ZSA9IFJUSEFTSFNJWjsKI2Vsc2UKICAgICAgICBhdXRvX25saXN0KFJUSEFTSFNJWkVfU1lNQk9MLCAoY2hhciAqKSAmaGFzaHNpemUsCiAgICAgICAgICAgICAgICAgICBzaXplb2YoaGFzaHNpemUpKTsKI2VuZGlmCiAgICAgICAgcm91dGVoYXNoID0KICAgICAgICAgICAgKHN0cnVjdCBtYnVmICoqKSBtYWxsb2MoaGFzaHNpemUgKiBzaXplb2Yoc3RydWN0IG1idWYgKikpOwogICAgICAgIGF1dG9fbmxpc3Qocm91dGVfc3ltYm9sc1t0YWJsZV0sIChjaGFyICopIHJvdXRlaGFzaCwKICAgICAgICAgICAgICAgICAgIGhhc2hzaXplICogc2l6ZW9mKHN0cnVjdCBtYnVmICopKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGFzaHNpemU7IGkrKykgewogICAgICAgICAgICBpZiAocm91dGVoYXNoW2ldID09IDApCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgbSA9IHJvdXRlaGFzaFtpXTsKICAgICAgICAgICAgd2hpbGUgKG0pIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiAgRGlnIHRoZSByb3V0ZSBvdXQgb2YgdGhlIGtlcm5lbC4uLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChtLCAoY2hhciAqKSAmbWIsIHNpemVvZihtYikpKSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3Zhcl9yb3V0ZSIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG0gPSBtYi5tX25leHQ7CiAgICAgICAgICAgICAgICBydCA9IG10b2QoJm1iLCBSVEVOVFJZICopOwoKICAgICAgICAgICAgICAgIGlmIChydC0+cnRfaWZwICE9IDApIHsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAocnQtPnJ0X2lmcCwgKGNoYXIgKikgJmlmbmV0LCBzaXplb2YoaWZuZXQpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFyX3JvdXRlIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAoaWZuZXQuaWZfbmFtZSwgbmFtZSwgMTYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBuYW1lWzE1XSA9ICdcMCc7CiAgICAgICAgICAgICAgICAgICAgY3AgPSAoY2hhciAqKSBzdHJjaHIobmFtZSwgJ1wwJyk7CiAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2FwcGVuZF9pbnQoY3AsIGlmbmV0LmlmX3VuaXQpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAobmFtZSwgImxvMCIpID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2VfU2Nhbl9Jbml0KCk7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKEludGVyZmFjZV9TY2FuX05leHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzaG9ydCAqKSAmcnQtPnJ0X3VuaXQsIHRlbXAsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAobmFtZSwgdGVtcCkgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiAgQWxsb2NhdGUgYSBibG9jayB0byBob2xkIGl0IGFuZCBhZGQgaXQgdG8gdGhlIGRhdGFiYXNlCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmIChydHNpemUgPj0gcnRhbGxvY2F0ZSkgewogICAgICAgICAgICAgICAgICAgIHJ0aGVhZCA9CiAgICAgICAgICAgICAgICAgICAgICAgIChSVEVOVFJZICoqKSByZWFsbG9jKChjaGFyICopIHJ0aGVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIHJ0YWxsb2NhdGUgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUlRFTlRSWSAqKSk7CiAgICAgICAgICAgICAgICAgICAgbWVtc2V0KChjaGFyICopICZydGhlYWRbcnRhbGxvY2F0ZV0sICgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRhbGxvY2F0ZSAqIHNpemVvZihSVEVOVFJZICopKTsKCiAgICAgICAgICAgICAgICAgICAgcnRhbGxvY2F0ZSAqPSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFydGhlYWRbcnRzaXplXSkKICAgICAgICAgICAgICAgICAgICBydGhlYWRbcnRzaXplXSA9IChSVEVOVFJZICopIG1hbGxvYyhzaXplb2YoUlRFTlRSWSkpOwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqICogICAgICBBZGQgdGhpcyB0byB0aGUgZGF0YWJhc2UKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIHJ0aGVhZFtydHNpemVdLCAoY2hhciAqKSBydCwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUlRFTlRSWSkpOwogICAgICAgICAgICAgICAgcnRzaXplKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnJlZShyb3V0ZWhhc2gpOwogICAgfQogICAgLyoKICAgICAqICBTb3J0IGl0IQogICAgICovCiAgICBxc29ydCgoY2hhciAqKSBydGhlYWQsIHJ0c2l6ZSwgc2l6ZW9mKHJ0aGVhZFswXSksIHFzb3J0X2NvbXBhcmUpOwp9CiNlbHNlCiNpZmRlZiBsaW51eApzdGF0aWMgdm9pZApSb3V0ZV9TY2FuX1JlbG9hZCh2b2lkKQp7CiAgICBGSUxFICAgICAgICAgICAqaW47CiAgICBjaGFyICAgICAgICAgICAgbGluZVsyNTZdOwogICAgc3RydWN0IHJ0ZW50cnkgKnJ0OwogICAgY2hhciAgICAgICAgICAgIG5hbWVbMTZdOwogICAgc3RhdGljIGludCAgICAgIFRpbWVfT2ZfTGFzdF9SZWxvYWQgPSAwOwogICAgc3RydWN0IHRpbWV2YWwgIG5vdzsKCiAgICBnZXR0aW1lb2ZkYXkoJm5vdywgKHN0cnVjdCB0aW1lem9uZSAqKSAwKTsKICAgIGlmIChUaW1lX09mX0xhc3RfUmVsb2FkICsgQ0FDSEVfVElNRSA+IG5vdy50dl9zZWMpCiAgICAgICAgcmV0dXJuOwogICAgVGltZV9PZl9MYXN0X1JlbG9hZCA9IG5vdy50dl9zZWM7CgogICAgLyoKICAgICAqICBNYWtlcyBzdXJlIHdlIGhhdmUgU09NRSBzcGFjZSBhbGxvY2F0ZWQgZm9yIG5ldyByb3V0aW5nIGVudHJpZXMKICAgICAqLwogICAgaWYgKCFydGhlYWQpIHsKICAgICAgICBydGhlYWQgPSAoc3RydWN0IHJ0ZW50cnkgKiopIGNhbGxvYygxMDAsIHNpemVvZihzdHJ1Y3QgcnRlbnRyeSAqKSk7CiAgICAgICAgaWYgKCFydGhlYWQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgInJvdXRlIHRhYmxlIG1hbGxvYyBmYWlsXG4iKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBydGFsbG9jYXRlID0gMTAwOwogICAgfQoKICAgIC8qCiAgICAgKiBmZXRjaCByb3V0ZXMgZnJvbSB0aGUgcHJvYyBmaWxlLXN5c3RlbToKICAgICAqLwoKICAgIHJ0c2l6ZSA9IDA7CgogICAgaWYgKCEoaW4gPSBmb3BlbigiL3Byb2MvbmV0L3JvdXRlIiwgInIiKSkpIHsKICAgICAgICBORVRTTk1QX0xPR09OQ0UoKExPR19FUlIsICJjYW5ub3Qgb3BlbiAvcHJvYy9uZXQvcm91dGUgLSBidXJwc1xuIikpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICB3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBpbikpIHsKICAgICAgICBzdHJ1Y3QgcnRlbnRyeSAgcnRlbnQ7CiAgICAgICAgY2hhciAgICAgICAgICAgIHJ0ZW50X25hbWVbMzJdOwogICAgICAgIGludCAgICAgICAgICAgICByZWZjbnQsIG1ldHJpYzsKICAgICAgICB1bnNpZ25lZCAgICAgICAgZmxhZ3MsIHVzZTsKCiAgICAgICAgcnQgPSAmcnRlbnQ7CiAgICAgICAgbWVtc2V0KChjaGFyICopIHJ0LCAoMCksIHNpemVvZigqcnQpKTsKICAgICAgICBydC0+cnRfZGV2ID0gcnRlbnRfbmFtZTsKCiAgICAgICAgLyoKICAgICAgICAgKiBhcyB3aXRoIDEuOTkuMTQ6CiAgICAgICAgICogSWZhY2UgRGVzdCBHVyBGbGFncyBSZWZDbnQgVXNlIE1ldHJpYyBNYXNrIE1UVSBXaW4gSVJUVAogICAgICAgICAqIGV0aDAgMEEwQTBBMEEgMDAwMDAwMDAgMDUgMCAwIDAgRkZGRkZGRkYgMTUwMCAwIDAgCiAgICAgICAgICovCiAgICAgICAgaWYgKDggIT0gc3NjYW5mKGxpbmUsICIlcyAleCAleCAleCAlZCAldSAlZCAleCAlKmQgJSpkICUqZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgcnQtPnJ0X2RldiwKICAgICAgICAgICAgICAgICAgICAgICAgJigoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmKHJ0ZW50LnJ0X2RzdCkpLT5zaW5fYWRkci5zX2FkZHIpLAogICAgICAgICAgICAgICAgICAgICAgICAmKCgoc3RydWN0IHNvY2thZGRyX2luICopICYocnRlbnQucnRfZ2F0ZXdheSkpLT5zaW5fYWRkci5zX2FkZHIpLAogICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBYWFg6IGZpeCB0eXBlIG9mIHRoZSBhcmdzIAogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLCAmcmVmY250LCAmdXNlLCAmbWV0cmljLAogICAgICAgICAgICAgICAgICAgICAgICAmKCgoc3RydWN0IHNvY2thZGRyX2luICopICYocnRlbnQucnRfZ2VubWFzaykpLT5zaW5fYWRkci5zX2FkZHIpKSkKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgIHN0cmxjcHkobmFtZSwgcnQtPnJ0X2Rldiwgc2l6ZW9mKG5hbWUpKTsKCiAgICAgICAgcnQtPnJ0X2ZsYWdzID0gZmxhZ3MsIHJ0LT5ydF9yZWZjbnQgPSByZWZjbnQ7CiAgICAgICAgcnQtPnJ0X3VzZSA9IHVzZSwgcnQtPnJ0X21ldHJpYyA9IG1ldHJpYzsKCiAgICAgICAgcnQtPnJ0X3VuaXQgPSBuZXRzbm1wX2FjY2Vzc19pbnRlcmZhY2VfaW5kZXhfZmluZChuYW1lKTsKCiAgICAgICAgLyoKICAgICAgICAgKiAgQWxsb2NhdGUgYSBibG9jayB0byBob2xkIGl0IGFuZCBhZGQgaXQgdG8gdGhlIGRhdGFiYXNlCiAgICAgICAgICovCiAgICAgICAgaWYgKHJ0c2l6ZSA+PSBydGFsbG9jYXRlKSB7CiAgICAgICAgICAgIHJ0aGVhZCA9IChzdHJ1Y3QgcnRlbnRyeSAqKikgcmVhbGxvYygoY2hhciAqKSBydGhlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogcnRhbGxvY2F0ZSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHJ0ZW50cnkgKikpOwogICAgICAgICAgICBtZW1zZXQoJnJ0aGVhZFtydGFsbG9jYXRlXSwgMCwKICAgICAgICAgICAgICAgICAgIHJ0YWxsb2NhdGUgKiBzaXplb2Yoc3RydWN0IHJ0ZW50cnkgKikpOwogICAgICAgICAgICBydGFsbG9jYXRlICo9IDI7CiAgICAgICAgfQogICAgICAgIGlmICghcnRoZWFkW3J0c2l6ZV0pCiAgICAgICAgICAgIHJ0aGVhZFtydHNpemVdID0KICAgICAgICAgICAgICAgIChzdHJ1Y3QgcnRlbnRyeSAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBydGVudHJ5KSk7CiAgICAgICAgLyoKICAgICAgICAgKiAgQWRkIHRoaXMgdG8gdGhlIGRhdGFiYXNlCiAgICAgICAgICovCiAgICAgICAgbWVtY3B5KChjaGFyICopIHJ0aGVhZFtydHNpemVdLCAoY2hhciAqKSBydCwKICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBydGVudHJ5KSk7CiAgICAgICAgcnRzaXplKys7CiAgICB9CgogICAgZmNsb3NlKGluKTsKCiAgICAvKgogICAgICogIFNvcnQgaXQhCiAgICAgKi8KICAgIHFzb3J0KChjaGFyICopIHJ0aGVhZCwgcnRzaXplLCBzaXplb2YocnRoZWFkWzBdKSwgcXNvcnRfY29tcGFyZSk7Cn0KI2VuZGlmCiNlbmRpZgojZW5kaWYKCgojaWZuZGVmIHNvbGFyaXMyCi8qCiAqICAgICAgQ3JlYXRlIGEgaG9zdCB0YWJsZQogKi8KI2lmZGVmIGhwdXgxMQpzdGF0aWMgaW50CnFzb3J0X2NvbXBhcmUoY29uc3Qgdm9pZCAqdjEsIGNvbnN0IHZvaWQgKnYyKQp7CiAgICBjb25zdCBtaWJfaXBSb3V0ZUVudCAqcjEgPSAoY29uc3QgbWliX2lwUm91dGVFbnQgKikgdjE7CiAgICBjb25zdCBtaWJfaXBSb3V0ZUVudCAqcjIgPSAoY29uc3QgbWliX2lwUm91dGVFbnQgKikgdjI7CiAgICAvKgogICAgICogICAgICBEbyB0aGUgY29tcGFyaXNvbgogICAgICovCiAgICBpZiAocjEtPkRlc3QgPT0gcjItPkRlc3QpCiAgICAgICAgcmV0dXJuICgwKTsKICAgIGlmIChyMS0+RGVzdCAgPiByMi0+RGVzdCkKICAgICAgICByZXR1cm4gKDEpOwogICAgcmV0dXJuICgtMSk7Cn0KI2Vsc2UKc3RhdGljIGludApxc29ydF9jb21wYXJlKGNvbnN0IHZvaWQgKnYxLCBjb25zdCB2b2lkICp2MikKewogICAgUlRFTlRSWSAqIGNvbnN0ICpyMSA9IChSVEVOVFJZICogY29uc3QgKikgdjE7CiAgICBSVEVOVFJZICogY29uc3QgKnIyID0gKFJURU5UUlkgKiBjb25zdCAqKSB2MjsKI2lmIE5FRURfS0xHRVRTQQogICAgcmVnaXN0ZXIgdV9sb25nIGRzdDEgPQogICAgICAgIG50b2hsKGtsZ2V0c2EoKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAoKnIxKS0+cnRfZHN0KS0+CiAgICAgICAgICAgICAgc2luX2FkZHIuc19hZGRyKTsKICAgIHJlZ2lzdGVyIHVfbG9uZyBkc3QyID0KICAgICAgICBudG9obChrbGdldHNhKChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgKCpyMiktPnJ0X2RzdCktPgogICAgICAgICAgICAgIHNpbl9hZGRyLnNfYWRkcik7CiNlbHNlCiAgICByZWdpc3RlciB1X2xvbmcgZHN0MSA9CiAgICAgICAgbnRvaGwoKChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJigoKnIxKS0+cnRfZHN0KSktPnNpbl9hZGRyLgogICAgICAgICAgICAgIHNfYWRkcik7CiAgICByZWdpc3RlciB1X2xvbmcgZHN0MiA9CiAgICAgICAgbnRvaGwoKChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJigoKnIyKS0+cnRfZHN0KSktPnNpbl9hZGRyLgogICAgICAgICAgICAgIHNfYWRkcik7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVFRF9LTEdFVFNBICovCgogICAgLyoKICAgICAqICAgICAgRG8gdGhlIGNvbXBhcmlzb24KICAgICAqLwogICAgaWYgKGRzdDEgPT0gZHN0MikKICAgICAgICByZXR1cm4gKDApOwogICAgaWYgKGRzdDEgPiBkc3QyKQogICAgICAgIHJldHVybiAoMSk7CiAgICByZXR1cm4gKC0xKTsKfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBVU0VfU1lTQ1RMX1JPVVRFX0RVTVAgKi8KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29sYXJpczIgKi8KCiNlbGlmIGRlZmluZWQoSEFWRV9JUEhMUEFQSV9IKSAgLyogV0lOMzIgY3lnd2luICovCiNpbmNsdWRlIDxpcGhscGFwaS5oPgojaWZuZGVmIE1JQl9JUFBST1RPX05FVE1HTVQKI2RlZmluZSBNSUJfSVBQUk9UT19ORVRNR01UIDMKI2VuZGlmCgpQTUlCX0lQRk9SV0FSRFJPVyByb3V0ZV9yb3c7CmludCAgICAgICAgICAgICBjcmVhdGVfZmxhZzsKdm9pZAppbml0X3Zhcl9yb3V0ZSh2b2lkKQp7Cn0KCnVfY2hhciAgICAgICAgICoKdmFyX2lwUm91dGVFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICAvKgogICAgICogb2JqZWN0IGlkZW50aWZpZXIgaXMgb2YgZm9ybToKICAgICAqIDEuMy42LjEuMi4xLjQuMjEuMS4/LkEuQi5DLkQsICB3aGVyZSBBLkIuQy5EIGlzIElQIGFkZHJlc3MuCiAgICAgKiBJUEFERFIgc3RhcnRzIGF0IG9mZnNldCAxMC4KICAgICAqLwogICAgcmVnaXN0ZXIgaW50ICAgIFNhdmVfVmFsaWQsIHJlc3VsdCwgUnRJbmRleCA9IDA7CiAgICBzdGF0aWMgaW50ICAgICAgc2F2ZU5hbWVMZW4gPSAwLCBzYXZlRXhhY3QgPSAwLCBzYXZlUnRJbmRleCA9CiAgICAgICAgMCwgcnRzaXplID0gMDsKICAgIHN0YXRpYyBvaWQgICAgICBzYXZlTmFtZVtNQVhfT0lEX0xFTl0sIEN1cnJlbnRbTUFYX09JRF9MRU5dOwogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgb2lkICAgICAgICAgICAgKm9wOwogICAgRFdPUkQgICAgICAgICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogICAgRFdPUkQgICAgICAgICAgIGR3QWN0dWFsU2l6ZSA9IDA7CiAgICBzdGF0aWMgUE1JQl9JUEZPUldBUkRUQUJMRSBwSXBSdHJUYWJsZSA9IE5VTEw7CiAgICBzdHJ1Y3QgdGltZXZhbCAgbm93OwogICAgc3RhdGljIGxvbmcgICAgIFRpbWVfT2ZfTGFzdF9SZWxvYWQgPSAwOwogICAgc3RhdGljIGluX2FkZHJfdCBhZGRyX3JldDsKCgogICAgLyoqIAogICAgICoqIHRoaXMgb3B0aW1pc2F0aW9uIGZhaWxzLCBpZiB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHJvdXRlIGF2YWlsLgogICAgICoqIGl0IGlzIGEgdmVyeSBzcGVjaWFsIGNhc2UsIGJ1dCBiZXR0ZXIgbGVhdmUgaXQgb3V0IC4uLgogICAgICoqLwojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgIHNhdmVOYW1lTGVuID0gMDsKI2VuZGlmCiAgICBpZiAocm91dGVfcm93ID09IE5VTEwpIHsKICAgICAgICAvKgogICAgICAgICAqIEZyZWUgYWxsb2NhdGVkIG1lbW9yeSBpbiBjYXNlIG9mIFNFVCByZXF1ZXN0J3MgRlJFRSBwaGFzZSAKICAgICAgICAgKi8KICAgICAgICByb3V0ZV9yb3cgPSAoUE1JQl9JUEZPUldBUkRST1cpIG1hbGxvYyhzaXplb2YoTUlCX0lQRk9SV0FSRFJPVykpOwogICAgfQogICAgZ2V0dGltZW9mZGF5KCZub3csIChzdHJ1Y3QgdGltZXpvbmUgKikgMCk7CiAgICBpZiAoKHJ0c2l6ZSA8PSAxKSB8fCAoVGltZV9PZl9MYXN0X1JlbG9hZCArIDUgPD0gbm93LnR2X3NlYykpCiAgICAgICAgU2F2ZV9WYWxpZCA9IDA7CiAgICBlbHNlCiAgICAgICAgLyoKICAgICAgICAgKiAgT1BUSU1JWkFUSU9OOgogICAgICAgICAqCiAgICAgICAgICogIElmIHRoZSBuYW1lIHdhcyB0aGUgc2FtZSBhcyB0aGUgbGFzdCBuYW1lLCB3aXRoIHRoZSBwb3NzaWJsZQogICAgICAgICAqICBleGNlcHRpb24gb2YgdGhlIFs5XXRoIHRva2VuLCB0aGVuIGRvbid0IHJlYWQgdGhlIHJvdXRpbmcgdGFibGUKICAgICAgICAgKgogICAgICAgICAqLwoKICAgIGlmICgoc2F2ZU5hbWVMZW4gPT0gKGludCkgKmxlbmd0aCkgJiYgKHNhdmVFeGFjdCA9PSBleGFjdCkpIHsKICAgICAgICByZWdpc3RlciBpbnQgICAgdGVtcCA9IG5hbWVbOV07CiAgICAgICAgbmFtZVs5XSA9IDA7CiAgICAgICAgU2F2ZV9WYWxpZCA9CiAgICAgICAgICAgIChzbm1wX29pZF9jb21wYXJlKG5hbWUsICpsZW5ndGgsIHNhdmVOYW1lLCBzYXZlTmFtZUxlbikgPT0gMCk7CiAgICAgICAgbmFtZVs5XSA9IHRlbXA7CiAgICB9IGVsc2UKICAgICAgICBTYXZlX1ZhbGlkID0gMDsKCiAgICBpZiAoU2F2ZV9WYWxpZCkgewogICAgICAgIHJlZ2lzdGVyIGludCAgICB0ZW1wID0gbmFtZVs5XTsgLyogRml4IHVwICdsb3dlc3QnIGZvdW5kIGVudHJ5ICovCiAgICAgICAgbWVtY3B5KChjaGFyICopIG5hbWUsIChjaGFyICopIEN1cnJlbnQsIDE0ICogc2l6ZW9mKG9pZCkpOwogICAgICAgIG5hbWVbOV0gPSB0ZW1wOwogICAgICAgICpsZW5ndGggPSAxNDsKICAgICAgICBSdEluZGV4ID0gc2F2ZVJ0SW5kZXg7CiAgICB9IGVsc2UgewogICAgICAgIC8qCiAgICAgICAgICogZmlsbCBpbiBvYmplY3QgcGFydCBvZiBuYW1lIGZvciBjdXJyZW50KGxlc3Mgc2l6ZW9mIGluc3RhbmNlIHBhcnQpIAogICAgICAgICAqLwoKICAgICAgICBtZW1jcHkoKGNoYXIgKikgQ3VycmVudCwgKGNoYXIgKikgdnAtPm5hbWUsCiAgICAgICAgICAgICAgIChpbnQpICh2cC0+bmFtZWxlbikgKiBzaXplb2Yob2lkKSk7CgoKICAgICAgICBpZiAoKFRpbWVfT2ZfTGFzdF9SZWxvYWQgKyA1IDw9IG5vdy50dl9zZWMpCiAgICAgICAgICAgIHx8IChwSXBSdHJUYWJsZSA9PSBOVUxMKSkgewogICAgICAgICAgICBpZiAocElwUnRyVGFibGUgIT0gTlVMTCkKICAgICAgICAgICAgICAgIGZyZWUocElwUnRyVGFibGUpOwogICAgICAgICAgICBUaW1lX09mX0xhc3RfUmVsb2FkID0gbm93LnR2X3NlYzsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogcXVlcnkgZm9yIGJ1ZmZlciBzaXplIG5lZWRlZCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHN0YXR1cyA9IEdldElwRm9yd2FyZFRhYmxlKHBJcFJ0clRhYmxlLCAmZHdBY3R1YWxTaXplLCBUUlVFKTsKICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKSB7CiAgICAgICAgICAgICAgICBwSXBSdHJUYWJsZSA9IChQTUlCX0lQRk9SV0FSRFRBQkxFKSBtYWxsb2MoZHdBY3R1YWxTaXplKTsKICAgICAgICAgICAgICAgIGlmIChwSXBSdHJUYWJsZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiBHZXQgdGhlIHNvcnRlZCBJUCBSb3V0ZSBUYWJsZSAKICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPQogICAgICAgICAgICAgICAgICAgICAgICBHZXRJcEZvcndhcmRUYWJsZShwSXBSdHJUYWJsZSwgJmR3QWN0dWFsU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICBydHNpemUgPSBwSXBSdHJUYWJsZS0+ZHdOdW1FbnRyaWVzOwogICAgICAgICAgICBmb3IgKFJ0SW5kZXggPSAwOyBSdEluZGV4IDwgcnRzaXplOyBSdEluZGV4KyspIHsKICAgICAgICAgICAgICAgIGNwID0gKHVfY2hhciAqKSAmIHBJcFJ0clRhYmxlLT50YWJsZVtSdEluZGV4XS4KICAgICAgICAgICAgICAgICAgICBkd0ZvcndhcmREZXN0OwogICAgICAgICAgICAgICAgb3AgPSBDdXJyZW50ICsgMTA7CiAgICAgICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAgICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwoKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgQ3VycmVudCwgMTQpOwogICAgICAgICAgICAgICAgaWYgKChleGFjdCAmJiAocmVzdWx0ID09IDApKSB8fCAoIWV4YWN0ICYmIChyZXN1bHQgPCAwKSkpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKFJ0SW5kZXggPj0gcnRzaXplKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGZvciBjcmVhdGlvbiBvZiBuZXcgcm93LCBvbmx5IGlwTmV0VG9NZWRpYVRhYmxlIGNhc2UgaXMgY29uc2lkZXJlZCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmICgqbGVuZ3RoID09IDE0KSB7CiAgICAgICAgICAgICAgICB1X2NoYXIgICAgICAgICAgIGRlc3RfYWRkcls0XTsKICAgICAgICAgICAgICAgIE1JQl9JUEZPUldBUkRST1cgdGVtcF9yb3c7CgogICAgICAgICAgICAgICAgY3JlYXRlX2ZsYWcgPSAxOwogICAgICAgICAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3J0ZTsKICAgICAgICAgICAgICAgIGRlc3RfYWRkclswXSA9ICh1X2NoYXIpIG5hbWVbMTBdOwogICAgICAgICAgICAgICAgZGVzdF9hZGRyWzFdID0gKHVfY2hhcikgbmFtZVsxMV07CiAgICAgICAgICAgICAgICBkZXN0X2FkZHJbMl0gPSAodV9jaGFyKSBuYW1lWzEyXTsKICAgICAgICAgICAgICAgIGRlc3RfYWRkclszXSA9ICh1X2NoYXIpIG5hbWVbMTNdOwogICAgICAgICAgICAgICAgbWVtc2V0KCZ0ZW1wX3JvdywgMCwgc2l6ZW9mKHRlbXBfcm93KSk7CiAgICAgICAgICAgICAgICB0ZW1wX3Jvdy5kd0ZvcndhcmREZXN0ID0gKigoRFdPUkQgKikgZGVzdF9hZGRyKTsKICAgICAgICAgICAgICAgIHRlbXBfcm93LmR3Rm9yd2FyZFBvbGljeSA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wX3Jvdy5kd0ZvcndhcmRQcm90byA9IE1JQl9JUFBST1RPX05FVE1HTVQ7CiAgICAgICAgICAgICAgICAqcm91dGVfcm93ID0gdGVtcF9yb3c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnJlZShwSXBSdHJUYWJsZSk7CiAgICAgICAgICAgIHBJcFJ0clRhYmxlID0gTlVMTDsKICAgICAgICAgICAgcnRzaXplID0gMDsKICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgICAgICB9CiAgICAgICAgY3JlYXRlX2ZsYWcgPSAwOwogICAgICAgIC8qCiAgICAgICAgICogIFNhdmUgaW4gdGhlICdjYWNoZScKICAgICAgICAgKi8KICAgICAgICBtZW1jcHkoKGNoYXIgKikgc2F2ZU5hbWUsIChjaGFyICopIG5hbWUsCiAgICAgICAgICAgICAgIFNOTVBfTUlOKCpsZW5ndGgsIE1BWF9PSURfTEVOKSAqIHNpemVvZihvaWQpKTsKICAgICAgICBzYXZlTmFtZVs5XSA9IDA7CiAgICAgICAgc2F2ZU5hbWVMZW4gPSAqbGVuZ3RoOwogICAgICAgIHNhdmVFeGFjdCA9IGV4YWN0OwogICAgICAgIHNhdmVSdEluZGV4ID0gUnRJbmRleDsKCiAgICAgICAgLyoKICAgICAgICAgKiAgUmV0dXJuIHRoZSBuYW1lCiAgICAgICAgICovCiAgICAgICAgbWVtY3B5KChjaGFyICopIG5hbWUsIChjaGFyICopIEN1cnJlbnQsIDE0ICogc2l6ZW9mKG9pZCkpOwogICAgICAgICpsZW5ndGggPSAxNDsKICAgIH0KICAgICp2YXJfbGVuID0gc2l6ZW9mKGxvbmdfcmV0dXJuKTsKICAgICpyb3V0ZV9yb3cgPSBwSXBSdHJUYWJsZS0+dGFibGVbUnRJbmRleF07CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgSVBST1VURURFU1Q6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9ydGU7CiAgICAgICAgYWRkcl9yZXQgPSBwSXBSdHJUYWJsZS0+dGFibGVbUnRJbmRleF0uZHdGb3J3YXJkRGVzdDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGFkZHJfcmV0OwogICAgY2FzZSBJUFJPVVRFSUZJTkRFWDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcnRlOwogICAgICAgIGxvbmdfcmV0dXJuID0gcElwUnRyVGFibGUtPnRhYmxlW1J0SW5kZXhdLmR3Rm9yd2FyZElmSW5kZXg7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzE6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3J0ZTsKICAgICAgICBsb25nX3JldHVybiA9IHBJcFJ0clRhYmxlLT50YWJsZVtSdEluZGV4XS5kd0ZvcndhcmRNZXRyaWMxOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUMyOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9ydGU7CiAgICAgICAgbG9uZ19yZXR1cm4gPSBwSXBSdHJUYWJsZS0+dGFibGVbUnRJbmRleF0uZHdGb3J3YXJkTWV0cmljMjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDMzoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcnRlOwogICAgICAgIGxvbmdfcmV0dXJuID0gcElwUnRyVGFibGUtPnRhYmxlW1J0SW5kZXhdLmR3Rm9yd2FyZE1ldHJpYzM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzQ6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3J0ZTsKICAgICAgICBsb25nX3JldHVybiA9IHBJcFJ0clRhYmxlLT50YWJsZVtSdEluZGV4XS5kd0ZvcndhcmRNZXRyaWM0OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUM1OgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9ydGU7CiAgICAgICAgbG9uZ19yZXR1cm4gPSBwSXBSdHJUYWJsZS0+dGFibGVbUnRJbmRleF0uZHdGb3J3YXJkTWV0cmljNTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTkVYVEhPUDoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3J0ZTsKICAgICAgICBhZGRyX3JldCA9IHBJcFJ0clRhYmxlLT50YWJsZVtSdEluZGV4XS5kd0ZvcndhcmROZXh0SG9wOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CiAgICBjYXNlIElQUk9VVEVUWVBFOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9ydGU7CiAgICAgICAgbG9uZ19yZXR1cm4gPSBwSXBSdHJUYWJsZS0+dGFibGVbUnRJbmRleF0uZHdGb3J3YXJkVHlwZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFUFJPVE86CiAgICAgICAgbG9uZ19yZXR1cm4gPSBwSXBSdHJUYWJsZS0+dGFibGVbUnRJbmRleF0uZHdGb3J3YXJkUHJvdG87CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURUFHRToKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcnRlOwogICAgICAgIGxvbmdfcmV0dXJuID0gcElwUnRyVGFibGUtPnRhYmxlW1J0SW5kZXhdLmR3Rm9yd2FyZEFnZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUFTSzoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcnRlOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKICAgICAgICBhZGRyX3JldCA9IHBJcFJ0clRhYmxlLT50YWJsZVtSdEluZGV4XS5kd0ZvcndhcmRNYXNrOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CiAgICBjYXNlIElQUk9VVEVJTkZPOgogICAgICAgICp2YXJfbGVuID0gbnVsbE9pZExlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBudWxsT2lkOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2lwUm91dGVFbnRyeVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdJTjMyIGN5Z3dpbiAqLwoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0NBTl9VU0VfU1lTQ1RMICovCgpzdGF0aWMKVEFJTFFfSEVBRCgsIHNubXBydCkKICAgIHJ0aGVhZDsKICAgICBzdGF0aWMgY2hhciAgICAqcnRidWY7CiAgICAgc3RhdGljIHNpemVfdCAgIHJ0YnVmbGVuOwogICAgIHN0YXRpYyB0aW1lX3QgICBsYXN0dGltZTsKCiAgICAgc3RydWN0IHNubXBydCB7CiAgICAgICAgIFRBSUxRX0VOVFJZKHNubXBydCkgbGluazsKICAgICAgICAgc3RydWN0IHJ0X21zZ2hkciAqaGRyOwogICAgICAgICBzdHJ1Y3QgaW5fYWRkciAgZGVzdDsKICAgICAgICAgc3RydWN0IGluX2FkZHIgIGdhdGV3YXk7CiAgICAgICAgIHN0cnVjdCBpbl9hZGRyICBuZXRtYXNrOwogICAgICAgICBpbnQgICAgICAgICAgICAgaW5kZXg7CiAgICAgICAgIHN0cnVjdCBpbl9hZGRyICBpZmE7CiAgICAgfTsKCiAgICAgc3RhdGljIHZvaWQKICAgICAgICAgICAgICAgICAgICAgcnRtc2coc3RydWN0IHJ0X21zZ2hkciAqcnRtKQp7CiAgICBzdHJ1Y3Qgc25tcHJ0ICAqcnQ7CiAgICBzdHJ1Y3Qgc29ja2FkZHIgKnNhOwogICAgaW50ICAgICAgICAgICAgIGJpdCwgZ290ZGVzdCwgZ290bWFzazsKCiAgICBydCA9IG1hbGxvYyhzaXplb2YgKnJ0KTsKICAgIGlmIChydCA9PSAwKQogICAgICAgIHJldHVybjsKICAgIHJ0LT5oZHIgPSBydG07CiAgICBydC0+aWZhLnNfYWRkciA9IDA7CiAgICBydC0+ZGVzdCA9IHJ0LT5nYXRld2F5ID0gcnQtPm5ldG1hc2sgPSBydC0+aWZhOwogICAgcnQtPmluZGV4ID0gcnRtLT5ydG1faW5kZXg7CgogICAgZ290ZGVzdCA9IGdvdG1hc2sgPSAwOwogICAgc2EgPSAoc3RydWN0IHNvY2thZGRyICopIChydG0gKyAxKTsKICAgIGZvciAoYml0ID0gMTsgKChjaGFyICopIHNhIDwgKGNoYXIgKikgcnRtICsgcnRtLT5ydG1fbXNnbGVuKSAmJiBiaXQ7CiAgICAgICAgIGJpdCA8PD0gMSkgewogICAgICAgIGlmICgocnRtLT5ydG1fYWRkcnMgJiBiaXQpID09IDApCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIHN3aXRjaCAoYml0KSB7CiAgICAgICAgY2FzZSBSVEFfRFNUOgojZGVmaW5lIHNhdG9zaW4oc2EpICgoc3RydWN0IHNvY2thZGRyX2luICopKHNhKSkKICAgICAgICAgICAgcnQtPmRlc3QgPSBzYXRvc2luKHNhKS0+c2luX2FkZHI7CiAgICAgICAgICAgIGdvdGRlc3QgPSAxOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFJUQV9HQVRFV0FZOgogICAgICAgICAgICBpZiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUKQogICAgICAgICAgICAgICAgcnQtPmdhdGV3YXkgPSBzYXRvc2luKHNhKS0+c2luX2FkZHI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUlRBX05FVE1BU0s6CiAgICAgICAgICAgIGlmIChzYS0+c2FfbGVuID49IG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl9pbiwgc2luX2FkZHIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0LT5uZXRtYXNrID0gc2F0b3NpbihzYSktPnNpbl9hZGRyOwogICAgICAgICAgICBnb3RtYXNrID0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBSVEFfSUZBOgogICAgICAgICAgICBpZiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUKQogICAgICAgICAgICAgICAgcnQtPmlmYSA9IHNhdG9zaW4oc2EpLT5zaW5fYWRkcjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgICogZnJvbSBydHNvY2suYyAKICAgICAgICAgKi8KI2RlZmluZSBST1VORFVQKGEpIFwKICAgICAgICAoKGEpID4gMCA/ICgxICsgKCgoYSkgLSAxKSB8IChzaXplb2YobG9uZykgLSAxKSkpIDogc2l6ZW9mKGxvbmcpKQogICAgICAgIHNhID0gKHN0cnVjdCBzb2NrYWRkciAqKSAoKGNoYXIgKikgc2EgKyBST1VORFVQKHNhLT5zYV9sZW4pKTsKICAgIH0KICAgIGlmICghZ290ZGVzdCkgewogICAgICAgIC8qCiAgICAgICAgICogWFhYIGNhbid0IGhhcHBlbiBpZiBjb2RlIGFib3ZlIGlzIGNvcnJlY3QgCiAgICAgICAgICovCiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgInJvdXRlIG5vIGRlc3Q/XG4iKTsKICAgICAgICBmcmVlKHJ0KTsKICAgIH0gZWxzZSB7CiAgICAgICAgLyoKICAgICAgICAgKiBJZiBubyBtYXNrIHByb3ZpZGVkLCBpdCB3YXMgYSBob3N0IHJvdXRlLiAKICAgICAgICAgKi8KICAgICAgICBpZiAoIWdvdG1hc2spCiAgICAgICAgICAgIHJ0LT5uZXRtYXNrLnNfYWRkciA9IH4wOwogICAgICAgIFRBSUxRX0lOU0VSVF9UQUlMKCZydGhlYWQsIHJ0LCBsaW5rKTsKICAgIH0KfQoKc3RhdGljIGludApzdWNrX2tydChpbnQgZm9yY2UpCnsKICAgIHRpbWVfdCAgICAgICAgICBub3c7CiAgICBzdHJ1Y3Qgc25tcHJ0ICAqcnQsICpuZXh0OwogICAgc2l6ZV90ICAgICAgICAgIGxlbjsKICAgIHN0YXRpYyBpbnQgICAgICBuYW1lWzZdID0KICAgICAgICB7IENUTF9ORVQsIFBGX1JPVVRFLCAwLCBBRl9JTkVULCBORVRfUlRfRFVNUCwgMCB9OwogICAgY2hhciAgICAgICAgICAgKmNwOwogICAgc3RydWN0IHJ0X21zZ2hkciAqcnRtOwoKICAgIHRpbWUoJm5vdyk7CiAgICBpZiAobm93IDwgKGxhc3R0aW1lICsgQ0FDSEVfVElNRSkgJiYgIWZvcmNlKQogICAgICAgIHJldHVybiAwOwogICAgbGFzdHRpbWUgPSBub3c7CgogICAgZm9yIChydCA9IHJ0aGVhZC50cWhfZmlyc3Q7IHJ0OyBydCA9IG5leHQpIHsKICAgICAgICBuZXh0ID0gcnQtPmxpbmsudHFlX25leHQ7CiAgICAgICAgZnJlZShydCk7CiAgICB9CiAgICBUQUlMUV9JTklUKCZydGhlYWQpOwoKICAgIGlmIChzeXNjdGwobmFtZSwgNiwgMCwgJmxlbiwgMCwgMCkgPCAwKSB7CiAgICAgICAgc3lzbG9nKExPR19XQVJOSU5HLCAic3lzY3RsIG5ldC1yb3V0ZS1kdW1wOiAlbSIpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBpZiAobGVuID4gcnRidWZsZW4pIHsKICAgICAgICBjaGFyICAgICAgICAgICAqbmV3YnVmOwogICAgICAgIG5ld2J1ZiA9IHJlYWxsb2MocnRidWYsIGxlbik7CiAgICAgICAgaWYgKG5ld2J1ZiA9PSAwKQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgcnRidWYgPSBuZXdidWY7CiAgICAgICAgcnRidWZsZW4gPSBsZW47CiAgICB9CgogICAgaWYgKHN5c2N0bChuYW1lLCA2LCBydGJ1ZiwgJmxlbiwgMCwgMCkgPCAwKSB7CiAgICAgICAgc3lzbG9nKExPR19XQVJOSU5HLCAic3lzY3RsIG5ldC1yb3V0ZS1kdW1wOiAlbSIpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBjcCA9IHJ0YnVmOwogICAgd2hpbGUgKGNwIDwgcnRidWYgKyBsZW4pIHsKICAgICAgICBydG0gPSAoc3RydWN0IHJ0X21zZ2hkciAqKSBjcDsKICAgICAgICAvKgogICAgICAgICAqIE5COgogICAgICAgICAqIFlvdSBtaWdodCB3YW50IHRvIGV4Y2x1ZGUgcm91dGVzIHdpdGggUlRGX1dBU0NMT05FRAogICAgICAgICAqIHNldC4gIFRoaXMga2VlcHMgdGhlIGNsb25lZCBob3N0IHJvdXRlcyAoYW5kIHRodXMgYWxzbwogICAgICAgICAqIEFSUCBlbnRyaWVzKSBvdXQgb2YgdGhlIHJvdXRpbmcgdGFibGUuICBUaHVzLCBpdCBhbHNvCiAgICAgICAgICogcHJlc2VudHMgbWFuYWdlbWVudCBzdGF0aW9ucyB3aXRoIGFuIGluY29tcGxldGUgdmlldy4KICAgICAgICAgKiBJIGJlbGlldmUgdGhhdCBpdCBzaG91bGQgYmUgcG9zc2libGUgZm9yIGEgbWFuYWdlbWVudAogICAgICAgICAqIHN0YXRpb24gdG8gZXhhbWluZSAoYW5kIHBlcmhhcHMgZGVsZXRlKSBzdWNoIHJvdXRlcy4KICAgICAgICAgKi8KICAgICAgICBpZiAocnRtLT5ydG1fdmVyc2lvbiA9PSBSVE1fVkVSU0lPTiAmJiBydG0tPnJ0bV90eXBlID09IFJUTV9HRVQpCiAgICAgICAgICAgIHJ0bXNnKHJ0bSk7CiAgICAgICAgY3AgKz0gcnRtLT5ydG1fbXNnbGVuOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCnVfY2hhciAgICAgICAgICoKdmFyX2lwUm91dGVFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgLyoKICAgICAqIG9iamVjdCBpZGVudGlmaWVyIGlzIG9mIGZvcm06CiAgICAgKiAxLjMuNi4xLjIuMS40LjIxLjEuMS5BLkIuQy5ELCAgd2hlcmUgQS5CLkMuRCBpcyBJUCBhZGRyZXNzLgogICAgICogSVBBRERSIHN0YXJ0cyBhdCBvZmZzZXQgMTAuCiAgICAgKi8KICAgIGludCAgICAgICAgICAgICBTYXZlX1ZhbGlkLCByZXN1bHQ7CiAgICB1X2NoYXIgICAgICAgICAqY3A7CiAgICBvaWQgICAgICAgICAgICAqb3A7CiAgICBzdHJ1Y3Qgc25tcHJ0ICAqcnQ7CiAgICBzdGF0aWMgc3RydWN0IHNubXBydCAqc2F2ZXJ0OwogICAgc3RhdGljIGludCAgICAgIHNhdmVOYW1lTGVuLCBzYXZlRXhhY3Q7CiAgICBzdGF0aWMgb2lkICAgICAgc2F2ZU5hbWVbMTRdLCBDdXJyZW50WzE0XTsKICAgIHN0YXRpYyBpbl9hZGRyX3QgYWRkcl9yZXQ7CiAgICAKICAgICp3cml0ZV9tZXRob2QgPSBOVUxMOyAgLyogd3JpdGVfcnRlOyAgWFhYOiAgU0VUIHN1cHBvcnQgbm90IHJlYWxseSBpbXBsZW1lbnRlZCAqLwoKI2lmIDAKICAgIC8qCiAgICAgKiAgICAgIE9QVElNSVpBVElPTjoKICAgICAqCiAgICAgKiAgICAgIElmIHRoZSBuYW1lIHdhcyB0aGUgc2FtZSBhcyB0aGUgbGFzdCBuYW1lLCB3aXRoIHRoZSBwb3NzaWJsZQogICAgICogICAgICBleGNlcHRpb24gb2YgdGhlIFs5XXRoIHRva2VuLCB0aGVuIGRvbid0IHJlYWQgdGhlIHJvdXRpbmcgdGFibGUKICAgICAqCiAgICAgKi8KCiAgICBpZiAoKHNhdmVOYW1lTGVuID09ICpsZW5ndGgpICYmIChzYXZlRXhhY3QgPT0gZXhhY3QpKSB7CiAgICAgICAgaW50ICAgICAgICAgICAgIHRlbXAgPSBuYW1lWzldOwogICAgICAgIG5hbWVbOV0gPSAwOwogICAgICAgIFNhdmVfVmFsaWQgPQogICAgICAgICAgICAhc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBzYXZlTmFtZSwgc2F2ZU5hbWVMZW4pOwogICAgICAgIG5hbWVbOV0gPSB0ZW1wOwogICAgfSBlbHNlIHsKICAgICAgICBTYXZlX1ZhbGlkID0gMDsKICAgIH0KI2Vsc2UKICAgIFNhdmVfVmFsaWQgPSAwOwojZW5kaWYKCiAgICBpZiAoU2F2ZV9WYWxpZCkgewogICAgICAgIGludCAgICAgICAgICAgICB0ZW1wID0gbmFtZVs5XTsKICAgICAgICBtZW1jcHkobmFtZSwgQ3VycmVudCwgMTQgKiBzaXplb2Yob2lkKSk7CiAgICAgICAgbmFtZVs5XSA9IHRlbXA7CiAgICAgICAgKmxlbmd0aCA9IDE0OwogICAgICAgIHJ0ID0gc2F2ZXJ0OwogICAgfSBlbHNlIHsKICAgICAgICAvKgogICAgICAgICAqIGZpbGwgaW4gb2JqZWN0IHBhcnQgb2YgbmFtZSBmb3IgY3VycmVudAogICAgICAgICAqIChsZXNzIHNpemVvZiBpbnN0YW5jZSBwYXJ0KSAKICAgICAgICAgKi8KCiAgICAgICAgbWVtY3B5KEN1cnJlbnQsIHZwLT5uYW1lLCBTTk1QX01JTihzaXplb2YoQ3VycmVudCksIChpbnQpKHZwLT5uYW1lbGVuKSAqIHNpemVvZihvaWQpKSk7CgogICAgICAgIHN1Y2tfa3J0KDApOwoKICAgICAgICBmb3IgKHJ0ID0gcnRoZWFkLnRxaF9maXJzdDsgcnQ7IHJ0ID0gcnQtPmxpbmsudHFlX25leHQpIHsKICAgICAgICAgICAgb3AgPSBDdXJyZW50ICsgMTA7CiAgICAgICAgICAgIGNwID0gKHVfY2hhciAqKSAmIHJ0LT5kZXN0OwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICByZXN1bHQgPSBzbm1wX29pZF9jb21wYXJlKG5hbWUsICpsZW5ndGgsIEN1cnJlbnQsIDE0KTsKICAgICAgICAgICAgaWYgKChleGFjdCAmJiAocmVzdWx0ID09IDApKQogICAgICAgICAgICAgICAgfHwgKCFleGFjdCAmJiAocmVzdWx0IDwgMCkpKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChydCA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAgICAgLyoKICAgICAgICAgKiAgU2F2ZSBpbiB0aGUgJ2NhY2hlJwogICAgICAgICAqLwogICAgICAgIG1lbWNweShzYXZlTmFtZSwgbmFtZSwgU05NUF9NSU4oc2l6ZW9mKHNhdmVOYW1lKSwgKmxlbmd0aCAqIHNpemVvZihvaWQpKSk7CiAgICAgICAgc2F2ZU5hbWVbOV0gPSAwOwogICAgICAgIHNhdmVOYW1lTGVuID0gKmxlbmd0aDsKICAgICAgICBzYXZlRXhhY3QgPSBleGFjdDsKICAgICAgICBzYXZlcnQgPSBydDsKCiAgICAgICAgLyoKICAgICAgICAgKiAgUmV0dXJuIHRoZSBuYW1lCiAgICAgICAgICovCiAgICAgICAgbWVtY3B5KG5hbWUsIEN1cnJlbnQsIDE0ICogc2l6ZW9mKG9pZCkpOwogICAgICAgICpsZW5ndGggPSAxNDsKICAgIH0KCiAgICAqdmFyX2xlbiA9IHNpemVvZihsb25nX3JldHVybik7CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgSVBST1VURURFU1Q6CiAgICAgICAgYWRkcl9yZXQgPSBydC0+ZGVzdC5zX2FkZHI7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CgogICAgY2FzZSBJUFJPVVRFSUZJTkRFWDoKICAgICAgICBsb25nX3JldHVybiA9IHJ0LT5pbmRleDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwoKICAgIGNhc2UgSVBST1VURU1FVFJJQzE6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAocnQtPmhkci0+cnRtX2ZsYWdzICYgUlRGX0dBVEVXQVkpID8gMSA6IDA7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzI6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBydC0+aGRyLT5ydG1fcm14LnJteF9ydHQ7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBydC0+aGRyLT5ydG1fcm14LnJteF9ydHR2YXI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzQ6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBydC0+aGRyLT5ydG1fcm14LnJteF9zc3RocmVzaDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDNToKICAgICAgICBsb25nX3JldHVybiA9IHJ0LT5oZHItPnJ0bV9ybXgucm14X210dTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwoKICAgIGNhc2UgSVBST1VURU5FWFRIT1A6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwogICAgICAgIGlmIChydC0+Z2F0ZXdheS5zX2FkZHIgPT0gMCAmJiBydC0+aWZhLnNfYWRkciA9PSAwKQogICAgICAgICAgICBhZGRyX3JldCA9IDA7CiAgICAgICAgZWxzZSBpZiAocnQtPmdhdGV3YXkuc19hZGRyID09IDApCiAgICAgICAgICAgIGFkZHJfcmV0ID0gcnQtPmlmYS5zX2FkZHI7CiAgICAgICAgZWxzZQogICAgICAgICAgICBhZGRyX3JldCA9IHJ0LT5nYXRld2F5LnNfYWRkcjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGFkZHJfcmV0OwoKICAgIGNhc2UgSVBST1VURVRZUEU6CiAgICAgICAgaWYgKHJ0LT5oZHItPnJ0bV9mbGFncyAmIFJURl9VUCkgewogICAgICAgICAgICBpZiAocnQtPmhkci0+cnRtX2ZsYWdzICYgUlRGX0dBVEVXQVkpIHsKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gNDsgICAgICAgIC8qICBpbmRpcmVjdCg0KSAgKi8KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMzsgICAgICAgIC8qICBkaXJlY3QoMykgICovCiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsb25nX3JldHVybiA9IDI7ICAgIC8qICBpbnZhbGlkKDIpICAqLwogICAgICAgIH0KICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwoKICAgIGNhc2UgSVBST1VURVBST1RPOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHJ0LT5oZHItPnJ0bV9mbGFncyAmIFJURl9EWU5BTUlDKSA/IDQgOiAyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CgogICAgY2FzZSBJUFJPVVRFQUdFOgojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CgogICAgY2FzZSBJUFJPVVRFTUFTSzoKICAgICAgICBhZGRyX3JldCA9IHJ0LT5uZXRtYXNrLnNfYWRkcjsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKCiAgICBjYXNlIElQUk9VVEVJTkZPOgogICAgICAgICp2YXJfbGVuID0gbnVsbE9pZExlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBudWxsT2lkOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2lwUm91dGVFbnRyeVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9Cgp2b2lkCmluaXRfdmFyX3JvdXRlKHZvaWQpCnsKICAgIDsKfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0NBTl9VU0VfU1lTQ1RMICovCgojaWYgZGVmaW5lZChIQVZFX1NZU19TWVNDVExfSCkgJiYgIWRlZmluZWQobGludXgpCi8qCiAqIGdldF9hZGRyZXNzKCkKICogCiAqIFRyYXZlcnNlIHRoZSBhZGRyZXNzIHN0cnVjdHVyZXMgYWZ0ZXIgYSByb3V0aW5nIHNvY2tldCBtZXNzYWdlIGFuZAogKiBleHRyYWN0IGEgc3BlY2lmaWMgb25lLgogKiAKICogU29tZSBvZiB0aGlzIGlzIHBlY3VsaWFyIHRvIElSSVggNi4yLCB3aGljaCBkb2Vzbid0IGhhdmUgc2FfbGVuIGluCiAqIHRoZSBzb2NrYWRkciBzdHJ1Y3R1cmUgeWV0LiAgV2l0aCBzYV9sZW4sIHNraXBwaW5nIGFuIGFkZHJlc3MgZW50cnkKICogd291bGQgYmUgbXVjaCBlYXNpZXIuCiAqLwojaW5jbHVkZSA8c3lzL3VuLmg+CgovKgogKiByZXR1cm5zIHRoZSBsZW5ndGggb2YgYSBzb2NrZXQgc3RydWN0dXJlIAogKi8KCnNpemVfdApzbm1wX3NvY2tldF9sZW5ndGgoaW50IGZhbWlseSkKewogICAgc2l6ZV90ICAgICAgICAgIGxlbmd0aDsKCiAgICBzd2l0Y2ggKGZhbWlseSkgewojaWZuZGVmIGN5Z3dpbgojaWYgIWRlZmluZWQgKFdJTjMyKSAmJiAhZGVmaW5lZCAoY3lnd2luKQojaWZkZWYgQUZfVU5JWAogICAgY2FzZSBBRl9VTklYOgogICAgICAgIGxlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pOwogICAgICAgIGJyZWFrOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFGX1VOSVggKi8KI2VuZGlmCiNlbmRpZgoKI2lmbmRlZiBhaXgzCiNpZmRlZiBBRl9MSU5LCiAgICBjYXNlIEFGX0xJTks6CiNpZmRlZiBfTUFYX1NBX0xFTgogICAgICAgIGxlbmd0aCA9IF9NQVhfU0FfTEVOOwojZWxpZiBTT0NLX01BWEFERFJMRU4KICAgICAgICBsZW5ndGggPSBTT0NLX01BWEFERFJMRU47CiNlbHNlCiAgICAgICAgbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9kbCk7CiNlbmRpZgogICAgICAgIGJyZWFrOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFGX0xJTksgKi8KI2VuZGlmCgogICAgY2FzZSBBRl9JTkVUOgogICAgICAgIGxlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBsZW5ndGggPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyKTsKICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4gbGVuZ3RoOwp9Cgpjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKgpnZXRfYWRkcmVzcyhjb25zdCB2b2lkICpfYXAsIGludCBhZGRyZXNzZXMsIGludCB3YW50ZWQpCnsKICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYXAgPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopIF9hcDsKICAgIGludCAgICAgICAgICAgICBpaW5kZXg7CiAgICBpbnQgICAgICAgICAgICAgYml0bWFzazsKCiAgICBmb3IgKGlpbmRleCA9IDAsIGJpdG1hc2sgPSAxOwogICAgICAgICBpaW5kZXggPCBSVEFYX01BWDsgKytpaW5kZXgsIGJpdG1hc2sgPDw9IDEpIHsKICAgICAgICBpZiAoYml0bWFzayA9PSB3YW50ZWQpIHsKICAgICAgICAgICAgaWYgKGJpdG1hc2sgJiBhZGRyZXNzZXMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChiaXRtYXNrICYgYWRkcmVzc2VzKSB7CiAgICAgICAgICAgIHVuc2lnbmVkICAgICAgICBsZW5ndGggPQogICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBzbm1wX3NvY2tldF9sZW5ndGgoYXAtPnNhX2ZhbWlseSk7CiAgICAgICAgICAgIHdoaWxlIChsZW5ndGggJSBzaXplb2YobG9uZykgIT0gMCkKICAgICAgICAgICAgICAgICsrbGVuZ3RoOwogICAgICAgICAgICBhcCA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikgKChjb25zdCBjaGFyICopIGFwICsgbGVuZ3RoKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoKICogZ2V0X2luX2FkZHJlc3MoKQogKiAKICogQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHRoZSBzcGVjaWFsIGNhc2Ugb2YgZ2V0X2FkZHJlc3Mgd2hlcmUgYW4KICogQUZfSU5FVCBhZGRyZXNzIGlzIGRlc2lyZWQsIGFuZCB3ZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGluX2FkZHIKICogcGFydC4KICovCmNvbnN0IHN0cnVjdCBpbl9hZGRyICoKZ2V0X2luX2FkZHJlc3MoY29uc3Qgdm9pZCAqYXAsIGludCBhZGRyZXNzZXMsIGludCB3YW50ZWQpCnsKICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqYTsKCiAgICBhID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBnZXRfYWRkcmVzcyhhcCwgYWRkcmVzc2VzLCB3YW50ZWQpOwogICAgaWYgKGEgPT0gTlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpZiAoYS0+c2luX2ZhbWlseSAhPSBBRl9JTkVUKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwKICAgICAgICAgICAgICAgICAgICAidW5rbm93biBzb2NrZXQgZmFtaWx5ICVkIFtBRl9JTkVUIGV4cGVjdGVkXSBpbiB2YXJfaXBSb3V0ZUVudHJ5LlxuIiwKICAgICAgICAgICAgICAgICAgICBhLT5zaW5fZmFtaWx5KSk7CiAgICB9CiAgICByZXR1cm4gJmEtPnNpbl9hZGRyOwp9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSEFWRV9TWVNfU1lTQ1RMX0ggKi8K