Lyogdm1zLWhkci5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVk1TL1ZBWCAob3BlblZNUy9WQVgpIGFuZAogICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUKICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgogICBIRFIgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwogICBFTUggcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwogICBhbmQKICAgRU9NIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKICAgRUVPTSByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCgogICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCgpUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQppdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQp0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgooYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwoKI2luY2x1ZGUgImJmZC5oIgojaW5jbHVkZSAiYmZkdmVyLmgiCiNpbmNsdWRlICJzeXNkZXAuaCIKI2luY2x1ZGUgImJmZGxpbmsuaCIKI2luY2x1ZGUgInNhZmUtY3R5cGUuaCIKI2luY2x1ZGUgImxpYmJmZC5oIgoKI2luY2x1ZGUgInZtcy5oIgoKI2lmZGVmIEhBVkVfQUxMT0NBX0gKI2luY2x1ZGUgPGFsbG9jYS5oPgojZW5kaWYKCnN0YXRpYyB1bnNpZ25lZCBjaGFyICpnZXRfdm1zX3RpbWVfc3RyaW5nIFBBUkFNUyAoKHZvaWQpKTsKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBSZWFkICYgcHJvY2VzcyBlbWggcmVjb3JkCiAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLwoKaW50Cl9iZmRfdm1zX3NsdXJwX2hkciAoYWJmZCwgb2JqdHlwZSkKICAgICBiZmQgKmFiZmQ7CiAgICAgaW50IG9ianR5cGU7CnsKICB1bnNpZ25lZCBjaGFyICpwdHI7CiAgdW5zaWduZWQgY2hhciAqdm1zX3JlYzsKICBpbnQgc3VidHlwZTsKCiAgdm1zX3JlYyA9IFBSSVYodm1zX3JlYyk7CgojaWYgVk1TX0RFQlVHCiAgdm1zX2RlYnVnKDIsICJIRFIvRU1IXG4iKTsKI2VuZGlmCgogIHN3aXRjaCAob2JqdHlwZSkKICAgIHsKICAgICAgY2FzZSBPQkpfU19DX0hEUjoKCXN1YnR5cGUgPSB2bXNfcmVjWzFdOwoJYnJlYWs7CiAgICAgIGNhc2UgRU9CSl9TX0NfRU1IOgoJc3VidHlwZSA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyA0KSArIEVWQVhfT0ZGU0VUOwoJYnJlYWs7CiAgICAgIGRlZmF1bHQ6CglzdWJ0eXBlID0gLTE7CiAgICB9CgojaWYgVk1TX0RFQlVHCiAgdm1zX2RlYnVnKDMsICJzdWJ0eXBlICVkXG4iLCBzdWJ0eXBlKTsKI2VuZGlmCgogIHN3aXRjaCAoc3VidHlwZSkKICAgIHsKCiAgICAgIGNhc2UgTUhEX1NfQ19NSEQ6CgkvKgoJICogbW9kdWxlIGhlYWRlcgoJICovCglQUklWKGhkcl9kYXRhKS5oZHJfYl9zdHJsdmwgPSB2bXNfcmVjWzJdOwoJUFJJVihoZHJfZGF0YSkuaGRyX2xfcmVjc2l6ID0gYmZkX2dldGwxNiAodm1zX3JlYyArIDMpOwoJUFJJVihoZHJfZGF0YSkuaGRyX3RfbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMgKyA1KTsKCXB0ciA9IHZtc19yZWMgKyA1ICsgdm1zX3JlY1s1XSArIDE7CglQUklWKGhkcl9kYXRhKS5oZHJfdF92ZXJzaW9uID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKCXB0ciArPSAqcHRyICsgMTsKCVBSSVYoaGRyX2RhdGEpLmhkcl90X2RhdGUgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAocHRyLCAxNyk7CgogICAgICBicmVhazsKCiAgICAgIGNhc2UgTUhEX1NfQ19MTk06CgkvKgoJICoKCSAqLwoJUFJJVihoZHJfZGF0YSkuaGRyX2NfbG5tID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC0yKSk7CiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBNSERfU19DX1NSQzoKCS8qCgkgKgoJICovCglQUklWKGhkcl9kYXRhKS5oZHJfY19zcmMgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTIpKTsKICAgICAgYnJlYWs7CgogICAgICBjYXNlIE1IRF9TX0NfVFRMOgoJLyoKCSAqCgkgKi8KCVBSSVYoaGRyX2RhdGEpLmhkcl9jX3R0bCA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtMikpOwogICAgICBicmVhazsKCiAgICAgIGNhc2UgTUhEX1NfQ19DUFI6CgkvKgoJICoKCSAqLwogICAgICBicmVhazsKCiAgICAgIGNhc2UgTUhEX1NfQ19NVEM6CgkvKgoJICoKCSAqLwogICAgICBicmVhazsKCiAgICAgIGNhc2UgTUhEX1NfQ19HVFg6CgkvKgoJICoKCSAqLwogICAgICBicmVhazsKCiAgICAgIGNhc2UgRU1IX1NfQ19NSEQgKyBFVkFYX09GRlNFVDoKCS8qCgkgKiBtb2R1bGUgaGVhZGVyCgkgKi8KCVBSSVYoaGRyX2RhdGEpLmhkcl9iX3N0cmx2bCA9IHZtc19yZWNbNl07CglQUklWKGhkcl9kYXRhKS5oZHJfbF9hcmNoMSA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyA4KTsKCVBSSVYoaGRyX2RhdGEpLmhkcl9sX2FyY2gyID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDEyKTsKCVBSSVYoaGRyX2RhdGEpLmhkcl9sX3JlY3NpeiA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxNik7CglQUklWKGhkcl9kYXRhKS5oZHJfdF9uYW1lID0KCSAgX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAodm1zX3JlYyArIDIwKTsKCXB0ciA9IHZtc19yZWMgKyAyMCArIHZtc19yZWNbMjBdICsgMTsKCVBSSVYoaGRyX2RhdGEpLmhkcl90X3ZlcnNpb24gPQoJICBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwoJcHRyICs9ICpwdHIgKyAxOwoJUFJJVihoZHJfZGF0YSkuaGRyX3RfZGF0ZSA9CgkgIF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIChwdHIsIDE3KTsKCiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBFTUhfU19DX0xOTSArIEVWQVhfT0ZGU0VUOgoJLyoKCSAqCgkgKi8KCVBSSVYoaGRyX2RhdGEpLmhkcl9jX2xubSA9CgkgIF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtNikpOwogICAgICBicmVhazsKCiAgICAgIGNhc2UgRU1IX1NfQ19TUkMgKyBFVkFYX09GRlNFVDoKCS8qCgkgKgoJICovCglQUklWKGhkcl9kYXRhKS5oZHJfY19zcmMgPQoJICBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTYpKTsKICAgICAgYnJlYWs7CgogICAgICBjYXNlIEVNSF9TX0NfVFRMICsgRVZBWF9PRkZTRVQ6CgkvKgoJICoKCSAqLwoJUFJJVihoZHJfZGF0YSkuaGRyX2NfdHRsID0KCSAgX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC02KSk7CiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBFTUhfU19DX0NQUiArIEVWQVhfT0ZGU0VUOgoJLyoKCSAqCgkgKi8KICAgICAgYnJlYWs7CgogICAgICBjYXNlIEVNSF9TX0NfTVRDICsgRVZBWF9PRkZTRVQ6CgkvKgoJICoKCSAqLwogICAgICBicmVhazsKCiAgICAgIGNhc2UgRU1IX1NfQ19HVFggKyBFVkFYX09GRlNFVDoKCS8qCgkgKgoJICovCiAgICAgIGJyZWFrOwoKICAgICAgZGVmYXVsdDoKCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwogICAgICByZXR1cm4gLTE7CgogICAgfSAvKiBzd2l0Y2ggKi8KCiAgcmV0dXJuIDA7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBPdXRwdXQgcm91dGluZXMuICAqLwoKLyogTWFudWZhY3R1cmUgYSBWTVMgbGlrZSB0aW1lIG9uIGEgdW5peCBiYXNlZCBzeXN0ZW0uCiAgIHN0b2xlbiBmcm9tIG9iai12bXMuYyAgKi8KCnN0YXRpYyB1bnNpZ25lZCBjaGFyICoKZ2V0X3Ztc190aW1lX3N0cmluZyAoKQp7CiAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdGJ1ZlsxOF07CiNpZm5kZWYgVk1TCiNpbmNsdWRlIDx0aW1lLmg+CgogIGNoYXIgKnBudDsKICB0aW1lX3QgdGltZWI7CiAgdGltZSAoJnRpbWViKTsKICBwbnQgPSBjdGltZSAoJnRpbWViKTsKICBwbnRbM10gPSAwOwogIHBudFs3XSA9IDA7CiAgcG50WzEwXSA9IDA7CiAgcG50WzE2XSA9IDA7CiAgcG50WzI0XSA9IDA7CiAgc3ByaW50ZiAoKGNoYXIgKikgdGJ1ZiwgIiUycy0lM3MtJXMgJXMiLAoJICAgcG50ICsgOCwgcG50ICsgNCwgcG50ICsgMjAsIHBudCArIDExKTsKI2Vsc2UKI2luY2x1ZGUgPHN0YXJsZXQuaD4KICBzdHJ1Y3QKICB7CiAgICBpbnQgU2l6ZTsKICAgIHVuc2lnbmVkIGNoYXIgKlB0cjsKICB9IERlc2NyaXB0b3I7CiAgRGVzY3JpcHRvci5TaXplID0gMTc7CiAgRGVzY3JpcHRvci5QdHIgPSB0YnVmOwogIFNZUyRBU0NUSU0gKDAsICZEZXNjcmlwdG9yLCAwLCAwKTsKI2VuZGlmIC8qIG5vdCBWTVMgKi8KCiNpZiBWTVNfREVCVUcKICB2bXNfZGVidWcgKDYsICJ2bXN0aW1lc3RyaW5nOiclcydcbiIsIHRidWYpOwojZW5kaWYKCiAgcmV0dXJuIHRidWY7Cn0KCi8qIHdyaXRlIG9iamVjdCBoZWFkZXIgZm9yIGJmZCBhYmZkICAqLwoKaW50Cl9iZmRfdm1zX3dyaXRlX2hkciAoYWJmZCwgb2JqdHlwZSkKICAgICBiZmQgKmFiZmQ7CiAgICAgaW50IG9ianR5cGU7CnsKICBhc3ltYm9sICpzeW1ib2w7CiAgdW5zaWduZWQgaW50IHN5bW51bTsKICBpbnQgaGFkX2Nhc2UgPSAwOwogIGludCBoYWRfZmlsZSA9IDA7CgojaWYgVk1TX0RFQlVHCiAgdm1zX2RlYnVnICgyLCAidm1zX3dyaXRlX2hkciAoJXApXG4iLCBhYmZkKTsKI2VuZGlmCgogIF9iZmRfdm1zX291dHB1dF9hbGlnbm1lbnQgKGFiZmQsIDIpOwoKICAvKiBNSEQgKi8KCiAgaWYgKG9ianR5cGUgPT0gT0JKX1NfQ19IRFIpCiAgICB7CiAgICB9CiAgZWxzZQogICAgewogICAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19NSEQpOwogICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIEVPQkpfU19DX1NUUkxWTCk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwogICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgTUFYX09VVFJFQ19TSVpFKTsKICAgIH0KCiAgaWYgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpICE9IDApCiAgICB7CiAgICAgIC8qIHN0cmlwIHBhdGggYW5kIHN1ZmZpeCBpbmZvcm1hdGlvbiAqLwoKICAgICAgY2hhciAqZm5hbWUsICpmb3V0LCAqZnB0cjsKCiAgICAgIGZwdHIgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKICAgICAgZm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoZnB0cikgKyAxKTsKICAgICAgc3RyY3B5IChmbmFtZSwgZnB0cik7CiAgICAgIGZvdXQgPSBzdHJyY2hyIChmbmFtZSwgJ10nKTsKICAgICAgaWYgKGZvdXQgPT0gMCkKCWZvdXQgPSBzdHJjaHIgKGZuYW1lLCAnOicpOwogICAgICBpZiAoZm91dCAhPSAwKQoJZm91dCsrOwogICAgICBlbHNlCglmb3V0ID0gZm5hbWU7CgogICAgICAvKiBzdHJpcCAub2JqIHN1ZmZpeCAgKi8KCiAgICAgIGZwdHIgPSBzdHJyY2hyIChmbmFtZSwgJy4nKTsKICAgICAgaWYgKChmcHRyICE9IDApCgkgICYmIChzdHJjYXNlY21wIChmcHRyLCAiLk9CSiIpID09IDApKQoJKmZwdHIgPSAwOwoKICAgICAgZnB0ciA9IGZvdXQ7CiAgICAgIHdoaWxlICgqZnB0ciAhPSAwKQoJewoJICAqZnB0ciA9IFRPVVBQRVIgKCpmcHRyKTsKCSAgZnB0cisrOwoJICBpZiAoKCpmcHRyID09ICc7JykKCSAgICAgfHwgKChmcHRyIC0gZm91dCkgPiAzMSkpCgkgICAgKmZwdHIgPSAwOwoJfQogICAgICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgZm91dCk7CiAgICB9CiAgZWxzZQogICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsICJOT05BTUUiKTsKCiAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIEJGRF9WRVJTSU9OX1NUUklORyk7CiAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsIGdldF92bXNfdGltZV9zdHJpbmcgKCksIDE3KTsKICBfYmZkX3Ztc19vdXRwdXRfZmlsbCAoYWJmZCwgMCwgMTcpOwogIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CgogIC8qIExNTiAqLwoKICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19MTk0pOwogIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSJHQVMgcHJvR0lTIiwgMTApOwogIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CgogIC8qIFNSQyAqLwoKICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19TUkMpOwoKICBmb3IgKHN5bW51bSA9IDA7IHN5bW51bSA8IGFiZmQtPnN5bWNvdW50OyBzeW1udW0rKykKICAgIHsKICAgICAgc3ltYm9sID0gYWJmZC0+b3V0c3ltYm9sc1tzeW1udW1dOwoKICAgICAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfRklMRSkKCXsKCSAgaWYgKHN0cm5jbXAgKChjaGFyICopc3ltYm9sLT5uYW1lLCAiPENBU0U6IiwgNikgPT0gMCkKCSAgICB7CgkgICAgICBQUklWKGZsYWdfaGFzaF9sb25nX25hbWVzKSA9IHN5bWJvbC0+bmFtZVs2XSAtICcwJzsKCSAgICAgIFBSSVYoZmxhZ19zaG93X2FmdGVyX3RydW5jKSA9IHN5bWJvbC0+bmFtZVs3XSAtICcwJzsKCgkgICAgICBpZiAoaGFkX2ZpbGUpCgkJYnJlYWs7CgkgICAgICBoYWRfY2FzZSA9IDE7CgkgICAgICBjb250aW51ZTsKCSAgICB9CgoJICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgc3ltYm9sLT5uYW1lLAoJCQkJKGludCkgc3RybGVuIChzeW1ib2wtPm5hbWUpKTsKCSAgaWYgKGhhZF9jYXNlKQoJICAgIGJyZWFrOwoJICBoYWRfZmlsZSA9IDE7Cgl9CiAgICB9CgogIGlmIChzeW1udW0gPT0gYWJmZC0+c3ltY291bnQpCiAgICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikibm9uYW1lIiwgNik7CgogIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CgogIC8qIFRUTCAqLwoKICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19UVEwpOwogIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSJUVEwiLCAzKTsKICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwoKICAvKiBDUFIgKi8KCiAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfQ1BSKTsKICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwKCQkJICh1bnNpZ25lZCBjaGFyICopIkdOVSBCRkQgcG9ydGVkIGJ5IEtsYXVzIEvkbXBmIDE5OTQtMTk5NiIsCgkJCSAzOSk7CiAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKCiAgcmV0dXJuIDA7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyogUHJvY2VzcyBFT00vRUVPTSByZWNvcmQKICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IgICovCgppbnQKX2JmZF92bXNfc2x1cnBfZW9tIChhYmZkLCBvYmp0eXBlKQogICAgIGJmZCAqYWJmZDsKICAgICBpbnQgb2JqdHlwZTsKewogIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7CgojaWYgVk1TX0RFQlVHCiAgdm1zX2RlYnVnKDIsICJFT00vRUVPTVxuIik7CiNlbmRpZgoKICB2bXNfcmVjID0gUFJJVih2bXNfcmVjKTsKCiAgaWYgKChvYmp0eXBlID09IE9CSl9TX0NfRU9NKQogICAgIHx8IChvYmp0eXBlID09IE9CSl9TX0NfRU9NVykpCiAgICB7CiAgICB9CiAgZWxzZQogICAgewogICAgICBQUklWKGVvbV9kYXRhKS5lb21fbF90b3RhbF9scHMgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgNCk7CiAgICAgIFBSSVYoZW9tX2RhdGEpLmVvbV9iX2NvbWNvZCA9ICoodm1zX3JlYyArIDgpOwogICAgICBpZiAoUFJJVihlb21fZGF0YSkuZW9tX2JfY29tY29kID4gMSkKCXsKCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJPYmplY3QgbW9kdWxlIE5PVCBlcnJvci1mcmVlICFcbiIpKTsKCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CgkgIHJldHVybiAtMTsKCX0KICAgICAgUFJJVihlb21fZGF0YSkuZW9tX2hhc190cmFuc2ZlciA9IEZBTFNFOwogICAgICBpZiAoUFJJVihyZWNfc2l6ZSkgPiAxMCkKCXsKCSAgIFBSSVYoZW9tX2RhdGEpLmVvbV9oYXNfdHJhbnNmZXIgPSBUUlVFOwoJICAgUFJJVihlb21fZGF0YSkuZW9tX2JfdGZyZmxnID0gKih2bXNfcmVjICsgOSk7CgkgICBQUklWKGVvbV9kYXRhKS5lb21fbF9wc2luZHggPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTIpOwoJICAgUFJJVihlb21fZGF0YSkuZW9tX2xfdGZyYWRyID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDE2KTsKCgkgICBhYmZkLT5zdGFydF9hZGRyZXNzID0gUFJJVihlb21fZGF0YSkuZW9tX2xfdGZyYWRyOwoJfQogICAgfQogIHJldHVybiAwOwp9CgovKiBXcml0ZSBlb20gcmVjb3JkIGZvciBiZmQgYWJmZCAgKi8KCmludApfYmZkX3Ztc193cml0ZV9lb20gKGFiZmQsIG9ianR5cGUpCiAgICAgYmZkICphYmZkOwogICAgIGludCBvYmp0eXBlOwp7CiNpZiBWTVNfREVCVUcKICB2bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfZW9tICglcCwgJWQpXG4iLCBhYmZkLCBvYmp0eXBlKTsKI2VuZGlmCgogIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgb2JqdHlwZSwgLTEpOwogIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAodW5zaWduZWQgbG9uZykgKFBSSVYodm1zX2xpbmthZ2VfaW5kZXgpID4+IDEpKTsKICBfYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgMCk7CS8qIGNvbXBsZXRpb24gY29kZSAqLwogIF9iZmRfdm1zX291dHB1dF9ieXRlIChhYmZkLCAwKTsJLyogZmlsbCBieXRlICovCgogIGlmIChiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpICE9IChiZmRfdm1hKS0xKQogICAgewogICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKCiAgICAgIHNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5saW5rIik7CiAgICAgIGlmIChzZWN0aW9uID09IDApCgl7CgkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwoJICByZXR1cm4gLTE7Cgl9CiAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgMCk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAodW5zaWduZWQgbG9uZykgKHNlY3Rpb24tPmluZGV4KSk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLAoJCQkgICAgICh1bnNpZ25lZCBsb25nKSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwogICAgfQoKICBfYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKTsKICByZXR1cm4gMDsKfQo=