LyoKICogbG9nZ2luZy5jIC0gZ2VuZXJpYyBsb2dnaW5nIGZvciBzbm1wLWFnZW50CiAqICogQ29udHJpYnV0ZWQgYnkgUmFnbmFyIEtq+HJzdGFkLCB1Y2RAcmFnbmFyay52ZXN0ZGF0YS5ubyAxOTk5LTA2LTI2IAogKi8KLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCi8qKiBAZGVmZ3JvdXAgc25tcF9sb2dnaW5nIGdlbmVyaWMgbG9nZ2luZyBmb3IgbmV0LXNubXAgCiAqICBAaW5ncm91cCBsaWJyYXJ5CiAqIAogKiAgQHsKICovCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpZiBIQVZFX01BTExPQ19ICiNpbmNsdWRlIDxtYWxsb2MuaD4KI2VuZGlmCiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2Vsc2UKI2luY2x1ZGUgPHN0cmluZ3MuaD4KI2VuZGlmCiNpbmNsdWRlIDxjdHlwZS5oPgojaWYgSEFWRV9TVERMSUJfSAojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpZiBIQVZFX1NZU0xPR19ICiNpbmNsdWRlIDxzeXNsb2cuaD4KI2lmbmRlZiBMT0dfQ09OUyAgICAgICAgICAgICAgICAvKiBJbnRlcmVzdGluZyBVbHRyaXggZmVhdHVyZSAqLwojaW5jbHVkZSA8c3lzL3N5c2xvZy5oPgojZW5kaWYKI2VuZGlmCiNpZiBUSU1FX1dJVEhfU1lTX1RJTUUKIyBpZmRlZiBXSU4zMgojICBpbmNsdWRlIDxzeXMvdGltZWIuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZW5kaWYKIyBpbmNsdWRlIDx0aW1lLmg+CiNlbHNlCiMgaWYgSEFWRV9TWVNfVElNRV9ICiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZWxzZQojICBpbmNsdWRlIDx0aW1lLmg+CiMgZW5kaWYKI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKCiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNpZiBIQVZFX1VOSVNURF9ICiNpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpZiBIQVZFX0RNQUxMT0NfSAojaW5jbHVkZSA8ZG1hbGxvYy5oPgojZW5kaWYKCiNpZiBIQVZFX1dJTlNPQ0tfSAojaW5jbHVkZSA8d2luc29jay5oPgojZW5kaWYKCiNpZiBIQVZFX1dJTkRPV1NfSAojaW5jbHVkZSA8d2luZG93cy5oPgojZW5kaWYKCiNpbmNsdWRlIDxuZXQtc25tcC90eXBlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvb3V0cHV0X2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wX2xvZ2dpbmcuaD4gICAgICAvKiBGb3IgdGhpcyBmaWxlJ3MgImludGVybmFsIiBkZWZpbml0aW9ucyAqLwojaW5jbHVkZSA8bmV0LXNubXAvY29uZmlnX2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvdXRpbGl0aWVzLmg+CgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9jYWxsYmFjay5oPgojZGVmaW5lIExPR0xFTkdUSCAxMDI0CgojaWZkZWYgdmFfY29weQojZGVmaW5lIE5FRURfVkFfRU5EX0FGVEVSX1ZBX0NPUFkKI2Vsc2UKI2lmZGVmIF9fdmFjb3B5CiNkZWZpbmUgdmFjb3B5IF9fdmFjb3B5CiNkZWZpbmUgTkVFRF9WQV9FTkRfQUZURVJfVkFfQ09QWQojZWxzZQojZGVmaW5lIHZhX2NvcHkoZGVzdCwgc3JjKSBtZW1jcHkgKCZkZXN0LCAmc3JjLCBzaXplb2YgKHZhX2xpc3QpKQojZW5kaWYKI2VuZGlmCgovKgogKiBsb2doX2hlYWQ6ICBBIGxpc3Qgb2YgYWxsIGxvZyBoYW5kbGVycywgaW4gaW5jcmVhc2luZyBvcmRlciBvZiBwcmlvcml0eQogKiBsb2doX3ByaW9yaXRpZXM6ICAnSW5kZXhlcycgaW50byB0aGlzIGxpc3QsIGJ5IHByaW9yaXR5CiAqLwpuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doX2hlYWQgPSBOVUxMOwpuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doX3ByaW9yaXRpZXNbTE9HX0RFQlVHKzFdOwoKc3RhdGljIGludCAgICAgIG5ld2xpbmUgPSAxOwkgLyogTVRDUklUSUNBTF9SRVNPVVJDRSAqLwoKc3RhdGljIGNoYXIgc3lzbG9nbmFtZVs2NF0gPSBERUZBVUxUX0xPR19JRDsKCnZvaWQKbmV0c25tcF9lbmFibGVfZmlsZWxvZyhuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doLCBpbnQgZG9udF96ZXJvX2xvZyk7CgojaWZuZGVmIEhBVkVfVlNOUFJJTlRGCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogTmVlZCB0byB1c2UgdGhlIFVDRC1wcm92aWRlZCBvbmUgCiAgICAgICAgICAgICAgICAgKi8KaW50ICAgICAgICAgICAgIHZzbnByaW50ZihjaGFyICpzdHIsIHNpemVfdCBjb3VudCwgY29uc3QgY2hhciAqZm10LAogICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJnKTsKI2VuZGlmCgp2b2lkCmluaXRfc25tcF9sb2dnaW5nKHZvaWQpCnsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJsb2dUaW1lc3RhbXAiLCAKCQkJIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTE9HX1RJTUVTVEFNUCk7Cn0KCnZvaWQKc2h1dGRvd25fc25tcF9sb2dnaW5nKHZvaWQpCnsKICAgc25tcF9kaXNhYmxlX2xvZygpOwogICB3aGlsZShOVUxMICE9IGxvZ2hfaGVhZCkKICAgICAgbmV0c25tcF9yZW1vdmVfbG9naGFuZGxlciggbG9naF9oZWFkICk7Cn0KCi8qCiAqIFRoZXNlIGRlZmluaXRpb25zIGhhbmRsZSA0LjIgc3lzdGVtcyB3aXRob3V0IGFkZGl0aW9uYWwgc3lzbG9nIGZhY2lsaXRpZXMuCiAqLwojaWZuZGVmIExPR19DT05TCiNkZWZpbmUgTE9HX0NPTlMJMCAgICAgICAvKiBEb24ndCBib3RoZXIgaWYgbm90IGRlZmluZWQuLi4gKi8KI2VuZGlmCiNpZm5kZWYgTE9HX1BJRAojZGVmaW5lIExPR19QSUQJCTAgICAgICAgLyogRG9uJ3QgYm90aGVyIGlmIG5vdCBkZWZpbmVkLi4uICovCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDAKI2RlZmluZSBMT0dfTE9DQUwwCTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMMQojZGVmaW5lIExPR19MT0NBTDEJMAojZW5kaWYKI2lmbmRlZiBMT0dfTE9DQUwyCiNkZWZpbmUgTE9HX0xPQ0FMMgkwCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDMKI2RlZmluZSBMT0dfTE9DQUwzCTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMNAojZGVmaW5lIExPR19MT0NBTDQJMAojZW5kaWYKI2lmbmRlZiBMT0dfTE9DQUw1CiNkZWZpbmUgTE9HX0xPQ0FMNQkwCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDYKI2RlZmluZSBMT0dfTE9DQUw2CTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMNwojZGVmaW5lIExPR19MT0NBTDcJMAojZW5kaWYKI2lmbmRlZiBMT0dfREFFTU9OCiNkZWZpbmUgTE9HX0RBRU1PTgkwCiNlbmRpZgojaWZuZGVmIExPR19VU0VSCiNkZWZpbmUgTE9HX1VTRVIJMAojZW5kaWYKCi8qIFNldCBsaW5lIGJ1ZmZlcmluZyBtb2RlIGZvciBhIHN0cmVhbS4gKi8Kdm9pZApuZXRzbm1wX3NldF9saW5lX2J1ZmZlcmluZyhGSUxFICpzdHJlYW0pCnsKI2lmIGRlZmluZWQoV0lOMzIpCiAgICAvKgogICAgICogQWNjb3JkaW5nIHRvIE1TRE4sIHRoZSBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBDIHJ1bnRpbWUgbGlicmFyeSBkb2VzCiAgICAgKiBub3Qgc3VwcG9ydCBsaW5lIGJ1ZmZlcmluZywgc28gdHVybiBvZmYgYnVmZmVyaW5nIGNvbXBsZXRlbHkuCiAgICAgKiBTZWUgYWxzbyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvODZjZWJoZnMoVlMuNzEpLmFzcHguCiAgICAgKi8KICAgIHNldHZidWYoc3RyZWFtLCBOVUxMLCBfSU9OQkYsIEJVRlNJWik7CiNlbGlmIGRlZmluZWQoSEFWRV9TRVRMSU5FQlVGKQogICAgLyogc2V0bGluZWZ1bmN0aW9uKCkgaXMgYSBmdW5jdGlvbiBmcm9tIHRoZSBCU0QgVW5peCBBUEkuICovCiAgICBzZXRsaW5lYnVmKHN0cmVhbSk7CiNlbHNlCiAgICAvKiBTZWUgYWxzbyB0aGUgQzg5IG9yIEM5OSBzdGFuZGFyZCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBzZXR2YnVmKCkuICovCiAgICBzZXR2YnVmKHN0cmVhbSwgTlVMTCwgX0lPTEJGLCBCVUZTSVopOwojZW5kaWYKfQoKLyoKICogRGVjb2RlcyBsb2cgcHJpb3JpdHkuCiAqIEBwYXJhbSBvcHRhcmcgLSBJTiAtIHByaW9yaXR5IHRvIGRlY29kZSwgIjAiIG9yICIwLTciCiAqICAgICAgICAgICAgICAgICBPVVQgLSBwb2ludHMgdG8gbGFzdCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGRlY29kZWQgcHJpb3JpdHkKICogQHBhcmFtIHByaV9tYXggLSBPVVQgLSBtYXhpbXVtIHByaW9yaXR5IChpLmUuIDB4NyBmcm9tICIwLTciKQogKi8KaW50CmRlY29kZV9wcmlvcml0eSggY2hhciAqKm9wdGFyZywgaW50ICpwcmlfbWF4ICkKewogICAgaW50IHByaV9sb3cgPSBMT0dfREVCVUc7CgogICAgaWYgKCpvcHRhcmcgPT0gTlVMTCkKICAgICAgICByZXR1cm4gLTE7CgogICAgc3dpdGNoICgqKm9wdGFyZykgewogICAgICAgIGNhc2UgJzAnOiAKICAgICAgICBjYXNlICchJzogCiAgICAgICAgICAgIHByaV9sb3cgPSBMT0dfRU1FUkc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJzEnOiAKICAgICAgICBjYXNlICdhJzogCiAgICAgICAgY2FzZSAnQSc6IAogICAgICAgICAgICBwcmlfbG93ID0gTE9HX0FMRVJUOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICcyJzogCiAgICAgICAgY2FzZSAnYyc6IAogICAgICAgIGNhc2UgJ0MnOiAKICAgICAgICAgICAgcHJpX2xvdyA9IExPR19DUklUOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICczJzogCiAgICAgICAgY2FzZSAnZSc6IAogICAgICAgIGNhc2UgJ0UnOiAKICAgICAgICAgICAgcHJpX2xvdyA9IExPR19FUlI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJzQnOiAKICAgICAgICBjYXNlICd3JzogCiAgICAgICAgY2FzZSAnVyc6IAogICAgICAgICAgICBwcmlfbG93ID0gTE9HX1dBUk5JTkc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJzUnOiAKICAgICAgICBjYXNlICduJzogCiAgICAgICAgY2FzZSAnTic6IAogICAgICAgICAgICBwcmlfbG93ID0gTE9HX05PVElDRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnNic6IAogICAgICAgIGNhc2UgJ2knOiAKICAgICAgICBjYXNlICdJJzogCiAgICAgICAgICAgIHByaV9sb3cgPSBMT0dfSU5GTzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnNyc6IAogICAgICAgIGNhc2UgJ2QnOiAKICAgICAgICBjYXNlICdEJzogCiAgICAgICAgICAgIHByaV9sb3cgPSBMT0dfREVCVUc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IAogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgcHJpb3JpdHk6ICVjXG4iLCoqb3B0YXJnKTsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgKm9wdGFyZyA9ICpvcHRhcmcrMTsKCiAgICBpZiAocHJpX21heCAmJiAqKm9wdGFyZz09Jy0nKSB7CiAgICAgICAgKm9wdGFyZyA9ICpvcHRhcmcgKyAxOyAvKiBza2lwICctJyAqLwogICAgICAgICpwcmlfbWF4ID0gZGVjb2RlX3ByaW9yaXR5KCBvcHRhcmcsIE5VTEwgKTsKICAgICAgICBpZiAoKnByaV9tYXggPT0gLTEpIHJldHVybiAtMTsKICAgICAgICBpZiAocHJpX2xvdyA8ICpwcmlfbWF4KSB7IAogICAgICAgICAgICBpbnQgdG1wID0gcHJpX2xvdzsgCiAgICAgICAgICAgIHByaV9sb3cgPSAqcHJpX21heDsgCiAgICAgICAgICAgICpwcmlfbWF4ID0gdG1wOyAKICAgICAgICB9CgogICAgfQogICAgcmV0dXJuIHByaV9sb3c7Cn0KCmludApkZWNvZGVfZmFjaWxpdHkoIGNoYXIgKm9wdGFyZyApCnsKICAgIGlmIChvcHRhcmcgPT0gTlVMTCkKICAgICAgICByZXR1cm4gLTE7CgogICAgc3dpdGNoICgqb3B0YXJnKSB7CiAgICBjYXNlICdkJzoKICAgIGNhc2UgJ0QnOgogICAgICAgIHJldHVybiBMT0dfREFFTU9OOwogICAgY2FzZSAndSc6CiAgICBjYXNlICdVJzoKICAgICAgICByZXR1cm4gTE9HX1VTRVI7CiAgICBjYXNlICcwJzoKICAgICAgICByZXR1cm4gTE9HX0xPQ0FMMDsKICAgIGNhc2UgJzEnOgogICAgICAgIHJldHVybiBMT0dfTE9DQUwxOwogICAgY2FzZSAnMic6CiAgICAgICAgcmV0dXJuIExPR19MT0NBTDI7CiAgICBjYXNlICczJzoKICAgICAgICByZXR1cm4gTE9HX0xPQ0FMMzsKICAgIGNhc2UgJzQnOgogICAgICAgIHJldHVybiBMT0dfTE9DQUw0OwogICAgY2FzZSAnNSc6CiAgICAgICAgcmV0dXJuIExPR19MT0NBTDU7CiAgICBjYXNlICc2JzoKICAgICAgICByZXR1cm4gTE9HX0xPQ0FMNjsKICAgIGNhc2UgJzcnOgogICAgICAgIHJldHVybiBMT0dfTE9DQUw3OwogICAgZGVmYXVsdDoKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgc3lzbG9nIGZhY2lsaXR5OiAlY1xuIiwqb3B0YXJnKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9Cn0KCmludApzbm1wX2xvZ19vcHRpb25zKGNoYXIgKm9wdGFyZywgaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2KQp7CiAgICBjaGFyICAgICAgICAgICAqY3AgPSBvcHRhcmc7CiAgICAgICAgLyoKCSAqIEhtbW0uLi4gdGhpcyBkb2Vzbid0IHNlZW0gdG8gd29yay4KCSAqIFRoZSBtYWluIGFnZW50ICdnZXRvcHQnIGhhbmRsaW5nIGFzc3VtZXMKCSAqICAgdGhhdCB0aGUgLUwgb3B0aW9uIHRha2VzIGFuIGFyZ3VtZW50LAoJICogICBhbmQgb2JqZWN0cyBpZiB0aGlzIGlzIG1pc3NpbmcuCgkgKiBUcnlpbmcgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuCgkgKiAgIG5ldy1zdHlsZSAiLUx4IiwgYW5kIG9sZC1zdHlsZSAiLUwgeHgiCgkgKiAgIGlzIGxpa2VseSB0byBiZSBhIG1ham9yIGhlYWRhY2hlLgoJICovCiAgICBjaGFyICAgICAgICAgICAgbWlzc2luZ19vcHQgPSAnZSc7CS8qIG9sZCAtTCBpcyBuZXcgLUxlICovCiAgICBpbnQgICAgICAgICAgICAgcHJpb3JpdHkgPSBMT0dfREVCVUc7CiAgICBpbnQgICAgICAgICAgICAgcHJpX21heCAgPSBMT0dfRU1FUkc7CiAgICBpbnQgICAgICAgICAgICAgaW5jX29wdGluZCA9IDA7CiAgICBuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doOwoKICAgIG9wdGFyZysrOwogICAgaWYgKCEqY3ApCiAgICAgICAgY3AgPSAmbWlzc2luZ19vcHQ7CgogICAgLyoKICAgICAqIFN1cHBvcnQgJy4uLiAtTHg9dmFsdWUgLi4uLicgc3ludGF4CiAgICAgKi8KICAgIGlmICgqb3B0YXJnID09ICc9JykgewogICAgICAgIG9wdGFyZysrOwogICAgfQogICAgLyoKICAgICAqIGFuZCAnLi4uLiAiLUx4IHZhbHVlIiAuLi4uJyAgKCp3aXRoKiB0aGUgcXVvdGVzKQogICAgICovCiAgICB3aGlsZSAoKm9wdGFyZyAmJiBpc3NwYWNlKCpvcHRhcmcpKSB7CiAgICAgICAgb3B0YXJnKys7CiAgICB9CiAgICAvKgogICAgICogRmluYWxseSwgaGFuZGxlICIuLi4uIC1MeCB2YWx1ZSAuLi4uIiBzeW50YXgKICAgICAqICAgKCp3aXRob3V0KiBzdXJyb3VuZGluZyBxdW90ZXMpCiAgICAgKi8KICAgIGlmICgoISpvcHRhcmcpICYmIChOVUxMICE9IGFyZ3YpKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBXZSd2ZSBydW4gb2ZmIHRoZSBlbmQgb2YgdGhlIGFyZ3VtZW50CiAgICAgICAgICogIHNvIG1vdmUgb24gdG8gdGhlIG5leHQuCiAgICAgICAgICogQnV0IHdlIG1pZ2h0IG5vdCBhY3R1YWxseSBuZWVkIGl0LCBzbyBkb24ndAoJICogIGluY3JlbWVudCBvcHRpbmQganVzdCB5ZXQhCiAgICAgICAgICovCiAgICAgICAgb3B0YXJnID0gYXJndltvcHRpbmRdOwogICAgICAgIGluY19vcHRpbmQgPSAxOwogICAgfQoKICAgIHN3aXRjaCAoKmNwKSB7CgogICAgLyoKICAgICAqIExvZyB0byBTdGFuZGFyZCBFcnJvcgogICAgICovCiAgICBjYXNlICdFJzoKICAgICAgICBwcmlvcml0eSA9IGRlY29kZV9wcmlvcml0eSggJm9wdGFyZywgJnByaV9tYXggKTsKICAgICAgICBpZiAocHJpb3JpdHkgPT0gLTEpICByZXR1cm4gLTE7CiAgICAgICAgaWYgKGluY19vcHRpbmQpCiAgICAgICAgICAgIG9wdGluZCsrOwogICAgICAgIC8qIEZhbGx0aHJvdWdoICovCiAgICBjYXNlICdlJzoKICAgICAgICBsb2doID0gbmV0c25tcF9yZWdpc3Rlcl9sb2doYW5kbGVyKE5FVFNOTVBfTE9HSEFORExFUl9TVERFUlIsIHByaW9yaXR5KTsKICAgICAgICBpZiAobG9naCkgewogICAgICAgICAgICBuZXRzbm1wX3NldF9saW5lX2J1ZmZlcmluZyhzdGRlcnIpOwogICAgICAgICAgICBsb2doLT5wcmlfbWF4ID0gcHJpX21heDsKICAgICAgICAgICAgbG9naC0+dG9rZW4gICA9IHN0cmR1cCgic3RkZXJyIik7Cgl9CiAgICAgICAgYnJlYWs7CgogICAgLyoKICAgICAqIExvZyB0byBTdGFuZGFyZCBPdXRwdXQKICAgICAqLwogICAgY2FzZSAnTyc6CiAgICAgICAgcHJpb3JpdHkgPSBkZWNvZGVfcHJpb3JpdHkoICZvcHRhcmcsICZwcmlfbWF4ICk7CiAgICAgICAgaWYgKHByaW9yaXR5ID09IC0xKSAgcmV0dXJuIC0xOwogICAgICAgIGlmIChpbmNfb3B0aW5kKQogICAgICAgICAgICBvcHRpbmQrKzsKICAgICAgICAvKiBGYWxsdGhyb3VnaCAqLwogICAgY2FzZSAnbyc6CiAgICAgICAgbG9naCA9IG5ldHNubXBfcmVnaXN0ZXJfbG9naGFuZGxlcihORVRTTk1QX0xPR0hBTkRMRVJfU1RERVJSLCBwcmlvcml0eSk7CiAgICAgICAgaWYgKGxvZ2gpIHsKICAgICAgICAgICAgbmV0c25tcF9zZXRfbGluZV9idWZmZXJpbmcoc3Rkb3V0KTsKICAgICAgICAgICAgbG9naC0+cHJpX21heCA9IHByaV9tYXg7CiAgICAgICAgICAgIGxvZ2gtPnRva2VuICAgPSBzdHJkdXAoInN0ZG91dCIpOwogICAgICAgICAgICBsb2doLT5pbWFnaWMgID0gMTsJICAgIC8qIHN0ZG91dCwgbm90IHN0ZGVyciAqLwoJfQogICAgICAgIGJyZWFrOwoKICAgIC8qCiAgICAgKiBMb2cgdG8gYSBuYW1lZCBmaWxlCiAgICAgKi8KICAgIGNhc2UgJ0YnOgogICAgICAgIHByaW9yaXR5ID0gZGVjb2RlX3ByaW9yaXR5KCAmb3B0YXJnLCAmcHJpX21heCApOwogICAgICAgIGlmIChwcmlvcml0eSA9PSAtMSB8fCAhYXJndikgIHJldHVybiAtMTsKICAgICAgICBvcHRhcmcgPSBhcmd2Wysrb3B0aW5kXTsKICAgICAgICAvKiBGYWxsdGhyb3VnaCAqLwogICAgY2FzZSAnZic6CiAgICAgICAgaWYgKGluY19vcHRpbmQpCiAgICAgICAgICAgIG9wdGluZCsrOwogICAgICAgIGlmICghb3B0YXJnKSB7CiAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBsb2cgZmlsZVxuIik7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgbG9naCA9IG5ldHNubXBfcmVnaXN0ZXJfbG9naGFuZGxlcihORVRTTk1QX0xPR0hBTkRMRVJfRklMRSwgcHJpb3JpdHkpOwogICAgICAgIGlmIChsb2doKSB7CiAgICAgICAgICAgIGxvZ2gtPnByaV9tYXggPSBwcmlfbWF4OwogICAgICAgICAgICBsb2doLT50b2tlbiAgID0gc3RyZHVwKG9wdGFyZyk7CiAgICAgICAgICAgIG5ldHNubXBfZW5hYmxlX2ZpbGVsb2cobG9naCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0FQUEVORF9MT0dGSUxFUykpOwoJfQogICAgICAgIGJyZWFrOwoKICAgIC8qCiAgICAgKiBMb2cgdG8gc3lzbG9nCiAgICAgKi8KICAgIGNhc2UgJ1MnOgogICAgICAgIHByaW9yaXR5ID0gZGVjb2RlX3ByaW9yaXR5KCAmb3B0YXJnLCAmcHJpX21heCApOwogICAgICAgIGlmIChwcmlvcml0eSA9PSAtMSB8fCAhYXJndikgIHJldHVybiAtMTsKICAgICAgICBpZiAoIW9wdGFyZ1swXSkgewogICAgICAgICAgICAvKiBUaGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHdpdGggcHJpb3JpdHkgZG9lcyBub3QgY29udGFpbiBsb2cKICAgICAgICAgICAgICogZmFjaWxpdHkuIFRoZSBmYWNpbGl0eSBtdXN0IGJlIGluIG5leHQgYXJndW1lbnQgdGhlbi4gKi8KICAgICAgICAgICAgb3B0aW5kKys7CiAgICAgICAgICAgIGlmIChvcHRpbmQgPCBhcmdjKQogICAgICAgICAgICAgICAgb3B0YXJnID0gYXJndltvcHRpbmRdOwogICAgICAgIH0KICAgICAgICAvKiBGYWxsdGhyb3VnaCAqLwogICAgY2FzZSAncyc6CiAgICAgICAgaWYgKGluY19vcHRpbmQpCiAgICAgICAgICAgIG9wdGluZCsrOwogICAgICAgIGlmICghb3B0YXJnKSB7CiAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBzeXNsb2cgZmFjaWxpdHlcbiIpOwogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIGxvZ2ggPSBuZXRzbm1wX3JlZ2lzdGVyX2xvZ2hhbmRsZXIoTkVUU05NUF9MT0dIQU5ETEVSX1NZU0xPRywgcHJpb3JpdHkpOwogICAgICAgIGlmIChsb2doKSB7CiAgICAgICAgICAgIGludCBmYWNpbGl0eSA9IGRlY29kZV9mYWNpbGl0eShvcHRhcmcpOwogICAgICAgICAgICBpZiAoZmFjaWxpdHkgPT0gLTEpICByZXR1cm4gLTE7CiAgICAgICAgICAgIGxvZ2gtPnByaV9tYXggPSBwcmlfbWF4OwogICAgICAgICAgICBsb2doLT50b2tlbiAgID0gc3RyZHVwKHNubXBfbG9nX3N5c2xvZ25hbWUoTlVMTCkpOwogICAgICAgICAgICBsb2doLT5tYWdpYyAgID0gKHZvaWQgKikoaW50cHRyX3QpZmFjaWxpdHk7CgkgICAgc25tcF9lbmFibGVfc3lzbG9nX2lkZW50KHNubXBfbG9nX3N5c2xvZ25hbWUoTlVMTCksIGZhY2lsaXR5KTsKCX0KICAgICAgICBicmVhazsKCiAgICAvKgogICAgICogRG9uJ3QgbG9nIAogICAgICovCiAgICBjYXNlICdOJzoKICAgICAgICBwcmlvcml0eSA9IGRlY29kZV9wcmlvcml0eSggJm9wdGFyZywgJnByaV9tYXggKTsKICAgICAgICBpZiAocHJpb3JpdHkgPT0gLTEpICByZXR1cm4gLTE7CiAgICAgICAgaWYgKGluY19vcHRpbmQpCiAgICAgICAgICAgIG9wdGluZCsrOwogICAgICAgIC8qIEZhbGx0aHJvdWdoICovCiAgICBjYXNlICduJzoKICAgICAgICAvKgogICAgICAgICAqIGRpc2FibGUgYWxsIGxvZ3MgdG8gY2xlYW4gdGhlbSB1cCAoY2xvc2UgZmlsZXMsIGV0YyksCiAgICAgICAgICogcmVtb3ZlIGFsbCBsb2cgaGFuZGxlcnMsIHRoZW4gcmVnaXN0ZXIgYSBudWxsIGhhbmRsZXIuCiAgICAgICAgICovCiAgICAgICAgc25tcF9kaXNhYmxlX2xvZygpOwogICAgICAgIHdoaWxlKE5VTEwgIT0gbG9naF9oZWFkKQogICAgICAgICAgICBuZXRzbm1wX3JlbW92ZV9sb2doYW5kbGVyKCBsb2doX2hlYWQgKTsKICAgICAgICBsb2doID0gbmV0c25tcF9yZWdpc3Rlcl9sb2doYW5kbGVyKE5FVFNOTVBfTE9HSEFORExFUl9OT05FLCBwcmlvcml0eSk7CiAgICAgICAgaWYgKGxvZ2gpIHsKICAgICAgICAgICAgbG9naC0+cHJpX21heCA9IHByaV9tYXg7Cgl9CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gbG9nZ2luZyBvcHRpb24gcGFzc2VkIHRvIC1MOiAlYy5cbiIsICpjcCk7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCmNoYXIgKgpzbm1wX2xvZ19zeXNsb2duYW1lKGNvbnN0IGNoYXIgKnBzdHIpCnsKICBpZiAocHN0cikKICAgIHN0cmxjcHkgKHN5c2xvZ25hbWUsIHBzdHIsIHNpemVvZihzeXNsb2duYW1lKSk7CgogIHJldHVybiBzeXNsb2duYW1lOwp9Cgp2b2lkCnNubXBfbG9nX29wdGlvbnNfdXNhZ2UoY29uc3QgY2hhciAqbGVhZCwgRklMRSAqIG91dGYpCnsKICAgIGNvbnN0IGNoYXIgKnByaTFfbXNnID0gIiBmb3IgbGV2ZWwgJ3ByaScgYW5kIGFib3ZlIjsKICAgIGNvbnN0IGNoYXIgKnByaTJfbXNnID0gIiBmb3IgbGV2ZWxzICdwMScgdG8gJ3AyJyI7CiAgICBmcHJpbnRmKG91dGYsICIlc2U6ICAgICAgICAgICBsb2cgdG8gc3RhbmRhcmQgZXJyb3JcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNvOiAgICAgICAgICAgbG9nIHRvIHN0YW5kYXJkIG91dHB1dFxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc246ICAgICAgICAgICBkb24ndCBsb2cgYXQgYWxsXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzZiBmaWxlOiAgICAgIGxvZyB0byB0aGUgc3BlY2lmaWVkIGZpbGVcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNzIGZhY2lsaXR5OiAgbG9nIHRvIHN5c2xvZyAodmlhIHRoZSBzcGVjaWZpZWQgZmFjaWxpdHkpXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIlxuJXModmFyaWFudHMpXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzW0VPTl0gcHJpOiAgIGxvZyB0byBzdGFuZGFyZCBlcnJvciwgb3V0cHV0IG9yIC9kZXYvbnVsbCVzXG4iLCBsZWFkLCBwcmkxX21zZyk7CiAgICBmcHJpbnRmKG91dGYsICIlc1tFT05dIHAxLXAyOiBsb2cgdG8gc3RhbmRhcmQgZXJyb3IsIG91dHB1dCBvciAvZGV2L251bGwlc1xuIiwgbGVhZCwgcHJpMl9tc2cpOwogICAgZnByaW50ZihvdXRmLCAiJXNbRlNdIHByaSB0b2tlbjogICAgbG9nIHRvIGZpbGUvc3lzbG9nJXNcbiIsIGxlYWQsIHByaTFfbXNnKTsKICAgIGZwcmludGYob3V0ZiwgIiVzW0ZTXSBwMS1wMiB0b2tlbjogIGxvZyB0byBmaWxlL3N5c2xvZyVzXG4iLCBsZWFkLCBwcmkyX21zZyk7Cn0KCi8qKgogKiBJcyBsb2dnaW5nIGRvbmU/CiAqCiAqIEByZXR1cm4gUmV0dXJucyAwIGlmIGxvZ2dpbmcgaXMgb2ZmLCAxIHdoZW4gaXQgaXMgZG9uZS4KICoKICovCmludApzbm1wX2dldF9kb19sb2dnaW5nKHZvaWQpCnsKICAgIG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2g7CiAgICBmb3IgKGxvZ2ggPSBsb2doX2hlYWQ7IGxvZ2g7IGxvZ2ggPSBsb2doLT5uZXh0KQogICAgICAgIGlmIChsb2doLT5lbmFibGVkKQogICAgICAgICAgICByZXR1cm4gMTsKICAgIHJldHVybiAwOwp9CgoKc3RhdGljIGNoYXIgICAgKgpzcHJpbnRmX3N0YW1wKHRpbWVfdCAqIG5vdywgY2hhciAqc2J1ZikKewogICAgdGltZV90ICAgICAgICAgIE5vdzsKICAgIHN0cnVjdCB0bSAgICAgICp0bTsKCiAgICBpZiAobm93ID09IE5VTEwpIHsKICAgICAgICBub3cgPSAmTm93OwogICAgICAgIHRpbWUobm93KTsKICAgIH0KICAgIHRtID0gbG9jYWx0aW1lKG5vdyk7CiAgICBzcHJpbnRmKHNidWYsICIlLjRkLSUuMmQtJS4yZCAlLjJkOiUuMmQ6JS4yZCAiLAogICAgICAgICAgICB0bS0+dG1feWVhciArIDE5MDAsIHRtLT50bV9tb24gKyAxLCB0bS0+dG1fbWRheSwKICAgICAgICAgICAgdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOwogICAgcmV0dXJuIHNidWY7Cn0KCnZvaWQKc25tcF9kaXNhYmxlX3N5c2xvZ19lbnRyeShuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doKQp7CiAgICBpZiAoIWxvZ2ggfHwgIWxvZ2gtPmVuYWJsZWQgfHwgbG9naC0+dHlwZSAhPSBORVRTTk1QX0xPR0hBTkRMRVJfU1lTTE9HKQogICAgICAgIHJldHVybjsKCiNpZmRlZiBXSU4zMgogICAgaWYgKGxvZ2gtPm1hZ2ljKSB7CiAgICAgICAgSEFORExFIGV2ZW50bG9nX2ggPSAoSEFORExFKWxvZ2gtPm1hZ2ljOwogICAgICAgIENsb3NlRXZlbnRMb2coZXZlbnRsb2dfaCk7CiAgICAgICAgbG9naC0+bWFnaWMgPSBOVUxMOwogICAgfQojZWxzZQogICAgY2xvc2Vsb2coKTsKICAgIGxvZ2gtPmltYWdpYyAgPSAwOwojZW5kaWYKCiAgICBsb2doLT5lbmFibGVkID0gMDsKfQoKdm9pZApzbm1wX2Rpc2FibGVfc3lzbG9nKHZvaWQpCnsKICAgIG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2g7CgogICAgZm9yIChsb2doID0gbG9naF9oZWFkOyBsb2doOyBsb2doID0gbG9naC0+bmV4dCkKICAgICAgICBpZiAobG9naC0+ZW5hYmxlZCAmJiBsb2doLT50eXBlID09IE5FVFNOTVBfTE9HSEFORExFUl9TWVNMT0cpCiAgICAgICAgICAgIHNubXBfZGlzYWJsZV9zeXNsb2dfZW50cnkobG9naCk7Cn0KCnZvaWQKc25tcF9kaXNhYmxlX2ZpbGVsb2dfZW50cnkobmV0c25tcF9sb2dfaGFuZGxlciAqbG9naCkKewogICAgaWYgKCFsb2doIC8qIHx8ICFsb2doLT5lbmFibGVkICovIHx8IGxvZ2gtPnR5cGUgIT0gTkVUU05NUF9MT0dIQU5ETEVSX0ZJTEUpCiAgICAgICAgcmV0dXJuOwoKICAgIGlmIChsb2doLT5tYWdpYykgewogICAgICAgIGZwdXRzKCJcbiIsIChGSUxFKilsb2doLT5tYWdpYyk7CS8qIFhYWCAtIHdoeT8gKi8KICAgICAgICBmY2xvc2UoKEZJTEUqKWxvZ2gtPm1hZ2ljKTsKICAgICAgICBsb2doLT5tYWdpYyAgID0gTlVMTDsKICAgIH0KICAgIGxvZ2gtPmVuYWJsZWQgPSAwOwp9Cgp2b2lkCnNubXBfZGlzYWJsZV9maWxlbG9nKHZvaWQpCnsKICAgIG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2g7CgogICAgZm9yIChsb2doID0gbG9naF9oZWFkOyBsb2doOyBsb2doID0gbG9naC0+bmV4dCkKICAgICAgICBpZiAobG9naC0+ZW5hYmxlZCAmJiBsb2doLT50eXBlID09IE5FVFNOTVBfTE9HSEFORExFUl9GSUxFKQogICAgICAgICAgICBzbm1wX2Rpc2FibGVfZmlsZWxvZ19lbnRyeShsb2doKTsKfQoKLyoKICogcmV0dXJucyB0aGF0IHN0YXR1cyBvZiBzdGRlcnIgbG9nZ2luZwogKgogKiBAcmV0dmFsIDAgOiBzdGRlcnIgbG9nZ2luZyBkaXNhYmxlZAogKiBAcmV0dmFsIDEgOiBzdGRlcnIgbG9nZ2luZyBlbmFibGVkCiAqLwppbnQKc25tcF9zdGRlcnJsb2dfc3RhdHVzKHZvaWQpCnsKICAgIG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2g7CgogICAgZm9yIChsb2doID0gbG9naF9oZWFkOyBsb2doOyBsb2doID0gbG9naC0+bmV4dCkKICAgICAgICBpZiAobG9naC0+ZW5hYmxlZCAmJiAobG9naC0+dHlwZSA9PSBORVRTTk1QX0xPR0hBTkRMRVJfU1RET1VUIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2gtPnR5cGUgPT0gTkVUU05NUF9MT0dIQU5ETEVSX1NUREVSUikpIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICB9CgogICAgcmV0dXJuIDA7Cn0KCnZvaWQKc25tcF9kaXNhYmxlX3N0ZGVycmxvZyh2b2lkKQp7CiAgICBuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doOwoKICAgIGZvciAobG9naCA9IGxvZ2hfaGVhZDsgbG9naDsgbG9naCA9IGxvZ2gtPm5leHQpCiAgICAgICAgaWYgKGxvZ2gtPmVuYWJsZWQgJiYgKGxvZ2gtPnR5cGUgPT0gTkVUU05NUF9MT0dIQU5ETEVSX1NURE9VVCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2doLT50eXBlID09IE5FVFNOTVBfTE9HSEFORExFUl9TVERFUlIpKSB7CiAgICAgICAgICAgIGxvZ2gtPmVuYWJsZWQgPSAwOwoJfQp9Cgp2b2lkCnNubXBfZGlzYWJsZV9jYWxsbG9nKHZvaWQpCnsKICAgIG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2g7CgogICAgZm9yIChsb2doID0gbG9naF9oZWFkOyBsb2doOyBsb2doID0gbG9naC0+bmV4dCkKICAgICAgICBpZiAobG9naC0+ZW5hYmxlZCAmJiBsb2doLT50eXBlID09IE5FVFNOTVBfTE9HSEFORExFUl9DQUxMQkFDSykgewogICAgICAgICAgICBsb2doLT5lbmFibGVkID0gMDsKCX0KfQoKdm9pZApzbm1wX2Rpc2FibGVfbG9nKHZvaWQpCnsKICAgIG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2g7CgogICAgZm9yIChsb2doID0gbG9naF9oZWFkOyBsb2doOyBsb2doID0gbG9naC0+bmV4dCkgewogICAgICAgIGlmIChsb2doLT50eXBlID09IE5FVFNOTVBfTE9HSEFORExFUl9TWVNMT0cpCiAgICAgICAgICAgIHNubXBfZGlzYWJsZV9zeXNsb2dfZW50cnkobG9naCk7CiAgICAgICAgaWYgKGxvZ2gtPnR5cGUgPT0gTkVUU05NUF9MT0dIQU5ETEVSX0ZJTEUpCiAgICAgICAgICAgIHNubXBfZGlzYWJsZV9maWxlbG9nX2VudHJ5KGxvZ2gpOwogICAgICAgIGxvZ2gtPmVuYWJsZWQgPSAwOwogICAgfQp9CgovKgogKiBjbG9zZSBhbmQgcmVvcGVuIGFsbCBmaWxlIGJhc2VkIGxvZ3MsIHRvIGFsbG93IGxvZ2ZpbGUKICogcm90YXRpb24uCiAqLwp2b2lkCm5ldHNubXBfbG9nZ2luZ19yZXN0YXJ0KHZvaWQpCnsKICAgIG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2g7CgogICAgZm9yIChsb2doID0gbG9naF9oZWFkOyBsb2doOyBsb2doID0gbG9naC0+bmV4dCkgewogICAgICAgIGlmICgwID09IGxvZ2gtPmVuYWJsZWQpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGlmIChsb2doLT50eXBlID09IE5FVFNOTVBfTE9HSEFORExFUl9TWVNMT0cpIHsKICAgICAgICAgICAgc25tcF9kaXNhYmxlX3N5c2xvZ19lbnRyeShsb2doKTsKICAgICAgICAgICAgc25tcF9lbmFibGVfc3lzbG9nX2lkZW50KGxvZ2gtPnRva2VuLChpbnQpKGludHB0cl90KWxvZ2gtPm1hZ2ljKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobG9naC0+dHlwZSA9PSBORVRTTk1QX0xPR0hBTkRMRVJfRklMRSkgewogICAgICAgICAgICBzbm1wX2Rpc2FibGVfZmlsZWxvZ19lbnRyeShsb2doKTsKICAgICAgICAgICAgLyoqIGhtbSwgZG9uJ3QgemVybyBzdGF0dXMgaXNuJ3Qgc2F2ZWQuLiBpIHRoaW5rIGl0J3MKICAgICAgICAgICAgICogc2FmZXIgbm90IHRvIG92ZXJ3cml0ZSwgaW4gY2FzZSBhIGh1cCBpcyBqdXN0IHRvCiAgICAgICAgICAgICAqIHJlLXJlYWQgY29uZmlnIGZpbGVzLi4uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBuZXRzbm1wX2VuYWJsZV9maWxlbG9nKGxvZ2gsIDEpOwogICAgICAgIH0KICAgIH0KfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCnZvaWQKc25tcF9lbmFibGVfc3lzbG9nKHZvaWQpCnsKICAgIHNubXBfZW5hYmxlX3N5c2xvZ19pZGVudChzbm1wX2xvZ19zeXNsb2duYW1lKE5VTEwpLCBMT0dfREFFTU9OKTsKfQoKdm9pZApzbm1wX2VuYWJsZV9zeXNsb2dfaWRlbnQoY29uc3QgY2hhciAqaWRlbnQsIGNvbnN0IGludCBmYWNpbGl0eSkKewogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDsKICAgIGludCAgICAgICAgICAgICAgICAgIGZvdW5kID0gMDsKICAgIGludCAgICAgICAgICAgICAgICAgIGVuYWJsZSA9IDE7CiNpZmRlZiBXSU4zMgogICAgSEFORExFICAgICAgICAgICAgICAgZXZlbnRsb2dfaDsKI2Vsc2UKICAgIHZvaWQgICAgICAgICAgICAgICAgKmV2ZW50bG9nX2ggPSBOVUxMOwojZW5kaWYKCiAgICBzbm1wX2Rpc2FibGVfc3lzbG9nKCk7CS8qID8/PyAqLwojaWZkZWYgV0lOMzIKICAgIGV2ZW50bG9nX2ggPSBPcGVuRXZlbnRMb2coTlVMTCwgaWRlbnQpOwogICAgaWYgKGV2ZW50bG9nX2ggPT0gTlVMTCkgewoJICAgIC8qCgkgICAgICogSG1tbS4uLi4uCgkgICAgICogTWF5YmUgZGlzYWJsZSB0aGlzIGhhbmRsZXIsIGFuZCBsb2cgdGhlIGVycm9yID8KCSAgICAgKi8KICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIGV2ZW50IGxvZyBmb3IgJXMuICIKICAgICAgICAgICAgICAgICJMYXN0IGVycm9yOiAweCV4XG4iLCBpZGVudCwgR2V0TGFzdEVycm9yKCkpOwogICAgICAgIGVuYWJsZSA9IDA7CiAgICB9CiNlbHNlCiAgICBvcGVubG9nKHNubXBfbG9nX3N5c2xvZ25hbWUoaWRlbnQpLCBMT0dfQ09OUyB8IExPR19QSUQsIGZhY2lsaXR5KTsKI2VuZGlmCgogICAgZm9yIChsb2doID0gbG9naF9oZWFkOyBsb2doOyBsb2doID0gbG9naC0+bmV4dCkKICAgICAgICBpZiAobG9naC0+dHlwZSA9PSBORVRTTk1QX0xPR0hBTkRMRVJfU1lTTE9HKSB7CiAgICAgICAgICAgIGxvZ2gtPm1hZ2ljICAgPSAodm9pZCopZXZlbnRsb2dfaDsKICAgICAgICAgICAgbG9naC0+aW1hZ2ljICA9IGVuYWJsZTsJLyogc3lzbG9nIG9wZW4gKi8KICAgICAgICAgICAgbG9naC0+ZW5hYmxlZCA9IGVuYWJsZTsKICAgICAgICAgICAgZm91bmQgICAgICAgICA9IDE7Cgl9CgogICAgaWYgKCFmb3VuZCkgewogICAgICAgIGxvZ2ggPSBuZXRzbm1wX3JlZ2lzdGVyX2xvZ2hhbmRsZXIoTkVUU05NUF9MT0dIQU5ETEVSX1NZU0xPRywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR19ERUJVRyApOwogICAgICAgIGlmIChsb2doKSB7CiAgICAgICAgICAgIGxvZ2gtPm1hZ2ljICAgID0gKHZvaWQqKWV2ZW50bG9nX2g7CiAgICAgICAgICAgIGxvZ2gtPnRva2VuICAgID0gc3RyZHVwKGlkZW50KTsKICAgICAgICAgICAgbG9naC0+aW1hZ2ljICAgPSBlbmFibGU7CS8qIHN5c2xvZyBvcGVuICovCiAgICAgICAgICAgIGxvZ2gtPmVuYWJsZWQgID0gZW5hYmxlOwogICAgICAgIH0KICAgIH0KfQoKdm9pZApuZXRzbm1wX2VuYWJsZV9maWxlbG9nKG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2gsIGludCBkb250X3plcm9fbG9nKQp7CiAgICBGSUxFICpsb2dmaWxlOwoKICAgIGlmICghbG9naCkKICAgICAgICByZXR1cm47CgogICAgaWYgKCFsb2doLT5tYWdpYykgewogICAgICAgIGxvZ2ZpbGUgPSBmb3Blbihsb2doLT50b2tlbiwgZG9udF96ZXJvX2xvZyA/ICJhIiA6ICJ3Iik7CiAgICAgICAgaWYgKCFsb2dmaWxlKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgbG9naC0+bWFnaWMgPSAodm9pZCopbG9nZmlsZTsKICAgICAgICBuZXRzbm1wX3NldF9saW5lX2J1ZmZlcmluZyhsb2dmaWxlKTsKICAgIH0KICAgIGxvZ2gtPmVuYWJsZWQgPSAxOwp9Cgp2b2lkCnNubXBfZW5hYmxlX2ZpbGVsb2coY29uc3QgY2hhciAqbG9nZmlsZW5hbWUsIGludCBkb250X3plcm9fbG9nKQp7CiAgICBuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doOwoKICAgIC8qCiAgICAgKiBkb24ndCBkaXNhYmxlIEFMTCBmaWxlbG9ncyB3aGVuZXZlciBhIG5ldyBvbmUgaXMgZW5hYmxlZC4KICAgICAqIHRoaXMgcHJldmVudHMgJy1MZiBmaWxlJyBmcm9tIHdvcmtpbmcgaW4gc25tcGQsIGFzIHRoZQogICAgICogY2FsbCB0byBzZXQgdXAgL3Zhci9sb2cvc25tcGQubG9nIHdpbGwgZGlzYWJsZSB0aGUgcHJldmlvdXMKICAgICAqIGxvZyBzZXR1cC4KICAgICAqIHNubXBfZGlzYWJsZV9maWxlbG9nKCk7CiAgICAgKi8KCiAgICBpZiAobG9nZmlsZW5hbWUpIHsKICAgICAgICBsb2doID0gbmV0c25tcF9maW5kX2xvZ2hhbmRsZXIoIGxvZ2ZpbGVuYW1lICk7CiAgICAgICAgaWYgKCFsb2doKSB7CiAgICAgICAgICAgIGxvZ2ggPSBuZXRzbm1wX3JlZ2lzdGVyX2xvZ2hhbmRsZXIoTkVUU05NUF9MT0dIQU5ETEVSX0ZJTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HX0RFQlVHICk7CiAgICAgICAgICAgIGlmIChsb2doKQogICAgICAgICAgICAgICAgbG9naC0+dG9rZW4gPSBzdHJkdXAobG9nZmlsZW5hbWUpOwoJfQogICAgICAgIGlmIChsb2doKQogICAgICAgICAgICBuZXRzbm1wX2VuYWJsZV9maWxlbG9nKGxvZ2gsIGRvbnRfemVyb19sb2cpOwogICAgfSBlbHNlIHsKICAgICAgICBmb3IgKGxvZ2ggPSBsb2doX2hlYWQ7IGxvZ2g7IGxvZ2ggPSBsb2doLT5uZXh0KQogICAgICAgICAgICBpZiAobG9naC0+dHlwZSA9PSBORVRTTk1QX0xPR0hBTkRMRVJfRklMRSkKICAgICAgICAgICAgICAgIG5ldHNubXBfZW5hYmxlX2ZpbGVsb2cobG9naCwgZG9udF96ZXJvX2xvZyk7CiAgICB9Cn0KCgp2b2lkCnNubXBfZW5hYmxlX3N0ZGVycmxvZyh2b2lkKQp7CiAgICBuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doOwogICAgaW50ICAgICAgICAgICAgICAgICAgZm91bmQgPSAwOwoKICAgIGZvciAobG9naCA9IGxvZ2hfaGVhZDsgbG9naDsgbG9naCA9IGxvZ2gtPm5leHQpCiAgICAgICAgaWYgKGxvZ2gtPnR5cGUgPT0gTkVUU05NUF9MT0dIQU5ETEVSX1NURE9VVCB8fAogICAgICAgICAgICBsb2doLT50eXBlID09IE5FVFNOTVBfTE9HSEFORExFUl9TVERFUlIpIHsKICAgICAgICAgICAgbG9naC0+ZW5hYmxlZCA9IDE7CiAgICAgICAgICAgIGZvdW5kICAgICAgICAgPSAxOwogICAgICAgIH0KCiAgICBpZiAoIWZvdW5kKSB7CiAgICAgICAgbG9naCA9IG5ldHNubXBfcmVnaXN0ZXJfbG9naGFuZGxlcihORVRTTk1QX0xPR0hBTkRMRVJfU1RERVJSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HX0RFQlVHICk7CiAgICAgICAgaWYgKGxvZ2gpCiAgICAgICAgICAgIGxvZ2gtPnRva2VuICAgID0gc3RyZHVwKCJzdGRlcnIiKTsKICAgIH0KfQoKCnZvaWQKc25tcF9lbmFibGVfY2FsbGxvZyh2b2lkKQkvKiBYWFggLSBvciB0YWtlIGEgY2FsbGJhY2sgcm91dGluZSA/Pz8gKi8KewogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDsKICAgIGludCAgICAgICAgICAgICAgICAgIGZvdW5kID0gMDsKCiAgICBmb3IgKGxvZ2ggPSBsb2doX2hlYWQ7IGxvZ2g7IGxvZ2ggPSBsb2doLT5uZXh0KQogICAgICAgIGlmIChsb2doLT50eXBlID09IE5FVFNOTVBfTE9HSEFORExFUl9DQUxMQkFDSykgewogICAgICAgICAgICBsb2doLT5lbmFibGVkID0gMTsKICAgICAgICAgICAgZm91bmQgICAgICAgICA9IDE7Cgl9CgogICAgaWYgKCFmb3VuZCkgewogICAgICAgIGxvZ2ggPSBuZXRzbm1wX3JlZ2lzdGVyX2xvZ2hhbmRsZXIoTkVUU05NUF9MT0dIQU5ETEVSX0NBTExCQUNLLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HX0RFQlVHICk7CiAgICAgICAgaWYgKGxvZ2gpCiAgICAgICAgICAgIGxvZ2gtPnRva2VuICAgID0gc3RyZHVwKCJjYWxsYmFjayIpOwogICAgfQp9CgoKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCgpuZXRzbm1wX2xvZ19oYW5kbGVyICoKbmV0c25tcF9maW5kX2xvZ2hhbmRsZXIoIGNvbnN0IGNoYXIgKnRva2VuICkKewogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDsKICAgIGlmICghdG9rZW4pCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgZm9yIChsb2doID0gbG9naF9oZWFkOyBsb2doOyBsb2doID0gbG9naC0+bmV4dCkKICAgICAgICBpZiAobG9naC0+dG9rZW4gJiYgIXN0cmNtcCggdG9rZW4sIGxvZ2gtPnRva2VuICkpCiAgICAgICAgICAgIGJyZWFrOwoKICAgIHJldHVybiBsb2doOwp9CgppbnQKbmV0c25tcF9hZGRfbG9naGFuZGxlciggbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naCApCnsKICAgIGludCBpOwogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDI7CgogICAgaWYgKCFsb2doKQogICAgICAgIHJldHVybiAwOwoKICAgIC8qCiAgICAgKiBGaW5kIHRoZSBhcHByb3ByaWF0ZSBwb2ludCBmb3IgdGhlIG5ldyBlbnRyeS4uLgogICAgICogICAobG9naDIgd2lsbCBwb2ludCB0byB0aGUgZW50cnkgaW1tZWRpYXRlbHkgZm9sbG93aW5nKQogICAgICovCiAgICBmb3IgKGxvZ2gyID0gbG9naF9oZWFkOyBsb2doMjsgbG9naDIgPSBsb2doMi0+bmV4dCkKICAgICAgICBpZiAoIGxvZ2gyLT5wcmlvcml0eSA+PSBsb2doLT5wcmlvcml0eSApCiAgICAgICAgICAgIGJyZWFrOwoKICAgIC8qCiAgICAgKiAuLi4gYW5kIGxpbmsgaXQgaW50byB0aGUgbWFpbiBsaXN0LgogICAgICovCiAgICBpZiAobG9naDIpIHsKICAgICAgICBpZiAobG9naDItPnByZXYpCiAgICAgICAgICAgIGxvZ2gyLT5wcmV2LT5uZXh0ID0gbG9naDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvZ2hfaGVhZCA9IGxvZ2g7CiAgICAgICAgbG9naC0+bmV4dCAgPSBsb2doMjsKICAgICAgICBsb2doMi0+cHJldiA9IGxvZ2g7CiAgICB9IGVsc2UgaWYgKGxvZ2hfaGVhZCApIHsKICAgICAgICAvKgogICAgICAgICAqIElmIGxvZ2gyIGlzIE5VTEwsIHdlJ3JlIHRhZ2dpbmcgb24gdG8gdGhlIGVuZAogICAgICAgICAqLwogICAgICAgIGZvciAobG9naDIgPSBsb2doX2hlYWQ7IGxvZ2gyLT5uZXh0OyBsb2doMiA9IGxvZ2gyLT5uZXh0KQogICAgICAgICAgICA7CiAgICAgICAgbG9naDItPm5leHQgPSBsb2doOwogICAgfSBlbHNlIHsKICAgICAgICBsb2doX2hlYWQgPSBsb2doOwogICAgfQoKICAgIC8qCiAgICAgKiBBbHNvIHR3ZWFrIHRoZSByZWxldmFudCBwcmlvcml0eS0naW5kZXgnIGFycmF5LgogICAgICovCiAgICBmb3IgKGk9TE9HX0VNRVJHOyBpPD1sb2doLT5wcmlvcml0eTsgaSsrKQogICAgICAgIGlmICghbG9naF9wcmlvcml0aWVzW2ldIHx8CiAgICAgICAgICAgICBsb2doX3ByaW9yaXRpZXNbaV0tPnByaW9yaXR5ID49IGxvZ2gtPnByaW9yaXR5KQogICAgICAgICAgICAgbG9naF9wcmlvcml0aWVzW2ldID0gbG9naDsKCiAgICByZXR1cm4gMTsKfQoKbmV0c25tcF9sb2dfaGFuZGxlciAqCm5ldHNubXBfcmVnaXN0ZXJfbG9naGFuZGxlciggaW50IHR5cGUsIGludCBwcmlvcml0eSApCnsKICAgIG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2g7CgogICAgbG9naCA9IFNOTVBfTUFMTE9DX1RZUEVERUYobmV0c25tcF9sb2dfaGFuZGxlcik7CiAgICBpZiAoIWxvZ2gpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgbG9naC0+dHlwZSAgICAgPSB0eXBlOwogICAgc3dpdGNoICggdHlwZSApIHsKICAgIGNhc2UgTkVUU05NUF9MT0dIQU5ETEVSX1NURE9VVDoKICAgICAgICBsb2doLT5pbWFnaWMgID0gMTsKICAgICAgICAvKiBmYWxsdGhyb3VnaCAqLwogICAgY2FzZSBORVRTTk1QX0xPR0hBTkRMRVJfU1RERVJSOgogICAgICAgIGxvZ2gtPmhhbmRsZXIgPSBsb2dfaGFuZGxlcl9zdGRvdXRlcnI7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBORVRTTk1QX0xPR0hBTkRMRVJfRklMRToKICAgICAgICBsb2doLT5oYW5kbGVyID0gbG9nX2hhbmRsZXJfZmlsZTsKICAgICAgICBsb2doLT5pbWFnaWMgID0gMTsKICAgICAgICBicmVhazsKICAgIGNhc2UgTkVUU05NUF9MT0dIQU5ETEVSX1NZU0xPRzoKICAgICAgICBsb2doLT5oYW5kbGVyID0gbG9nX2hhbmRsZXJfc3lzbG9nOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBORVRTTk1QX0xPR0hBTkRMRVJfQ0FMTEJBQ0s6CiAgICAgICAgbG9naC0+aGFuZGxlciA9IGxvZ19oYW5kbGVyX2NhbGxiYWNrOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBORVRTTk1QX0xPR0hBTkRMRVJfTk9ORToKICAgICAgICBsb2doLT5oYW5kbGVyID0gbG9nX2hhbmRsZXJfbnVsbDsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgZnJlZShsb2doKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGxvZ2gtPnByaW9yaXR5ID0gcHJpb3JpdHk7CiAgICBsb2doLT5lbmFibGVkICA9IDE7CiAgICBuZXRzbm1wX2FkZF9sb2doYW5kbGVyKCBsb2doICk7CiAgICByZXR1cm4gbG9naDsKfQoKCmludApuZXRzbm1wX2VuYWJsZV9sb2doYW5kbGVyKCBjb25zdCBjaGFyICp0b2tlbiApCnsKICAgIG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2g7CgogICAgbG9naCA9IG5ldHNubXBfZmluZF9sb2doYW5kbGVyKCB0b2tlbiApOwogICAgaWYgKCFsb2doKQogICAgICAgIHJldHVybiAwOwogICAgbG9naC0+ZW5hYmxlZCA9IDE7CiAgICByZXR1cm4gMTsKfQoKCmludApuZXRzbm1wX2Rpc2FibGVfbG9naGFuZGxlciggY29uc3QgY2hhciAqdG9rZW4gKQp7CiAgICBuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doOwoKICAgIGxvZ2ggPSBuZXRzbm1wX2ZpbmRfbG9naGFuZGxlciggdG9rZW4gKTsKICAgIGlmICghbG9naCkKICAgICAgICByZXR1cm4gMDsKICAgIGxvZ2gtPmVuYWJsZWQgPSAwOwogICAgcmV0dXJuIDE7Cn0KCmludApuZXRzbm1wX3JlbW92ZV9sb2doYW5kbGVyKCBuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doICkKewogICAgaW50IGk7CiAgICBpZiAoIWxvZ2gpCiAgICAgICAgcmV0dXJuIDA7CgogICAgaWYgKGxvZ2gtPnByZXYpCiAgICAgICAgbG9naC0+cHJldi0+bmV4dCA9IGxvZ2gtPm5leHQ7CiAgICBlbHNlCiAgICAgICAgbG9naF9oZWFkID0gbG9naC0+bmV4dDsKCiAgICBpZiAobG9naC0+bmV4dCkKICAgICAgICBsb2doLT5uZXh0LT5wcmV2ID0gbG9naC0+cHJldjsKCiAgICBmb3IgKGk9TE9HX0VNRVJHOyBpPD1sb2doLT5wcmlvcml0eTsgaSsrKQogICAgICAgIGxvZ2hfcHJpb3JpdGllc1tpXSA9IE5VTEw7CiAgICBmcmVlKE5FVFNOTVBfUkVNT1ZFX0NPTlNUKGNoYXIqLCBsb2doLT50b2tlbikpOwogICAgU05NUF9GUkVFKGxvZ2gpOwoKICAgIHJldHVybiAxOwp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgppbnQKbG9nX2hhbmRsZXJfc3Rkb3V0ZXJyKCAgbmV0c25tcF9sb2dfaGFuZGxlciogbG9naCwgaW50IHByaSwgY29uc3QgY2hhciAqc3RyKQp7CiAgICBjaGFyICAgICAgICAgICAgc2J1Zls0MF07CgogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0xPR19USU1FU1RBTVApICYmIG5ld2xpbmUpIHsKICAgICAgICBzcHJpbnRmX3N0YW1wKE5VTEwsIHNidWYpOwogICAgfSBlbHNlIHsKICAgICAgICBzdHJjcHkoc2J1ZiwgIiIpOwogICAgfQogICAgbmV3bGluZSA9IHN0cltzdHJsZW4oc3RyKSAtIDFdID09ICdcbic7CS8qIFhYWCAtIEVoID8gKi8KCiAgICBpZiAobG9naC0+aW1hZ2ljKQogICAgICAgcHJpbnRmKCAgICAgICAgICIlcyVzIiwgc2J1Ziwgc3RyKTsKICAgIGVsc2UKICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMlcyIsIHNidWYsIHN0cik7CgogICAgcmV0dXJuIDE7Cn0KCgojaWZkZWYgV0lOMzIKaW50CmxvZ19oYW5kbGVyX3N5c2xvZyggIG5ldHNubXBfbG9nX2hhbmRsZXIqIGxvZ2gsIGludCBwcmksIGNvbnN0IGNoYXIgKnN0cikKewogICAgV09SRCAgICAgICAgICAgIGV0eXBlOwogICAgTFBDVFNUUiAgICAgICAgIGV2ZW50X21zZ1syXTsKICAgIEhBTkRMRSAgICAgICAgICBldmVudGxvZ19oID0gbG9naC0+bWFnaWM7CgogICAgICAgIC8qCiAgICAgICAgICoqICBFVkVOVCBUWVBFUzoKICAgICAgICAgKioKICAgICAgICAgKiogIEluZm9ybWF0aW9uIChFVkVOVExPR19JTkZPUk1BVElPTl9UWVBFKQogICAgICAgICAqKiAgICAgIEluZm9ybWF0aW9uIGV2ZW50cyBpbmRpY2F0ZSBpbmZyZXF1ZW50IGJ1dCBzaWduaWZpY2FudAogICAgICAgICAqKiAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9ucy4KICAgICAgICAgKiogIFdhcm5pbmcgKEVWRU5UTE9HX1dBUk5JTkdfVFlQRSkKICAgICAgICAgKiogICAgICBXYXJuaW5nIGV2ZW50cyBpbmRpY2F0ZSBwcm9ibGVtcyB0aGF0IGFyZSBub3QgaW1tZWRpYXRlbHkKICAgICAgICAgKiogICAgICBzaWduaWZpY2FudCwgYnV0IHRoYXQgbWF5IGluZGljYXRlIGNvbmRpdGlvbnMgdGhhdCBjb3VsZAogICAgICAgICAqKiAgICAgIGNhdXNlIGZ1dHVyZSBwcm9ibGVtcy4gUmVzb3VyY2UgY29uc3VtcHRpb24gaXMgYSBnb29kCiAgICAgICAgICoqICAgICAgY2FuZGlkYXRlIGZvciBhIHdhcm5pbmcgZXZlbnQuCiAgICAgICAgICoqICBFcnJvciAoRVZFTlRMT0dfRVJST1JfVFlQRSkKICAgICAgICAgKiogICAgICBFcnJvciBldmVudHMgaW5kaWNhdGUgc2lnbmlmaWNhbnQgcHJvYmxlbXMgdGhhdCB0aGUgdXNlcgogICAgICAgICAqKiAgICAgIHNob3VsZCBrbm93IGFib3V0LiBFcnJvciBldmVudHMgdXN1YWxseSBpbmRpY2F0ZSBhIGxvc3Mgb2YKICAgICAgICAgKiogICAgICBmdW5jdGlvbmFsaXR5IG9yIGRhdGEuCiAgICAgICAgICovCiAgICBzd2l0Y2ggKHByaSkgewogICAgICAgIGNhc2UgTE9HX0VNRVJHOgogICAgICAgIGNhc2UgTE9HX0FMRVJUOgogICAgICAgIGNhc2UgTE9HX0NSSVQ6CiAgICAgICAgY2FzZSBMT0dfRVJSOgogICAgICAgICAgICBldHlwZSA9IEVWRU5UTE9HX0VSUk9SX1RZUEU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTE9HX1dBUk5JTkc6CiAgICAgICAgICAgIGV0eXBlID0gRVZFTlRMT0dfV0FSTklOR19UWVBFOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIExPR19OT1RJQ0U6CiAgICAgICAgY2FzZSBMT0dfSU5GTzoKICAgICAgICBjYXNlIExPR19ERUJVRzoKICAgICAgICAgICAgZXR5cGUgPSBFVkVOVExPR19JTkZPUk1BVElPTl9UWVBFOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBldHlwZSA9IEVWRU5UTE9HX0lORk9STUFUSU9OX1RZUEU7CiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgZXZlbnRfbXNnWzBdID0gc3RyOwogICAgZXZlbnRfbXNnWzFdID0gTlVMTDsKICAgIC8qIE5PVEU6IDR0aCBwYXJhbWV0ZXIgbXVzdCBtYXRjaCB3aW5zZXJ2aWNlLm1jOk1lc3NhZ2VJZCB2YWx1ZSAqLwogICAgaWYgKCFSZXBvcnRFdmVudChldmVudGxvZ19oLCBldHlwZSwgMCwgMTAwLCBOVUxMLCAxLCAwLCBldmVudF9tc2csIE5VTEwpKSB7CgkgICAgLyoKCSAgICAgKiBIbW1tLi4uLi4KCSAgICAgKiBNYXliZSBkaXNhYmxlIHRoaXMgaGFuZGxlciwgYW5kIGxvZyB0aGUgZXJyb3IgPwoJICAgICAqLwogICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHJlcG9ydCBldmVudC4gIExhc3QgZXJyb3I6IDB4JXhcbiIsCgkJCUdldExhc3RFcnJvcigpKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiAxOwp9CiNlbHNlCmludApsb2dfaGFuZGxlcl9zeXNsb2coICBuZXRzbm1wX2xvZ19oYW5kbGVyKiBsb2doLCBpbnQgcHJpLCBjb25zdCBjaGFyICpzdHIpCnsKCS8qCgkgKiBYWFgKCSAqIFdlJ3ZlIGdvdCB0aHJlZSBpdGVtcyBvZiBpbmZvcm1hdGlvbiB0byB3b3JrIHdpdGg6CgkgKiAgICAgSXMgdGhlIHN5c2xvZyBjdXJyZW50bHkgb3Blbj8KCSAqICAgICBXaGF0IGlkZW50IHN0cmluZyB0byB1c2U/CgkgKiAgICAgV2hhdCBmYWNpbGl0eSB0byBsb2cgdG8/CgkgKgoJICogV2UndmUgZ290IHR3byAibWFnaWMiIGxvY2F0aW9ucyAoaW1hZ2ljICYgbWFnaWMpIHBsdXMgdGhlIHRva2VuCgkgKi8KICAgIGlmICghKGxvZ2gtPmltYWdpYykpIHsKICAgICAgICBjb25zdCBjaGFyICppZGVudCAgICA9IGxvZ2gtPnRva2VuOwogICAgICAgIGludCAgIGZhY2lsaXR5ID0gKGludCkoaW50cHRyX3QpbG9naC0+bWFnaWM7CiAgICAgICAgaWYgKCFpZGVudCkKICAgICAgICAgICAgaWRlbnQgPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9BUFBUWVBFKTsKICAgICAgICBvcGVubG9nKGlkZW50LCBMT0dfQ09OUyB8IExPR19QSUQsIGZhY2lsaXR5KTsKICAgICAgICBsb2doLT5pbWFnaWMgPSAxOwogICAgfQogICAgc3lzbG9nKCBwcmksICIlcyIsIHN0ciApOwogICAgcmV0dXJuIDE7Cn0KI2VuZGlmIC8qICFXSU4zMiAqLwoKCmludApsb2dfaGFuZGxlcl9maWxlKCAgICBuZXRzbm1wX2xvZ19oYW5kbGVyKiBsb2doLCBpbnQgcHJpLCBjb25zdCBjaGFyICpzdHIpCnsKICAgIEZJTEUgICAgICAgICAgICpmaGFuZGxlOwogICAgY2hhciAgICAgICAgICAgIHNidWZbNDBdOwoKICAgIC8qCiAgICAgKiBXZSB1c2UgaW1hZ2ljIHRvIHNhdmUgaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciB0aGUgbmV4dCBvdXRwdXQKICAgICAqIHdpbGwgc3RhcnQgYSBuZXcgbGluZSwgYW5kIHRodXMgbWlnaHQgbmVlZCBhIHRpbWVzdGFtcAogICAgICovCiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfTE9HX1RJTUVTVEFNUCkgJiYgbG9naC0+aW1hZ2ljKSB7CiAgICAgICAgc3ByaW50Zl9zdGFtcChOVUxMLCBzYnVmKTsKICAgIH0gZWxzZSB7CiAgICAgICAgc3RyY3B5KHNidWYsICIiKTsKICAgIH0KCiAgICAvKgogICAgICogSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IG9wZW5lZCB0aGUgZmlsZSwgdGhlbiBkbyBzby4KICAgICAqIFNhdmUgdGhlIGZpbGVoYW5kbGUgcG9pbnRlciBmb3IgbmV4dCB0aW1lLgogICAgICoKICAgICAqIE5vdGUgdGhhdCB0aGlzIHNob3VsZCBzdGlsbCB3b3JrLCBldmVuIGlmIHRoZSBmaWxlCiAgICAgKiBpcyBjbG9zZWQgaW4gdGhlIG1lYW50aW1lIChlLmcuIGEgcmVndWxhciAiY2xlYW51cCIgc3dlZXApCiAgICAgKi8KICAgIGZoYW5kbGUgPSAoRklMRSopbG9naC0+bWFnaWM7CiAgICBpZiAoIWxvZ2gtPm1hZ2ljKSB7CiAgICAgICAgZmhhbmRsZSA9IGZvcGVuKGxvZ2gtPnRva2VuLCAiYSsiKTsKICAgICAgICBpZiAoIWZoYW5kbGUpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGxvZ2gtPm1hZ2ljID0gKHZvaWQqKWZoYW5kbGU7CiAgICB9CiAgICBmcHJpbnRmKGZoYW5kbGUsICIlcyVzIiwgc2J1Ziwgc3RyKTsKICAgIGZmbHVzaChmaGFuZGxlKTsKICAgIGxvZ2gtPmltYWdpYyA9IHN0cltzdHJsZW4oc3RyKSAtIDFdID09ICdcbic7CiAgICByZXR1cm4gMTsKfQoKaW50CmxvZ19oYW5kbGVyX2NhbGxiYWNrKG5ldHNubXBfbG9nX2hhbmRsZXIqIGxvZ2gsIGludCBwcmksIGNvbnN0IGNoYXIgKnN0cikKewoJLyoKCSAqIFhYWCAtIHBlcmhhcHMgcmVwbGFjZSAnc25tcF9jYWxsX2NhbGxiYWNrcycgcHJvY2Vzc2luZwoJICogICAgICAgd2l0aCBpbmRpdmlkdWFsIGNhbGxiYWNrIGxvZ19oYW5kbGVycyA/PwoJICovCiAgICBzdHJ1Y3Qgc25tcF9sb2dfbWVzc2FnZSBzbG07CiAgICBpbnQgICAgICAgICAgICAgZG9kZWJ1ZyA9IHNubXBfZ2V0X2RvX2RlYnVnZ2luZygpOwoKICAgIHNsbS5wcmlvcml0eSA9IHByaTsKICAgIHNsbS5tc2cgPSBzdHI7CiAgICBpZiAoZG9kZWJ1ZykgICAgICAgICAgICAvKiB0dXJuIG9mZiBkZWJ1Z2dpbmcgaW5zaWRlIHRoZSBjYWxsYmFja3MgZWxzZSB3aWxsIGxvb3AgKi8KICAgICAgICBzbm1wX3NldF9kb19kZWJ1Z2dpbmcoMCk7CiAgICBzbm1wX2NhbGxfY2FsbGJhY2tzKFNOTVBfQ0FMTEJBQ0tfTElCUkFSWSwgU05NUF9DQUxMQkFDS19MT0dHSU5HLCAmc2xtKTsKICAgIGlmIChkb2RlYnVnKQogICAgICAgIHNubXBfc2V0X2RvX2RlYnVnZ2luZyhkb2RlYnVnKTsKICAgIHJldHVybiAxOwp9CgppbnQKbG9nX2hhbmRsZXJfbnVsbCggICAgbmV0c25tcF9sb2dfaGFuZGxlciogbG9naCwgaW50IHByaSwgY29uc3QgY2hhciAqc3RyKQp7CiAgICAvKgogICAgICogRHVtbXkgbG9nIGhhbmRsZXIgLSBqdXN0IHRocm93IGF3YXkgdGhlIGVycm9yIGNvbXBsZXRlbHkKICAgICAqIFlvdSBwcm9iYWJseSBkb24ndCByZWFsbHkgd2FudCB0byBkbyB0aGlzIQogICAgICovCiAgICByZXR1cm4gMTsKfQoKdm9pZApzbm1wX2xvZ19zdHJpbmcoaW50IHByaW9yaXR5LCBjb25zdCBjaGFyICpzdHIpCnsKICAgIG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2g7CgogICAgLyoKICAgICAqIFdlJ3ZlIGdvdCB0byBiZSBhYmxlIHRvIGxvZyBtZXNzYWdlcyAqc29tZXdoZXJlKiEKICAgICAqIElmIHlvdSBkb24ndCB3YW50IHN0ZGVyciBsb2dnaW5nLCB0aGVuIGVuYWJsZSBzb21ldGhpbmcgZWxzZS4KICAgICAqLwogICAgaWYgKCFsb2doX2hlYWQpIHsKICAgICAgICBzbm1wX2VuYWJsZV9zdGRlcnJsb2coKTsKICAgICAgICBzbm1wX2xvZ19zdHJpbmcoTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICJObyBsb2cgaGFuZGxpbmcgZW5hYmxlZCAtIHR1cm5pbmcgb24gc3RkZXJyIGxvZ2dpbmdcbiIpOwogICAgfQoKICAgIC8qCiAgICAgKiBTdGFydCBhdCB0aGUgZ2l2ZW4gcHJpb3JpdHksIGFuZCB3b3JrICJ1cHdhcmRzIi4uLi4KICAgICAqLwogICAgbG9naCA9IGxvZ2hfcHJpb3JpdGllc1twcmlvcml0eV07CiAgICBmb3IgKCA7IGxvZ2g7IGxvZ2ggPSBsb2doLT5uZXh0ICkgewogICAgICAgIC8qCiAgICAgICAgICogLi4uIGJ1dCBza2lwcGluZyBhbnkgaGFuZGxlcnMgd2l0aCBhICJtYXhpbXVtIHByaW9yaXR5IgogICAgICAgICAqICAgICB0aGF0IHdlIGhhdmUgYWxyZWFkeSBleGNlZWRlZC4gQW5kIGRvbid0IGZvcmdldCB0bwogICAgICAgICAqICAgICBlbnN1cmUgdGhpcyBsb2dnaW5nIGlzIHR1cm5lZCBvbiAoc2VlIHNubXBfZGlzYWJsZV9zdGRlcnJsb2cKICAgICAgICAgKiAgICAgYW5kIGl0cyBjb2hvcnRzKS4KICAgICAgICAgKi8KICAgICAgICBpZiAobG9naC0+ZW5hYmxlZCAmJiAocHJpb3JpdHkgPj0gbG9naC0+cHJpX21heCkpCiAgICAgICAgICAgIGxvZ2gtPmhhbmRsZXIoIGxvZ2gsIHByaW9yaXR5LCBzdHIgKTsKICAgIH0KfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKCi8qKgogKiBUaGlzIHNubXAgbG9nZ2luZyBmdW5jdGlvbiBhbGxvd3MgdmFyaWFibGUgYXJndW1lbnQgbGlzdCBnaXZlbiB0aGUKICogc3BlY2lmaWVkIHByaW9yaXR5LCBmb3JtYXQgYW5kIGEgcG9wdWxhdGVkIHZhX2xpc3Qgc3RydWN0dXJlLgogKiBUaGUgZGVmYXVsdCBsb2dmaWxlIHRoaXMgZnVuY3Rpb24gd3JpdGVzIHRvIGlzIC92YXIvbG9nL3NubXBkLmxvZy4KICoKICogQHBhcmFtIHByaW9yaXR5IGlzIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSB0eXBlIG9mIG1lc3NhZ2UgdG8gYmUgd3JpdHRlbgogKgl0byB0aGUgc25tcCBsb2cgZmlsZS4gIFRoZSB0eXBlcyBhcmUgZXJyb3JzLCB3YXJuaW5nLCBhbmQgaW5mb3JtYXRpb24uCiAqICAgICAgLSBUaGUgZXJyb3IgdHlwZXMgYXJlOgogKiAgICAgICAgLSBMT0dfRU1FUkcgICAgICAgc3lzdGVtIGlzIHVudXNhYmxlIAogKiAgICAgICAgLSBMT0dfQUxFUlQgICAgICAgYWN0aW9uIG11c3QgYmUgdGFrZW4gaW1tZWRpYXRlbHkgCiAqICAgICAgICAtIExPR19DUklUICAgICAgICBjcml0aWNhbCBjb25kaXRpb25zIAogKiAgICAgICAgLSBMT0dfRVJSICAgICAgICAgZXJyb3IgY29uZGl0aW9ucwogKiAgICAgIC0gVGhlIHdhcm5pbmcgdHlwZSBpczoKICogICAgICAgIC0gTE9HX1dBUk5JTkcgICAgIHdhcm5pbmcgY29uZGl0aW9ucyAKICogICAgICAtIFRoZSBpbmZvcm1hdGlvbiB0eXBlcyBhcmU6CiAqICAgICAgICAtIExPR19OT1RJQ0UgICAgICBub3JtYWwgYnV0IHNpZ25pZmljYW50IGNvbmRpdGlvbgogKiAgICAgICAgLSBMT0dfSU5GTyAgICAgICAgaW5mb3JtYXRpb25hbAogKiAgICAgICAgLSBMT0dfREVCVUcgICAgICAgZGVidWctbGV2ZWwgbWVzc2FnZXMKICoKICogQHBhcmFtIGZvcm1hdCBpcyBhIHBvaW50ZXIgdG8gYSBjaGFyIHJlcHJlc2VudGluZyB0aGUgdmFyaWFibGUgYXJndW1lbnQgbGlzdAogKglmb3JtYXQgdXNlZC4KICoKICogQHBhcmFtIGFwIGlzIGEgdmFfbGlzdCB0eXBlIHVzZWQgdG8gdHJhdmVyc2UgdGhlIGxpc3Qgb2YgYXJndW1lbnRzLgogKgogKiBAcmV0dXJuIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSB3aGVuIHRoZSBjb2RlIGNvdWxkIG5vdCBmb3JtYXQgdGhlIGxvZy0KICogICAgICAgICBzdHJpbmcsIC0yIHdoZW4gZHluYW1pYyBtZW1vcnkgY291bGQgbm90IGJlIGFsbG9jYXRlZCBpZiB0aGUgbGVuZ3RoCiAqICAgICAgICAgb2YgdGhlIGxvZyBidWZmZXIgaXMgZ3JlYXRlciB0aGVuIDEwMjQgYnl0ZXMuICBGb3IgZWFjaCBvZiB0aGVzZQogKiAgICAgICAgIGVycm9ycyBhIExPR19FUlIgbWVzc2dhZSBpcyB3cml0dGVuIHRvIHRoZSBsb2dmaWxlLgogKgogKiBAc2VlIHNubXBfbG9nCiAqLwppbnQKc25tcF92bG9nKGludCBwcmlvcml0eSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQp7CiAgICBjaGFyICAgICAgICAgICAgYnVmZmVyW0xPR0xFTkdUSF07CiAgICBpbnQgICAgICAgICAgICAgbGVuZ3RoOwogICAgY2hhciAgICAgICAgICAgKmR5bmFtaWM7CiAgICB2YV9saXN0ICAgICAgICAgYXE7CgogICAgdmFfY29weShhcSwgYXApOwogICAgbGVuZ3RoID0gdnNucHJpbnRmKGJ1ZmZlciwgTE9HTEVOR1RILCBmb3JtYXQsIGFwKTsKICAgIHZhX2VuZChhcCk7CgogICAgaWYgKGxlbmd0aCA9PSAwKSB7CiNpZmRlZiBORUVEX1ZBX0VORF9BRlRFUl9WQV9DT1BZCiAgICAgICAgdmFfZW5kKGFxKTsKI2VuZGlmCiAgICAgICAgcmV0dXJuICgwKTsgICAgICAgICAgICAgLyogRW1wdHkgc3RyaW5nICovCiAgICB9CgogICAgaWYgKGxlbmd0aCA9PSAtMSkgewogICAgICAgIHNubXBfbG9nX3N0cmluZyhMT0dfRVJSLCAiQ291bGQgbm90IGZvcm1hdCBsb2ctc3RyaW5nXG4iKTsKI2lmZGVmIE5FRURfVkFfRU5EX0FGVEVSX1ZBX0NPUFkKICAgICAgICB2YV9lbmQoYXEpOwojZW5kaWYKICAgICAgICByZXR1cm4gKC0xKTsKICAgIH0KCiAgICBpZiAobGVuZ3RoIDwgTE9HTEVOR1RIKSB7CiAgICAgICAgc25tcF9sb2dfc3RyaW5nKHByaW9yaXR5LCBidWZmZXIpOwojaWZkZWYgTkVFRF9WQV9FTkRfQUZURVJfVkFfQ09QWQogICAgICAgIHZhX2VuZChhcSk7CiNlbmRpZgogICAgICAgIHJldHVybiAoMCk7CiAgICB9CgogICAgZHluYW1pYyA9IChjaGFyICopIG1hbGxvYyhsZW5ndGggKyAxKTsKICAgIGlmIChkeW5hbWljID09IE5VTEwpIHsKICAgICAgICBzbm1wX2xvZ19zdHJpbmcoTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGxvZy1tZXNzYWdlXG4iKTsKICAgICAgICBzbm1wX2xvZ19zdHJpbmcocHJpb3JpdHksIGJ1ZmZlcik7CiNpZmRlZiBORUVEX1ZBX0VORF9BRlRFUl9WQV9DT1BZCiAgICAgICAgdmFfZW5kKGFxKTsKI2VuZGlmCiAgICAgICAgcmV0dXJuICgtMik7CiAgICB9CgogICAgdnNucHJpbnRmKGR5bmFtaWMsIGxlbmd0aCArIDEsIGZvcm1hdCwgYXEpOwogICAgc25tcF9sb2dfc3RyaW5nKHByaW9yaXR5LCBkeW5hbWljKTsKICAgIGZyZWUoZHluYW1pYyk7CiAgICB2YV9lbmQoYXEpOwogICAgcmV0dXJuIDA7Cn0KCi8qKgogKiBUaGlzIHNubXAgbG9nZ2luZyBmdW5jdGlvbiBhbGxvd3MgdmFyaWFibGUgYXJndW1lbnQgbGlzdCBnaXZlbiB0aGUKICogc3BlY2lmaWVkIGZvcm1hdCBhbmQgcHJpb3JpdHkuICBDYWxscyB0aGUgc25tcF92bG9nIGZ1bmN0aW9uLgogKiBUaGUgZGVmYXVsdCBsb2dmaWxlIHRoaXMgZnVuY3Rpb24gd3JpdGVzIHRvIGlzIC92YXIvbG9nL3NubXBkLmxvZy4KICoKICogQHNlZSBzbm1wX3Zsb2cKICovCmludApzbm1wX2xvZyhpbnQgcHJpb3JpdHksIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQp7CiAgICB2YV9saXN0ICAgICAgICAgYXA7CiAgICBpbnQgICAgICAgICAgICAgcmV0OwogICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CiAgICByZXQgPSBzbm1wX3Zsb2cocHJpb3JpdHksIGZvcm1hdCwgYXApOwogICAgdmFfZW5kKGFwKTsKICAgIHJldHVybiAocmV0KTsKfQoKLyoKICogbG9nIGEgY3JpdGljYWwgZXJyb3IuCiAqLwp2b2lkCnNubXBfbG9nX3BlcnJvcihjb25zdCBjaGFyICpzKQp7CiAgICBjaGFyICAgICAgICAgICAqZXJyb3IgPSBzdHJlcnJvcihlcnJubyk7CiAgICBpZiAocykgewogICAgICAgIGlmIChlcnJvcikKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIiVzOiAlc1xuIiwgcywgZXJyb3IpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIiVzOiBFcnJvciAlZCBvdXQtb2YtcmFuZ2VcbiIsIHMsIGVycm5vKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGVycm9yKQogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiJXNcbiIsIGVycm9yKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJFcnJvciAlZCBvdXQtb2YtcmFuZ2VcbiIsIGVycm5vKTsKICAgIH0KfQoKLyogZXh0ZXJuYWwgYWNjZXNzIHRvIGxvZ2hfaGVhZCB2YXJpYWJsZSAqLwpuZXRzbm1wX2xvZ19oYW5kbGVyICAqCmdldF9sb2doX2hlYWQodm9pZCkKewoJcmV0dXJuIGxvZ2hfaGVhZDsKfQoKLyoqICBAfSAqLwo=