LyoKICogJFJDU0lkOiB4Yy9saWIvZm9udGNvbmZpZy9zcmMvZmNhdG9taWMuYyx2IDEuMiAyMDAyLzAzLzA0IDIxOjE1OjI4IHRzaSBFeHAgJAogKgogKiBDb3B5cmlnaHQgqSAyMDAyIEtlaXRoIFBhY2thcmQKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCi8qCiAqIGZjYXRvbWljLmMKICoKICogTG9jayBjYWNoZSBhbmQgY29uZmlndXJhdGlvbiBmaWxlcyBmb3IgYXRvbWljIHVwZGF0ZQogKgogKiBVc2VzIG9ubHkgcmVndWxhciBmaWxlc3lzdGVtIGNhbGxzIHNvIGl0IHNob3VsZAogKiB3b3JrIGV2ZW4gaW4gdGhlIGFic2Vuc2Ugb2YgZnVuY3Rpb25pbmcgZmlsZSBsb2NraW5nCiAqCiAqIE9uIFVuaXgsIGZvdXIgZmlsZXMgYXJlIHVzZWQ6CiAqCWZpbGUJICAgIC0gdGhlIGRhdGEgZmlsZSBhY2Nlc3NlZCBieSBvdGhlciBhcHBzLgogKgluZXcJICAgIC0gYSBuZXcgdmVyc2lvbiBvZiB0aGUgZGF0YSBmaWxlIHdoaWxlIGl0J3MgYmVpbmcgd3JpdHRlbgogKglsY2sJICAgIC0gdGhlIGxvY2sgZmlsZQogKgl0bXAJICAgIC0gYSB0ZW1wb3JhcnkgZmlsZSBtYWRlIHVuaXF1ZSB3aXRoIG1rc3RlbXAKICoKICogIEhlcmUncyBob3cgaXQgd29ya3M6CiAqCUNyZWF0ZSAndG1wJyBhbmQgc3RvcmUgb3VyIFBJRCBpbiBpdAogKglBdHRlbXB0IHRvIGxpbmsgaXQgdG8gJ2xjaycKICoJVW5saW5rICd0bXAnCiAqCUlmIHRoZSBsaW5rIHN1Y2NlZWRlZCwgdGhlIGxvY2sgaXMgaGVsZAogKgogKiBPbiBXaW5kb3dzLCB3aGVyZSB0aGVyZSBhcmUgbm8gbGlua3MsIG5vIHRtcCBmaWxlIGlzIHVzZWQsIGFuZCBsY2sKICogaXMgYSBkaXJlY3RvcnkgdGhhdCdzIG1rZGlyJ2VkLiBJZiB0aGUgbWtkaXIgc3VjY2VlZHMsIHRoZSBsb2NrIGlzCiAqIGhlbGQuCiAqLwoKI2luY2x1ZGUgImZjaW50LmgiCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHRpbWUuaD4KCiNpZmRlZiBfV0lOMzIKI2RlZmluZSBta2RpcihwYXRoLG1vZGUpIF9ta2RpcihwYXRoKQojZW5kaWYKCiNkZWZpbmUgTkVXX05BTUUJIi5ORVciCiNkZWZpbmUgTENLX05BTUUJIi5MQ0siCiNkZWZpbmUgVE1QX05BTUUJIi5UTVAtWFhYWFhYIgoKRmNBdG9taWMgKgpGY0F0b21pY0NyZWF0ZSAoY29uc3QgRmNDaGFyOCAgICpmaWxlKQp7CiAgICBpbnQJICAgIGZpbGVfbGVuID0gc3RybGVuICgoY2hhciAqKSBmaWxlKTsKICAgIGludAkgICAgbmV3X2xlbiA9IGZpbGVfbGVuICsgc2l6ZW9mIChORVdfTkFNRSk7CiAgICBpbnQJICAgIGxja19sZW4gPSBmaWxlX2xlbiArIHNpemVvZiAoTENLX05BTUUpOwogICAgaW50CSAgICB0bXBfbGVuID0gZmlsZV9sZW4gKyBzaXplb2YgKFRNUF9OQU1FKTsKICAgIGludAkgICAgdG90YWxfbGVuID0gKHNpemVvZiAoRmNBdG9taWMpICsKCQkJIGZpbGVfbGVuICsgMSArCgkJCSBuZXdfbGVuICsgMSArCgkJCSBsY2tfbGVuICsgMSArCgkJCSB0bXBfbGVuICsgMSk7CiAgICBGY0F0b21pYwkqYXRvbWljID0gbWFsbG9jICh0b3RhbF9sZW4pOwogICAgaWYgKCFhdG9taWMpCglyZXR1cm4gMDsKICAgIEZjTWVtQWxsb2MgKEZDX01FTV9BVE9NSUMsIHRvdGFsX2xlbik7CiAgICAKICAgIGF0b21pYy0+ZmlsZSA9IChGY0NoYXI4ICopIChhdG9taWMgKyAxKTsKICAgIHN0cmNweSAoKGNoYXIgKikgYXRvbWljLT5maWxlLCAoY2hhciAqKSBmaWxlKTsKCiAgICBhdG9taWMtPm5ldyA9IGF0b21pYy0+ZmlsZSArIGZpbGVfbGVuICsgMTsKICAgIHN0cmNweSAoKGNoYXIgKikgYXRvbWljLT5uZXcsIChjaGFyICopIGZpbGUpOwogICAgc3RyY2F0ICgoY2hhciAqKSBhdG9taWMtPm5ldywgTkVXX05BTUUpOwoKICAgIGF0b21pYy0+bGNrID0gYXRvbWljLT5uZXcgKyBuZXdfbGVuICsgMTsKICAgIHN0cmNweSAoKGNoYXIgKikgYXRvbWljLT5sY2ssIChjaGFyICopIGZpbGUpOwogICAgc3RyY2F0ICgoY2hhciAqKSBhdG9taWMtPmxjaywgTENLX05BTUUpOwoKICAgIGF0b21pYy0+dG1wID0gYXRvbWljLT5sY2sgKyBsY2tfbGVuICsgMTsKCiAgICByZXR1cm4gYXRvbWljOwp9CgpGY0Jvb2wKRmNBdG9taWNMb2NrIChGY0F0b21pYyAqYXRvbWljKQp7CiAgICBpbnQJCWZkID0gLTE7CiAgICBGSUxFCSpmID0gMDsKICAgIGludAkJcmV0OwogICAgc3RydWN0IHN0YXQJbGNrX3N0YXQ7CgojaWZkZWYgSEFWRV9MSU5LCiAgICBzdHJjcHkgKChjaGFyICopIGF0b21pYy0+dG1wLCAoY2hhciAqKSBhdG9taWMtPmZpbGUpOwogICAgc3RyY2F0ICgoY2hhciAqKSBhdG9taWMtPnRtcCwgVE1QX05BTUUpOwogICAgZmQgPSBta3N0ZW1wICgoY2hhciAqKSBhdG9taWMtPnRtcCk7CiAgICBpZiAoZmQgPCAwKQoJcmV0dXJuIEZjRmFsc2U7CiAgICBmID0gZmRvcGVuIChmZCwgInciKTsKICAgIGlmICghZikKICAgIHsKICAgIAljbG9zZSAoZmQpOwoJdW5saW5rICgoY2hhciAqKSBhdG9taWMtPnRtcCk7CglyZXR1cm4gRmNGYWxzZTsKICAgIH0KICAgIHJldCA9IGZwcmludGYgKGYsICIlbGRcbiIsIChsb25nKWdldHBpZCgpKTsKICAgIGlmIChyZXQgPD0gMCkKICAgIHsKCWZjbG9zZSAoZik7Cgl1bmxpbmsgKChjaGFyICopIGF0b21pYy0+dG1wKTsKCXJldHVybiBGY0ZhbHNlOwogICAgfQogICAgaWYgKGZjbG9zZSAoZikgPT0gRU9GKQogICAgewoJdW5saW5rICgoY2hhciAqKSBhdG9taWMtPnRtcCk7CglyZXR1cm4gRmNGYWxzZTsKICAgIH0KICAgIHJldCA9IGxpbmsgKChjaGFyICopIGF0b21pYy0+dG1wLCAoY2hhciAqKSBhdG9taWMtPmxjayk7CiAgICAodm9pZCkgdW5saW5rICgoY2hhciAqKSBhdG9taWMtPnRtcCk7CiNlbHNlCiAgICByZXQgPSBta2RpciAoKGNoYXIgKikgYXRvbWljLT5sY2ssIDA2MDApOwojZW5kaWYKICAgIGlmIChyZXQgPCAwKQogICAgewoJLyoKCSAqIElmIHRoZSBmaWxlIGlzIGFyb3VuZCBhbmQgb2xkICg+IDEwIG1pbnV0ZXMpLAoJICogYXNzdW1lIHRoZSBsb2NrIGlzIHN0YWxlLiAgVGhpcyBhc3N1bWVzIHRoYXQgYW55CgkgKiBtYWNoaW5lcyBzaGFyaW5nIHRoZSBzYW1lIGZpbGVzeXN0ZW0gd2lsbCBoYXZlIGNsb2NrcwoJICogcmVhc29uYWJseSBjbG9zZSB0byBlYWNoIG90aGVyLgoJICovCglpZiAoc3RhdCAoKGNoYXIgKikgYXRvbWljLT5sY2ssICZsY2tfc3RhdCkgPj0gMCkKCXsKCSAgICB0aW1lX3QgIG5vdyA9IHRpbWUgKDApOwoJICAgIGlmICgobG9uZyBpbnQpIChub3cgLSBsY2tfc3RhdC5zdF9tdGltZSkgPiAxMCAqIDYwKQoJICAgIHsKI2lmZGVmIEhBVkVfTElOSwoJCWlmICh1bmxpbmsgKChjaGFyICopIGF0b21pYy0+bGNrKSA9PSAwKQoJCSAgICByZXR1cm4gRmNBdG9taWNMb2NrIChhdG9taWMpOwojZWxzZQoJCWlmIChybWRpciAoKGNoYXIgKikgYXRvbWljLT5sY2spID09IDApCgkJICAgIHJldHVybiBGY0F0b21pY0xvY2sgKGF0b21pYyk7CiNlbmRpZgoJICAgIH0KCX0KCXJldHVybiBGY0ZhbHNlOwogICAgfQogICAgKHZvaWQpIHVubGluayAoKGNoYXIgKikgYXRvbWljLT5uZXcpOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKRmNDaGFyOCAqCkZjQXRvbWljTmV3RmlsZSAoRmNBdG9taWMgKmF0b21pYykKewogICAgcmV0dXJuIGF0b21pYy0+bmV3Owp9CgpGY0NoYXI4ICoKRmNBdG9taWNPcmlnRmlsZSAoRmNBdG9taWMgKmF0b21pYykKewogICAgcmV0dXJuIGF0b21pYy0+ZmlsZTsKfQoKRmNCb29sCkZjQXRvbWljUmVwbGFjZU9yaWcgKEZjQXRvbWljICphdG9taWMpCnsKICAgIGlmIChyZW5hbWUgKChjaGFyICopIGF0b21pYy0+bmV3LCAoY2hhciAqKSBhdG9taWMtPmZpbGUpIDwgMCkKCXJldHVybiBGY0ZhbHNlOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKdm9pZApGY0F0b21pY0RlbGV0ZU5ldyAoRmNBdG9taWMgKmF0b21pYykKewogICAgdW5saW5rICgoY2hhciAqKSBhdG9taWMtPm5ldyk7Cn0KCnZvaWQKRmNBdG9taWNVbmxvY2sgKEZjQXRvbWljICphdG9taWMpCnsKI2lmZGVmIEhBVkVfTElOSwogICAgdW5saW5rICgoY2hhciAqKSBhdG9taWMtPmxjayk7CiNlbHNlCiAgICBybWRpciAoKGNoYXIgKikgYXRvbWljLT5sY2spOwojZW5kaWYKfQoKdm9pZApGY0F0b21pY0Rlc3Ryb3kgKEZjQXRvbWljICphdG9taWMpCnsKICAgIEZjTWVtRnJlZSAoRkNfTUVNX0FUT01JQywgc2l6ZW9mIChGY0F0b21pYykgKwoJICAgICAgIHN0cmxlbiAoKGNoYXIgKikgYXRvbWljLT5maWxlKSAqIDQgKyAxICsKCSAgICAgICBzaXplb2YgKE5FV19OQU1FKSArIHNpemVvZiAoTENLX05BTUUpICsgCgkgICAgICAgc2l6ZW9mIChUTVBfTkFNRSkpOwoKICAgIGZyZWUgKGF0b21pYyk7Cn0K