LyogaXA2dGFibGVzIG1hdGNoIGV4dGVuc2lvbiBmb3IgbGltaXRpbmcgcGFja2V0cyBwZXIgZGVzdGluYXRpb24KICoKICogKEMpIDIwMDMtMjAwNCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KICoKICogRGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIHdhcyBmdW5kZWQgYnkgQXN0YXJvIEFHLCBodHRwOi8vd3d3LmFzdGFyby5jb20vCiAqCiAqIEJhc2VkIG9uIGlwdF9saW1pdC5jIGJ5CiAqIErpcvRtZSBkZSBWaXZpZSAgIDxkZXZpdmllQGluZm8uZW5zZXJiLnUtYm9yZGVhdXguZnI+CiAqIEhlcnbpIEV5Y2hlbm5lICAgIDxydkB3YWxsZmlyZS5vcmc+CiAqIAogKiBFcnJvciBjb3JlY3Rpb25zIGJ5IG5tYWx5a2hAYmlsaW0uY29tICgyMi4wMS4yMDA1KQogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGdldG9wdC5oPgojaW5jbHVkZSA8eHRhYmxlcy5oPgojaW5jbHVkZSA8c3RkZGVmLmg+CiNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9oYXNobGltaXQuaD4KCiNkZWZpbmUgWFRfSEFTSExJTUlUX0JVUlNUCTUKCi8qIG1pbGlzZWNvbmRzICovCiNkZWZpbmUgWFRfSEFTSExJTUlUX0dDSU5URVJWQUwJMTAwMAojZGVmaW5lIFhUX0hBU0hMSU1JVF9FWFBJUkUJMTAwMDAKCi8qIEZ1bmN0aW9uIHdoaWNoIHByaW50cyBvdXQgdXNhZ2UgbWVzc2FnZS4gKi8Kc3RhdGljIHZvaWQKaGVscCh2b2lkKQp7CglwcmludGYoCiJoYXNobGltaXQgdiVzIG9wdGlvbnM6XG4iCiItLWhhc2hsaW1pdCA8YXZnPgkJbWF4IGF2ZXJhZ2UgbWF0Y2ggcmF0ZVxuIgoiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUGFja2V0cyBwZXIgc2Vjb25kIHVubGVzcyBmb2xsb3dlZCBieSBcbiIKIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3NlYyAvbWludXRlIC9ob3VyIC9kYXkgcG9zdGZpeGVzXVxuIgoiLS1oYXNobGltaXQtbW9kZSA8bW9kZT4JCW1vZGUgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZlxuIgoiCQkJCQlkc3RpcCxzcmNpcCxkc3Rwb3J0LHNyY3BvcnRcbiIKIi0taGFzaGxpbWl0LW5hbWUgPG5hbWU+CQluYW1lIGZvciAvcHJvYy9uZXQvaXB0X2hhc2hsaW1pdC9cbiIKIlstLWhhc2hsaW1pdC1idXJzdCA8bnVtPl0JbnVtYmVyIHRvIG1hdGNoIGluIGEgYnVyc3QsIGRlZmF1bHQgJXVcbiIKIlstLWhhc2hsaW1pdC1odGFibGUtc2l6ZSA8bnVtPl0JbnVtYmVyIG9mIGhhc2h0YWJsZSBidWNrZXRzXG4iCiJbLS1oYXNobGltaXQtaHRhYmxlLW1heCA8bnVtPl0JbnVtYmVyIG9mIGhhc2h0YWJsZSBlbnRyaWVzXG4iCiJbLS1oYXNobGltaXQtaHRhYmxlLWdjaW50ZXJ2YWxdCWludGVydmFsIGJldHdlZW4gZ2FyYmFnZSBjb2xsZWN0aW9uIHJ1bnNcbiIKIlstLWhhc2hsaW1pdC1odGFibGUtZXhwaXJlXQlhZnRlciB3aGljaCB0aW1lIGFyZSBpZGxlIGVudHJpZXMgZXhwaXJlZD9cbiIKIlxuIiwgSVBUQUJMRVNfVkVSU0lPTiwgWFRfSEFTSExJTUlUX0JVUlNUKTsKfQoKc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0c1tdID0gewoJeyAiaGFzaGxpbWl0IiwgMSwgMCwgJyUnIH0sCgl7ICJoYXNobGltaXQtYnVyc3QiLCAxLCAwLCAnJCcgfSwKCXsgImhhc2hsaW1pdC1odGFibGUtc2l6ZSIsIDEsIDAsICcmJyB9LAoJeyAiaGFzaGxpbWl0LWh0YWJsZS1tYXgiLCAxLCAwLCAnKicgfSwKCXsgImhhc2hsaW1pdC1odGFibGUtZ2NpbnRlcnZhbCIsIDEsIDAsICcoJyB9LAoJeyAiaGFzaGxpbWl0LWh0YWJsZS1leHBpcmUiLCAxLCAwLCAnKScgfSwKCXsgImhhc2hsaW1pdC1tb2RlIiwgMSwgMCwgJ18nIH0sCgl7ICJoYXNobGltaXQtbmFtZSIsIDEsIDAsICciJyB9LAoJeyAwIH0KfTsKCnN0YXRpYwppbnQgcGFyc2VfcmF0ZShjb25zdCBjaGFyICpyYXRlLCB1X2ludDMyX3QgKnZhbCkKewoJY29uc3QgY2hhciAqZGVsaW07Cgl1X2ludDMyX3QgcjsKCXVfaW50MzJfdCBtdWx0ID0gMTsgIC8qIFNlY29uZHMgYnkgZGVmYXVsdC4gKi8KCglkZWxpbSA9IHN0cmNocihyYXRlLCAnLycpOwoJaWYgKGRlbGltKSB7CgkJaWYgKHN0cmxlbihkZWxpbSsxKSA9PSAwKQoJCQlyZXR1cm4gMDsKCgkJaWYgKHN0cm5jYXNlY21wKGRlbGltKzEsICJzZWNvbmQiLCBzdHJsZW4oZGVsaW0rMSkpID09IDApCgkJCW11bHQgPSAxOwoJCWVsc2UgaWYgKHN0cm5jYXNlY21wKGRlbGltKzEsICJtaW51dGUiLCBzdHJsZW4oZGVsaW0rMSkpID09IDApCgkJCW11bHQgPSA2MDsKCQllbHNlIGlmIChzdHJuY2FzZWNtcChkZWxpbSsxLCAiaG91ciIsIHN0cmxlbihkZWxpbSsxKSkgPT0gMCkKCQkJbXVsdCA9IDYwKjYwOwoJCWVsc2UgaWYgKHN0cm5jYXNlY21wKGRlbGltKzEsICJkYXkiLCBzdHJsZW4oZGVsaW0rMSkpID09IDApCgkJCW11bHQgPSAyNCo2MCo2MDsKCQllbHNlCgkJCXJldHVybiAwOwoJfQoJciA9IGF0b2kocmF0ZSk7CglpZiAoIXIpCgkJcmV0dXJuIDA7CgoJLyogVGhpcyB3b3VsZCBnZXQgbWFwcGVkIHRvIGluZmluaXRlICgxL2RheSBpcyBtaW5pbXVtIHRoZXkKICAgICAgICAgICBjYW4gc3BlY2lmeSwgc28gd2UncmUgb2sgYXQgdGhhdCBlbmQpLiAqLwoJaWYgKHIgLyBtdWx0ID4gWFRfSEFTSExJTUlUX1NDQUxFKQoJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sICJSYXRlIHRvbyBmYXN0IGAlcydcbiIsIHJhdGUpOwoKCSp2YWwgPSBYVF9IQVNITElNSVRfU0NBTEUgKiBtdWx0IC8gcjsKCXJldHVybiAxOwp9CgovKiBJbml0aWFsaXplIHRoZSBtYXRjaC4gKi8Kc3RhdGljIHZvaWQKaW5pdChzdHJ1Y3QgeHRfZW50cnlfbWF0Y2ggKm0sIHVuc2lnbmVkIGludCAqbmZjYWNoZSkKewoJc3RydWN0IHh0X2hhc2hsaW1pdF9pbmZvICpyID0gKHN0cnVjdCB4dF9oYXNobGltaXRfaW5mbyAqKW0tPmRhdGE7CgoJci0+Y2ZnLmJ1cnN0ID0gWFRfSEFTSExJTUlUX0JVUlNUOwoJci0+Y2ZnLmdjX2ludGVydmFsID0gWFRfSEFTSExJTUlUX0dDSU5URVJWQUw7CglyLT5jZmcuZXhwaXJlID0gWFRfSEFTSExJTUlUX0VYUElSRTsKCn0KCgovKiBQYXJzZSBhICdtb2RlJyBwYXJhbWV0ZXIgaW50byB0aGUgcmVxdWlyZWQgYml0bWFzayAqLwpzdGF0aWMgaW50IHBhcnNlX21vZGUoc3RydWN0IHh0X2hhc2hsaW1pdF9pbmZvICpyLCBjaGFyICpvcHRhcmcpCnsKCWNoYXIgKnRvazsKCWNoYXIgKmFyZyA9IHN0cmR1cChvcHRhcmcpOwoKCWlmICghYXJnKQoJCXJldHVybiAtMTsKCglyLT5jZmcubW9kZSA9IDA7CgoJZm9yICh0b2sgPSBzdHJ0b2soYXJnLCAiLHwiKTsKCSAgICAgdG9rOwoJICAgICB0b2sgPSBzdHJ0b2soTlVMTCwgIix8IikpIHsKCQlpZiAoIXN0cmNtcCh0b2ssICJkc3RpcCIpKQoJCQlyLT5jZmcubW9kZSB8PSBYVF9IQVNITElNSVRfSEFTSF9ESVA7CgkJZWxzZSBpZiAoIXN0cmNtcCh0b2ssICJzcmNpcCIpKQoJCQlyLT5jZmcubW9kZSB8PSBYVF9IQVNITElNSVRfSEFTSF9TSVA7CgkJZWxzZSBpZiAoIXN0cmNtcCh0b2ssICJzcmNwb3J0IikpCgkJCXItPmNmZy5tb2RlIHw9IFhUX0hBU0hMSU1JVF9IQVNIX1NQVDsKCQllbHNlIGlmICghc3RyY21wKHRvaywgImRzdHBvcnQiKSkKCQkJci0+Y2ZnLm1vZGUgfD0gWFRfSEFTSExJTUlUX0hBU0hfRFBUOwoJCWVsc2UgewoJCQlmcmVlKGFyZyk7CgkJCXJldHVybiAtMTsKCQl9Cgl9CglmcmVlKGFyZyk7CglyZXR1cm4gMDsKfQoKI2RlZmluZSBQQVJBTV9MSU1JVAkJMHgwMDAwMDAwMQojZGVmaW5lIFBBUkFNX0JVUlNUCQkweDAwMDAwMDAyCiNkZWZpbmUgUEFSQU1fTU9ERQkJMHgwMDAwMDAwNAojZGVmaW5lIFBBUkFNX05BTUUJCTB4MDAwMDAwMDgKI2RlZmluZSBQQVJBTV9TSVpFCQkweDAwMDAwMDEwCiNkZWZpbmUgUEFSQU1fTUFYCQkweDAwMDAwMDIwCiNkZWZpbmUgUEFSQU1fR0NJTlRFUlZBTAkweDAwMDAwMDQwCiNkZWZpbmUgUEFSQU1fRVhQSVJFCQkweDAwMDAwMDgwCgovKiBGdW5jdGlvbiB3aGljaCBwYXJzZXMgY29tbWFuZCBvcHRpb25zOyByZXR1cm5zIHRydWUgaWYgaXQKICAgYXRlIGFuIG9wdGlvbiAqLwpzdGF0aWMgaW50CnBhcnNlKGludCBjLCBjaGFyICoqYXJndiwgaW50IGludmVydCwgdW5zaWduZWQgaW50ICpmbGFncywKICAgICAgY29uc3Qgdm9pZCAqZW50cnksCiAgICAgIHVuc2lnbmVkIGludCAqbmZjYWNoZSwKICAgICAgc3RydWN0IHh0X2VudHJ5X21hdGNoICoqbWF0Y2gpCnsKCXN0cnVjdCB4dF9oYXNobGltaXRfaW5mbyAqciA9IAoJCQkoc3RydWN0IHh0X2hhc2hsaW1pdF9pbmZvICopKCptYXRjaCktPmRhdGE7Cgl1bnNpZ25lZCBpbnQgbnVtOwoKCXN3aXRjaChjKSB7CgljYXNlICclJzoKCQlpZiAoY2hlY2tfaW52ZXJzZShhcmd2W29wdGluZC0xXSwgJmludmVydCwgJm9wdGluZCwgMCkpIGJyZWFrOwoJCWlmICghcGFyc2VfcmF0ZShvcHRhcmcsICZyLT5jZmcuYXZnKSkKCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKCQkJCSAgICJiYWQgcmF0ZSBgJXMnIiwgb3B0YXJnKTsKCQkqZmxhZ3MgfD0gUEFSQU1fTElNSVQ7CgkJYnJlYWs7CgoJY2FzZSAnJCc6CgkJaWYgKGNoZWNrX2ludmVyc2UoYXJndltvcHRpbmQtMV0sICZpbnZlcnQsICZvcHRpbmQsIDApKSBicmVhazsKCQlpZiAoc3RyaW5nX3RvX251bWJlcihvcHRhcmcsIDAsIDEwMDAwLCAmbnVtKSA9PSAtMSkKCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKCQkJCSAgICJiYWQgLS1oYXNobGltaXQtYnVyc3QgYCVzJyIsIG9wdGFyZyk7CgkJci0+Y2ZnLmJ1cnN0ID0gbnVtOwoJCSpmbGFncyB8PSBQQVJBTV9CVVJTVDsKCQlicmVhazsKCWNhc2UgJyYnOgoJCWlmIChjaGVja19pbnZlcnNlKGFyZ3Zbb3B0aW5kLTFdLCAmaW52ZXJ0LCAmb3B0aW5kLCAwKSkgYnJlYWs7CgkJaWYgKHN0cmluZ190b19udW1iZXIob3B0YXJnLCAwLCAweGZmZmZmZmZmLCAmbnVtKSA9PSAtMSkKCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKCQkJCSJiYWQgLS1oYXNobGltaXQtaHRhYmxlLXNpemU6IGAlcyciLCBvcHRhcmcpOwoJCXItPmNmZy5zaXplID0gbnVtOwoJCSpmbGFncyB8PSBQQVJBTV9TSVpFOwoJCWJyZWFrOwoJY2FzZSAnKic6CgkJaWYgKGNoZWNrX2ludmVyc2UoYXJndltvcHRpbmQtMV0sICZpbnZlcnQsICZvcHRpbmQsIDApKSBicmVhazsKCQlpZiAoc3RyaW5nX3RvX251bWJlcihvcHRhcmcsIDAsIDB4ZmZmZmZmZmYsICZudW0pID09IC0xKQoJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAoJCQkJImJhZCAtLWhhc2hsaW1pdC1odGFibGUtbWF4OiBgJXMnIiwgb3B0YXJnKTsKCQlyLT5jZmcubWF4ID0gbnVtOwoJCSpmbGFncyB8PSBQQVJBTV9NQVg7CgkJYnJlYWs7CgljYXNlICcoJzoKCQlpZiAoY2hlY2tfaW52ZXJzZShhcmd2W29wdGluZC0xXSwgJmludmVydCwgJm9wdGluZCwgMCkpIGJyZWFrOwoJCWlmIChzdHJpbmdfdG9fbnVtYmVyKG9wdGFyZywgMCwgMHhmZmZmZmZmZiwgJm51bSkgPT0gLTEpCgkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCgkJCQkiYmFkIC0taGFzaGxpbWl0LWh0YWJsZS1nY2ludGVydmFsOiBgJXMnIiwgCgkJCQlvcHRhcmcpOwoJCS8qIEZJWE1FOiBub3QgSFogZGVwZW5kZW50ISEgKi8KCQlyLT5jZmcuZ2NfaW50ZXJ2YWwgPSBudW07CgkJKmZsYWdzIHw9IFBBUkFNX0dDSU5URVJWQUw7CgkJYnJlYWs7CgljYXNlICcpJzoKCQlpZiAoY2hlY2tfaW52ZXJzZShhcmd2W29wdGluZC0xXSwgJmludmVydCwgJm9wdGluZCwgMCkpIGJyZWFrOwoJCWlmIChzdHJpbmdfdG9fbnVtYmVyKG9wdGFyZywgMCwgMHhmZmZmZmZmZiwgJm51bSkgPT0gLTEpCgkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCgkJCQkiYmFkIC0taGFzaGxpbWl0LWh0YWJsZS1leHBpcmU6IGAlcyciLCBvcHRhcmcpOwoJCS8qIEZJWE1FOiBub3QgSFogZGVwZW5kZW50ICovCgkJci0+Y2ZnLmV4cGlyZSA9IG51bTsKCQkqZmxhZ3MgfD0gUEFSQU1fRVhQSVJFOwoJCWJyZWFrOwoJY2FzZSAnXyc6CgkJaWYgKGNoZWNrX2ludmVyc2UoYXJndltvcHRpbmQtMV0sICZpbnZlcnQsICZvcHRpbmQsIDApKSBicmVhazsKCQlpZiAocGFyc2VfbW9kZShyLCBvcHRhcmcpIDwgMCkKCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwgCgkJCQkgICAiYmFkIC0taGFzaGxpbWl0LW1vZGU6IGAlcydcbiIsIG9wdGFyZyk7CgkJKmZsYWdzIHw9IFBBUkFNX01PREU7CgkJYnJlYWs7CgljYXNlICciJzoKCQlpZiAoY2hlY2tfaW52ZXJzZShhcmd2W29wdGluZC0xXSwgJmludmVydCwgJm9wdGluZCwgMCkpIGJyZWFrOwoJCWlmIChzdHJsZW4ob3B0YXJnKSA9PSAwKQoJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLCAiWmVyby1sZW5ndGggbmFtZT8iKTsKCQlzdHJuY3B5KHItPm5hbWUsIG9wdGFyZywgc2l6ZW9mKHItPm5hbWUpKTsKCQkqZmxhZ3MgfD0gUEFSQU1fTkFNRTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIDA7Cgl9CgoJaWYgKGludmVydCkKCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAoJCQkgICAiaGFzaGxpbWl0IGRvZXMgbm90IHN1cHBvcnQgaW52ZXJ0Iik7CgoJcmV0dXJuIDE7Cn0KCi8qIEZpbmFsIGNoZWNrOyBub3RoaW5nLiAqLwpzdGF0aWMgdm9pZCBmaW5hbF9jaGVjayh1bnNpZ25lZCBpbnQgZmxhZ3MpCnsKCWlmICghKGZsYWdzICYgUEFSQU1fTElNSVQpKQoJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCgkJCQkiWW91IGhhdmUgdG8gc3BlY2lmeSAtLWhhc2hsaW1pdCIpOwoJaWYgKCEoZmxhZ3MgJiBQQVJBTV9NT0RFKSkKCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAoJCQkJIllvdSBoYXZlIHRvIHNwZWNpZnkgLS1oYXNobGltaXQtbW9kZSIpOwoJaWYgKCEoZmxhZ3MgJiBQQVJBTV9OQU1FKSkKCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAoJCQkJIllvdSBoYXZlIHRvIHNwZWNpZnkgLS1oYXNobGltaXQtbmFtZSIpOwp9CgpzdGF0aWMgc3RydWN0IHJhdGVzCnsKCWNvbnN0IGNoYXIgKm5hbWU7Cgl1X2ludDMyX3QgbXVsdDsKfSByYXRlc1tdID0geyB7ICJkYXkiLCBYVF9IQVNITElNSVRfU0NBTEUqMjQqNjAqNjAgfSwKCSAgICAgIHsgImhvdXIiLCBYVF9IQVNITElNSVRfU0NBTEUqNjAqNjAgfSwKCSAgICAgIHsgIm1pbiIsIFhUX0hBU0hMSU1JVF9TQ0FMRSo2MCB9LAoJICAgICAgeyAic2VjIiwgWFRfSEFTSExJTUlUX1NDQUxFIH0gfTsKCnN0YXRpYyB2b2lkIHByaW50X3JhdGUodV9pbnQzMl90IHBlcmlvZCkKewoJdW5zaWduZWQgaW50IGk7CgoJZm9yIChpID0gMTsgaSA8IHNpemVvZihyYXRlcykvc2l6ZW9mKHN0cnVjdCByYXRlcyk7IGkrKykgewoJCWlmIChwZXJpb2QgPiByYXRlc1tpXS5tdWx0CiAgICAgICAgICAgIHx8IHJhdGVzW2ldLm11bHQvcGVyaW9kIDwgcmF0ZXNbaV0ubXVsdCVwZXJpb2QpCgkJCWJyZWFrOwoJfQoKCXByaW50ZigiJXUvJXMgIiwgcmF0ZXNbaS0xXS5tdWx0IC8gcGVyaW9kLCByYXRlc1tpLTFdLm5hbWUpOwp9CgpzdGF0aWMgdm9pZCBwcmludF9tb2RlKGNvbnN0IHN0cnVjdCB4dF9oYXNobGltaXRfaW5mbyAqciwgY2hhciBzZXBhcmF0b3IpCnsKCWludCBwcmV2bW9kZSA9IDA7CgoJaWYgKHItPmNmZy5tb2RlICYgWFRfSEFTSExJTUlUX0hBU0hfU0lQKSB7CgkJaWYgKHByZXZtb2RlKQoJCQlwdXRjaGFyKHNlcGFyYXRvcik7CgkJZnB1dHMoInNyY2lwIiwgc3Rkb3V0KTsKCQlwcmV2bW9kZSA9IDE7Cgl9CglpZiAoci0+Y2ZnLm1vZGUgJiBYVF9IQVNITElNSVRfSEFTSF9TUFQpIHsKCQlpZiAocHJldm1vZGUpCgkJCXB1dGNoYXIoc2VwYXJhdG9yKTsKCQlmcHV0cygic3JjcG9ydCIsIHN0ZG91dCk7CgkJcHJldm1vZGUgPSAxOwoJfQoJaWYgKHItPmNmZy5tb2RlICYgWFRfSEFTSExJTUlUX0hBU0hfRElQKSB7CgkJaWYgKHByZXZtb2RlKQoJCQlwdXRjaGFyKHNlcGFyYXRvcik7CgkJZnB1dHMoImRzdGlwIiwgc3Rkb3V0KTsKCQlwcmV2bW9kZSA9IDE7Cgl9CglpZiAoci0+Y2ZnLm1vZGUgJiBYVF9IQVNITElNSVRfSEFTSF9EUFQpIHsKCQlpZiAocHJldm1vZGUpCgkJCXB1dGNoYXIoc2VwYXJhdG9yKTsKCQlmcHV0cygiZHN0cG9ydCIsIHN0ZG91dCk7Cgl9CglwdXRjaGFyKCcgJyk7Cn0KCi8qIFByaW50cyBvdXQgdGhlIG1hdGNoaW5mby4gKi8Kc3RhdGljIHZvaWQKcHJpbnQoY29uc3Qgdm9pZCAqaXAsCiAgICAgIGNvbnN0IHN0cnVjdCB4dF9lbnRyeV9tYXRjaCAqbWF0Y2gsCiAgICAgIGludCBudW1lcmljKQp7CglzdHJ1Y3QgeHRfaGFzaGxpbWl0X2luZm8gKnIgPSAKCQkoc3RydWN0IHh0X2hhc2hsaW1pdF9pbmZvICopbWF0Y2gtPmRhdGE7CglmcHV0cygibGltaXQ6IGF2ZyAiLCBzdGRvdXQpOyBwcmludF9yYXRlKHItPmNmZy5hdmcpOwoJcHJpbnRmKCJidXJzdCAldSAiLCByLT5jZmcuYnVyc3QpOwoJZnB1dHMoIm1vZGUgIiwgc3Rkb3V0KTsKCXByaW50X21vZGUociwgJy0nKTsKCWlmIChyLT5jZmcuc2l6ZSkKCQlwcmludGYoImh0YWJsZS1zaXplICV1ICIsIHItPmNmZy5zaXplKTsKCWlmIChyLT5jZmcubWF4KQoJCXByaW50ZigiaHRhYmxlLW1heCAldSAiLCByLT5jZmcubWF4KTsKCWlmIChyLT5jZmcuZ2NfaW50ZXJ2YWwgIT0gWFRfSEFTSExJTUlUX0dDSU5URVJWQUwpCgkJcHJpbnRmKCJodGFibGUtZ2NpbnRlcnZhbCAldSAiLCByLT5jZmcuZ2NfaW50ZXJ2YWwpOwoJaWYgKHItPmNmZy5leHBpcmUgIT0gWFRfSEFTSExJTUlUX0VYUElSRSkKCQlwcmludGYoImh0YWJsZS1leHBpcmUgJXUgIiwgci0+Y2ZnLmV4cGlyZSk7Cn0KCi8qIEZJWE1FOiBNYWtlIG1pbmltYWxpc3Q6IG9ubHkgcHJpbnQgcmF0ZSBpZiBub3QgZGVmYXVsdCAtLVJSICovCnN0YXRpYyB2b2lkIHNhdmUoY29uc3Qgdm9pZCAqaXAsIGNvbnN0IHN0cnVjdCB4dF9lbnRyeV9tYXRjaCAqbWF0Y2gpCnsKCXN0cnVjdCB4dF9oYXNobGltaXRfaW5mbyAqciA9IAoJCShzdHJ1Y3QgeHRfaGFzaGxpbWl0X2luZm8gKiltYXRjaC0+ZGF0YTsKCglmcHV0cygiLS1oYXNobGltaXQgIiwgc3Rkb3V0KTsgcHJpbnRfcmF0ZShyLT5jZmcuYXZnKTsKCWlmIChyLT5jZmcuYnVyc3QgIT0gWFRfSEFTSExJTUlUX0JVUlNUKQoJCXByaW50ZigiLS1oYXNobGltaXQtYnVyc3QgJXUgIiwgci0+Y2ZnLmJ1cnN0KTsKCglmcHV0cygiLS1oYXNobGltaXQtbW9kZSAiLCBzdGRvdXQpOwoJcHJpbnRfbW9kZShyLCAnLCcpOwoJCglwcmludGYoIi0taGFzaGxpbWl0LW5hbWUgJXMgIiwgci0+bmFtZSk7CgoJaWYgKHItPmNmZy5zaXplKQoJCXByaW50ZigiLS1oYXNobGltaXQtaHRhYmxlLXNpemUgJXUgIiwgci0+Y2ZnLnNpemUpOwoJaWYgKHItPmNmZy5tYXgpCgkJcHJpbnRmKCItLWhhc2hsaW1pdC1odGFibGUtbWF4ICV1ICIsIHItPmNmZy5tYXgpOwoJaWYgKHItPmNmZy5nY19pbnRlcnZhbCAhPSBYVF9IQVNITElNSVRfR0NJTlRFUlZBTCkKCQlwcmludGYoIi0taGFzaGxpbWl0LWh0YWJsZS1nY2ludGVydmFsICV1Iiwgci0+Y2ZnLmdjX2ludGVydmFsKTsKCWlmIChyLT5jZmcuZXhwaXJlICE9IFhUX0hBU0hMSU1JVF9FWFBJUkUpCgkJcHJpbnRmKCItLWhhc2hsaW1pdC1odGFibGUtZXhwaXJlICV1ICIsIHItPmNmZy5leHBpcmUpOwp9CgpzdGF0aWMgc3RydWN0IHh0YWJsZXNfbWF0Y2ggaGFzaGxpbWl0ID0gewoJLmZhbWlseQkJPSBBRl9JTkVULAoJLm5hbWUJCT0gImhhc2hsaW1pdCIsCgkudmVyc2lvbgk9IElQVEFCTEVTX1ZFUlNJT04sCgkuc2l6ZQkJPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X2hhc2hsaW1pdF9pbmZvKSksCgkudXNlcnNwYWNlc2l6ZQk9IG9mZnNldG9mKHN0cnVjdCB4dF9oYXNobGltaXRfaW5mbywgaGluZm8pLAoJLmhlbHAJCT0gJmhlbHAsCgkuaW5pdAkJPSAmaW5pdCwKCS5wYXJzZQkJPSAmcGFyc2UsCgkuZmluYWxfY2hlY2sJPSAmZmluYWxfY2hlY2ssCgkucHJpbnQJCT0gJnByaW50LAoJLnNhdmUJCT0gJnNhdmUsCgkuZXh0cmFfb3B0cwk9IG9wdHMsCn07CgpzdGF0aWMgc3RydWN0IHh0YWJsZXNfbWF0Y2ggaGFzaGxpbWl0NiA9IHsKCS5mYW1pbHkJCT0gQUZfSU5FVDYsCgkubmFtZQkJPSAiaGFzaGxpbWl0IiwKCS52ZXJzaW9uCT0gSVBUQUJMRVNfVkVSU0lPTiwKCS5zaXplCQk9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfaGFzaGxpbWl0X2luZm8pKSwKCS51c2Vyc3BhY2VzaXplCT0gb2Zmc2V0b2Yoc3RydWN0IHh0X2hhc2hsaW1pdF9pbmZvLCBoaW5mbyksCgkuaGVscAkJPSAmaGVscCwKCS5pbml0CQk9ICZpbml0LAoJLnBhcnNlCQk9ICZwYXJzZSwKCS5maW5hbF9jaGVjawk9ICZmaW5hbF9jaGVjaywKCS5wcmludAkJPSAmcHJpbnQsCgkuc2F2ZQkJPSAmc2F2ZSwKCS5leHRyYV9vcHRzCT0gb3B0cywKfTsKCnZvaWQgX2luaXQodm9pZCkKewoJeHRhYmxlc19yZWdpc3Rlcl9tYXRjaCgmaGFzaGxpbWl0KTsKCXh0YWJsZXNfcmVnaXN0ZXJfbWF0Y2goJmhhc2hsaW1pdDYpOwp9Cg==