LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfICAgXyBfX19fICBfICAgICAKICogIFByb2plY3QgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwgICAgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9ffCB8IHwgfCB8XykgfCB8ICAgIAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXyAKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAqCiAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMDIsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAqCiAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKICogYXJlIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly9jdXJsLmhheHguc2UvZG9jcy9jb3B5cmlnaHQuaHRtbC4KICogCiAqIFlvdSBtYXkgb3B0IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSBhbmQvb3Igc2VsbAogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKICogZnVybmlzaGVkIHRvIGRvIHNvLCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENPUFlJTkcgZmlsZS4KICoKICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQogKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKgogKiAkSWQkCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioqCgoKUkVDRUlWSU5HIENPT0tJRSBJTkZPUk1BVElPTgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdHJ1Y3QgQ29va2llSW5mbyAqY29va2llX2luaXQoY2hhciAqZmlsZSk7CgkKCUluaXRzIGEgY29va2llIHN0cnVjdCB0byBzdG9yZSBkYXRhIGluIGEgbG9jYWwgZmlsZS4gVGhpcyBpcyBhbHdheXMKCWNhbGxlZCBiZWZvcmUgYW55IGNvb2tpZXMgYXJlIHNldC4KCmludCBjb29raWVzX3NldChzdHJ1Y3QgQ29va2llSW5mbyAqY29va2llLCBjaGFyICpjb29raWVfbGluZSk7CgoJVGhlICdjb29raWVfbGluZScgcGFyYW1ldGVyIGlzIGEgZnVsbCAiU2V0LWNvb2tpZToiIGxpbmUgYXMKCXJlY2VpdmVkIGZyb20gYSBzZXJ2ZXIuCgoJVGhlIGZ1bmN0aW9uIG5lZWQgdG8gcmVwbGFjZSBwcmV2aW91c2x5IHN0b3JlZCBsaW5lcyB0aGF0IHRoaXMgbmV3CglsaW5lIHN1cGVyY2VlZHMuCgoJSXQgbWF5IHJlbW92ZSBsaW5lcyB0aGF0IGFyZSBleHBpcmVkLgoKCUl0IHNob3VsZCByZXR1cm4gYW4gaW5kaWNhdGlvbiBvZiBzdWNjZXNzL2Vycm9yLgoKClNFTkRJTkcgQ09PS0lFIElORk9STUFUSU9OCj09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdHJ1Y3QgQ29va2llcyAqY29va2llX2dldGxpc3Qoc3RydWN0IENvb2tpZUluZm8gKmNvb2tpZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmhvc3QsIGNoYXIgKnBhdGgsIGJvb2wgc2VjdXJlKTsKCglGb3IgYSBnaXZlbiBob3N0IGFuZCBwYXRoLCByZXR1cm4gYSBsaW5rZWQgbGlzdCBvZiBjb29raWVzIHRoYXQKCXRoZSBjbGllbnQgc2hvdWxkIHNlbmQgdG8gdGhlIHNlcnZlciBpZiB1c2VkIG5vdy4gVGhlIHNlY3VyZQoJYm9vbGVhbiBpbmZvcm1zIHRoZSBjb29raWUgaWYgYSBzZWN1cmUgY29ubmVjdGlvbiBpcyBhY2hpZXZlZCBvcgoJbm90LgoKCUl0IHNoYWxsIG9ubHkgcmV0dXJuIGNvb2tpZXMgdGhhdCBoYXZlbid0IGV4cGlyZWQuCgogICAgCkV4YW1wbGUgc2V0IG9mIGNvb2tpZXM6CiAgICAKICAgIFNldC1jb29raWU6IFBST0RVQ1RJTkZPPXdlYnhwcmVzczsgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBQRVJTT05BTElaRT1ub25lO2V4cGlyZXM9TW9uZGF5LCAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7CiAgICBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vZnRndzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBGaWRIaXN0PW5vbmU7ZXhwaXJlcz1Nb25kYXksIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsKICAgIGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQogICAgU2V0LWNvb2tpZTogRmlkT3JkZXI9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBEaXNQZW5kPW5vbmU7ZXhwaXJlcz1Nb25kYXksIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsKICAgIGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQogICAgU2V0LWNvb2tpZTogRmlkRGlzPW5vbmU7ZXhwaXJlcz1Nb25kYXksIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsKICAgIGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQogICAgU2V0LWNvb2tpZToKICAgIFNlc3Npb25fS2V5QDY3OTFhOWUwLTkwMWEtMTFkMC1hMWM4LTliMDEyYzg4YWE3Nz1ub25lO2V4cGlyZXM9TW9uZGF5LAogICAgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOyBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKKioqKi8KCiNpbmNsdWRlICJzZXR1cC5oIgoKI2lmbmRlZiBDVVJMX0RJU0FCTEVfSFRUUAoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgoKI2luY2x1ZGUgImNvb2tpZS5oIgojaW5jbHVkZSAiZ2V0ZGF0ZS5oIgojaW5jbHVkZSAic3RyZXF1YWwuaCIKI2luY2x1ZGUgInN0cnRvay5oIgoKLyogVGhlIGxhc3QgI2luY2x1ZGUgZmlsZSBzaG91bGQgYmU6ICovCiNpZmRlZiBNQUxMT0NERUJVRwojaW5jbHVkZSAibWVtZGVidWcuaCIKI2VuZGlmCgpzdGF0aWMgdm9pZApmcmVlX2Nvb2tpZW1lc3Moc3RydWN0IENvb2tpZSAqY28pCnsKICBpZihjby0+ZG9tYWluKQogICAgZnJlZShjby0+ZG9tYWluKTsKICBpZihjby0+cGF0aCkKICAgIGZyZWUoY28tPnBhdGgpOwogIGlmKGNvLT5uYW1lKQogICAgZnJlZShjby0+bmFtZSk7CiAgaWYoY28tPnZhbHVlKQogICAgZnJlZShjby0+dmFsdWUpOwoKICBmcmVlKGNvKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQ3VybF9jb29raWVfYWRkKCkKICoKICogQWRkIGEgc2luZ2xlIGNvb2tpZSBsaW5lIHRvIHRoZSBjb29raWUga2VlcGluZyBvYmplY3QuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdHJ1Y3QgQ29va2llICoKQ3VybF9jb29raWVfYWRkKHN0cnVjdCBDb29raWVJbmZvICpjLAogICAgICAgICAgICAgICAgYm9vbCBodHRwaGVhZGVyLCAvKiBUUlVFIGlmIEhUVFAgaGVhZGVyLXN0eWxlIGxpbmUgKi8KICAgICAgICAgICAgICAgIGNoYXIgKmxpbmVwdHIsICAgLyogZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBsaW5lICovCiAgICAgICAgICAgICAgICBjaGFyICpkb21haW4pICAgIC8qIGRlZmF1bHQgZG9tYWluICovCnsKICBzdHJ1Y3QgQ29va2llICpjbGlzdDsKICBjaGFyIHdoYXRbTUFYX0NPT0tJRV9MSU5FXTsKICBjaGFyIG5hbWVbTUFYX05BTUVdOwogIGNoYXIgKnB0cjsKICBjaGFyICpzZW1pcHRyOwogIHN0cnVjdCBDb29raWUgKmNvOwogIHN0cnVjdCBDb29raWUgKmxhc3RjPU5VTEw7CiAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CiAgYm9vbCByZXBsYWNlX29sZCA9IEZBTFNFOwoKICAvKiBGaXJzdCwgYWxsb2MgYW5kIGluaXQgYSBuZXcgc3RydWN0IGZvciBpdCAqLwogIGNvID0gKHN0cnVjdCBDb29raWUgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBDb29raWUpKTsKICBpZighY28pCiAgICByZXR1cm4gTlVMTDsgLyogYmFpbCBvdXQgaWYgd2UncmUgdGhpcyBsb3cgb24gbWVtb3J5ICovCgogIC8qIGNsZWFyIHRoZSB3aG9sZSBzdHJ1Y3QgZmlyc3QgKi8KICBtZW1zZXQoY28sIDAsIHNpemVvZihzdHJ1Y3QgQ29va2llKSk7CgkgICAgCiAgaWYoaHR0cGhlYWRlcikgewogICAgLyogVGhpcyBsaW5lIHdhcyByZWFkIG9mZiBhIEhUVFAtaGVhZGVyICovCiAgICBjaGFyICpzZXA7CiAgICBzZW1pcHRyPXN0cmNocihsaW5lcHRyLCAnOycpOyAvKiBmaXJzdCwgZmluZCBhIHNlbWljb2xvbiAqLwoKICAgIHdoaWxlKCpsaW5lcHRyICYmIGlzc3BhY2UoKGludCkqbGluZXB0cikpCiAgICAgIGxpbmVwdHIrKzsKCiAgICBwdHIgPSBsaW5lcHRyOwogICAgZG8gewogICAgICAvKiB3ZSBoYXZlIGEgPHdoYXQ+PTx0aGlzPiBwYWlyIG9yIGEgJ3NlY3VyZScgd29yZCBoZXJlICovCiAgICAgIHNlcCA9IHN0cmNocihwdHIsICc9Jyk7CiAgICAgIGlmKHNlcCAmJiAoIXNlbWlwdHIgfHwgKHNlbWlwdHI+c2VwKSkgKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBUaGVyZSBpcyBhID0gc2lnbiBhbmQgaWYgdGhlcmUgd2FzIGEgc2VtaWNvbG9uIHRvbywgd2hpY2ggbWFrZSBzdXJlCiAgICAgICAgICogdGhhdCB0aGUgc2VtaWNvbG9uIGNvbWVzIF9hZnRlcl8gdGhlIGVxdWFsIHNpZ24uCiAgICAgICAgICovCgogICAgICAgIG5hbWVbMF09d2hhdFswXT0wOyAvKiBpbml0IHRoZSBidWZmZXJzICovCiAgICAgICAgaWYoMSA8PSBzc2NhbmYocHRyLCAiJSIgTUFYX05BTUVfVFhUICJbXjs9XT0lIgogICAgICAgICAgICAgICAgICAgICAgIE1BWF9DT09LSUVfTElORV9UWFQgIlteO1xyXG5dIiwKICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB3aGF0KSkgewogICAgICAgICAgLyogdGhpcyBpcyBhIDxuYW1lPj08d2hhdD4gcGFpciAqLwoKICAgICAgICAgIGNoYXIgKndoYXRwdHI7CgogICAgICAgICAgLyogU3RyaXAgb2ZmIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgJ3doYXQnICovCiAgICAgICAgICBpbnQgbGVuPXN0cmxlbih3aGF0KTsKICAgICAgICAgIHdoaWxlKGxlbiAmJiBpc3NwYWNlKChpbnQpd2hhdFtsZW4tMV0pKSB7CiAgICAgICAgICAgIHdoYXRbbGVuLTFdPTA7CiAgICAgICAgICAgIGxlbi0tOwogICAgICAgICAgfQoKICAgICAgICAgIC8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlICd3aGF0JyAqLwogICAgICAgICAgd2hhdHB0cj13aGF0OwogICAgICAgICAgd2hpbGUoaXNzcGFjZSgoaW50KSp3aGF0cHRyKSkgewogICAgICAgICAgICB3aGF0cHRyKys7CiAgICAgICAgICB9CgogICAgICAgICAgaWYoc3RyZXF1YWwoInBhdGgiLCBuYW1lKSkgewogICAgICAgICAgICBjby0+cGF0aD1zdHJkdXAod2hhdHB0cik7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmKHN0cmVxdWFsKCJkb21haW4iLCBuYW1lKSkgewogICAgICAgICAgICBjby0+ZG9tYWluPXN0cmR1cCh3aGF0cHRyKTsKICAgICAgICAgICAgY28tPmZpZWxkMT0gKHdoYXRwdHJbMF09PScuJyk/MjoxOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZihzdHJlcXVhbCgidmVyc2lvbiIsIG5hbWUpKSB7CiAgICAgICAgICAgIGNvLT52ZXJzaW9uPXN0cmR1cCh3aGF0cHRyKTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYoc3RyZXF1YWwoIm1heC1hZ2UiLCBuYW1lKSkgewogICAgICAgICAgICAvKiBEZWZpbmVkIGluIFJGQzIxMDk6CgogICAgICAgICAgICAgICBPcHRpb25hbC4gIFRoZSBNYXgtQWdlIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsaWZldGltZSBvZiB0aGUKICAgICAgICAgICAgICAgY29va2llLCBpbiBzZWNvbmRzLiAgVGhlIGRlbHRhLXNlY29uZHMgdmFsdWUgaXMgYSBkZWNpbWFsIG5vbi0KICAgICAgICAgICAgICAgbmVnYXRpdmUgaW50ZWdlci4gIEFmdGVyIGRlbHRhLXNlY29uZHMgc2Vjb25kcyBlbGFwc2UsIHRoZQogICAgICAgICAgICAgICBjbGllbnQgc2hvdWxkIGRpc2NhcmQgdGhlIGNvb2tpZS4gIEEgdmFsdWUgb2YgemVybyBtZWFucyB0aGUKICAgICAgICAgICAgICAgY29va2llIHNob3VsZCBiZSBkaXNjYXJkZWQgaW1tZWRpYXRlbHkuCgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY28tPm1heGFnZSA9IHN0cmR1cCh3aGF0cHRyKTsKICAgICAgICAgICAgY28tPmV4cGlyZXMgPQogICAgICAgICAgICAgIGF0b2koKCpjby0+bWF4YWdlPT0nXCInKT8mY28tPm1heGFnZVsxXTomY28tPm1heGFnZVswXSkgKyBub3c7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmKHN0cmVxdWFsKCJleHBpcmVzIiwgbmFtZSkpIHsKICAgICAgICAgICAgY28tPmV4cGlyZXN0cj1zdHJkdXAod2hhdHB0cik7CiAgICAgICAgICAgIGNvLT5leHBpcmVzID0gY3VybF9nZXRkYXRlKHdoYXQsICZub3cpOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZighY28tPm5hbWUpIHsKICAgICAgICAgICAgY28tPm5hbWUgPSBzdHJkdXAobmFtZSk7CiAgICAgICAgICAgIGNvLT52YWx1ZSA9IHN0cmR1cCh3aGF0cHRyKTsKICAgICAgICAgIH0KICAgICAgICAgIC8qCiAgICAgICAgICAgIGVsc2UgdGhpcyBpcyB0aGUgc2Vjb25kIChvciBtb3JlKSBuYW1lIHdlIGRvbid0IGtub3cKICAgICAgICAgICAgYWJvdXQhICovCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgLyogdGhpcyBpcyBhbiAiaWxsZWdhbCIgPHdoYXQ+PTx0aGlzPiBwYWlyICovCiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGlmKHNzY2FuZihwdHIsICIlIiBNQVhfQ09PS0lFX0xJTkVfVFhUICJbXjtcclxuXSIsCiAgICAgICAgICAgICAgICAgIHdoYXQpKSB7CiAgICAgICAgICBpZihzdHJlcXVhbCgic2VjdXJlIiwgd2hhdCkpCiAgICAgICAgICAgIGNvLT5zZWN1cmUgPSBUUlVFOwogICAgICAgICAgLyogZWxzZSwKICAgICAgICAgICAgIHVuc3VwcG9ydGVkIGtleXdvcmQgd2l0aG91dCBhc3NpZ24hICovCgogICAgICAgIH0KICAgICAgfQogICAgICBpZighc2VtaXB0ciB8fCAhKnNlbWlwdHIpIHsKICAgICAgICAvKiB3ZSBhbHJlYWR5IGtub3cgdGhlcmUgYXJlIG5vIG1vcmUgY29va2llcyAqLwogICAgICAgIHNlbWlwdHIgPSBOVUxMOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICBwdHI9c2VtaXB0cisxOwogICAgICB3aGlsZShwdHIgJiYgKnB0ciAmJiBpc3NwYWNlKChpbnQpKnB0cikpCiAgICAgICAgcHRyKys7CiAgICAgIHNlbWlwdHI9c3RyY2hyKHB0ciwgJzsnKTsgLyogbm93LCBmaW5kIHRoZSBuZXh0IHNlbWljb2xvbiAqLwoKICAgICAgaWYoIXNlbWlwdHIgJiYgKnB0cikKICAgICAgICAvKiBUaGVyZSBhcmUgbm8gbW9yZSBzZW1pY29sb25zLCBidXQgdGhlcmUncyBhIGZpbmFsIG5hbWU9dmFsdWUgcGFpcgogICAgICAgICAgIGNvbWluZyB1cCAqLwogICAgICAgIHNlbWlwdHI9c3RyY2hyKHB0ciwgJ1wwJyk7CiAgICB9IHdoaWxlKHNlbWlwdHIpOwoKICAgIGlmKE5VTEwgPT0gY28tPm5hbWUpIHsKICAgICAgLyogd2UgZGlkbid0IGdldCBhIGNvb2tpZSBuYW1lLCB0aGlzIGlzIGFuIGlsbGVnYWwgbGluZSwgYmFpbCBvdXQgKi8KICAgICAgaWYoY28tPmRvbWFpbikKICAgICAgICBmcmVlKGNvLT5kb21haW4pOwogICAgICBpZihjby0+cGF0aCkKICAgICAgICBmcmVlKGNvLT5wYXRoKTsKICAgICAgaWYoY28tPm5hbWUpCiAgICAgICAgZnJlZShjby0+bmFtZSk7CiAgICAgIGlmKGNvLT52YWx1ZSkKICAgICAgICBmcmVlKGNvLT52YWx1ZSk7CiAgICAgIGZyZWUoY28pOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpZihOVUxMID09IGNvLT5kb21haW4pCiAgICAgIC8qIG5vIGRvbWFpbiBnaXZlbiBpbiB0aGUgaGVhZGVyIGxpbmUsIHNldCB0aGUgZGVmYXVsdCBub3cgKi8KICAgICAgY28tPmRvbWFpbj1kb21haW4/c3RyZHVwKGRvbWFpbik6TlVMTDsKICB9CiAgZWxzZSB7CiAgICAvKiBUaGlzIGxpbmUgaXMgTk9UIGEgSFRUUCBoZWFkZXIgc3R5bGUgbGluZSwgd2UgZG8gb2ZmZXIgc3VwcG9ydCBmb3IKICAgICAgIHJlYWRpbmcgdGhlIG9kZCBuZXRzY2FwZSBjb29raWVzLWZpbGUgZm9ybWF0IGhlcmUgKi8KICAgIGNoYXIgKmZpcnN0cHRyOwogICAgY2hhciAqdG9rX2J1ZjsKICAgIGludCBmaWVsZHM7CgogICAgaWYobGluZXB0clswXT09JyMnKSB7CiAgICAgIC8qIGRvbid0IGV2ZW4gdHJ5IHRoZSBjb21tZW50cyAqLwogICAgICBmcmVlKGNvKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICAvKiBzdHJpcCBvZmYgdGhlIHBvc3NpYmxlIGVuZC1vZi1saW5lIGNoYXJhY3RlcnMgKi8KICAgIHB0cj1zdHJjaHIobGluZXB0ciwgJ1xyJyk7CiAgICBpZihwdHIpCiAgICAgICpwdHI9MDsgLyogY2xlYXIgaXQgKi8KICAgIHB0cj1zdHJjaHIobGluZXB0ciwgJ1xuJyk7CiAgICBpZihwdHIpCiAgICAgICpwdHI9MDsgLyogY2xlYXIgaXQgKi8KCiAgICBmaXJzdHB0cj1zdHJ0b2tfcihsaW5lcHRyLCAiXHQiLCAmdG9rX2J1Zik7IC8qIGZpcnN0IHRva2VuaXplIGl0IG9uIHRoZSBUQUIgKi8KCiAgICAvKiBIZXJlJ3MgYSBxdWljayBjaGVjayB0byBlbGltaW5hdGUgbm9ybWFsIEhUVFAtaGVhZGVycyBmcm9tIHRoaXMgKi8KICAgIGlmKCFmaXJzdHB0ciB8fCBzdHJjaHIoZmlyc3RwdHIsICc6JykpIHsKICAgICAgZnJlZShjbyk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIC8qIE5vdyBsb29wIHRocm91Z2ggdGhlIGZpZWxkcyBhbmQgaW5pdCB0aGUgc3RydWN0IHdlIGFscmVhZHkgaGF2ZQogICAgICAgYWxsb2NhdGVkICovCiAgICBmb3IocHRyPWZpcnN0cHRyLCBmaWVsZHM9MDsgcHRyOyBwdHI9c3RydG9rX3IoTlVMTCwgIlx0IiwgJnRva19idWYpLCBmaWVsZHMrKykgewogICAgICBzd2l0Y2goZmllbGRzKSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBjby0+ZG9tYWluID0gc3RyZHVwKHB0cik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMToKICAgICAgICAvKiBUaGlzIGZpZWxkIGdvdCBpdHMgZXhwbGFuYXRpb24gb24gdGhlIDIzcmQgb2YgTWF5IDIwMDEgYnkKICAgICAgICAgICBBbmRy6XMgR2FyY+1hOgoKICAgICAgICAgICBmbGFnOiBBIFRSVUUvRkFMU0UgdmFsdWUgaW5kaWNhdGluZyBpZiBhbGwgbWFjaGluZXMgd2l0aGluIGEgZ2l2ZW4KICAgICAgICAgICBkb21haW4gY2FuIGFjY2VzcyB0aGUgdmFyaWFibGUuIFRoaXMgdmFsdWUgaXMgc2V0IGF1dG9tYXRpY2FsbHkgYnkKICAgICAgICAgICB0aGUgYnJvd3NlciwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSB5b3Ugc2V0IGZvciB0aGUgZG9tYWluLgoKICAgICAgICAgICBBcyBmYXIgYXMgSSBjYW4gc2VlLCBpdCBpcyBzZXQgdG8gdHJ1ZSB3aGVuIHRoZSBjb29raWUgc2F5cwogICAgICAgICAgIC5kb21haW4uY29tIGFuZCB0byBmYWxzZSB3aGVuIHRoZSBkb21haW4gaXMgY29tcGxldGUgd3d3LmRvbWFpbi5jb20KCiAgICAgICAgICAgV2UgZG9uJ3QgY3VycmVudGx5IHRha2UgYWR2YW50YWdlIG9mIHRoaXMga25vd2xlZGdlLgogICAgICAgICovCiAgICAgICAgY28tPmZpZWxkMT1zdHJlcXVhbChwdHIsICJUUlVFIikrMTsgLyogc3RvcmUgaW5mb3JtYXRpb24gKi8KICAgICAgICBicmVhazsKICAgICAgY2FzZSAyOgogICAgICAgIC8qIEl0IHR1cm5zIG91dCwgdGhhdCBzb21ldGltZXMgdGhlIGZpbGUgZm9ybWF0IGFsbG93cyB0aGUgcGF0aAogICAgICAgICAgIGZpZWxkIHRvIHJlbWFpbiBub3QgZmlsbGVkIGluLCB3ZSB0cnkgdG8gZGV0ZWN0IHRoaXMgYW5kIHdvcmsKICAgICAgICAgICBhcm91bmQgaXQhIEFuZHLpcyBHYXJj7WEgbWFkZSB1cyBhd2FyZSBvZiB0aGlzLi4uICovCiAgICAgICAgaWYgKHN0cmNtcCgiVFJVRSIsIHB0cikgJiYgc3RyY21wKCJGQUxTRSIsIHB0cikpIHsKICAgICAgICAgIC8qIG9ubHkgaWYgdGhlIHBhdGggZG9lc24ndCBsb29rIGxpa2UgYSBib29sZWFuIG9wdGlvbiEgKi8KICAgICAgICAgIGNvLT5wYXRoID0gc3RyZHVwKHB0cik7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLyogdGhpcyBkb2Vzbid0IGxvb2sgbGlrZSBhIHBhdGgsIG1ha2Ugb25lIHVwISAqLwogICAgICAgIGNvLT5wYXRoID0gc3RyZHVwKCIvIik7CiAgICAgICAgZmllbGRzKys7IC8qIGFkZCBhIGZpZWxkIGFuZCBmYWxsIGRvd24gdG8gc2VjdXJlICovCiAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KICAgICAgY2FzZSAzOgogICAgICAgIGNvLT5zZWN1cmUgPSBzdHJlcXVhbChwdHIsICJUUlVFIik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgNDoKICAgICAgICBjby0+ZXhwaXJlcyA9IGF0b2kocHRyKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA1OgogICAgICAgIGNvLT5uYW1lID0gc3RyZHVwKHB0cik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgNjoKICAgICAgICBjby0+dmFsdWUgPSBzdHJkdXAocHRyKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQoKICAgIGlmKDcgIT0gZmllbGRzKSB7CiAgICAgIC8qIHdlIGRpZCBub3QgZmluZCB0aGUgc3VmZmljaWVudCBudW1iZXIgb2YgZmllbGRzIHRvIHJlY29nbml6ZSB0aGlzCiAgICAgICAgIGFzIGEgdmFsaWQgbGluZSwgYWJvcnQgYW5kIGdvIGhvbWUgKi8KICAgICAgZnJlZV9jb29raWVtZXNzKGNvKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogIH0KCiAgaWYoIWMtPnJ1bm5pbmcgJiYgICAgLyogcmVhZCBmcm9tIGEgZmlsZSAqLwogICAgIGMtPm5ld3Nlc3Npb24gJiYgIC8qIGNsZWFuIHNlc3Npb24gY29va2llcyAqLwogICAgICFjby0+ZXhwaXJlcykgeyAgIC8qIHRoaXMgaXMgYSBzZXNzaW9uIGNvb2tpZSBzaW5jZSBpdCBkb2Vzbid0IGV4cGlyZSEgKi8KICAgIGZyZWVfY29va2llbWVzcyhjbyk7CiAgICByZXR1cm4gTlVMTDsKICB9CgogIGNvLT5saXZlY29va2llID0gYy0+cnVubmluZzsKCiAgLyogbm93LCB3ZSBoYXZlIHBhcnNlZCB0aGUgaW5jb21pbmcgbGluZSwgd2UgbXVzdCBub3cgY2hlY2sgaWYgdGhpcwogICAgIHN1cGVyY2VlZHMgYW4gYWxyZWFkeSBleGlzdGluZyBjb29raWUsIHdoaWNoIGl0IG1heSBpZiB0aGUgcHJldmlvdXMgaGF2ZQogICAgIHRoZSBzYW1lIGRvbWFpbiBhbmQgcGF0aCBhcyB0aGlzICovCgogIGNsaXN0ID0gYy0+Y29va2llczsKICByZXBsYWNlX29sZCA9IEZBTFNFOwogIHdoaWxlKGNsaXN0KSB7CiAgICBpZihzdHJlcXVhbChjbGlzdC0+bmFtZSwgY28tPm5hbWUpKSB7CiAgICAgIC8qIHRoZSBuYW1lcyBhcmUgaWRlbnRpY2FsICovCgogICAgICBpZihjbGlzdC0+ZG9tYWluICYmIGNvLT5kb21haW4pIHsKICAgICAgICBpZihzdHJlcXVhbChjbGlzdC0+ZG9tYWluLCBjby0+ZG9tYWluKSB8fAogICAgICAgICAgIChjbGlzdC0+ZG9tYWluWzBdPT0nLicgJiYKICAgICAgICAgICAgc3RyZXF1YWwoJihjbGlzdC0+ZG9tYWluWzFdKSwgY28tPmRvbWFpbikpIHx8CiAgICAgICAgICAgKGNvLT5kb21haW5bMF09PScuJyAmJgogICAgICAgICAgICBzdHJlcXVhbChjbGlzdC0+ZG9tYWluLCAmKGNvLT5kb21haW5bMV0pKSkgKQogICAgICAgICAgLyogVGhlIGRvbWFpbnMgYXJlIGlkZW50aWNhbCwgb3IgYXQgbGVhc3QgaWRlbnRpY2FsIGlmIHlvdSBza2lwIHRoZQogICAgICAgICAgICAgcHJlY2VlZGluZyBkb3QgKi8KICAgICAgICAgIHJlcGxhY2Vfb2xkPVRSVUU7CiAgICAgIH0KICAgICAgZWxzZSBpZighY2xpc3QtPmRvbWFpbiAmJiAhY28tPmRvbWFpbikKICAgICAgICByZXBsYWNlX29sZCA9IFRSVUU7CgogICAgICBpZihyZXBsYWNlX29sZCkgewogICAgICAgIC8qIHRoZSBkb21haW5zIHdlcmUgaWRlbnRpY2FsICovCgogICAgICAgIGlmKGNsaXN0LT5wYXRoICYmIGNvLT5wYXRoKSB7CiAgICAgICAgICBpZihzdHJlcXVhbChjbGlzdC0+cGF0aCwgY28tPnBhdGgpKSB7CiAgICAgICAgICAgIHJlcGxhY2Vfb2xkID0gVFJVRTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgICAgcmVwbGFjZV9vbGQgPSBGQUxTRTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZighY2xpc3QtPnBhdGggJiYgIWNvLT5wYXRoKQogICAgICAgICAgcmVwbGFjZV9vbGQgPSBUUlVFOwogICAgICAgIGVsc2UKICAgICAgICAgIHJlcGxhY2Vfb2xkID0gRkFMU0U7CiAgICAgICAgCiAgICAgIH0KCiAgICAgIGlmKHJlcGxhY2Vfb2xkICYmICFjby0+bGl2ZWNvb2tpZSAmJiBjbGlzdC0+bGl2ZWNvb2tpZSkgewogICAgICAgIC8qIEJvdGggY29va2llcyBtYXRjaGVkIGZpbmUsIGV4Y2VwdCB0aGF0IHRoZSBhbHJlYWR5IHByZXNlbnQKICAgICAgICAgICBjb29raWUgaXMgImxpdmUiLCB3aGljaCBtZWFucyBpdCB3YXMgc2V0IGZyb20gYSBoZWFkZXIsIHdoaWxlCiAgICAgICAgICAgdGhlIG5ldyBvbmUgaXNuJ3QgImxpdmUiIGFuZCB0aHVzIG9ubHkgcmVhZCBmcm9tIGEgZmlsZS4gV2UgbGV0CiAgICAgICAgICAgbGl2ZSBjb29raWVzIHN0YXkgYWxpdmUgKi8KCiAgICAgICAgLyogRnJlZSB0aGUgbmV3Y29tZXIgYW5kIGdldCBvdXQgb2YgaGVyZSEgKi8KICAgICAgICBpZihjby0+ZG9tYWluKQogICAgICAgICAgZnJlZShjby0+ZG9tYWluKTsKICAgICAgICBpZihjby0+cGF0aCkKICAgICAgICAgIGZyZWUoY28tPnBhdGgpOwogICAgICAgIGlmKGNvLT5uYW1lKQogICAgICAgICAgZnJlZShjby0+bmFtZSk7CiAgICAgICAgaWYoY28tPnZhbHVlKQogICAgICAgICAgZnJlZShjby0+dmFsdWUpOwoKICAgICAgICBmcmVlKGNvKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgfQoKICAgICAgaWYocmVwbGFjZV9vbGQpIHsKICAgICAgICBjby0+bmV4dCA9IGNsaXN0LT5uZXh0OyAvKiBnZXQgdGhlIG5leHQtcG9pbnRlciBmaXJzdCAqLwoKICAgICAgICAvKiB0aGVuIGZyZWUgYWxsIHRoZSBvbGQgcG9pbnRlcnMgKi8KICAgICAgICBpZihjbGlzdC0+bmFtZSkKICAgICAgICAgIGZyZWUoY2xpc3QtPm5hbWUpOwogICAgICAgIGlmKGNsaXN0LT52YWx1ZSkKICAgICAgICAgIGZyZWUoY2xpc3QtPnZhbHVlKTsKICAgICAgICBpZihjbGlzdC0+ZG9tYWluKQogICAgICAgICAgZnJlZShjbGlzdC0+ZG9tYWluKTsKICAgICAgICBpZihjbGlzdC0+cGF0aCkKICAgICAgICAgIGZyZWUoY2xpc3QtPnBhdGgpOwogICAgICAgIGlmKGNsaXN0LT5leHBpcmVzdHIpCiAgICAgICAgICBmcmVlKGNsaXN0LT5leHBpcmVzdHIpOwoKICAgICAgICBpZihjbGlzdC0+dmVyc2lvbikKICAgICAgICAgIGZyZWUoY2xpc3QtPnZlcnNpb24pOwogICAgICAgIGlmKGNsaXN0LT5tYXhhZ2UpCiAgICAgICAgICBmcmVlKGNsaXN0LT5tYXhhZ2UpOwoKICAgICAgICAqY2xpc3QgPSAqY287ICAvKiB0aGVuIHN0b3JlIGFsbCB0aGUgbmV3IGRhdGEgKi8KCiAgICAgICAgZnJlZShjbyk7ICAgLyogZnJlZSB0aGUgbmV3bHkgYWxsb2NlZCBtZW1vcnkgKi8KICAgICAgICBjbyA9IGNsaXN0OyAvKiBwb2ludCB0byB0aGUgcHJldmlvdXMgc3RydWN0IGluc3RlYWQgKi8KCiAgICAgICAgLyogV2UgaGF2ZSByZXBsYWNlZCBhIGNvb2tpZSwgbm93IHNraXAgdGhlIHJlc3Qgb2YgdGhlIGxpc3QgYnV0CiAgICAgICAgICAgbWFrZSBzdXJlIHRoZSAnbGFzdGMnIHBvaW50ZXIgaXMgcHJvcGVybHkgc2V0ICovCiAgICAgICAgZG8gewogICAgICAgICAgbGFzdGMgPSBjbGlzdDsKICAgICAgICAgIGNsaXN0ID0gY2xpc3QtPm5leHQ7CiAgICAgICAgfSB3aGlsZShjbGlzdCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGxhc3RjID0gY2xpc3Q7CiAgICBjbGlzdCA9IGNsaXN0LT5uZXh0OwogIH0KCiAgaWYoIXJlcGxhY2Vfb2xkKSB7CiAgICAvKiB0aGVuIG1ha2UgdGhlIGxhc3QgaXRlbSBwb2ludCBvbiB0aGlzIG5ldyBvbmUgKi8KICAgIGlmKGxhc3RjKQogICAgICBsYXN0Yy0+bmV4dCA9IGNvOwogICAgZWxzZQogICAgICBjLT5jb29raWVzID0gY287CiAgfQoKICBjLT5udW1jb29raWVzKys7IC8qIG9uZSBtb3JlIGNvb2tpZSBpbiB0aGUgamFyICovCgogIHJldHVybiBjbzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2luaXQoKQogKgogKiBJbml0cyBhIGNvb2tpZSBzdHJ1Y3QgdG8gcmVhZCBkYXRhIGZyb20gYSBsb2NhbCBmaWxlLiBUaGlzIGlzIGFsd2F5cwogKiBjYWxsZWQgYmVmb3JlIGFueSBjb29raWVzIGFyZSBzZXQuIEZpbGUgbWF5IGJlIE5VTEwuCiAqCiAqIElmICduZXdzZXNzaW9uJyBpcyBUUlVFLCBkaXNjYXJkIGFsbCAic2Vzc2lvbiBjb29raWVzIiBvbiByZWFkIGZyb20gZmlsZS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBDb29raWVJbmZvICpDdXJsX2Nvb2tpZV9pbml0KGNoYXIgKmZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDb29raWVJbmZvICppbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmV3c2Vzc2lvbikKewogIGNoYXIgbGluZVtNQVhfQ09PS0lFX0xJTkVdOwogIHN0cnVjdCBDb29raWVJbmZvICpjOwogIEZJTEUgKmZwOwogIGJvb2wgZnJvbWZpbGU9VFJVRTsKICAKICBpZihOVUxMID09IGluYykgewogICAgLyogd2UgZGlkbid0IGdldCBhIHN0cnVjdCwgY3JlYXRlIG9uZSAqLwogICAgYyA9IChzdHJ1Y3QgQ29va2llSW5mbyAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IENvb2tpZUluZm8pKTsKICAgIGlmKCFjKQogICAgICByZXR1cm4gTlVMTDsgLyogZmFpbGVkIHRvIGdldCBtZW1vcnkgKi8KICAgIG1lbXNldChjLCAwLCBzaXplb2Yoc3RydWN0IENvb2tpZUluZm8pKTsKICAgIGMtPmZpbGVuYW1lID0gc3RyZHVwKGZpbGU/ZmlsZToibm9uZSIpOyAvKiBjb3B5IHRoZSBuYW1lIGp1c3QgaW4gY2FzZSAqLwogIH0KICBlbHNlIHsKICAgIC8qIHdlIGdvdCBhbiBhbHJlYWR5IGV4aXN0aW5nIG9uZSwgdXNlIHRoYXQgKi8KICAgIGMgPSBpbmM7CiAgfQogIGMtPnJ1bm5pbmcgPSBGQUxTRTsgLyogdGhpcyBpcyBub3QgcnVubmluZywgdGhpcyBpcyBpbml0ICovCgogIGlmKGZpbGUgJiYgc3RyZXF1YWwoZmlsZSwgIi0iKSkgewogICAgZnAgPSBzdGRpbjsKICAgIGZyb21maWxlPUZBTFNFOwogIH0KICBlbHNlCiAgICBmcCA9IGZpbGU/Zm9wZW4oZmlsZSwgInIiKTpOVUxMOwoKICBjLT5uZXdzZXNzaW9uID0gbmV3c2Vzc2lvbjsgLyogbmV3IHNlc3Npb24/ICovCgogIGlmKGZwKSB7CiAgICBjaGFyICpsaW5lcHRyOwogICAgYm9vbCBoZWFkZXJsaW5lOwogICAgd2hpbGUoZmdldHMobGluZSwgTUFYX0NPT0tJRV9MSU5FLCBmcCkpIHsKICAgICAgaWYoY2hlY2twcmVmaXgoIlNldC1Db29raWU6IiwgbGluZSkpIHsKICAgICAgICAvKiBUaGlzIGlzIGEgY29va2llIGxpbmUsIGdldCBpdCEgKi8KICAgICAgICBsaW5lcHRyPSZsaW5lWzExXTsKICAgICAgICBoZWFkZXJsaW5lPVRSVUU7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgbGluZXB0cj1saW5lOwogICAgICAgIGhlYWRlcmxpbmU9RkFMU0U7CiAgICAgIH0KICAgICAgd2hpbGUoKmxpbmVwdHIgJiYgaXNzcGFjZSgoaW50KSpsaW5lcHRyKSkKICAgICAgICBsaW5lcHRyKys7CgogICAgICBDdXJsX2Nvb2tpZV9hZGQoYywgaGVhZGVybGluZSwgbGluZXB0ciwgTlVMTCk7CiAgICB9CiAgICBpZihmcm9tZmlsZSkKICAgICAgZmNsb3NlKGZwKTsKICB9CgogIGMtPnJ1bm5pbmcgPSBUUlVFOyAgICAgICAgICAvKiBub3csIHdlJ3JlIHJ1bm5pbmcgKi8KCiAgcmV0dXJuIGM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9nZXRsaXN0KCkKICoKICogRm9yIGEgZ2l2ZW4gaG9zdCBhbmQgcGF0aCwgcmV0dXJuIGEgbGlua2VkIGxpc3Qgb2YgY29va2llcyB0aGF0IHRoZQogKiBjbGllbnQgc2hvdWxkIHNlbmQgdG8gdGhlIHNlcnZlciBpZiB1c2VkIG5vdy4gVGhlIHNlY3VyZSBib29sZWFuIGluZm9ybXMKICogdGhlIGNvb2tpZSBpZiBhIHNlY3VyZSBjb25uZWN0aW9uIGlzIGFjaGlldmVkIG9yIG5vdC4KICoKICogSXQgc2hhbGwgb25seSByZXR1cm4gY29va2llcyB0aGF0IGhhdmVuJ3QgZXhwaXJlZC4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdHJ1Y3QgQ29va2llICpDdXJsX2Nvb2tpZV9nZXRsaXN0KHN0cnVjdCBDb29raWVJbmZvICpjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmhvc3QsIGNoYXIgKnBhdGgsIGJvb2wgc2VjdXJlKQp7CiAgIHN0cnVjdCBDb29raWUgKm5ld2NvOwogICBzdHJ1Y3QgQ29va2llICpjbzsKICAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CiAgIGludCBob3N0bGVuPXN0cmxlbihob3N0KTsKICAgaW50IGRvbWxlbjsKCiAgIHN0cnVjdCBDb29raWUgKm1haW5jbz1OVUxMOwoKICAgaWYoIWMgfHwgIWMtPmNvb2tpZXMpCiAgICAgIHJldHVybiBOVUxMOyAvKiBubyBjb29raWUgc3RydWN0IG9yIG5vIGNvb2tpZXMgaW4gdGhlIHN0cnVjdCAqLwoKICAgY28gPSBjLT5jb29raWVzOwoKICAgd2hpbGUoY28pIHsKICAgICAgLyogb25seSBwcm9jZXNzIHRoaXMgY29va2llIGlmIGl0IGlzIG5vdCBleHBpcmVkIG9yIGhhZCBubyBleHBpcmUKCSBkYXRlIEFORCB0aGF0IGlmIHRoZSBjb29raWUgcmVxdWlyZXMgd2UncmUgc2VjdXJlIHdlIG11c3Qgb25seQoJIGNvbnRpbnVlIGlmIHdlIGFyZSEgKi8KICAgICBpZiggKGNvLT5leHBpcmVzPD0wIHx8IChjby0+ZXhwaXJlcz4gbm93KSkgJiYKICAgICAgICAgKGNvLT5zZWN1cmU/c2VjdXJlOlRSVUUpICkgewoKCSAvKiBub3cgY2hlY2sgaWYgdGhlIGRvbWFpbiBpcyBjb3JyZWN0ICovCgkgZG9tbGVuPWNvLT5kb21haW4/c3RybGVuKGNvLT5kb21haW4pOjA7CgkgaWYoIWNvLT5kb21haW4gfHwKCSAgICAoKGRvbWxlbjw9aG9zdGxlbikgJiYKCSAgICAgc3RyZXF1YWwoaG9zdCsoaG9zdGxlbi1kb21sZW4pLCBjby0+ZG9tYWluKSkgKSB7CgkgICAgLyogdGhlIHJpZ2h0IHBhcnQgb2YgdGhlIGhvc3QgbWF0Y2hlcyB0aGUgZG9tYWluIHN0dWZmIGluIHRoZQoJICAgICAgIGNvb2tpZSBkYXRhICovCgoJICAgIC8qIG5vdyBjaGVjayB0aGUgbGVmdCBwYXJ0IG9mIHRoZSBwYXRoIHdpdGggdGhlIGNvb2tpZXMgcGF0aAoJICAgICAgIHJlcXVpcmVtZW50ICovCiAgICAgICAgICAgaWYoIWNvLT5wYXRoIHx8CiAgICAgICAgICAgICAgY2hlY2twcmVmaXgoY28tPnBhdGgsIHBhdGgpICkgewoKCSAgICAgICAvKiBhbmQgbm93LCB3ZSBrbm93IHRoaXMgaXMgYSBtYXRjaCBhbmQgd2Ugc2hvdWxkIGNyZWF0ZSBhbgoJCSAgZW50cnkgZm9yIHRoZSByZXR1cm4tbGlua2VkLWxpc3QgKi8KCgkgICAgICAgbmV3Y28gPSAoc3RydWN0IENvb2tpZSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IENvb2tpZSkpOwoJICAgICAgIGlmKG5ld2NvKSB7CgkJICAvKiBmaXJzdCwgY29weSB0aGUgd2hvbGUgc291cmNlIGNvb2tpZTogKi8KCQkgIG1lbWNweShuZXdjbywgY28sIHNpemVvZihzdHJ1Y3QgQ29va2llKSk7CgoJCSAgLyogdGhlbiBtb2RpZnkgb3VyIG5leHQgKi8KCQkgIG5ld2NvLT5uZXh0ID0gbWFpbmNvOwoKCQkgIC8qIHBvaW50IHRoZSBtYWluIHRvIHVzICovCgkJICBtYWluY28gPSBuZXdjbzsKCSAgICAgICB9CgkgICAgfQoJIH0KICAgICAgfQogICAgICBjbyA9IGNvLT5uZXh0OwogICB9CgogICByZXR1cm4gbWFpbmNvOyAvKiByZXR1cm4gdGhlIG5ldyBsaXN0ICovCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQ3VybF9jb29raWVfZnJlZWxpc3QoKQogKgogKiBGcmVlIGEgbGlzdCBvZiBjb29raWVzIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgQ3VybF9jb29raWVfZ2V0bGlzdCgpOwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQgQ3VybF9jb29raWVfZnJlZWxpc3Qoc3RydWN0IENvb2tpZSAqY28pCnsKICAgc3RydWN0IENvb2tpZSAqbmV4dDsKICAgaWYoY28pIHsKICAgICAgd2hpbGUoY28pIHsKCSBuZXh0ID0gY28tPm5leHQ7CgkgZnJlZShjbyk7IC8qIHdlIG9ubHkgZnJlZSB0aGUgc3RydWN0IHNpbmNlIHRoZSAibWVtYmVycyIgYXJlIGFsbAoJCSAgICAgIGp1c3QgY29waWVkISAqLwoJIGNvID0gbmV4dDsKICAgICAgfQogICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9jbGVhbnVwKCkKICoKICogRnJlZSBhICJjb29raWUgb2JqZWN0IiBwcmV2aW91cyBjcmVhdGVkIHdpdGggY29va2llX2luaXQoKS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgQ3VybF9jb29raWVfY2xlYW51cChzdHJ1Y3QgQ29va2llSW5mbyAqYykKewogICBzdHJ1Y3QgQ29va2llICpjbzsKICAgc3RydWN0IENvb2tpZSAqbmV4dDsKICAgaWYoYykgewogICAgICBpZihjLT5maWxlbmFtZSkKCSBmcmVlKGMtPmZpbGVuYW1lKTsKICAgICAgY28gPSBjLT5jb29raWVzOwoKICAgICAgd2hpbGUoY28pIHsKCSBpZihjby0+bmFtZSkKCSAgICBmcmVlKGNvLT5uYW1lKTsKCSBpZihjby0+dmFsdWUpCgkgICAgZnJlZShjby0+dmFsdWUpOwoJIGlmKGNvLT5kb21haW4pCgkgICAgZnJlZShjby0+ZG9tYWluKTsKCSBpZihjby0+cGF0aCkKCSAgICBmcmVlKGNvLT5wYXRoKTsKCSBpZihjby0+ZXhwaXJlc3RyKQoJICAgIGZyZWUoY28tPmV4cGlyZXN0cik7CgoJIGlmKGNvLT52ZXJzaW9uKQoJICAgIGZyZWUoY28tPnZlcnNpb24pOwoJIGlmKGNvLT5tYXhhZ2UpCgkgICAgZnJlZShjby0+bWF4YWdlKTsKCgkgbmV4dCA9IGNvLT5uZXh0OwoJIGZyZWUoY28pOwoJIGNvID0gbmV4dDsKICAgICAgfQogICAgICBmcmVlKGMpOyAvKiBmcmVlIHRoZSBiYXNlIHN0cnVjdCBhcyB3ZWxsICovCiAgIH0KfQoKLyoKICogQ3VybF9jb29raWVfb3V0cHV0KCkKICoKICogV3JpdGVzIGFsbCBpbnRlcm5hbGx5IGtub3duIGNvb2tpZXMgdG8gdGhlIHNwZWNpZmllZCBmaWxlLiBTcGVjaWZ5CiAqICItIiBhcyBmaWxlIG5hbWUgdG8gd3JpdGUgdG8gc3Rkb3V0LgogKgogKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBub24temVybyBvbiB3cml0ZSBmYWlsdXJlLgogKi8KaW50IEN1cmxfY29va2llX291dHB1dChzdHJ1Y3QgQ29va2llSW5mbyAqYywgY2hhciAqZHVtcGhlcmUpCnsKICBzdHJ1Y3QgQ29va2llICpjbzsKICBGSUxFICpvdXQ7CiAgYm9vbCB1c2Vfc3Rkb3V0PUZBTFNFOwoKICBpZigoTlVMTCA9PSBjKSB8fCAoMCA9PSBjLT5udW1jb29raWVzKSkKICAgIC8qIElmIHRoZXJlIGFyZSBubyBrbm93biBjb29raWVzLCB3ZSBkb24ndCB3cml0ZSBvciBldmVuIGNyZWF0ZSBhbnkKICAgICAgIGRlc3RpbmF0aW9uIGZpbGUgKi8KICAgIHJldHVybiAwOwoKICBpZihzdHJlcXVhbCgiLSIsIGR1bXBoZXJlKSkgewogICAgLyogdXNlIHN0ZG91dCAqLwogICAgb3V0ID0gc3Rkb3V0OwogICAgdXNlX3N0ZG91dD1UUlVFOwogIH0KICBlbHNlIHsKICAgIG91dCA9IGZvcGVuKGR1bXBoZXJlLCAidyIpOwogICAgaWYoIW91dCkKICAgICAgcmV0dXJuIDE7IC8qIGZhaWx1cmUgKi8KICB9CgogIGlmKGMpIHsKICAgIGZwdXRzKCIjIE5ldHNjYXBlIEhUVFAgQ29va2llIEZpbGVcbiIKICAgICAgICAgICIjIGh0dHA6Ly93d3cubmV0c2NhcGUuY29tL25ld3NyZWYvc3RkL2Nvb2tpZV9zcGVjLmh0bWxcbiIKICAgICAgICAgICIjIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGxpYmN1cmwhIEVkaXQgYXQgeW91ciBvd24gcmlzay5cblxuIiwKICAgICAgICAgIG91dCk7CiAgICBjbyA9IGMtPmNvb2tpZXM7CiAgICAgCiAgICB3aGlsZShjbykgewogICAgICBmcHJpbnRmKG91dCwKICAgICAgICAgICAgICAiJXNcdCIgLyogZG9tYWluICovCiAgICAgICAgICAgICAgIiVzXHQiIC8qIGZpZWxkMSAqLwogICAgICAgICAgICAgICIlc1x0IiAvKiBwYXRoICovCiAgICAgICAgICAgICAgIiVzXHQiIC8qIHNlY3VyZSAqLwogICAgICAgICAgICAgICIldVx0IiAvKiBleHBpcmVzICovCiAgICAgICAgICAgICAgIiVzXHQiIC8qIG5hbWUgKi8KICAgICAgICAgICAgICAiJXNcbiIsIC8qIHZhbHVlICovCiAgICAgICAgICAgICAgY28tPmRvbWFpbj9jby0+ZG9tYWluOiJ1bmtub3duIiwKICAgICAgICAgICAgICBjby0+ZmllbGQxPT0yPyJUUlVFIjoiRkFMU0UiLAogICAgICAgICAgICAgIGNvLT5wYXRoP2NvLT5wYXRoOiIvIiwKICAgICAgICAgICAgICBjby0+c2VjdXJlPyJUUlVFIjoiRkFMU0UiLAogICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpY28tPmV4cGlyZXMsCiAgICAgICAgICAgICAgY28tPm5hbWUsCiAgICAgICAgICAgICAgY28tPnZhbHVlP2NvLT52YWx1ZToiIik7CgogICAgICBjbz1jby0+bmV4dDsKICAgIH0KICB9CgogIGlmKCF1c2Vfc3Rkb3V0KQogICAgZmNsb3NlKG91dCk7CgogIHJldHVybiAwOwp9CgojaWZkZWYgQ1VSTF9DT09LSUVfREVCVUcKCi8qCiAqIE9uIG15IFNvbGFyaXMgYm94LCB0aGlzIGNvbW1hbmQgbGluZSBidWlsZHMgdGhpcyB0ZXN0IHByb2dyYW06CiAqCiAqIGdjYyAtZyAtbyBjb29rdGVzdCAtRENVUkxfQ09PS0lFX0RFQlVHIC1ESEFWRV9DT05GSUdfSCAtSS4uIC1JLi4vaW5jbHVkZSBjb29raWUuYyBzdHJlcXVhbC5vIGdldGRhdGUubyBtZW1kZWJ1Zy5vIG1wcmludGYubyBzdHJ0b2subyAtbG5zbCAtbHNvY2tldAogKgogKi8KCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewogIHN0cnVjdCBDb29raWVJbmZvICpjPU5VTEw7CiAgaWYoYXJnYz4xKSB7CiAgICBjID0gQ3VybF9jb29raWVfaW5pdChhcmd2WzFdLCBjKTsKICAgIEN1cmxfY29va2llX2FkZChjLCBUUlVFLCAiUEVSU09OQUxJWkU9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOyBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vZnRndzsgc2VjdXJlIik7CiAgICBDdXJsX2Nvb2tpZV9hZGQoYywgVFJVRSwgImZvb2Jhcj15ZXM7IGRvbWFpbj0uaGF4eC5zZTsgcGF0aD0vbG9vc2VyOyIpOwogICAgYyA9IEN1cmxfY29va2llX2luaXQoYXJndlsxXSwgYyk7CgogICAgQ3VybF9jb29raWVfb3V0cHV0KGMpOwogICAgQ3VybF9jb29raWVfY2xlYW51cChjKTsKICAgIHJldHVybiAwOwogIH0KICByZXR1cm4gMTsKfQoKI2VuZGlmCgojZW5kaWYgLyogQ1VSTF9ESVNBQkxFX0hUVFAgKi8KCi8qCiAqIGxvY2FsIHZhcmlhYmxlczoKICogZXZhbDogKGxvYWQtZmlsZSAiLi4vY3VybC1tb2RlLmVsIikKICogZW5kOgogKiB2aW02MDA6IGZkbT1tYXJrZXIKICogdmltOiBldCBzdz0yIHRzPTIgc3RzPTIgdHc9NzgKICovCg==