LyogbG9nZ2luZy5jIC0gZ2VuZXJpYyBsb2dnaW5nIGZvciBzbm1wLWFnZW50CiAqIENvbnRyaWJ1dGVkIGJ5IFJhZ25hciBLavhyc3RhZCwgdWNkQHJhZ25hcmsudmVzdGRhdGEubm8gMTk5OS0wNi0yNiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSA8c3RkaW8uaD4KI2lmIEhBVkVfTUFMTE9DX0gKI2luY2x1ZGUgPG1hbGxvYy5oPgojZW5kaWYKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2lmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaWYgSEFWRV9TWVNMT0dfSAojaW5jbHVkZSA8c3lzbG9nLmg+CiNlbmRpZgoKI2lmZGVmIFNURENfSEVBREVSUwojaW5jbHVkZSA8c3RkYXJnLmg+CiNlbHNlCiNpbmNsdWRlIDx2YXJhcmdzLmg+CiNlbmRpZgoKI2luY2x1ZGUgInNubXBfbG9nZ2luZy5oIgojZGVmaW5lIExPR0xFTkdUSCAxMDI0CgppbnQgZG9fc3lzbG9nZ2luZz0wOwppbnQgZG9fZmlsZWxvZ2dpbmc9MDsKaW50IGRvX3N0ZGVycmxvZ2dpbmc9MDsKRklMRSAqbG9nZmlsZTsKCgp2b2lkCmRpc2FibGVfc3lzbG9nKHZvaWQpIHsKI2lmIEhBVkVfU1lTTE9HX0gKICBpZiAoZG9fc3lzbG9nZ2luZykKICAgIGNsb3NlbG9nKCk7CiNlbmRpZgogIGRvX3N5c2xvZ2dpbmc9MDsKfQoKCnZvaWQKZGlzYWJsZV9maWxlbG9nKHZvaWQpIHsKICBpZiAoZG9fZmlsZWxvZ2dpbmcpCiAgICBmY2xvc2UobG9nZmlsZSk7CiAgZG9fZmlsZWxvZ2dpbmc9MDsKfQoKCnZvaWQKZGlzYWJsZV9zdGRlcnJsb2codm9pZCkgewogIGRvX3N0ZGVycmxvZ2dpbmc9MDsKfQoKCnZvaWQKZGlzYWJsZV9sb2codm9pZCkgewogIGRpc2FibGVfc3lzbG9nKCk7CiAgZGlzYWJsZV9maWxlbG9nKCk7CiAgZGlzYWJsZV9zdGRlcnJsb2coKTsKfQoKCnZvaWQgCmVuYWJsZV9zeXNsb2codm9pZCkgCnsKICBkaXNhYmxlX3N5c2xvZygpOwojaWYgSEFWRV9TWVNMT0dfSAogIG9wZW5sb2coInVjZC1zbm1wIiwgTE9HX0NPTlN8TE9HX1BJRCwgTE9HX0RBRU1PTik7CiAgZG9fc3lzbG9nZ2luZz0xOwojZW5kaWYKfQoKCnZvaWQKZW5hYmxlX2ZpbGVsb2coY29uc3QgY2hhciAqbG9nZmlsZW5hbWUsIGludCBkb250X3plcm9fbG9nKSAKewogIGRpc2FibGVfZmlsZWxvZygpOwogIGxvZ2ZpbGU9Zm9wZW4obG9nZmlsZW5hbWUsIGRvbnRfemVyb19sb2cgPyAiYSIgOiAidyIpOwogIGlmIChsb2dmaWxlKQogICAgZG9fZmlsZWxvZ2dpbmc9MTsKICBlbHNlCiAgICBkb19maWxlbG9nZ2luZz0wOwp9CgoKdm9pZAplbmFibGVfc3RkZXJybG9nKHZvaWQpIHsKICBkb19zdGRlcnJsb2dnaW5nPTE7Cn0KCgp2b2lkCmxvZ19zeXNsb2cgKGludCBwcmlvcml0eSwgY29uc3QgY2hhciAqc3RyaW5nKQp7CiNpZiBIQVZFX1NZU0xPR19ICiAgaWYgKGRvX3N5c2xvZ2dpbmcpIHsKICAgIHN5c2xvZyhwcmlvcml0eSwgc3RyaW5nKTsKICB9CiNlbmRpZgp9CgoKdm9pZApsb2dfZmlsZWxvZyAoaW50IHByaW9yaXR5LCBjb25zdCBjaGFyICpzdHJpbmcpCnsKICBpZiAoZG9fZmlsZWxvZ2dpbmcpIHsKICAgIGZwdXRzKHN0cmluZywgbG9nZmlsZSk7CiAgICBmZmx1c2gobG9nZmlsZSk7CiAgfQp9CgoKdm9pZApsb2dfc3RkZXJybG9nIChpbnQgcHJpb3JpdHksIGNvbnN0IGNoYXIgKnN0cmluZykKewogIGlmIChkb19zdGRlcnJsb2dnaW5nKSB7CiAgICBmcHV0cyhzdHJpbmcsIHN0ZGVycik7CiAgICBmZmx1c2goc3RkZXJyKTsKICB9Cn0KCnZvaWQgCmxvZ19zdHJpbmcgKGludCBwcmlvcml0eSwgY29uc3QgY2hhciAqc3RyaW5nKQp7CiAgbG9nX3N5c2xvZyhwcmlvcml0eSwgc3RyaW5nKTsKICBsb2dfZmlsZWxvZyhwcmlvcml0eSwgc3RyaW5nKTsKICBsb2dfc3RkZXJybG9nKHByaW9yaXR5LCBzdHJpbmcpOwp9CgoKaW50CnZsb2cgKGludCBwcmlvcml0eSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQp7CiAgY2hhciBidWZmZXJbTE9HTEVOR1RIXTsKICBpbnQgbGVuZ3RoOyAKI2lmIEhBVkVfVlNOUFJJTlRGCiAgY2hhciAqZHluYW1pYzsKCiAgbGVuZ3RoPXZzbnByaW50ZihidWZmZXIsIExPR0xFTkdUSCwgZm9ybWF0LCBhcCk7CiNlbHNlCgogIGxlbmd0aD12c3ByaW50ZihidWZmZXIsIGZvcm1hdCwgYXApOwojZW5kaWYKCiAgaWYgKGxlbmd0aCA8IDAgKSB7CiAgICBsb2dfc3RyaW5nKExPR19FUlIsICJDb3VsZCBub3QgZm9ybWF0IGxvZy1zdHJpbmdcbiIpOwogICAgcmV0dXJuKC0xKTsKICB9CgogIGlmIChsZW5ndGggPCBMT0dMRU5HVEgpIHsKICAgIGxvZ19zdHJpbmcocHJpb3JpdHksIGJ1ZmZlcik7CiAgICByZXR1cm4oMCk7CiAgfSAKCiNpZiBIQVZFX1ZTTlBSSU5URgogIGR5bmFtaWM9bWFsbG9jKGxlbmd0aCsxKTsKICBpZiAoZHluYW1pYz09TlVMTCkgewogICAgbG9nX3N0cmluZyhMT0dfRVJSLCAiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgbG9nLW1lc3NhZ2VcbiIpOwogICAgbG9nX3N0cmluZyhwcmlvcml0eSwgYnVmZmVyKTsKICAgIHJldHVybigtMik7CiAgfQoKICB2c25wcmludGYoZHluYW1pYywgbGVuZ3RoKzEsIGZvcm1hdCwgYXApOwogIGxvZ19zdHJpbmcocHJpb3JpdHksIGR5bmFtaWMpOwogIGZyZWUoZHluYW1pYyk7CiAgcmV0dXJuKDApOwoKI2Vsc2UKICBsb2dfc3RyaW5nKHByaW9yaXR5LCBidWZmZXIpOwogIGxvZ19zdHJpbmcoTE9HX0VSUiwgIkxvZy1tZXNzYWdlIHRvbyBsb25nIVxuIik7CiAgcmV0dXJuKC0zKTsKI2VuZGlmCn0KCgppbnQKI2lmZGVmIFNURENfSEVBREVSUwpzbm1wX2xvZyAoaW50IHByaW9yaXR5LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKI2Vsc2UKc25tcF9sb2cgKGludCBwcmlvcml0eSwgdmFfYWxpc3QpCiAgdmFfZGNsCiNlbmRpZgp7CiAgdmFfbGlzdCBhcDsKICBpbnQgcmV0OwojaWZkZWYgU1REQ19IRUFERVJTCiAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CiNlbHNlCiAgY29uc3QgY2hhciAqZm9ybWF0OwogIHZhX3N0YXJ0KGFwKTsKICBmb3JtYXQgPSB2YV9hcmcoYXAsIGNvbnN0IGNoYXIgKik7CiNlbmRpZgogIHJldD12bG9nKHByaW9yaXR5LCBmb3JtYXQsIGFwKTsKICB2YV9lbmQoYXApOwogIHJldHVybihyZXQpOwp9CgovKgogKiBsb2cgYSBjcml0aWNhbCBlcnJvci4KICovCnZvaWQKbG9nX3BlcnJvcihjb25zdCBjaGFyICpzKQp7CiAgY2hhciAqZXJyb3IgID0gc3RyZXJyb3IoZXJybm8pOwogIGlmIChzKSB7CiAgICBpZiAoZXJyb3IpCiAgICAgIHNubXBfbG9nKExPR19FUlIsICIlczogJXNcbiIsIHMsIGVycm9yKTsKICAgIGVsc2UgCiAgICAgIHNubXBfbG9nKExPR19FUlIsICIlczogRXJyb3IgJWQgb3V0LW9mLXJhbmdlXG4iLCBzLCBlcnJubyk7CiAgfSBlbHNlIHsKICAgIGlmIChlcnJvcikKICAgICAgc25tcF9sb2coTE9HX0VSUiwgIiVzXG4iLCBlcnJvcik7CiAgICBlbHNlCiAgICAgIHNubXBfbG9nKExPR19FUlIsICJFcnJvciAlZCBvdXQtb2YtcmFuZ2VcbiIsIGVycm5vKTsKICB9Cn0KCg==