LyoKICogbmZzbW91bnQuYyAtLSBMaW51eCBORlMgbW91bnQKICogQ29weXJpZ2h0IChDKSAxOTkzIFJpY2sgU2xhZGtleSA8anJzQHdvcmxkLnN0ZC5jb20+CiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKICogYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFdlZCBGZWIgIDggMTI6NTE6NDggMTk5NSwgYmlyb0B5Z2dkcmFzaWwuY29tIChSb3NzIEJpcm8pOiBhbGxvdyBhbGwgcG9ydAogKiBudW1iZXJzIHRvIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgogKgogKiBGcmksIDggTWFyIDE5OTYgMTg6MDE6MzksIFN3ZW4gVGh1ZW1tbGVyIDxzd2VuQHVuaS1wYWRlcmJvcm4uZGU+OgogKiBPbWl0IHRoZSBjYWxsIHRvIGNvbm5lY3QoKSBmb3IgTGludXggdmVyc2lvbiAxLjMuMTEgb3IgbGF0ZXIuCiAqCiAqIFdlZCBPY3QgIDEgMjM6NTU6MjggMTk5NzogRGljayBTdHJlZWZsYW5kIDxkaWNrX3N0cmVlZmxhbmRAdGFza2luZy5jb20+CiAqIEltcGxlbWVudGVkIHRoZSAiYmciLCAiZmciIGFuZCAicmV0cnkiIG1vdW50IG9wdGlvbnMgZm9yIE5GUy4KICoKICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQG1pc2llay5ldS5vcmc+CiAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICogCiAqLwoKLyoKICogbmZzbW91bnQuYyx2IDEuMS4xLjEgMTk5My8xMS8xOCAwODo0MDo1MSBqcnMgRXhwCiAqLwoKI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPG5ldGRiLmg+CiNpbmNsdWRlIDxycGMvcnBjLmg+CiNpbmNsdWRlIDxycGMvcG1hcF9wcm90Lmg+CiNpbmNsdWRlIDxycGMvcG1hcF9jbG50Lmg+CiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNpbmNsdWRlIDxzeXMvdGltZS5oPgojaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNpbmNsdWRlIDxhcnBhL2luZXQuaD4KCiNpbmNsdWRlICJuZnNtb3VudC5oIgoKI2luY2x1ZGUgPGxpbnV4L25mcy5oPgovKiB3ZSBzdXBwb3NlIHRoYXQgbGliYy1kZXYgaXMgcHJvdmlkaW5nIE5GU3YzIGhlYWRlcnMgKGtlcm5lbCA+PSAyLjIpICovCiNpbmNsdWRlIDxsaW51eC9uZnNfbW91bnQuaD4KCiNkZWZpbmUgXwojZGVmaW5lIEhBVkVfaW5ldF9hdG9uCiNkZWZpbmUgTVNfUkVNT1VOVAkzMgkvKiBBbHRlciBmbGFncyBvZiBhIG1vdW50ZWQgRlMgKi8KI2RlZmluZSBzbG9wcHkgMAojZGVmaW5lIEVYX0ZBSUwgMQojZGVmaW5lIEVYX0JHIDEKI2RlZmluZSB4c3RyZHVwIHN0cmR1cAojZGVmaW5lIHhzdHJuZHVwIHN0cm5kdXAKCgpzdGF0aWMgY2hhciAqbmZzX3N0cmVycm9yKGludCBzdGF0KTsKCiNkZWZpbmUgTUFLRV9WRVJTSU9OKHAscSxyKQkoNjU1MzYqKHApICsgMjU2KihxKSArIChyKSkKCnN0YXRpYyBpbnQKbGludXhfdmVyc2lvbl9jb2RlKHZvaWQpIHsKCXN0cnVjdCB1dHNuYW1lIG15X3V0c25hbWU7CglpbnQgcCwgcSwgcjsKCglpZiAodW5hbWUoJm15X3V0c25hbWUpID09IDApIHsKCQlwID0gYXRvaShzdHJ0b2sobXlfdXRzbmFtZS5yZWxlYXNlLCAiLiIpKTsKCQlxID0gYXRvaShzdHJ0b2soTlVMTCwgIi4iKSk7CgkJciA9IGF0b2koc3RydG9rKE5VTEwsICIuIikpOwoJCXJldHVybiBNQUtFX1ZFUlNJT04ocCxxLHIpOwoJfQoJcmV0dXJuIDA7Cn0KCi8qCiAqIG5mc19tb3VudF92ZXJzaW9uIGFjY29yZGluZyB0byB0aGUga2VybmVsIHNvdXJjZXMgc2VlbiBhdCBjb21waWxlIHRpbWUuCiAqLwpzdGF0aWMgaW50IG5mc19tb3VudF92ZXJzaW9uID0gTkZTX01PVU5UX1ZFUlNJT047CgovKgogKiBVbmZvcnR1bmF0ZWx5LCB0aGUga2VybmVsIHByaW50cyBhbm5veWluZyBjb25zb2xlIG1lc3NhZ2VzCiAqIGluIGNhc2Ugb2YgYW4gdW5leHBlY3RlZCBuZnMgbW91bnQgdmVyc2lvbiAoaW5zdGVhZCBvZgogKiBqdXN0IHJldHVybmluZyBzb21lIGVycm9yKS4gIFRoZXJlZm9yZSB3ZSdsbCBoYXZlIHRvIHRyeQogKiBhbmQgZmlndXJlIG91dCB3aGF0IHZlcnNpb24gdGhlIGtlcm5lbCBleHBlY3RzLgogKgogKiBWYXJpYWJsZXM6CiAqCUtFUk5FTF9ORlNfTU9VTlRfVkVSU0lPTjoga2VybmVsIHNvdXJjZXMgYXQgY29tcGlsZSB0aW1lCiAqCU5GU19NT1VOVF9WRVJTSU9OOiB0aGVzZSBuZnNtb3VudCBzb3VyY2VzIGF0IGNvbXBpbGUgdGltZQogKgluZnNfbW91bnRfdmVyc2lvbjogdmVyc2lvbiB0aGlzIHNvdXJjZSBhbmQgcnVubmluZyBrZXJuZWwgY2FuIGhhbmRsZQogKi8Kc3RhdGljIHZvaWQKZmluZF9rZXJuZWxfbmZzX21vdW50X3ZlcnNpb24odm9pZCkgewoJaW50IGtlcm5lbF92ZXJzaW9uID0gbGludXhfdmVyc2lvbl9jb2RlKCk7CgoJaWYgKGtlcm5lbF92ZXJzaW9uKSB7CgkgICAgIGlmIChrZXJuZWxfdmVyc2lvbiA8IE1BS0VfVkVSU0lPTigyLDEsMzIpKQoJCSAgbmZzX21vdW50X3ZlcnNpb24gPSAxOwoJICAgICBlbHNlCgkJICBuZnNfbW91bnRfdmVyc2lvbiA9IDM7Cgl9CglpZiAobmZzX21vdW50X3ZlcnNpb24gPiBORlNfTU9VTlRfVkVSU0lPTikKCSAgICAgbmZzX21vdW50X3ZlcnNpb24gPSBORlNfTU9VTlRfVkVSU0lPTjsKfQoKaW50IG5mc21vdW50KGNvbnN0IGNoYXIgKnNwZWMsIGNvbnN0IGNoYXIgKm5vZGUsIHVuc2lnbmVkIGxvbmcgKmZsYWdzLAoJICAgICBjaGFyICoqZXh0cmFfb3B0cywgY2hhciAqKm1vdW50X29wdHMsIGludCBydW5uaW5nX2JnKQp7CglzdGF0aWMgY2hhciAqcHJldl9iZ19ob3N0OwoJY2hhciBob3N0ZGlyWzEwMjRdOwoJQ0xJRU5UICptY2xpZW50OwoJY2hhciAqaG9zdG5hbWU7CgljaGFyICpkaXJuYW1lOwoJY2hhciAqb2xkX29wdHM7CgljaGFyICptb3VudGhvc3Q9TlVMTDsKCWNoYXIgbmV3X29wdHNbMTAyNF07CglmaGFuZGxlIHJvb3RfZmhhbmRsZTsKCXN0cnVjdCB0aW1ldmFsIHRvdGFsX3RpbWVvdXQ7CgllbnVtIGNsbnRfc3RhdCBjbG50X3N0YXQ7CglzdGF0aWMgc3RydWN0IG5mc19tb3VudF9kYXRhIGRhdGE7CgljaGFyICpvcHQsICpvcHRlcTsKCWludCB2YWw7CglzdHJ1Y3QgaG9zdGVudCAqaHA7CglzdHJ1Y3Qgc29ja2FkZHJfaW4gc2VydmVyX2FkZHI7CglzdHJ1Y3Qgc29ja2FkZHJfaW4gbW91bnRfc2VydmVyX2FkZHI7CglpbnQgbXNvY2ssIGZzb2NrOwoJc3RydWN0IHRpbWV2YWwgcmV0cnlfdGltZW91dDsKCXN0cnVjdCBmaHN0YXR1cyBzdGF0dXM7CglzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwoJY2hhciAqczsKCWludCBwb3J0OwoJaW50IG1vdW50cG9ydDsKCWludCBiZzsKCWludCBzb2Z0OwoJaW50IGludHI7CglpbnQgcG9zaXg7CglpbnQgbm9jdG87CglpbnQgbm9hYzsKCWludCBub2xvY2s7CglpbnQgcmV0cnk7CglpbnQgdGNwOwoJaW50IG1vdW50cHJvZzsKCWludCBtb3VudHZlcnM7CglpbnQgbmZzcHJvZzsKCWludCBuZnN2ZXJzOwoJaW50IHJldHZhbDsKCXRpbWVfdCB0OwoJdGltZV90IHByZXZ0OwoJdGltZV90IHRpbWVvdXQ7CgoJZmluZF9rZXJuZWxfbmZzX21vdW50X3ZlcnNpb24oKTsKCglyZXR2YWwgPSBFWF9GQUlMOwoJbXNvY2sgPSBmc29jayA9IC0xOwoJbWNsaWVudCA9IE5VTEw7CglpZiAoc3RybGVuKHNwZWMpID49IHNpemVvZihob3N0ZGlyKSkgewoJCWZwcmludGYoc3RkZXJyLCBfKCJtb3VudDogIgoJCQkiZXhjZXNzaXZlbHkgbG9uZyBob3N0OmRpciBhcmd1bWVudFxuIikpOwoJCWdvdG8gZmFpbDsKCX0KCXN0cmNweShob3N0ZGlyLCBzcGVjKTsKCWlmICgocyA9IHN0cmNocihob3N0ZGlyLCAnOicpKSkgewoJCWhvc3RuYW1lID0gaG9zdGRpcjsKCQlkaXJuYW1lID0gcyArIDE7CgkJKnMgPSAnXDAnOwoJCS8qIElnbm9yZSBhbGwgYnV0IGZpcnN0IGhvc3RuYW1lIGluIHJlcGxpY2F0ZWQgbW91bnRzCgkJICAgdW50aWwgdGhleSBjYW4gYmUgZnVsbHkgc3VwcG9ydGVkLiAobWFja0BzZ2kuY29tKSAqLwoJCWlmICgocyA9IHN0cmNocihob3N0ZGlyLCAnLCcpKSkgewoJCQkqcyA9ICdcMCc7CgkJCWZwcmludGYoc3RkZXJyLCBfKCJtb3VudDogd2FybmluZzogIgoJCQkJIm11bHRpcGxlIGhvc3RuYW1lcyBub3Qgc3VwcG9ydGVkXG4iKSk7CgkJfQoJfSBlbHNlIHsKCQlmcHJpbnRmKHN0ZGVyciwgXygibW91bnQ6ICIKCQkJImRpcmVjdG9yeSB0byBtb3VudCBub3QgaW4gaG9zdDpkaXIgZm9ybWF0XG4iKSk7CgkJZ290byBmYWlsOwoJfQoKCXNlcnZlcl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwojaWZkZWYgSEFWRV9pbmV0X2F0b24KCWlmICghaW5ldF9hdG9uKGhvc3RuYW1lLCAmc2VydmVyX2FkZHIuc2luX2FkZHIpKQojZW5kaWYKCXsKCQlpZiAoKGhwID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZSkpID09IE5VTEwpIHsKCQkJZnByaW50ZihzdGRlcnIsIF8oIm1vdW50OiBjYW4ndCBnZXQgYWRkcmVzcyBmb3IgJXNcbiIpLAoJCQkJaG9zdG5hbWUpOwoJCQlnb3RvIGZhaWw7CgkJfSBlbHNlIHsKCQkJaWYgKGhwLT5oX2xlbmd0aCA+IHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpIHsKCQkJCWZwcmludGYoc3RkZXJyLAoJCQkJCV8oIm1vdW50OiBnb3QgYmFkIGhwLT5oX2xlbmd0aFxuIikpOwoJCQkJaHAtPmhfbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKCQkJfQoJCQltZW1jcHkoJnNlcnZlcl9hZGRyLnNpbl9hZGRyLAoJCQkgICAgICAgaHAtPmhfYWRkciwgaHAtPmhfbGVuZ3RoKTsKCQl9Cgl9CgoJbWVtY3B5ICgmbW91bnRfc2VydmVyX2FkZHIsICZzZXJ2ZXJfYWRkciwgc2l6ZW9mIChtb3VudF9zZXJ2ZXJfYWRkcikpOwoKCS8qIGFkZCBJUCBhZGRyZXNzIHRvIG10YWIgb3B0aW9ucyBmb3IgdXNlIHdoZW4gdW5tb3VudGluZyAqLwoKCXMgPSBpbmV0X250b2Eoc2VydmVyX2FkZHIuc2luX2FkZHIpOwoJb2xkX29wdHMgPSAqZXh0cmFfb3B0czsKCWlmICghb2xkX29wdHMpCgkJb2xkX29wdHMgPSAiIjsKCWlmIChzdHJsZW4ob2xkX29wdHMpICsgc3RybGVuKHMpICsgMTAgPj0gc2l6ZW9mKG5ld19vcHRzKSkgewoJCWZwcmludGYoc3RkZXJyLCBfKCJtb3VudDogIgoJCQkiZXhjZXNzaXZlbHkgbG9uZyBvcHRpb24gYXJndW1lbnRcbiIpKTsKCQlnb3RvIGZhaWw7Cgl9CglzcHJpbnRmKG5ld19vcHRzLCAiJXMlc2FkZHI9JXMiLAoJCW9sZF9vcHRzLCAqb2xkX29wdHMgPyAiLCIgOiAiIiwgcyk7CgkqZXh0cmFfb3B0cyA9IHhzdHJkdXAobmV3X29wdHMpOwoKCS8qIFNldCBkZWZhdWx0IG9wdGlvbnMuCgkgKiByc2l6ZS93c2l6ZSAoYW5kIGJzaXplLCBmb3IgdmVyID49IDMpIGFyZSBsZWZ0IDAgaW4gb3JkZXIgdG8KCSAqIGxldCB0aGUga2VybmVsIGRlY2lkZS4KCSAqIHRpbWVvIGlzIGZpbGxlZCBpbiBhZnRlciB3ZSBrbm93IHdoZXRoZXIgaXQnbGwgYmUgVENQIG9yIFVEUC4gKi8KCW1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKCWRhdGEucmV0cmFucwk9IDM7CglkYXRhLmFjcmVnbWluCT0gMzsKCWRhdGEuYWNyZWdtYXgJPSA2MDsKCWRhdGEuYWNkaXJtaW4JPSAzMDsKCWRhdGEuYWNkaXJtYXgJPSA2MDsKI2lmIE5GU19NT1VOVF9WRVJTSU9OID49IDIKCWRhdGEubmFtbGVuCT0gTkFNRV9NQVg7CiNlbmRpZgoKCWJnID0gMDsKCXNvZnQgPSAwOwoJaW50ciA9IDA7Cglwb3NpeCA9IDA7Cglub2N0byA9IDA7Cglub2xvY2sgPSAwOwoJbm9hYyA9IDA7CglyZXRyeSA9IDEwMDAwOwkJLyogMTAwMDAgbWludXRlcyB+IDEgd2VlayAqLwoJdGNwID0gMDsKCgltb3VudHByb2cgPSBNT1VOVFBST0c7Cgltb3VudHZlcnMgPSBNT1VOVFZFUlM7Cglwb3J0ID0gMDsKCW1vdW50cG9ydCA9IDA7CgluZnNwcm9nID0gTkZTX1BST0dSQU07CgluZnN2ZXJzID0gTkZTX1ZFUlNJT047CgoJLyogcGFyc2Ugb3B0aW9ucyAqLwoKCWZvciAob3B0ID0gc3RydG9rKG9sZF9vcHRzLCAiLCIpOyBvcHQ7IG9wdCA9IHN0cnRvayhOVUxMLCAiLCIpKSB7CgkJaWYgKChvcHRlcSA9IHN0cmNocihvcHQsICc9JykpKSB7CgkJCXZhbCA9IGF0b2kob3B0ZXEgKyAxKTsJCgkJCSpvcHRlcSA9ICdcMCc7CgkJCWlmICghc3RyY21wKG9wdCwgInJzaXplIikpCgkJCQlkYXRhLnJzaXplID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgIndzaXplIikpCgkJCQlkYXRhLndzaXplID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgInRpbWVvIikpCgkJCQlkYXRhLnRpbWVvID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgInJldHJhbnMiKSkKCQkJCWRhdGEucmV0cmFucyA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhY3JlZ21pbiIpKQoJCQkJZGF0YS5hY3JlZ21pbiA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhY3JlZ21heCIpKQoJCQkJZGF0YS5hY3JlZ21heCA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhY2Rpcm1pbiIpKQoJCQkJZGF0YS5hY2Rpcm1pbiA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhY2Rpcm1heCIpKQoJCQkJZGF0YS5hY2Rpcm1heCA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhY3RpbWVvIikpIHsKCQkJCWRhdGEuYWNyZWdtaW4gPSB2YWw7CgkJCQlkYXRhLmFjcmVnbWF4ID0gdmFsOwoJCQkJZGF0YS5hY2Rpcm1pbiA9IHZhbDsKCQkJCWRhdGEuYWNkaXJtYXggPSB2YWw7CgkJCX0KCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJyZXRyeSIpKQoJCQkJcmV0cnkgPSB2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAicG9ydCIpKQoJCQkJcG9ydCA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJtb3VudHBvcnQiKSkKCQkJICAgICAgICBtb3VudHBvcnQgPSB2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAibW91bnRob3N0IikpCgkJCSAgICAgICAgbW91bnRob3N0PXhzdHJuZHVwKG9wdGVxKzEsCgkJCQkJCSAgc3RyY3NwbihvcHRlcSsxLCIgXHRcblxyLCIpKTsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJtb3VudHByb2ciKSkKCQkJCW1vdW50cHJvZyA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJtb3VudHZlcnMiKSkKCQkJCW1vdW50dmVycyA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJuZnNwcm9nIikpCgkJCQluZnNwcm9nID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgIm5mc3ZlcnMiKSB8fAoJCQkJICFzdHJjbXAob3B0LCAidmVycyIpKQoJCQkJbmZzdmVycyA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJwcm90byIpKSB7CgkJCQlpZiAoIXN0cm5jbXAob3B0ZXErMSwgInRjcCIsIDMpKQoJCQkJCXRjcCA9IDE7CgkJCQllbHNlIGlmICghc3RybmNtcChvcHRlcSsxLCAidWRwIiwgMykpCgkJCQkJdGNwID0gMDsKCQkJCWVsc2UKCQkJCQlwcmludGYoXygiV2FybmluZzogVW5yZWNvZ25pemVkIHByb3RvPSBvcHRpb24uXG4iKSk7CgkJCX0gZWxzZSBpZiAoIXN0cmNtcChvcHQsICJuYW1sZW4iKSkgewojaWYgTkZTX01PVU5UX1ZFUlNJT04gPj0gMgoJCQkJaWYgKG5mc19tb3VudF92ZXJzaW9uID49IDIpCgkJCQkJZGF0YS5uYW1sZW4gPSB2YWw7CgkJCQllbHNlCiNlbmRpZgoJCQkJcHJpbnRmKF8oIldhcm5pbmc6IE9wdGlvbiBuYW1sZW4gaXMgbm90IHN1cHBvcnRlZC5cbiIpKTsKCQkJfSBlbHNlIGlmICghc3RyY21wKG9wdCwgImFkZHIiKSkKCQkJCS8qIGlnbm9yZSAqLzsKCQkJZWxzZSB7CgkJCQlwcmludGYoXygidW5rbm93biBuZnMgbW91bnQgcGFyYW1ldGVyOiAiCgkJCQkgICAgICAgIiVzPSVkXG4iKSwgb3B0LCB2YWwpOwoJCQkJZ290byBmYWlsOwoJCQl9CgkJfQoJCWVsc2UgewoJCQl2YWwgPSAxOwoJCQlpZiAoIXN0cm5jbXAob3B0LCAibm8iLCAyKSkgewoJCQkJdmFsID0gMDsKCQkJCW9wdCArPSAyOwoJCQl9CgkJCWlmICghc3RyY21wKG9wdCwgImJnIikpIAoJCQkJYmcgPSB2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAiZmciKSkgCgkJCQliZyA9ICF2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAic29mdCIpKQoJCQkJc29mdCA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJoYXJkIikpCgkJCQlzb2Z0ID0gIXZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJpbnRyIikpCgkJCQlpbnRyID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgInBvc2l4IikpCgkJCQlwb3NpeCA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJjdG8iKSkKCQkJCW5vY3RvID0gIXZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhYyIpKQoJCQkJbm9hYyA9ICF2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAidGNwIikpCgkJCQl0Y3AgPSB2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAidWRwIikpCgkJCQl0Y3AgPSAhdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgImxvY2siKSkgewoJCQkJaWYgKG5mc19tb3VudF92ZXJzaW9uID49IDMpCgkJCQkJbm9sb2NrID0gIXZhbDsKCQkJCWVsc2UKCQkJCQlwcmludGYoXygiV2FybmluZzogb3B0aW9uIG5vbG9jayBpcyBub3Qgc3VwcG9ydGVkLlxuIikpOwoJCQl9IGVsc2UgewoJCQkJaWYgKCFzbG9wcHkpIHsKCQkJCQlwcmludGYoXygidW5rbm93biBuZnMgbW91bnQgb3B0aW9uOiAiCgkJCQkJICAgICAgICIlcyVzXG4iKSwgdmFsID8gIiIgOiAibm8iLCBvcHQpOwoJCQkJCWdvdG8gZmFpbDsKCQkJCX0KCQkJfQoJCX0KCX0KCWRhdGEuZmxhZ3MgPSAoc29mdCA/IE5GU19NT1VOVF9TT0ZUIDogMCkKCQl8IChpbnRyID8gTkZTX01PVU5UX0lOVFIgOiAwKQoJCXwgKHBvc2l4ID8gTkZTX01PVU5UX1BPU0lYIDogMCkKCQl8IChub2N0byA/IE5GU19NT1VOVF9OT0NUTyA6IDApCgkJfCAobm9hYyA/IE5GU19NT1VOVF9OT0FDIDogMCk7CiNpZiBORlNfTU9VTlRfVkVSU0lPTiA+PSAyCglpZiAobmZzX21vdW50X3ZlcnNpb24gPj0gMikKCQlkYXRhLmZsYWdzIHw9ICh0Y3AgPyBORlNfTU9VTlRfVENQIDogMCk7CiNlbmRpZgojaWYgTkZTX01PVU5UX1ZFUlNJT04gPj0gMwoJaWYgKG5mc19tb3VudF92ZXJzaW9uID49IDMpCgkJZGF0YS5mbGFncyB8PSAobm9sb2NrID8gTkZTX01PVU5UX05PTkxNIDogMCk7CiNlbmRpZgoKCS8qIEFkanVzdCBvcHRpb25zIGlmIG5vbmUgc3BlY2lmaWVkICovCglpZiAoIWRhdGEudGltZW8pCgkJZGF0YS50aW1lbyA9IHRjcCA/IDcwIDogNzsKCiNpZmRlZiBORlNfTU9VTlRfREVCVUcKCXByaW50ZigicnNpemUgPSAlZCwgd3NpemUgPSAlZCwgdGltZW8gPSAlZCwgcmV0cmFucyA9ICVkXG4iLAoJCWRhdGEucnNpemUsIGRhdGEud3NpemUsIGRhdGEudGltZW8sIGRhdGEucmV0cmFucyk7CglwcmludGYoImFjcmVnIChtaW4sIG1heCkgPSAoJWQsICVkKSwgYWNkaXIgKG1pbiwgbWF4KSA9ICglZCwgJWQpXG4iLAoJCWRhdGEuYWNyZWdtaW4sIGRhdGEuYWNyZWdtYXgsIGRhdGEuYWNkaXJtaW4sIGRhdGEuYWNkaXJtYXgpOwoJcHJpbnRmKCJwb3J0ID0gJWQsIGJnID0gJWQsIHJldHJ5ID0gJWQsIGZsYWdzID0gJS44eFxuIiwKCQlwb3J0LCBiZywgcmV0cnksIGRhdGEuZmxhZ3MpOwoJcHJpbnRmKCJtb3VudHByb2cgPSAlZCwgbW91bnR2ZXJzID0gJWQsIG5mc3Byb2cgPSAlZCwgbmZzdmVycyA9ICVkXG4iLAoJCW1vdW50cHJvZywgbW91bnR2ZXJzLCBuZnNwcm9nLCBuZnN2ZXJzKTsKCXByaW50Zigic29mdCA9ICVkLCBpbnRyID0gJWQsIHBvc2l4ID0gJWQsIG5vY3RvID0gJWQsIG5vYWMgPSAlZFxuIiwKCQkoZGF0YS5mbGFncyAmIE5GU19NT1VOVF9TT0ZUKSAhPSAwLAoJCShkYXRhLmZsYWdzICYgTkZTX01PVU5UX0lOVFIpICE9IDAsCgkJKGRhdGEuZmxhZ3MgJiBORlNfTU9VTlRfUE9TSVgpICE9IDAsCgkJKGRhdGEuZmxhZ3MgJiBORlNfTU9VTlRfTk9DVE8pICE9IDAsCgkJKGRhdGEuZmxhZ3MgJiBORlNfTU9VTlRfTk9BQykgIT0gMCk7CiNpZiBORlNfTU9VTlRfVkVSU0lPTiA+PSAyCglwcmludGYoInRjcCA9ICVkXG4iLAoJCShkYXRhLmZsYWdzICYgTkZTX01PVU5UX1RDUCkgIT0gMCk7CiNlbmRpZgojZW5kaWYKCglkYXRhLnZlcnNpb24gPSBuZnNfbW91bnRfdmVyc2lvbjsKCSptb3VudF9vcHRzID0gKGNoYXIgKikgJmRhdGE7CgoJaWYgKCpmbGFncyAmIE1TX1JFTU9VTlQpCgkJcmV0dXJuIDA7CgoJLyoKCSAqIElmIHRoZSBwcmV2aW91cyBtb3VudCBvcGVyYXRpb24gb24gdGhlIHNhbWUgaG9zdCB3YXMKCSAqIGJhY2tncm91bmRlZCwgYW5kIHRoZSAiYmciIGZvciB0aGlzIG1vdW50IGlzIGFsc28gc2V0LAoJICogZ2l2ZSB1cCBpbW1lZGlhdGVseSwgdG8gYXZvaWQgdGhlIGluaXRpYWwgdGltZW91dC4KCSAqLwoJaWYgKGJnICYmICFydW5uaW5nX2JnICYmCgkgICAgcHJldl9iZ19ob3N0ICYmIHN0cmNtcChob3N0bmFtZSwgcHJldl9iZ19ob3N0KSA9PSAwKSB7CgkJaWYgKHJldHJ5ID4gMCkKCQkJcmV0dmFsID0gRVhfQkc7CgkJcmV0dXJuIHJldHZhbDsKCX0KCgkvKiBjcmVhdGUgbW91bnQgZGVhbW9uIGNsaWVudCAqLwoJLyogU2VlIGlmIHRoZSBuZnMgaG9zdCA9IG1vdW50IGhvc3QuICovCglpZiAobW91bnRob3N0KSB7CgkgIGlmIChtb3VudGhvc3RbMF0gPj0gJzAnICYmIG1vdW50aG9zdFswXSA8PSAnOScpIHsKCSAgICBtb3VudF9zZXJ2ZXJfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKCSAgICBtb3VudF9zZXJ2ZXJfYWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIoaG9zdG5hbWUpOwoJICB9IGVsc2UgewoJCSAgaWYgKChocCA9IGdldGhvc3RieW5hbWUobW91bnRob3N0KSkgPT0gTlVMTCkgewoJCQkgIGZwcmludGYoc3RkZXJyLCBfKCJtb3VudDogY2FuJ3QgZ2V0IGFkZHJlc3MgZm9yICVzXG4iKSwKCQkJCSAgaG9zdG5hbWUpOwoJCQkgIGdvdG8gZmFpbDsKCQkgIH0gZWxzZSB7CgkJCSAgaWYgKGhwLT5oX2xlbmd0aCA+IHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpIHsKCQkJCSAgZnByaW50ZihzdGRlcnIsCgkJCQkJICBfKCJtb3VudDogZ290IGJhZCBocC0+aF9sZW5ndGg/XG4iKSk7CgkJCQkgIGhwLT5oX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7CgkJCSAgfQoJCQkgIG1vdW50X3NlcnZlcl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwoJCQkgIG1lbWNweSgmbW91bnRfc2VydmVyX2FkZHIuc2luX2FkZHIsCgkJCQkgaHAtPmhfYWRkciwgaHAtPmhfbGVuZ3RoKTsKCQkgIH0KCSAgfQoJfQoKCS8qCgkgKiBUaGUgZm9sbG93aW5nIGxvb3AgaW1wbGVtZW50cyB0aGUgbW91bnQgcmV0cmllcy4gT24gdGhlIGZpcnN0CgkgKiBjYWxsLCAicnVubmluZ19iZyIgaXMgMC4gV2hlbiB0aGUgbW91bnQgdGltZXMgb3V0LCBhbmQgdGhlCgkgKiAiYmciIG9wdGlvbiBpcyBzZXQsIHRoZSBleGl0IHN0YXR1cyBFWF9CRyB3aWxsIGJlIHJldHVybmVkLgoJICogRm9yIGEgYmFja2dyb3VuZGVkIG1vdW50LCB0aGVyZSB3aWxsIGJlIGEgc2Vjb25kIGNhbGwgYnkgdGhlCgkgKiBjaGlsZCBwcm9jZXNzIHdpdGggInJ1bm5pbmdfYmciIHNldCB0byAxLgoJICoKCSAqIFRoZSBjYXNlIHdoZXJlIHRoZSBtb3VudCBwb2ludCBpcyBub3QgcHJlc2VudCBhbmQgdGhlICJiZyIKCSAqIG9wdGlvbiBpcyBzZXQsIGlzIHRyZWF0ZWQgYXMgYSB0aW1lb3V0LiBUaGlzIGlzIGRvbmUgdG8KCSAqIHN1cHBvcnQgbmVzdGVkIG1vdW50cy4KCSAqCgkgKiBUaGUgInJldHJ5IiBjb3VudCBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgaXMgdGhlIG51bWJlciBvZgoJICogbWludXRlcyB0byByZXRyeSBiZWZvcmUgZ2l2aW5nIHVwLgoJICoKCSAqIE9ubHkgdGhlIGZpcnN0IGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQuCgkgKi8KCXJldHJ5X3RpbWVvdXQudHZfc2VjID0gMzsKCXJldHJ5X3RpbWVvdXQudHZfdXNlYyA9IDA7Cgl0b3RhbF90aW1lb3V0LnR2X3NlYyA9IDIwOwoJdG90YWxfdGltZW91dC50dl91c2VjID0gMDsKCXRpbWVvdXQgPSB0aW1lKE5VTEwpICsgNjAgKiByZXRyeTsKCXByZXZ0ID0gMDsKCXQgPSAzMDsKCXZhbCA9IDE7Cglmb3IgKDs7KSB7CgkJaWYgKGJnICYmIHN0YXQobm9kZSwgJnN0YXRidWYpID09IC0xKSB7CgkJCWlmIChydW5uaW5nX2JnKSB7CgkJCQlzbGVlcCh2YWwpOwkvKiAxLCAyLCA0LCA4LCAxNiwgMzAsIC4uLiAqLwoJCQkJdmFsICo9IDI7CgkJCQlpZiAodmFsID4gMzApCgkJCQkJdmFsID0gMzA7CgkJCX0KCQl9IGVsc2UgewoJCQkvKiBiZSBjYXJlZnVsIG5vdCB0byB1c2UgdG9vIG1hbnkgQ1BVIGN5Y2xlcyAqLwoJCQlpZiAodCAtIHByZXZ0IDwgMzApCgkJCQlzbGVlcCgzMCk7CgoJCQkvKiBjb250YWN0IHRoZSBtb3VudCBkYWVtb24gdmlhIFRDUCAqLwoJCQltb3VudF9zZXJ2ZXJfYWRkci5zaW5fcG9ydCA9IGh0b25zKG1vdW50cG9ydCk7CgkJCW1zb2NrID0gUlBDX0FOWVNPQ0s7CgkJCW1jbGllbnQgPSBjbG50dGNwX2NyZWF0ZSgmbW91bnRfc2VydmVyX2FkZHIsCgkJCQkJCSBtb3VudHByb2csIG1vdW50dmVycywKCQkJCQkJICZtc29jaywgMCwgMCk7CgoJCQkvKiBpZiB0aGlzIGZhaWxzLCBjb250YWN0IHRoZSBtb3VudCBkYWVtb24gdmlhIFVEUCAqLwoJCQlpZiAoIW1jbGllbnQpIHsKCQkJCW1vdW50X3NlcnZlcl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMobW91bnRwb3J0KTsKCQkJCW1zb2NrID0gUlBDX0FOWVNPQ0s7CgkJCQltY2xpZW50ID0gY2xudHVkcF9jcmVhdGUoJm1vdW50X3NlcnZlcl9hZGRyLAoJCQkJCQkJIG1vdW50cHJvZywgbW91bnR2ZXJzLAoJCQkJCQkJIHJldHJ5X3RpbWVvdXQsICZtc29jayk7CgkJCX0KCQkJaWYgKG1jbGllbnQpIHsKCQkJCS8qIHRyeSB0byBtb3VudCBob3N0bmFtZTpkaXJuYW1lICovCgkJCQltY2xpZW50LT5jbF9hdXRoID0gYXV0aHVuaXhfY3JlYXRlX2RlZmF1bHQoKTsKCQkJCWNsbnRfc3RhdCA9IGNsbnRfY2FsbChtY2xpZW50LCBNT1VOVFBST0NfTU5ULAoJCQkJCSh4ZHJwcm9jX3QpIHhkcl9kaXJwYXRoLCAoY2FkZHJfdCkgJmRpcm5hbWUsCgkJCQkJKHhkcnByb2NfdCkgeGRyX2Zoc3RhdHVzLCAoY2FkZHJfdCkgJnN0YXR1cywKCQkJCQl0b3RhbF90aW1lb3V0KTsKCQkJCWlmIChjbG50X3N0YXQgPT0gUlBDX1NVQ0NFU1MpCgkJCQkJYnJlYWs7CQkvKiB3ZSdyZSBkb25lICovCgkJCQlpZiAoZXJybm8gIT0gRUNPTk5SRUZVU0VEKSB7CgkJCQkJY2xudF9wZXJyb3IobWNsaWVudCwgIm1vdW50Iik7CgkJCQkJZ290byBmYWlsOwkvKiBkb24ndCByZXRyeSAqLwoJCQkJfQoJCQkJaWYgKCFydW5uaW5nX2JnICYmIHByZXZ0ID09IDApCgkJCQkJY2xudF9wZXJyb3IobWNsaWVudCwgIm1vdW50Iik7CgkJCQlhdXRoX2Rlc3Ryb3kobWNsaWVudC0+Y2xfYXV0aCk7CgkJCQljbG50X2Rlc3Ryb3kobWNsaWVudCk7CgkJCQltY2xpZW50ID0gMDsKCQkJCWNsb3NlKG1zb2NrKTsKCQkJfSBlbHNlIHsKCQkJCWlmICghcnVubmluZ19iZyAmJiBwcmV2dCA9PSAwKQoJCQkJCWNsbnRfcGNyZWF0ZWVycm9yKCJtb3VudCIpOwoJCQl9CgkJCXByZXZ0ID0gdDsKCQl9CgkJaWYgKCFiZykKCQkgICAgICAgIGdvdG8gZmFpbDsKCQlpZiAoIXJ1bm5pbmdfYmcpIHsKCQkJcHJldl9iZ19ob3N0ID0geHN0cmR1cChob3N0bmFtZSk7CgkJCWlmIChyZXRyeSA+IDApCgkJCQlyZXR2YWwgPSBFWF9CRzsKCQkJZ290byBmYWlsOwoJCX0KCQl0ID0gdGltZShOVUxMKTsKCQlpZiAodCA+PSB0aW1lb3V0KQoJCQlnb3RvIGZhaWw7Cgl9CgoJaWYgKHN0YXR1cy5maHNfc3RhdHVzICE9IDApIHsKCQlmcHJpbnRmKHN0ZGVyciwKCQkJXygibW91bnQ6ICVzOiVzIGZhaWxlZCwgcmVhc29uIGdpdmVuIGJ5IHNlcnZlcjogJXNcbiIpLAoJCQlob3N0bmFtZSwgZGlybmFtZSwgbmZzX3N0cmVycm9yKHN0YXR1cy5maHNfc3RhdHVzKSk7CgkJZ290byBmYWlsOwoJfQoJbWVtY3B5KChjaGFyICopICZyb290X2ZoYW5kbGUsIChjaGFyICopIHN0YXR1cy5maHN0YXR1c191LmZoc19maGFuZGxlLAoJCXNpemVvZiAocm9vdF9maGFuZGxlKSk7CgoJLyogY3JlYXRlIG5mcyBzb2NrZXQgZm9yIGtlcm5lbCAqLwoKCWlmICh0Y3ApIHsKCQlpZiAobmZzX21vdW50X3ZlcnNpb24gPCAzKSB7CgkgICAgIAkJcHJpbnRmKF8oIk5GUyBvdmVyIFRDUCBpcyBub3Qgc3VwcG9ydGVkLlxuIikpOwoJCQlnb3RvIGZhaWw7CgkJfQoJCWZzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7Cgl9IGVsc2UKCQlmc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7CglpZiAoZnNvY2sgPCAwKSB7CgkJcGVycm9yKF8oIm5mcyBzb2NrZXQiKSk7CgkJZ290byBmYWlsOwoJfQoJaWYgKGJpbmRyZXN2cG9ydChmc29jaywgMCkgPCAwKSB7CgkJcGVycm9yKF8oIm5mcyBiaW5kcmVzdnBvcnQiKSk7CgkJZ290byBmYWlsOwoJfQoJaWYgKHBvcnQgPT0gMCkgewoJCXNlcnZlcl9hZGRyLnNpbl9wb3J0ID0gUE1BUFBPUlQ7CgkJcG9ydCA9IHBtYXBfZ2V0cG9ydCgmc2VydmVyX2FkZHIsIG5mc3Byb2csIG5mc3ZlcnMsCgkJCXRjcCA/IElQUFJPVE9fVENQIDogSVBQUk9UT19VRFApOwoJCWlmIChwb3J0ID09IDApCgkJCXBvcnQgPSBORlNfUE9SVDsKI2lmZGVmIE5GU19NT1VOVF9ERUJVRwoJCWVsc2UKCQkJcHJpbnRmKF8oInVzZWQgcG9ydG1hcHBlciB0byBmaW5kIE5GUyBwb3J0XG4iKSk7CiNlbmRpZgoJfQojaWZkZWYgTkZTX01PVU5UX0RFQlVHCglwcmludGYoXygidXNpbmcgcG9ydCAlZCBmb3IgbmZzIGRlYW1vblxuIiksIHBvcnQpOwojZW5kaWYKCXNlcnZlcl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CgkgLyoKCSAgKiBjb25uZWN0KCkgdGhlIHNvY2tldCBmb3Iga2VybmVscyAxLjMuMTAgYW5kIGJlbG93IG9ubHksCgkgICogdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBtdWx0aWhvbWVkIGhvc3RzLgoJICAqIC0tU3dlbgoJICAqLwoJaWYgKGxpbnV4X3ZlcnNpb25fY29kZSgpIDw9IDY2MzE0CgkgICAgJiYgY29ubmVjdChmc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2VydmVyX2FkZHIsCgkJICAgICAgIHNpemVvZiAoc2VydmVyX2FkZHIpKSA8IDApIHsKCQlwZXJyb3IoXygibmZzIGNvbm5lY3QiKSk7CgkJZ290byBmYWlsOwoJfQoKCS8qIHByZXBhcmUgZGF0YSBzdHJ1Y3R1cmUgZm9yIGtlcm5lbCAqLwoKCWRhdGEuZmQgPSBmc29jazsKCW1lbWNweSgoY2hhciAqKSAmZGF0YS5yb290LCAoY2hhciAqKSAmcm9vdF9maGFuZGxlLAoJCXNpemVvZiAocm9vdF9maGFuZGxlKSk7CgltZW1jcHkoKGNoYXIgKikgJmRhdGEuYWRkciwgKGNoYXIgKikgJnNlcnZlcl9hZGRyLCBzaXplb2YoZGF0YS5hZGRyKSk7CglzdHJuY3B5KGRhdGEuaG9zdG5hbWUsIGhvc3RuYW1lLCBzaXplb2YoZGF0YS5ob3N0bmFtZSkpOwoKCS8qIGNsZWFuIHVwICovCgoJYXV0aF9kZXN0cm95KG1jbGllbnQtPmNsX2F1dGgpOwoJY2xudF9kZXN0cm95KG1jbGllbnQpOwoJY2xvc2UobXNvY2spOwoJcmV0dXJuIDA7CgoJLyogYWJvcnQgKi8KCmZhaWw6CglpZiAobXNvY2sgIT0gLTEpIHsKCQlpZiAobWNsaWVudCkgewoJCQlhdXRoX2Rlc3Ryb3kobWNsaWVudC0+Y2xfYXV0aCk7CgkJCWNsbnRfZGVzdHJveShtY2xpZW50KTsKCQl9CgkJY2xvc2UobXNvY2spOwoJfQoJaWYgKGZzb2NrICE9IC0xKQoJCWNsb3NlKGZzb2NrKTsKCXJldHVybiByZXR2YWw7Cn0JCgovKgogKiBXZSBuZWVkIHRvIHRyYW5zbGF0ZSBiZXR3ZWVuIG5mcyBzdGF0dXMgcmV0dXJuIHZhbHVlcyBhbmQKICogdGhlIGxvY2FsIGVycm5vIHZhbHVlcyB3aGljaCBtYXkgbm90IGJlIHRoZSBzYW1lLgogKgogKiBBbmRyZWFzIFNjaHdhYiA8c2Nod2FiQExTNS5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT46IGNoYW5nZSBlcnJubzoKICogImFmdGVyICNpbmNsdWRlIDxlcnJuby5oPiB0aGUgc3ltYm9sIGVycm5vIGlzIHJlc2VydmVkIGZvciBhbnkgdXNlLAogKiAgaXQgY2Fubm90IGV2ZW4gYmUgdXNlZCBhcyBhIHN0cnVjdCB0YWcgb3IgZmllbGQgbmFtZSIuCiAqLwoKI2lmbmRlZiBFRFFVT1QKI2RlZmluZSBFRFFVT1QJRU5PU1BDCiNlbmRpZgoKc3RhdGljIHN0cnVjdCB7CgllbnVtIG5mc19zdGF0IHN0YXQ7CglpbnQgZXJybnVtOwp9IG5mc19lcnJ0YmxbXSA9IHsKCXsgTkZTX09LLAkJMAkJfSwKCXsgTkZTRVJSX1BFUk0sCQlFUEVSTQkJfSwKCXsgTkZTRVJSX05PRU5ULAkJRU5PRU5UCQl9LAoJeyBORlNFUlJfSU8sCQlFSU8JCX0sCgl7IE5GU0VSUl9OWElPLAkJRU5YSU8JCX0sCgl7IE5GU0VSUl9BQ0NFUywJCUVBQ0NFUwkJfSwKCXsgTkZTRVJSX0VYSVNULAkJRUVYSVNUCQl9LAoJeyBORlNFUlJfTk9ERVYsCQlFTk9ERVYJCX0sCgl7IE5GU0VSUl9OT1RESVIsCUVOT1RESVIJCX0sCgl7IE5GU0VSUl9JU0RJUiwJCUVJU0RJUgkJfSwKI2lmZGVmIE5GU0VSUl9JTlZBTAoJeyBORlNFUlJfSU5WQUwsCQlFSU5WQUwJCX0sCS8qIHRoYXQgU3VuIGZvcmdvdCAqLwojZW5kaWYKCXsgTkZTRVJSX0ZCSUcsCQlFRkJJRwkJfSwKCXsgTkZTRVJSX05PU1BDLAkJRU5PU1BDCQl9LAoJeyBORlNFUlJfUk9GUywJCUVST0ZTCQl9LAoJeyBORlNFUlJfTkFNRVRPT0xPTkcsCUVOQU1FVE9PTE9ORwl9LAoJeyBORlNFUlJfTk9URU1QVFksCUVOT1RFTVBUWQl9LAoJeyBORlNFUlJfRFFVT1QsCQlFRFFVT1QJCX0sCgl7IE5GU0VSUl9TVEFMRSwJCUVTVEFMRQkJfSwKI2lmZGVmIEVXRkxVU0gKCXsgTkZTRVJSX1dGTFVTSCwJRVdGTFVTSAkJfSwKI2VuZGlmCgkvKiBUaHJvdyBpbiBzb21lIE5GU3YzIHZhbHVlcyBmb3IgZXZlbiBtb3JlIGZ1biAoSFAgcmV0dXJucyB0aGVzZSkgKi8KCXsgNzEsCQkJRVJFTU9URQkJfSwKCgl7IC0xLAkJCUVJTwkJfQp9OwoKc3RhdGljIGNoYXIgKm5mc19zdHJlcnJvcihpbnQgc3RhdCkKewoJaW50IGk7CglzdGF0aWMgY2hhciBidWZbMjU2XTsKCglmb3IgKGkgPSAwOyBuZnNfZXJydGJsW2ldLnN0YXQgIT0gLTE7IGkrKykgewoJCWlmIChuZnNfZXJydGJsW2ldLnN0YXQgPT0gc3RhdCkKCQkJcmV0dXJuIHN0cmVycm9yKG5mc19lcnJ0YmxbaV0uZXJybnVtKTsKCX0KCXNwcmludGYoYnVmLCBfKCJ1bmtub3duIG5mcyBzdGF0dXMgcmV0dXJuIHZhbHVlOiAlZCIpLCBzdGF0KTsKCXJldHVybiBidWY7Cn0KCiNpZiAwCmludApteV9nZXRwb3J0KHN0cnVjdCBpbl9hZGRyIHNlcnZlciwgc3RydWN0IHRpbWV2YWwgKnRpbWVvLCAuLi4pCnsKICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOwogICAgICAgIHN0cnVjdCBwbWFwICAgICBwbWFwOwogICAgICAgIENMSUVOVCAgICAgICAgICAqY2xudDsKICAgICAgICBpbnQgICAgICAgICAgICAgc29jayA9IFJQQ19BTllTT0NLLCBwb3J0OwoKICAgICAgICBwbWFwLnBtX3Byb2cgPSBwcm9nOwogICAgICAgIHBtYXAucG1fdmVycyA9IHZlcnM7CiAgICAgICAgcG1hcC5wbV9wcm90ID0gcHJvdDsKICAgICAgICBwbWFwLnBtX3BvcnQgPSAwOwogICAgICAgIHNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKICAgICAgICBzaW4uc2luX2FkZHIgPSBzZXJ2ZXI7CiAgICAgICAgc2luLnNpbl9wb3J0ID0gaHRvbnMoMTExKTsKICAgICAgICBjbG50ID0gY2xudHVkcF9jcmVhdGUoJnNpbiwgMTAwMDAwLCAyLCAqdGltZW8sICZzb2NrKTsKICAgICAgICBzdGF0dXMgPSBjbG50X2NhbGwoY2xudCwgUE1BUF9HRVRQT1JULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwbWFwLCAoeGRycHJvY190KSB4ZHJfcG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9ydCwgKHhkcnByb2NfdCkgeGRyX3VpbnQpOwogICAgICAgIGlmIChzdGF0dXMgIT0gU1VDQ0VTUykgewoJICAgICAvKiBuYXR0ZXIgKi8KICAgICAgICAgICAgICAgIHBvcnQgPSAwOwogICAgICAgIH0KCiAgICAgICAgY2xudF9kZXN0cm95KGNsbnQpOwogICAgICAgIGNsb3NlKHNvY2spOwogICAgICAgIHJldHVybiBwb3J0Owp9CiNlbmRpZgoKCgoKCgoKCgoKCi8qCiAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCiAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgogKi8KCiNpbmNsdWRlIDxycGMvdHlwZXMuaD4KI2luY2x1ZGUgPHJwYy94ZHIuaD4KCi8qCiAqIFN1biBSUEMgaXMgYSBwcm9kdWN0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYW5kIGlzIHByb3ZpZGVkIGZvcgogKiB1bnJlc3RyaWN0ZWQgdXNlIHByb3ZpZGVkIHRoYXQgdGhpcyBsZWdlbmQgaXMgaW5jbHVkZWQgb24gYWxsIHRhcGUKICogbWVkaWEgYW5kIGFzIGEgcGFydCBvZiB0aGUgc29mdHdhcmUgcHJvZ3JhbSBpbiB3aG9sZSBvciBwYXJ0LiAgVXNlcnMKICogbWF5IGNvcHkgb3IgbW9kaWZ5IFN1biBSUEMgd2l0aG91dCBjaGFyZ2UsIGJ1dCBhcmUgbm90IGF1dGhvcml6ZWQKICogdG8gbGljZW5zZSBvciBkaXN0cmlidXRlIGl0IHRvIGFueW9uZSBlbHNlIGV4Y2VwdCBhcyBwYXJ0IG9mIGEgcHJvZHVjdCBvcgogKiBwcm9ncmFtIGRldmVsb3BlZCBieSB0aGUgdXNlciBvciB3aXRoIHRoZSBleHByZXNzIHdyaXR0ZW4gY29uc2VudCBvZgogKiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiAqCiAqIFNVTiBSUEMgSVMgUFJPVklERUQgQVMgSVMgV0lUSCBOTyBXQVJSQU5USUVTIE9GIEFOWSBLSU5EIElOQ0xVRElORyBUSEUKICogV0FSUkFOVElFUyBPRiBERVNJR04sIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiAqIFBVUlBPU0UsIE9SIEFSSVNJTkcgRlJPTSBBIENPVVJTRSBPRiBERUFMSU5HLCBVU0FHRSBPUiBUUkFERSBQUkFDVElDRS4KICoKICogU3VuIFJQQyBpcyBwcm92aWRlZCB3aXRoIG5vIHN1cHBvcnQgYW5kIHdpdGhvdXQgYW55IG9ibGlnYXRpb24gb24gdGhlCiAqIHBhcnQgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiB0byBhc3Npc3QgaW4gaXRzIHVzZSwgY29ycmVjdGlvbiwKICogbW9kaWZpY2F0aW9uIG9yIGVuaGFuY2VtZW50LgogKgogKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuIFNIQUxMIEhBVkUgTk8gTElBQklMSVRZIFdJVEggUkVTUEVDVCBUTyBUSEUKICogSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVFMsIFRSQURFIFNFQ1JFVFMgT1IgQU5ZIFBBVEVOVFMgQlkgU1VOIFJQQwogKiBPUiBBTlkgUEFSVCBUSEVSRU9GLgogKgogKiBJbiBubyBldmVudCB3aWxsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYmUgbGlhYmxlIGZvciBhbnkgbG9zdCByZXZlbnVlCiAqIG9yIHByb2ZpdHMgb3Igb3RoZXIgc3BlY2lhbCwgaW5kaXJlY3QgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgZXZlbiBpZgogKiBTdW4gaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgogKgogKiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiAqIDI1NTAgR2FyY2lhIEF2ZW51ZQogKiBNb3VudGFpbiBWaWV3LCBDYWxpZm9ybmlhICA5NDA0MwogKi8KLyoKICogQ29weXJpZ2h0IChjKSAxOTg1LCAxOTkwIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KICovCgovKiBmcm9tIEAoIyltb3VudC54CTEuMyA5MS8wMy8xMSBUSVJQQyAxLjAgKi8KCmJvb2xfdAp4ZHJfZmhhbmRsZShYRFIgKnhkcnMsIGZoYW5kbGUgb2JqcCkKewoKCSBpZiAoIXhkcl9vcGFxdWUoeGRycywgb2JqcCwgRkhTSVpFKSkgewoJCSByZXR1cm4gKEZBTFNFKTsKCSB9CglyZXR1cm4gKFRSVUUpOwp9Cgpib29sX3QKeGRyX2Zoc3RhdHVzKFhEUiAqeGRycywgZmhzdGF0dXMgKm9ianApCnsKCgkgaWYgKCF4ZHJfdV9pbnQoeGRycywgJm9ianAtPmZoc19zdGF0dXMpKSB7CgkJIHJldHVybiAoRkFMU0UpOwoJIH0KCXN3aXRjaCAob2JqcC0+ZmhzX3N0YXR1cykgewoJY2FzZSAwOgoJCSBpZiAoIXhkcl9maGFuZGxlKHhkcnMsIG9ianAtPmZoc3RhdHVzX3UuZmhzX2ZoYW5kbGUpKSB7CgkJCSByZXR1cm4gKEZBTFNFKTsKCQkgfQoJCWJyZWFrOwoJZGVmYXVsdDoKCQlicmVhazsKCX0KCXJldHVybiAoVFJVRSk7Cn0KCmJvb2xfdAp4ZHJfZGlycGF0aChYRFIgKnhkcnMsIGRpcnBhdGggKm9ianApCnsKCgkgaWYgKCF4ZHJfc3RyaW5nKHhkcnMsIG9ianAsIE1OVFBBVEhMRU4pKSB7CgkJIHJldHVybiAoRkFMU0UpOwoJIH0KCXJldHVybiAoVFJVRSk7Cn0KCmJvb2xfdAp4ZHJfbmFtZShYRFIgKnhkcnMsIG5hbWUgKm9ianApCnsKCgkgaWYgKCF4ZHJfc3RyaW5nKHhkcnMsIG9ianAsIE1OVE5BTUxFTikpIHsKCQkgcmV0dXJuIChGQUxTRSk7CgkgfQoJcmV0dXJuIChUUlVFKTsKfQoKYm9vbF90Cnhkcl9tb3VudGxpc3QoWERSICp4ZHJzLCBtb3VudGxpc3QgKm9ianApCnsKCgkgaWYgKCF4ZHJfcG9pbnRlcih4ZHJzLCAoY2hhciAqKilvYmpwLCBzaXplb2Yoc3RydWN0IG1vdW50Ym9keSksICh4ZHJwcm9jX3QpeGRyX21vdW50Ym9keSkpIHsKCQkgcmV0dXJuIChGQUxTRSk7CgkgfQoJcmV0dXJuIChUUlVFKTsKfQoKYm9vbF90Cnhkcl9tb3VudGJvZHkoWERSICp4ZHJzLCBtb3VudGJvZHkgKm9ianApCnsKCgkgaWYgKCF4ZHJfbmFtZSh4ZHJzLCAmb2JqcC0+bWxfaG9zdG5hbWUpKSB7CgkJIHJldHVybiAoRkFMU0UpOwoJIH0KCSBpZiAoIXhkcl9kaXJwYXRoKHhkcnMsICZvYmpwLT5tbF9kaXJlY3RvcnkpKSB7CgkJIHJldHVybiAoRkFMU0UpOwoJIH0KCSBpZiAoIXhkcl9tb3VudGxpc3QoeGRycywgJm9ianAtPm1sX25leHQpKSB7CgkJIHJldHVybiAoRkFMU0UpOwoJIH0KCXJldHVybiAoVFJVRSk7Cn0KCmJvb2xfdAp4ZHJfZ3JvdXBzKFhEUiAqeGRycywgZ3JvdXBzICpvYmpwKQp7CgoJIGlmICgheGRyX3BvaW50ZXIoeGRycywgKGNoYXIgKiopb2JqcCwgc2l6ZW9mKHN0cnVjdCBncm91cG5vZGUpLCAoeGRycHJvY190KXhkcl9ncm91cG5vZGUpKSB7CgkJIHJldHVybiAoRkFMU0UpOwoJIH0KCXJldHVybiAoVFJVRSk7Cn0KCmJvb2xfdAp4ZHJfZ3JvdXBub2RlKFhEUiAqeGRycywgZ3JvdXBub2RlICpvYmpwKQp7CgoJIGlmICgheGRyX25hbWUoeGRycywgJm9ianAtPmdyX25hbWUpKSB7CgkJIHJldHVybiAoRkFMU0UpOwoJIH0KCSBpZiAoIXhkcl9ncm91cHMoeGRycywgJm9ianAtPmdyX25leHQpKSB7CgkJIHJldHVybiAoRkFMU0UpOwoJIH0KCXJldHVybiAoVFJVRSk7Cn0KCmJvb2xfdAp4ZHJfZXhwb3J0cyhYRFIgKnhkcnMsIGV4cG9ydHMgKm9ianApCnsKCgkgaWYgKCF4ZHJfcG9pbnRlcih4ZHJzLCAoY2hhciAqKilvYmpwLCBzaXplb2Yoc3RydWN0IGV4cG9ydG5vZGUpLCAoeGRycHJvY190KXhkcl9leHBvcnRub2RlKSkgewoJCSByZXR1cm4gKEZBTFNFKTsKCSB9CglyZXR1cm4gKFRSVUUpOwp9Cgpib29sX3QKeGRyX2V4cG9ydG5vZGUoWERSICp4ZHJzLCBleHBvcnRub2RlICpvYmpwKQp7CgoJIGlmICgheGRyX2RpcnBhdGgoeGRycywgJm9ianAtPmV4X2RpcikpIHsKCQkgcmV0dXJuIChGQUxTRSk7CgkgfQoJIGlmICgheGRyX2dyb3Vwcyh4ZHJzLCAmb2JqcC0+ZXhfZ3JvdXBzKSkgewoJCSByZXR1cm4gKEZBTFNFKTsKCSB9CgkgaWYgKCF4ZHJfZXhwb3J0cyh4ZHJzLCAmb2JqcC0+ZXhfbmV4dCkpIHsKCQkgcmV0dXJuIChGQUxTRSk7CgkgfQoJcmV0dXJuIChUUlVFKTsKfQoKYm9vbF90Cnhkcl9wcGF0aGNuZihYRFIgKnhkcnMsIHBwYXRoY25mICpvYmpwKQp7CgoJIHJlZ2lzdGVyIGxvbmcgKmJ1ZjsKCgkgaW50IGk7CgoJIGlmICh4ZHJzLT54X29wID09IFhEUl9FTkNPREUpIHsKCSBidWYgPSAobG9uZyopWERSX0lOTElORSh4ZHJzLDYgKiBCWVRFU19QRVJfWERSX1VOSVQpOwoJICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CgkJIGlmICgheGRyX2ludCh4ZHJzLCAmb2JqcC0+cGNfbGlua19tYXgpKSB7CgkJCSByZXR1cm4gKEZBTFNFKTsKCQkgfQoJCSBpZiAoIXhkcl9zaG9ydCh4ZHJzLCAmb2JqcC0+cGNfbWF4X2Nhbm9uKSkgewoJCQkgcmV0dXJuIChGQUxTRSk7CgkJIH0KCQkgaWYgKCF4ZHJfc2hvcnQoeGRycywgJm9ianAtPnBjX21heF9pbnB1dCkpIHsKCQkJIHJldHVybiAoRkFMU0UpOwoJCSB9CgkJIGlmICgheGRyX3Nob3J0KHhkcnMsICZvYmpwLT5wY19uYW1lX21heCkpIHsKCQkJIHJldHVybiAoRkFMU0UpOwoJCSB9CgkJIGlmICgheGRyX3Nob3J0KHhkcnMsICZvYmpwLT5wY19wYXRoX21heCkpIHsKCQkJIHJldHVybiAoRkFMU0UpOwoJCSB9CgkJIGlmICgheGRyX3Nob3J0KHhkcnMsICZvYmpwLT5wY19waXBlX2J1ZikpIHsKCQkJIHJldHVybiAoRkFMU0UpOwoJCSB9CgoJICB9CgkgIGVsc2UgewoJCSBJWERSX1BVVF9MT05HKGJ1ZixvYmpwLT5wY19saW5rX21heCk7CgkJIElYRFJfUFVUX1NIT1JUKGJ1ZixvYmpwLT5wY19tYXhfY2Fub24pOwoJCSBJWERSX1BVVF9TSE9SVChidWYsb2JqcC0+cGNfbWF4X2lucHV0KTsKCQkgSVhEUl9QVVRfU0hPUlQoYnVmLG9ianAtPnBjX25hbWVfbWF4KTsKCQkgSVhEUl9QVVRfU0hPUlQoYnVmLG9ianAtPnBjX3BhdGhfbWF4KTsKCQkgSVhEUl9QVVRfU0hPUlQoYnVmLG9ianAtPnBjX3BpcGVfYnVmKTsKCSAgfQoJIGlmICgheGRyX3VfY2hhcih4ZHJzLCAmb2JqcC0+cGNfdmRpc2FibGUpKSB7CgkJIHJldHVybiAoRkFMU0UpOwoJIH0KCSBpZiAoIXhkcl9jaGFyKHhkcnMsICZvYmpwLT5wY194eHgpKSB7CgkJIHJldHVybiAoRkFMU0UpOwoJIH0KCQlidWYgPSAobG9uZyopWERSX0lOTElORSh4ZHJzLCAgIDIgICogQllURVNfUEVSX1hEUl9VTklUKTsKCQlpZiAoYnVmID09IE5VTEwpIHsKCQkgaWYgKCF4ZHJfdmVjdG9yKHhkcnMsIChjaGFyICopb2JqcC0+cGNfbWFzaywgMiwgc2l6ZW9mKHNob3J0KSwgKHhkcnByb2NfdCl4ZHJfc2hvcnQpKSB7CgkJCSByZXR1cm4gKEZBTFNFKTsKCQkgfQoKCSAgfQoJICBlbHNlIHsKCQl7IHJlZ2lzdGVyIHNob3J0ICpnZW5wOyAKCQkgIGZvciAoIGkgPSAwLGdlbnA9b2JqcC0+cGNfbWFzazsKIAkJCWkgPCAyOyBpKyspewoJCQkJIElYRFJfUFVUX1NIT1JUKGJ1ZiwqZ2VucCsrKTsKCQkgICB9CgkJIH07CgkgIH0KCiAJIHJldHVybiAoVFJVRSk7Cgl9IGVsc2UgaWYgKHhkcnMtPnhfb3AgPT0gWERSX0RFQ09ERSkgewoJIGJ1ZiA9IChsb25nKilYRFJfSU5MSU5FKHhkcnMsNiAqIEJZVEVTX1BFUl9YRFJfVU5JVCk7CgkgICBpZiAoYnVmID09IE5VTEwpIHsKCQkgaWYgKCF4ZHJfaW50KHhkcnMsICZvYmpwLT5wY19saW5rX21heCkpIHsKCQkJIHJldHVybiAoRkFMU0UpOwoJCSB9CgkJIGlmICgheGRyX3Nob3J0KHhkcnMsICZvYmpwLT5wY19tYXhfY2Fub24pKSB7CgkJCSByZXR1cm4gKEZBTFNFKTsKCQkgfQoJCSBpZiAoIXhkcl9zaG9ydCh4ZHJzLCAmb2JqcC0+cGNfbWF4X2lucHV0KSkgewoJCQkgcmV0dXJuIChGQUxTRSk7CgkJIH0KCQkgaWYgKCF4ZHJfc2hvcnQoeGRycywgJm9ianAtPnBjX25hbWVfbWF4KSkgewoJCQkgcmV0dXJuIChGQUxTRSk7CgkJIH0KCQkgaWYgKCF4ZHJfc2hvcnQoeGRycywgJm9ianAtPnBjX3BhdGhfbWF4KSkgewoJCQkgcmV0dXJuIChGQUxTRSk7CgkJIH0KCQkgaWYgKCF4ZHJfc2hvcnQoeGRycywgJm9ianAtPnBjX3BpcGVfYnVmKSkgewoJCQkgcmV0dXJuIChGQUxTRSk7CgkJIH0KCgkgIH0KCSAgZWxzZSB7CgkJIG9ianAtPnBjX2xpbmtfbWF4ID0gSVhEUl9HRVRfTE9ORyhidWYpOwoJCSBvYmpwLT5wY19tYXhfY2Fub24gPSBJWERSX0dFVF9TSE9SVChidWYpOwoJCSBvYmpwLT5wY19tYXhfaW5wdXQgPSBJWERSX0dFVF9TSE9SVChidWYpOwoJCSBvYmpwLT5wY19uYW1lX21heCA9IElYRFJfR0VUX1NIT1JUKGJ1Zik7CgkJIG9ianAtPnBjX3BhdGhfbWF4ID0gSVhEUl9HRVRfU0hPUlQoYnVmKTsKCQkgb2JqcC0+cGNfcGlwZV9idWYgPSBJWERSX0dFVF9TSE9SVChidWYpOwoJICB9CgkgaWYgKCF4ZHJfdV9jaGFyKHhkcnMsICZvYmpwLT5wY192ZGlzYWJsZSkpIHsKCQkgcmV0dXJuIChGQUxTRSk7CgkgfQoJIGlmICgheGRyX2NoYXIoeGRycywgJm9ianAtPnBjX3h4eCkpIHsKCQkgcmV0dXJuIChGQUxTRSk7CgkgfQoJCWJ1ZiA9IChsb25nKilYRFJfSU5MSU5FKHhkcnMsICAgMiAgKiBCWVRFU19QRVJfWERSX1VOSVQpOwoJCWlmIChidWYgPT0gTlVMTCkgewoJCSBpZiAoIXhkcl92ZWN0b3IoeGRycywgKGNoYXIgKilvYmpwLT5wY19tYXNrLCAyLCBzaXplb2Yoc2hvcnQpLCAoeGRycHJvY190KXhkcl9zaG9ydCkpIHsKCQkJIHJldHVybiAoRkFMU0UpOwoJCSB9CgoJICB9CgkgIGVsc2UgewoJCXsgcmVnaXN0ZXIgc2hvcnQgKmdlbnA7IAoJCSAgZm9yICggaSA9IDAsZ2VucD1vYmpwLT5wY19tYXNrOwogCQkJaSA8IDI7IGkrKyl7CgkJCQkgKmdlbnArKyA9IElYRFJfR0VUX1NIT1JUKGJ1Zik7CgkJICAgfQoJCSB9OwoJICB9CgkgcmV0dXJuKFRSVUUpOwoJfQoKCSBpZiAoIXhkcl9pbnQoeGRycywgJm9ianAtPnBjX2xpbmtfbWF4KSkgewoJCSByZXR1cm4gKEZBTFNFKTsKCSB9CgkgaWYgKCF4ZHJfc2hvcnQoeGRycywgJm9ianAtPnBjX21heF9jYW5vbikpIHsKCQkgcmV0dXJuIChGQUxTRSk7CgkgfQoJIGlmICgheGRyX3Nob3J0KHhkcnMsICZvYmpwLT5wY19tYXhfaW5wdXQpKSB7CgkJIHJldHVybiAoRkFMU0UpOwoJIH0KCSBpZiAoIXhkcl9zaG9ydCh4ZHJzLCAmb2JqcC0+cGNfbmFtZV9tYXgpKSB7CgkJIHJldHVybiAoRkFMU0UpOwoJIH0KCSBpZiAoIXhkcl9zaG9ydCh4ZHJzLCAmb2JqcC0+cGNfcGF0aF9tYXgpKSB7CgkJIHJldHVybiAoRkFMU0UpOwoJIH0KCSBpZiAoIXhkcl9zaG9ydCh4ZHJzLCAmb2JqcC0+cGNfcGlwZV9idWYpKSB7CgkJIHJldHVybiAoRkFMU0UpOwoJIH0KCSBpZiAoIXhkcl91X2NoYXIoeGRycywgJm9ianAtPnBjX3ZkaXNhYmxlKSkgewoJCSByZXR1cm4gKEZBTFNFKTsKCSB9CgkgaWYgKCF4ZHJfY2hhcih4ZHJzLCAmb2JqcC0+cGNfeHh4KSkgewoJCSByZXR1cm4gKEZBTFNFKTsKCSB9CgkgaWYgKCF4ZHJfdmVjdG9yKHhkcnMsIChjaGFyICopb2JqcC0+cGNfbWFzaywgMiwgc2l6ZW9mKHNob3J0KSwgKHhkcnByb2NfdCl4ZHJfc2hvcnQpKSB7CgkJIHJldHVybiAoRkFMU0UpOwoJIH0KCXJldHVybiAoVFJVRSk7Cn0KCgovKgogKiBTdW4gUlBDIGlzIGEgcHJvZHVjdCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGFuZCBpcyBwcm92aWRlZCBmb3IKICogdW5yZXN0cmljdGVkIHVzZSBwcm92aWRlZCB0aGF0IHRoaXMgbGVnZW5kIGlzIGluY2x1ZGVkIG9uIGFsbCB0YXBlCiAqIG1lZGlhIGFuZCBhcyBhIHBhcnQgb2YgdGhlIHNvZnR3YXJlIHByb2dyYW0gaW4gd2hvbGUgb3IgcGFydC4gIFVzZXJzCiAqIG1heSBjb3B5IG9yIG1vZGlmeSBTdW4gUlBDIHdpdGhvdXQgY2hhcmdlLCBidXQgYXJlIG5vdCBhdXRob3JpemVkCiAqIHRvIGxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSBpdCB0byBhbnlvbmUgZWxzZSBleGNlcHQgYXMgcGFydCBvZiBhIHByb2R1Y3Qgb3IKICogcHJvZ3JhbSBkZXZlbG9wZWQgYnkgdGhlIHVzZXIgb3Igd2l0aCB0aGUgZXhwcmVzcyB3cml0dGVuIGNvbnNlbnQgb2YKICogU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgogKgogKiBTVU4gUlBDIElTIFBST1ZJREVEIEFTIElTIFdJVEggTk8gV0FSUkFOVElFUyBPRiBBTlkgS0lORCBJTkNMVURJTkcgVEhFCiAqIFdBUlJBTlRJRVMgT0YgREVTSUdOLCBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgogKiBQVVJQT1NFLCBPUiBBUklTSU5HIEZST00gQSBDT1VSU0UgT0YgREVBTElORywgVVNBR0UgT1IgVFJBREUgUFJBQ1RJQ0UuCiAqCiAqIFN1biBSUEMgaXMgcHJvdmlkZWQgd2l0aCBubyBzdXBwb3J0IGFuZCB3aXRob3V0IGFueSBvYmxpZ2F0aW9uIG9uIHRoZQogKiBwYXJ0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gdG8gYXNzaXN0IGluIGl0cyB1c2UsIGNvcnJlY3Rpb24sCiAqIG1vZGlmaWNhdGlvbiBvciBlbmhhbmNlbWVudC4KICoKICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiBTSEFMTCBIQVZFIE5PIExJQUJJTElUWSBXSVRIIFJFU1BFQ1QgVE8gVEhFCiAqIElORlJJTkdFTUVOVCBPRiBDT1BZUklHSFRTLCBUUkFERSBTRUNSRVRTIE9SIEFOWSBQQVRFTlRTIEJZIFNVTiBSUEMKICogT1IgQU5ZIFBBUlQgVEhFUkVPRi4KICoKICogSW4gbm8gZXZlbnQgd2lsbCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJlIGxpYWJsZSBmb3IgYW55IGxvc3QgcmV2ZW51ZQogKiBvciBwcm9maXRzIG9yIG90aGVyIHNwZWNpYWwsIGluZGlyZWN0IGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGV2ZW4gaWYKICogU3VuIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KICoKICogU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgogKiAyNTUwIEdhcmNpYSBBdmVudWUKICogTW91bnRhaW4gVmlldywgQ2FsaWZvcm5pYSAgOTQwNDMKICovCi8qCiAqIENvcHlyaWdodCAoYykgMTk4NSwgMTk5MCBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiAqLwoKLyogZnJvbSBAKCMpbW91bnQueAkxLjMgOTEvMDMvMTEgVElSUEMgMS4wICovCgojaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAgICAgICAgLyogZm9yIG1lbXNldCgpICovCgovKiBEZWZhdWx0IHRpbWVvdXQgY2FuIGJlIGNoYW5nZWQgdXNpbmcgY2xudF9jb250cm9sKCkgKi8Kc3RhdGljIHN0cnVjdCB0aW1ldmFsIFRJTUVPVVQgPSB7IDI1LCAwIH07Cgp2b2lkICoKbW91bnRwcm9jX251bGxfMShhcmdwLCBjbG50KQoJdm9pZCAqYXJncDsKCUNMSUVOVCAqY2xudDsKewoJc3RhdGljIGNoYXIgY2xudF9yZXM7CgoJbWVtc2V0KChjaGFyICopJmNsbnRfcmVzLCAwLCBzaXplb2YoY2xudF9yZXMpKTsKCWlmIChjbG50X2NhbGwoY2xudCwgTU9VTlRQUk9DX05VTEwsICh4ZHJwcm9jX3QpIHhkcl92b2lkLCBhcmdwLCAoeGRycHJvY190KSB4ZHJfdm9pZCwgJmNsbnRfcmVzLCBUSU1FT1VUKSAhPSBSUENfU1VDQ0VTUykgewoJCXJldHVybiAoTlVMTCk7Cgl9CglyZXR1cm4gKCh2b2lkICopJmNsbnRfcmVzKTsKfQoKZmhzdGF0dXMgKgptb3VudHByb2NfbW50XzEoYXJncCwgY2xudCkKCWRpcnBhdGggKmFyZ3A7CglDTElFTlQgKmNsbnQ7CnsKCXN0YXRpYyBmaHN0YXR1cyBjbG50X3JlczsKCgltZW1zZXQoKGNoYXIgKikmY2xudF9yZXMsIDAsIHNpemVvZihjbG50X3JlcykpOwoJaWYgKGNsbnRfY2FsbChjbG50LCBNT1VOVFBST0NfTU5ULCAoeGRycHJvY190KSB4ZHJfZGlycGF0aCwKCQkgICAgICAoY2FkZHJfdCkgYXJncCwgKHhkcnByb2NfdCkgeGRyX2Zoc3RhdHVzLAoJCSAgICAgIChjYWRkcl90KSAmY2xudF9yZXMsIFRJTUVPVVQpICE9IFJQQ19TVUNDRVNTKSB7CgkJcmV0dXJuIChOVUxMKTsKCX0KCXJldHVybiAoJmNsbnRfcmVzKTsKfQoKbW91bnRsaXN0ICoKbW91bnRwcm9jX2R1bXBfMShhcmdwLCBjbG50KQoJdm9pZCAqYXJncDsKCUNMSUVOVCAqY2xudDsKewoJc3RhdGljIG1vdW50bGlzdCBjbG50X3JlczsKCgltZW1zZXQoKGNoYXIgKikmY2xudF9yZXMsIDAsIHNpemVvZihjbG50X3JlcykpOwoJaWYgKGNsbnRfY2FsbChjbG50LCBNT1VOVFBST0NfRFVNUCwgKHhkcnByb2NfdCkgeGRyX3ZvaWQsCgkJICAgICAgKGNhZGRyX3QpIGFyZ3AsICh4ZHJwcm9jX3QpIHhkcl9tb3VudGxpc3QsCgkJICAgICAgKGNhZGRyX3QpICZjbG50X3JlcywgVElNRU9VVCkgIT0gUlBDX1NVQ0NFU1MpIHsKCQlyZXR1cm4gKE5VTEwpOwoJfQoJcmV0dXJuICgmY2xudF9yZXMpOwp9Cgp2b2lkICoKbW91bnRwcm9jX3VtbnRfMShhcmdwLCBjbG50KQoJZGlycGF0aCAqYXJncDsKCUNMSUVOVCAqY2xudDsKewoJc3RhdGljIGNoYXIgY2xudF9yZXM7CgoJbWVtc2V0KChjaGFyICopJmNsbnRfcmVzLCAwLCBzaXplb2YoY2xudF9yZXMpKTsKCWlmIChjbG50X2NhbGwoY2xudCwgTU9VTlRQUk9DX1VNTlQsICh4ZHJwcm9jX3QpIHhkcl9kaXJwYXRoLAoJCSAgICAgIChjYWRkcl90KSBhcmdwLCAoeGRycHJvY190KSB4ZHJfdm9pZCwKCQkgICAgICAoY2FkZHJfdCkgJmNsbnRfcmVzLCBUSU1FT1VUKSAhPSBSUENfU1VDQ0VTUykgewoJCXJldHVybiAoTlVMTCk7Cgl9CglyZXR1cm4gKCh2b2lkICopJmNsbnRfcmVzKTsKfQoKdm9pZCAqCm1vdW50cHJvY191bW50YWxsXzEoYXJncCwgY2xudCkKCXZvaWQgKmFyZ3A7CglDTElFTlQgKmNsbnQ7CnsKCXN0YXRpYyBjaGFyIGNsbnRfcmVzOwoKCW1lbXNldCgoY2hhciAqKSZjbG50X3JlcywgMCwgc2l6ZW9mKGNsbnRfcmVzKSk7CglpZiAoY2xudF9jYWxsKGNsbnQsIE1PVU5UUFJPQ19VTU5UQUxMLCAoeGRycHJvY190KSB4ZHJfdm9pZCwKCQkgICAgICAoY2FkZHJfdCkgYXJncCwgKHhkcnByb2NfdCkgeGRyX3ZvaWQsCgkJICAgICAgKGNhZGRyX3QpICZjbG50X3JlcywgVElNRU9VVCkgIT0gUlBDX1NVQ0NFU1MpIHsKCQlyZXR1cm4gKE5VTEwpOwoJfQoJcmV0dXJuICgodm9pZCAqKSZjbG50X3Jlcyk7Cn0KCmV4cG9ydHMgKgptb3VudHByb2NfZXhwb3J0XzEoYXJncCwgY2xudCkKCXZvaWQgKmFyZ3A7CglDTElFTlQgKmNsbnQ7CnsKCXN0YXRpYyBleHBvcnRzIGNsbnRfcmVzOwoKCW1lbXNldCgoY2hhciAqKSZjbG50X3JlcywgMCwgc2l6ZW9mKGNsbnRfcmVzKSk7CglpZiAoY2xudF9jYWxsKGNsbnQsIE1PVU5UUFJPQ19FWFBPUlQsICh4ZHJwcm9jX3QpIHhkcl92b2lkLAoJCSAgICAgIChjYWRkcl90KSBhcmdwLCAoeGRycHJvY190KSB4ZHJfZXhwb3J0cywKCQkgICAgICAoY2FkZHJfdCkgJmNsbnRfcmVzLCBUSU1FT1VUKSAhPSBSUENfU1VDQ0VTUykgewoJCXJldHVybiAoTlVMTCk7Cgl9CglyZXR1cm4gKCZjbG50X3Jlcyk7Cn0KCmV4cG9ydHMgKgptb3VudHByb2NfZXhwb3J0YWxsXzEoYXJncCwgY2xudCkKCXZvaWQgKmFyZ3A7CglDTElFTlQgKmNsbnQ7CnsKCXN0YXRpYyBleHBvcnRzIGNsbnRfcmVzOwoKCW1lbXNldCgoY2hhciAqKSZjbG50X3JlcywgMCwgc2l6ZW9mKGNsbnRfcmVzKSk7CglpZiAoY2xudF9jYWxsKGNsbnQsIE1PVU5UUFJPQ19FWFBPUlRBTEwsICh4ZHJwcm9jX3QpIHhkcl92b2lkLAoJCSAgICAgIChjYWRkcl90KSBhcmdwLCAoeGRycHJvY190KSB4ZHJfZXhwb3J0cywKCQkgICAgICAoY2FkZHJfdCkgJmNsbnRfcmVzLCBUSU1FT1VUKSAhPSBSUENfU1VDQ0VTUykgewoJICByZXR1cm4gKE5VTEwpOwoJfQoJcmV0dXJuICgmY2xudF9yZXMpOwp9Cgp2b2lkICoKbW91bnRwcm9jX251bGxfMihhcmdwLCBjbG50KQoJdm9pZCAqYXJncDsKCUNMSUVOVCAqY2xudDsKewoJc3RhdGljIGNoYXIgY2xudF9yZXM7CgoJbWVtc2V0KChjaGFyICopJmNsbnRfcmVzLCAwLCBzaXplb2YoY2xudF9yZXMpKTsKCWlmIChjbG50X2NhbGwoY2xudCwgTU9VTlRQUk9DX05VTEwsICh4ZHJwcm9jX3QpIHhkcl92b2lkLCBhcmdwLCAoeGRycHJvY190KSB4ZHJfdm9pZCwgJmNsbnRfcmVzLCBUSU1FT1VUKSAhPSBSUENfU1VDQ0VTUykgewoJCXJldHVybiAoTlVMTCk7Cgl9CglyZXR1cm4gKCh2b2lkICopJmNsbnRfcmVzKTsKfQoKZmhzdGF0dXMgKgptb3VudHByb2NfbW50XzIoYXJncCwgY2xudCkKCWRpcnBhdGggKmFyZ3A7CglDTElFTlQgKmNsbnQ7CnsKCXN0YXRpYyBmaHN0YXR1cyBjbG50X3JlczsKCgltZW1zZXQoKGNoYXIgKikmY2xudF9yZXMsIDAsIHNpemVvZihjbG50X3JlcykpOwoJaWYgKGNsbnRfY2FsbChjbG50LCBNT1VOVFBST0NfTU5ULCAoeGRycHJvY190KSB4ZHJfZGlycGF0aCwKCQkgICAgICAoY2FkZHJfdCkgYXJncCwgKHhkcnByb2NfdCkgeGRyX2Zoc3RhdHVzLAoJCSAgICAgIChjYWRkcl90KSAmY2xudF9yZXMsIFRJTUVPVVQpICE9IFJQQ19TVUNDRVNTKSB7CgkJcmV0dXJuIChOVUxMKTsKCX0KCXJldHVybiAoJmNsbnRfcmVzKTsKfQoKbW91bnRsaXN0ICoKbW91bnRwcm9jX2R1bXBfMihhcmdwLCBjbG50KQoJdm9pZCAqYXJncDsKCUNMSUVOVCAqY2xudDsKewoJc3RhdGljIG1vdW50bGlzdCBjbG50X3JlczsKCgltZW1zZXQoKGNoYXIgKikmY2xudF9yZXMsIDAsIHNpemVvZihjbG50X3JlcykpOwoJaWYgKGNsbnRfY2FsbChjbG50LCBNT1VOVFBST0NfRFVNUCwgKHhkcnByb2NfdCkgeGRyX3ZvaWQsIGFyZ3AsCgkJICAgICAgKHhkcnByb2NfdCkgeGRyX21vdW50bGlzdCwgKGNhZGRyX3QpICZjbG50X3JlcywKCQkgICAgICBUSU1FT1VUKSAhPSBSUENfU1VDQ0VTUykgewoJCXJldHVybiAoTlVMTCk7Cgl9CglyZXR1cm4gKCZjbG50X3Jlcyk7Cn0KCnZvaWQgKgptb3VudHByb2NfdW1udF8yKGFyZ3AsIGNsbnQpCglkaXJwYXRoICphcmdwOwoJQ0xJRU5UICpjbG50Owp7CglzdGF0aWMgY2hhciBjbG50X3JlczsKCgltZW1zZXQoKGNoYXIgKikmY2xudF9yZXMsIDAsIHNpemVvZihjbG50X3JlcykpOwoJaWYgKGNsbnRfY2FsbChjbG50LCBNT1VOVFBST0NfVU1OVCwgKHhkcnByb2NfdCkgeGRyX2RpcnBhdGgsCgkJICAgICAgKGNhZGRyX3QpIGFyZ3AsICh4ZHJwcm9jX3QpIHhkcl92b2lkLAoJCSAgICAgIChjYWRkcl90KSAmY2xudF9yZXMsIFRJTUVPVVQpICE9IFJQQ19TVUNDRVNTKSB7CgkJcmV0dXJuIChOVUxMKTsKCX0KCXJldHVybiAoKHZvaWQgKikmY2xudF9yZXMpOwp9Cgp2b2lkICoKbW91bnRwcm9jX3VtbnRhbGxfMihhcmdwLCBjbG50KQoJdm9pZCAqYXJncDsKCUNMSUVOVCAqY2xudDsKewoJc3RhdGljIGNoYXIgY2xudF9yZXM7CgoJbWVtc2V0KChjaGFyICopJmNsbnRfcmVzLCAwLCBzaXplb2YoY2xudF9yZXMpKTsKCWlmIChjbG50X2NhbGwoY2xudCwgTU9VTlRQUk9DX1VNTlRBTEwsICh4ZHJwcm9jX3QpIHhkcl92b2lkLAoJCSAgICAgIChjYWRkcl90KSBhcmdwLCAoeGRycHJvY190KSB4ZHJfdm9pZCwKCQkgICAgICAoY2FkZHJfdCkgJmNsbnRfcmVzLCBUSU1FT1VUKSAhPSBSUENfU1VDQ0VTUykgewoJCXJldHVybiAoTlVMTCk7Cgl9CglyZXR1cm4gKCh2b2lkICopJmNsbnRfcmVzKTsKfQoKZXhwb3J0cyAqCm1vdW50cHJvY19leHBvcnRfMihhcmdwLCBjbG50KQoJdm9pZCAqYXJncDsKCUNMSUVOVCAqY2xudDsKewoJc3RhdGljIGV4cG9ydHMgY2xudF9yZXM7CgoJbWVtc2V0KChjaGFyICopJmNsbnRfcmVzLCAwLCBzaXplb2YoY2xudF9yZXMpKTsKCWlmIChjbG50X2NhbGwoY2xudCwgTU9VTlRQUk9DX0VYUE9SVCwgKHhkcnByb2NfdCkgeGRyX3ZvaWQsCgkJICAgICAgYXJncCwgKHhkcnByb2NfdCkgeGRyX2V4cG9ydHMsIChjYWRkcl90KSAmY2xudF9yZXMsCgkJICAgICAgVElNRU9VVCkgIT0gUlBDX1NVQ0NFU1MpIHsKCQlyZXR1cm4gKE5VTEwpOwoJfQoJcmV0dXJuICgmY2xudF9yZXMpOwp9CgpleHBvcnRzICoKbW91bnRwcm9jX2V4cG9ydGFsbF8yKGFyZ3AsIGNsbnQpCgl2b2lkICphcmdwOwoJQ0xJRU5UICpjbG50Owp7CglzdGF0aWMgZXhwb3J0cyBjbG50X3JlczsKCgltZW1zZXQoKGNoYXIgKikmY2xudF9yZXMsIDAsIHNpemVvZihjbG50X3JlcykpOwoJaWYgKGNsbnRfY2FsbChjbG50LCBNT1VOVFBST0NfRVhQT1JUQUxMLCAoeGRycHJvY190KSB4ZHJfdm9pZCwgYXJncCwKCQkgICAgICAoeGRycHJvY190KSB4ZHJfZXhwb3J0cywgKGNhZGRyX3QpICZjbG50X3JlcywKCQkgICAgICBUSU1FT1VUKSAhPSBSUENfU1VDQ0VTUykgewoJCXJldHVybiAoTlVMTCk7Cgl9CglyZXR1cm4gKCZjbG50X3Jlcyk7Cn0KCnBwYXRoY25mICoKbW91bnRwcm9jX3BhdGhjb25mXzIoYXJncCwgY2xudCkKCWRpcnBhdGggKmFyZ3A7CglDTElFTlQgKmNsbnQ7CnsKCXN0YXRpYyBwcGF0aGNuZiBjbG50X3JlczsKCgltZW1zZXQoKGNoYXIgKikmY2xudF9yZXMsIDAsIHNpemVvZihjbG50X3JlcykpOwoJaWYgKGNsbnRfY2FsbChjbG50LCBNT1VOVFBST0NfUEFUSENPTkYsICh4ZHJwcm9jX3QpIHhkcl9kaXJwYXRoLAoJCSAgICAgIChjYWRkcl90KSBhcmdwLCAoeGRycHJvY190KSB4ZHJfcHBhdGhjbmYsCgkJICAgICAgKGNhZGRyX3QpICZjbG50X3JlcywgVElNRU9VVCkgIT0gUlBDX1NVQ0NFU1MpIHsKCQlyZXR1cm4gKE5VTEwpOwoJfQoJcmV0dXJuICgmY2xudF9yZXMpOwp9CgoKCgo=