LyoKICogbWliLmMKICoKICogJElkJAogKgogKiBVcGRhdGU6IDE5OTgtMDctMTcgPGpoeUBnc3UuZWR1PgogKiBBZGRlZCBwcmludF9vaWRfcmVwb3J0KiBmdW5jdGlvbnMuCiAqCiAqLwovKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHRzLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCUNvcHlyaWdodCAxOTg4LCAxOTg5LCAxOTkxLCAxOTkyIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CgogICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgbm90IGJlCnVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQpzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCgpDTVUgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwpBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKQ01VIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgpBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCldIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwpTT0ZUV0FSRS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CgojaWYgSEFWRV9ESVJFTlRfSAojIGluY2x1ZGUgPGRpcmVudC5oPgojIGRlZmluZSBOQU1MRU4oZGlyZW50KSBzdHJsZW4oKGRpcmVudCktPmRfbmFtZSkKI2Vsc2UKIyBkZWZpbmUgZGlyZW50IGRpcmVjdAojIGRlZmluZSBOQU1MRU4oZGlyZW50KSAoZGlyZW50KS0+ZF9uYW1sZW4KIyBpZiBIQVZFX1NZU19ORElSX0gKIyAgaW5jbHVkZSA8c3lzL25kaXIuaD4KIyBlbmRpZgojIGlmIEhBVkVfU1lTX0RJUl9ICiMgIGluY2x1ZGUgPHN5cy9kaXIuaD4KIyBlbmRpZgojIGlmIEhBVkVfTkRJUl9ICiMgIGluY2x1ZGUgPG5kaXIuaD4KIyBlbmRpZgojZW5kaWYKCiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgojaWYgSEFWRV9TVFJJTkdfSAojaW5jbHVkZSA8c3RyaW5nLmg+CiNlbHNlCiNpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgojaWYgSEFWRV9TVERMSUJfSAojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU0VMRUNUX0gKI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KI2VuZGlmCgojaWYgSEFWRV9VTklTVERfSAojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaWYgSEFWRV9ETUFMTE9DX0gKI2luY2x1ZGUgPGRtYWxsb2MuaD4KI2VuZGlmCgojaW5jbHVkZSA8bmV0LXNubXAvdHlwZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL291dHB1dF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2NvbmZpZ19hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL3V0aWxpdGllcy5oPgoKI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvYXNuMS5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wX2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9taWIuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvcGFyc2UuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvaW50NjQuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9jbGllbnQuaD4KCi8qKiBAZGVmZ3JvdXAgbWliX3V0aWxpdGllcyBtaWIgcGFyc2luZyBhbmQgZGF0YXR5cGUgbWFuaXB1bGF0aW9uIHJvdXRpbmVzLgogKiAgQGluZ3JvdXAgbGlicmFyeQogKgogKiAgQHsKICovCgpzdGF0aWMgY2hhciAgICAqdXB0aW1lU3RyaW5nKHVfbG9uZywgY2hhciAqLCBzaXplX3QpOwoKc3RhdGljIHN0cnVjdCB0cmVlICpfZ2V0X3JlYWxsb2Nfc3ltYm9sKGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdHJlZSAqc3VidHJlZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbmRleF9saXN0ICppbl9kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIGVuZF9vZl9rbm93bik7CgpzdGF0aWMgaW50ICAgICAgcHJpbnRfdHJlZV9ub2RlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyZWUgKnRwLCBpbnQgd2lkdGgpOwpzdGF0aWMgdm9pZCAgICAgaGFuZGxlX21pYmRpcnNfY29uZihjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSk7CnN0YXRpYyB2b2lkICAgICBoYW5kbGVfbWlic19jb25mKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKTsKc3RhdGljIHZvaWQgICAgIGhhbmRsZV9taWJmaWxlX2NvbmYoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpOwoKc3RhdGljIHZvaWQgICAgIF9vaWRfZmluaXNoX3ByaW50aW5nKGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLCBpbnQgKmJ1Zl9vdmVyZmxvdyk7CgovKgogKiBoZWxwZXIgZnVuY3Rpb25zIGZvciBnZXRfbW9kdWxlX25vZGUgCiAqLwpzdGF0aWMgaW50ICAgICAgbm9kZV90b19vaWQoc3RydWN0IHRyZWUgKiwgb2lkICosIHNpemVfdCAqKTsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKc3RhdGljIGludCAgICAgIF9hZGRfc3RyaW5nc190b19vaWQoc3RydWN0IHRyZWUgKiwgY2hhciAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaWQgKiwgc2l6ZV90ICosIHNpemVfdCk7CiNlbHNlCnN0YXRpYyBpbnQgICAgICBfYWRkX3N0cmluZ3NfdG9fb2lkKHZvaWQgKiwgY2hhciAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaWQgKiwgc2l6ZV90ICosIHNpemVfdCk7CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCk5FVFNOTVBfSU1QT1JUIHN0cnVjdCB0cmVlICp0cmVlX2hlYWQ7CnN0YXRpYyBzdHJ1Y3QgdHJlZSAqdHJlZV90b3A7CgpORVRTTk1QX0lNUE9SVCBzdHJ1Y3QgdHJlZSAqTWliOwpzdHJ1Y3QgdHJlZSAgICAqTWliOyAgICAgICAgICAgIC8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCm9pZCAgICAgICAgICAgICBSRkMxMjEzX01JQltdID0geyAxLCAzLCA2LCAxLCAyLCAxIH07CnN0YXRpYyBjaGFyICAgICBTdGFuZGFyZF9QcmVmaXhbXSA9ICIuMS4zLjYuMS4yLjEiOwoKLyoKICogU2V0IGRlZmF1bHQgaGVyZSBhcyBzb21lIHVzZXMgb2YgcmVhZF9vYmppZCByZXF1aXJlIHZhbGlkIHBvaW50ZXIuIAogKi8Kc3RhdGljIGNoYXIgICAgKlByZWZpeCA9ICZTdGFuZGFyZF9QcmVmaXhbMF07CnR5cGVkZWYgc3RydWN0IF9QcmVmaXhMaXN0IHsKICAgIGNvbnN0IGNoYXIgICAgICpzdHI7CiAgICBpbnQgICAgICAgICAgICAgbGVuOwp9ICAgICAgICAgICAgICAqUHJlZml4TGlzdFB0ciwgUHJlZml4TGlzdDsKCi8qCiAqIEhlcmUgYXJlIHRoZSBwcmVmaXggc3RyaW5ncy4KICogTm90ZSB0aGF0IHRoZSBmaXJzdCBvbmUgZmluZHMgdGhlIHZhbHVlIG9mIFByZWZpeCBvciBTdGFuZGFyZF9QcmVmaXguCiAqIEFueSBvZiB0aGVzZSBNQVkgc3RhcnQgd2l0aCBwZXJpb2Q7IGFsbCB3aWxsIE5PVCBlbmQgd2l0aCBwZXJpb2QuCiAqIFBlcmlvZCBpcyBhZGRlZCB3aGVyZSBuZWVkZWQuICBTZWUgdXNlIG9mIFByZWZpeCBpbiB0aGlzIG1vZHVsZS4KICovClByZWZpeExpc3QgICAgICBtaWJfcHJlZml4ZXNbXSA9IHsKICAgIHsmU3RhbmRhcmRfUHJlZml4WzBdfSwgICAgICAvKiBwbGFjZWhvbGRlciBmb3IgUHJlZml4IGRhdGEgKi8KICAgIHsiLmlzby5vcmcuZG9kLmludGVybmV0Lm1nbXQubWliLTIifSwKICAgIHsiLmlzby5vcmcuZG9kLmludGVybmV0LmV4cGVyaW1lbnRhbCJ9LAogICAgeyIuaXNvLm9yZy5kb2QuaW50ZXJuZXQucHJpdmF0ZSJ9LAogICAgeyIuaXNvLm9yZy5kb2QuaW50ZXJuZXQuc25tcFBhcnRpZXMifSwKICAgIHsiLmlzby5vcmcuZG9kLmludGVybmV0LnNubXBTZWNyZXRzIn0sCiAgICB7TlVMTCwgMH0gICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGxpc3QgKi8KfTsKCmVudW0gaW5ldF9hZGRyZXNzX3R5cGUgewogICAgSVBWNCA9IDEsCiAgICBJUFY2ID0gMiwKICAgIElQVjRaID0gMywKICAgIElQVjZaID0gNCwKICAgIEROUyA9IDE2Cn07CgoKLyoqCiAqIEBpbnRlcm5hbAogKiBDb252ZXJ0cyB0aW1ldGlja3MgdG8gaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMgc3RyaW5nLgogKgogKiBAcGFyYW0gdGltZXRpY2tzICAgIFRoZSB0aW1ldGlja3MgdG8gY29udmVydC4KICogQHBhcmFtIGJ1ZiAgICAgICAgICBCdWZmZXIgdG8gd3JpdGUgdG8sIGhhcyB0byBiZSBhdCAKICogICAgICAgICAgICAgICAgICAgICBsZWFzdCA0MCBCeXRlcyBsYXJnZS4KICogICAgICAgCiAqIEByZXR1cm4gVGhlIGJ1ZmZlci4KICovCnN0YXRpYyBjaGFyICAgICoKdXB0aW1lU3RyaW5nKHVfbG9uZyB0aW1ldGlja3MsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKewogICAgaW50ICAgICAgICAgICAgIGNlbnRpc2Vjcywgc2Vjb25kcywgbWludXRlcywgaG91cnMsIGRheXM7CgogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9OVU1FUklDX1RJTUVUSUNLUykpIHsKICAgICAgICBzbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVsdSIsIHRpbWV0aWNrcyk7CiAgICAgICAgcmV0dXJuIGJ1ZjsKICAgIH0KCgogICAgY2VudGlzZWNzID0gdGltZXRpY2tzICUgMTAwOwogICAgdGltZXRpY2tzIC89IDEwMDsKICAgIGRheXMgPSB0aW1ldGlja3MgLyAoNjAgKiA2MCAqIDI0KTsKICAgIHRpbWV0aWNrcyAlPSAoNjAgKiA2MCAqIDI0KTsKCiAgICBob3VycyA9IHRpbWV0aWNrcyAvICg2MCAqIDYwKTsKICAgIHRpbWV0aWNrcyAlPSAoNjAgKiA2MCk7CgogICAgbWludXRlcyA9IHRpbWV0aWNrcyAvIDYwOwogICAgc2Vjb25kcyA9IHRpbWV0aWNrcyAlIDYwOwoKICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKQogICAgICAgIHNucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJWQ6JWQ6JTAyZDolMDJkLiUwMmQiLAogICAgICAgICAgICAgICAgZGF5cywgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGNlbnRpc2Vjcyk7CiAgICBlbHNlIHsKICAgICAgICBpZiAoZGF5cyA9PSAwKSB7CiAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJWQ6JTAyZDolMDJkLiUwMmQiLAogICAgICAgICAgICAgICAgICAgIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBjZW50aXNlY3MpOwogICAgICAgIH0gZWxzZSBpZiAoZGF5cyA9PSAxKSB7CiAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJWQgZGF5LCAlZDolMDJkOiUwMmQuJTAyZCIsCiAgICAgICAgICAgICAgICAgICAgZGF5cywgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGNlbnRpc2Vjcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc25wcmludGYoYnVmLCBidWZsZW4sICIlZCBkYXlzLCAlZDolMDJkOiUwMmQuJTAyZCIsCiAgICAgICAgICAgICAgICAgICAgZGF5cywgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGNlbnRpc2Vjcyk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGJ1ZjsKfQoKCgovKioKICogQGludGVybmFsCiAqIFByaW50cyB0aGUgY2hhcmFjdGVyIHBvaW50ZWQgdG8gaWYgaW4gaHVtYW4tcmVhZGFibGUgQVNDSUkgcmFuZ2UsCiAqIG90aGVyd2lzZSBwcmludHMgYSBkb3QuCiAqCiAqIEBwYXJhbSBidWYgQnVmZmVyIHRvIHByaW50IHRoZSBjaGFyYWN0ZXIgdG8uCiAqIEBwYXJhbSBjaCAgQ2hhcmFjdGVyIHRvIHByaW50LgogKi8Kc3RhdGljIHZvaWQKc3ByaW50X2NoYXIoY2hhciAqYnVmLCBjb25zdCB1X2NoYXIgY2gpCnsKICAgIGlmIChpc3ByaW50KGNoKSB8fCBpc3NwYWNlKGNoKSkgewogICAgICAgIHNwcmludGYoYnVmLCAiJWMiLCAoaW50KSBjaCk7CiAgICB9IGVsc2UgewogICAgICAgIHNwcmludGYoYnVmLCAiLiIpOwogICAgfQp9CgoKCi8qKgogKiBQcmludHMgYSBoZXhhZGVjaW1hbCBzdHJpbmcgaW50byBhIGJ1ZmZlci4KICoKICogVGhlIGNoYXJhY3RlcnMgcG9pbnRlZCBieSAqY3AgYXJlIGVuY29kZWQgYXMgaGV4YWRlY2ltYWwgc3RyaW5nLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIGFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIGluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSBjcCAgICAgICB0aGUgYXJyYXkgb2YgY2hhcmFjdGVycyB0byBlbmNvZGUuCiAqIEBwYXJhbSBsaW5lX2xlbiB0aGUgYXJyYXkgbGVuZ3RoIG9mIGNwLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApfc3ByaW50X2hleHN0cmluZ19saW5lKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsIGNvbnN0IHVfY2hhciAqIGNwLCBzaXplX3QgbGluZV9sZW4pCnsKICAgIGNvbnN0IHVfY2hhciAgICp0cDsKICAgIGNvbnN0IHVfY2hhciAgICpjcDIgPSBjcDsKICAgIHNpemVfdCAgICAgICAgICBsZW5sZWZ0ID0gbGluZV9sZW47CgogICAgLyoKICAgICAqIE1ha2Ugc3VyZSB0aGVyZSdzIGVub3VnaCByb29tIGZvciB0aGUgaGV4IG91dHB1dC4uLi4KICAgICAqLwogICAgd2hpbGUgKCgqb3V0X2xlbiArIGxpbmVfbGVuKjMrMSkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIC4uLi4gYW5kIGRpc3BsYXkgdGhlIGhleCB2YWx1ZXMgdGhlbXNlbHZlcy4uLi4KICAgICAqLwogICAgZm9yICg7IGxlbmxlZnQgPj0gODsgbGVubGVmdC09OCkgewogICAgICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksCiAgICAgICAgICAgICAgICAiJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICIsIGNwWzBdLCBjcFsxXSwKICAgICAgICAgICAgICAgIGNwWzJdLCBjcFszXSwgY3BbNF0sIGNwWzVdLCBjcFs2XSwgY3BbN10pOwogICAgICAgICpvdXRfbGVuICs9IHN0cmxlbigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSk7CiAgICAgICAgY3AgICAgICAgKz0gODsKICAgIH0KICAgIGZvciAoOyBsZW5sZWZ0ID4gMDsgbGVubGVmdC0tKSB7CiAgICAgICAgc3ByaW50ZigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwgIiUwMlggIiwgKmNwKyspOwogICAgICAgICpvdXRfbGVuICs9IHN0cmxlbigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSk7CiAgICB9CgogICAgLyoKICAgICAqIC4uLi4gcGx1cyAob3B0aW9uYWxseSkgZG8gdGhlIHNhbWUgZm9yIHRoZSBBU0NJSSBlcXVpdmFsZW50LgogICAgICovCiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX0hFWF9URVhUKSkgewogICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyBsaW5lX2xlbis1KSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3ByaW50ZigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwgIiAgWyIpOwogICAgICAgICpvdXRfbGVuICs9IHN0cmxlbigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSk7CiAgICAgICAgZm9yICh0cCA9IGNwMjsgdHAgPCBjcDsgdHArKykgewogICAgICAgICAgICBzcHJpbnRfY2hhcigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwgKnRwKTsKICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgIH0KICAgICAgICBzcHJpbnRmKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLCAiXSIpOwogICAgICAgICpvdXRfbGVuICs9IHN0cmxlbigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKaW50CnNwcmludF9yZWFsbG9jX2hleHN0cmluZyh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsIGNvbnN0IHVfY2hhciAqIGNwLCBzaXplX3QgbGVuKQp7CiAgICBpbnQgbGluZV9sZW4gPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0hFWF9PVVRQVVRfTEVOR1RIKTsKICAgIGlmICghbGluZV9sZW4pCiAgICAgICAgbGluZV9sZW49bGVuOwoKICAgIGZvciAoOyAoaW50KWxlbiA+IGxpbmVfbGVuOyBsZW4gLT0gbGluZV9sZW4pIHsKICAgICAgICBpZighX3NwcmludF9oZXhzdHJpbmdfbGluZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwLCBsaW5lX2xlbikpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICooKmJ1ZiArICgqb3V0X2xlbikrKykgPSAnXG4nOwogICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IDA7CiAgICAgICAgY3AgKz0gbGluZV9sZW47CiAgICB9CiAgICBpZighX3NwcmludF9oZXhzdHJpbmdfbGluZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwLCBsZW4pKQogICAgICAgIHJldHVybiAwOwogICAgKigqYnVmICsgKm91dF9sZW4pID0gMDsKICAgIHJldHVybiAxOwp9CgoKCi8qKgogKiBQcmludHMgYW4gYXNjaWkgc3RyaW5nIGludG8gYSBidWZmZXIuCiAqCiAqIFRoZSBjaGFyYWN0ZXJzIHBvaW50ZWQgYnkgKmNwIGFyZSBlbmNvZGVkIGFzIGFuIGFzY2lpIHN0cmluZy4KICogCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgYWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgaW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIGNwICAgICAgIHRoZSBhcnJheSBvZiBjaGFyYWN0ZXJzIHRvIGVuY29kZS4KICogQHBhcmFtIGxlbiAgICAgIHRoZSBhcnJheSBsZW5ndGggb2YgY3AuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2FzY2lpc3RyaW5nKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1X2NoYXIgKiBjcCwgc2l6ZV90IGxlbikKewogICAgaW50ICAgICAgICAgICAgIGk7CgogICAgZm9yIChpID0gMDsgaSA8IChpbnQpIGxlbjsgaSsrKSB7CiAgICAgICAgaWYgKGlzcHJpbnQoKmNwKSB8fCBpc3NwYWNlKCpjcCkpIHsKICAgICAgICAgICAgaWYgKCpjcCA9PSAnXFwnIHx8ICpjcCA9PSAnIicpIHsKICAgICAgICAgICAgICAgIGlmICgoKm91dF9sZW4gPj0gKmJ1Zl9sZW4pICYmCiAgICAgICAgICAgICAgICAgICAgIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKigqYnVmICsgKCpvdXRfbGVuKSsrKSA9ICdcXCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCgqb3V0X2xlbiA+PSAqYnVmX2xlbikgJiYKICAgICAgICAgICAgICAgICEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICooKmJ1ZiArICgqb3V0X2xlbikrKykgPSAqY3ArKzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoKCpvdXRfbGVuID49ICpidWZfbGVuKSAmJgogICAgICAgICAgICAgICAgIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKigqYnVmICsgKCpvdXRfbGVuKSsrKSA9ICcuJzsKICAgICAgICAgICAgY3ArKzsKICAgICAgICB9CiAgICB9CiAgICBpZiAoKCpvdXRfbGVuID49ICpidWZfbGVuKSAmJgogICAgICAgICEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICdcMCc7CiAgICByZXR1cm4gMTsKfQoKLyoqCiAqIFByaW50cyBhbiBvY3RldCBzdHJpbmcgaW50byBhIGJ1ZmZlci4KICoKICogVGhlIHZhcmlhYmxlIHZhciBpcyBlbmNvZGVkIGFzIG9jdGV0IHN0cmluZy4KICogCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2Nfb2N0ZXRfc3RyaW5nKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLCBjb25zdCBjaGFyICpoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBzYXZlZF9vdXRfbGVuID0gKm91dF9sZW47CiAgICBjb25zdCBjaGFyICAgICAqc2F2ZWRfaGludCA9IGhpbnQ7CiAgICBpbnQgICAgICAgICAgICAgaGV4ID0gMCwgeCA9IDA7CiAgICB1X2NoYXIgICAgICAgICAqY3A7CiAgICBpbnQgICAgICAgICAgICAgb3V0cHV0X2Zvcm1hdCwgY250OwoKICAgIGlmICgodmFyLT50eXBlICE9IEFTTl9PQ1RFVF9TVFIpICYmIAogICAgICAgICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpKSB7CiAgICAgICAgY29uc3QgY2hhciAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBPQ1RFVCBTVFJJTkcpOiAiOwogICAgICAgIGlmIChzbm1wX2NzdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKCiAgICBpZiAoaGludCkgewogICAgICAgIGludCAgICAgICAgICAgICByZXBlYXQsIHdpZHRoID0gMTsKICAgICAgICBsb25nICAgICAgICAgICAgdmFsdWU7CiAgICAgICAgY2hhciAgICAgICAgICAgIGNvZGUgPSAnZCcsIHNlcGFyID0gMCwgdGVybSA9IDAsIGNoLCBpbnRidWZbMzJdOwojZGVmaW5lIEhFWDJESUdJVF9ORUVEX0lOSVQgMwogICAgICAgIGNoYXIgICAgICAgICAgICBoZXgyZGlnaXQgPSBIRVgyRElHSVRfTkVFRF9JTklUOwogICAgICAgIHVfY2hhciAgICAgICAgICplY3A7CgogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJTVFJJTkc6ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjcCA9IHZhci0+dmFsLnN0cmluZzsKICAgICAgICBlY3AgPSBjcCArIHZhci0+dmFsX2xlbjsKCiAgICAgICAgd2hpbGUgKGNwIDwgZWNwKSB7CiAgICAgICAgICAgIHJlcGVhdCA9IDE7CiAgICAgICAgICAgIGlmICgqaGludCkgewogICAgICAgICAgICAgICAgaWYgKCpoaW50ID09ICcqJykgewogICAgICAgICAgICAgICAgICAgIHJlcGVhdCA9ICpjcCsrOwogICAgICAgICAgICAgICAgICAgIGhpbnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdpZHRoID0gMDsKICAgICAgICAgICAgICAgIHdoaWxlICgnMCcgPD0gKmhpbnQgJiYgKmhpbnQgPD0gJzknKQogICAgICAgICAgICAgICAgICAgIHdpZHRoID0gKHdpZHRoICogMTApICsgKCpoaW50KysgLSAnMCcpOwogICAgICAgICAgICAgICAgY29kZSA9ICpoaW50Kys7CiAgICAgICAgICAgICAgICBpZiAoKGNoID0gKmhpbnQpICYmIGNoICE9ICcqJyAmJiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCiAgICAgICAgICAgICAgICAgICAgJiYgKHdpZHRoICE9IDAKICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGNoICE9ICd4JyAmJiBjaCAhPSAnZCcgJiYgY2ggIT0gJ28nKSkpCiAgICAgICAgICAgICAgICAgICAgc2VwYXIgPSAqaGludCsrOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHNlcGFyID0gMDsKICAgICAgICAgICAgICAgIGlmICgoY2ggPSAqaGludCkgJiYgY2ggIT0gJyonICYmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykKICAgICAgICAgICAgICAgICAgICAmJiAod2lkdGggIT0gMAogICAgICAgICAgICAgICAgICAgICAgICB8fCAoY2ggIT0gJ3gnICYmIGNoICE9ICdkJyAmJiBjaCAhPSAnbycpKSkKICAgICAgICAgICAgICAgICAgICB0ZXJtID0gKmhpbnQrKzsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB0ZXJtID0gMDsKICAgICAgICAgICAgICAgIGlmICh3aWR0aCA9PSAwKSAgLyogSGFuZGxlIG1hbGZvcm1lZCBoaW50IHN0cmluZ3MgKi8KICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdoaWxlIChyZXBlYXQgJiYgY3AgPCBlY3ApIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gMDsKICAgICAgICAgICAgICAgIGlmIChjb2RlICE9ICdhJyAmJiBjb2RlICE9ICd0JykgewogICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiAyNTYgKyAqY3ArKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ3gnOgogICAgICAgICAgICAgICAgICAgIGlmIChIRVgyRElHSVRfTkVFRF9JTklUID09IGhleDJkaWdpdCkKICAgICAgICAgICAgICAgICAgICAgICAgaGV4MmRpZ2l0ID0gbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfMkRJR0lUX0hFWF9PVVRQVVQpOwogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogaWYgdmFsdWUgaXMgPCAxNiwgaXQgd2lsbCBiZSBhIHNpbmdsZSBoZXggZGlnaXQuIElmIHRoZQogICAgICAgICAgICAgICAgICAgICAqIHdpZHRoIGlzIDEgKHdlIGFyZSBvdXRwdXR0aW5nIGEgYnl0ZSBhdCBhIHRpbWUpLCBwYXQgaXQKICAgICAgICAgICAgICAgICAgICAgKiB0byAyIGRpZ2l0cyBpZiBORVRTTk1QX0RTX0xJQl8yRElHSVRfSEVYX09VVFBVVCBpcyBzZXQKICAgICAgICAgICAgICAgICAgICAgKiBvciBhbGwgb2YgdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZToKICAgICAgICAgICAgICAgICAgICAgKiAgLSB3ZSBkbyBub3QgaGF2ZSBhIHNlcGFyYXRpb24gY2hhcmFjdGVyCiAgICAgICAgICAgICAgICAgICAgICogIC0gdGhlcmUgaXMgbm8gaGludCBsZWZ0IChvciB0aGVyZSBuZXZlciB3YXMgYSBoaW50KQogICAgICAgICAgICAgICAgICAgICAqCiAgICAgICAgICAgICAgICAgICAgICogZS5nLiBmb3IgdGhlIGRhdGEgMHhBQTAxQkIsIHdvdWxkIGFueW9uZSByZWFsbHkgZXZlcgogICAgICAgICAgICAgICAgICAgICAqIHdhbnQgdGhlIHN0cmluZyAiQUExQkIiPz8KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoKCh2YWx1ZSA8IDE2KSAmJiAoMSA9PSB3aWR0aCkpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIChoZXgyZGlnaXQgfHwgKCgwID09IHNlcGFyKSAmJiAoMCA9PSAqaGludCkpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIjAlbHgiLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlbHgiLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlbGQiLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgaW50YnVmKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdvJzoKICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiVsbyIsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3QnOiAvKiBuZXcgaW4gcmZjIDM0MTEgKi8KICAgICAgICAgICAgICAgIGNhc2UgJ2EnOgogICAgICAgICAgICAgICAgICAgIGNudCA9IFNOTVBfTUlOKHdpZHRoLCBlY3AgLSBjcCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19hc2NpaXN0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCBjcCwgY250KSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgY3AgKz0gY250OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAqb3V0X2xlbiA9IHNhdmVkX291dF9sZW47CiAgICAgICAgICAgICAgICAgICAgaWYgKHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKEJhZCBoaW50IGlnbm9yZWQ6ICIpCiAgICAgICAgICAgICAgICAgICAgICAgICYmIHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHNhdmVkX2hpbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICYmIHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICIpICIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19vY3RldF9zdHJpbmcoYnVmLCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoY3AgPCBlY3AgJiYgc2VwYXIpIHsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgMSkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IHNlcGFyOwogICAgICAgICAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAgICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAnXDAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVwZWF0LS07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0ZXJtICYmIGNwIDwgZWNwKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgMSkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSB0ZXJtOwogICAgICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gJ1wwJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHVuaXRzKSB7CiAgICAgICAgICAgIHJldHVybiAoc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiAiKQogICAgICAgICAgICAgICAgICAgICYmIHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHVuaXRzKSk7CiAgICAgICAgfQogICAgICAgIGlmICgoKm91dF9sZW4gPj0gKmJ1Zl9sZW4pICYmCiAgICAgICAgICAgICEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICdcMCc7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIG91dHB1dF9mb3JtYXQgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9TVFJJTkdfT1VUUFVUX0ZPUk1BVCk7CiAgICBpZiAoMCA9PSBvdXRwdXRfZm9ybWF0KSB7CiAgICAgICAgb3V0cHV0X2Zvcm1hdCA9IE5FVFNOTVBfU1RSSU5HX09VVFBVVF9HVUVTUzsKICAgIH0KICAgIHN3aXRjaCAob3V0cHV0X2Zvcm1hdCkgewogICAgY2FzZSBORVRTTk1QX1NUUklOR19PVVRQVVRfR1VFU1M6CiAgICAgICAgaGV4ID0gMDsKICAgICAgICBmb3IgKGNwID0gdmFyLT52YWwuc3RyaW5nLCB4ID0gMDsgeCA8IChpbnQpIHZhci0+dmFsX2xlbjsgeCsrLCBjcCsrKSB7CiAgICAgICAgICAgIGlmICghaXNwcmludCgqY3ApICYmICFpc3NwYWNlKCpjcCkpIHsKICAgICAgICAgICAgICAgIGhleCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBORVRTTk1QX1NUUklOR19PVVRQVVRfQVNDSUk6CiAgICAgICAgaGV4ID0gMDsKICAgICAgICBicmVhazsKCiAgICBjYXNlIE5FVFNOTVBfU1RSSU5HX09VVFBVVF9IRVg6CiAgICAgICAgaGV4ID0gMTsKICAgICAgICBicmVhazsKICAgIH0KCiAgICBpZiAodmFyLT52YWxfbGVuID09IDApIHsKICAgICAgICByZXR1cm4gc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlwiXCIiKTsKICAgIH0KCiAgICBpZiAoaGV4KSB7CiAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXCIiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIkhleC1TVFJJTkc6ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19oZXhzdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZywgdmFyLT52YWxfbGVuKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlwiIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTVFJJTkc6ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXCIiKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19hc2NpaXN0cmluZwogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB2YXItPnZhbC5zdHJpbmcsCiAgICAgICAgICAgICB2YXItPnZhbF9sZW4pKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIiIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwoKLyoqCiAqIFByaW50cyBhIGZsb2F0IGludG8gYSBidWZmZXIuCiAqCiAqIFRoZSB2YXJpYWJsZSB2YXIgaXMgZW5jb2RlZCBhcyBhIGZsb2F0aW5nIHBvaW50IHZhbHVlLgogKiAKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19mbG9hdCh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGlmICgodmFyLT50eXBlICE9IEFTTl9PUEFRVUVfRkxPQVQpICYmCiAgICAgICAgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICBpZiAoc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIEZsb2F0KTogIikpIHsKICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiT3BhcXVlOiBGbG9hdDogIikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKCiAgICAvKgogICAgICogSG93IG11Y2ggc3BhY2UgbmVlZGVkIGZvciBtYXguIGxlbmd0aCBmbG9hdD8gIDEyOCBpcyBvdmVya2lsbC4gIAogICAgICovCgogICAgd2hpbGUgKCgqb3V0X2xlbiArIDEyOCArIDEpID49ICpidWZfbGVuKSB7CiAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICIlZiIsICp2YXItPnZhbC5mbG9hdFZhbCk7CiAgICAqb3V0X2xlbiArPSBzdHJsZW4oKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbikpOwoKICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhIGRvdWJsZSBpbnRvIGEgYnVmZmVyLgogKgogKiBUaGUgdmFyaWFibGUgdmFyIGlzIGVuY29kZWQgYXMgYSBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlLgogKiAKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19kb3VibGUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX09QQVFVRV9ET1VCTEUpICYmIAogICAgICAgICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpKSB7CiAgICAgICAgaWYgKHNubXBfY3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAKICAgICAgICAgICAgICJXcm9uZyBUeXBlIChzaG91bGQgYmUgRG91YmxlKTogIikpIHsKICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiT3BhcXVlOiBGbG9hdDogIikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiBIb3cgbXVjaCBzcGFjZSBuZWVkZWQgZm9yIG1heC4gbGVuZ3RoIGRvdWJsZT8gIDEyOCBpcyBvdmVya2lsbC4gIAogICAgICovCgogICAgd2hpbGUgKCgqb3V0X2xlbiArIDEyOCArIDEpID49ICpidWZfbGVuKSB7CiAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICIlZiIsICp2YXItPnZhbC5kb3VibGVWYWwpOwogICAgKm91dF9sZW4gKz0gc3RybGVuKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pKTsKCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUyAqLwoKCi8qKgogKiBQcmludHMgYSBjb3VudGVyIGludG8gYSBidWZmZXIuCiAqCiAqIFRoZSB2YXJpYWJsZSB2YXIgaXMgZW5jb2RlZCBhcyBhIGNvdW50ZXIgdmFsdWUuCiAqIAogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2NvdW50ZXI2NCh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBjaGFyICAgICAgICAgICAgYTY0YnVmW0k2NENIQVJTWiArIDFdOwoKICAgIGlmICgodmFyLT50eXBlICE9IEFTTl9DT1VOVEVSNjQKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgICAgICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0NPVU5URVI2NAogICAgICAgICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0k2NCAmJiB2YXItPnR5cGUgIT0gQVNOX09QQVFVRV9VNjQKI2VuZGlmCiAgICAgICAgKSAmJiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSkgewogICAgICAgIGlmIChzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgIldyb25nIFR5cGUgKHNob3VsZCBiZSBDb3VudGVyNjQpOiAiKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICAgICAgaWYgKHZhci0+dHlwZSAhPSBBU05fQ09VTlRFUjY0KSB7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiT3BhcXVlOiAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiNlbmRpZgojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICAgICAgc3dpdGNoICh2YXItPnR5cGUpIHsKICAgICAgICBjYXNlIEFTTl9PUEFRVUVfVTY0OgogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlVJbnQ2NDogIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQVNOX09QQVFVRV9JNjQ6CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiSW50NjQ6ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFTTl9DT1VOVEVSNjQ6CiAgICAgICAgY2FzZSBBU05fT1BBUVVFX0NPVU5URVI2NDoKI2VuZGlmCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiQ291bnRlcjY0OiAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgICAgIH0KI2VuZGlmCiAgICB9CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIGlmICh2YXItPnR5cGUgPT0gQVNOX09QQVFVRV9JNjQpIHsKICAgICAgICBwcmludEk2NChhNjRidWYsIHZhci0+dmFsLmNvdW50ZXI2NCk7CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBhNjRidWYpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiNlbmRpZgogICAgICAgIHByaW50VTY0KGE2NGJ1ZiwgdmFyLT52YWwuY291bnRlcjY0KTsKICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGE2NGJ1ZikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICB9CiNlbmRpZgoKICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhbiBvYmplY3QgaWRlbnRpZmllciBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX29wYXF1ZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fT1BBUVVFCiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgICAgICAmJiB2YXItPnR5cGUgIT0gQVNOX09QQVFVRV9DT1VOVEVSNjQKICAgICAgICAmJiB2YXItPnR5cGUgIT0gQVNOX09QQVFVRV9VNjQKICAgICAgICAmJiB2YXItPnR5cGUgIT0gQVNOX09QQVFVRV9JNjQKICAgICAgICAmJiB2YXItPnR5cGUgIT0gQVNOX09QQVFVRV9GTE9BVCAmJiB2YXItPnR5cGUgIT0gQVNOX09QQVFVRV9ET1VCTEUKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMgKi8KICAgICAgICApICYmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpKSB7CiAgICAgICAgaWYgKHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgIldyb25nIFR5cGUgKHNob3VsZCBiZSBPcGFxdWUpOiAiKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICBzd2l0Y2ggKHZhci0+dHlwZSkgewogICAgY2FzZSBBU05fT1BBUVVFX0NPVU5URVI2NDoKICAgIGNhc2UgQVNOX09QQVFVRV9VNjQ6CiAgICBjYXNlIEFTTl9PUEFRVUVfSTY0OgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19jb3VudGVyNjQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PUEFRVUVfRkxPQVQ6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2Zsb2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX09QQVFVRV9ET1VCTEU6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2RvdWJsZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fT1BBUVVFOgojZW5kaWYKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIk9QQVFVRTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghc3ByaW50X3JlYWxsb2NfaGV4c3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmcsIHZhci0+dmFsX2xlbikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICB9CiNlbmRpZgogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhbiBvYmplY3QgaWRlbnRpZmllciBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX29iamVjdF9pZGVudGlmaWVyKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgaW50ICAgICAgICAgICAgIGJ1Zl9vdmVyZmxvdyA9IDA7CgogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX09CSkVDVF9JRCkgJiYKICAgICAgICAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9CiAgICAgICAgICAgICJXcm9uZyBUeXBlIChzaG91bGQgYmUgT0JKRUNUIElERU5USUZJRVIpOiAiOwogICAgICAgIGlmIChzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiT0lEOiAiOwogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkX3RyZWUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9pZCAqKSAodmFyLT52YWwub2JqaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsX2xlbiAvIHNpemVvZihvaWQpKTsKCiAgICBpZiAoYnVmX292ZXJmbG93KSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKCi8qKgogKiBQcmludHMgYSB0aW1ldGljayB2YXJpYWJsZSBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX3RpbWV0aWNrcyh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBjaGFyICAgICAgICAgICAgdGltZWJ1Zls0MF07CgogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX1RJTUVUSUNLUykgJiYgCiAgICAgICAgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIFRpbWV0aWNrcyk6ICI7CiAgICAgICAgaWYgKHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTlVNRVJJQ19USU1FVElDS1MpKSB7CiAgICAgICAgY2hhciAgICAgICAgICAgIHN0clszMl07CiAgICAgICAgc3ByaW50ZihzdHIsICIlbHUiLCAqKHVfbG9uZyAqKSB2YXItPnZhbC5pbnRlZ2VyKTsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICBjaGFyICAgICAgICAgICAgc3RyWzMyXTsKICAgICAgICBzcHJpbnRmKHN0ciwgIlRpbWV0aWNrczogKCVsdSkgIiwgKih1X2xvbmcgKikgdmFyLT52YWwuaW50ZWdlcik7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAoY29uc3QgdV9jaGFyICopIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgdXB0aW1lU3RyaW5nKCoodV9sb25nICopICh2YXItPnZhbC5pbnRlZ2VyKSwgdGltZWJ1Ziwgc2l6ZW9mKHRpbWVidWYpKTsKICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAoY29uc3QgdV9jaGFyICopIHRpbWVidWYpKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGFuIGludGVnZXIgYWNjb3JkaW5nIHRvIHRoZSBoaW50IGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhbCAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBkZWNpbWFsdHlwZSAnZCcgb3IgJ3UnIGRlcGVuZGluZyBvbiBpbnRlZ2VyIHR5cGUKICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBfTk9UXyBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfaGludGVkX2ludGVnZXIodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdmFsLCBjb25zdCBjaGFyIGRlY2ltYWx0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgY2hhciAgICAgICAgICAgIGZtdFsxMF0gPSAiJWxAIiwgdG1wWzI1Nl07CiAgICBpbnQgICAgICAgICAgICAgc2hpZnQgPSAwLCBsZW4sIG5lZ2F0aXZlID0gMDsKCiAgICBpZiAoaGludFswXSA9PSAnZCcpIHsKICAgICAgICAvKgogICAgICAgICAqIFdlIG1pZ2h0ICphY3R1YWxseSogd2FudCBhICd1JyBoZXJlLiAgCiAgICAgICAgICovCiAgICAgICAgaWYgKGhpbnRbMV0gPT0gJy0nKQogICAgICAgICAgICBzaGlmdCA9IGF0b2koaGludCArIDIpOwogICAgICAgIGZtdFsyXSA9IGRlY2ltYWx0eXBlOwogICAgICAgIGlmICh2YWwgPCAwKSB7CiAgICAgICAgICAgIG5lZ2F0aXZlID0gMTsKICAgICAgICAgICAgdmFsID0gLXZhbDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIC8qCiAgICAgICAgICogRElTUExBWS1ISU5UIGNoYXJhY3RlciBpcyAnYicsICdvJywgb3IgJ3gnLiAgCiAgICAgICAgICovCiAgICAgICAgZm10WzJdID0gaGludFswXTsKICAgIH0KCiAgICBpZiAoaGludFswXSA9PSAnYicpIHsKCXVuc2lnbmVkIGxvbmcgaW50IGJpdCA9IDB4ODAwMDAwMDBMVTsKCWNoYXIgKmJwID0gdG1wOwoJd2hpbGUgKGJpdCkgewoJICAgICpicCsrID0gdmFsICYgYml0ID8gJzEnIDogJzAnOwoJICAgIGJpdCA+Pj0gMTsKCX0KCSpicCA9IDA7CiAgICB9CiAgICBlbHNlCglzcHJpbnRmKHRtcCwgZm10LCB2YWwpOwoKICAgIGlmIChzaGlmdCAhPSAwKSB7CiAgICAgICAgbGVuID0gc3RybGVuKHRtcCk7CiAgICAgICAgaWYgKHNoaWZ0IDw9IGxlbikgewogICAgICAgICAgICB0bXBbbGVuICsgMV0gPSAwOwogICAgICAgICAgICB3aGlsZSAoc2hpZnQtLSkgewogICAgICAgICAgICAgICAgdG1wW2xlbl0gPSB0bXBbbGVuIC0gMV07CiAgICAgICAgICAgICAgICBsZW4tLTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0bXBbbGVuXSA9ICcuJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0bXBbc2hpZnQgKyAxXSA9IDA7CiAgICAgICAgICAgIHdoaWxlIChzaGlmdCkgewogICAgICAgICAgICAgICAgaWYgKGxlbi0tID4gMCkgewogICAgICAgICAgICAgICAgICAgIHRtcFtzaGlmdF0gPSB0bXBbbGVuXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdG1wW3NoaWZ0XSA9ICcwJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNoaWZ0LS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdG1wWzBdID0gJy4nOwogICAgICAgIH0KICAgIH0KICAgIGlmIChuZWdhdGl2ZSkgewogICAgICAgIGxlbiA9IHN0cmxlbih0bXApKzE7CiAgICAgICAgd2hpbGUgKGxlbikgewogICAgICAgICAgICB0bXBbbGVuXSA9IHRtcFtsZW4tMV07CiAgICAgICAgICAgIGxlbi0tOwogICAgICAgIH0KICAgICAgICB0bXBbMF0gPSAnLSc7CiAgICB9CiAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAodV9jaGFyICopdG1wKTsKfQoKCi8qKgogKiBQcmludHMgYW4gaW50ZWdlciBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2ludGVnZXIodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGNoYXIgICAgICAgICAgICplbnVtX3N0cmluZyA9IE5VTEw7CgogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX0lOVEVHRVIpICYmIAogICAgICAgICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBJTlRFR0VSKTogIjsKICAgICAgICBpZiAoc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBmb3IgKDsgZW51bXM7IGVudW1zID0gZW51bXMtPm5leHQpIHsKICAgICAgICBpZiAoZW51bXMtPnZhbHVlID09ICp2YXItPnZhbC5pbnRlZ2VyKSB7CiAgICAgICAgICAgIGVudW1fc3RyaW5nID0gZW51bXMtPmxhYmVsOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICJJTlRFR0VSOiAiKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKGVudW1fc3RyaW5nID09IE5VTEwgfHwKICAgICAgICBuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfTlVNRVJJQ19FTlVNKSkgewogICAgICAgIGlmIChoaW50KSB7CiAgICAgICAgICAgIGlmICghKHNwcmludF9yZWFsbG9jX2hpbnRlZF9pbnRlZ2VyKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhci0+dmFsLmludGVnZXIsICdkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludCwgdW5pdHMpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjaGFyICAgICAgICAgICAgc3RyWzMyXTsKICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlbGQiLCAqdmFyLT52YWwuaW50ZWdlcik7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgZW51bV9zdHJpbmcpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgY2hhciAgICAgICAgICAgIHN0clszMl07CiAgICAgICAgc3ByaW50ZihzdHIsICIoJWxkKSIsICp2YXItPnZhbC5pbnRlZ2VyKTsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGVudW1fc3RyaW5nKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAoY29uc3QgdV9jaGFyICopIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYW4gdW5zaWduZWQgaW50ZWdlciBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX3VpbnRlZ2VyKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgY2hhciAgICAgICAgICAgKmVudW1fc3RyaW5nID0gTlVMTDsKCiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fVUlOVEVHRVIpICYmIAogICAgICAgICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBVSW50ZWdlcjMyKTogIjsKICAgICAgICBpZiAoc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgZm9yICg7IGVudW1zOyBlbnVtcyA9IGVudW1zLT5uZXh0KSB7CiAgICAgICAgaWYgKGVudW1zLT52YWx1ZSA9PSAqdmFyLT52YWwuaW50ZWdlcikgewogICAgICAgICAgICBlbnVtX3N0cmluZyA9IGVudW1zLT5sYWJlbDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChlbnVtX3N0cmluZyA9PSBOVUxMIHx8CiAgICAgICAgbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX05VTUVSSUNfRU5VTSkpIHsKICAgICAgICBpZiAoaGludCkgewogICAgICAgICAgICBpZiAoIShzcHJpbnRfcmVhbGxvY19oaW50ZWRfaW50ZWdlcihidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YXItPnZhbC5pbnRlZ2VyLCAndScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnQsIHVuaXRzKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY2hhciAgICAgICAgICAgIHN0clszMl07CiAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJWx1IiwgKnZhci0+dmFsLmludGVnZXIpOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGVudW1fc3RyaW5nKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgIHNwcmludGYoc3RyLCAiKCVsdSkiLCAqdmFyLT52YWwuaW50ZWdlcik7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBlbnVtX3N0cmluZykpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGEgZ2F1Z2UgdmFsdWUgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19nYXVnZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGNoYXIgICAgICAgICAgICB0bXBbMzJdOwoKICAgIGlmICgodmFyLT50eXBlICE9IEFTTl9HQVVHRSkgJiYgCiAgICAgICAgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPQogICAgICAgICAgICAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIEdhdWdlMzIgb3IgVW5zaWduZWQzMik6ICI7CiAgICAgICAgaWYgKHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJHYXVnZTMyOiAiOwogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIGlmIChoaW50KSB7CiAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19oaW50ZWRfaW50ZWdlcihidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhci0+dmFsLmludGVnZXIsICd1JywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIHNwcmludGYodG1wLCAiJXUiLCAodW5zaWduZWQgaW50KSgqdmFyLT52YWwuaW50ZWdlciAmIDB4ZmZmZmZmZmYpKTsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIChjb25zdCB1X2NoYXIgKikgdG1wKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGEgY291bnRlciB2YWx1ZSBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2NvdW50ZXIodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGNoYXIgICAgICAgICAgICB0bXBbMzJdOwoKICAgIGlmICgodmFyLT50eXBlICE9IEFTTl9DT1VOVEVSKSAmJiAKICAgICAgICAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgQ291bnRlcjMyKTogIjsKICAgICAgICBpZiAoc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIkNvdW50ZXIzMjogIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBzcHJpbnRmKHRtcCwgIiV1IiwgKHVuc2lnbmVkIGludCkoKnZhci0+dmFsLmludGVnZXIgJiAweGZmZmZmZmZmKSk7CiAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKGNvbnN0IHVfY2hhciAqKSB0bXApKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGEgbmV0d29yayBhZGRyZXNzIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfbmV0d29ya2FkZHJlc3ModV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsIGNvbnN0IGNoYXIgKmhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgaTsKCiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fSVBBRERSRVNTKSAmJiAKICAgICAgICAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgTmV0d29ya0FkZHJlc3MpOiAiOwogICAgICAgIGlmIChzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiTmV0d29yayBBZGRyZXNzOiAiOwogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICB3aGlsZSAoKCpvdXRfbGVuICsgKHZhci0+dmFsX2xlbiAqIDMpICsgMikgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgZm9yIChpID0gMDsgaSA8IHZhci0+dmFsX2xlbjsgaSsrKSB7CiAgICAgICAgc3ByaW50ZigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwgIiUwMlgiLCB2YXItPnZhbC5zdHJpbmdbaV0pOwogICAgICAgICpvdXRfbGVuICs9IDI7CiAgICAgICAgaWYgKGkgPCB2YXItPnZhbF9sZW4gLSAxKSB7CiAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICc6JzsKICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhbiBpcC1hZGRyZXNzIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfaXBhZGRyZXNzKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHVfY2hhciAgICAgICAgICppcCA9IHZhci0+dmFsLnN0cmluZzsKCiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fSVBBRERSRVNTKSAmJiAKICAgICAgICAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgSXBBZGRyZXNzKTogIjsKICAgICAgICBpZiAoc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIklwQWRkcmVzczogIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICB3aGlsZSAoKCpvdXRfbGVuICsgMTcpID49ICpidWZfbGVuKSB7CiAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgaWYgKGlwKQogICAgICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICIlZC4lZC4lZC4lZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBbMF0sIGlwWzFdLCBpcFsyXSwgaXBbM10pOwogICAgKm91dF9sZW4gKz0gc3RybGVuKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pKTsKICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhIG51bGwgdmFsdWUgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19udWxsKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fTlVMTCkgJiYgCiAgICAgICAgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIE5VTEwpOiAiOwogICAgICAgIGlmIChzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIk5VTEwiOwogICAgICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cik7CiAgICB9Cn0KCgovKioKICogUHJpbnRzIGEgYml0IHN0cmluZyBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2JpdHN0cmluZyh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBpbnQgICAgICAgICAgICAgbGVuLCBiaXQ7CiAgICB1X2NoYXIgICAgICAgICAqY3A7CiAgICBjaGFyICAgICAgICAgICAqZW51bV9zdHJpbmc7CgogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX0JJVF9TVFIgJiYgdmFyLT50eXBlICE9IEFTTl9PQ1RFVF9TVFIpICYmCiAgICAgICAgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIEJJVFMpOiAiOwogICAgICAgIGlmIChzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJcIiI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiQklUUzogIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBpZiAoIXNwcmludF9yZWFsbG9jX2hleHN0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5iaXRzdHJpbmcsIHZhci0+dmFsX2xlbikpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJcIiI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBjcCA9IHZhci0+dmFsLmJpdHN0cmluZzsKICAgICAgICBmb3IgKGxlbiA9IDA7IGxlbiA8IChpbnQpIHZhci0+dmFsX2xlbjsgbGVuKyspIHsKICAgICAgICAgICAgZm9yIChiaXQgPSAwOyBiaXQgPCA4OyBiaXQrKykgewogICAgICAgICAgICAgICAgaWYgKCpjcCAmICgweDgwID4+IGJpdCkpIHsKICAgICAgICAgICAgICAgICAgICBlbnVtX3N0cmluZyA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgZm9yICg7IGVudW1zOyBlbnVtcyA9IGVudW1zLT5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnVtcy0+dmFsdWUgPT0gKGxlbiAqIDgpICsgYml0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtX3N0cmluZyA9IGVudW1zLT5sYWJlbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChlbnVtX3N0cmluZyA9PSBOVUxMIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9QUklOVF9OVU1FUklDX0VOVU0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVkICIsIChsZW4gKiA4KSArIGJpdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiglZCkgIiwgKGxlbiAqIDgpICsgYml0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGVudW1fc3RyaW5nKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHN0cikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNwKys7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCmludApzcHJpbnRfcmVhbGxvY19uc2FwYWRkcmVzcyh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywgY29uc3QgY2hhciAqaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGlmICgodmFyLT50eXBlICE9IEFTTl9OU0FQKSAmJiAKICAgICAgICAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgTnNhcEFkZHJlc3MpOiAiOwogICAgICAgIGlmIChzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiTnNhcEFkZHJlc3M6ICI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19oZXhzdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmcsIHZhci0+dmFsX2xlbik7Cn0KCgovKioKICogRmFsbGJhY2sgcm91dGluZSBmb3IgYSBiYWQgdHlwZSwgcHJpbnRzICJWYXJpYWJsZSBoYXMgYmFkIHR5cGUiIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfYmFkdHlwZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIlZhcmlhYmxlIGhhcyBiYWQgdHlwZSI7CgogICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKTsKfQoKCgovKioKICogVW5pdmVyc2FsIHByaW50IHJvdXRpbmUsIHByaW50cyBhIHZhcmlhYmxlIGludG8gYSBidWZmZXIgYWNjb3JkaW5nIHRvIHRoZSB2YXJpYWJsZSAKICogdHlwZS4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19ieV90eXBlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBERUJVR01TR1RMKCgib3V0cHV0IiwgInNwcmludF9ieV90eXBlLCB0eXBlICVkXG4iLCB2YXItPnR5cGUpKTsKCiAgICBzd2l0Y2ggKHZhci0+dHlwZSkgewogICAgY2FzZSBBU05fSU5URUdFUjoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfaW50ZWdlcihidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgY2FzZSBBU05fT0NURVRfU1RSOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19vY3RldF9zdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKICAgIGNhc2UgQVNOX0JJVF9TVFI6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2JpdHN0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgY2FzZSBBU05fT1BBUVVFOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19vcGFxdWUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgY2FzZSBBU05fT0JKRUNUX0lEOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19vYmplY3RfaWRlbnRpZmllcihidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnQsIHVuaXRzKTsKICAgIGNhc2UgQVNOX1RJTUVUSUNLUzoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfdGltZXRpY2tzKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiAgICBjYXNlIEFTTl9HQVVHRToKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfZ2F1Z2UoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICBjYXNlIEFTTl9DT1VOVEVSOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19jb3VudGVyKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICBjYXNlIEFTTl9JUEFERFJFU1M6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2lwYWRkcmVzcyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgY2FzZSBBU05fTlVMTDoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfbnVsbChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgY2FzZSBBU05fVUlOVEVHRVI6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX3VpbnRlZ2VyKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgY2FzZSBBU05fQ09VTlRFUjY0OgojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICBjYXNlIEFTTl9PUEFRVUVfVTY0OgogICAgY2FzZSBBU05fT1BBUVVFX0k2NDoKICAgIGNhc2UgQVNOX09QQVFVRV9DT1VOVEVSNjQ6CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTICovCiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2NvdW50ZXI2NChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICBjYXNlIEFTTl9PUEFRVUVfRkxPQVQ6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2Zsb2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgY2FzZSBBU05fT1BBUVVFX0RPVUJMRToKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfZG91YmxlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMgKi8KICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNwcmludF9ieV90eXBlIiwgImJhZCB0eXBlOiAlZFxuIiwgdmFyLT50eXBlKSk7CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2JhZHR5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgIH0KfQoKCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCi8qKgogKiBSZXRyaWV2ZXMgdGhlIHRyZWUgaGVhZC4KICoKICogQHJldHVybiB0aGUgdHJlZSBoZWFkLgogKi8Kc3RydWN0IHRyZWUgICAgKgpnZXRfdHJlZV9oZWFkKHZvaWQpCnsKICAgIHJldHVybiAodHJlZV9oZWFkKTsKfQoKc3RhdGljIGNoYXIgICAgKmNvbmZtaWJkaXIgPSBOVUxMOwpzdGF0aWMgY2hhciAgICAqY29uZm1pYnMgPSBOVUxMOwoKc3RhdGljIHZvaWQKaGFuZGxlX21pYmRpcnNfY29uZihjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSkKewogICAgY2hhciAgICAgICAgICAgKmN0bXA7CgogICAgaWYgKGNvbmZtaWJkaXIpIHsKICAgICAgICBpZiAoKCpsaW5lID09ICcrJykgfHwgKCpsaW5lID09ICctJykpIHsKICAgICAgICAgICAgY3RtcCA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oY29uZm1pYmRpcikgKyBzdHJsZW4obGluZSkgKyAyKTsKICAgICAgICAgICAgaWYgKCFjdG1wKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWliZGlyIGNvbmYgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZigqbGluZSsrID09ICcrJykKICAgICAgICAgICAgICAgIHNwcmludGYoY3RtcCwgIiVzJWMlcyIsIGNvbmZtaWJkaXIsIEVOVl9TRVBBUkFUT1JfQ0hBUiwgbGluZSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHNwcmludGYoY3RtcCwgIiVzJWMlcyIsIGxpbmUsIEVOVl9TRVBBUkFUT1JfQ0hBUiwgY29uZm1pYmRpcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY3RtcCA9IHN0cmR1cChsaW5lKTsKICAgICAgICAgICAgaWYgKCFjdG1wKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJtaWJzIGNvbmYgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBTTk1QX0ZSRUUoY29uZm1pYmRpcik7CiAgICB9IGVsc2UgewogICAgICAgIGN0bXAgPSBzdHJkdXAobGluZSk7CiAgICAgICAgaWYgKCFjdG1wKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgIm1pYnMgY29uZiBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgY29uZm1pYmRpciA9IGN0bXA7CiAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJ1c2luZyBtaWJkaXJzOiAlc1xuIiwgY29uZm1pYmRpcikpOwp9CgpzdGF0aWMgdm9pZApoYW5kbGVfbWlic19jb25mKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKQp7CiAgICBjaGFyICAgICAgICAgICAqY3RtcDsKCiAgICBpZiAoY29uZm1pYnMpIHsKICAgICAgICBpZiAoKCpsaW5lID09ICcrJykgfHwgKCpsaW5lID09ICctJykpIHsKICAgICAgICAgICAgY3RtcCA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oY29uZm1pYnMpICsgc3RybGVuKGxpbmUpICsgMik7CiAgICAgICAgICAgIGlmICghY3RtcCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAibWlicyBjb25mIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoKmxpbmUrKyA9PSAnKycpCiAgICAgICAgICAgICAgICBzcHJpbnRmKGN0bXAsICIlcyVjJXMiLCBjb25mbWlicywgRU5WX1NFUEFSQVRPUl9DSEFSLCBsaW5lKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc3ByaW50ZihjdG1wLCAiJXMlYyVzIiwgbGluZSwgRU5WX1NFUEFSQVRPUl9DSEFSLCBjb25mbWliZGlyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjdG1wID0gc3RyZHVwKGxpbmUpOwogICAgICAgICAgICBpZiAoIWN0bXApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgIm1pYnMgY29uZiBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIFNOTVBfRlJFRShjb25mbWlicyk7CiAgICB9IGVsc2UgewogICAgICAgIGN0bXAgPSBzdHJkdXAobGluZSk7CiAgICAgICAgaWYgKCFjdG1wKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgIm1pYnMgY29uZiBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgY29uZm1pYnMgPSBjdG1wOwogICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAidXNpbmcgbWliczogJXNcbiIsIGNvbmZtaWJzKSk7Cn0KCgpzdGF0aWMgdm9pZApoYW5kbGVfbWliZmlsZV9jb25mKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKQp7CiAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJyZWFkaW5nIG1pYmZpbGU6ICVzXG4iLCBsaW5lKSk7CiAgICByZWFkX21pYihsaW5lKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkCmhhbmRsZV9wcmludF9udW1lcmljKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKQp7CiAgICBjb25zdCBjaGFyICp2YWx1ZTsKICAgIGNoYXIgICAgICAgKnN0OwoKICAgIHZhbHVlID0gc3RydG9rX3IobGluZSwgIiBcdFxuIiwgJnN0KTsKICAgIGlmICh2YWx1ZSAmJiAoCgkgICAgKHN0cmNhc2VjbXAodmFsdWUsICJ5ZXMiKSAgPT0gMCkgfHwgCgkgICAgKHN0cmNhc2VjbXAodmFsdWUsICJ0cnVlIikgPT0gMCkgfHwKCSAgICAoKnZhbHVlID09ICcxJykgKSkgewoKICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX09JRF9PVVRQVVRfTlVNRVJJQyk7CiAgICB9Cn0KCmNoYXIgICAgICAgICAgICoKc25tcF9vdXRfdG9nZ2xlX29wdGlvbnMoY2hhciAqb3B0aW9ucykKewogICAgd2hpbGUgKCpvcHRpb25zKSB7CiAgICAgICAgc3dpdGNoICgqb3B0aW9ucysrKSB7CiAgICAgICAgY2FzZSAnMCc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCXzJESUdJVF9IRVhfT1VUUFVUKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1NUUklOR19PVVRQVVRfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX1NUUklOR19PVVRQVVRfQVNDSUkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdiJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0RPTlRfQlJFQUtET1dOX09JRFMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdlJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX05VTUVSSUNfRU5VTSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ0UnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVNDQVBFX1FVT1RFUyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2YnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9PSURfT1VUUFVUX0ZVTEwpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICduJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfT0lEX09VVFBVVF9OVU1FUklDKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1EnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5ULCAxKTsKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX09JRF9PVVRQVVRfU1VGRklYKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnUyc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX09JRF9PVVRQVVRfTU9EVUxFKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAndCc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9OVU1FUklDX1RJTUVUSUNLUyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1QnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfSEVYX1RFWFQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd1JzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfT0lEX09VVFBVVF9VQ0QpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdVJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0RPTlRfUFJJTlRfVU5JVFMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd2JzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX0JBUkVfVkFMVUUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd4JzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfU1RSSU5HX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfU1RSSU5HX09VVFBVVF9IRVgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdYJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VYVEVOREVEX0lOREVYKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMgLSAxOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBOVUxMOwp9Cgp2b2lkCnNubXBfb3V0X3RvZ2dsZV9vcHRpb25zX3VzYWdlKGNvbnN0IGNoYXIgKmxlYWQsIEZJTEUgKiBvdXRmKQp7CiAgICBmcHJpbnRmKG91dGYsICIlczA6ICBwcmludCBsZWFkaW5nIDAgZm9yIHNpbmdsZS1kaWdpdCBoZXggY2hhcmFjdGVyc1xuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc2E6ICBwcmludCBhbGwgc3RyaW5ncyBpbiBhc2NpaSBmb3JtYXRcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNiOiAgZG8gbm90IGJyZWFrIE9JRCBpbmRleGVzIGRvd25cbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNlOiAgcHJpbnQgZW51bXMgbnVtZXJpY2FsbHlcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNFOiAgZXNjYXBlIHF1b3RlcyBpbiBzdHJpbmcgaW5kaWNlc1xuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc2Y6ICBwcmludCBmdWxsIE9JRHMgb24gb3V0cHV0XG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzbjogIHByaW50IE9JRHMgbnVtZXJpY2FsbHlcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNxOiAgcXVpY2sgcHJpbnQgZm9yIGVhc2llciBwYXJzaW5nXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzUTogIHF1aWNrIHByaW50IHdpdGggZXF1YWwtc2lnbnNcbiIsIGxlYWQpOyAgICAvKiBAQEpEVyAqLwogICAgZnByaW50ZihvdXRmLCAiJXNzOiAgcHJpbnQgb25seSBsYXN0IHN5bWJvbGljIGVsZW1lbnQgb2YgT0lEXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzUzogIHByaW50IE1JQiBtb2R1bGUtaWQgcGx1cyBsYXN0IGVsZW1lbnRcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXN0OiAgcHJpbnQgdGltZXRpY2tzIHVucGFyc2VkIGFzIG51bWVyaWMgaW50ZWdlcnNcbiIsCiAgICAgICAgICAgIGxlYWQpOwogICAgZnByaW50ZihvdXRmLAogICAgICAgICAgICAiJXNUOiAgcHJpbnQgaHVtYW4tcmVhZGFibGUgdGV4dCBhbG9uZyB3aXRoIGhleCBzdHJpbmdzXG4iLAogICAgICAgICAgICBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzdTogIHByaW50IE9JRHMgdXNpbmcgVUNELXN0eWxlIHByZWZpeCBzdXBwcmVzc2lvblxuIiwKICAgICAgICAgICAgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc1U6ICBkb24ndCBwcmludCB1bml0c1xuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc3Y6ICBwcmludCB2YWx1ZXMgb25seSAobm90IE9JRCA9IHZhbHVlKVxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc3g6ICBwcmludCBhbGwgc3RyaW5ncyBpbiBoZXggZm9ybWF0XG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzWDogIGV4dGVuZGVkIGluZGV4IGZvcm1hdFxuIiwgbGVhZCk7Cn0KCmNoYXIgKgpzbm1wX2luX29wdGlvbnMoY2hhciAqb3B0YXJnLCBpbnQgYXJnYywgY2hhciAqY29uc3QgKmFyZ3YpCnsKICAgIGNoYXIgKmNwOwoKICAgIGZvciAoY3AgPSBvcHRhcmc7ICpjcDsgY3ArKykgewogICAgICAgIHN3aXRjaCAoKmNwKSB7CiAgICAgICAgY2FzZSAnYic6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9SRUdFWF9BQ0NFU1MpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdSJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1JBTkRPTV9BQ0NFU1MpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdyJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0RPTlRfQ0hFQ0tfUkFOR0UpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX05PX0RJU1BMQVlfSElOVCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3UnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUkVBRF9VQ0RfU1RZTEVfT0lEKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgIC8qIFdoYXQgaWYgYXJnYy9hcmd2IGFyZSBudWxsID8gKi8KICAgICAgICAgICAgaWYgKCEqKCsrY3ApKQogICAgICAgICAgICAgICAgY3AgPSBhcmd2W29wdGluZCsrXTsKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX09JRFNVRkZJWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgICAgIGNhc2UgJ1MnOgogICAgICAgICAgICAvKiBXaGF0IGlmIGFyZ2MvYXJndiBhcmUgbnVsbCA/ICovCiAgICAgICAgICAgIGlmICghKigrK2NwKSkKICAgICAgICAgICAgICAgIGNwID0gYXJndltvcHRpbmQrK107CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9PSURQUkVGSVgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcCk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgIC8qCiAgICAgICAgICAgICogIEhlcmU/ICBPciBpbiBzbm1wX3BhcnNlX2FyZ3M/CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJVbmtub3duIGlucHV0IG9wdGlvbiBwYXNzZWQgdG8gLUk6ICVjLlxuIiwgKmNwKTsKICAgICAgICAgICAgKi8KICAgICAgICAgICAgcmV0dXJuIGNwOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgpjaGFyICAgICAgICAgICAqCnNubXBfaW5fdG9nZ2xlX29wdGlvbnMoY2hhciAqb3B0aW9ucykKewogICAgcmV0dXJuIHNubXBfaW5fb3B0aW9ucyggb3B0aW9ucywgMCwgTlVMTCApOwp9CgoKLyoqCiAqIFByaW50cyBvdXQgYSBoZWxwIHVzYWdlIGZvciB0aGUgaW4qIHRvZ2dsZSBvcHRpb25zLgogKgogKiBAcGFyYW0gbGVhZCAgICAgIFRoZSBsZWFkIHRvIHByaW50IGZvciBldmVyeSBsaW5lLgogKiBAcGFyYW0gb3V0ZiAgICAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gd3JpdGUgdG8uCiAqIAogKi8Kdm9pZApzbm1wX2luX3RvZ2dsZV9vcHRpb25zX3VzYWdlKGNvbnN0IGNoYXIgKmxlYWQsIEZJTEUgKiBvdXRmKQp7CiAgICBmcHJpbnRmKG91dGYsICIlc2I6ICBkbyBiZXN0L3JlZ2V4IG1hdGNoaW5nIHRvIGZpbmQgYSBNSUIgbm9kZVxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc2g6ICBkb24ndCBhcHBseSBESVNQTEFZLUhJTlRzXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzcjogIGRvIG5vdCBjaGVjayB2YWx1ZXMgZm9yIHJhbmdlL3R5cGUgbGVnYWxpdHlcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNSOiAgZG8gcmFuZG9tIGFjY2VzcyB0byBPSUQgbGFiZWxzXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwKICAgICAgICAgICAgIiVzdTogIHRvcC1sZXZlbCBPSURzIG11c3QgaGF2ZSAnLicgcHJlZml4IChVQ0Qtc3R5bGUpXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwKICAgICAgICAgICAgIiVzcyBTVUZGSVg6ICBBcHBlbmQgYWxsIHRleHR1YWwgT0lEcyB3aXRoIFNVRkZJWCBiZWZvcmUgcGFyc2luZ1xuIiwKICAgICAgICAgICAgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsCiAgICAgICAgICAgICIlc1MgUFJFRklYOiAgUHJlcGVuZCBhbGwgdGV4dHVhbCBPSURzIHdpdGggUFJFRklYIGJlZm9yZSBwYXJzaW5nXG4iLAogICAgICAgICAgICBsZWFkKTsKfQoKLyoqKgogKgogKi8gCnZvaWQKcmVnaXN0ZXJfbWliX2hhbmRsZXJzKHZvaWQpCnsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIHJlZ2lzdGVyX3ByZW5ldHNubXBfbWliX2hhbmRsZXIoInNubXAiLCAibWliZGlycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV9taWJkaXJzX2NvbmYsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbbWliLWRpcnN8K21pYi1kaXJzfC1taWItZGlyc10iKTsKICAgIHJlZ2lzdGVyX3ByZW5ldHNubXBfbWliX2hhbmRsZXIoInNubXAiLCAibWlicyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV9taWJzX2NvbmYsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbbWliLXRva2Vuc3wrbWliLXRva2Vuc10iKTsKICAgIHJlZ2lzdGVyX2NvbmZpZ19oYW5kbGVyKCJzbm1wIiwgIm1pYmZpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX21pYmZpbGVfY29uZiwgTlVMTCwgIm1pYmZpbGUtdG8tcmVhZCIpOwogICAgLyoKICAgICAqIHJlZ2lzdGVyIHRoZSBzbm1wLmNvbmYgY29uZmlndXJhdGlvbiBoYW5kbGVycyBmb3IgZGVmYXVsdAogICAgICogcGFyc2luZyBiZWhhdmlvdXIgCiAgICAgKi8KCiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAic2hvd01pYkVycm9ycyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJfRVJST1JTKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJjb21tZW50VG9FT0wiLCAgICAgLyogRGVzY3JpYmVzIGFjdHVhbCBiZWhhdmlvdXIgKi8KICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQl9DT01NRU5UX1RFUk0pOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgInN0cmljdENvbW1lbnRUZXJtIiwgICAgLyogQmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCX0NPTU1FTlRfVEVSTSk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAibWliQWxsb3dVbmRlcmxpbmUiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCX1BBUlNFX0xBQkVMKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9JTlRFR0VSLCAic25tcCIsICJtaWJXYXJuaW5nTGV2ZWwiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJtaWJSZXBsYWNlV2l0aExhdGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJfUkVQTEFDRSk7CiNlbmRpZgoKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJwcmludE51bWVyaWNFbnVtcyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9OVU1FUklDX0VOVU0pOwogICAgcmVnaXN0ZXJfcHJlbmV0c25tcF9taWJfaGFuZGxlcigic25tcCIsICJwcmludE51bWVyaWNPaWRzIiwKICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfcHJpbnRfbnVtZXJpYywgTlVMTCwgIigxfHllc3x0cnVlfDB8bm98ZmFsc2UpIik7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAiZXNjYXBlUXVvdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VTQ0FQRV9RVU9URVMpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgImRvbnRCcmVha2Rvd25PaWRzIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0RPTlRfQlJFQUtET1dOX09JRFMpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgInF1aWNrUHJpbnRpbmciLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgIm51bWVyaWNUaW1ldGlja3MiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTlVNRVJJQ19USU1FVElDS1MpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0lOVEVHRVIsICJzbm1wIiwgIm9pZE91dHB1dEZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fSU5URUdFUiwgInNubXAiLCAic3VmZml4UHJpbnRpbmciLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgImV4dGVuZGVkSW5kZXgiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVhURU5ERURfSU5ERVgpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgInByaW50SGV4VGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9IRVhfVEVYVCk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAicHJpbnRWYWx1ZU9ubHkiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfQkFSRV9WQUxVRSk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAiZG9udFByaW50VW5pdHMiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRE9OVF9QUklOVF9VTklUUyk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fSU5URUdFUiwgInNubXAiLCAiaGV4T3V0cHV0TGVuZ3RoIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0hFWF9PVVRQVVRfTEVOR1RIKTsKfQoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKLyoKICogZnVuY3Rpb24gOiBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5CiAqICAgICAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHN0cmluZyBvZiB0aGUgZGlyZWN0b3JpZXMKICogICAgICAgICAgICAgIGZyb20gd2hpY2ggdGhlIE1JQiBtb2R1bGVzIHdpbGwgYmUgc2VhcmNoZWQgb3IKICogICAgICAgICAgICAgIGxvYWRlZC4KICogYXJndW1lbnRzOiBjb25zdCBjaGFyICpkaXIsIHdoaWNoIGFyZSB0aGUgZGlyZWN0b3JpZXMKICogICAgICAgICAgICAgIGZyb20gd2hpY2ggdGhlIE1JQiBtb2R1bGVzIHdpbGwgYmUgc2VhcmNoZWQgb3IKICogICAgICAgICAgICAgIGxvYWRlZC4KICogcmV0dXJucyAgOiAtCiAqLwp2b2lkCm5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkoY29uc3QgY2hhciAqZGlyKQp7CiAgICBjb25zdCBjaGFyICpuZXdkaXI7CiAgICBjaGFyICpvbGRkaXIsICp0bXBkaXIgPSBOVUxMOwoKICAgIERFQlVHVFJBQ0U7CiAgICBpZiAoTlVMTCA9PSBkaXIpIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAKICAgIG9sZGRpciA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsCgkJCQkgICBORVRTTk1QX0RTX0xJQl9NSUJESVJTKTsKICAgIGlmIChvbGRkaXIpIHsKICAgICAgICBpZiAoKCpkaXIgPT0gJysnKSB8fCAoKmRpciA9PSAnLScpKSB7CiAgICAgICAgICAgIC8qKiBOZXcgZGlyIHN0YXJ0cyB3aXRoICcrJywgdGh1cyB3ZSBhZGQgaXQuICovCiAgICAgICAgICAgIHRtcGRpciA9IChjaGFyICopbWFsbG9jKHN0cmxlbihkaXIpICsgc3RybGVuKG9sZGRpcikgKyAyKTsKICAgICAgICAgICAgaWYgKCF0bXBkaXIpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgInNldCBtaWJkaXIgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKmRpcisrID09ICcrJykKICAgICAgICAgICAgICAgIHNwcmludGYodG1wZGlyLCAiJXMlYyVzIiwgb2xkZGlyLCBFTlZfU0VQQVJBVE9SX0NIQVIsIGRpcik7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHNwcmludGYodG1wZGlyLCAiJXMlYyVzIiwgZGlyLCBFTlZfU0VQQVJBVE9SX0NIQVIsIG9sZGRpcik7CiAgICAgICAgICAgIG5ld2RpciA9IHRtcGRpcjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXdkaXIgPSBkaXI7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvKiogSWYgZGlyIHN0YXJ0cyB3aXRoICcrJyBza2lwICcrJyBpdC4gKi8KICAgICAgICBuZXdkaXIgPSAoKCpkaXIgPT0gJysnKSA/ICsrZGlyIDogZGlyKTsKICAgIH0KICAgIG5ldHNubXBfZHNfc2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQkRJUlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3ZGlyKTsKCiAgICAvKiogc2V0X3N0cmluZyBjYWxscyBzdHJkdXAsIHNvIGlmIHdlIGFsbG9jYXRlZCBtZW1vcnksIGZyZWUgaXQgKi8KICAgIGlmICh0bXBkaXIgPT0gbmV3ZGlyKSB7CiAgICAgICAgU05NUF9GUkVFKHRtcGRpcik7CiAgICB9Cn0KCi8qCiAqIGZ1bmN0aW9uIDogbmV0c25tcF9nZXRfbWliX2RpcmVjdG9yeQogKiAgICAgICAgICAgIC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nIG9mIHRoZSBkaXJlY3RvcmllcwogKiAgICAgICAgICAgICAgZnJvbSB3aGljaCB0aGUgTUlCIG1vZHVsZXMgd2lsbCBiZSBzZWFyY2hlZCBvcgogKiAgICAgICAgICAgICAgbG9hZGVkLgogKiAgICAgICAgICAgICAgSWYgdGhlIHZhbHVlIHN0aWxsIGRvZXMgbm90IGV4aXN0cywgaXQgd2lsbCBiZSBtYWRlCiAqICAgICAgICAgICAgICBmcm9tIHRoZSBldmlyb25tZW50IHZhcmlhYmxlICdNSUJESVJTJyBhbmQvb3IgdGhlCiAqICAgICAgICAgICAgICBkZWZhdWx0LgogKiBhcmd1bWVudHM6IC0KICogcmV0dXJucyAgOiBjaGFyICogb2YgdGhlIGRpcmVjdG9yaWVzIGluIHdoaWNoIHRoZSBNSUIgbW9kdWxlcwogKiAgICAgICAgICAgIHdpbGwgYmUgc2VhcmNoZWQvbG9hZGVkLgogKi8KCmNoYXIgKgpuZXRzbm1wX2dldF9taWJfZGlyZWN0b3J5KHZvaWQpCnsKICAgIGNoYXIgKmRpcjsKCiAgICBERUJVR1RSQUNFOwogICAgZGlyID0gbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCRElSUyk7CiAgICBpZiAoZGlyID09IE5VTEwpIHsKICAgICAgICBERUJVR01TR1RMKCgiZ2V0X21pYl9kaXJlY3RvcnkiLCAibm8gbWliIGRpcmVjdG9yaWVzIHNldFxuIikpOwoKICAgICAgICAvKiogQ2hlY2sgaWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCAqLwogICAgICAgIGRpciA9IG5ldHNubXBfZ2V0ZW52KCJNSUJESVJTIik7CiAgICAgICAgaWYgKGRpciA9PSBOVUxMKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJubyBtaWIgZGlyZWN0b3JpZXMgc2V0IGJ5IGVudmlyb25tZW50XG4iKSk7CiAgICAgICAgICAgIC8qKiBOb3Qgc2V0IHVzZSBoYXJkIGNvZGVkIHBhdGggKi8KICAgICAgICAgICAgaWYgKGNvbmZtaWJkaXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm5vIG1pYiBkaXJlY3RvcmllcyBzZXQgYnkgY29uZmlnXG4iKSk7CiAgICAgICAgICAgICAgICBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KE5FVFNOTVBfREVGQVVMVF9NSUJESVJTKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgoKmNvbmZtaWJkaXIgPT0gJysnKSB8fCAoKmNvbmZtaWJkaXIgPT0gJy0nKSkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm1pYiBkaXJlY3RvcmllcyBzZXQgYnkgY29uZmlnIChidXQgYWRkZWQpXG4iKSk7CiAgICAgICAgICAgICAgICBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KE5FVFNOTVBfREVGQVVMVF9NSUJESVJTKTsKICAgICAgICAgICAgICAgIG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkoY29uZm1pYmRpcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgiZ2V0X21pYl9kaXJlY3RvcnkiLCAibWliIGRpcmVjdG9yaWVzIHNldCBieSBjb25maWdcbiIpKTsKICAgICAgICAgICAgICAgIG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkoY29uZm1pYmRpcik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCgqZGlyID09ICcrJykgfHwgKCpkaXIgPT0gJy0nKSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgiZ2V0X21pYl9kaXJlY3RvcnkiLCAibWliIGRpcmVjdG9yaWVzIHNldCBieSBlbnZpcm9ubWVudCAoYnV0IGFkZGVkKVxuIikpOwogICAgICAgICAgICBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KE5FVFNOTVBfREVGQVVMVF9NSUJESVJTKTsKICAgICAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShkaXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJtaWIgZGlyZWN0b3JpZXMgc2V0IGJ5IGVudmlyb25tZW50XG4iKSk7CiAgICAgICAgICAgIG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkoZGlyKTsKICAgICAgICB9CiAgICAgICAgZGlyID0gbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCRElSUyk7CiAgICB9CiAgICBERUJVR01TR1RMKCgiZ2V0X21pYl9kaXJlY3RvcnkiLCAibWliIGRpcmVjdG9yaWVzIHNldCAnJXMnXG4iLCBkaXIpKTsKICAgIHJldHVybihkaXIpOwp9CgovKgogKiBmdW5jdGlvbiA6IG5ldHNubXBfZml4dXBfbWliX2RpcmVjdG9yeQogKiBhcmd1bWVudHM6IC0KICogcmV0dXJucyAgOiAtCiAqLwp2b2lkCm5ldHNubXBfZml4dXBfbWliX2RpcmVjdG9yeSh2b2lkKQp7CiAgICBjaGFyICpob21lcGF0aCA9IG5ldHNubXBfZ2V0ZW52KCJIT01FIik7CiAgICBjaGFyICptaWJwYXRoID0gbmV0c25tcF9nZXRfbWliX2RpcmVjdG9yeSgpOwogICAgY2hhciAqb2xkbWlicGF0aCA9IE5VTEw7CiAgICBjaGFyICpwdHJfaG9tZTsKICAgIGNoYXIgKm5ld19taWJwYXRoOwoKICAgIERFQlVHVFJBQ0U7CiAgICBpZiAoaG9tZXBhdGggJiYgbWlicGF0aCkgewogICAgICAgIERFQlVHTVNHVEwoKCJmaXh1cF9taWJfZGlyZWN0b3J5IiwgIm1pYiBkaXJlY3RvcmllcyAnJXMnXG4iLCBtaWJwYXRoKSk7CiAgICAgICAgd2hpbGUgKChwdHJfaG9tZSA9IHN0cnN0cihtaWJwYXRoLCAiJEhPTUUiKSkpIHsKICAgICAgICAgICAgbmV3X21pYnBhdGggPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4obWlicGF0aCkgLSBzdHJsZW4oIiRIT01FIikgKwoJCQkJCSBzdHJsZW4oaG9tZXBhdGgpKzEpOwogICAgICAgICAgICBpZiAobmV3X21pYnBhdGgpIHsKICAgICAgICAgICAgICAgICpwdHJfaG9tZSA9IDA7IC8qIG51bGwgb3V0IHRoZSBzcG90IHdoZXJlIHdlIHN0b3AgY29weWluZyAqLwogICAgICAgICAgICAgICAgc3ByaW50ZihuZXdfbWlicGF0aCwgIiVzJXMlcyIsIG1pYnBhdGgsIGhvbWVwYXRoLAoJCQlwdHJfaG9tZSArIHN0cmxlbigiJEhPTUUiKSk7CiAgICAgICAgICAgICAgICAvKiogc3dhcCBpbiB0aGUgbmV3IHZhbHVlIGFuZCByZXBlYXQgKi8KICAgICAgICAgICAgICAgIG1pYnBhdGggPSBuZXdfbWlicGF0aDsKCQlpZiAob2xkbWlicGF0aCAhPSBOVUxMKSB7CgkJICAgIFNOTVBfRlJFRShvbGRtaWJwYXRoKTsKCQl9CgkJb2xkbWlicGF0aCA9IG5ld19taWJwYXRoOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkobWlicGF0aCk7CgkKCS8qICBUaGUgYWJvdmUgY29waWVzIHRoZSBtaWJwYXRoIGZvciB1cywgc28uLi4gICovCgoJaWYgKG9sZG1pYnBhdGggIT0gTlVMTCkgewoJICAgIFNOTVBfRlJFRShvbGRtaWJwYXRoKTsKCX0KCiAgICB9Cgp9CgovKioKICogSW5pdGlhbGlzZXMgdGhlIG1pYiByZWFkZXIuCiAqCiAqIFJlYWRzIGluIGFsbCBzZXR0aW5ncyBmcm9tIHRoZSBlbnZpcm9ubWVudC4KICovCnZvaWQKbmV0c25tcF9pbml0X21pYih2b2lkKQp7CiAgICBjb25zdCBjaGFyICAgICAqcHJlZml4OwogICAgY2hhciAgICAgICAgICAgKmVudl92YXIsICplbnRyeTsKICAgIFByZWZpeExpc3RQdHIgICBwcCA9ICZtaWJfcHJlZml4ZXNbMF07CiAgICBjaGFyICAgICAgICAgICAqc3QgPSBOVUxMOwoKICAgIGlmIChNaWIpCiAgICAgICAgcmV0dXJuOwogICAgbmV0c25tcF9pbml0X21pYl9pbnRlcm5hbHMoKTsKCiAgICAvKgogICAgICogSW5pdGlhbGlzZSB0aGUgTUlCIGRpcmVjdG9yeS9pZXMgCiAgICAgKi8KICAgIG5ldHNubXBfZml4dXBfbWliX2RpcmVjdG9yeSgpOwogICAgZW52X3ZhciA9IHN0cmR1cChuZXRzbm1wX2dldF9taWJfZGlyZWN0b3J5KCkpOwogICAgbmV0c25tcF9taWJpbmRleF9sb2FkKCk7CgogICAgREVCVUdNU0dUTCgoImluaXRfbWliIiwKICAgICAgICAgICAgICAgICJTZWVuIE1JQkRJUlM6IExvb2tpbmcgaW4gJyVzJyBmb3IgbWliIGRpcnMgLi4uXG4iLAogICAgICAgICAgICAgICAgZW52X3ZhcikpOwoKICAgIGVudHJ5ID0gc3RydG9rX3IoZW52X3ZhciwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgIHdoaWxlIChlbnRyeSkgewogICAgICAgIGFkZF9taWJkaXIoZW50cnkpOwogICAgICAgIGVudHJ5ID0gc3RydG9rX3IoTlVMTCwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgIH0KICAgIFNOTVBfRlJFRShlbnZfdmFyKTsKCiAgICBlbnZfdmFyID0gbmV0c25tcF9nZXRlbnYoIk1JQkZJTEVTIik7CiAgICBpZiAoZW52X3ZhciAhPSBOVUxMKSB7CiAgICAgICAgaWYgKCplbnZfdmFyID09ICcrJykKICAgICAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihlbnZfdmFyKzEsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBlbnRyeSA9IHN0cnRva19yKGVudl92YXIsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICAgICAgd2hpbGUgKGVudHJ5KSB7CiAgICAgICAgICAgIGFkZF9taWJmaWxlKGVudHJ5LCBOVUxMLCBOVUxMKTsKICAgICAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihOVUxMLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgICAgIH0KICAgIH0KCiAgICBuZXRzbm1wX2luaXRfbWliX2ludGVybmFscygpOwoKICAgIC8qCiAgICAgKiBSZWFkIGluIGFueSBtb2R1bGVzIG9yIG1pYnMgcmVxdWVzdGVkIAogICAgICovCgogICAgZW52X3ZhciA9IG5ldHNubXBfZ2V0ZW52KCJNSUJTIik7CiAgICBpZiAoZW52X3ZhciA9PSBOVUxMKSB7CiAgICAgICAgaWYgKGNvbmZtaWJzICE9IE5VTEwpCiAgICAgICAgICAgIGVudl92YXIgPSBzdHJkdXAoY29uZm1pYnMpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgZW52X3ZhciA9IHN0cmR1cChORVRTTk1QX0RFRkFVTFRfTUlCUyk7CiAgICB9IGVsc2UgewogICAgICAgIGVudl92YXIgPSBzdHJkdXAoZW52X3Zhcik7CiAgICB9CiAgICBpZiAoZW52X3ZhciAmJiAoKCplbnZfdmFyID09ICcrJykgfHwgKCplbnZfdmFyID09ICctJykpKSB7CiAgICAgICAgZW50cnkgPQogICAgICAgICAgICAoY2hhciAqKSBtYWxsb2Moc3RybGVuKE5FVFNOTVBfREVGQVVMVF9NSUJTKSArIHN0cmxlbihlbnZfdmFyKSArIDIpOwogICAgICAgIGlmICghZW50cnkpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoImluaXRfbWliIiwgImVudiBtaWJzIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgIFNOTVBfRlJFRShlbnZfdmFyKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgqZW52X3ZhciA9PSAnKycpCiAgICAgICAgICAgICAgICBzcHJpbnRmKGVudHJ5LCAiJXMlYyVzIiwgTkVUU05NUF9ERUZBVUxUX01JQlMsIEVOVl9TRVBBUkFUT1JfQ0hBUiwKICAgICAgICAgICAgICAgICAgICAgICAgZW52X3ZhcisxKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc3ByaW50ZihlbnRyeSwgIiVzJWMlcyIsIGVudl92YXIrMSwgRU5WX1NFUEFSQVRPUl9DSEFSLAogICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RFRkFVTFRfTUlCUyApOwogICAgICAgIH0KICAgICAgICBTTk1QX0ZSRUUoZW52X3Zhcik7CiAgICAgICAgZW52X3ZhciA9IGVudHJ5OwogICAgfQoKICAgIERFQlVHTVNHVEwoKCJpbml0X21pYiIsCiAgICAgICAgICAgICAgICAiU2VlbiBNSUJTOiBMb29raW5nIGluICclcycgZm9yIG1pYiBmaWxlcyAuLi5cbiIsCiAgICAgICAgICAgICAgICBlbnZfdmFyKSk7CiAgICBlbnRyeSA9IHN0cnRva19yKGVudl92YXIsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICB3aGlsZSAoZW50cnkpIHsKICAgICAgICBpZiAoc3RyY2FzZWNtcChlbnRyeSwgREVCVUdfQUxXQVlTX1RPS0VOKSA9PSAwKSB7CiAgICAgICAgICAgIHJlYWRfYWxsX21pYnMoKTsKICAgICAgICB9IGVsc2UgaWYgKHN0cnN0cihlbnRyeSwgIi8iKSAhPSBOVUxMKSB7CiAgICAgICAgICAgIHJlYWRfbWliKGVudHJ5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXRzbm1wX3JlYWRfbW9kdWxlKGVudHJ5KTsKICAgICAgICB9CiAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihOVUxMLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgfQogICAgYWRvcHRfb3JwaGFucygpOwogICAgU05NUF9GUkVFKGVudl92YXIpOwoKICAgIGVudl92YXIgPSBuZXRzbm1wX2dldGVudigiTUlCRklMRVMiKTsKICAgIGlmIChlbnZfdmFyICE9IE5VTEwpIHsKICAgICAgICBpZiAoKCplbnZfdmFyID09ICcrJykgfHwgKCplbnZfdmFyID09ICctJykpIHsKI2lmZGVmIE5FVFNOTVBfREVGQVVMVF9NSUJGSUxFUwogICAgICAgICAgICBlbnRyeSA9CiAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2Moc3RybGVuKE5FVFNOTVBfREVGQVVMVF9NSUJGSUxFUykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihlbnZfdmFyKSArIDIpOwogICAgICAgICAgICBpZiAoIWVudHJ5KSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgiaW5pdF9taWIiLCAiZW52IG1pYmZpbGVzIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoKmVudl92YXIrKyA9PSAnKycpCiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihlbnRyeSwgIiVzJWMlcyIsIE5FVFNOTVBfREVGQVVMVF9NSUJGSUxFUywgRU5WX1NFUEFSQVRPUl9DSEFSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52X3ZhciApOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHNwcmludGYoZW50cnksICIlcyVjJXMiLCBlbnZfdmFyLCBFTlZfU0VQQVJBVE9SX0NIQVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RFRkFVTFRfTUlCRklMRVMgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBTTk1QX0ZSRUUoZW52X3Zhcik7CiAgICAgICAgICAgIGVudl92YXIgPSBlbnRyeTsKI2Vsc2UKICAgICAgICAgICAgZW52X3ZhciA9IHN0cmR1cChlbnZfdmFyICsgMSk7CiNlbmRpZgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVudl92YXIgPSBzdHJkdXAoZW52X3Zhcik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKI2lmZGVmIE5FVFNOTVBfREVGQVVMVF9NSUJGSUxFUwogICAgICAgIGVudl92YXIgPSBzdHJkdXAoTkVUU05NUF9ERUZBVUxUX01JQkZJTEVTKTsKI2VuZGlmCiAgICB9CgogICAgaWYgKGVudl92YXIgIT0gTlVMTCkgewogICAgICAgIERFQlVHTVNHVEwoKCJpbml0X21pYiIsCiAgICAgICAgICAgICAgICAgICAgIlNlZW4gTUlCRklMRVM6IExvb2tpbmcgaW4gJyVzJyBmb3IgbWliIGZpbGVzIC4uLlxuIiwKICAgICAgICAgICAgICAgICAgICBlbnZfdmFyKSk7CiAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihlbnZfdmFyLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgICAgIHdoaWxlIChlbnRyeSkgewogICAgICAgICAgICByZWFkX21pYihlbnRyeSk7CiAgICAgICAgICAgIGVudHJ5ID0gc3RydG9rX3IoTlVMTCwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgICAgICB9CiAgICAgICAgU05NUF9GUkVFKGVudl92YXIpOwogICAgfQoKICAgIHByZWZpeCA9IG5ldHNubXBfZ2V0ZW52KCJQUkVGSVgiKTsKCiAgICBpZiAoIXByZWZpeCkKICAgICAgICBwcmVmaXggPSBTdGFuZGFyZF9QcmVmaXg7CgogICAgUHJlZml4ID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihwcmVmaXgpICsgMik7CiAgICBpZiAoIVByZWZpeCkKICAgICAgICBERUJVR01TR1RMKCgiaW5pdF9taWIiLCAiUHJlZml4IG1hbGxvYyBmYWlsZWQiKSk7CiAgICBlbHNlCiAgICAgICAgc3RyY3B5KFByZWZpeCwgcHJlZml4KTsKCiAgICBERUJVR01TR1RMKCgiaW5pdF9taWIiLAogICAgICAgICAgICAgICAgIlNlZW4gUFJFRklYOiBMb29raW5nIGluICclcycgZm9yIHByZWZpeCAuLi5cbiIsIFByZWZpeCkpOwoKICAgIC8qCiAgICAgKiByZW1vdmUgdHJhaWxpbmcgZG90IAogICAgICovCiAgICBpZiAoUHJlZml4KSB7CiAgICAgICAgZW52X3ZhciA9ICZQcmVmaXhbc3RybGVuKFByZWZpeCkgLSAxXTsKICAgICAgICBpZiAoKmVudl92YXIgPT0gJy4nKQogICAgICAgICAgICAqZW52X3ZhciA9ICdcMCc7CiAgICB9CgogICAgcHAtPnN0ciA9IFByZWZpeDsgICAgICAgICAgIC8qIGZpeHVwIGZpcnN0IG1pYl9wcmVmaXggZW50cnkgKi8KICAgIC8qCiAgICAgKiBub3cgdGhhdCB0aGUgbGlzdCBvZiBwcmVmaXhlcyBpcyBidWlsdCwgc2F2ZSBlYWNoIHN0cmluZyBsZW5ndGguIAogICAgICovCiAgICB3aGlsZSAocHAtPnN0cikgewogICAgICAgIHBwLT5sZW4gPSBzdHJsZW4ocHAtPnN0cik7CiAgICAgICAgcHArKzsKICAgIH0KCiAgICBNaWIgPSB0cmVlX2hlYWQ7ICAgICAgICAgICAgLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KICAgIHRyZWVfdG9wID0gKHN0cnVjdCB0cmVlICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRyZWUpKTsKICAgIC8qCiAgICAgKiBYWCBlcnJvciBjaGVjayA/IAogICAgICovCiAgICBpZiAodHJlZV90b3ApIHsKICAgICAgICB0cmVlX3RvcC0+bGFiZWwgPSBzdHJkdXAoIih0b3ApIik7CiAgICAgICAgdHJlZV90b3AtPmNoaWxkX2xpc3QgPSB0cmVlX2hlYWQ7CiAgICB9Cn0KCiNpZm5kZWYgTkVUU05NUF9OT19MRUdBQ1lfREVGSU5JVElPTlMKdm9pZAppbml0X21pYih2b2lkKQp7CiAgICBuZXRzbm1wX2luaXRfbWliKCk7Cn0KI2VuZGlmCgoKLyoKICogSGFuZGxlIE1JQiBpbmRleGVzIGNlbnRyYWxseQogKi8Kc3RhdGljIGludCBfbWliaW5kZXggICAgID0gMDsgICAvKiBMYXN0IGluZGV4IGluIHVzZSAqLwpzdGF0aWMgaW50IF9taWJpbmRleF9tYXggPSAwOyAgIC8qIFNpemUgb2YgaW5kZXggYXJyYXkgKi8KY2hhciAgICAgKipfbWliaW5kZXhlcyAgID0gTlVMTDsKCmludCBfbWliaW5kZXhfYWRkKCBjb25zdCBjaGFyICpkaXJuYW1lLCBpbnQgaSApOwp2b2lkCm5ldHNubXBfbWliaW5kZXhfbG9hZCggdm9pZCApCnsKICAgIERJUiAqZGlyOwogICAgc3RydWN0IGRpcmVudCAqZmlsZTsKICAgIEZJTEUgKmZwOwogICAgY2hhciB0bXBidWZbIDMwMF07CiAgICBjaGFyIHRtcGJ1ZjJbMzAwXTsKICAgIGludCAgaTsKICAgIGNoYXIgKmNwOwoKICAgIC8qCiAgICAgKiBPcGVuIHRoZSBNSUIgaW5kZXggZGlyZWN0b3J5LCBvciBjcmVhdGUgaXQgKGVtcHR5KQogICAgICovCiAgICBzbnByaW50ZiggdG1wYnVmLCBzaXplb2YodG1wYnVmKSwgIiVzL21pYl9pbmRleGVzIiwKICAgICAgICAgICAgICBnZXRfcGVyc2lzdGVudF9kaXJlY3RvcnkoKSk7CiAgICB0bXBidWZbc2l6ZW9mKHRtcGJ1ZiktMV0gPSAwOwogICAgZGlyID0gb3BlbmRpciggdG1wYnVmICk7CiAgICBpZiAoIGRpciA9PSBOVUxMICkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJpbmRleCIsICJsb2FkOiAobmV3KVxuIikpOwogICAgICAgIG1rZGlyaGllciggdG1wYnVmLCBORVRTTk1QX0FHRU5UX0RJUkVDVE9SWV9NT0RFLCAwKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyoKICAgICAqIENyZWF0ZSBhIGxpc3Qgb2Ygd2hpY2ggZGlyZWN0b3J5IGVhY2ggZmlsZSByZWZlcnMgdG8KICAgICAqLwogICAgd2hpbGUgKChmaWxlID0gcmVhZGRpciggZGlyICkpKSB7CiAgICAgICAgaWYgKCAhaXNkaWdpdCgodW5zaWduZWQgY2hhcikoZmlsZS0+ZF9uYW1lWzBdKSkpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGkgPSBhdG9pKCBmaWxlLT5kX25hbWUgKTsKCiAgICAgICAgc25wcmludGYoIHRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZiksICIlcy9taWJfaW5kZXhlcy8lZCIsCiAgICAgICAgICAgICAgZ2V0X3BlcnNpc3RlbnRfZGlyZWN0b3J5KCksIGkgKTsKICAgICAgICB0bXBidWZbc2l6ZW9mKHRtcGJ1ZiktMV0gPSAwOwogICAgICAgIGZwID0gZm9wZW4oIHRtcGJ1ZiwgInIiICk7CiAgICAgICAgaWYgKCFmcCkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgY3AgPSBmZ2V0cyggdG1wYnVmMiwgc2l6ZW9mKHRtcGJ1ZjIpLCBmcCApOwogICAgICAgIGlmICggIWNwICkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliaW5kZXgiLCAiRW1wdHkgTUlCIGluZGV4ICglZClcbiIsIGkpKTsKICAgICAgICAgICAgZmNsb3NlKGZwKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHRtcGJ1ZjJbc3RybGVuKHRtcGJ1ZjIpLTFdID0gMDsKICAgICAgICBERUJVR01TR1RMKCgibWliaW5kZXgiLCAibG9hZDogKCVkKSAlc1xuIiwgaSwgdG1wYnVmMikpOwogICAgICAgICh2b2lkKV9taWJpbmRleF9hZGQoIHRtcGJ1ZjIrNCwgaSApOyAgLyogU2tpcCAnRElSICcgKi8KICAgICAgICBmY2xvc2UoIGZwICk7CiAgICB9CiAgICBjbG9zZWRpciggZGlyICk7Cn0KCmNoYXIgKgpuZXRzbm1wX21pYmluZGV4X2xvb2t1cCggY29uc3QgY2hhciAqZGlybmFtZSApCnsKICAgIGludCBpOwogICAgc3RhdGljIGNoYXIgdG1wYnVmWzMwMF07CgogICAgZm9yIChpPTA7IGk8X21pYmluZGV4OyBpKyspIHsKICAgICAgICBpZiAoIF9taWJpbmRleGVzW2ldICYmCiAgICAgICAgICAgICBzdHJjbXAoIF9taWJpbmRleGVzW2ldLCBkaXJuYW1lICkgPT0gMCkgewogICAgICAgICAgICAgc25wcmludGYodG1wYnVmLCBzaXplb2YodG1wYnVmKSwgIiVzL21pYl9pbmRleGVzLyVkIiwKICAgICAgICAgICAgICAgICAgICAgIGdldF9wZXJzaXN0ZW50X2RpcmVjdG9yeSgpLCBpKTsKICAgICAgICAgICAgIHRtcGJ1ZltzaXplb2YodG1wYnVmKS0xXSA9IDA7CiAgICAgICAgICAgICBERUJVR01TR1RMKCgibWliaW5kZXgiLCAibG9va3VwOiAlcyAoJWQpICVzXG4iLCBkaXJuYW1lLCBpLCB0bXBidWYgKSk7CiAgICAgICAgICAgICByZXR1cm4gdG1wYnVmOwogICAgICAgIH0KICAgIH0KICAgIERFQlVHTVNHVEwoKCJtaWJpbmRleCIsICJsb29rdXA6IChub25lKVxuIikpOwogICAgcmV0dXJuIE5VTEw7Cn0KCmludApfbWliaW5kZXhfYWRkKCBjb25zdCBjaGFyICpkaXJuYW1lLCBpbnQgaSApCnsKICAgIGNvbnN0IGludCBvbGRfbWliaW5kZXhfbWF4ID0gX21pYmluZGV4X21heDsKCiAgICBERUJVR01TR1RMKCgibWliaW5kZXgiLCAiYWRkOiAlcyAoJWQpXG4iLCBkaXJuYW1lLCBpICkpOwogICAgaWYgKCBpID09IC0xICkKICAgICAgICBpID0gX21pYmluZGV4Kys7CiAgICBpZiAoIGkgPj0gX21pYmluZGV4X21heCApIHsKICAgICAgICAvKgogICAgICAgICAqIElmIHRoZSBpbmRleCBhcnJheSBpcyBmdWxsIChvciBub24tZXhpc3RlbnQpCiAgICAgICAgICogICB0aGVuIGV4cGFuZCAob3IgY3JlYXRlKSBpdAogICAgICAgICAqLwogICAgICAgIF9taWJpbmRleF9tYXggPSBpICsgMTA7CiAgICAgICAgX21pYmluZGV4ZXMgPSByZWFsbG9jKF9taWJpbmRleGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbWliaW5kZXhfbWF4ICogc2l6ZW9mKF9taWJpbmRleGVzWzBdKSk7CiAgICAgICAgbmV0c25tcF9hc3NlcnQoX21pYmluZGV4ZXMpOwogICAgICAgIG1lbXNldChfbWliaW5kZXhlcyArIG9sZF9taWJpbmRleF9tYXgsIDAsCiAgICAgICAgICAgICAgIChfbWliaW5kZXhfbWF4IC0gb2xkX21pYmluZGV4X21heCkgKiBzaXplb2YoX21pYmluZGV4ZXNbMF0pKTsKICAgIH0KCiAgICBfbWliaW5kZXhlc1sgaSBdID0gc3RyZHVwKCBkaXJuYW1lICk7CiAgICBpZiAoIGkgPj0gX21pYmluZGV4ICkKICAgICAgICBfbWliaW5kZXggPSBpKzE7CgogICAgREVCVUdNU0dUTCgoIm1pYmluZGV4IiwgImFkZDogJWQvJWQvJWRcbiIsIGksIF9taWJpbmRleCwgX21pYmluZGV4X21heCApKTsKICAgIHJldHVybiBpOwp9CiAgICAKRklMRSAqCm5ldHNubXBfbWliaW5kZXhfbmV3KCBjb25zdCBjaGFyICpkaXJuYW1lICkKewogICAgRklMRSAqZnA7CiAgICBjaGFyICB0bXBidWZbMzAwXTsKICAgIGNoYXIgKmNwOwogICAgaW50ICAgaTsKCiAgICBjcCA9IG5ldHNubXBfbWliaW5kZXhfbG9va3VwKCBkaXJuYW1lICk7CiAgICBpZiAoIWNwKSB7CiAgICAgICAgaSAgPSBfbWliaW5kZXhfYWRkKCBkaXJuYW1lLCAtMSApOwogICAgICAgIHNucHJpbnRmKCB0bXBidWYsIHNpemVvZih0bXBidWYpLCAiJXMvbWliX2luZGV4ZXMvJWQiLAogICAgICAgICAgICAgICAgICBnZXRfcGVyc2lzdGVudF9kaXJlY3RvcnkoKSwgaSApOwogICAgICAgIHRtcGJ1ZltzaXplb2YodG1wYnVmKS0xXSA9IDA7CiAgICAgICAgY3AgPSB0bXBidWY7CiAgICB9CiAgICBERUJVR01TR1RMKCgibWliaW5kZXgiLCAibmV3OiAlcyAoJXMpXG4iLCBkaXJuYW1lLCBjcCApKTsKICAgIGZwID0gZm9wZW4oIGNwLCAidyIgKTsKICAgIGlmIChmcCkKICAgICAgICBmcHJpbnRmKCBmcCwgIkRJUiAlc1xuIiwgZGlybmFtZSApOwogICAgcmV0dXJuIGZwOwp9CgoKLyoqCiAqIFVubG9hZHMgYWxsIG1pYnMuCiAqLwp2b2lkCnNodXRkb3duX21pYih2b2lkKQp7CiAgICB1bmxvYWRfYWxsX21pYnMoKTsKICAgIGlmICh0cmVlX3RvcCkgewogICAgICAgIGlmICh0cmVlX3RvcC0+bGFiZWwpCiAgICAgICAgICAgIFNOTVBfRlJFRSh0cmVlX3RvcC0+bGFiZWwpOwogICAgICAgIFNOTVBfRlJFRSh0cmVlX3RvcCk7CiAgICAgICAgdHJlZV90b3AgPSBOVUxMOwogICAgfQogICAgdHJlZV9oZWFkID0gTlVMTDsKICAgIE1pYiA9IE5VTEw7CiAgICBpZiAoX21pYmluZGV4ZXMpIHsKICAgICAgICBpbnQgaTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgX21pYmluZGV4OyArK2kpCiAgICAgICAgICAgIFNOTVBfRlJFRShfbWliaW5kZXhlc1tpXSk7CiAgICAgICAgZnJlZShfbWliaW5kZXhlcyk7CiAgICAgICAgX21pYmluZGV4ID0gMDsKICAgICAgICBfbWliaW5kZXhfbWF4ID0gMDsKICAgICAgICBfbWliaW5kZXhlcyA9IE5VTEw7CiAgICB9CiAgICBpZiAoUHJlZml4ICE9IE5VTEwgJiYgUHJlZml4ICE9ICZTdGFuZGFyZF9QcmVmaXhbMF0pCiAgICAgICAgU05NUF9GUkVFKFByZWZpeCk7CiAgICBpZiAoUHJlZml4KQogICAgICAgIFByZWZpeCA9IE5VTEw7CiAgICBTTk1QX0ZSRUUoY29uZm1pYnMpOwogICAgU05NUF9GUkVFKGNvbmZtaWJkaXIpOwp9CgovKioKICogUHJpbnRzIHRoZSBNSUJzIHRvIHRoZSBmaWxlIGZwLgogKgogKiBAcGFyYW0gZnAgICBUaGUgZmlsZSBkZXNjcmlwdG9yIHRvIHByaW50IHRvLgogKi8Kdm9pZApwcmludF9taWIoRklMRSAqIGZwKQp7CiAgICBwcmludF9zdWJ0cmVlKGZwLCB0cmVlX2hlYWQsIDApOwp9Cgp2b2lkCnByaW50X2FzY2lpX2R1bXAoRklMRSAqIGZwKQp7CiAgICBmcHJpbnRmKGZwLCAiZHVtcCBERUZJTklUSU9OUyA6Oj0gQkVHSU5cbiIpOwogICAgcHJpbnRfYXNjaWlfZHVtcF90cmVlKGZwLCB0cmVlX2hlYWQsIDApOwogICAgZnByaW50ZihmcCwgIkVORFxuIik7Cn0KCgovKioKICogU2V0J3MgdGhlIHByaW50aW5nIGZ1bmN0aW9uIHByaW50b21hdCBpbiBhIHN1YnRyZWUgYWNjb3JkaW5nCiAqIGl0J3MgdHlwZQogKgogKiBAcGFyYW0gc3VidHJlZSAgICBUaGUgc3VidHJlZSB0byBzZXQuCiAqLwp2b2lkCnNldF9mdW5jdGlvbihzdHJ1Y3QgdHJlZSAqc3VidHJlZSkKewogICAgc3VidHJlZS0+cHJpbnRlciA9IE5VTEw7CiAgICBzd2l0Y2ggKHN1YnRyZWUtPnR5cGUpIHsKICAgIGNhc2UgVFlQRV9PQkpJRDoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19vYmplY3RfaWRlbnRpZmllcjsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9PQ1RFVFNUUjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19vY3RldF9zdHJpbmc7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfSU5URUdFUjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19pbnRlZ2VyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX0lOVEVHRVIzMjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19pbnRlZ2VyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX05FVEFERFI6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfbmV0d29ya2FkZHJlc3M7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfSVBBRERSOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2lwYWRkcmVzczsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9DT1VOVEVSOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2NvdW50ZXI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfR0FVR0U6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfZ2F1Z2U7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfVElNRVRJQ0tTOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX3RpbWV0aWNrczsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9PUEFRVUU6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2Nfb3BhcXVlOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX05VTEw6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfbnVsbDsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9CSVRTVFJJTkc6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfYml0c3RyaW5nOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX05TQVBBRERSRVNTOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX25zYXBhZGRyZXNzOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX0NPVU5URVI2NDoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19jb3VudGVyNjQ7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfVUlOVEVHRVI6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfdWludGVnZXI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfVU5TSUdORUQzMjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19nYXVnZTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9PVEhFUjoKICAgIGRlZmF1bHQ6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfYnlfdHlwZTsKICAgICAgICBicmVhazsKICAgIH0KfQoKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKLyoqCiAqIFJlYWRzIGFuIG9iamVjdCBpZGVudGlmaWVyIGZyb20gYW4gaW5wdXQgc3RyaW5nIGludG8gaW50ZXJuYWwgT0lEIGZvcm0uCiAqIAogKiBXaGVuIGNhbGxlZCwgb3V0X2xlbiBtdXN0IGhvbGQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBvdXRwdXQgYXJyYXkuCiAqCiAqIEBwYXJhbSBpbnB1dCAgICAgdGhlIGlucHV0IHN0cmluZy4KICogQHBhcmFtIG91dHB1dCAgICB0aGUgb2lkIHdpcnRlLgogKiBAcGFyYW0gb3V0X2xlbiAgIG51bWJlciBvZiBzdWJpZCdzIGluIG91dHB1dC4KICogCiAqIEByZXR1cm4gMSBpZiBzdWNjZXNzZnVsLgogKiAKICogSWYgYW4gZXJyb3Igb2NjdXJzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgMCBhbmQgTUFZIHNldCBzbm1wX2Vycm5vLgogKiBzbm1wX2Vycm5vIGlzIE5PVCBzZXQgaWYgU0VUX1NOTVBfRVJST1IgZXZhbHVhdGVzIHRvIG5vdGhpbmcuCiAqIFRoaXMgY2FuIG1ha2UgbXVsdGktdGhyZWFkZWQgdXNlIGEgdGlueSBiaXQgbW9yZSByb2J1c3QuCiAqLwppbnQKcmVhZF9vYmppZChjb25zdCBjaGFyICppbnB1dCwgb2lkICogb3V0cHV0LCBzaXplX3QgKiBvdXRfbGVuKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdWJpZCdzIGluICJvdXRwdXQiICovCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICBzdHJ1Y3QgdHJlZSAgICAqcm9vdCA9IHRyZWVfdG9wOwojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICBjaGFyICAgICAgICAgICAgYnVmW1NQUklOVF9NQVhfTEVOXTsKICAgIGludCAgICAgICAgICAgICByZXQsIG1heF9vdXRfbGVuOwogICAgY2hhciAgICAgICAgICAgKm5hbWUsIGNoOwogICAgY29uc3QgY2hhciAgICAgKmNwOwoKICAgIGNwID0gaW5wdXQ7CiAgICB3aGlsZSAoKGNoID0gKmNwKSkgewogICAgICAgIGlmICgoJzAnIDw9IGNoICYmIGNoIDw9ICc5JykKICAgICAgICAgICAgfHwgKCdhJyA8PSBjaCAmJiBjaCA8PSAneicpCiAgICAgICAgICAgIHx8ICgnQScgPD0gY2ggJiYgY2ggPD0gJ1onKQogICAgICAgICAgICB8fCBjaCA9PSAnLScpCiAgICAgICAgICAgIGNwKys7CiAgICAgICAgZWxzZQogICAgICAgICAgICBicmVhazsKICAgIH0KI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIGlmIChjaCA9PSAnOicpCiAgICAgICAgcmV0dXJuIGdldF9ub2RlKGlucHV0LCBvdXRwdXQsIG91dF9sZW4pOwojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgogICAgaWYgKCppbnB1dCA9PSAnLicpCiAgICAgICAgaW5wdXQrKzsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIGVsc2UgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9SRUFEX1VDRF9TVFlMRV9PSUQpKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBnZXQgcGFzdCBsZWFkaW5nICcuJywgYXBwZW5kICcuJyB0byBQcmVmaXguIAogICAgICAgICAqLwogICAgICAgIGlmICgqUHJlZml4ID09ICcuJykKICAgICAgICAgICAgc3RybGNweShidWYsIFByZWZpeCArIDEsIHNpemVvZihidWYpKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHN0cmxjcHkoYnVmLCBQcmVmaXgsIHNpemVvZihidWYpKTsKICAgICAgICBzdHJsY2F0KGJ1ZiwgIi4iLCBzaXplb2YoYnVmKSk7CiAgICAgICAgc3RybGNhdChidWYsIGlucHV0LCBzaXplb2YoYnVmKSk7CiAgICAgICAgaW5wdXQgPSBidWY7CiAgICB9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICBpZiAoKHJvb3QgPT0gTlVMTCkgJiYgKHRyZWVfaGVhZCAhPSBOVUxMKSkgewogICAgICAgIHJvb3QgPSB0cmVlX2hlYWQ7CiAgICB9CiAgICBlbHNlIGlmIChyb290ID09IE5VTEwpIHsKICAgICAgICBTRVRfU05NUF9FUlJPUihTTk1QRVJSX05PTUlCKTsKICAgICAgICAqb3V0X2xlbiA9IDA7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgIG5hbWUgPSBzdHJkdXAoaW5wdXQpOwogICAgbWF4X291dF9sZW4gPSAqb3V0X2xlbjsKICAgICpvdXRfbGVuID0gMDsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIGlmICgocmV0ID0KICAgICAgICAgX2FkZF9zdHJpbmdzX3RvX29pZChyb290LCBuYW1lLCBvdXRwdXQsIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X291dF9sZW4pKSA8PSAwKQojZWxzZQogICAgaWYgKChyZXQgPQogICAgICAgICBfYWRkX3N0cmluZ3NfdG9fb2lkKE5VTEwsIG5hbWUsIG91dHB1dCwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfb3V0X2xlbikpIDw9IDApCiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgIHsKICAgICAgICBpZiAocmV0ID09IDApCiAgICAgICAgICAgIHJldCA9IFNOTVBFUlJfVU5LTk9XTl9PQkpJRDsKICAgICAgICBTRVRfU05NUF9FUlJPUihyZXQpOwogICAgICAgIFNOTVBfRlJFRShuYW1lKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIFNOTVBfRlJFRShuYW1lKTsKCiAgICByZXR1cm4gMTsKfQoKLyoqCiAqIAogKi8Kdm9pZApuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbikKewogICAgdV9jaGFyICAgICAgICAgKnRidWYgPSBOVUxMLCAqY3AgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIHRidWZfbGVuID0gMjU2LCB0b3V0X2xlbiA9IDA7CiAgICBpbnQgICAgICAgICAgICAgdGJ1Zl9vdmVyZmxvdyA9IDA7CiAgICBpbnQgICAgICAgICAgICAgb3V0cHV0X2Zvcm1hdDsKCiAgICBpZiAoKHRidWYgPSAodV9jaGFyICopIGNhbGxvYyh0YnVmX2xlbiwgMSkpID09IE5VTEwpIHsKICAgICAgICB0YnVmX292ZXJmbG93ID0gMTsKICAgIH0gZWxzZSB7CiAgICAgICAgKnRidWYgPSAnLic7CiAgICAgICAgdG91dF9sZW4gPSAxOwogICAgfQoKICAgIF9vaWRfZmluaXNoX3ByaW50aW5nKG9iamlkLCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICZ0YnVmLCAmdGJ1Zl9sZW4sICZ0b3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICZ0YnVmX292ZXJmbG93KTsKCiAgICBpZiAodGJ1Zl9vdmVyZmxvdykgewogICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdykgewogICAgICAgICAgICBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRidWYpOwogICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICB9CiAgICAgICAgU05NUF9GUkVFKHRidWYpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBvdXRwdXRfZm9ybWF0ID0gbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQpOwogICAgaWYgKDAgPT0gb3V0cHV0X2Zvcm1hdCkgewogICAgICAgIG91dHB1dF9mb3JtYXQgPSBORVRTTk1QX09JRF9PVVRQVVRfTlVNRVJJQzsKICAgIH0KICAgIHN3aXRjaCAob3V0cHV0X2Zvcm1hdCkgewogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfRlVMTDoKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX05VTUVSSUM6CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9TVUZGSVg6CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9NT0RVTEU6CiAgICAgICAgY3AgPSB0YnVmOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX05PTkU6CiAgICBkZWZhdWx0OgogICAgICAgIGNwID0gTlVMTDsKICAgIH0KCiAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYKICAgICAgICAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCkpIHsKICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgIH0KICAgIFNOTVBfRlJFRSh0YnVmKTsKfQoKLyoqCiAqIAogKi8KI2lmZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwp2b2lkCm5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4pCnsKICAgIG5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfb3ZlcmZsb3csIG9iamlkLCBvYmppZGxlbik7Cn0KI2Vsc2UKc3RydWN0IHRyZWUgICAgKgpuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkX3RyZWUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuKQp7CiAgICB1X2NoYXIgICAgICAgICAqdGJ1ZiA9IE5VTEwsICpjcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgdGJ1Zl9sZW4gPSA1MTIsIHRvdXRfbGVuID0gMDsKICAgIHN0cnVjdCB0cmVlICAgICpzdWJ0cmVlID0gdHJlZV9oZWFkOwogICAgc2l6ZV90ICAgICAgICAgIG1pZHBvaW50X29mZnNldCA9IDA7CiAgICBpbnQgICAgICAgICAgICAgdGJ1Zl9vdmVyZmxvdyA9IDA7CiAgICBpbnQgICAgICAgICAgICAgb3V0cHV0X2Zvcm1hdDsKCiAgICBpZiAoKHRidWYgPSAodV9jaGFyICopIGNhbGxvYyh0YnVmX2xlbiwgMSkpID09IE5VTEwpIHsKICAgICAgICB0YnVmX292ZXJmbG93ID0gMTsKICAgIH0gZWxzZSB7CiAgICAgICAgKnRidWYgPSAnLic7CiAgICAgICAgdG91dF9sZW4gPSAxOwogICAgfQoKICAgIHN1YnRyZWUgPSBfZ2V0X3JlYWxsb2Nfc3ltYm9sKG9iamlkLCBvYmppZGxlbiwgc3VidHJlZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YnVmLCAmdGJ1Zl9sZW4sICZ0b3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICZ0YnVmX292ZXJmbG93LCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pZHBvaW50X29mZnNldCk7CgogICAgaWYgKHRidWZfb3ZlcmZsb3cpIHsKICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cpIHsKICAgICAgICAgICAgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0YnVmKTsKICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgfQogICAgICAgIFNOTVBfRlJFRSh0YnVmKTsKICAgICAgICByZXR1cm4gc3VidHJlZTsKICAgIH0KCiAgICBvdXRwdXRfZm9ybWF0ID0gbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQpOwogICAgaWYgKDAgPT0gb3V0cHV0X2Zvcm1hdCkgewogICAgICAgIG91dHB1dF9mb3JtYXQgPSBORVRTTk1QX09JRF9PVVRQVVRfTU9EVUxFOwogICAgfQogICAgc3dpdGNoIChvdXRwdXRfZm9ybWF0KSB7CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9GVUxMOgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfTlVNRVJJQzoKICAgICAgICBjcCA9IHRidWY7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfU1VGRklYOgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfTU9EVUxFOgogICAgICAgIGZvciAoY3AgPSB0YnVmOyAqY3A7IGNwKyspOwoKICAgICAgICBpZiAobWlkcG9pbnRfb2Zmc2V0ICE9IDApIHsKICAgICAgICAgICAgY3AgPSB0YnVmICsgbWlkcG9pbnRfb2Zmc2V0IC0gMjsgICAgLyogIGJleW9uZCB0aGUgJy4nICAqLwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHdoaWxlIChjcCA+PSB0YnVmKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNhbHBoYSgqY3ApKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjcC0tOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB3aGlsZSAoY3AgPj0gdGJ1ZikgewogICAgICAgICAgICBpZiAoKmNwID09ICcuJykgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3AtLTsKICAgICAgICB9CgogICAgICAgIGNwKys7CgogICAgICAgIGlmICgoTkVUU05NUF9PSURfT1VUUFVUX01PRFVMRSA9PSBvdXRwdXRfZm9ybWF0KQogICAgICAgICAgICAmJiBjcCA+IHRidWYpIHsKICAgICAgICAgICAgY2hhciAgICAgICAgICAgIG1vZGJ1ZlsyNTZdID0geyAwIH0sICptb2QgPQogICAgICAgICAgICAgICAgbW9kdWxlX25hbWUoc3VidHJlZS0+bW9kaWQsIG1vZGJ1Zik7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBEb24ndCBhZGQgdGhlIG1vZHVsZSBJRCBpZiBpdCdzIGp1c3QgbnVtZXJpYyAoaS5lLiB3ZSBjb3VsZG4ndCBsb29rCiAgICAgICAgICAgICAqIGl0IHVwIHByb3Blcmx5LiAgCiAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmIG1vZGJ1ZlswXSAhPSAnIycpIHsKICAgICAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIG1vZCkKICAgICAgICAgICAgICAgICAgICB8fCAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICI6OiIpKSB7CiAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfVUNEOgogICAgewogICAgICAgIFByZWZpeExpc3RQdHIgICBwcCA9ICZtaWJfcHJlZml4ZXNbMF07CiAgICAgICAgc2l6ZV90ICAgICAgICAgIGlsZW4sIHRsZW47CiAgICAgICAgY29uc3QgY2hhciAgICAgKnRlc3RjcDsKCiAgICAgICAgY3AgPSB0YnVmOwogICAgICAgIHRsZW4gPSBzdHJsZW4oKGNoYXIgKikgdGJ1Zik7CgogICAgICAgIHdoaWxlIChwcC0+c3RyKSB7CiAgICAgICAgICAgIGlsZW4gPSBwcC0+bGVuOwogICAgICAgICAgICB0ZXN0Y3AgPSBwcC0+c3RyOwoKICAgICAgICAgICAgaWYgKCh0bGVuID4gaWxlbikgJiYgbWVtY21wKHRidWYsIHRlc3RjcCwgaWxlbikgPT0gMCkgewogICAgICAgICAgICAgICAgY3AgKz0gKGlsZW4gKyAxKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBwKys7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgfQoKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX05PTkU6CiAgICBkZWZhdWx0OgogICAgICAgIGNwID0gTlVMTDsKICAgIH0KCiAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYKICAgICAgICAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCkpIHsKICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgIH0KICAgIFNOTVBfRlJFRSh0YnVmKTsKICAgIHJldHVybiBzdWJ0cmVlOwp9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCmludApzcHJpbnRfcmVhbGxvY19vYmppZCh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbikKewogICAgaW50ICAgICAgICAgICAgIGJ1Zl9vdmVyZmxvdyA9IDA7CgogICAgbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZF90cmVlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmX292ZXJmbG93LCBvYmppZCwgb2JqaWRsZW4pOwogICAgcmV0dXJuICFidWZfb3ZlcmZsb3c7Cn0KCmludApzbnByaW50X29iamlkKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbikKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwoKICAgIGlmIChzcHJpbnRfcmVhbGxvY19vYmppZCgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbikpIHsKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQp9CgovKioKICogUHJpbnRzIGFuIG9pZCB0byBzdGRvdXQuCiAqCiAqIEBwYXJhbSBvYmppZCAgICAgIFRoZSBvaWQgdG8gcHJpbnQKICogQHBhcmFtIG9iamlkbGVuICAgVGhlIGxlbmd0aCBvZiBvaWRpZC4KICovCnZvaWQKcHJpbnRfb2JqaWQoY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbikKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3ViaWRlbnRpZmllcnMgKi8KICAgIGZwcmludF9vYmppZChzdGRvdXQsIG9iamlkLCBvYmppZGxlbik7Cn0KCgovKioKICogUHJpbnRzIGFuIG9pZCB0byBhIGZpbGUgZGVzY3JpcHRvci4KICoKICogQHBhcmFtIGYgICAgICAgICAgVGhlIGZpbGUgZGVzY3JpcHRvciB0byBwcmludCB0by4KICogQHBhcmFtIG9iamlkICAgICAgVGhlIG9pZCB0byBwcmludAogKiBAcGFyYW0gb2JqaWRsZW4gICBUaGUgbGVuZ3RoIG9mIG9pZGlkLgogKi8Kdm9pZApmcHJpbnRfb2JqaWQoRklMRSAqIGYsIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4pCnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN1YmlkZW50aWZpZXJzICovCiAgICB1X2NoYXIgICAgICAgICAqYnVmID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBidWZfbGVuID0gMjU2LCBvdXRfbGVuID0gMDsKICAgIGludCAgICAgICAgICAgICBidWZfb3ZlcmZsb3cgPSAwOwoKICAgIGlmICgoYnVmID0gKHVfY2hhciAqKSBjYWxsb2MoYnVmX2xlbiwgMSkpID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKGYsICJbVFJVTkNBVEVEXVxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfSBlbHNlIHsKICAgICAgICBuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkX3RyZWUoJmJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmX292ZXJmbG93LCBvYmppZCwgb2JqaWRsZW4pOwogICAgICAgIGlmIChidWZfb3ZlcmZsb3cpIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXMgW1RSVU5DQVRFRF1cbiIsIGJ1Zik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXNcbiIsIGJ1Zik7CiAgICAgICAgfQogICAgfQoKICAgIFNOTVBfRlJFRShidWYpOwp9CgppbnQKc3ByaW50X3JlYWxsb2NfdmFyaWFibGUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICBpbnQgICAgICAgICAgICAgYnVmX292ZXJmbG93ID0gMDsKCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICBzdHJ1Y3QgdHJlZSAgICAqc3VidHJlZSA9IHRyZWVfaGVhZDsKCiAgICBzdWJ0cmVlID0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgICAgIG5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICZidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbik7CgogICAgaWYgKGJ1Zl9vdmVyZmxvdykgewogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfQkFSRV9WQUxVRSkpIHsKICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgPSAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiA9ICIpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogZW5kIGlmLWVsc2UgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQgKi8KICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgaWYtZWxzZSBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQgKi8KICAgIH0gZWxzZSB7CiAgICAgICAgKm91dF9sZW4gPSAwOwogICAgfQoKICAgIGlmICh2YXJpYWJsZS0+dHlwZSA9PSBTTk1QX05PU1VDSE9CSkVDVCkgewogICAgICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIFN1Y2ggT2JqZWN0IGF2YWlsYWJsZSBvbiB0aGlzIGFnZW50IGF0IHRoaXMgT0lEIik7CiAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLT50eXBlID09IFNOTVBfTk9TVUNISU5TVEFOQ0UpIHsKICAgICAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBTdWNoIEluc3RhbmNlIGN1cnJlbnRseSBleGlzdHMgYXQgdGhpcyBPSUQiKTsKICAgIH0gZWxzZSBpZiAodmFyaWFibGUtPnR5cGUgPT0gU05NUF9FTkRPRk1JQlZJRVcpIHsKICAgICAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBtb3JlIHZhcmlhYmxlcyBsZWZ0IGluIHRoaXMgTUlCIFZpZXcgKEl0IGlzIHBhc3QgdGhlIGVuZCBvZiB0aGUgTUlCIHRyZWUpIik7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICB9IGVsc2UgaWYgKHN1YnRyZWUpIHsKICAgICAgICBjb25zdCBjaGFyICp1bml0cyA9IE5VTEw7CiAgICAgICAgY29uc3QgY2hhciAqaGludCA9IE5VTEw7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfRE9OVF9QUklOVF9VTklUUykpIHsKICAgICAgICAgICAgdW5pdHMgPSBzdWJ0cmVlLT51bml0czsKICAgICAgICB9CgoJCWlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX05PX0RJU1BMQVlfSElOVCkpIHsKCQkJaGludCA9IHN1YnRyZWUtPmhpbnQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3VidHJlZS0+cHJpbnRvbWF0KSB7CiAgICAgICAgICAgIHJldHVybiAoKnN1YnRyZWUtPnByaW50b21hdCkgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyaWFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWUtPmVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXJpYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHJlZS0+ZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKICAgICAgICB9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgIH0gZWxzZSB7CiAgICAgICAgLyoKICAgICAgICAgKiBIYW5kbGUgcmFyZSBjYXNlIHdoZXJlIHRyZWUgaXMgZW1wdHkuICAKICAgICAgICAgKi8KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgfQp9CgppbnQKc25wcmludF92YXJpYWJsZShjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyaWFibGUpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKCiAgICBpZiAoc3ByaW50X3JlYWxsb2NfdmFyaWFibGUoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCwgb2JqaWRsZW4sIHZhcmlhYmxlKSkgewogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9Cn0KCi8qKgogKiBQcmludHMgYSB2YXJpYWJsZSB0byBzdGRvdXQuCiAqCiAqIEBwYXJhbSBvYmppZCAgICAgVGhlIG9iamVjdCBpZC4KICogQHBhcmFtIG9iamlkbGVuICBUaGUgbGVuZ3RoIG9mIHRlaCBvYmplY3QgaWQuCiAqIEBwYXJhbSB2YXJpYWJsZSAgVGhlIHZhcmlhYmxlIHRvIHByaW50LgogKi8Kdm9pZApwcmludF92YXJpYWJsZShjb25zdCBvaWQgKiBvYmppZCwKICAgICAgICAgICAgICAgc2l6ZV90IG9iamlkbGVuLCBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgZnByaW50X3ZhcmlhYmxlKHN0ZG91dCwgb2JqaWQsIG9iamlkbGVuLCB2YXJpYWJsZSk7Cn0KCgovKioKICogUHJpbnRzIGEgdmFyaWFibGUgdG8gYSBmaWxlIGRlc2NyaXB0b3IuCiAqCiAqIEBwYXJhbSBmICAgICAgICAgVGhlIGZpbGUgZGVzY3JpcHRvciB0byBwcmludCB0by4KICogQHBhcmFtIG9iamlkICAgICBUaGUgb2JqZWN0IGlkLgogKiBAcGFyYW0gb2JqaWRsZW4gIFRoZSBsZW5ndGggb2YgdGVoIG9iamVjdCBpZC4KICogQHBhcmFtIHZhcmlhYmxlICBUaGUgdmFyaWFibGUgdG8gcHJpbnQuCiAqLwp2b2lkCmZwcmludF92YXJpYWJsZShGSUxFICogZiwKICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLAogICAgICAgICAgICAgICAgc2l6ZV90IG9iamlkbGVuLCBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgdV9jaGFyICAgICAgICAgKmJ1ZiA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgYnVmX2xlbiA9IDI1Niwgb3V0X2xlbiA9IDA7CgogICAgaWYgKChidWYgPSAodV9jaGFyICopIGNhbGxvYyhidWZfbGVuLCAxKSkgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoZiwgIltUUlVOQ0FURURdXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICAgIGlmIChzcHJpbnRfcmVhbGxvY192YXJpYWJsZSgmYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbiwgdmFyaWFibGUpKSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzXG4iLCBidWYpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzIFtUUlVOQ0FURURdXG4iLCBidWYpOwogICAgICAgIH0KICAgIH0KCiAgICBTTk1QX0ZSRUUoYnVmKTsKfQoKaW50CnNwcmludF9yZWFsbG9jX3ZhbHVlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgaWYgKHZhcmlhYmxlLT50eXBlID09IFNOTVBfTk9TVUNIT0JKRUNUKSB7CiAgICAgICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gU3VjaCBPYmplY3QgYXZhaWxhYmxlIG9uIHRoaXMgYWdlbnQgYXQgdGhpcyBPSUQiKTsKICAgIH0gZWxzZSBpZiAodmFyaWFibGUtPnR5cGUgPT0gU05NUF9OT1NVQ0hJTlNUQU5DRSkgewogICAgICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIFN1Y2ggSW5zdGFuY2UgY3VycmVudGx5IGV4aXN0cyBhdCB0aGlzIE9JRCIpOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZS0+dHlwZSA9PSBTTk1QX0VORE9GTUlCVklFVykgewogICAgICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIG1vcmUgdmFyaWFibGVzIGxlZnQgaW4gdGhpcyBNSUIgVmlldyAoSXQgaXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBNSUIgdHJlZSkiKTsKICAgIH0gZWxzZSB7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICAgICAgY29uc3QgY2hhciAqdW5pdHMgPSBOVUxMOwogICAgICAgIHN0cnVjdCB0cmVlICpzdWJ0cmVlID0gdHJlZV9oZWFkOwoJc3VidHJlZSA9IGdldF90cmVlKG9iamlkLCBvYmppZGxlbiwgc3VidHJlZSk7CiAgICAgICAgaWYgKHN1YnRyZWUgJiYgIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0RPTlRfUFJJTlRfVU5JVFMpKSB7CiAgICAgICAgICAgIHVuaXRzID0gc3VidHJlZS0+dW5pdHM7CiAgICAgICAgfQogICAgICAgIGlmIChzdWJ0cmVlKSB7CgkgICAgaWYoc3VidHJlZS0+cHJpbnRvbWF0KSB7CgkJcmV0dXJuICgqc3VidHJlZS0+cHJpbnRvbWF0KSAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAoJCQkJCSAgICAgIGFsbG93X3JlYWxsb2MsIHZhcmlhYmxlLAoJCQkJCSAgICAgIHN1YnRyZWUtPmVudW1zLCBzdWJ0cmVlLT5oaW50LAoJCQkJCSAgICAgIHVuaXRzKTsKCSAgICB9IGVsc2UgewoJCXJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKCQkJCQkgICAgICBhbGxvd19yZWFsbG9jLCB2YXJpYWJsZSwKCQkJCQkgICAgICBzdWJ0cmVlLT5lbnVtcywgc3VidHJlZS0+aGludCwKCQkJCQkgICAgICB1bml0cyk7CgkgICAgfQoJfQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhcmlhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgfQp9CgppbnQKc25wcmludF92YWx1ZShjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyaWFibGUpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKCiAgICBpZiAoc3ByaW50X3JlYWxsb2NfdmFsdWUoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCwgb2JqaWRsZW4sIHZhcmlhYmxlKSkgewogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9Cn0KCnZvaWQKcHJpbnRfdmFsdWUoY29uc3Qgb2lkICogb2JqaWQsCiAgICAgICAgICAgIHNpemVfdCBvYmppZGxlbiwgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyaWFibGUpCnsKICAgIGZwcmludF92YWx1ZShzdGRvdXQsIG9iamlkLCBvYmppZGxlbiwgdmFyaWFibGUpOwp9Cgp2b2lkCmZwcmludF92YWx1ZShGSUxFICogZiwKICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLAogICAgICAgICAgICAgc2l6ZV90IG9iamlkbGVuLCBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgdV9jaGFyICAgICAgICAgKmJ1ZiA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgYnVmX2xlbiA9IDI1Niwgb3V0X2xlbiA9IDA7CgogICAgaWYgKChidWYgPSAodV9jaGFyICopIGNhbGxvYyhidWZfbGVuLCAxKSkgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoZiwgIltUUlVOQ0FURURdXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICAgIGlmIChzcHJpbnRfcmVhbGxvY192YWx1ZSgmYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbiwgdmFyaWFibGUpKSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzXG4iLCBidWYpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzIFtUUlVOQ0FURURdXG4iLCBidWYpOwogICAgICAgIH0KICAgIH0KCiAgICBTTk1QX0ZSRUUoYnVmKTsKfQoKCi8qKgogKiBUYWtlcyB0aGUgdmFsdWUgaW4gVkFSIGFuZCB0dXJucyBpdCBpbnRvIGFuIE9JRCBzZWdtZW50IGluIHZhci0+bmFtZS4KICogIAogKiBAcGFyYW0gdmFyICAgIFRoZSB2YXJpYWJsZS4KICoKICogQHJldHVybiBTTk1QRVJSX1NVQ0NFU1Mgb3IgU05NUEVSUl9HRU5FUlIgCiAqLwppbnQKYnVpbGRfb2lkX3NlZ21lbnQobmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyKQp7CiAgICBpbnQgICAgICAgICAgICAgaTsKICAgIHVpbnQzMl90ICAgICAgICBpcGFkZHI7CgogICAgaWYgKHZhci0+bmFtZSAmJiB2YXItPm5hbWUgIT0gdmFyLT5uYW1lX2xvYykKICAgICAgICBTTk1QX0ZSRUUodmFyLT5uYW1lKTsKICAgIHN3aXRjaCAodmFyLT50eXBlKSB7CiAgICBjYXNlIEFTTl9JTlRFR0VSOgogICAgY2FzZSBBU05fQ09VTlRFUjoKICAgIGNhc2UgQVNOX0dBVUdFOgogICAgY2FzZSBBU05fVElNRVRJQ0tTOgogICAgICAgIHZhci0+bmFtZV9sZW5ndGggPSAxOwogICAgICAgIHZhci0+bmFtZSA9IHZhci0+bmFtZV9sb2M7CiAgICAgICAgdmFyLT5uYW1lWzBdID0gKih2YXItPnZhbC5pbnRlZ2VyKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9JUEFERFJFU1M6CiAgICAgICAgdmFyLT5uYW1lX2xlbmd0aCA9IDQ7CiAgICAgICAgdmFyLT5uYW1lID0gdmFyLT5uYW1lX2xvYzsKICAgICAgICBtZW1jcHkoJmlwYWRkciwgdmFyLT52YWwuc3RyaW5nLCBzaXplb2YoaXBhZGRyKSk7CiAgICAgICAgdmFyLT5uYW1lWzBdID0gKGlwYWRkciA+PiAyNCkgJiAweGZmOwogICAgICAgIHZhci0+bmFtZVsxXSA9IChpcGFkZHIgPj4gMTYpICYgMHhmZjsKICAgICAgICB2YXItPm5hbWVbMl0gPSAoaXBhZGRyID4+ICA4KSAmIDB4ZmY7CiAgICAgICAgdmFyLT5uYW1lWzNdID0gKGlwYWRkciA+PiAgMCkgJiAweGZmOwogICAgICAgIGJyZWFrOwogICAgICAgIAogICAgY2FzZSBBU05fUFJJVl9JTVBMSUVEX09CSkVDVF9JRDoKICAgICAgICB2YXItPm5hbWVfbGVuZ3RoID0gdmFyLT52YWxfbGVuIC8gc2l6ZW9mKG9pZCk7CiAgICAgICAgaWYgKHZhci0+bmFtZV9sZW5ndGggPiAoc2l6ZW9mKHZhci0+bmFtZV9sb2MpIC8gc2l6ZW9mKG9pZCkpKQogICAgICAgICAgICB2YXItPm5hbWUgPSAob2lkICopIG1hbGxvYyhzaXplb2Yob2lkKSAqICh2YXItPm5hbWVfbGVuZ3RoKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICB2YXItPm5hbWUgPSB2YXItPm5hbWVfbG9jOwogICAgICAgIGlmICh2YXItPm5hbWUgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgdmFyLT5uYW1lX2xlbmd0aDsgaSsrKQogICAgICAgICAgICB2YXItPm5hbWVbaV0gPSB2YXItPnZhbC5vYmppZFtpXTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PQkpFQ1RfSUQ6CiAgICAgICAgdmFyLT5uYW1lX2xlbmd0aCA9IHZhci0+dmFsX2xlbiAvIHNpemVvZihvaWQpICsgMTsKICAgICAgICBpZiAodmFyLT5uYW1lX2xlbmd0aCA+IChzaXplb2YodmFyLT5uYW1lX2xvYykgLyBzaXplb2Yob2lkKSkpCiAgICAgICAgICAgIHZhci0+bmFtZSA9IChvaWQgKikgbWFsbG9jKHNpemVvZihvaWQpICogKHZhci0+bmFtZV9sZW5ndGgpKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHZhci0+bmFtZSA9IHZhci0+bmFtZV9sb2M7CiAgICAgICAgaWYgKHZhci0+bmFtZSA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CgogICAgICAgIHZhci0+bmFtZVswXSA9IHZhci0+bmFtZV9sZW5ndGggLSAxOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KSB2YXItPm5hbWVfbGVuZ3RoIC0gMTsgaSsrKQogICAgICAgICAgICB2YXItPm5hbWVbaSArIDFdID0gdmFyLT52YWwub2JqaWRbaV07CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fUFJJVl9JTVBMSUVEX09DVEVUX1NUUjoKICAgICAgICB2YXItPm5hbWVfbGVuZ3RoID0gdmFyLT52YWxfbGVuOwogICAgICAgIGlmICh2YXItPm5hbWVfbGVuZ3RoID4gKHNpemVvZih2YXItPm5hbWVfbG9jKSAvIHNpemVvZihvaWQpKSkKICAgICAgICAgICAgdmFyLT5uYW1lID0gKG9pZCAqKSBtYWxsb2Moc2l6ZW9mKG9pZCkgKiAodmFyLT5uYW1lX2xlbmd0aCkpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdmFyLT5uYW1lID0gdmFyLT5uYW1lX2xvYzsKICAgICAgICBpZiAodmFyLT5uYW1lID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpIHZhci0+dmFsX2xlbjsgaSsrKQogICAgICAgICAgICB2YXItPm5hbWVbaV0gPSAob2lkKSB2YXItPnZhbC5zdHJpbmdbaV07CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fT1BBUVVFOgogICAgY2FzZSBBU05fT0NURVRfU1RSOgogICAgICAgIHZhci0+bmFtZV9sZW5ndGggPSB2YXItPnZhbF9sZW4gKyAxOwogICAgICAgIGlmICh2YXItPm5hbWVfbGVuZ3RoID4gKHNpemVvZih2YXItPm5hbWVfbG9jKSAvIHNpemVvZihvaWQpKSkKICAgICAgICAgICAgdmFyLT5uYW1lID0gKG9pZCAqKSBtYWxsb2Moc2l6ZW9mKG9pZCkgKiAodmFyLT5uYW1lX2xlbmd0aCkpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdmFyLT5uYW1lID0gdmFyLT5uYW1lX2xvYzsKICAgICAgICBpZiAodmFyLT5uYW1lID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICAgICAgdmFyLT5uYW1lWzBdID0gKG9pZCkgdmFyLT52YWxfbGVuOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KSB2YXItPnZhbF9sZW47IGkrKykKICAgICAgICAgICAgdmFyLT5uYW1lW2kgKyAxXSA9IChvaWQpIHZhci0+dmFsLnN0cmluZ1tpXTsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJidWlsZF9vaWRfc2VnbWVudCIsCiAgICAgICAgICAgICAgICAgICAgImludmFsaWQgYXNuIHR5cGU6ICVkXG4iLCB2YXItPnR5cGUpKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICB9CgogICAgaWYgKHZhci0+bmFtZV9sZW5ndGggPiBNQVhfT0lEX0xFTikgewogICAgICAgIERFQlVHTVNHVEwoKCJidWlsZF9vaWRfc2VnbWVudCIsCiAgICAgICAgICAgICAgICAgICAgIlNvbWV0aGluZyB0ZXJyaWJseSB3cm9uZywgbmFtZWxlbiA9ICVsdVxuIiwKICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl2YXItPm5hbWVfbGVuZ3RoKSk7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgfQoKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCgppbnQKYnVpbGRfb2lkX25vYWxsb2Mob2lkICogaW4sIHNpemVfdCBpbl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgIG9pZCAqIHByZWZpeCwgc2l6ZV90IHByZWZpeF9sZW4sCiAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIGluZGV4ZXMpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyOwoKICAgIGlmIChwcmVmaXgpIHsKICAgICAgICBpZiAoaW5fbGVuIDwgcHJlZml4X2xlbikKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgIG1lbWNweShpbiwgcHJlZml4LCBwcmVmaXhfbGVuICogc2l6ZW9mKG9pZCkpOwogICAgICAgICpvdXRfbGVuID0gcHJlZml4X2xlbjsKICAgIH0gZWxzZSB7CiAgICAgICAgKm91dF9sZW4gPSAwOwogICAgfQoKICAgIGZvciAodmFyID0gaW5kZXhlczsgdmFyICE9IE5VTEw7IHZhciA9IHZhci0+bmV4dF92YXJpYWJsZSkgewogICAgICAgIGlmIChidWlsZF9vaWRfc2VnbWVudCh2YXIpICE9IFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgIGlmICh2YXItPm5hbWVfbGVuZ3RoICsgKm91dF9sZW4gPD0gaW5fbGVuKSB7CiAgICAgICAgICAgIG1lbWNweSgmKGluWypvdXRfbGVuXSksIHZhci0+bmFtZSwKICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICogdmFyLT5uYW1lX2xlbmd0aCk7CiAgICAgICAgICAgICpvdXRfbGVuICs9IHZhci0+bmFtZV9sZW5ndGg7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgIH0KICAgIH0KCiAgICBERUJVR01TR1RMKCgiYnVpbGRfb2lkX25vYWxsb2MiLCAiZ2VuZXJhdGVkOiAiKSk7CiAgICBERUJVR01TR09JRCgoImJ1aWxkX29pZF9ub2FsbG9jIiwgaW4sICpvdXRfbGVuKSk7CiAgICBERUJVR01TRygoImJ1aWxkX29pZF9ub2FsbG9jIiwgIlxuIikpOwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKaW50CmJ1aWxkX29pZChvaWQgKiogb3V0LCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgb2lkICogcHJlZml4LCBzaXplX3QgcHJlZml4X2xlbiwgbmV0c25tcF92YXJpYWJsZV9saXN0ICogaW5kZXhlcykKewogICAgb2lkICAgICAgICAgICAgIHRtcG91dFtNQVhfT0lEX0xFTl07CgogICAgLyoKICAgICAqIHh4eC1ya3M6IGluZWZmaWNlbnQuIHRyeSBvbmx5IGJ1aWxkaW5nIHNlZ21lbnRzIHRvIGZpbmQgaW5kZXggbGVuOgogICAgICogICBmb3IgKHZhciA9IGluZGV4ZXM7IHZhciAhPSBOVUxMOyB2YXIgPSB2YXItPm5leHRfdmFyaWFibGUpIHsKICAgICAqICAgICAgaWYgKGJ1aWxkX29pZF9zZWdtZW50KHZhcikgIT0gU05NUEVSUl9TVUNDRVNTKQogICAgICogICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgKiAgICAgICpvdXRfbGVuICs9IHZhci0+bmFtZV9sZW5ndGg7CiAgICAgKgogICAgICogdGhlbiBzZWUgaWYgaXQgZml0cyBpbiBleGlzdGluZyBidWZmZXIsIG9yIHJlYWxsb2MgYnVmZmVyLgogICAgICovCiAgICBpZiAoYnVpbGRfb2lkX25vYWxsb2ModG1wb3V0LCBzaXplb2YodG1wb3V0KSwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsIHByZWZpeF9sZW4sIGluZGV4ZXMpICE9IFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CgogICAgLyoqIHh4eC1ya3M6IHNob3VsZCBmcmVlIHByZXZpb3VzIHZhbHVlPyAqLwogICAgc25tcF9jbG9uZV9tZW0oKHZvaWQgKiopIG91dCwgKHZvaWQgKikgdG1wb3V0LCAqb3V0X2xlbiAqIHNpemVvZihvaWQpKTsKCiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgovKgogKiB2Ymxpc3Rfb3V0IG11c3QgY29udGFpbiBhIHByZS1hbGxvY2F0ZWQgc3RyaW5nIG9mIHZhcmlhYmxlcyBpbnRvCiAqIHdoaWNoIGluZGV4ZXMgY2FuIGJlIGV4dHJhY3RlZCBiYXNlZCBvbiB0aGUgcHJldmlvdXNseSBleGlzdGluZwogKiB0eXBlcyBpbiB0aGUgdmFyaWFibGUgY2hhaW4KICogcmV0dXJuczoKICogU05NUEVSUl9HRU5FUlIgIG9uIGVycm9yCiAqIFNOTVBFUlJfU1VDQ0VTUyBvbiBzdWNjZXNzCiAqLwoKaW50CnBhcnNlX29pZF9pbmRleGVzKG9pZCAqIG9pZEluZGV4LCBzaXplX3Qgb2lkTGVuLAogICAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiBkYXRhKQp7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhciA9IGRhdGE7CgogICAgd2hpbGUgKHZhciAmJiBvaWRMZW4gPiAwKSB7CgogICAgICAgIGlmIChwYXJzZV9vbmVfb2lkX2luZGV4KCZvaWRJbmRleCwgJm9pZExlbiwgdmFyLCAwKSAhPQogICAgICAgICAgICBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICB2YXIgPSB2YXItPm5leHRfdmFyaWFibGU7CiAgICB9CgogICAgaWYgKHZhciAhPSBOVUxMIHx8IG9pZExlbiAhPSAwKQogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCgppbnQKcGFyc2Vfb25lX29pZF9pbmRleChvaWQgKiogb2lkU3RhcnQsIHNpemVfdCAqIG9pZExlbiwKICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiBkYXRhLCBpbnQgY29tcGxldGUpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyID0gZGF0YTsKICAgIG9pZCAgICAgICAgICAgICB0bXBvdXRbTUFYX09JRF9MRU5dOwogICAgdW5zaWduZWQgaW50ICAgIGk7CiAgICB1bnNpZ25lZCBpbnQgICAgdWl0bXAgPSAwOwoKICAgIG9pZCAgICAgICAgICAgICpvaWRJbmRleCA9ICpvaWRTdGFydDsKCiAgICBpZiAodmFyID09IE5VTEwgfHwgKCgqb2lkTGVuID09IDApICYmIChjb21wbGV0ZSA9PSAwKSkpCiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgZWxzZSB7CiAgICAgICAgc3dpdGNoICh2YXItPnR5cGUpIHsKICAgICAgICBjYXNlIEFTTl9JTlRFR0VSOgogICAgICAgIGNhc2UgQVNOX0NPVU5URVI6CiAgICAgICAgY2FzZSBBU05fR0FVR0U6CiAgICAgICAgY2FzZSBBU05fVElNRVRJQ0tTOgogICAgICAgICAgICBpZiAoKm9pZExlbikgewogICAgICAgICAgICAgICAgc25tcF9zZXRfdmFyX3ZhbHVlKHZhciwgKHVfY2hhciAqKSBvaWRJbmRleCsrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgICAgIC0tKCpvaWRMZW4pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc25tcF9zZXRfdmFyX3ZhbHVlKHZhciwgKHVfY2hhciAqKSBvaWRMZW4sIHNpemVvZihsb25nKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIlBhcnNlZCBpbnQoJWQpOiAlbGRcbiIsIHZhci0+dHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgKnZhci0+dmFsLmludGVnZXIpKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgQVNOX0lQQUREUkVTUzoKICAgICAgICAgICAgaWYgKCg0ID4gKm9pZExlbikgJiYgKGNvbXBsZXRlID09IDApKQogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgICAgICAKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQgJiYgaSA8ICpvaWRMZW47ICsraSkgewogICAgICAgICAgICAgICAgaWYgKG9pZEluZGV4W2ldID4gMjU1KSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCBvaWQgaW4gaW5kZXg6ICUiIE5FVFNOTVBfUFJJbyAiZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaWRJbmRleFswXSkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7ICAvKiBzdWItaWRlbnRpZmllciB0b28gbGFyZ2UgKi8KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSB1aXRtcCArIChvaWRJbmRleFtpXSA8PCAoOCooMy1pKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoNCA+IChpbnQpICgqb2lkTGVuKSkgewogICAgICAgICAgICAgICAgb2lkSW5kZXggKz0gKm9pZExlbjsKICAgICAgICAgICAgICAgICgqb2lkTGVuKSA9IDA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBvaWRJbmRleCArPSA0OwogICAgICAgICAgICAgICAgKCpvaWRMZW4pIC09IDQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdWl0bXAgPSBodG9ubCh1aXRtcCk7IC8qIHB1dCBpdCBpbiBwcm9wZXIgb3JkZXIgZm9yIGJ5dGUgY29waWVzICovCiAgICAgICAgICAgIHVpdG1wID0gCiAgICAgICAgICAgICAgICBzbm1wX3NldF92YXJfdmFsdWUodmFyLCAodV9jaGFyICopICZ1aXRtcCwgNCk7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWRfaW5kZXhlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJQYXJzZWQgaXBhZGRyKCVkKTogJWQuJWQuJWQuJWRcbiIsIHZhci0+dHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nWzBdLCB2YXItPnZhbC5zdHJpbmdbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZ1syXSwgdmFyLT52YWwuc3RyaW5nWzNdKSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEFTTl9PQkpFQ1RfSUQ6CiAgICAgICAgY2FzZSBBU05fUFJJVl9JTVBMSUVEX09CSkVDVF9JRDoKICAgICAgICAgICAgaWYgKHZhci0+dHlwZSA9PSBBU05fUFJJVl9JTVBMSUVEX09CSkVDVF9JRCkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIG1pZ2h0IG5vdCBiZSBpbXBsaWVkLCBtaWdodCBiZSBmaXhlZCBsZW4uIGNoZWNrIGlmCiAgICAgICAgICAgICAgICAgKiBjYWxsZXIgc2V0IHVwIHZhbCBsZW4sIGFuZCB1c2UgaXQgaWYgdGhleSBkaWQuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmICgwID09IHZhci0+dmFsX2xlbikKICAgICAgICAgICAgICAgICAgICB1aXRtcCA9ICpvaWRMZW47CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkX2luZGV4ZXM6Zml4IiwgImZpeGVkIGxlbiBvaWRcbiIpKTsKICAgICAgICAgICAgICAgICAgICB1aXRtcCA9IHZhci0+dmFsX2xlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICgqb2lkTGVuKSB7CiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSAqb2lkSW5kZXgrKzsKICAgICAgICAgICAgICAgICAgICAtLSgqb2lkTGVuKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCh1aXRtcCA+ICpvaWRMZW4pICYmIChjb21wbGV0ZSA9PSAwKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh1aXRtcCA+IE1BWF9PSURfTEVOKQogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOyAgLyogdG9vIGJpZyBhbmQgaWxsZWdhbCAqLwoKICAgICAgICAgICAgaWYgKHVpdG1wID4gKm9pZExlbikgewogICAgICAgICAgICAgICAgbWVtY3B5KHRtcG91dCwgb2lkSW5kZXgsIHNpemVvZihvaWQpICogKCpvaWRMZW4pKTsKICAgICAgICAgICAgICAgIG1lbXNldCgmdG1wb3V0WypvaWRMZW5dLCAweDAwLAogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICogKHVpdG1wIC0gKm9pZExlbikpOwogICAgICAgICAgICAgICAgc25tcF9zZXRfdmFyX3ZhbHVlKHZhciwgKHVfY2hhciAqKSB0bXBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKiB1aXRtcCk7CiAgICAgICAgICAgICAgICBvaWRJbmRleCArPSAqb2lkTGVuOwogICAgICAgICAgICAgICAgKCpvaWRMZW4pID0gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNubXBfc2V0X3Zhcl92YWx1ZSh2YXIsICh1X2NoYXIgKikgb2lkSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKiB1aXRtcCk7CiAgICAgICAgICAgICAgICBvaWRJbmRleCArPSB1aXRtcDsKICAgICAgICAgICAgICAgICgqb2lkTGVuKSAtPSB1aXRtcDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzIiwgIlBhcnNlZCBvaWQ6ICIpKTsKICAgICAgICAgICAgREVCVUdNU0dPSUQoKCJwYXJzZV9vaWRfaW5kZXhlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5vYmppZCwgdmFyLT52YWxfbGVuIC8gc2l6ZW9mKG9pZCkpKTsKICAgICAgICAgICAgREVCVUdNU0coKCJwYXJzZV9vaWRfaW5kZXhlcyIsICJcbiIpKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgQVNOX09QQVFVRToKICAgICAgICBjYXNlIEFTTl9PQ1RFVF9TVFI6CiAgICAgICAgY2FzZSBBU05fUFJJVl9JTVBMSUVEX09DVEVUX1NUUjoKICAgICAgICAgICAgaWYgKHZhci0+dHlwZSA9PSBBU05fUFJJVl9JTVBMSUVEX09DVEVUX1NUUikgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIG1pZ2h0IG5vdCBiZSBpbXBsaWVkLCBtaWdodCBiZSBmaXhlZCBsZW4uIGNoZWNrIGlmCiAgICAgICAgICAgICAgICAgKiBjYWxsZXIgc2V0IHVwIHZhbCBsZW4sIGFuZCB1c2UgaXQgaWYgdGhleSBkaWQuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmICgwID09IHZhci0+dmFsX2xlbikKICAgICAgICAgICAgICAgICAgICB1aXRtcCA9ICpvaWRMZW47CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkX2luZGV4ZXM6Zml4IiwgImZpeGVkIGxlbiBzdHJcbiIpKTsKICAgICAgICAgICAgICAgICAgICB1aXRtcCA9IHZhci0+dmFsX2xlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICgqb2lkTGVuKSB7CiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSAqb2lkSW5kZXgrKzsKICAgICAgICAgICAgICAgICAgICAtLSgqb2lkTGVuKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCh1aXRtcCA+ICpvaWRMZW4pICYmIChjb21wbGV0ZSA9PSAwKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHdlIGhhbmRsZSB0aGlzIG9uZSBvdXJzZWx2ZXMgc2luY2Ugd2UgZG9uJ3QgaGF2ZQogICAgICAgICAgICAgKiBwcmUtYWxsb2NhdGVkIG1lbW9yeSB0byBjb3B5IGZyb20gdXNpbmcKICAgICAgICAgICAgICogc25tcF9zZXRfdmFyX3ZhbHVlKCkgCiAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgaWYgKHVpdG1wID09IDApCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogemVybyBsZW5ndGggc3RyaW5ncyBzaG91bGRuJ3QgbWFsbG9jICovCgogICAgICAgICAgICBpZiAodWl0bXAgPiBNQVhfT0lEX0xFTikKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsgIC8qIHRvbyBiaWcgYW5kIGlsbGVnYWwgKi8KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIG1hbGxvYyBieSBzaXplKzEgdG8gYWxsb3cgYSBudWxsIHRvIGJlIGFwcGVuZGVkLiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHZhci0+dmFsX2xlbiA9IHVpdG1wOwogICAgICAgICAgICB2YXItPnZhbC5zdHJpbmcgPSAodV9jaGFyICopIGNhbGxvYygxLCB1aXRtcCArIDEpOwogICAgICAgICAgICBpZiAodmFyLT52YWwuc3RyaW5nID09IE5VTEwpCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CgogICAgICAgICAgICBpZiAoKHNpemVfdCl1aXRtcCA+ICgqb2lkTGVuKSkgewogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8ICpvaWRMZW47ICsraSkKICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmdbaV0gPSAodV9jaGFyKSAqIG9pZEluZGV4Kys7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAqb2lkTGVuOyBpIDwgdWl0bXA7ICsraSkKICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmdbaV0gPSAnXDAnOwogICAgICAgICAgICAgICAgKCpvaWRMZW4pID0gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB1aXRtcDsgKytpKQogICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZ1tpXSA9ICh1X2NoYXIpICogb2lkSW5kZXgrKzsKICAgICAgICAgICAgICAgICgqb2lkTGVuKSAtPSB1aXRtcDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXItPnZhbC5zdHJpbmdbdWl0bXBdID0gJ1wwJzsKCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWRfaW5kZXhlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJQYXJzZWQgc3RyKCVkKTogJXNcbiIsIHZhci0+dHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nKSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkX2luZGV4ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBhc24gdHlwZTogJWRcbiIsIHZhci0+dHlwZSkpOwogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgfQogICAgfQogICAgKCpvaWRTdGFydCkgPSBvaWRJbmRleDsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCi8qCiAqIGR1bXBfcmVhbGxvY19vaWRfdG9faW5ldGFkZHJlc3M6CiAqICAgcmV0dXJuIDAgZm9yIGZhaWx1cmUsCiAqICAgcmV0dXJuIDEgZm9yIHN1Y2Nlc3MsCiAqICAgcmV0dXJuIDIgZm9yIG5vdCBoYW5kbGVkCiAqLwoKaW50IApkdW1wX3JlYWxsb2Nfb2lkX3RvX2luZXRhZGRyZXNzKGNvbnN0IGludCBhZGRyX3R5cGUsIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcXVvdGVjaGFyKQp7CiAgICBpbnQgICAgICAgICAgICAgaSwgbGVuOwogICAgY2hhciAgICAgICAgICAgIGludGJ1Zls2NF0sICpwOwogICAgY2hhciAqY29uc3QgICAgIGVuZCA9IGludGJ1ZiArIHNpemVvZihpbnRidWYpOwogICAgdW5zaWduZWQgY2hhciAgKnpjOwogICAgdW5zaWduZWQgbG9uZyAgIHpvbmU7CgogICAgaWYgKCFidWYpCiAgICAgICAgcmV0dXJuIDE7CgogICAgZm9yIChpID0gMDsgaSA8IG9iamlkbGVuOyBpKyspCiAgICAgICAgaWYgKG9iamlkW2ldIDwgMCB8fCBvYmppZFtpXSA+IDI1NSkKICAgICAgICAgICAgcmV0dXJuIDI7CgogICAgcCA9IGludGJ1ZjsKICAgICpwKysgPSBxdW90ZWNoYXI7CgogICAgc3dpdGNoIChhZGRyX3R5cGUpIHsKICAgIGNhc2UgSVBWNDoKICAgIGNhc2UgSVBWNFo6CiAgICAgICAgaWYgKChhZGRyX3R5cGUgPT0gSVBWNCAgJiYgb2JqaWRsZW4gIT0gNCkgfHwKICAgICAgICAgICAgKGFkZHJfdHlwZSA9PSBJUFY0WiAmJiBvYmppZGxlbiAhPSA4KSkKICAgICAgICAgICAgcmV0dXJuIDI7CgogICAgICAgIGxlbiA9IHNucHJpbnRmKHAsIGVuZCAtIHAsICIlIiBORVRTTk1QX1BSSW8gInUuJSIgTkVUU05NUF9QUklvICJ1LiIKICAgICAgICAgICAgICAgICAgICAgICIlIiBORVRTTk1QX1BSSW8gInUuJSIgTkVUU05NUF9QUklvICJ1IiwKICAgICAgICAgICAgICAgICAgICAgIG9iamlkWzBdLCBvYmppZFsxXSwgb2JqaWRbMl0sIG9iamlkWzNdKTsKICAgICAgICBwICs9IGxlbjsKICAgICAgICBpZiAocCA+PSBlbmQpCiAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgIGlmIChhZGRyX3R5cGUgPT0gSVBWNFopIHsKICAgICAgICAgICAgemMgPSAodW5zaWduZWQgY2hhciopJnpvbmU7CiAgICAgICAgICAgIHpjWzBdID0gb2JqaWRbNF07CiAgICAgICAgICAgIHpjWzFdID0gb2JqaWRbNV07CiAgICAgICAgICAgIHpjWzJdID0gb2JqaWRbNl07CiAgICAgICAgICAgIHpjWzNdID0gb2JqaWRbN107CiAgICAgICAgICAgIHpvbmUgPSBudG9obCh6b25lKTsKICAgICAgICAgICAgbGVuID0gc25wcmludGYocCwgZW5kIC0gcCwgIiUlJWx1Iiwgem9uZSk7CiAgICAgICAgICAgIHAgKz0gbGVuOwogICAgICAgICAgICBpZiAocCA+PSBlbmQpCiAgICAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICB9CgogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgSVBWNjoKICAgIGNhc2UgSVBWNlo6CiAgICAgICAgaWYgKChhZGRyX3R5cGUgPT0gSVBWNiAmJiBvYmppZGxlbiAhPSAxNikgfHwKICAgICAgICAgICAgKGFkZHJfdHlwZSA9PSBJUFY2WiAmJiBvYmppZGxlbiAhPSAyMCkpCiAgICAgICAgICAgIHJldHVybiAyOwoKICAgICAgICBsZW4gPSAwOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArKykgewogICAgICAgICAgICBsZW4gPSBzbnByaW50ZihwLCBlbmQgLSBwLCAiJXMlMDIiIE5FVFNOTVBfUFJJbyAieCIsIGkgPyAiOiIgOiAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWRbaV0pOwogICAgICAgICAgICBwICs9IGxlbjsKICAgICAgICAgICAgaWYgKHAgPj0gZW5kKQogICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgfQoKICAgICAgICBpZiAoYWRkcl90eXBlID09IElQVjZaKSB7CiAgICAgICAgICAgIHpjID0gKHVuc2lnbmVkIGNoYXIqKSZ6b25lOwogICAgICAgICAgICB6Y1swXSA9IG9iamlkWzE2XTsKICAgICAgICAgICAgemNbMV0gPSBvYmppZFsxN107CiAgICAgICAgICAgIHpjWzJdID0gb2JqaWRbMThdOwogICAgICAgICAgICB6Y1szXSA9IG9iamlkWzE5XTsKICAgICAgICAgICAgem9uZSA9IG50b2hsKHpvbmUpOwogICAgICAgICAgICBsZW4gPSBzbnByaW50ZihwLCBlbmQgLSBwLCAiJSUlbHUiLCB6b25lKTsKICAgICAgICAgICAgcCArPSBsZW47CiAgICAgICAgICAgIGlmIChwID49IGVuZCkKICAgICAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgIH0KCiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBETlM6CiAgICBkZWZhdWx0OiAKICAgICAgICAvKiBETlMgY2FuIGp1c3QgYmUgaGFuZGxlZCBieSBkdW1wX3JlYWxsb2Nfb2lkX3RvX3N0cmluZygpICovCiAgICAgICAgcmV0dXJuIDI7CiAgICB9CgogICAgKnArKyA9IHF1b3RlY2hhcjsKICAgIGlmIChwID49IGVuZCkKICAgICAgICByZXR1cm4gMjsKCiAgICAqcCsrID0gJ1wwJzsKICAgIGlmIChwID49IGVuZCkKICAgICAgICByZXR1cm4gMjsKCiAgICByZXR1cm4gc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgaW50YnVmKTsKfQoKaW50CmR1bXBfcmVhbGxvY19vaWRfdG9fc3RyaW5nKGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHF1b3RlY2hhcikKewogICAgaWYgKGJ1ZikgewogICAgICAgIGludCAgICAgICAgICAgICBpLCBhbGVuOwoKICAgICAgICBmb3IgKGkgPSAwLCBhbGVuID0gMDsgaSA8IChpbnQpIG9iamlkbGVuOyBpKyspIHsKICAgICAgICAgICAgb2lkICAgICAgICAgICAgIHRzdCA9IG9iamlkW2ldOwogICAgICAgICAgICBpZiAoKHRzdCA+IDI1NCkgfHwgKCFpc3ByaW50KHRzdCkpKSB7CiAgICAgICAgICAgICAgICB0c3QgPSAob2lkKSAnLic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChhbGVuID09IDApIHsKICAgICAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVNDQVBFX1FVT1RFUykpIHsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgMikgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICdcXCc7CiAgICAgICAgICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIDIpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gcXVvdGVjaGFyOwogICAgICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgICAgICB9CgogICAgICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgMikgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gKGNoYXIpIHRzdDsKICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgICAgICBhbGVuKys7CiAgICAgICAgfQoKICAgICAgICBpZiAoYWxlbikgewogICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VTQ0FQRV9RVU9URVMpKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgMikgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAnXFwnOwogICAgICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyAyKSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSBxdW90ZWNoYXI7CiAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICB9CgogICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICdcMCc7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnZvaWQKX29pZF9maW5pc2hfcHJpbnRpbmcoY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsIGludCAqYnVmX292ZXJmbG93KSB7CiAgICBjaGFyICAgICAgICAgICAgaW50YnVmWzY0XTsKICAgIGlmICgqYnVmICE9IE5VTEwgJiYgKigqYnVmICsgKm91dF9sZW4gLSAxKSAhPSAnLicpIHsKICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIuIikpIHsKICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIHdoaWxlIChvYmppZGxlbi0tID4gMCkgeyAgICAvKiBvdXRwdXQgcmVzdCBvZiBuYW1lLCB1bmludGVycHJldGVkICovCiAgICAgICAgc3ByaW50ZihpbnRidWYsICIlIiBORVRTTk1QX1BSSW8gInUuIiwgKm9iamlkKyspOwogICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgaW50YnVmKSkgewogICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCpidWYgIT0gTlVMTCkgewogICAgICAgICooKmJ1ZiArICpvdXRfbGVuIC0gMSkgPSAnXDAnOyAgLyogcmVtb3ZlIHRyYWlsaW5nIGRvdCAqLwogICAgICAgICpvdXRfbGVuID0gKm91dF9sZW4gLSAxOwogICAgfQp9CgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwpzdGF0aWMgc3RydWN0IHRyZWUgKgpfZ2V0X3JlYWxsb2Nfc3ltYm9sKGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyZWUgKnN1YnRyZWUsCiAgICAgICAgICAgICAgICAgICAgdV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywgaW50ICpidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGluZGV4X2xpc3QgKmluX2RpY2VzLCBzaXplX3QgKiBlbmRfb2Zfa25vd24pCnsKICAgIHN0cnVjdCB0cmVlICAgICpyZXR1cm5fdHJlZSA9IE5VTEw7CiAgICBpbnQgICAgICAgICAgICAgZXh0ZW5kZWRfaW5kZXggPQogICAgICAgIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FWFRFTkRFRF9JTkRFWCk7CiAgICBpbnQgICAgICAgICAgICAgb3V0cHV0X2Zvcm1hdCA9CiAgICAgICAgbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQpOwogICAgY2hhciAgICAgICAgICAgIGludGJ1Zls2NF07CgogICAgaWYgKCFvYmppZCB8fCAhYnVmKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgZm9yICg7IHN1YnRyZWU7IHN1YnRyZWUgPSBzdWJ0cmVlLT5uZXh0X3BlZXIpIHsKICAgICAgICBpZiAoKm9iamlkID09IHN1YnRyZWUtPnN1YmlkKSB7CgkgICAgd2hpbGUgKHN1YnRyZWUtPm5leHRfcGVlciAmJiBzdWJ0cmVlLT5uZXh0X3BlZXItPnN1YmlkID09ICpvYmppZCkKCQlzdWJ0cmVlID0gc3VidHJlZS0+bmV4dF9wZWVyOwogICAgICAgICAgICBpZiAoc3VidHJlZS0+aW5kZXhlcykgewogICAgICAgICAgICAgICAgaW5fZGljZXMgPSBzdWJ0cmVlLT5pbmRleGVzOwogICAgICAgICAgICB9IGVsc2UgaWYgKHN1YnRyZWUtPmF1Z21lbnRzKSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgdHJlZSAgICAqdHAyID0KICAgICAgICAgICAgICAgICAgICBmaW5kX3RyZWVfbm9kZShzdWJ0cmVlLT5hdWdtZW50cywgLTEpOwogICAgICAgICAgICAgICAgaWYgKHRwMikgewogICAgICAgICAgICAgICAgICAgIGluX2RpY2VzID0gdHAyLT5pbmRleGVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXN0cm5jbXAoc3VidHJlZS0+bGFiZWwsIEFOT04sIEFOT05fTEVOKSB8fAogICAgICAgICAgICAgICAgKE5FVFNOTVBfT0lEX09VVFBVVF9OVU1FUklDID09IG91dHB1dF9mb3JtYXQpKSB7CiAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiVsdSIsIHN1YnRyZWUtPnN1YmlkKTsKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWUtPmxhYmVsKSkgewogICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAob2JqaWRsZW4gPiAxKSB7CiAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiLiIpKSB7CiAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuX3RyZWUgPSBfZ2V0X3JlYWxsb2Nfc3ltYm9sKG9iamlkICsgMSwgb2JqaWRsZW4gLSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWUtPmNoaWxkX2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX292ZXJmbG93LCBpbl9kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfb2Zfa25vd24pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocmV0dXJuX3RyZWUgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybl90cmVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHN1YnRyZWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIGlmIChlbmRfb2Zfa25vd24pIHsKICAgICAgICAqZW5kX29mX2tub3duID0gKm91dF9sZW47CiAgICB9CgogICAgLyoKICAgICAqIFN1YnRyZWUgbm90IGZvdW5kLiAgCiAgICAgKi8KCiAgICB3aGlsZSAoaW5fZGljZXMgJiYgKG9iamlkbGVuID4gMCkgJiYKICAgICAgICAgICAoTkVUU05NUF9PSURfT1VUUFVUX05VTUVSSUMgIT0gb3V0cHV0X2Zvcm1hdCkgJiYKICAgICAgICAgICAhbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0RPTlRfQlJFQUtET1dOX09JRFMpKSB7CiAgICAgICAgc2l6ZV90ICAgICAgICAgIG51bWlkczsKICAgICAgICBzdHJ1Y3QgdHJlZSAgICAqdHA7CgogICAgICAgIHRwID0gZmluZF90cmVlX25vZGUoaW5fZGljZXMtPmlsYWJlbCwgLTEpOwoKICAgICAgICBpZiAoIXRwKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIENhbid0IGZpbmQgYW4gaW5kZXggaW4gdGhlIG1pYiB0cmVlLiAgQmFpbC4gIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoZXh0ZW5kZWRfaW5kZXgpIHsKICAgICAgICAgICAgaWYgKCpidWYgIT0gTlVMTCAmJiAqKCpidWYgKyAqb3V0X2xlbiAtIDEpID09ICcuJykgewogICAgICAgICAgICAgICAgKCpvdXRfbGVuKS0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiWyIpKSB7CiAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc3dpdGNoICh0cC0+dHlwZSkgewogICAgICAgIGNhc2UgVFlQRV9PQ1RFVFNUUjoKICAgICAgICAgICAgaWYgKGV4dGVuZGVkX2luZGV4ICYmIHRwLT5oaW50KSB7CiAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgdmFyOwogICAgICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIGJ1ZmZlclsxMDI0XTsKICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBpOwoKICAgICAgICAgICAgICAgIG1lbXNldCgmdmFyLCAwLCBzaXplb2YgdmFyKTsKICAgICAgICAgICAgICAgIGlmIChpbl9kaWNlcy0+aXNpbXBsaWVkKSB7CiAgICAgICAgICAgICAgICAgICAgbnVtaWRzID0gb2JqaWRsZW47CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bWlkcyA+IG9iamlkbGVuKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHAtPnJhbmdlcyAmJiAhdHAtPnJhbmdlcy0+bmV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0cC0+cmFuZ2VzLT5sb3cgPT0gdHAtPnJhbmdlcy0+aGlnaCkgewogICAgICAgICAgICAgICAgICAgIG51bWlkcyA9IHRwLT5yYW5nZXMtPmxvdzsKICAgICAgICAgICAgICAgICAgICBpZiAobnVtaWRzID4gb2JqaWRsZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBudW1pZHMgPSAqb2JqaWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bWlkcyA+PSBvYmppZGxlbikKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgICAgICAgICAgb2JqaWQrKzsKICAgICAgICAgICAgICAgICAgICBvYmppZGxlbi0tOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG51bWlkcyA+IG9iamlkbGVuKQogICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpIG51bWlkczsgaSsrKQogICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9ICh1X2NoYXIpIG9iamlkW2ldOwogICAgICAgICAgICAgICAgdmFyLnR5cGUgPSBBU05fT0NURVRfU1RSOwogICAgICAgICAgICAgICAgdmFyLnZhbC5zdHJpbmcgPSBidWZmZXI7CiAgICAgICAgICAgICAgICB2YXIudmFsX2xlbiA9IG51bWlkczsKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdykgewogICAgICAgICAgICAgICAgICAgIGlmICghc3ByaW50X3JlYWxsb2Nfb2N0ZXRfc3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAmdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHRwLT5oaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChpbl9kaWNlcy0+aXNpbXBsaWVkKSB7CiAgICAgICAgICAgICAgICBudW1pZHMgPSBvYmppZGxlbjsKICAgICAgICAgICAgICAgIGlmIChudW1pZHMgPiBvYmppZGxlbikKICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKCiAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWR1bXBfcmVhbGxvY19vaWRfdG9fc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIChvYmppZCwgbnVtaWRzLCBidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAnXCcnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAodHAtPnJhbmdlcyAmJiAhdHAtPnJhbmdlcy0+bmV4dAogICAgICAgICAgICAgICAgICAgICAgICYmIHRwLT5yYW5nZXMtPmxvdyA9PSB0cC0+cmFuZ2VzLT5oaWdoKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogYSBmaXhlZC1sZW5ndGggb2N0ZXQgc3RyaW5nIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBudW1pZHMgPSB0cC0+cmFuZ2VzLT5sb3c7CiAgICAgICAgICAgICAgICBpZiAobnVtaWRzID4gb2JqaWRsZW4pCiAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CgogICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFkdW1wX3JlYWxsb2Nfb2lkX3RvX3N0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAob2JqaWQsIG51bWlkcywgYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJ1wnJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbnVtaWRzID0gKHNpemVfdCkgKiBvYmppZCArIDE7CiAgICAgICAgICAgICAgICBpZiAobnVtaWRzID4gb2JqaWRsZW4pCiAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgICAgICBpZiAobnVtaWRzID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbgogICAgICAgICAgICAgICAgICAgICAgICAoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FU0NBUEVfUVVPVEVTKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICJcXCIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICJcIiIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbgogICAgICAgICAgICAgICAgICAgICAgICAoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FU0NBUEVfUVVPVEVTKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICJcXCIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICJcIiIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmVlICogbmV4dF9wZWVyOwogICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9ybWFsX2hhbmRsaW5nID0gMTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cC0+bmV4dF9wZWVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3BlZXIgPSB0cC0+bmV4dF9wZWVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvKiBUcnkgaGFuZGxpbmcgdGhlIEluZXRBZGRyZXNzIGluIHRoZSBPSUQsIGluIGNhc2Ugb2YgZmFpbHVyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICogdXNlIHRoZSBub3JtYWxfaGFuZGxpbmcuIAogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRwLT5uZXh0X3BlZXIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT50Y19pbmRleCAhPSAtMSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9wZWVyLT50Y19pbmRleCAhPSAtMSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKGdldF90Y19kZXNjcmlwdG9yKHRwLT50Y19pbmRleCksICJJbmV0QWRkcmVzcyIpID09IDAgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcChnZXRfdGNfZGVzY3JpcHRvcihuZXh0X3BlZXItPnRjX2luZGV4KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmV0QWRkcmVzc1R5cGUiKSA9PSAwICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWRkcl90eXBlID0gKihvYmppZCAtIDEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGR1bXBfcmVhbGxvY19vaWRfdG9faW5ldGFkZHJlc3MoYWRkcl90eXBlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkICsgMSwgbnVtaWRzIC0gMSwgYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJyInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gMikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbF9oYW5kbGluZyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxfaGFuZGxpbmcgJiYgIWR1bXBfcmVhbGxvY19vaWRfdG9fc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2JqaWQgKyAxLCBudW1pZHMgLSAxLCBidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJyInKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2JqaWQgKz0gbnVtaWRzOwogICAgICAgICAgICBvYmppZGxlbiAtPSBudW1pZHM7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjMyOgogICAgICAgIGNhc2UgVFlQRV9VSU5URUdFUjoKICAgICAgICBjYXNlIFRZUEVfVU5TSUdORUQzMjoKICAgICAgICBjYXNlIFRZUEVfR0FVR0U6CiAgICAgICAgY2FzZSBUWVBFX0lOVEVHRVI6CiAgICAgICAgICAgIGlmICh0cC0+ZW51bXMpIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBlbnVtX2xpc3QgKmVwID0gdHAtPmVudW1zOwogICAgICAgICAgICAgICAgd2hpbGUgKGVwICYmIGVwLT52YWx1ZSAhPSAoaW50KSAoKm9iamlkKSkgewogICAgICAgICAgICAgICAgICAgIGVwID0gZXAtPm5leHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZXApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGVwLT5sYWJlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiUiIE5FVFNOTVBfUFJJbyAidSIsICpvYmppZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJSIgTkVUU05NUF9QUklvICJ1IiwgKm9iamlkKTsKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvYmppZCsrOwogICAgICAgICAgICBvYmppZGxlbi0tOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBUWVBFX1RJTUVUSUNLUzoKICAgICAgICAgICAgLyogSW4gYW4gaW5kZXgsIHRoaXMgaXMgcHJvYmFibHkgYSB0aW1lZmlsdGVyICovCiAgICAgICAgICAgIGlmIChleHRlbmRlZF9pbmRleCkgewogICAgICAgICAgICAgICAgdXB0aW1lU3RyaW5nKCAqb2JqaWQsIGludGJ1Ziwgc2l6ZW9mKCBpbnRidWYgKSApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlIiBORVRTTk1QX1BSSW8gInUiLCAqb2JqaWQpOwogICAgICAgICAgICB9ICAgCiAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9iamlkKys7CiAgICAgICAgICAgIG9iamlkbGVuLS07CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFRZUEVfT0JKSUQ6CiAgICAgICAgICAgIGlmIChpbl9kaWNlcy0+aXNpbXBsaWVkKSB7CiAgICAgICAgICAgICAgICBudW1pZHMgPSBvYmppZGxlbjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG51bWlkcyA9IChzaXplX3QpICogb2JqaWQgKyAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChudW1pZHMgPiBvYmppZGxlbikKICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICBpZiAoZXh0ZW5kZWRfaW5kZXgpIHsKICAgICAgICAgICAgICAgIGlmIChpbl9kaWNlcy0+aXNpbXBsaWVkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICYmICFuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkX3RyZWUoYnVmLCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtaWRzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZF90cmVlKGJ1ZiwgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX292ZXJmbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkICsgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1pZHMgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIF9nZXRfcmVhbGxvY19zeW1ib2wob2JqaWQsIG51bWlkcywgTlVMTCwgYnVmLCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9iamlkICs9IChudW1pZHMpOwogICAgICAgICAgICBvYmppZGxlbiAtPSAobnVtaWRzKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgVFlQRV9JUEFERFI6CiAgICAgICAgICAgIGlmIChvYmppZGxlbiA8IDQpCiAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlIiBORVRTTk1QX1BSSW8gInUuJSIgTkVUU05NUF9QUklvICJ1LiIKICAgICAgICAgICAgICAgICAgICAiJSIgTkVUU05NUF9QUklvICJ1LiUiIE5FVFNOTVBfUFJJbyAidSIsCiAgICAgICAgICAgICAgICAgICAgb2JqaWRbMF0sIG9iamlkWzFdLCBvYmppZFsyXSwgb2JqaWRbM10pOwogICAgICAgICAgICBvYmppZCArPSA0OwogICAgICAgICAgICBvYmppZGxlbiAtPSA0OwogICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgaW50YnVmKSkgewogICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgVFlQRV9ORVRBRERSOnsKICAgICAgICAgICAgICAgIG9pZCAgICAgICAgICAgICBudHlwZSA9ICpvYmppZCsrOwoKICAgICAgICAgICAgICAgIG9iamlkbGVuLS07CiAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiUiIE5FVFNOTVBfUFJJbyAidS4iLCBudHlwZSk7CiAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKG50eXBlID09IDEgJiYgb2JqaWRsZW4gPj0gNCkgewogICAgICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJSIgTkVUU05NUF9QUklvICJ1LiUiIE5FVFNOTVBfUFJJbyAidS4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIgTkVUU05NUF9QUklvICJ1LiUiIE5FVFNOTVBfUFJJbyAidSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZFswXSwgb2JqaWRbMV0sIG9iamlkWzJdLCBvYmppZFszXSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvYmppZCArPSA0OwogICAgICAgICAgICAgICAgICAgIG9iamlkbGVuIC09IDQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFRZUEVfTlNBUEFERFJFU1M6CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKGV4dGVuZGVkX2luZGV4KSB7CiAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiXSIpKSB7CiAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiLiIpKSB7CiAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpbl9kaWNlcyA9IGluX2RpY2VzLT5uZXh0OwogICAgfQoKICBmaW5pc2hfaXQ6CiAgICBfb2lkX2ZpbmlzaF9wcmludGluZyhvYmppZCwgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCBidWZfb3ZlcmZsb3cpOwogICAgcmV0dXJuIE5VTEw7Cn0KCnN0cnVjdCB0cmVlICAgICoKZ2V0X3RyZWUoY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwgc3RydWN0IHRyZWUgKnN1YnRyZWUpCnsKICAgIHN0cnVjdCB0cmVlICAgICpyZXR1cm5fdHJlZSA9IE5VTEw7CgogICAgZm9yICg7IHN1YnRyZWU7IHN1YnRyZWUgPSBzdWJ0cmVlLT5uZXh0X3BlZXIpIHsKICAgICAgICBpZiAoKm9iamlkID09IHN1YnRyZWUtPnN1YmlkKQogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgfQoKICAgIHJldHVybiBOVUxMOwoKICBmb3VuZDoKICAgIHdoaWxlIChzdWJ0cmVlLT5uZXh0X3BlZXIgJiYgc3VidHJlZS0+bmV4dF9wZWVyLT5zdWJpZCA9PSAqb2JqaWQpCglzdWJ0cmVlID0gc3VidHJlZS0+bmV4dF9wZWVyOwogICAgaWYgKG9iamlkbGVuID4gMSkKICAgICAgICByZXR1cm5fdHJlZSA9CiAgICAgICAgICAgIGdldF90cmVlKG9iamlkICsgMSwgb2JqaWRsZW4gLSAxLCBzdWJ0cmVlLT5jaGlsZF9saXN0KTsKICAgIGlmIChyZXR1cm5fdHJlZSAhPSBOVUxMKQogICAgICAgIHJldHVybiByZXR1cm5fdHJlZTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gc3VidHJlZTsKfQoKLyoqCiAqIFByaW50cyBvbiBvaWQgZGVzY3JpcHRpb24gb24gc3Rkb3V0LgogKgogKiBAc2VlIGZwcmludF9kZXNjcmlwdGlvbgogKi8Kdm9pZApwcmludF9kZXNjcmlwdGlvbihvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLCAvKiBudW1iZXIgb2Ygc3ViaWRlbnRpZmllcnMgKi8KICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKQp7CiAgICBmcHJpbnRfZGVzY3JpcHRpb24oc3Rkb3V0LCBvYmppZCwgb2JqaWRsZW4sIHdpZHRoKTsKfQoKCi8qKgogKiBQcmludHMgb24gb2lkIGRlc2NyaXB0aW9uIGludG8gYSBmaWxlIGRlc2NyaXB0b3IuCiAqIAogKiBAcGFyYW0gZiAgICAgICAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBvYmppZCAgICAgVGhlIG9iamVjdCBpZGVudGlmaWVyLgogKiBAcGFyYW0gb2JqaWRsZW4gIFRoZSBvYmplY3QgaWQgbGVuZ3RoLgogKiBAcGFyYW0gd2lkdGggICAgIE51bWJlciBvZiBzdWJpZGVudGlmaWVycy4KICovCnZvaWQKZnByaW50X2Rlc2NyaXB0aW9uKEZJTEUgKiBmLCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKQp7CiAgICB1X2NoYXIgICAgICAgICAqYnVmID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBidWZfbGVuID0gMjU2LCBvdXRfbGVuID0gMDsKCiAgICBpZiAoKGJ1ZiA9ICh1X2NoYXIgKikgY2FsbG9jKGJ1Zl9sZW4sIDEpKSA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihmLCAiW1RSVU5DQVRFRF1cbiIpOwogICAgICAgIHJldHVybjsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19kZXNjcmlwdGlvbigmYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuLCB3aWR0aCkpIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXMgW1RSVU5DQVRFRF1cbiIsIGJ1Zik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXNcbiIsIGJ1Zik7CiAgICAgICAgfQogICAgfQoKICAgIFNOTVBfRlJFRShidWYpOwp9CgppbnQKc25wcmludF9kZXNjcmlwdGlvbihjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgIG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sIGludCB3aWR0aCkKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwoKICAgIGlmIChzcHJpbnRfcmVhbGxvY19kZXNjcmlwdGlvbigodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCwgb2JqaWRsZW4sIHdpZHRoKSkgewogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9Cn0KCmludApzcHJpbnRfcmVhbGxvY19kZXNjcmlwdGlvbih1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwgaW50IHdpZHRoKQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHAgPSBnZXRfdHJlZShvYmppZCwgb2JqaWRsZW4sIHRyZWVfaGVhZCk7CiAgICBzdHJ1Y3QgdHJlZSAgICAqc3VidHJlZSA9IHRyZWVfaGVhZDsKICAgIGludCAgICAgICAgICAgICBwb3MsIGxlbjsKICAgIGNoYXIgICAgICAgICAgICB0bXBidWZbMTI4XTsKICAgIGNvbnN0IGNoYXIgICAgICpjcDsKCiAgICBpZiAoTlVMTCA9PSB0cCkKICAgICAgICByZXR1cm4gMDsKCiAgICBpZiAodHAtPnR5cGUgPD0gVFlQRV9TSU1QTEVfTEFTVCkKICAgICAgICBjcCA9ICIgT0JKRUNULVRZUEUiOwogICAgZWxzZQogICAgICAgIHN3aXRjaCAodHAtPnR5cGUpIHsKICAgICAgICBjYXNlIFRZUEVfVFJBUFRZUEU6CiAgICAgICAgICAgIGNwID0gIiBUUkFQLVRZUEUiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTk9USUZUWVBFOgogICAgICAgICAgICBjcCA9ICIgTk9USUZJQ0FUSU9OLVRZUEUiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfT0JKR1JPVVA6CiAgICAgICAgICAgIGNwID0gIiBPQkpFQ1QtR1JPVVAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfQUdFTlRDQVA6CiAgICAgICAgICAgIGNwID0gIiBBR0VOVC1DQVBBQklMSVRJRVMiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTU9ESUQ6CiAgICAgICAgICAgIGNwID0gIiBNT0RVTEUtSURFTlRJVFkiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfT0JKSURFTlRJVFk6CiAgICAgICAgICAgIGNwID0gIiBPQkpFQ1QtSURFTlRJVFkiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTU9EQ09NUDoKICAgICAgICAgICAgY3AgPSAiIE1PRFVMRS1DT01QTElBTkNFIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgc3ByaW50Zih0bXBidWYsICIgdHlwZV8lZCIsIHRwLT50eXBlKTsKICAgICAgICAgICAgY3AgPSB0bXBidWY7CiAgICAgICAgfQoKICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdHAtPmxhYmVsKSB8fAogICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCkgfHwKICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuIikpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmICghcHJpbnRfdHJlZV9ub2RlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdHAsIHdpZHRoKSkKICAgICAgICByZXR1cm4gMDsKICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIjo6PSB7IikpCiAgICAgICAgcmV0dXJuIDA7CiAgICBwb3MgPSA1OwogICAgd2hpbGUgKG9iamlkbGVuID4gMSkgewogICAgICAgIGZvciAoOyBzdWJ0cmVlOyBzdWJ0cmVlID0gc3VidHJlZS0+bmV4dF9wZWVyKSB7CiAgICAgICAgICAgIGlmICgqb2JqaWQgPT0gc3VidHJlZS0+c3ViaWQpIHsKICAgICAgICAgICAgICAgIHdoaWxlIChzdWJ0cmVlLT5uZXh0X3BlZXIgJiYgc3VidHJlZS0+bmV4dF9wZWVyLT5zdWJpZCA9PSAqb2JqaWQpCiAgICAgICAgICAgICAgICAgICAgc3VidHJlZSA9IHN1YnRyZWUtPm5leHRfcGVlcjsKICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKHN1YnRyZWUtPmxhYmVsLCBBTk9OLCBBTk9OX0xFTikpIHsKICAgICAgICAgICAgICAgICAgICBzbnByaW50Zih0bXBidWYsIHNpemVvZih0bXBidWYpLCAiICVzKCVsdSkiLCBzdWJ0cmVlLT5sYWJlbCwgc3VidHJlZS0+c3ViaWQpOwogICAgICAgICAgICAgICAgICAgIHRtcGJ1Zlsgc2l6ZW9mKHRtcGJ1ZiktMSBdID0gMDsKICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgIHNwcmludGYodG1wYnVmLCAiICVsdSIsIHN1YnRyZWUtPnN1YmlkKTsKICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbih0bXBidWYpOwogICAgICAgICAgICAgICAgaWYgKHBvcyArIGxlbiArIDIgPiB3aWR0aCkgewogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICJcbiAgICAgIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIHBvcyA9IDU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRtcGJ1ZikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuOwogICAgICAgICAgICAgICAgb2JqaWQrKzsKICAgICAgICAgICAgICAgIG9iamlkbGVuLS07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc3VidHJlZSkKICAgICAgICAgICAgc3VidHJlZSA9IHN1YnRyZWUtPmNoaWxkX2xpc3Q7CiAgICAgICAgZWxzZQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIHdoaWxlIChvYmppZGxlbiA+IDEpIHsKICAgICAgICBzcHJpbnRmKHRtcGJ1ZiwgIiAlIiBORVRTTk1QX1BSSW8gInUiLCAqb2JqaWQpOwogICAgICAgIGxlbiA9IHN0cmxlbih0bXBidWYpOwogICAgICAgIGlmIChwb3MgKyBsZW4gKyAyID4gd2lkdGgpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4gICAgICIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIHBvcyA9IDU7CiAgICAgICAgfQogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdG1wYnVmKSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgcG9zICs9IGxlbjsKICAgICAgICBvYmppZCsrOwogICAgICAgIG9iamlkbGVuLS07CiAgICB9CiAgICBzcHJpbnRmKHRtcGJ1ZiwgIiAlIiBORVRTTk1QX1BSSW8gInUgfSIsICpvYmppZCk7CiAgICBsZW4gPSBzdHJsZW4odG1wYnVmKTsKICAgIGlmIChwb3MgKyBsZW4gKyAyID4gd2lkdGgpIHsKICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcbiAgICAgIikpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHBvcyA9IDU7CiAgICB9CiAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRtcGJ1ZikpCiAgICAgICAgcmV0dXJuIDA7CiAgICByZXR1cm4gMTsKfQoKc3RhdGljIGludApwcmludF90cmVlX25vZGUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmVlICp0cCwgaW50IHdpZHRoKQp7CiAgICBjb25zdCBjaGFyICAgICAqY3A7CiAgICBjaGFyICAgICAgICAgICAgc3RyW01BWFRPS0VOXTsKICAgIGludCAgICAgICAgICAgICBpLCBwcmV2bW9kLCBwb3MsIGxlbjsKCiAgICBpZiAodHApIHsKICAgICAgICBtb2R1bGVfbmFtZSh0cC0+bW9kaWQsIHN0cik7CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiICAtLSBGUk9NXHQiKSB8fAogICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgcG9zID0gMTYrc3RybGVuKHN0cik7CiAgICAgICAgZm9yIChpID0gMSwgcHJldm1vZCA9IHRwLT5tb2RpZDsgaSA8IHRwLT5udW1iZXJfbW9kdWxlczsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwcmV2bW9kICE9IHRwLT5tb2R1bGVfbGlzdFtpXSkgewogICAgICAgICAgICAgICAgbW9kdWxlX25hbWUodHAtPm1vZHVsZV9saXN0W2ldLCBzdHIpOwogICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKHN0cik7CiAgICAgICAgICAgICAgICBpZiAocG9zICsgbGVuICsgMiA+IHdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixcbiAgLS1cdFx0IikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIHBvcyA9IDE2OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiLCAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgcG9zICs9IDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByZXZtb2QgPSB0cC0+bW9kdWxlX2xpc3RbaV07CiAgICAgICAgfQogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuIikpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICh0cC0+dGNfaW5kZXggIT0gLTEpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAtLSBURVhUVUFMIENPTlZFTlRJT04gIikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdGNfZGVzY3JpcHRvcih0cC0+dGNfaW5kZXgpKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAodHAtPnR5cGUpIHsKICAgICAgICBjYXNlIFRZUEVfT0JKSUQ6CiAgICAgICAgICAgIGNwID0gIk9CSkVDVCBJREVOVElGSUVSIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgICAgICAgICBjcCA9ICJPQ1RFVCBTVFJJTkciOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjoKICAgICAgICAgICAgY3AgPSAiSU5URUdFUiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9ORVRBRERSOgogICAgICAgICAgICBjcCA9ICJOZXR3b3JrQWRkcmVzcyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9JUEFERFI6CiAgICAgICAgICAgIGNwID0gIklwQWRkcmVzcyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9DT1VOVEVSOgogICAgICAgICAgICBjcCA9ICJDb3VudGVyMzIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfR0FVR0U6CiAgICAgICAgICAgIGNwID0gIkdhdWdlMzIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfVElNRVRJQ0tTOgogICAgICAgICAgICBjcCA9ICJUaW1lVGlja3MiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfT1BBUVVFOgogICAgICAgICAgICBjcCA9ICJPcGFxdWUiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTlVMTDoKICAgICAgICAgICAgY3AgPSAiTlVMTCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9DT1VOVEVSNjQ6CiAgICAgICAgICAgIGNwID0gIkNvdW50ZXI2NCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9CSVRTVFJJTkc6CiAgICAgICAgICAgIGNwID0gIkJJVFMiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTlNBUEFERFJFU1M6CiAgICAgICAgICAgIGNwID0gIk5zYXBBZGRyZXNzIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX1VJTlRFR0VSOgogICAgICAgICAgICBjcCA9ICJVSW50ZWdlcjMyIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX1VOU0lHTkVEMzI6CiAgICAgICAgICAgIGNwID0gIlVuc2lnbmVkMzIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjMyOgogICAgICAgICAgICBjcCA9ICJJbnRlZ2VyMzIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjcCA9IE5VTEw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KI2lmIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERQogICAgICAgIGlmICghY3AgJiYgKHRwLT5yYW5nZXMgfHwgdHAtPmVudW1zKSkgeyAvKiByYW5nZXMgd2l0aG91dCB0eXBlID8gKi8KICAgICAgICAgICAgc3ByaW50ZihzdHIsICI/MCB3aXRoICVzICVzID8iLAogICAgICAgICAgICAgICAgICAgIHRwLT5yYW5nZXMgPyAiUmFuZ2UiIDogIiIsIHRwLT5lbnVtcyA/ICJFbnVtIiA6ICIiKTsKICAgICAgICAgICAgY3AgPSBzdHI7CiAgICAgICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERSAqLwogICAgICAgIGlmIChjcCkKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFNZTlRBWFx0IikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCkpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAodHAtPnJhbmdlcykgewogICAgICAgICAgICBzdHJ1Y3QgcmFuZ2VfbGlzdCAqcnAgPSB0cC0+cmFuZ2VzOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgZmlyc3QgPSAxOwogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgKCIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIHdoaWxlIChycCkgewogICAgICAgICAgICAgICAgc3dpdGNoICh0cC0+dHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSBUWVBFX0lOVEVHRVI6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjMyOgogICAgICAgICAgICAgICAgICAgIGlmIChycC0+bG93ID09IHJwLT5oaWdoKQogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVzJWQiLCAoZmlyc3QgPyAiIiA6ICIgfCAiKSwgcnAtPmxvdyApOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlcyVkLi4lZCIsIChmaXJzdCA/ICIiIDogIiB8ICIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwLT5sb3csIHJwLT5oaWdoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9VTlNJR05FRDMyOgogICAgICAgICAgICAgICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgICAgICAgICAgICAgY2FzZSBUWVBFX0dBVUdFOgogICAgICAgICAgICAgICAgY2FzZSBUWVBFX1VJTlRFR0VSOgogICAgICAgICAgICAgICAgICAgIGlmIChycC0+bG93ID09IHJwLT5oaWdoKQogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVzJXUiLCAoZmlyc3QgPyAiIiA6ICIgfCAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcnAtPmxvdyApOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlcyV1Li4ldSIsIChmaXJzdCA/ICIiIDogIiB8ICIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClycC0+bG93LCAodW5zaWduZWQpcnAtPmhpZ2gpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAvKiBObyBvdGhlciByYW5nZSB0eXBlcyBhbGxvd2VkICovCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSAwOwogICAgICAgICAgICAgICAgcnAgPSBycC0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIpICIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICh0cC0+ZW51bXMpIHsKICAgICAgICAgICAgc3RydWN0IGVudW1fbGlzdCAqZXAgPSB0cC0+ZW51bXM7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBmaXJzdCA9IDE7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiB7IikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgcG9zID0gMTYgKyBzdHJsZW4oY3ApICsgMjsKICAgICAgICAgICAgd2hpbGUgKGVwKSB7CiAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSAwOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiwgIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSwgIiVzKCVkKSIsIGVwLT5sYWJlbCwgZXAtPnZhbHVlKTsKICAgICAgICAgICAgICAgIHN0clsgc2l6ZW9mKHN0ciktMSBdID0gMDsKICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbihzdHIpOwogICAgICAgICAgICAgICAgaWYgKHBvcyArIGxlbiArIDIgPiB3aWR0aCkgewogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICJcblx0XHQgICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICBwb3MgPSAxODsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHBvcyArPSBsZW4gKyAyOwogICAgICAgICAgICAgICAgZXAgPSBlcC0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJ9ICIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmIChjcCkKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICh0cC0+aGludCkKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIERJU1BMQVktSElOVFx0XCIiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRwLT5oaW50KSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIlxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAodHAtPnVuaXRzKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgVU5JVFNcdFx0XCIiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRwLT51bml0cykgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXCJcbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgc3dpdGNoICh0cC0+YWNjZXNzKSB7CiAgICAgICAgY2FzZSBNSUJfQUNDRVNTX1JFQURPTkxZOgogICAgICAgICAgICBjcCA9ICJyZWFkLW9ubHkiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfUkVBRFdSSVRFOgogICAgICAgICAgICBjcCA9ICJyZWFkLXdyaXRlIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQUNDRVNTX1dSSVRFT05MWToKICAgICAgICAgICAgY3AgPSAid3JpdGUtb25seSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19OT0FDQ0VTUzoKICAgICAgICAgICAgY3AgPSAibm90LWFjY2Vzc2libGUiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfTk9USUZZOgogICAgICAgICAgICBjcCA9ICJhY2Nlc3NpYmxlLWZvci1ub3RpZnkiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfQ1JFQVRFOgogICAgICAgICAgICBjcCA9ICJyZWFkLWNyZWF0ZSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgY3AgPSBOVUxMOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBzcHJpbnRmKHN0ciwgImFjY2Vzc18lZCIsIHRwLT5hY2Nlc3MpOwogICAgICAgICAgICBjcCA9IHN0cjsKICAgICAgICB9CiAgICAgICAgaWYgKGNwKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgTUFYLUFDQ0VTU1x0IikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCkgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHN3aXRjaCAodHAtPnN0YXR1cykgewogICAgICAgIGNhc2UgTUlCX1NUQVRVU19NQU5EQVRPUlk6CiAgICAgICAgICAgIGNwID0gIm1hbmRhdG9yeSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX1NUQVRVU19PUFRJT05BTDoKICAgICAgICAgICAgY3AgPSAib3B0aW9uYWwiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9TVEFUVVNfT0JTT0xFVEU6CiAgICAgICAgICAgIGNwID0gIm9ic29sZXRlIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfU1RBVFVTX0RFUFJFQ0FURUQ6CiAgICAgICAgICAgIGNwID0gImRlcHJlY2F0ZWQiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9TVEFUVVNfQ1VSUkVOVDoKICAgICAgICAgICAgY3AgPSAiY3VycmVudCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgY3AgPSBOVUxMOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBzcHJpbnRmKHN0ciwgInN0YXR1c18lZCIsIHRwLT5zdGF0dXMpOwogICAgICAgICAgICBjcCA9IHN0cjsKICAgICAgICB9CiNpZiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUKICAgICAgICBpZiAoIWNwICYmICh0cC0+aW5kZXhlcykpIHsgICAgIC8qIGluZGV4IHdpdGhvdXQgc3RhdHVzID8gKi8KICAgICAgICAgICAgc3ByaW50ZihzdHIsICI/MCB3aXRoICVzID8iLCB0cC0+aW5kZXhlcyA/ICJJbmRleCIgOiAiIik7CiAgICAgICAgICAgIGNwID0gc3RyOwogICAgICAgIH0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUgKi8KICAgICAgICBpZiAoY3ApCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBTVEFUVVNcdCIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgY3ApIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAodHAtPmF1Z21lbnRzKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQVVHTUVOVFNcdHsgIikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0cC0+YXVnbWVudHMpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiB9XG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICh0cC0+aW5kZXhlcykgewogICAgICAgICAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqaXAgPSB0cC0+aW5kZXhlczsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZpcnN0ID0gMTsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIElOREVYXHRcdHsgIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgcG9zID0gMTYgKyAyOwogICAgICAgICAgICB3aGlsZSAoaXApIHsKICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IDA7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiLCAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiJXMlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlwLT5pc2ltcGxpZWQgPyAiSU1QTElFRCAiIDogIiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlwLT5pbGFiZWwpOwogICAgICAgICAgICAgICAgc3RyWyBzaXplb2Yoc3RyKS0xIF0gPSAwOwogICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKHN0cik7CiAgICAgICAgICAgICAgICBpZiAocG9zICsgbGVuICsgMiA+IHdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG5cdFx0ICAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgcG9zID0gMTYgKyAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgcG9zICs9IGxlbiArIDI7CiAgICAgICAgICAgICAgICBpcCA9IGlwLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiB9XG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAodHAtPnZhcmJpbmRzKSB7CiAgICAgICAgICAgIHN0cnVjdCB2YXJiaW5kX2xpc3QgKnZwID0gdHAtPnZhcmJpbmRzOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgZmlyc3QgPSAxOwoKICAgICAgICAgICAgaWYgKHRwLT50eXBlID09IFRZUEVfVFJBUFRZUEUpIHsKICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAiICBWQVJJQUJMRVNcdHsgIikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIiAgT0JKRUNUU1x0eyAiKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBwb3MgPSAxNiArIDI7CiAgICAgICAgICAgIHdoaWxlICh2cCkgewogICAgICAgICAgICAgICAgaWYgKGZpcnN0KQogICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gMDsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIsICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHN0cmxjcHkoc3RyLCB2cC0+dmJsYWJlbCwgc2l6ZW9mKHN0cikpOwogICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKHN0cik7CiAgICAgICAgICAgICAgICBpZiAocG9zICsgbGVuICsgMiA+IHdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5cdFx0ICAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgcG9zID0gMTYgKyAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgcG9zICs9IGxlbiArIDI7CiAgICAgICAgICAgICAgICB2cCA9IHZwLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiB9XG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAodHAtPmRlc2NyaXB0aW9uKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIERFU0NSSVBUSU9OXHRcIiIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdHAtPmRlc2NyaXB0aW9uKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIlxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAodHAtPmRlZmF1bHRWYWx1ZSkKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBERUZWQUxcdHsgIikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0cC0+ZGVmYXVsdFZhbHVlKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgfVxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgIH0gZWxzZQogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIk5vIGRlc2NyaXB0aW9uXG4iKSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICByZXR1cm4gMTsKfQoKaW50CmdldF9tb2R1bGVfbm9kZShjb25zdCBjaGFyICpmbmFtZSwKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vZHVsZSwgb2lkICogb2JqaWQsIHNpemVfdCAqIG9iamlkbGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgbW9kaWQsIHJjID0gMDsKICAgIHN0cnVjdCB0cmVlICAgICp0cDsKICAgIGNoYXIgICAgICAgICAgICpuYW1lLCAqY3A7CgogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAiQU5ZIikpCiAgICAgICAgbW9kaWQgPSAtMTsKICAgIGVsc2UgewogICAgICAgIG5ldHNubXBfcmVhZF9tb2R1bGUobW9kdWxlKTsKICAgICAgICBtb2RpZCA9IHdoaWNoX21vZHVsZShtb2R1bGUpOwogICAgICAgIGlmIChtb2RpZCA9PSAtMSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyoKICAgICAqIElzb2xhdGUgdGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgbmFtZSAuLi4gCiAgICAgKi8KICAgIG5hbWUgPSBzdHJkdXAoZm5hbWUpOwogICAgY3AgPSBzdHJjaHIobmFtZSwgJy4nKTsKICAgIGlmIChjcCAhPSBOVUxMKSB7CiAgICAgICAgKmNwID0gJ1wwJzsKICAgICAgICBjcCsrOwogICAgfQogICAgLyoKICAgICAqIC4uLiBhbmQgbG9jYXRlIGl0IGluIHRoZSB0cmVlLiAKICAgICAqLwogICAgdHAgPSBmaW5kX3RyZWVfbm9kZShuYW1lLCBtb2RpZCk7CiAgICBpZiAodHApIHsKICAgICAgICBzaXplX3QgICAgICAgICAgbWF4bGVuID0gKm9iamlkbGVuOwoKICAgICAgICAvKgogICAgICAgICAqIFNldCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgb2JqZWN0IElEIAogICAgICAgICAqLwogICAgICAgIGlmIChub2RlX3RvX29pZCh0cCwgb2JqaWQsIG9iamlkbGVuKSkgewogICAgICAgICAgICByYyA9IDE7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBJZiB0aGUgbmFtZSByZXF1ZXN0ZWQgd2FzIG1vcmUgdGhhbiBvbmUgZWxlbWVudCwKICAgICAgICAgICAgICogdGFnIG9uIHRoZSByZXN0IG9mIHRoZSBjb21wb25lbnRzIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKGNwICE9IE5VTEwpCiAgICAgICAgICAgICAgICByYyA9IF9hZGRfc3RyaW5nc190b19vaWQodHAsIGNwLCBvYmppZCwgb2JqaWRsZW4sIG1heGxlbik7CiAgICAgICAgfQogICAgfQoKICAgIFNOTVBfRlJFRShuYW1lKTsKICAgIHJldHVybiAocmMpOwp9CgoKLyoqCiAqIEBpbnRlcm5hbAogKgogKiBQb3B1bGF0ZXMgdGhlIG9iamVjdCBpZGVudGlmaWVyIGZyb20gYSBub2RlIGluIHRoZSBNSUIgaGllcmFyY2h5LgogKiBCdWlsZHMgdXAgdGhlIG9iamVjdCBJRCwgd29ya2luZyBiYWNrd2FyZHMsCiAqIHN0YXJ0aW5nIGZyb20gdGhlIGVuZCBvZiB0aGUgb2JqaWQgYnVmZmVyLgogKiBXaGVuIHRoZSB0b3Agb2YgdGhlIE1JQiB0cmVlIGlzIHJlYWNoZWQsIHRoZSBidWZmZXIgaXMgYWRqdXN0ZWQuCiAqCiAqIFRoZSBidWZmZXIgbGVuZ3RoIGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIHN1YmlkZW50aWZpZXJzCiAqIGZvciB0aGUgb2JqZWN0IGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBNSUIgbm9kZS4KICogCiAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBzdWJpZGVudGlmaWVycyBjb3BpZWQuCiAqCiAqIElmIDAgaXMgcmV0dXJuZWQsIHRoZSBvYmppZCBidWZmZXIgaXMgdG9vIHNtYWxsLAogKiBhbmQgdGhlIGJ1ZmZlciBjb250ZW50cyBhcmUgaW5kZXRlcm1pbmF0ZS4KICogVGhlIGJ1ZmZlciBsZW5ndGggY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgbGFyZ2VyIGJ1ZmZlci4KICovCnN0YXRpYyBpbnQKbm9kZV90b19vaWQoc3RydWN0IHRyZWUgKnRwLCBvaWQgKiBvYmppZCwgc2l6ZV90ICogb2JqaWRsZW4pCnsKICAgIGludCAgICAgICAgICAgICBudW1pZHMsIGxlbmlkczsKICAgIG9pZCAgICAgICAgICAgICpvcDsKCiAgICBpZiAoIXRwIHx8ICFvYmppZCB8fCAhb2JqaWRsZW4pCiAgICAgICAgcmV0dXJuIDA7CgogICAgbGVuaWRzID0gKGludCkgKm9iamlkbGVuOwogICAgb3AgPSBvYmppZCArIGxlbmlkczsgICAgICAgIC8qIHBvaW50cyBhZnRlciB0aGUgbGFzdCBlbGVtZW50ICovCgogICAgZm9yIChudW1pZHMgPSAwOyB0cDsgdHAgPSB0cC0+cGFyZW50LCBudW1pZHMrKykgewogICAgICAgIGlmIChudW1pZHMgPj0gbGVuaWRzKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAtLW9wOwogICAgICAgICpvcCA9IHRwLT5zdWJpZDsKICAgIH0KCiAgICAqb2JqaWRsZW4gPSAoc2l6ZV90KSBudW1pZHM7CiAgICBpZiAobnVtaWRzID4gbGVuaWRzKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKG51bWlkcyA8IGxlbmlkcykKICAgICAgICBtZW1tb3ZlKG9iamlkLCBvcCwgbnVtaWRzICogc2l6ZW9mKG9pZCkpOwoKICAgIHJldHVybiAobnVtaWRzKTsKfQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgovKgogKiBSZXBsYWNlIFx4IHdpdGggeCBzdG9wIGF0IGVvc19tYXJrZXIKICogcmV0dXJuIE5VTEwgaWYgZW9zX21hcmtlciBub3QgZm91bmQKICovCnN0YXRpYyBjaGFyICpfYXBwbHlfZXNjYXBlcyhjaGFyICpzcmMsIGNoYXIgZW9zX21hcmtlcikKewogICAgY2hhciAqZHN0OwogICAgaW50IGJhY2tzbGFzaCA9IDA7CiAgICAKICAgIGRzdCA9IHNyYzsKICAgIHdoaWxlICgqc3JjKSB7CglpZiAoYmFja3NsYXNoKSB7CgkgICAgYmFja3NsYXNoID0gMDsKCSAgICAqZHN0KysgPSAqc3JjOwoJfSBlbHNlIHsKCSAgICBpZiAoZW9zX21hcmtlciA9PSAqc3JjKSBicmVhazsKCSAgICBpZiAoJ1xcJyA9PSAqc3JjKSB7CgkJYmFja3NsYXNoID0gMTsKCSAgICB9IGVsc2UgewoJCSpkc3QrKyA9ICpzcmM7CgkgICAgfQoJfQoJc3JjKys7CiAgICB9CiAgICBpZiAoISpzcmMpIHsKCS8qIG5ldmVyIGZvdW5kIGVvc19tYXJrZXIgKi8KCXJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKCSpkc3QgPSAwOwoJcmV0dXJuIHNyYzsKICAgIH0KfQoKc3RhdGljIGludAojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwpfYWRkX3N0cmluZ3NfdG9fb2lkKHN0cnVjdCB0cmVlICp0cCwgY2hhciAqY3AsCiAgICAgICAgICAgICAgICAgICAgb2lkICogb2JqaWQsIHNpemVfdCAqIG9iamlkbGVuLCBzaXplX3QgbWF4bGVuKQojZWxzZQpfYWRkX3N0cmluZ3NfdG9fb2lkKHZvaWQgKnRwLCBjaGFyICpjcCwKICAgICAgICAgICAgICAgICAgICBvaWQgKiBvYmppZCwgc2l6ZV90ICogb2JqaWRsZW4sIHNpemVfdCBtYXhsZW4pCiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KewogICAgb2lkICAgICAgICAgICAgIHN1YmlkOwogICAgaW50ICAgICAgICAgICAgIGxlbl9pbmRleCA9IDEwMDAwMDA7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICBzdHJ1Y3QgdHJlZSAgICAqdHAyID0gTlVMTDsKICAgIHN0cnVjdCBpbmRleF9saXN0ICppbl9kaWNlcyA9IE5VTEw7CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgIGNoYXIgICAgICAgICAgICpmY3AsICplY3AsICpjcDIgPSBOVUxMOwogICAgY2hhciAgICAgICAgICAgIGRvaW5ncXVvdGU7CiAgICBpbnQgICAgICAgICAgICAgbGVuID0gLTEsIHBvcyA9IC0xOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgaW50ICAgICAgICAgICAgIGNoZWNrID0KICAgICAgICAhbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0RPTlRfQ0hFQ0tfUkFOR0UpOwogICAgaW50ICAgICAgICAgICAgIGRvX2hpbnQgPSAhbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX05PX0RJU1BMQVlfSElOVCk7CgogICAgd2hpbGUgKGNwICYmIHRwICYmIHRwLT5jaGlsZF9saXN0KSB7CiAgICAgICAgZmNwID0gY3A7CiAgICAgICAgdHAyID0gdHAtPmNoaWxkX2xpc3Q7CiAgICAgICAgLyoKICAgICAgICAgKiBJc29sYXRlIHRoZSBuZXh0IGVudHJ5IAogICAgICAgICAqLwogICAgICAgIGNwMiA9IHN0cmNocihjcCwgJy4nKTsKICAgICAgICBpZiAoY3AyKQogICAgICAgICAgICAqY3AyKysgPSAnXDAnOwoKICAgICAgICAvKgogICAgICAgICAqIFNlYXJjaCBmb3IgdGhlIGFwcHJvcHJpYXRlIGNoaWxkIAogICAgICAgICAqLwogICAgICAgIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSgqY3ApKSkgewogICAgICAgICAgICBzdWJpZCA9IHN0cnRvdWwoY3AsICZlY3AsIDApOwogICAgICAgICAgICBpZiAoKmVjcCkKICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICB3aGlsZSAodHAyICYmIHRwMi0+c3ViaWQgIT0gc3ViaWQpCiAgICAgICAgICAgICAgICB0cDIgPSB0cDItPm5leHRfcGVlcjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aGlsZSAodHAyICYmIHN0cmNtcCh0cDItPmxhYmVsLCBmY3ApKQogICAgICAgICAgICAgICAgdHAyID0gdHAyLT5uZXh0X3BlZXI7CiAgICAgICAgICAgIGlmICghdHAyKQogICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIHN1YmlkID0gdHAyLT5zdWJpZDsKICAgICAgICB9CiAgICAgICAgaWYgKCpvYmppZGxlbiA+PSBtYXhsZW4pCiAgICAgICAgICAgIGdvdG8gYmFkX2lkOwoJd2hpbGUgKHRwMiAmJiB0cDItPm5leHRfcGVlciAmJiB0cDItPm5leHRfcGVlci0+c3ViaWQgPT0gc3ViaWQpCgkgICAgdHAyID0gdHAyLT5uZXh0X3BlZXI7CiAgICAgICAgb2JqaWRbKm9iamlkbGVuXSA9IHN1YmlkOwogICAgICAgICgqb2JqaWRsZW4pKys7CgogICAgICAgIGNwID0gY3AyOwogICAgICAgIGlmICghdHAyKQogICAgICAgICAgICBicmVhazsKICAgICAgICB0cCA9IHRwMjsKICAgIH0KCiAgICBpZiAodHAgJiYgIXRwLT5jaGlsZF9saXN0KSB7CiAgICAgICAgaWYgKCh0cDIgPSB0cC0+cGFyZW50KSkgewogICAgICAgICAgICBpZiAodHAyLT5pbmRleGVzKQogICAgICAgICAgICAgICAgaW5fZGljZXMgPSB0cDItPmluZGV4ZXM7CiAgICAgICAgICAgIGVsc2UgaWYgKHRwMi0+YXVnbWVudHMpIHsKICAgICAgICAgICAgICAgIHRwMiA9IGZpbmRfdHJlZV9ub2RlKHRwMi0+YXVnbWVudHMsIC0xKTsKICAgICAgICAgICAgICAgIGlmICh0cDIpCiAgICAgICAgICAgICAgICAgICAgaW5fZGljZXMgPSB0cDItPmluZGV4ZXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHAgPSBOVUxMOwogICAgfQoKICAgIHdoaWxlIChjcCAmJiBpbl9kaWNlcykgewogICAgICAgIGZjcCA9IGNwOwoKICAgICAgICB0cCA9IGZpbmRfdHJlZV9ub2RlKGluX2RpY2VzLT5pbGFiZWwsIC0xKTsKICAgICAgICBpZiAoIXRwKQogICAgICAgICAgICBicmVhazsKICAgICAgICBzd2l0Y2ggKHRwLT50eXBlKSB7CiAgICAgICAgY2FzZSBUWVBFX0lOVEVHRVI6CiAgICAgICAgY2FzZSBUWVBFX0lOVEVHRVIzMjoKICAgICAgICBjYXNlIFRZUEVfVUlOVEVHRVI6CiAgICAgICAgY2FzZSBUWVBFX1VOU0lHTkVEMzI6CiAgICAgICAgY2FzZSBUWVBFX1RJTUVUSUNLUzoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogSXNvbGF0ZSB0aGUgbmV4dCBlbnRyeSAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNwMiA9IHN0cmNocihjcCwgJy4nKTsKICAgICAgICAgICAgaWYgKGNwMikKICAgICAgICAgICAgICAgICpjcDIrKyA9ICdcMCc7CiAgICAgICAgICAgIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSgqY3ApKSkgewogICAgICAgICAgICAgICAgc3ViaWQgPSBzdHJ0b3VsKGNwLCAmZWNwLCAwKTsKICAgICAgICAgICAgICAgIGlmICgqZWNwKQogICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKHRwLT5lbnVtcykgewogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBlbnVtX2xpc3QgKmVwID0gdHAtPmVudW1zOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChlcCAmJiBzdHJjbXAoZXAtPmxhYmVsLCBjcCkpCiAgICAgICAgICAgICAgICAgICAgICAgIGVwID0gZXAtPm5leHQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFlcCkKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICAgICAgc3ViaWQgPSBlcC0+dmFsdWU7CiAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hlY2sgJiYgdHAtPnJhbmdlcykgewogICAgICAgICAgICAgICAgc3RydWN0IHJhbmdlX2xpc3QgKnJwID0gdHAtPnJhbmdlczsKICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBvayA9IDA7CiAgICAgICAgICAgICAgICBpZiAodHAtPnR5cGUgPT0gVFlQRV9JTlRFR0VSIHx8CiAgICAgICAgICAgICAgICAgICAgdHAtPnR5cGUgPT0gVFlQRV9JTlRFR0VSMzIpIHsKICAgICAgICAgICAgICAgICAgd2hpbGUgKCFvayAmJiBycCkgewogICAgICAgICAgICAgICAgICAgIGlmICgocnAtPmxvdyA8PSAoaW50KSBzdWJpZCkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChpbnQpIHN1YmlkIDw9IHJwLT5oaWdoKSkKICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSAxOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcnAgPSBycC0+bmV4dDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsgLyogY2hlY2sgdW5zaWduZWQgcmFuZ2UgKi8KICAgICAgICAgICAgICAgICAgd2hpbGUgKCFvayAmJiBycCkgewogICAgICAgICAgICAgICAgICAgIGlmICgoKHVuc2lnbmVkIGludClycC0+bG93IDw9IHN1YmlkKQogICAgICAgICAgICAgICAgICAgICAgICAmJiAoc3ViaWQgPD0gKHVuc2lnbmVkIGludClycC0+aGlnaCkpCiAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gMTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJwID0gcnAtPm5leHQ7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghb2spCiAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCpvYmppZGxlbiA+PSBtYXhsZW4pCiAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgb2JqaWRbKm9iamlkbGVuXSA9IHN1YmlkOwogICAgICAgICAgICAoKm9iamlkbGVuKSsrOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfSVBBRERSOgogICAgICAgICAgICBpZiAoKm9iamlkbGVuICsgNCA+IG1heGxlbikKICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICBmb3IgKHN1YmlkID0gMDsgY3AgJiYgc3ViaWQgPCA0OyBzdWJpZCsrKSB7CiAgICAgICAgICAgICAgICBmY3AgPSBjcDsKICAgICAgICAgICAgICAgIGNwMiA9IHN0cmNocihjcCwgJy4nKTsKICAgICAgICAgICAgICAgIGlmIChjcDIpCiAgICAgICAgICAgICAgICAgICAgKmNwMisrID0gMDsKICAgICAgICAgICAgICAgIG9iamlkWypvYmppZGxlbl0gPSBzdHJ0b3VsKGNwLCAmZWNwLCAwKTsKICAgICAgICAgICAgICAgIGlmICgqZWNwKQogICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgaWYgKGNoZWNrICYmIG9iamlkWypvYmppZGxlbl0gPiAyNTUpCiAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICAoKm9iamlkbGVuKSsrOwogICAgICAgICAgICAgICAgY3AgPSBjcDI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgICAgICAgICBpZiAodHAtPnJhbmdlcyAmJiAhdHAtPnJhbmdlcy0+bmV4dAogICAgICAgICAgICAgICAgJiYgdHAtPnJhbmdlcy0+bG93ID09IHRwLT5yYW5nZXMtPmhpZ2gpCiAgICAgICAgICAgICAgICBsZW4gPSB0cC0+cmFuZ2VzLT5sb3c7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGxlbiA9IC0xOwogICAgICAgICAgICBwb3MgPSAwOwogICAgICAgICAgICBpZiAoKmNwID09ICciJyB8fCAqY3AgPT0gJ1wnJykgewogICAgICAgICAgICAgICAgZG9pbmdxdW90ZSA9ICpjcCsrOwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGluc2VydCBsZW5ndGggaWYgcmVxdWVzdGVkIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAoIWluX2RpY2VzLT5pc2ltcGxpZWQgJiYgbGVuID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRvaW5ncXVvdGUgPT0gJ1wnJykgewogICAgICAgICAgICAgICAgICAgICAgICBzbm1wX3NldF9kZXRhaWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiJy1xdW90ZSBpcyBmb3IgZml4ZWQgbGVuZ3RoIHN0cmluZ3MiKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgqb2JqaWRsZW4gPj0gbWF4bGVuKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgICAgICBsZW5faW5kZXggPSAqb2JqaWRsZW47CiAgICAgICAgICAgICAgICAgICAgKCpvYmppZGxlbikrKzsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9pbmdxdW90ZSA9PSAnIicpIHsKICAgICAgICAgICAgICAgICAgICBzbm1wX3NldF9kZXRhaWwKICAgICAgICAgICAgICAgICAgICAgICAgKCJcIi1xdW90ZSBpcyBmb3IgdmFyaWFibGUgbGVuZ3RoIHN0cmluZ3MiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KCgkJY3AyID0gX2FwcGx5X2VzY2FwZXMoY3AsIGRvaW5ncXVvdGUpOwoJCWlmICghY3AyKSBnb3RvIGJhZF9pZDsKCQllbHNlIHsKCQkgICAgdW5zaWduZWQgY2hhciAqbmV3X3ZhbDsKCQkgICAgaW50IG5ld192YWxfbGVuOwoJCSAgICBpbnQgcGFyc2VkX2hpbnQgPSAwOwoJCSAgICBjb25zdCBjaGFyICpwYXJzZWRfdmFsdWU7CgoJCSAgICBpZiAoZG9faGludCAmJiB0cC0+aGludCkgewoJCQlwYXJzZWRfdmFsdWUgPSBwYXJzZV9vY3RldF9oaW50KHRwLT5oaW50LCBjcCwKCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3X3ZhbCwgJm5ld192YWxfbGVuKTsKCQkJcGFyc2VkX2hpbnQgPSBwYXJzZWRfdmFsdWUgPT0gTlVMTDsKCQkgICAgfQoJCSAgICBpZiAocGFyc2VkX2hpbnQpIHsKCQkJaW50IGk7CgkJCWZvciAoaSA9IDA7IGkgPCBuZXdfdmFsX2xlbjsgaSsrKSB7CgkJCSAgICBpZiAoKm9iamlkbGVuID49IG1heGxlbikgZ290byBiYWRfaWQ7CgkJCSAgICBvYmppZFsgKm9iamlkbGVuIF0gPSBuZXdfdmFsW2ldOwoJCQkgICAgKCpvYmppZGxlbikrKzsKCQkJICAgIHBvcysrOwoJCQl9CgkJCVNOTVBfRlJFRShuZXdfdmFsKTsKCQkgICAgfSBlbHNlIHsKCQkJd2hpbGUoKmNwKSB7CgkJCSAgICBpZiAoKm9iamlkbGVuID49IG1heGxlbikgZ290byBiYWRfaWQ7CgkJCSAgICBvYmppZFsgKm9iamlkbGVuIF0gPSAqY3ArKzsKCQkJICAgICgqb2JqaWRsZW4pKys7CgkJCSAgICBwb3MrKzsKCQkJfQoJCSAgICB9CgkJfQoJCQoJCWNwMisrOwogICAgICAgICAgICAgICAgaWYgKCEqY3AyKQogICAgICAgICAgICAgICAgICAgIGNwMiA9IE5VTEw7CiAgICAgICAgICAgICAgICBlbHNlIGlmICgqY3AyICE9ICcuJykKICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBjcDIrKzsKCQlpZiAoY2hlY2spIHsKICAgICAgICAgICAgICAgICAgICBpZiAobGVuID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYW5nZV9saXN0ICpycCA9IHRwLT5yYW5nZXM7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBvayA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChycCAmJiAhb2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnAtPmxvdyA8PSBwb3MgJiYgcG9zIDw9IHJwLT5oaWdoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycCA9IHJwLT5uZXh0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9rKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5fZGljZXMtPmlzaW1wbGllZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkW2xlbl9pbmRleF0gPSBwb3M7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb3MgIT0gbGVuKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKCQl9CgkJZWxzZSBpZiAobGVuID09IC0xICYmICFpbl9kaWNlcy0+aXNpbXBsaWVkKQoJCSAgICBvYmppZFtsZW5faW5kZXhdID0gcG9zOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCFpbl9kaWNlcy0+aXNpbXBsaWVkICYmIGxlbiA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIGZjcCA9IGNwOwogICAgICAgICAgICAgICAgICAgIGNwMiA9IHN0cmNocihjcCwgJy4nKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY3AyKQogICAgICAgICAgICAgICAgICAgICAgICAqY3AyKysgPSAwOwogICAgICAgICAgICAgICAgICAgIGxlbiA9IHN0cnRvdWwoY3AsICZlY3AsIDApOwogICAgICAgICAgICAgICAgICAgIGlmICgqZWNwKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgICAgICBpZiAoKm9iamlkbGVuICsgbGVuICsgMSA+PSBtYXhsZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgICAgIG9iamlkWypvYmppZGxlbl0gPSBsZW47CiAgICAgICAgICAgICAgICAgICAgKCpvYmppZGxlbikrKzsKICAgICAgICAgICAgICAgICAgICBjcCA9IGNwMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlIChsZW4gJiYgY3ApIHsKICAgICAgICAgICAgICAgICAgICBmY3AgPSBjcDsKICAgICAgICAgICAgICAgICAgICBjcDIgPSBzdHJjaHIoY3AsICcuJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNwMikKICAgICAgICAgICAgICAgICAgICAgICAgKmNwMisrID0gMDsKICAgICAgICAgICAgICAgICAgICBvYmppZFsqb2JqaWRsZW5dID0gc3RydG91bChjcCwgJmVjcCwgMCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCplY3ApCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgICAgIGlmIChjaGVjayAmJiBvYmppZFsqb2JqaWRsZW5dID4gMjU1KQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgICAgICAoKm9iamlkbGVuKSsrOwogICAgICAgICAgICAgICAgICAgIGxlbi0tOwogICAgICAgICAgICAgICAgICAgIGNwID0gY3AyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9PQkpJRDoKICAgICAgICAgICAgaW5fZGljZXMgPSBOVUxMOwogICAgICAgICAgICBjcDIgPSBjcDsKICAgICAgICAgICAgYnJlYWs7CgljYXNlIFRZUEVfTkVUQUREUjoKCSAgICBmY3AgPSBjcDsKCSAgICBjcDIgPSBzdHJjaHIoY3AsICcuJyk7CgkgICAgaWYgKGNwMikKCQkqY3AyKysgPSAwOwoJICAgIHN1YmlkID0gc3RydG91bChjcCwgJmVjcCwgMCk7CgkgICAgaWYgKCplY3ApCgkJZ290byBiYWRfaWQ7CgkgICAgaWYgKCpvYmppZGxlbiArIDEgPj0gbWF4bGVuKQoJCWdvdG8gYmFkX2lkOwoJICAgIG9iamlkWypvYmppZGxlbl0gPSBzdWJpZDsKCSAgICAoKm9iamlkbGVuKSsrOwoJICAgIGNwID0gY3AyOwoJICAgIGlmIChzdWJpZCA9PSAxKSB7CgkJZm9yIChsZW4gPSAwOyBjcCAmJiBsZW4gPCA0OyBsZW4rKykgewoJCSAgICBmY3AgPSBjcDsKCQkgICAgY3AyID0gc3RyY2hyKGNwLCAnLicpOwoJCSAgICBpZiAoY3AyKQoJCQkqY3AyKysgPSAwOwoJCSAgICBzdWJpZCA9IHN0cnRvdWwoY3AsICZlY3AsIDApOwoJCSAgICBpZiAoKmVjcCkKCQkJZ290byBiYWRfaWQ7CgkJICAgIGlmICgqb2JqaWRsZW4gKyAxID49IG1heGxlbikKCQkJZ290byBiYWRfaWQ7CgkJICAgIGlmIChjaGVjayAmJiBzdWJpZCA+IDI1NSkKCQkJZ290byBiYWRfaWQ7CgkJICAgIG9iamlkWypvYmppZGxlbl0gPSBzdWJpZDsKCQkgICAgKCpvYmppZGxlbikrKzsKCQkgICAgY3AgPSBjcDI7CgkJfQoJICAgIH0KCSAgICBlbHNlIHsKCQlpbl9kaWNlcyA9IE5VTEw7CgkgICAgfQoJICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJVbmV4cGVjdGVkIGluZGV4IHR5cGU6ICVkICVzICVzXG4iLAogICAgICAgICAgICAgICAgICAgICB0cC0+dHlwZSwgaW5fZGljZXMtPmlsYWJlbCwgY3ApOwogICAgICAgICAgICBpbl9kaWNlcyA9IE5VTEw7CiAgICAgICAgICAgIGNwMiA9IGNwOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY3AgPSBjcDI7CiAgICAgICAgaWYgKGluX2RpY2VzKQogICAgICAgICAgICBpbl9kaWNlcyA9IGluX2RpY2VzLT5uZXh0OwogICAgfQoKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgd2hpbGUgKGNwKSB7CiAgICAgICAgZmNwID0gY3A7CiAgICAgICAgc3dpdGNoICgqY3ApIHsKICAgICAgICBjYXNlICcwJzoKICAgICAgICBjYXNlICcxJzoKICAgICAgICBjYXNlICcyJzoKICAgICAgICBjYXNlICczJzoKICAgICAgICBjYXNlICc0JzoKICAgICAgICBjYXNlICc1JzoKICAgICAgICBjYXNlICc2JzoKICAgICAgICBjYXNlICc3JzoKICAgICAgICBjYXNlICc4JzoKICAgICAgICBjYXNlICc5JzoKICAgICAgICAgICAgY3AyID0gc3RyY2hyKGNwLCAnLicpOwogICAgICAgICAgICBpZiAoY3AyKQogICAgICAgICAgICAgICAgKmNwMisrID0gMDsKICAgICAgICAgICAgc3ViaWQgPSBzdHJ0b3VsKGNwLCAmZWNwLCAwKTsKICAgICAgICAgICAgaWYgKCplY3ApCiAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgaWYgKCpvYmppZGxlbiA+PSBtYXhsZW4pCiAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgb2JqaWRbKm9iamlkbGVuXSA9IHN1YmlkOwogICAgICAgICAgICAoKm9iamlkbGVuKSsrOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICciJzoKICAgICAgICBjYXNlICdcJyc6CiAgICAgICAgICAgIGRvaW5ncXVvdGUgPSAqY3ArKzsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogaW5zZXJ0IGxlbmd0aCBpZiByZXF1ZXN0ZWQgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoZG9pbmdxdW90ZSA9PSAnIicpIHsKICAgICAgICAgICAgICAgIGlmICgqb2JqaWRsZW4gPj0gbWF4bGVuKQogICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgb2JqaWRbKm9iamlkbGVuXSA9IGxlbiA9IHN0cmNocihjcCwgZG9pbmdxdW90ZSkgLSBjcDsKICAgICAgICAgICAgICAgICgqb2JqaWRsZW4pKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghY3ApCiAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgd2hpbGUgKCpjcCAmJiAqY3AgIT0gZG9pbmdxdW90ZSkgewogICAgICAgICAgICAgICAgaWYgKCpvYmppZGxlbiA+PSBtYXhsZW4pCiAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICBvYmppZFsqb2JqaWRsZW5dID0gKmNwKys7CiAgICAgICAgICAgICAgICAoKm9iamlkbGVuKSsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNwMiA9IGNwICsgMTsKICAgICAgICAgICAgaWYgKCEqY3AyKQogICAgICAgICAgICAgICAgY3AyID0gTlVMTDsKICAgICAgICAgICAgZWxzZSBpZiAoKmNwMiA9PSAnLicpCiAgICAgICAgICAgICAgICBjcDIrKzsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgIH0KICAgICAgICBjcCA9IGNwMjsKICAgIH0KICAgIHJldHVybiAxOwoKICBiYWRfaWQ6CiAgICB7CiAgICAgICAgY2hhciAgICAgICAgICAgIGJ1ZlsyNTZdOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgICAgIGlmIChpbl9kaWNlcykKICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkluZGV4IG91dCBvZiByYW5nZTogJXMgKCVzKSIsCiAgICAgICAgICAgICAgICAgICAgZmNwLCBpbl9kaWNlcy0+aWxhYmVsKTsKICAgICAgICBlbHNlIGlmICh0cCkKICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIlN1Yi1pZCBub3QgZm91bmQ6ICVzIC0+ICVzIiwgdHAtPmxhYmVsLCBmY3ApOwogICAgICAgIGVsc2UKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMiLCBmY3ApOwogICAgICAgIGJ1Zlsgc2l6ZW9mKGJ1ZiktMSBdID0gMDsKCiAgICAgICAgc25tcF9zZXRfZGV0YWlsKGJ1Zik7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCi8qKgogKiBAc2VlIGNvbW1lbnRzIG9uIGZpbmRfYmVzdF90cmVlX25vZGUgZm9yIHVzYWdlIGFmdGVyIGZpcnN0IHRpbWUuCiAqLwppbnQKZ2V0X3dpbGRfbm9kZShjb25zdCBjaGFyICpuYW1lLCBvaWQgKiBvYmppZCwgc2l6ZV90ICogb2JqaWRsZW4pCnsKICAgIHN0cnVjdCB0cmVlICAgICp0cCA9IGZpbmRfYmVzdF90cmVlX25vZGUobmFtZSwgdHJlZV9oZWFkLCBOVUxMKTsKICAgIGlmICghdHApCiAgICAgICAgcmV0dXJuIDA7CiAgICByZXR1cm4gZ2V0X25vZGUodHAtPmxhYmVsLCBvYmppZCwgb2JqaWRsZW4pOwp9CgppbnQKZ2V0X25vZGUoY29uc3QgY2hhciAqbmFtZSwgb2lkICogb2JqaWQsIHNpemVfdCAqIG9iamlkbGVuKQp7CiAgICBjb25zdCBjaGFyICAgICAqY3A7CiAgICBjaGFyICAgICAgICAgICAgY2g7CiAgICBpbnQgICAgICAgICAgICAgcmVzOwoKICAgIGNwID0gbmFtZTsKICAgIHdoaWxlICgoY2ggPSAqY3ApKQogICAgICAgIGlmICgoJzAnIDw9IGNoICYmIGNoIDw9ICc5JykKICAgICAgICAgICAgfHwgKCdhJyA8PSBjaCAmJiBjaCA8PSAneicpCiAgICAgICAgICAgIHx8ICgnQScgPD0gY2ggJiYgY2ggPD0gJ1onKQogICAgICAgICAgICB8fCBjaCA9PSAnLScpCiAgICAgICAgICAgIGNwKys7CiAgICAgICAgZWxzZQogICAgICAgICAgICBicmVhazsKICAgIGlmIChjaCAhPSAnOicpCiAgICAgICAgaWYgKCpuYW1lID09ICcuJykKICAgICAgICAgICAgcmVzID0gZ2V0X21vZHVsZV9ub2RlKG5hbWUgKyAxLCAiQU5ZIiwgb2JqaWQsIG9iamlkbGVuKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJlcyA9IGdldF9tb2R1bGVfbm9kZShuYW1lLCAiQU5ZIiwgb2JqaWQsIG9iamlkbGVuKTsKICAgIGVsc2UgewogICAgICAgIGNoYXIgICAgICAgICAgICptb2R1bGU7CiAgICAgICAgLyoKICAgICAgICAgKiAgcmVxdWVzdGVkIG5hbWUgaXMgb2YgdGhlIGZvcm0KICAgICAgICAgKiAgICAgICJtb2R1bGU6c3ViaWRlbnRpZmllciIKICAgICAgICAgKi8KICAgICAgICBtb2R1bGUgPSAoY2hhciAqKSBtYWxsb2MoKHNpemVfdCkgKGNwIC0gbmFtZSArIDEpKTsKICAgICAgICBpZiAoIW1vZHVsZSkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgIHNwcmludGYobW9kdWxlLCAiJS4qcyIsIChpbnQpIChjcCAtIG5hbWUpLCBuYW1lKTsKICAgICAgICBjcCsrOyAgICAgICAgICAgICAgICAgICAvKiBjcCBub3cgcG9pbnQgdG8gdGhlIHN1YmlkZW50aWZpZXIgKi8KICAgICAgICBpZiAoKmNwID09ICc6JykKICAgICAgICAgICAgY3ArKzsKCiAgICAgICAgLyoKICAgICAgICAgKiAnY3AnIGFuZCAnbmFtZScgKmRvKiBnbyB0aGF0IHdheSByb3VuZCEgCiAgICAgICAgICovCiAgICAgICAgcmVzID0gZ2V0X21vZHVsZV9ub2RlKGNwLCBtb2R1bGUsIG9iamlkLCBvYmppZGxlbik7CiAgICAgICAgU05NUF9GUkVFKG1vZHVsZSk7CiAgICB9CiAgICBpZiAocmVzID09IDApIHsKICAgICAgICBTRVRfU05NUF9FUlJPUihTTk1QRVJSX1VOS05PV05fT0JKSUQpOwogICAgfQoKICAgIHJldHVybiByZXM7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKI2lmZGVmIHRlc3RpbmcKCm1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogICAgb2lkICAgICAgICAgICAgIG9iamlkW01BWF9PSURfTEVOXTsKICAgIGludCAgICAgICAgICAgICBvYmppZGxlbiA9IE1BWF9PSURfTEVOOwogICAgaW50ICAgICAgICAgICAgIGNvdW50OwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0IHZhcmlhYmxlOwoKICAgIG5ldHNubXBfaW5pdF9taWIoKTsKICAgIGlmIChhcmdjIDwgMikKICAgICAgICBwcmludF9zdWJ0cmVlKHN0ZG91dCwgdHJlZV9oZWFkLCAwKTsKICAgIHZhcmlhYmxlLnR5cGUgPSBBU05fSU5URUdFUjsKICAgIHZhcmlhYmxlLnZhbC5pbnRlZ2VyID0gMzsKICAgIHZhcmlhYmxlLnZhbF9sZW4gPSA0OwogICAgZm9yIChhcmdjLS07IGFyZ2M7IGFyZ2MtLSwgYXJndisrKSB7CiAgICAgICAgb2JqaWRsZW4gPSBNQVhfT0lEX0xFTjsKICAgICAgICBwcmludGYoInJlYWRfb2JqaWQoJXMpID0gJWRcbiIsCiAgICAgICAgICAgICAgIGFyZ3ZbMV0sIHJlYWRfb2JqaWQoYXJndlsxXSwgb2JqaWQsICZvYmppZGxlbikpOwogICAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IG9iamlkbGVuOyBjb3VudCsrKQogICAgICAgICAgICBwcmludGYoIiVkLiIsIG9iamlkW2NvdW50XSk7CiAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIHByaW50X3ZhcmlhYmxlKG9iamlkLCBvYmppZGxlbiwgJnZhcmlhYmxlKTsKICAgIH0KfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXN0aW5nICovCgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwovKgogKiBpbml0aWFsaXplOiBubyBwZWVycyBpbmNsdWRlZCBpbiB0aGUgcmVwb3J0LiAKICovCnZvaWQKY2xlYXJfdHJlZV9mbGFncyhyZWdpc3RlciBzdHJ1Y3QgdHJlZSAqdHApCnsKICAgIGZvciAoOyB0cDsgdHAgPSB0cC0+bmV4dF9wZWVyKSB7CiAgICAgICAgdHAtPnJlcG9ydGVkID0gMDsKICAgICAgICBpZiAodHAtPmNoaWxkX2xpc3QpCiAgICAgICAgICAgIGNsZWFyX3RyZWVfZmxhZ3ModHAtPmNoaWxkX2xpc3QpOwogICAgIC8qUkVDVVJTRSovfQp9CgovKgogKiBVcGRhdGU6IDE5OTgtMDctMTcgPGpoeUBnc3UuZWR1PgogKiBBZGRlZCBwcmludF9vaWRfcmVwb3J0KiBmdW5jdGlvbnMuCiAqLwpzdGF0aWMgaW50ICAgICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X2xhYmVsZWRvaWQgPSAwOwpzdGF0aWMgaW50ICAgICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X29pZCA9IDA7CnN0YXRpYyBpbnQgICAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfc3ltYm9saWMgPSAwOwpzdGF0aWMgaW50ICAgICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X21pYmNoaWxkb2lkID0gMDsKc3RhdGljIGludCAgICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9zdWZmaXggPSAwOwoKLyoKICogVGhlc2UgbWV0aG9kcyByZWN1cnNlLiAKICovCnN0YXRpYyB2b2lkICAgICBwcmludF9wYXJlbnRfbGFiZWxlZG9pZChGSUxFICosIHN0cnVjdCB0cmVlICopOwpzdGF0aWMgdm9pZCAgICAgcHJpbnRfcGFyZW50X29pZChGSUxFICosIHN0cnVjdCB0cmVlICopOwpzdGF0aWMgdm9pZCAgICAgcHJpbnRfcGFyZW50X21pYmNoaWxkb2lkKEZJTEUgKiwgc3RydWN0IHRyZWUgKik7CnN0YXRpYyB2b2lkICAgICBwcmludF9wYXJlbnRfbGFiZWwoRklMRSAqLCBzdHJ1Y3QgdHJlZSAqKTsKc3RhdGljIHZvaWQgICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydChGSUxFICosIHN0cnVjdCB0cmVlICosIGludCk7CgoKdm9pZApwcmludF9vaWRfcmVwb3J0KEZJTEUgKiBmcCkKewogICAgc3RydWN0IHRyZWUgICAgKnRwOwogICAgY2xlYXJfdHJlZV9mbGFncyh0cmVlX2hlYWQpOwogICAgZm9yICh0cCA9IHRyZWVfaGVhZDsgdHA7IHRwID0gdHAtPm5leHRfcGVlcikKICAgICAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnQoZnAsIHRwLCAwKTsKfQoKdm9pZApwcmludF9vaWRfcmVwb3J0X2VuYWJsZV9sYWJlbGVkb2lkKHZvaWQpCnsKICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9sYWJlbGVkb2lkID0gMTsKfQoKdm9pZApwcmludF9vaWRfcmVwb3J0X2VuYWJsZV9vaWQodm9pZCkKewogICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X29pZCA9IDE7Cn0KCnZvaWQKcHJpbnRfb2lkX3JlcG9ydF9lbmFibGVfc3VmZml4KHZvaWQpCnsKICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9zdWZmaXggPSAxOwp9Cgp2b2lkCnByaW50X29pZF9yZXBvcnRfZW5hYmxlX3N5bWJvbGljKHZvaWQpCnsKICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9zeW1ib2xpYyA9IDE7Cn0KCnZvaWQKcHJpbnRfb2lkX3JlcG9ydF9lbmFibGVfbWliY2hpbGRvaWQodm9pZCkKewogICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X21pYmNoaWxkb2lkID0gMTsKfQoKLyoKICogaGVscGVyIG1ldGhvZHMgZm9yIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydCgpCiAqIGVhY2ggb25lIHRyYXZlcnNlcyBiYWNrIHVwIHRoZSBub2RlIHRyZWUKICogdW50aWwgdGhlcmUgaXMgbm8gcGFyZW50LiAgVGhlbiwgdGhlIGxhYmVsIGNvbWJpbmF0aW9uCiAqIGlzIG91dHB1dCwgc3VjaCB0aGF0IHRoZSBwYXJlbnQgaXMgZGlzcGxheWVkIGZpcnN0LgogKgogKiBXYXJuaW5nOiB0aGVzZSBtZXRob2RzIGFyZSBhbGwgcmVjdXJzaXZlLgogKi8KCnN0YXRpYyB2b2lkCnByaW50X3BhcmVudF9sYWJlbGVkb2lkKEZJTEUgKiBmLCBzdHJ1Y3QgdHJlZSAqdHApCnsKICAgIGlmICh0cCkgewogICAgICAgIGlmICh0cC0+cGFyZW50KSB7CiAgICAgICAgICAgIHByaW50X3BhcmVudF9sYWJlbGVkb2lkKGYsIHRwLT5wYXJlbnQpOwogICAgICAgICAvKlJFQ1VSU0UqL30KICAgICAgICBmcHJpbnRmKGYsICIuJXMoJWx1KSIsIHRwLT5sYWJlbCwgdHAtPnN1YmlkKTsKICAgIH0KfQoKc3RhdGljIHZvaWQKcHJpbnRfcGFyZW50X29pZChGSUxFICogZiwgc3RydWN0IHRyZWUgKnRwKQp7CiAgICBpZiAodHApIHsKICAgICAgICBpZiAodHAtPnBhcmVudCkgewogICAgICAgICAgICBwcmludF9wYXJlbnRfb2lkKGYsIHRwLT5wYXJlbnQpOwogICAgICAgICAvKlJFQ1VSU0UqL30KICAgICAgICBmcHJpbnRmKGYsICIuJWx1IiwgdHAtPnN1YmlkKTsKICAgIH0KfQoKCnN0YXRpYyB2b2lkIHByaW50X3BhcmVudF9taWJjaGlsZG9pZChGSUxFICogZiwgc3RydWN0IHRyZWUgKnRwKQp7CiAgICBzdGF0aWMgc3RydWN0IHRyZWUgKnRlbXA7CiAgICB1bnNpZ25lZCBsb25nIGVsZW1zWzEwMF07CiAgICBpbnQgZWxlbV9jbnQgPSAwOwogICAgaW50IGkgPSAwOwogICAgdGVtcCA9IHRwOwogICAgaWYgKHRlbXApIHsKICAgICAgICB3aGlsZSAodGVtcC0+cGFyZW50KSB7CiAgICAgICAgICAgICAgICBlbGVtc1tlbGVtX2NudCsrXSA9IHRlbXAtPnN1YmlkOwogICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAtPnBhcmVudDsKICAgICAgICB9CiAgICAgICAgZWxlbXNbZWxlbV9jbnQrK10gPSB0ZW1wLT5zdWJpZDsKICAgIH0KICAgIGZvciAoaSA9IGVsZW1fY250IC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICBpZiAoaSA9PSBlbGVtX2NudCAtIDEpIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJWx1IiwgZWxlbXNbaV0pOyAgICAgICAgICAgCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIi4lbHUiLCBlbGVtc1tpXSk7ICAgICAgICAgIAogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQKcHJpbnRfcGFyZW50X2xhYmVsKEZJTEUgKiBmLCBzdHJ1Y3QgdHJlZSAqdHApCnsKICAgIGlmICh0cCkgewogICAgICAgIGlmICh0cC0+cGFyZW50KSB7CiAgICAgICAgICAgIHByaW50X3BhcmVudF9sYWJlbChmLCB0cC0+cGFyZW50KTsKICAgICAgICAgLypSRUNVUlNFKi99CiAgICAgICAgZnByaW50ZihmLCAiLiVzIiwgdHAtPmxhYmVsKTsKICAgIH0KfQoKLyoqCiAqIEBpbnRlcm5hbAogKiBUaGlzIG1ldGhvZHMgZ2VuZXJhdGVzIHZhcmlhdGlvbnMgb24gdGhlIG9yaWdpbmFsIHByaW50X3N1YnRyZWUoKSByZXBvcnQuCiAqIFRyYXZlcnNlIHRoZSB0cmVlIGRlcHRoIGZpcnN0LCBmcm9tIGxlYXN0IHRvIGdyZWF0ZXN0IHN1Yi1pZGVudGlmaWVyLgogKiBXYXJuaW5nOiB0aGlzIG1ldGhvZHMgcmVjdXJzZXMgYW5kIGNhbGxzIG1ldGhvZHMgdGhhdCByZWN1cnNlLgogKgogKiBAcGFyYW0gZiAgICAgICBGaWxlIGRlc2NyaXB0b3IgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSB0cmVlICAgID8/PwogKiBAcGFyYW0gY291bnQgICA/Pz8KICovCgpzdGF0aWMgdm9pZApwcmludF9zdWJ0cmVlX29pZF9yZXBvcnQoRklMRSAqIGYsIHN0cnVjdCB0cmVlICp0cmVlLCBpbnQgY291bnQpCnsKICAgIHN0cnVjdCB0cmVlICAgICp0cDsKCiAgICBjb3VudCsrOwoKICAgIC8qCiAgICAgKiBzYW5pdHkgY2hlY2sgCiAgICAgKi8KICAgIGlmICghdHJlZSkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKgogICAgICogZmluZCB0aGUgbm90IHJlcG9ydGVkIHBlZXIgd2l0aCB0aGUgbG93ZXN0IHN1Yi1pZGVudGlmaWVyLgogICAgICogaWYgbm8gbW9yZSwgYnJlYWsgdGhlIGxvb3AgYW5kIGNsZWFudXAuCiAgICAgKiBzZXQgInJlcG9ydGVkIiBmbGFnLCBhbmQgY3JlYXRlIHJlcG9ydCBmb3IgdGhpcyBwZWVyLgogICAgICogcmVjdXJzZSB1c2luZyB0aGUgY2hpbGRyZW4gb2YgdGhpcyBwZWVyLCBpZiBhbnkuCiAgICAgKi8KICAgIHdoaWxlICgxKSB7CiAgICAgICAgcmVnaXN0ZXIgc3RydWN0IHRyZWUgKm50cDsKCiAgICAgICAgdHAgPSBOVUxMOwogICAgICAgIGZvciAobnRwID0gdHJlZS0+Y2hpbGRfbGlzdDsgbnRwOyBudHAgPSBudHAtPm5leHRfcGVlcikgewogICAgICAgICAgICBpZiAobnRwLT5yZXBvcnRlZCkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgaWYgKCF0cCB8fCAodHAtPnN1YmlkID4gbnRwLT5zdWJpZCkpCiAgICAgICAgICAgICAgICB0cCA9IG50cDsKICAgICAgICB9CiAgICAgICAgaWYgKCF0cCkKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIHRwLT5yZXBvcnRlZCA9IDE7CgogICAgICAgIGlmIChwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfbGFiZWxlZG9pZCkgewogICAgICAgICAgICBwcmludF9wYXJlbnRfbGFiZWxlZG9pZChmLCB0cCk7CiAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7CiAgICAgICAgfQogICAgICAgIGlmIChwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfb2lkKSB7CiAgICAgICAgICAgIHByaW50X3BhcmVudF9vaWQoZiwgdHApOwogICAgICAgICAgICBmcHJpbnRmKGYsICJcbiIpOwogICAgICAgIH0KICAgICAgICBpZiAocHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X3N5bWJvbGljKSB7CiAgICAgICAgICAgIHByaW50X3BhcmVudF9sYWJlbChmLCB0cCk7CiAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7CiAgICAgICAgfQogICAgICAgIGlmIChwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfbWliY2hpbGRvaWQpIHsKCSAgICBmcHJpbnRmKGYsICJcIiVzXCJcdCIsIHRwLT5sYWJlbCk7CiAgICAgICAgICAgIGZwcmludGYoZiwgIlx0XHRcIiIpOwogICAgICAgICAgICBwcmludF9wYXJlbnRfbWliY2hpbGRvaWQoZiwgdHApOwogICAgICAgICAgICBmcHJpbnRmKGYsICJcIlxuIik7CiAgICAgICAgfQogICAgICAgIGlmIChwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfc3VmZml4KSB7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiAgIik7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzKCVsZCkgdHlwZT0lZCIsIHRwLT5sYWJlbCwgdHAtPnN1YmlkLCB0cC0+dHlwZSk7CiAgICAgICAgICAgIGlmICh0cC0+dGNfaW5kZXggIT0gLTEpCiAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgdGM9JWQiLCB0cC0+dGNfaW5kZXgpOwogICAgICAgICAgICBpZiAodHAtPmhpbnQpCiAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgaGludD0lcyIsIHRwLT5oaW50KTsKICAgICAgICAgICAgaWYgKHRwLT51bml0cykKICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiB1bml0cz0lcyIsIHRwLT51bml0cyk7CgogICAgICAgICAgICBmcHJpbnRmKGYsICJcbiIpOwogICAgICAgIH0KICAgICAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnQoZiwgdHAsIGNvdW50KTsKICAgICAvKlJFQ1VSU0UqL30KfQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgoKLyoqCiAqIENvbnZlcnRzIHRpbWV0aWNrcyB0byBob3VycywgbWludXRlcywgc2Vjb25kcyBzdHJpbmcuCiAqIENNVSBjb21wYXRpYmxlIGRvZXMgbm90IHNob3cgY2VudGlzZWNvbmRzLgogKgogKiBAcGFyYW0gdGltZXRpY2tzICAgIFRoZSB0aW1ldGlja3MgdG8gY29udmVydC4KICogQHBhcmFtIGJ1ZiAgICAgICAgICBCdWZmZXIgdG8gd3JpdGUgdG8sIGhhcyB0byBiZSBhdCAKICogICAgICAgICAgICAgICAgICAgICBsZWFzdCA0MCBCeXRlcyBsYXJnZS4KICogICAgICAgCiAqIEByZXR1cm4gVGhlIGJ1ZmZlcgogKgogKiBAc2VlIHVwdGltZVN0cmluZwogKi8KY2hhciAgICAgICAgICAgKgp1cHRpbWVfc3RyaW5nKHVfbG9uZyB0aW1ldGlja3MsIGNoYXIgKmJ1ZikKewogICAgcmV0dXJuIHVwdGltZV9zdHJpbmdfbiggdGltZXRpY2tzLCBidWYsIDQwKTsKfQoKY2hhciAgICAgICAgICAgKgp1cHRpbWVfc3RyaW5nX24odV9sb25nIHRpbWV0aWNrcywgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQp7CiAgICB1cHRpbWVTdHJpbmcodGltZXRpY2tzLCBidWYsIGJ1Zmxlbik7CiNpZmRlZiBDTVVfQ09NUEFUSUJMRQogICAgewogICAgY2hhciAqY3AgPSBzdHJyY2hyKGJ1ZiwgJy4nKTsKICAgIGlmIChjcCkKICAgICAgICAqY3AgPSAnXDAnOwogICAgfQojZW5kaWYKICAgIHJldHVybiBidWY7Cn0KCi8qKgogKiBHaXZlbiBhIHN0cmluZywgcGFyc2VzIGFuIG9pZCBvdXQgb2YgaXQgKGlmIHBvc3NpYmxlKS4KICogSXQgd2lsbCB0cnkgdG8gcGFyc2UgaXQgYmFzZWQgb24gcHJlZGV0ZXJtaW5lZCBjb25maWd1cmF0aW9uIGlmCiAqIHByZXNlbnQgb3IgYnkgZXZlcnkgbWV0aG9kIHBvc3NpYmxlIG90aGVyd2lzZS4KICogSWYgYSBzdWZmaXggaGFzIGJlZW4gcmVnaXN0ZXJlZCB1c2luZyBORVRTTk1QX0RTX0xJQl9PSURTVUZGSVgsIGl0CiAqIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGlucHV0IHN0cmluZyBiZWZvcmUgcHJvY2Vzc2luZy4KICoKICogQHBhcmFtIGFyZ3YgICAgVGhlIE9JRCB0byBzdHJpbmcgcGFyc2UKICogQHBhcmFtIHJvb3QgICAgQW4gT0lEIGFycmF5IHdoZXJlIHRoZSByZXN1bHRzIGFyZSBzdG9yZWQuCiAqIEBwYXJhbSByb290bGVuIFRoZSBtYXggbGVuZ3RoIG9mIHRoZSBhcnJheSBnb2luZyBpbiBhbmQgdGhlIGRhdGEKICogICAgICAgICAgICAgICAgbGVuZ3RoIGNvbWluZyBvdXQuCiAqCiAqIEByZXR1cm4gICAgICAgIFRoZSByb290IG9pZCBwb2ludGVyIGlmIHN1Y2Nlc3NmdWwsIG9yIE5VTEwgb3RoZXJ3aXNlLgogKi8KIApvaWQgICAgICAgICAgICAqCnNubXBfcGFyc2Vfb2lkKGNvbnN0IGNoYXIgKmFyZ3YsIG9pZCAqIHJvb3QsIHNpemVfdCAqIHJvb3RsZW4pCnsKICAgIHNpemVfdCAgICAgICAgICBzYXZsZW4gPSAqcm9vdGxlbjsKICAgIHN0YXRpYyBzaXplX3QgICB0bXBidWZfbGVuID0gMDsKICAgIHN0YXRpYyBjaGFyICAgICp0bXBidWY7CiAgICBjb25zdCBjaGFyICAgICAqc3VmZml4LCAqcHJlZml4OwoKICAgIHN1ZmZpeCA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfT0lEU1VGRklYKTsKICAgIHByZWZpeCA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfT0lEUFJFRklYKTsKICAgIGlmICgoc3VmZml4ICYmIHN1ZmZpeFswXSkgfHwgKHByZWZpeCAmJiBwcmVmaXhbMF0pKSB7CiAgICAgICAgaWYgKCFzdWZmaXgpCiAgICAgICAgICAgIHN1ZmZpeCA9ICIiOwogICAgICAgIGlmICghcHJlZml4KQogICAgICAgICAgICBwcmVmaXggPSAiIjsKICAgICAgICBpZiAoKHN0cmxlbihzdWZmaXgpICsgc3RybGVuKHByZWZpeCkgKyBzdHJsZW4oYXJndikgKyAyKSA+IHRtcGJ1Zl9sZW4pIHsKICAgICAgICAgICAgdG1wYnVmX2xlbiA9IHN0cmxlbihzdWZmaXgpICsgc3RybGVuKGFyZ3YpICsgc3RybGVuKHByZWZpeCkgKyAyOwogICAgICAgICAgICB0bXBidWYgPSAoY2hhciAqKXJlYWxsb2ModG1wYnVmLCB0bXBidWZfbGVuKTsKICAgICAgICB9CiAgICAgICAgc25wcmludGYodG1wYnVmLCB0bXBidWZfbGVuLCAiJXMlcyVzJXMiLCBwcmVmaXgsIGFyZ3YsCiAgICAgICAgICAgICAgICAgKChzdWZmaXhbMF0gPT0gJy4nIHx8IHN1ZmZpeFswXSA9PSAnXDAnKSA/ICIiIDogIi4iKSwKICAgICAgICAgICAgICAgICBzdWZmaXgpOwogICAgICAgIGFyZ3YgPSB0bXBidWY7CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBfcGFyc2Vfb2lkIiwiUGFyc2luZzogJXNcbiIsYXJndikpOwogICAgfQoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUkFORE9NX0FDQ0VTUykKICAgICAgICB8fCBzdHJjaHIoYXJndiwgJzonKSkgewogICAgICAgIGlmIChnZXRfbm9kZShhcmd2LCByb290LCByb290bGVuKSkgewogICAgICAgICAgICByZXR1cm4gcm9vdDsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9SRUdFWF9BQ0NFU1MpKSB7CgljbGVhcl90cmVlX2ZsYWdzKHRyZWVfaGVhZCk7CiAgICAgICAgaWYgKGdldF93aWxkX25vZGUoYXJndiwgcm9vdCwgcm9vdGxlbikpIHsKICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgICAgfQogICAgfSBlbHNlIHsKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgICAgIGlmIChyZWFkX29iamlkKGFyZ3YsIHJvb3QsIHJvb3RsZW4pKSB7CiAgICAgICAgICAgIHJldHVybiByb290OwogICAgICAgIH0KI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgICAgICAqcm9vdGxlbiA9IHNhdmxlbjsKICAgICAgICBpZiAoZ2V0X25vZGUoYXJndiwgcm9vdCwgcm9vdGxlbikpIHsKICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgICAgfQogICAgICAgICpyb290bGVuID0gc2F2bGVuOwogICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWQiLCAid2lsZGx5IHBhcnNpbmdcbiIpKTsKCWNsZWFyX3RyZWVfZmxhZ3ModHJlZV9oZWFkKTsKICAgICAgICBpZiAoZ2V0X3dpbGRfbm9kZShhcmd2LCByb290LCByb290bGVuKSkgewogICAgICAgICAgICByZXR1cm4gcm9vdDsKICAgICAgICB9CiAgICB9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgIHJldHVybiBOVUxMOwp9CgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwovKgogKiBVc2UgRElTUExBWS1ISU5UIHRvIHBhcnNlIGEgdmFsdWUgaW50byBhbiBvY3RldCBzdHJpbmcuCiAqCiAqIG5vdGUgdGhhdCAiMWQxZCIsICIxMSIgY291bGQgaGF2ZSBjb21lIGZyb20gYW4gb2N0ZXQgc3RyaW5nIHRoYXQKICogbG9va2VkIGxpa2UgeyAxLCAxIH0gb3IgYW4gb2N0ZXQgc3RyaW5nIHRoYXQgbG9va2VkIGxpa2UgeyAxMSB9CiAqIGJlY2F1c2Ugb2YgdGhpcywgaXQncyBkb3VidGZ1bCB0aGF0IGFueW9uZSB3b3VsZCB1c2Ugc3VjaCBhIGRpc3BsYXkKICogc3RyaW5nLiBUaGVyZWZvcmUsIHRoZSBwYXJzZXIgaWdub3JlcyB0aGlzIGNhc2UuCiAqLwoKc3RydWN0IHBhcnNlX2hpbnRzIHsKICAgIGludCBsZW5ndGg7CiAgICBpbnQgcmVwZWF0OwogICAgaW50IGZvcm1hdDsKICAgIGludCBzZXBhcmF0b3I7CiAgICBpbnQgdGVybWluYXRvcjsKICAgIHVuc2lnbmVkIGNoYXIgKnJlc3VsdDsKICAgIGludCByZXN1bHRfbWF4OwogICAgaW50IHJlc3VsdF9sZW47Cn07CgpzdGF0aWMgdm9pZCBwYXJzZV9oaW50c19yZXNldChzdHJ1Y3QgcGFyc2VfaGludHMgKnBoKQp7CiAgICBwaC0+bGVuZ3RoID0gMDsKICAgIHBoLT5yZXBlYXQgPSAwOwogICAgcGgtPmZvcm1hdCA9IDA7CiAgICBwaC0+c2VwYXJhdG9yID0gMDsKICAgIHBoLT50ZXJtaW5hdG9yID0gMDsKfQoKc3RhdGljIHZvaWQgcGFyc2VfaGludHNfY3RvcihzdHJ1Y3QgcGFyc2VfaGludHMgKnBoKQp7CiAgICBwYXJzZV9oaW50c19yZXNldChwaCk7CiAgICBwaC0+cmVzdWx0ID0gTlVMTDsKICAgIHBoLT5yZXN1bHRfbWF4ID0gMDsKICAgIHBoLT5yZXN1bHRfbGVuID0gMDsKfQoKc3RhdGljIGludCBwYXJzZV9oaW50c19hZGRfcmVzdWx0X29jdGV0KHN0cnVjdCBwYXJzZV9oaW50cyAqcGgsIHVuc2lnbmVkIGNoYXIgb2N0ZXQpCnsKICAgIGlmICghKHBoLT5yZXN1bHRfbGVuIDwgcGgtPnJlc3VsdF9tYXgpKSB7CglwaC0+cmVzdWx0X21heCA9IHBoLT5yZXN1bHRfbGVuICsgMzI7CglpZiAoIXBoLT5yZXN1bHQpIHsKCSAgICBwaC0+cmVzdWx0ID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2MocGgtPnJlc3VsdF9tYXgpOwoJfSBlbHNlIHsKCSAgICBwaC0+cmVzdWx0ID0gKHVuc2lnbmVkIGNoYXIgKilyZWFsbG9jKHBoLT5yZXN1bHQsIHBoLT5yZXN1bHRfbWF4KTsKCX0KICAgIH0KICAgIAogICAgaWYgKCFwaC0+cmVzdWx0KSB7CglyZXR1cm4gMDsJCS8qIGZhaWxlZCAqLwogICAgfQoKICAgIHBoLT5yZXN1bHRbcGgtPnJlc3VsdF9sZW4rK10gPSBvY3RldDsKICAgIHJldHVybiAxOwkJCS8qIHN1Y2Nlc3MgKi8KfQoKc3RhdGljIGludCBwYXJzZV9oaW50c19wYXJzZShzdHJ1Y3QgcGFyc2VfaGludHMgKnBoLCBjb25zdCBjaGFyICoqdl9pbl9vdXQpCnsKICAgIGNvbnN0IGNoYXIgKnYgPSAqdl9pbl9vdXQ7CiAgICBjaGFyICpudjsKICAgIGludCBiYXNlOwogICAgaW50IHJlcGVhdHMgPSAwOwogICAgaW50IHJlcGVhdF9maXh1cCA9IHBoLT5yZXN1bHRfbGVuOwogICAgCiAgICBpZiAocGgtPnJlcGVhdCkgewoJaWYgKCFwYXJzZV9oaW50c19hZGRfcmVzdWx0X29jdGV0KHBoLCAwKSkgewoJICAgIHJldHVybiAwOwoJfQogICAgfQogICAgZG8gewoJYmFzZSA9IDA7Cglzd2l0Y2ggKHBoLT5mb3JtYXQpIHsKCWNhc2UgJ3gnOiBiYXNlICs9IDY7CS8qIGZhbGwgdGhyb3VnaCAqLwoJY2FzZSAnZCc6IGJhc2UgKz0gMjsJLyogZmFsbCB0aHJvdWdoICovCgljYXNlICdvJzogYmFzZSArPSA4OwkvKiBmYWxsIHRocm91Z2ggKi8KCSAgICB7CgkJaW50IGk7CgkJdW5zaWduZWQgbG9uZyBudW1iZXIgPSBzdHJ0b2wodiwgJm52LCBiYXNlKTsKCQlpZiAobnYgPT0gdikgcmV0dXJuIDA7CgkJdiA9IG52OwoJCWZvciAoaSA9IDA7IGkgPCBwaC0+bGVuZ3RoOyBpKyspIHsKCQkgICAgaW50IHNoaWZ0ID0gOCAqIChwaC0+bGVuZ3RoIC0gMSAtIGkpOwoJCSAgICBpZiAoIXBhcnNlX2hpbnRzX2FkZF9yZXN1bHRfb2N0ZXQocGgsICh1X2NoYXIpKG51bWJlciA+PiBzaGlmdCkgKSkgewoJCQlyZXR1cm4gMDsgLyogZmFpbGVkICovCgkJICAgIH0KCQl9CgkgICAgfQoJICAgIGJyZWFrOwoKCWNhc2UgJ2EnOgoJICAgIHsKCQlpbnQgaTsKCQkgICAgCgkJZm9yIChpID0gMDsgaSA8IHBoLT5sZW5ndGggJiYgKnY7IGkrKykgewoJCSAgICBpZiAoIXBhcnNlX2hpbnRzX2FkZF9yZXN1bHRfb2N0ZXQocGgsICp2KyspKSB7CgkJCXJldHVybiAwOwkvKiBmYWlsZWQgKi8KCQkgICAgfQoJCX0KCSAgICB9CgkgICAgYnJlYWs7Cgl9CgoJcmVwZWF0cysrOwoKCWlmIChwaC0+c2VwYXJhdG9yICYmICp2KSB7CgkgICAgaWYgKCp2ID09IHBoLT5zZXBhcmF0b3IpIHsKCQl2Kys7CgkgICAgfSBlbHNlIHsKCQlyZXR1cm4gMDsJCS8qIGZhaWxlZCAqLwoJICAgIH0KCX0KCglpZiAocGgtPnRlcm1pbmF0b3IpIHsKCSAgICBpZiAoKnYgPT0gcGgtPnRlcm1pbmF0b3IpIHsKCQl2Kys7CgkJYnJlYWs7CgkgICAgfQoJfQogICAgfSB3aGlsZSAocGgtPnJlcGVhdCAmJiAqdik7CiAgICBpZiAocGgtPnJlcGVhdCkgewoJcGgtPnJlc3VsdFtyZXBlYXRfZml4dXBdID0gcmVwZWF0czsKICAgIH0KCiAgICAqdl9pbl9vdXQgPSB2OwogICAgcmV0dXJuIDE7Cn0KCnN0YXRpYyB2b2lkIHBhcnNlX2hpbnRzX2xlbmd0aF9hZGRfZGlnaXQoc3RydWN0IHBhcnNlX2hpbnRzICpwaCwgaW50IGRpZ2l0KQp7CiAgICBwaC0+bGVuZ3RoICo9IDEwOwogICAgcGgtPmxlbmd0aCArPSBkaWdpdCAtICcwJzsKfQoKY29uc3QgY2hhciAqcGFyc2Vfb2N0ZXRfaGludChjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp2YWx1ZSwgdW5zaWduZWQgY2hhciAqKm5ld192YWwsIGludCAqbmV3X3ZhbF9sZW4pCnsKICAgIGNvbnN0IGNoYXIgKmggPSBoaW50OwogICAgY29uc3QgY2hhciAqdiA9IHZhbHVlOwogICAgc3RydWN0IHBhcnNlX2hpbnRzIHBoOwogICAgaW50IHJldHZhbCA9IDE7CiAgICAvKiBTZWUgUkZDIDE0NDMgKi8KICAgIGVudW0gewoJSElOVF8xXzIsCglISU5UXzJfMywKCUhJTlRfMV8yXzQsCglISU5UXzFfMl81CiAgICB9IHN0YXRlID0gSElOVF8xXzI7CgogICAgcGFyc2VfaGludHNfY3RvcigmcGgpOwogICAgd2hpbGUgKCpoICYmICp2ICYmIHJldHZhbCkgewoJc3dpdGNoIChzdGF0ZSkgewoJY2FzZSBISU5UXzFfMjoKCSAgICBpZiAoJyonID09ICpoKSB7CgkJcGgucmVwZWF0ID0gMTsKCQlzdGF0ZSA9IEhJTlRfMl8zOwoJICAgIH0gZWxzZSBpZiAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikoKmgpKSkgewoJCXBhcnNlX2hpbnRzX2xlbmd0aF9hZGRfZGlnaXQoJnBoLCAqaCk7CgkJc3RhdGUgPSBISU5UXzJfMzsKCSAgICB9IGVsc2UgewoJCXJldHVybiB2OwkvKiBmYWlsZWQgKi8KCSAgICB9CgkgICAgYnJlYWs7CgoJY2FzZSBISU5UXzJfMzoKCSAgICBpZiAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikoKmgpKSkgewoJCXBhcnNlX2hpbnRzX2xlbmd0aF9hZGRfZGlnaXQoJnBoLCAqaCk7CgkJLyogc3RhdGUgPSBISU5UXzJfMyAqLwoJICAgIH0gZWxzZSBpZiAoJ3gnID09ICpoIHx8ICdkJyA9PSAqaCB8fCAnbycgPT0gKmggfHwgJ2EnID09ICpoKSB7CgkJcGguZm9ybWF0ID0gKmg7CgkJc3RhdGUgPSBISU5UXzFfMl80OwoJICAgIH0gZWxzZSB7CgkJcmV0dXJuIHY7CS8qIGZhaWxlZCAqLwoJICAgIH0KCSAgICBicmVhazsKCgljYXNlIEhJTlRfMV8yXzQ6CgkgICAgaWYgKCcqJyA9PSAqaCkgewoJCXJldHZhbCA9IHBhcnNlX2hpbnRzX3BhcnNlKCZwaCwgJnYpOwoJCXBhcnNlX2hpbnRzX3Jlc2V0KCZwaCk7CgkJCgkJcGgucmVwZWF0ID0gMTsKCQlzdGF0ZSA9IEhJTlRfMl8zOwoJICAgIH0gZWxzZSBpZiAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikoKmgpKSkgewoJCXJldHZhbCA9IHBhcnNlX2hpbnRzX3BhcnNlKCZwaCwgJnYpOwoJCXBhcnNlX2hpbnRzX3Jlc2V0KCZwaCk7CgkJCgkJcGFyc2VfaGludHNfbGVuZ3RoX2FkZF9kaWdpdCgmcGgsICpoKTsKCQlzdGF0ZSA9IEhJTlRfMl8zOwoJICAgIH0gZWxzZSB7CgkJcGguc2VwYXJhdG9yID0gKmg7CgkJc3RhdGUgPSBISU5UXzFfMl81OwoJICAgIH0KCSAgICBicmVhazsKCgljYXNlIEhJTlRfMV8yXzU6CgkgICAgaWYgKCcqJyA9PSAqaCkgewoJCXJldHZhbCA9IHBhcnNlX2hpbnRzX3BhcnNlKCZwaCwgJnYpOwoJCXBhcnNlX2hpbnRzX3Jlc2V0KCZwaCk7CgkJCgkJcGgucmVwZWF0ID0gMTsKCQlzdGF0ZSA9IEhJTlRfMl8zOwoJICAgIH0gZWxzZSBpZiAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikoKmgpKSkgewoJCXJldHZhbCA9IHBhcnNlX2hpbnRzX3BhcnNlKCZwaCwgJnYpOwoJCXBhcnNlX2hpbnRzX3Jlc2V0KCZwaCk7CgkJCgkJcGFyc2VfaGludHNfbGVuZ3RoX2FkZF9kaWdpdCgmcGgsICpoKTsKCQlzdGF0ZSA9IEhJTlRfMl8zOwoJICAgIH0gZWxzZSB7CgkJcGgudGVybWluYXRvciA9ICpoOwoKCQlyZXR2YWwgPSBwYXJzZV9oaW50c19wYXJzZSgmcGgsICZ2KTsKCQlwYXJzZV9oaW50c19yZXNldCgmcGgpOwoKCQlzdGF0ZSA9IEhJTlRfMV8yOwoJICAgIH0KCSAgICBicmVhazsKCX0KCWgrKzsKICAgIH0KICAgIHdoaWxlICgqdiAmJiByZXR2YWwpIHsKCXJldHZhbCA9IHBhcnNlX2hpbnRzX3BhcnNlKCZwaCwgJnYpOwogICAgfQogICAgaWYgKHJldHZhbCkgewoJKm5ld192YWwgPSBwaC5yZXN1bHQ7CgkqbmV3X3ZhbF9sZW4gPSBwaC5yZXN1bHRfbGVuOwogICAgfSBlbHNlIHsKCWlmIChwaC5yZXN1bHQpIHsKCSAgICBTTk1QX0ZSRUUocGgucmVzdWx0KTsKCX0KCSpuZXdfdmFsID0gTlVMTDsKCSpuZXdfdmFsX2xlbiA9IDA7CiAgICB9CiAgICByZXR1cm4gcmV0dmFsID8gTlVMTCA6IHY7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKI2lmZGVmIHRlc3RfZGlzcGxheV9oaW50CgppbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCnsKICAgIGNvbnN0IGNoYXIgKmhpbnQ7CiAgICBjb25zdCBjaGFyICp2YWx1ZTsKICAgIHVuc2lnbmVkIGNoYXIgKm5ld192YWw7CiAgICBpbnQgbmV3X3ZhbF9sZW47CiAgICBjaGFyICpyOwogICAgCiAgICBpZiAoYXJnYyA8IDMpIHsKCWZwcmludGYoc3RkZXJyLCAidXNhZ2U6IGRoIDxoaW50PiA8dmFsdWU+XG4iKTsKCWV4aXQoMik7CiAgICB9CiAgICBoaW50ID0gYXJndlsxXTsKICAgIHZhbHVlID0gYXJndlsyXTsKICAgIHIgPSBwYXJzZV9vY3RldF9oaW50KGhpbnQsIHZhbHVlLCAmbmV3X3ZhbCwgJm5ld192YWxfbGVuKTsKICAgIHByaW50Zigie1wiJXNcIiwgXCIlc1wifTogXG5cdCIsIGhpbnQsIHZhbHVlKTsKICAgIGlmIChyKSB7CiAgICAgICAgKnIgPSAwOwogICAgCXByaW50ZigicmV0dXJuZWQgZmFpbGVkXG4iKTsKCXByaW50ZigidmFsdWUgc3ludGF4IGVycm9yIGF0OiAlc1xuIiwgdmFsdWUpOwogICAgfQogICAgZWxzZSB7CglpbnQgaTsKCXByaW50ZigicmV0dXJuZWQgc3VjY2Vzc1xuIik7Cglmb3IgKGkgPSAwOyBpIDwgbmV3X3ZhbF9sZW47IGkrKykgewoJICAgIGludCBjID0gbmV3X3ZhbFtpXSAmIDB4RkY7CgkgICAgcHJpbnRmKCIlMDJYKCVjKSAiLCBjLCBpc3ByaW50KGMpID8gYyA6ICcgJyk7Cgl9CglTTk1QX0ZSRUUobmV3X3ZhbCk7CiAgICB9CiAgICBwcmludGYoIlxuIik7CiAgICBleGl0KDApOwp9CgojZW5kaWYgLyogdGVzdF9kaXNwbGF5X2hpbnQgKi8KCnVfY2hhcgptaWJfdG9fYXNuX3R5cGUoaW50IG1pYl90eXBlKQp7CiAgICBzd2l0Y2ggKG1pYl90eXBlKSB7CiAgICBjYXNlIFRZUEVfT0JKSUQ6CiAgICAgICAgcmV0dXJuIEFTTl9PQkpFQ1RfSUQ7CgogICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgICAgIHJldHVybiBBU05fT0NURVRfU1RSOwoKICAgIGNhc2UgVFlQRV9ORVRBRERSOgogICAgY2FzZSBUWVBFX0lQQUREUjoKICAgICAgICByZXR1cm4gQVNOX0lQQUREUkVTUzsKCiAgICBjYXNlIFRZUEVfSU5URUdFUjMyOgogICAgY2FzZSBUWVBFX0lOVEVHRVI6CiAgICAgICAgcmV0dXJuIEFTTl9JTlRFR0VSOwoKICAgIGNhc2UgVFlQRV9DT1VOVEVSOgogICAgICAgIHJldHVybiBBU05fQ09VTlRFUjsKCiAgICBjYXNlIFRZUEVfR0FVR0U6CiAgICAgICAgcmV0dXJuIEFTTl9HQVVHRTsKCiAgICBjYXNlIFRZUEVfVElNRVRJQ0tTOgogICAgICAgIHJldHVybiBBU05fVElNRVRJQ0tTOwoKICAgIGNhc2UgVFlQRV9PUEFRVUU6CiAgICAgICAgcmV0dXJuIEFTTl9PUEFRVUU7CgogICAgY2FzZSBUWVBFX05VTEw6CiAgICAgICAgcmV0dXJuIEFTTl9OVUxMOwoKICAgIGNhc2UgVFlQRV9DT1VOVEVSNjQ6CiAgICAgICAgcmV0dXJuIEFTTl9DT1VOVEVSNjQ7CgogICAgY2FzZSBUWVBFX0JJVFNUUklORzoKICAgICAgICByZXR1cm4gQVNOX0JJVF9TVFI7CgogICAgY2FzZSBUWVBFX1VJTlRFR0VSOgogICAgY2FzZSBUWVBFX1VOU0lHTkVEMzI6CiAgICAgICAgcmV0dXJuIEFTTl9VTlNJR05FRDsKCiAgICBjYXNlIFRZUEVfTlNBUEFERFJFU1M6CiAgICAgICAgcmV0dXJuIEFTTl9OU0FQOwoKICAgIH0KICAgIHJldHVybiAtMTsKfQoKLyoqCiAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGl0cyBPSUQgZm9ybS4KICogaW4gZXhhbXBsZSAgImhlbGxvIiA9IDUgLiAnaCcgLiAnZScgLiAnbCcgLiAnbCcgLiAnbycKICoKICogQHBhcmFtIFMgICBUaGUgc3RyaW5nLgogKiBAcGFyYW0gTyAgIFRoZSBvaWQuCiAqIEBwYXJhbSBMICAgVGhlIGxlbmd0aCBvZiB0aGUgb2lkLgogKgogKiBAcmV0dXJuIDAgb24gU3VjZXNzLCAxIG9uIGZhaWx1cmUuCiAqLwppbnQKbmV0c25tcF9zdHIyb2lkKGNvbnN0IGNoYXIgKlMsIG9pZCAqIE8sIGludCBMKQp7CiAgICBjb25zdCBjaGFyICAgICAqYyA9IFM7CiAgICBvaWQgICAgICAgICAgICAqbyA9ICZPWzFdOwoKICAgIC0tTDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZWF2ZSByb29tIGZvciBsZW5ndGggcHJlZml4ICovCgogICAgZm9yICg7ICpjICYmIEw7IC0tTCwgKytvLCArK2MpCiAgICAgICAgKm8gPSAqYzsKCiAgICAvKgogICAgICogbWFrZSBzdXJlIHdlIGdvdCB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgCiAgICAgKi8KICAgIGlmICgqYyAhPSAwKQogICAgICAgIHJldHVybiAxOwoKICAgIC8qCiAgICAgKiBzZXQgdGhlIGxlbmd0aCBvZiB0aGUgb2lkIAogICAgICovCiAgICAqTyA9IGMgLSBTOwoKICAgIHJldHVybiAwOwp9CgovKioKICogQ29udmVydHMgYW4gT0lEIHRvIGl0cyBjaGFyYWN0ZXIgZm9ybS4KICogaW4gZXhhbXBsZSAgNSAuIDEgLiAyIC4gMyAuIDQgLiA1ID0gMTIzNDUKICoKICogQHBhcmFtIEMgICBUaGUgY2hhcmFjdGVyIGJ1ZmZlci4KICogQHBhcmFtIEwgICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIuCiAqIEBwYXJhbSBPICAgVGhlIG9pZC4KICoKICogQHJldHVybiAwIG9uIFN1Y2VzcywgMSBvbiBmYWlsdXJlLgogKi8KaW50Cm5ldHNubXBfb2lkMmNoYXJzKGNoYXIgKkMsIGludCBMLCBjb25zdCBvaWQgKiBPKQp7CiAgICBjaGFyICAgICAgICAgICAqYyA9IEM7CiAgICBjb25zdCBvaWQgICAgICAqbyA9ICZPWzFdOwoKICAgIGlmIChMIDwgKGludCkqTykKICAgICAgICByZXR1cm4gMTsKCiAgICBMID0gKk87IC8qKiBsZW5ndGggKi8KICAgIGZvciAoOyBMOyAtLUwsICsrbywgKytjKSB7CiAgICAgICAgaWYgKCpvID4gMHhGRikKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgKmMgPSAoY2hhcikqbzsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioKICogQ29udmVydHMgYW4gT0lEIHRvIGl0cyBzdHJpbmcgZm9ybS4KICogaW4gZXhhbXBsZSAgNSAuICdoJyAuICdlJyAuICdsJyAuICdsJyAuICdvJyA9ICJoZWxsb1wwIiAobnVsbCB0ZXJtaW5hdGVkKQogKgogKiBAcGFyYW0gUyAgIFRoZSBjaGFyYWN0ZXIgc3RyaW5nIGJ1ZmZlci4KICogQHBhcmFtIEwgICBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgYnVmZmVyLgogKiBAcGFyYW0gTyAgIFRoZSBvaWQuCiAqCiAqIEByZXR1cm4gMCBvbiBTdWNlc3MsIDEgb24gZmFpbHVyZS4KICovCmludApuZXRzbm1wX29pZDJzdHIoY2hhciAqUywgaW50IEwsIG9pZCAqIE8pCnsKICAgIGludCAgICAgICAgICAgIHJjOwoKICAgIGlmIChMIDw9IChpbnQpKk8pCiAgICAgICAgcmV0dXJuIDE7CgogICAgcmMgPSBuZXRzbm1wX29pZDJjaGFycyhTLCBMLCBPKTsKICAgIGlmIChyYykKICAgICAgICByZXR1cm4gMTsKCiAgICBTWyAqTyBdID0gMDsKCiAgICByZXR1cm4gMDsKfQoKaW50CnNucHJpbnRfYnlfdHlwZShjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2J5X3R5cGUoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2hleHN0cmluZyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLCBjb25zdCB1X2NoYXIgKiBjcCwgc2l6ZV90IGxlbikKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2hleHN0cmluZygodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcCwgbGVuKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2FzY2lpc3RyaW5nKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdV9jaGFyICogY3AsIHNpemVfdCBsZW4pCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19hc2NpaXN0cmluZwogICAgICAgICgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLCBjcCwgbGVuKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X29jdGV0X3N0cmluZyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX29jdGV0X3N0cmluZwogICAgICAgICgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9vcGFxdWUoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19vcGFxdWUoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfb2JqZWN0X2lkZW50aWZpZXIoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsIGNvbnN0IGNoYXIgKmhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19vYmplY3RfaWRlbnRpZmllcgogICAgICAgICgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF90aW1ldGlja3MoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY190aW1ldGlja3MoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfaGludGVkX2ludGVnZXIoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBsb25nIHZhbCwgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19oaW50ZWRfaW50ZWdlcgogICAgICAgICgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLCB2YWwsICdkJywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfaW50ZWdlcihjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfaW50ZWdlcigodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfdWludGVnZXIoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfdWludGVnZXIoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9nYXVnZShjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19nYXVnZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2NvdW50ZXIoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2NvdW50ZXIoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X25ldHdvcmthZGRyZXNzKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLCBjb25zdCBjaGFyICpoaW50LAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfbmV0d29ya2FkZHJlc3MKICAgICAgICAoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfaXBhZGRyZXNzKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfaXBhZGRyZXNzKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X251bGwoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX251bGwoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2JpdHN0cmluZyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2JpdHN0cmluZygodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9uc2FwYWRkcmVzcyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19uc2FwYWRkcmVzcwogICAgICAgICgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9jb3VudGVyNjQoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19jb3VudGVyNjQoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfYmFkdHlwZShjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfYmFkdHlwZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwppbnQKc25wcmludF9mbG9hdChjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19mbG9hdCgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2RvdWJsZShjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2RvdWJsZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CiNlbmRpZgovKiogQH0gKi8KCg==