LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCk0qIE1vZHVsOiAgICAgICAgIGx3bW9uLmMKTSoKTSogQ29udGVudDogICAgICAgTFdNT04gc3BlY2lmaWMgVS1Cb290IGNvbW1hbmRzLgogKgogKiAoQykgQ29weXJpZ2h0IDIwMDEsIDIwMDIKICogREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZwogKiBXb2xmZ2FuZyBEZW5rLCB3ZEBkZW54LmRlCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCkQqIERlc2lnbjogICAgICAgIHdkQGRlbnguZGUKQyogQ29kaW5nOiAgICAgICAgd2RAZGVueC5kZQpWKiBWZXJpZmljYXRpb246ICBkenVAZGVueC5kZQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSGVhZGVyZmlsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPG1wYzh4eC5oPgojaW5jbHVkZSA8Y29tbXByb2MuaD4KI2luY2x1ZGUgPGkyYy5oPgojaW5jbHVkZSA8Y29tbWFuZC5oPgojaW5jbHVkZSA8bWFsbG9jLmg+CiNpbmNsdWRlIDxwb3N0Lmg+CgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgkvKiBmb3Igc3RyZHVwICovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMb2NhbCBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBsb25nIGludCBkcmFtX3NpemUgKGxvbmcgaW50LCBsb25nIGludCAqLCBsb25nIGludCk7CnN0YXRpYyB2b2lkIGtiZF9pbml0ICh2b2lkKTsKc3RhdGljIGludCBjb21wYXJlX21hZ2ljICh1Y2hhciAqa2JkX2RhdGEsIHVjaGFyICpzdHIpOwoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExvY2FsIG1hY3JvcyBhbmQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KI2RlZmluZQlfTk9UX1VTRURfCTB4RkZGRkZGRkYKCiNpZmRlZiBDT05GSUdfTU9ERU1fU1VQUE9SVApzdGF0aWMgaW50IGtleV9wcmVzc2VkKHZvaWQpOwpleHRlcm4gdm9pZCBkaXNhYmxlX3B1dGModm9pZCk7CiNlbmRpZiAvKiBDT05GSUdfTU9ERU1fU1VQUE9SVCAqLwoKLyoKICogNjYgTUh6IFNEUkFNIGFjY2VzcyB1c2luZyBVUE0gQQogKi8KY29uc3QgdWludCBzZHJhbV90YWJsZVtdID0KewojaWYgZGVmaW5lZChDRkdfTUVNT1JZXzc1KSB8fCBkZWZpbmVkKENGR19NRU1PUllfOEUpCgkvKgoJICogU2luZ2xlIFJlYWQuIChPZmZzZXQgMCBpbiBVUE0gUkFNKQoJICovCgkweDFGMERGQzA0LCAweEVFQUZCQzA0LCAweDExQUY3QzA0LCAweEVGQkFGQzAwLAoJMHgxRkY1RkM0NywgLyogbGFzdCAqLwoJLyoKCSAqIFNEUkFNIEluaXRpYWxpemF0aW9uIChvZmZzZXQgNSBpbiBVUE0gUkFNKQoJICoKCSAqIFRoaXMgaXMgbm8gVVBNIGVudHJ5IHBvaW50LiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb24gdXNlcwoJICogdGhlIHJlbWFpbmluZyBzcGFjZSB0byBlc3RhYmxpc2ggYW4gaW5pdGlhbGl6YXRpb24KCSAqIHNlcXVlbmNlLCB3aGljaCBpcyBleGVjdXRlZCBieSBhIFJVTiBjb21tYW5kLgoJICoKCSAqLwoJCSAgICAweDFGRjVGQzM0LCAweEVGRUFCQzM0LCAweDFGQjU3QzM1LCAvKiBsYXN0ICovCgkvKgoJICogQnVyc3QgUmVhZC4gKE9mZnNldCA4IGluIFVQTSBSQU0pCgkgKi8KCTB4MUYwREZDMDQsIDB4RUVBRkJDMDQsIDB4MTBBRjdDMDQsIDB4RjBBRkZDMDAsCgkweEYwQUZGQzAwLCAweEYxQUZGQzAwLCAweEVGQkFGQzAwLCAweDFGRjVGQzQ3LCAvKiBsYXN0ICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qCgkgKiBTaW5nbGUgV3JpdGUuIChPZmZzZXQgMTggaW4gVVBNIFJBTSkKCSAqLwoJMHgxRjJERkMwNCwgMHhFRUFCQkMwMCwgMHgwMUIyN0MwNCwgMHgxRkY1RkM0NywgLyogbGFzdCAqLwoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qCgkgKiBCdXJzdCBXcml0ZS4gKE9mZnNldCAyMCBpbiBVUE0gUkFNKQoJICovCgkweDFGMERGQzA0LCAweEVFQUJCQzAwLCAweDEwQTc3QzAwLCAweEYwQUZGQzAwLAoJMHhGMEFGRkMwMCwgMHhFMUJBRkMwNCwgMHgwMUZGNUZDNDcsIC8qIGxhc3QgKi8KCQkJCQkgICAgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyoKCSAqIFJlZnJlc2ggIChPZmZzZXQgMzAgaW4gVVBNIFJBTSkKCSAqLwoJMHgxRkZEN0M4NCwgMHhGRkZGRkMwNCwgMHhGRkZGRkMwNCwgMHhGRkZGRkMwNCwKCTB4RkZGRkZDODQsIDB4RkZGRkZDMDcsIC8qIGxhc3QgKi8KCQkJCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyoKCSAqIEV4Y2VwdGlvbi4gKE9mZnNldCAzYyBpbiBVUE0gUkFNKQoJICovCgkweDdGRkZGQzA3LCAvKiBsYXN0ICovCgkJICAgIDB4RkZGRkZDRkYsIDB4RkZGRkZDRkYsIDB4RkZGRkZDRkYsCiNlbmRpZgojaWZkZWYgQ0ZHX01FTU9SWV83RQoJLyoKCSAqIFNpbmdsZSBSZWFkLiAoT2Zmc2V0IDAgaW4gVVBNIFJBTSkKCSAqLwoJMHgwRTJEQkMwNCwgMHgxMUFGN0MwNCwgMHhFRkJBRkMwMCwgMHgxRkY1RkM0NywgLyogbGFzdCAqLwoJX05PVF9VU0VEXywKCS8qCgkgKiBTRFJBTSBJbml0aWFsaXphdGlvbiAob2Zmc2V0IDUgaW4gVVBNIFJBTSkKCSAqCgkgKiBUaGlzIGlzIG5vIFVQTSBlbnRyeSBwb2ludC4gVGhlIGZvbGxvd2luZyBkZWZpbml0aW9uIHVzZXMKCSAqIHRoZSByZW1haW5pbmcgc3BhY2UgdG8gZXN0YWJsaXNoIGFuIGluaXRpYWxpemF0aW9uCgkgKiBzZXF1ZW5jZSwgd2hpY2ggaXMgZXhlY3V0ZWQgYnkgYSBSVU4gY29tbWFuZC4KCSAqCgkgKi8KCQkgICAgMHgxRkY1RkMzNCwgMHhFRkVBQkMzNCwgMHgxRkI1N0MzNSwgLyogbGFzdCAqLwoJLyoKCSAqIEJ1cnN0IFJlYWQuIChPZmZzZXQgOCBpbiBVUE0gUkFNKQoJICovCgkweDBFMkRCQzA0LCAweDEwQUY3QzA0LCAweEYwQUZGQzAwLCAweEYwQUZGQzAwLAoJMHhGMUFGRkMwMCwgMHhFRkJBRkMwMCwgMHgxRkY1RkM0NywgLyogbGFzdCAqLwoJCQkJCSAgICBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCgkvKgoJICogU2luZ2xlIFdyaXRlLiAoT2Zmc2V0IDE4IGluIFVQTSBSQU0pCgkgKi8KCTB4MEUyOUJDMDQsIDB4MDFCMjdDMDQsIDB4MUZGNUZDNDcsIC8qIGxhc3QgKi8KCQkJCQkgICAgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCgkvKgoJICogQnVyc3QgV3JpdGUuIChPZmZzZXQgMjAgaW4gVVBNIFJBTSkKCSAqLwoJMHgwRTI5QkMwNCwgMHgxMEE3N0MwMCwgMHhGMEFGRkMwMCwgMHhGMEFGRkMwMCwKCTB4RTFCQUZDMDQsIDB4MUZGNUZDNDcsIC8qIGxhc3QgKi8KCQkJCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qCgkgKiBSZWZyZXNoICAoT2Zmc2V0IDMwIGluIFVQTSBSQU0pCgkgKi8KCTB4MUZGRDdDODQsIDB4RkZGRkZDMDQsIDB4RkZGRkZDMDQsIDB4RkZGRkZDMDQsCgkweEZGRkZGQzg0LCAweEZGRkZGQzA3LCAvKiBsYXN0ICovCgkJCQlfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qCgkgKiBFeGNlcHRpb24uIChPZmZzZXQgM2MgaW4gVVBNIFJBTSkKCSAqLwoJMHg3RkZGRkMwNywgLyogbGFzdCAqLwoJCSAgICAweEZGRkZGQ0ZGLCAweEZGRkZGQ0ZGLCAweEZGRkZGQ0ZGLAojZW5kaWYKfTsKCi8qCiAqIENoZWNrIEJvYXJkIElkZW50aXR5OgogKgogKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpGKiBGdW5jdGlvbjogICAgIGludCBjaGVja2JvYXJkICh2b2lkKSBQKkEqWioKICoKUCogUGFyYW1ldGVyczogICBub25lClAqClAqIFJldHVybnZhbHVlOiAgaW50IC0gMCBpcyBhbHdheXMgcmV0dXJuZWQKICoKWiogSW50ZW50aW9uOiAgICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBjaGVja2JvYXJkKCkgbWV0aG9kIGltcGxlbWVudGF0aW9uCloqICAgICAgICAgICAgICAgZm9yIHRoZSBsd21vbiBib2FyZC4gIE9ubHkgYSBzdGFuZGFyZCBtZXNzYWdlIGlzIHByaW50ZWQuCiAqCkQqIERlc2lnbjogICAgICAgd2RAZGVueC5kZQpDKiBDb2Rpbmc6ICAgICAgIHdkQGRlbnguZGUKViogVmVyaWZpY2F0aW9uOiBkenVAZGVueC5kZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCBjaGVja2JvYXJkICh2b2lkKQp7CglwdXRzICgiQm9hcmQ6IExpdHJvbmljIE1vbml0b3IgSVZcbiIpOwoJcmV0dXJuICgwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkYqIEZ1bmN0aW9uOiAgICAgbG9uZyBpbnQgaW5pdGRyYW0gKGludCBib2FyZF90eXBlKSBQKkEqWioKICoKUCogUGFyYW1ldGVyczogICBpbnQgYm9hcmRfdHlwZQpQKiAgICAgICAgICAgICAgICAtIFVzdWFsbHkgdHlwZSBvZiB0aGUgYm9hcmQgLSBpZ25vcmVkIGhlcmUuClAqClAqIFJldHVybnZhbHVlOiAgbG9uZyBpbnQKUCogICAgICAgICAgICAgICAgLSBTaXplIG9mIGluaXRpYWxpemVkIG1lbW9yeQogKgpaKiBJbnRlbnRpb246ICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGluaXRkcmFtKCkgbWV0aG9kIGltcGxlbWVudGF0aW9uCloqICAgICAgICAgICAgICAgZm9yIHRoZSBsd21vbiBib2FyZC4KWiogICAgICAgICAgICAgICBUaGUgbWVtb3J5IGNvbnRyb2xsZXIgaXMgaW5pdGlhbGl6ZWQgdG8gYWNjZXNzIHRoZQpaKiAgICAgICAgICAgICAgIERSQU0uCiAqCkQqIERlc2lnbjogICAgICAgd2RAZGVueC5kZQpDKiBDb2Rpbmc6ICAgICAgIHdkQGRlbnguZGUKViogVmVyaWZpY2F0aW9uOiBkenVAZGVueC5kZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmxvbmcgaW50IGluaXRkcmFtIChpbnQgYm9hcmRfdHlwZSkKewoJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENGR19JTU1SOwoJdm9sYXRpbGUgbWVtY3RsOHh4X3QgKm1lbWN0bCA9ICZpbW1yLT5pbV9tZW1jdGw7Cglsb25nIGludCBzaXplX2IwOwoJbG9uZyBpbnQgc2l6ZTgsIHNpemU5OwoJaW50IGk7CgoJLyoKCSAqIENvbmZpZ3VyZSBVUE1BIGZvciBTRFJBTQoJICovCgl1cG1jb25maWcgKFVQTUEsICh1aW50ICopc2RyYW1fdGFibGUsIHNpemVvZihzZHJhbV90YWJsZSkvc2l6ZW9mKHVpbnQpKTsKCgltZW1jdGwtPm1lbWNfbXB0cHIgPSBDRkdfTVBUUFI7CgoJLyogYnVyc3QgbGVuZ3RoPTQsIGJ1cnN0IHR5cGU9c2VxdWVudGlhbCwgQ0FTIGxhdGVuY3k9MiAqLwoJbWVtY3RsLT5tZW1jX21hciA9IENGR19NQVI7CgoJLyoKCSAqIE1hcCBjb250cm9sbGVyIGJhbmsgMyB0byB0aGUgU0RSQU0gYmFuayBhdCBwcmVsaW1pbmFyeSBhZGRyZXNzLgoJICovCgltZW1jdGwtPm1lbWNfb3IzID0gQ0ZHX09SM19QUkVMSU07CgltZW1jdGwtPm1lbWNfYnIzID0gQ0ZHX0JSM19QUkVMSU07CgoJLyogaW5pdGlhbGl6ZSBtZW1vcnkgYWRkcmVzcyByZWdpc3RlciAqLwoJbWVtY3RsLT5tZW1jX21hbXIgPSBDRkdfTUFNUl84Q09MOwkvKiByZWZyZXNoIG5vdCBlbmFibGVkIHlldCAqLwoKCS8qIG1vZGUgaW5pdGlhbGl6YXRpb24gKG9mZnNldCA1KSAqLwoJdWRlbGF5ICgyMDApOwkJCQkvKiAweDgwMDA2MTA1ICovCgltZW1jdGwtPm1lbWNfbWNyID0gTUNSX09QX1JVTiB8IE1DUl9NQl9DUzMgfCBNQ1JfTUxDRiAoMSkgfCBNQ1JfTUFEICgweDA1KTsKCgkvKiBydW4gMiByZWZyZXNoIHNlcXVlbmNlIHdpdGggNC1iZWF0IHJlZnJlc2ggYnVyc3QgKG9mZnNldCAweDMwKSAqLwoJdWRlbGF5ICgxKTsJCQkJLyogMHg4MDAwNjEzMCAqLwoJbWVtY3RsLT5tZW1jX21jciA9IE1DUl9PUF9SVU4gfCBNQ1JfTUJfQ1MzIHwgTUNSX01MQ0YgKDEpIHwgTUNSX01BRCAoMHgzMCk7Cgl1ZGVsYXkgKDEpOwkJCQkvKiAweDgwMDA2MTMwICovCgltZW1jdGwtPm1lbWNfbWNyID0gTUNSX09QX1JVTiB8IE1DUl9NQl9DUzMgfCBNQ1JfTUxDRiAoMSkgfCBNQ1JfTUFEICgweDMwKTsKCgl1ZGVsYXkgKDEpOwkJCQkvKiAweDgwMDA2MTA2ICovCgltZW1jdGwtPm1lbWNfbWNyID0gTUNSX09QX1JVTiB8IE1DUl9NQl9DUzMgfCBNQ1JfTUxDRiAoMSkgfCBNQ1JfTUFEICgweDA2KTsKCgltZW1jdGwtPm1lbWNfbWFtciB8PSBNQU1SX1BUQkU7CS8qIHJlZnJlc2ggZW5hYmxlZCAqLwoKCXVkZWxheSAoMjAwKTsKCgkvKiBOZWVkIGF0IGxlYXN0IDEwIERSQU0gYWNjZXNzZXMgdG8gc3RhYmlsaXplICovCglmb3IgKGkgPSAwOyBpIDwgMTA7ICsraSkgewoJCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIgPQoJCQkodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSBTRFJBTV9CQVNFM19QUkVMSU07CgkJdW5zaWduZWQgbG9uZyB2YWw7CgoJCXZhbCA9ICooYWRkciArIGkpOwoJCSooYWRkciArIGkpID0gdmFsOwoJfQoKCS8qCgkgKiBDaGVjayBCYW5rIDAgTWVtb3J5IFNpemUgZm9yIHJlLWNvbmZpZ3VyYXRpb24KCSAqCgkgKiB0cnkgOCBjb2x1bW4gbW9kZQoJICovCglzaXplOCA9IGRyYW1fc2l6ZSAoQ0ZHX01BTVJfOENPTCwgKHVsb25nICopU0RSQU1fQkFTRTNfUFJFTElNLCBTRFJBTV9NQVhfU0laRSk7CgoJdWRlbGF5ICgxMDAwKTsKCgkvKgoJICogdHJ5IDkgY29sdW1uIG1vZGUKCSAqLwoJc2l6ZTkgPSBkcmFtX3NpemUgKENGR19NQU1SXzlDT0wsICh1bG9uZyAqKVNEUkFNX0JBU0UzX1BSRUxJTSwgU0RSQU1fTUFYX1NJWkUpOwoKCWlmIChzaXplOCA8IHNpemU5KSB7CQkvKiBsZWF2ZSBjb25maWd1cmF0aW9uIGF0IDkgY29sdW1ucyAqLwoJCXNpemVfYjAgPSBzaXplOTsKCQltZW1jdGwtPm1lbWNfbWFtciA9IENGR19NQU1SXzlDT0wgfCBNQU1SX1BUQkU7CgkJdWRlbGF5ICg1MDApOwoJfSBlbHNlIHsJCQkvKiBiYWNrIHRvIDggY29sdW1ucyAgICAgICAgICAgICovCgkJc2l6ZV9iMCA9IHNpemU4OwoJCW1lbWN0bC0+bWVtY19tYW1yID0gQ0ZHX01BTVJfOENPTCB8IE1BTVJfUFRCRTsKCQl1ZGVsYXkgKDUwMCk7Cgl9CgoJLyoKCSAqIEZpbmFsIG1hcHBpbmc6CgkgKi8KCgltZW1jdGwtPm1lbWNfb3IzID0gKCgtc2l6ZV9iMCkgJiAweEZGRkYwMDAwKSB8CgkJCU9SX0NTTlRfU0FNIHwgT1JfRzVMUyB8IFNEUkFNX1RJTUlORzsKCW1lbWN0bC0+bWVtY19icjMgPSAoQ0ZHX1NEUkFNX0JBU0UgJiBCUl9CQV9NU0spIHwgQlJfTVNfVVBNQSB8IEJSX1Y7Cgl1ZGVsYXkgKDEwMDApOwoKCXJldHVybiAoc2l6ZV9iMCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpGKiBGdW5jdGlvbjogICAgIHN0YXRpYyBsb25nIGludCBkcmFtX3NpemUgKGxvbmcgaW50IG1hbXJfdmFsdWUsCkYqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBpbnQgKmJhc2UsCkYqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBpbnQgbWF4c2l6ZSkgUCpBKloqCiAqClAqIFBhcmFtZXRlcnM6ICAgbG9uZyBpbnQgbWFtcl92YWx1ZQpQKiAgICAgICAgICAgICAgICAtIFZhbHVlIGZvciBNQU1SIGZvciB0aGUgdGVzdApQKiAgICAgICAgICAgICAgIGxvbmcgaW50ICpiYXNlClAqICAgICAgICAgICAgICAgIC0gQmFzZSBhZGRyZXNzIGZvciB0aGUgdGVzdApQKiAgICAgICAgICAgICAgIGxvbmcgaW50IG1heHNpemUKUCogICAgICAgICAgICAgICAgLSBNYXhpbXVtIHNpemUgdG8gdGVzdCBmb3IKUCoKUCogUmV0dXJudmFsdWU6ICBsb25nIGludApQKiAgICAgICAgICAgICAgICAtIFNpemUgb2YgcHJvYmVkIG1lbW9yeQogKgpaKiBJbnRlbnRpb246ICAgIENoZWNrIG1lbW9yeSByYW5nZSBmb3IgdmFsaWQgUkFNLiBBIHNpbXBsZSBtZW1vcnkgdGVzdApaKiAgICAgICAgICAgICAgIGRldGVybWluZXMgdGhlIGFjdHVhbGx5IGF2YWlsYWJsZSBSQU0gc2l6ZSBiZXR3ZWVuCloqICAgICAgICAgICAgICAgYWRkcmVzc2VzIGBiYXNlJyBhbmQgYGJhc2UgKyBtYXhzaXplJy4gU29tZSAobm90IGFsbCkKWiogICAgICAgICAgICAgICBoYXJkd2FyZSBlcnJvcnMgYXJlIGRldGVjdGVkOgpaKiAgICAgICAgICAgICAgICAtIHNob3J0IGJldHdlZW4gYWRkcmVzcyBsaW5lcwpaKiAgICAgICAgICAgICAgICAtIHNob3J0IGJldHdlZW4gZGF0YSBsaW5lcwogKgpEKiBEZXNpZ246ICAgICAgIHdkQGRlbnguZGUKQyogQ29kaW5nOiAgICAgICB3ZEBkZW54LmRlClYqIFZlcmlmaWNhdGlvbjogZHp1QGRlbnguZGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgbG9uZyBpbnQgZHJhbV9zaXplIChsb25nIGludCBtYW1yX3ZhbHVlLCBsb25nIGludCAqYmFzZSwgbG9uZyBpbnQgbWF4c2l6ZSkKewoJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENGR19JTU1SOwoJdm9sYXRpbGUgbWVtY3RsOHh4X3QgKm1lbWN0bCA9ICZpbW1yLT5pbV9tZW1jdGw7Cgl2b2xhdGlsZSBsb25nIGludCAqYWRkcjsKCXVsb25nIGNudCwgdmFsOwoJdWxvbmcgc2F2ZVszMl07CQkJCS8qIHRvIG1ha2UgdGVzdCBub24tZGVzdHJ1Y3RpdmUgKi8KCXVuc2lnbmVkIGNoYXIgaSA9IDA7CgoJbWVtY3RsLT5tZW1jX21hbXIgPSBtYW1yX3ZhbHVlOwoKCWZvciAoY250ID0gbWF4c2l6ZSAvIHNpemVvZiAobG9uZyk7IGNudCA+IDA7IGNudCA+Pj0gMSkgewoJCWFkZHIgPSBiYXNlICsgY250OwkJLyogcG9pbnRlciBhcml0aCEgKi8KCgkJc2F2ZVtpKytdID0gKmFkZHI7CgkJKmFkZHIgPSB+Y250OwoJfQoKCS8qIHdyaXRlIDAgdG8gYmFzZSBhZGRyZXNzICovCglhZGRyID0gYmFzZTsKCXNhdmVbaV0gPSAqYWRkcjsKCSphZGRyID0gMDsKCgkvKiBjaGVjayBhdCBiYXNlIGFkZHJlc3MgKi8KCWlmICgodmFsID0gKmFkZHIpICE9IDApIHsKCQkqYWRkciA9IHNhdmVbaV07CgkJcmV0dXJuICgwKTsKCX0KCglmb3IgKGNudCA9IDE7IGNudCA8PSBtYXhzaXplIC8gc2l6ZW9mIChsb25nKTsgY250IDw8PSAxKSB7CgkJYWRkciA9IGJhc2UgKyBjbnQ7CQkvKiBwb2ludGVyIGFyaXRoISAqLwoKCQl2YWwgPSAqYWRkcjsKCQkqYWRkciA9IHNhdmVbLS1pXTsKCgkJaWYgKHZhbCAhPSAofmNudCkpIHsKCQkJcmV0dXJuIChjbnQgKiBzaXplb2YgKGxvbmcpKTsKCQl9Cgl9CglyZXR1cm4gKG1heHNpemUpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojaWZuZGVmCVBCX0VORVRfVEVOQQojIGRlZmluZSBQQl9FTkVUX1RFTkEJKCh1aW50KTB4MDAwMDIwMDApCS8qIFBCIDE4ICovCiNlbmRpZgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkYqIEZ1bmN0aW9uOiAgICAgaW50IGJvYXJkX3ByZV9pbml0ICh2b2lkKSBQKkEqWioKICoKUCogUGFyYW1ldGVyczogICBub25lClAqClAqIFJldHVybnZhbHVlOiAgaW50ClAqICAgICAgICAgICAgICAgIC0gMCBpcyBhbHdheXMgcmV0dXJuZWQuCiAqCloqIEludGVudGlvbjogICAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgYm9hcmRfcHJlX2luaXQoKSBtZXRob2QgaW1wbGVtZW50YXRpb24KWiogICAgICAgICAgICAgICBmb3IgdGhlIGx3bW9uIGJvYXJkLgpaKiAgICAgICAgICAgICAgIERpc2FibGUgRXRoZXJuZXQgVEVOQSBvbiBQb3J0IEIuCiAqCkQqIERlc2lnbjogICAgICAgd2RAZGVueC5kZQpDKiBDb2Rpbmc6ICAgICAgIHdkQGRlbnguZGUKViogVmVyaWZpY2F0aW9uOiBkenVAZGVueC5kZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCBib2FyZF9wcmVfaW5pdCAodm9pZCkKewoJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENGR19JTU1SOwoKCS8qIERpc2FibGUgRXRoZXJuZXQgVEVOQSBvbiBQb3J0IEIKCSAqIE5lY2Vzc2FyeSBiZWNhdXNlIG9mIHB1bGwgdXAgaW4gQ09NMyBwb3J0LgoJICoKCSAqIFRoaXMgaXMganVzdCBhIHByZWxpbWluYXJ5IGZpeCwgaW50ZW5kZWQgdG8gdHVybiBvZmYgVEVOQQoJICogYXMgc29vbiBhcyBwb3NzaWJsZSB0byBhdm9pZCBub2lzZSBvbiB0aGUgbmV0d29yay4gT25jZQoJICogSbJDIGlzIHJ1bm5pbmcgd2Ugd2lsbCBtYWtlIHN1cmUgdGhlIGludGVyZmFjZSBpcwoJICogY29ycmVjdGx5IGluaXRpYWxpemVkLgoJICovCglpbW1yLT5pbV9jcG0uY3BfcGJwYXIgJj0gflBCX0VORVRfVEVOQTsKCWltbXItPmltX2NwbS5jcF9wYm9kciAmPSB+UEJfRU5FVF9URU5BOwoJaW1tci0+aW1fY3BtLmNwX3BiZGF0ICY9IH5QQl9FTkVUX1RFTkE7CS8qIHNldCB0byAwID0gZGlzYWJsZWQgKi8KCWltbXItPmltX2NwbS5jcF9wYmRpciB8PSBQQl9FTkVUX1RFTkE7CgoJcmV0dXJuICgwKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkYqIEZ1bmN0aW9uOiAgICAgdm9pZCByZXNldF9waHkgKHZvaWQpIFAqQSpaKgogKgpQKiBQYXJhbWV0ZXJzOiAgIG5vbmUKUCoKUCogUmV0dXJudmFsdWU6ICBub25lCiAqCloqIEludGVudGlvbjogICAgUmVzZXQgdGhlIFBIWS4gIEluIHRoZSBsd21vbiBjYXNlIHdlIGRvIHRoaXMgYnkgdGhlCloqICAgICAgICAgICAgICAgc2lnbmFsaW5nIHRoZSBQSUMgSS9PIGV4cGFuZGVyLgogKgpEKiBEZXNpZ246ICAgICAgIHdkQGRlbnguZGUKQyogQ29kaW5nOiAgICAgICB3ZEBkZW54LmRlClYqIFZlcmlmaWNhdGlvbjogZHp1QGRlbnguZGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHJlc2V0X3BoeSAodm9pZCkKewoJdWNoYXIgYzsKCiNpZmRlZiBERUJVRwoJcHJpbnRmICgiIyMjIFN3aXRjaCBvbiBFdGhlcm5ldCBmb3IgU0NDMiAjIyNcbiIpOwojZW5kaWYKCWMgPSBwaWNfcmVhZCAoMHg2MSk7CiNpZmRlZiBERUJVRwoJcHJpbnRmICgiT2xkIFBJQyByZWFkOiByZWdfNjEgPSAweCUwMnhcbiIsIGMpOwojZW5kaWYKCWMgfD0gMHg0MDsJCQkJCS8qIGRpc2FibGUgQ09NMyAqLwoJYyAmPSB+MHg4MDsJCQkJCS8qIGVuYWJsZSBFdGhlcm5ldCAqLwoJcGljX3dyaXRlICgweDYxLCBjKTsKI2lmZGVmIERFQlVHCgljID0gcGljX3JlYWQgKDB4NjEpOwoJcHJpbnRmICgiTmV3IFBJQyByZWFkOiByZWdfNjEgPSAweCUwMnhcbiIsIGMpOwojZW5kaWYKCXVkZWxheSAoMTAwMCk7Cn0KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gS2V5Ym9hcmQgY29udHJvbGxlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIGNvbW1hbmQgY29kZXMgKi8KI2RlZmluZQlLRVlCRF9DTURfUkVBRF9LRVlTCTB4MDEKI2RlZmluZSBLRVlCRF9DTURfUkVBRF9WRVJTSU9OCTB4MDIKI2RlZmluZSBLRVlCRF9DTURfUkVBRF9TVEFUVVMJMHgwMwojZGVmaW5lIEtFWUJEX0NNRF9SRVNFVF9FUlJPUlMJMHgxMAoKLyogc3RhdHVzIGNvZGVzICovCiNkZWZpbmUgS0VZQkRfU1RBVFVTX01BU0sJMHgzRgojZGVmaW5lCUtFWUJEX1NUQVRVU19IX1JFU0VUCTB4MjAKI2RlZmluZSBLRVlCRF9TVEFUVVNfQlJPV05PVVQJMHgxMAojZGVmaW5lIEtFWUJEX1NUQVRVU19XRF9SRVNFVAkweDA4CiNkZWZpbmUgS0VZQkRfU1RBVFVTX09WRVJMT0FECTB4MDQKI2RlZmluZSBLRVlCRF9TVEFUVVNfSUxMRUdBTF9XUgkweDAyCiNkZWZpbmUgS0VZQkRfU1RBVFVTX0lMTEVHQUxfUkQJMHgwMQoKLyogTnVtYmVyIG9mIGJ5dGVzIHJldHVybmVkIGZyb20gS2V5Ym9hcmQgQ29udHJvbGxlciAqLwojZGVmaW5lIEtFWUJEX1ZFUlNJT05MRU4JMgkvKiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCiNkZWZpbmUJS0VZQkRfREFUQUxFTgkJOQkvKiBub3JtYWwga2V5IHNjYW4gZGF0YSAqLwoKLyogbWF4aW11bSBudW1iZXIgb2YgIm1hZ2ljIiBrZXkgY29kZXMgdGhhdCBjYW4gYmUgYXNzaWduZWQgKi8KCnN0YXRpYyB1Y2hhciBrYmRfYWRkciA9IENGR19JMkNfS0VZQkRfQUREUjsKCnN0YXRpYyB1Y2hhciAqa2V5X21hdGNoICh1Y2hhciAqKTsKCiNkZWZpbmUJS0VZQkRfU0VUX0RFQlVHTU9ERQknIycJLyogTWFnaWMga2V5IHRvIGVuYWJsZSBkZWJ1ZyBvdXRwdXQgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpGKiBGdW5jdGlvbjogICAgIGludCBib2FyZF9wb3N0Y2xrX2luaXQgKHZvaWQpIFAqQSpaKgogKgpQKiBQYXJhbWV0ZXJzOiAgIG5vbmUKUCoKUCogUmV0dXJudmFsdWU6ICBpbnQKUCogICAgICAgICAgICAgICAgLSAwIGlzIGFsd2F5cyByZXR1cm5lZC4KICoKWiogSW50ZW50aW9uOiAgICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBib2FyZF9wb3N0Y2xrX2luaXQoKSBtZXRob2QgaW1wbGVtZW50YXRpb24KWiogICAgICAgICAgICAgICBmb3IgdGhlIGx3bW9uIGJvYXJkLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCBib2FyZF9wb3N0Y2xrX2luaXQgKHZvaWQpCnsKCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwoKCWtiZF9pbml0KCk7CgojaWZkZWYgQ09ORklHX01PREVNX1NVUFBPUlQKCWlmIChrZXlfcHJlc3NlZCgpKSB7CgkJZGlzYWJsZV9wdXRjKCk7CS8qIG1vZGVtIGRvZXNuJ3QgdW5kZXJzdGFuZCBiYW5uZXIgZXRjICovCgkJZ2QtPmRvX21kbV9pbml0ID0gMTsKCX0KI2VuZGlmCgoJcmV0dXJuICgwKTsKfQoKc3RhdGljIHZvaWQga2JkX2luaXQgKHZvaWQpCnsKCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwoKCXVjaGFyIGtiZF9kYXRhW0tFWUJEX0RBVEFMRU5dOwoJdWNoYXIgdG1wX2RhdGFbS0VZQkRfREFUQUxFTl07Cgl1Y2hhciB2YWwsIGVycmNkOwoJaW50IGk7CgoJaTJjX2luaXQgKENGR19JMkNfU1BFRUQsIENGR19JMkNfU0xBVkUpOwoKCWdkLT5rYmRfc3RhdHVzID0gMDsKCgkvKiBGb3JjZWQgYnkgUElDLiBEZWxheXMgPD0gMTc1dXMgbG9vc2UgKi8KCXVkZWxheSgxMDAwKTsKCgkvKiBSZWFkIGluaXRpYWwga2V5Ym9hcmQgZXJyb3IgY29kZSAqLwoJdmFsID0gS0VZQkRfQ01EX1JFQURfU1RBVFVTOwoJaTJjX3dyaXRlIChrYmRfYWRkciwgMCwgMCwgJnZhbCwgMSk7CglpMmNfcmVhZCAoa2JkX2FkZHIsIDAsIDAsICZlcnJjZCwgMSk7CgkvKiBjbGVhciB1bnVzZWQgYml0cyAqLwoJZXJyY2QgJj0gS0VZQkRfU1RBVFVTX01BU0s7CgkvKiBjbGVhciAiaXJyZWxldmFudCIgYml0cy4gUmVjb21tZW5kZWQgYnkgTWFydGluIFJhamVrLCBMV04gKi8KCWVycmNkICY9IH4oS0VZQkRfU1RBVFVTX0hfUkVTRVR8S0VZQkRfU1RBVFVTX0JST1dOT1VUKTsKCWlmIChlcnJjZCkgewoJCWdkLT5rYmRfc3RhdHVzIHw9IGVycmNkIDw8IDg7Cgl9CgkvKiBSZXNldCBlcnJvciBjb2RlIGFuZCB2ZXJpZnkgKi8KCXZhbCA9IEtFWUJEX0NNRF9SRVNFVF9FUlJPUlM7CglpMmNfd3JpdGUgKGtiZF9hZGRyLCAwLCAwLCAmdmFsLCAxKTsKCXVkZWxheSgxMDAwKTsJLyogZGVsYXkgTkVFREVEIGJ5IGtleWJvYXJkIFBJQyAhISEgKi8KCgl2YWwgPSBLRVlCRF9DTURfUkVBRF9TVEFUVVM7CglpMmNfd3JpdGUgKGtiZF9hZGRyLCAwLCAwLCAmdmFsLCAxKTsKCWkyY19yZWFkIChrYmRfYWRkciwgMCwgMCwgJnZhbCwgMSk7CgoJdmFsICY9IEtFWUJEX1NUQVRVU19NQVNLOwkvKiBjbGVhciB1bnVzZWQgYml0cyAqLwoJaWYgKHZhbCkgewkJCS8qIHBlcm1hbmVudCBlcnJvciwgcmVwb3J0IGl0ICovCgkJZ2QtPmtiZF9zdGF0dXMgfD0gdmFsOwoJCXJldHVybjsKCX0KCgkvKgoJICogUmVhZCBjdXJyZW50IGtleWJvYXJkIHN0YXRlLgoJICoKCSAqIEFmdGVyIHRoZSBlcnJvciByZXNldCBpdCBtYXkgdGFrZSBzb21lIHRpbWUgYmVmb3JlIHRoZQoJICoga2V5Ym9hcmQgUElDIHBpY2tzIHVwIGEgdmFsaWQga2V5Ym9hcmQgc2NhbiAtIHRoZSB0b3RhbAoJICogc2NhbiB0aW1lIGlzIGFwcHJveC4gMS42IG1zIChpbmZvcm1hdGlvbiBieSBNYXJ0aW4gUmFqZWssCgkgKiAyOCBTZXAgMjAwMikuIFdlIHJlYWQgYSBjb3VwbGUgb2YgdGltZXMgZm9yIHRoZSBrZXlib2FyZAoJICogdG8gc3RhYmlsaXplLCB1c2luZyBhIGJpZyBlbm91Z2ggZGVsYXkuCgkgKiAxMCB0aW1lcyBzaG91bGQgYmUgZW5vdWdoLiBJZiB0aGUgZGF0YSBpcyBzdGlsbCBjaGFuZ2luZywKCSAqIHdlIHVzZSB3aGF0IHdlIGdldCA6LSgKCSAqLwoKCW1lbXNldCAodG1wX2RhdGEsIDB4RkYsIEtFWUJEX0RBVEFMRU4pOwkvKiBpbXBvc3NpYmxlIHZhbHVlICovCglmb3IgKGk9MDsgaTwxMDsgKytpKSB7CgkJdmFsID0gS0VZQkRfQ01EX1JFQURfS0VZUzsKCQlpMmNfd3JpdGUgKGtiZF9hZGRyLCAwLCAwLCAmdmFsLCAxKTsKCQlpMmNfcmVhZCAoa2JkX2FkZHIsIDAsIDAsIGtiZF9kYXRhLCBLRVlCRF9EQVRBTEVOKTsKCgkJaWYgKG1lbWNtcChrYmRfZGF0YSwgdG1wX2RhdGEsIEtFWUJEX0RBVEFMRU4pID09IDApIHsKCQkJLyogY29uc2lzdGVudCBzdGF0ZSwgZG9uZSAqLwoJCQlicmVhazsKCQl9CgkJLyogcmVtZWJlciBsYXN0IHN0YXRlLCBkZWxheSwgYW5kIHJldHJ5ICovCgkJbWVtY3B5ICh0bXBfZGF0YSwga2JkX2RhdGEsIEtFWUJEX0RBVEFMRU4pOwoJCXVkZWxheSAoNTAwMCk7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpGKiBGdW5jdGlvbjogICAgIGludCBtaXNjX2luaXRfciAodm9pZCkgUCpBKloqCiAqClAqIFBhcmFtZXRlcnM6ICAgbm9uZQpQKgpQKiBSZXR1cm52YWx1ZTogIGludApQKiAgICAgICAgICAgICAgICAtIDAgaXMgYWx3YXlzIHJldHVybmVkLCBldmVuIGluIHRoZSBjYXNlIG9mIGEga2V5Ym9hcmQKUCogICAgICAgICAgICAgICAgICAgIGVycm9yLgogKgpaKiBJbnRlbnRpb246ICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG1pc2NfaW5pdF9yKCkgbWV0aG9kIGltcGxlbWVudGF0aW9uCloqICAgICAgICAgICAgICAgZm9yIHRoZSBsd21vbiBib2FyZC4KWiogICAgICAgICAgICAgICBUaGUga2V5Ym9hcmQgY29udHJvbGxlciBpcyBpbml0aWFsaXplZCBhbmQgdGhlIHJlc3VsdApaKiAgICAgICAgICAgICAgIG9mIGEgcmVhZCBjb3BpZWQgdG8gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlICJrZXliZCIuCloqICAgICAgICAgICAgICAgSWYgS0VZQkRfU0VUX0RFQlVHTU9ERSBpcyBkZWZpbmVkLCBhIGNoZWNrIGlzIG1hZGUgZm9yCloqICAgICAgICAgICAgICAgdGhpcyBrZXksIGFuZCBpZiBmb3VuZCBkaXNwbGF5IHRvIHRoZSBMQ0Qgd2lsbCBiZSBlbmFibGVkLgpaKiAgICAgICAgICAgICAgIFRoZSBrZXlzIGluICJrZXliZCIgYXJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgbWFnaWMKWiogICAgICAgICAgICAgICBrZXljb21tYW5kcyBkZWZpbmVkIGluIHRoZSBlbnZpcm9ubWVudC4KWiogICAgICAgICAgICAgICBTZWUgYWxzbyBrZXlfbWF0Y2goKS4KICoKRCogRGVzaWduOiAgICAgICB3ZEBkZW54LmRlCkMqIENvZGluZzogICAgICAgd2RAZGVueC5kZQpWKiBWZXJpZmljYXRpb246IGR6dUBkZW54LmRlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IG1pc2NfaW5pdF9yICh2b2lkKQp7CglERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKCgl1Y2hhciBrYmRfZGF0YVtLRVlCRF9EQVRBTEVOXTsKCXVjaGFyIGtleWJkX2VudlsyICogS0VZQkRfREFUQUxFTiArIDFdOwoJdWNoYXIga2JkX2luaXRfc3RhdHVzID0gZ2QtPmtiZF9zdGF0dXMgPj4gODsKCXVjaGFyIGtiZF9zdGF0dXMgPSBnZC0+a2JkX3N0YXR1czsKCXVjaGFyIHZhbDsKCXVjaGFyICpzdHI7CglpbnQgaTsKCglpZiAoa2JkX2luaXRfc3RhdHVzKSB7CgkJcHJpbnRmICgiS0VZQkQ6IEVycm9yICUwMlhcbiIsIGtiZF9pbml0X3N0YXR1cyk7Cgl9CglpZiAoa2JkX3N0YXR1cykgewkJLyogcGVybWFuZW50IGVycm9yLCByZXBvcnQgaXQgKi8KCQlwcmludGYgKCIqKiogS2V5Ym9hcmQgZXJyb3IgY29kZSAlMDJYICoqKlxuIiwga2JkX3N0YXR1cyk7CgkJc3ByaW50ZiAoa2V5YmRfZW52LCAiJTAyWCIsIGtiZF9zdGF0dXMpOwoJCXNldGVudiAoImtleWJkIiwga2V5YmRfZW52KTsKCQlyZXR1cm4gMDsKCX0KCgkvKgoJICogTm93IHdlIGtub3cgdGhhdCB3ZSBoYXZlIGEgd29ya2luZyAga2V5Ym9hcmQsICBzbyAgZGlzYWJsZQoJICogYWxsIG91dHB1dCB0byB0aGUgTENEIGV4Y2VwdCB3aGVuIGEga2V5IHByZXNzIGlzIGRldGVjdGVkLgoJICovCgoJaWYgKChjb25zb2xlX2Fzc2lnbiAoc3Rkb3V0LCAic2VyaWFsIikgPCAwKSB8fAoJCShjb25zb2xlX2Fzc2lnbiAoc3RkZXJyLCAic2VyaWFsIikgPCAwKSkgewoJCXByaW50ZiAoIkNhbid0IGFzc2lnbiBzZXJpYWwgcG9ydCBhcyBvdXRwdXQgZGV2aWNlXG4iKTsKCX0KCgkvKiBSZWFkIFZlcnNpb24gKi8KCXZhbCA9IEtFWUJEX0NNRF9SRUFEX1ZFUlNJT047CglpMmNfd3JpdGUgKGtiZF9hZGRyLCAwLCAwLCAmdmFsLCAxKTsKCWkyY19yZWFkIChrYmRfYWRkciwgMCwgMCwga2JkX2RhdGEsIEtFWUJEX1ZFUlNJT05MRU4pOwoJcHJpbnRmICgiS0VZQkQ6IFZlcnNpb24gJWQuJWRcbiIsIGtiZF9kYXRhWzBdLCBrYmRfZGF0YVsxXSk7CgoJLyogUmVhZCBjdXJyZW50IGtleWJvYXJkIHN0YXRlICovCgl2YWwgPSBLRVlCRF9DTURfUkVBRF9LRVlTOwoJaTJjX3dyaXRlIChrYmRfYWRkciwgMCwgMCwgJnZhbCwgMSk7CglpMmNfcmVhZCAoa2JkX2FkZHIsIDAsIDAsIGtiZF9kYXRhLCBLRVlCRF9EQVRBTEVOKTsKCglmb3IgKGkgPSAwOyBpIDwgS0VZQkRfREFUQUxFTjsgKytpKSB7CgkJc3ByaW50ZiAoa2V5YmRfZW52ICsgaSArIGksICIlMDJYIiwga2JkX2RhdGFbaV0pOwoJfQoJc2V0ZW52ICgia2V5YmQiLCBrZXliZF9lbnYpOwoKCXN0ciA9IHN0cmR1cCAoa2V5X21hdGNoIChrYmRfZGF0YSkpOwkvKiBkZWNvZGUga2V5cyAqLwojaWZkZWYgS0VZQkRfU0VUX0RFQlVHTU9ERQoJaWYgKGtiZF9kYXRhWzBdID09IEtFWUJEX1NFVF9ERUJVR01PREUpIHsJLyogc2V0IGRlYnVnIG1vZGUgKi8KCQlpZiAoKGNvbnNvbGVfYXNzaWduIChzdGRvdXQsICJsY2QiKSA8IDApIHx8CgkJCShjb25zb2xlX2Fzc2lnbiAoc3RkZXJyLCAibGNkIikgPCAwKSkgewoJCQlwcmludGYgKCJDYW4ndCBhc3NpZ24gTENEIGRpc3BsYXkgYXMgb3V0cHV0IGRldmljZVxuIik7CgkJfQoJfQojZW5kaWYgLyogS0VZQkRfU0VUX0RFQlVHTU9ERSAqLwojaWZkZWYgQ09ORklHX1BSRUJPT1QJLyogYXV0b21hdGljYWxseSBjb25maWd1cmUgInByZWJvb3QiIGNvbW1hbmQgb24ga2V5IG1hdGNoICovCglzZXRlbnYgKCJwcmVib290Iiwgc3RyKTsJLyogc2V0IG9yIGRlbGV0ZSBkZWZpbml0aW9uICovCiNlbmRpZiAvKiBDT05GSUdfUFJFQk9PVCAqLwoJaWYgKHN0ciAhPSBOVUxMKSB7CgkJZnJlZSAoc3RyKTsKCX0KCXJldHVybiAoMCk7Cn0KCiNpZmRlZiBDT05GSUdfUFJFQk9PVAoKc3RhdGljIHVjaGFyIGtiZF9tYWdpY19wcmVmaXhbXSA9ICJrZXlfbWFnaWMiOwpzdGF0aWMgdWNoYXIga2JkX2NvbW1hbmRfcHJlZml4W10gPSAia2V5X2NtZCI7CgpzdGF0aWMgaW50IGNvbXBhcmVfbWFnaWMgKHVjaGFyICprYmRfZGF0YSwgdWNoYXIgKnN0cikKewoJdWNoYXIgY29tcGFyZVtLRVlCRF9EQVRBTEVOLTFdOwoJdWNoYXIgKm54dDsKCWludCBpOwoKCS8qIERvbid0IGluY2x1ZGUgbW9kaWZpZXIgYnl0ZSAqLwoJbWVtY3B5IChjb21wYXJlLCBrYmRfZGF0YSsxLCBLRVlCRF9EQVRBTEVOLTEpOwoKCWZvciAoOyBzdHIgIT0gTlVMTDsgc3RyID0gKCpueHQpID8gbnh0KzEgOiBueHQpIHsKCQl1Y2hhciBjOwoJCWludCBrOwoKCQljID0gKHVjaGFyKSBzaW1wbGVfc3RydG91bCAoc3RyLCAoY2hhciAqKikgKCZueHQpLCAxNik7CgoJCWlmIChzdHIgPT0gbnh0KSB7CS8qIGludmFsaWQgY2hhcmFjdGVyICovCgkJCWJyZWFrOwoJCX0KCgkJLyoKCQkgKiBDaGVjayBpZiB0aGlzIGtleSBtYXRjaGVzIHRoZSBpbnB1dC4KCQkgKiBTZXQgbWF0Y2hlcyB0byB6ZXJvLCBzbyB0aGV5IG1hdGNoIG9ubHkgb25jZQoJCSAqIGFuZCB3ZSBjYW4gZmluZCBkdXBsaWNhdGVzIG9yIGV4dHJhIGtleXMKCQkgKi8KCQlmb3IgKGsgPSAwOyBrIDwgc2l6ZW9mKGNvbXBhcmUpOyArK2spIHsKCQkJaWYgKGNvbXBhcmVba10gPT0gJ1wwJykJLyogb25seSBub24temVybyBlbnRyaWVzICovCgkJCQljb250aW51ZTsKCQkJaWYgKGMgPT0gY29tcGFyZVtrXSkgewkvKiBmb3VuZCBtYXRjaGluZyBrZXkgKi8KCQkJCWNvbXBhcmVba10gPSAnXDAnOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJaWYgKGsgPT0gc2l6ZW9mKGNvbXBhcmUpKSB7CgkJCXJldHVybiAtMTsJCS8qIHVubWF0Y2hlZCBrZXkgKi8KCQl9Cgl9CgoJLyoKCSAqIEEgZnVsbCBtYXRjaCBsZWF2ZXMgbm8ga2V5cyBpbiB0aGUgYGNvbXBhcmUnIGFycmF5LAoJICovCglmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGNvbXBhcmUpOyArK2kpIHsKCQlpZiAoY29tcGFyZVtpXSkKCQl7CgkJCXJldHVybiAtMTsKCQl9Cgl9CgoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpGKiBGdW5jdGlvbjogICAgIHN0YXRpYyB1Y2hhciAqa2V5X21hdGNoICh1Y2hhciAqa2JkX2RhdGEpIFAqQSpaKgogKgpQKiBQYXJhbWV0ZXJzOiAgIHVjaGFyICprYmRfZGF0YQpQKiAgICAgICAgICAgICAgICAtIFRoZSBrZXlzIHRvIG1hdGNoIGFnYWluc3Qgb3VyIG1hZ2ljIGRlZmluaXRpb25zClAqClAqIFJldHVybnZhbHVlOiAgdWNoYXIgKgpQKiAgICAgICAgICAgICAgICAtICE9IE5VTEw6IFBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY29tbWFuZChzKQpQKiAgICAgICAgICAgICAgICAgICAgIE5VTEw6IE5vIG1hZ2ljIGlzIGFib3V0IHRvIGhhcHBlbgogKgpaKiBJbnRlbnRpb246ICAgIENoZWNrIGlmIHByZXNzZWQga2V5KHMpIG1hdGNoIG1hZ2ljIHNlcXVlbmNlLApaKiAgICAgICAgICAgICAgIGFuZCByZXR1cm4gdGhlIGNvbW1hbmQgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGtleShzKS4KWioKWiogICAgICAgICAgICAgICBJZiBubyBrZXkgcHJlc3Mgd2FzIGRlY29kZWQsIE5VTEwgaXMgcmV0dXJuZWQuCloqCloqICAgICAgICAgICAgICAgTm90ZTogdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgYXJndW1lbnQgd2lsbCBiZQpaKiAgICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0dGVuIHdpdGggdGhlICJtYWdpYyBjaGFyY3RlciBjb2RlIiBvZiB0aGUKWiogICAgICAgICAgICAgICAgICAgICBkZWNvZGVkIGtleShzKSwgb3IgJ1wwJy4KWioKWiogICAgICAgICAgICAgICBOb3RlOiB0aGUgc3RyaW5nIHBvaW50cyB0byBzdGF0aWMgZW52aXJvbm1lbnQgZGF0YQpaKiAgICAgICAgICAgICAgICAgICAgIGFuZCBtdXN0IGJlIHNhdmVkIGJlZm9yZSB5b3UgY2FsbCBhbnkgZnVuY3Rpb24gdGhhdApaKiAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVzIHRoZSBlbnZpcm9ubWVudC4KICoKRCogRGVzaWduOiAgICAgICB3ZEBkZW54LmRlCkMqIENvZGluZzogICAgICAgd2RAZGVueC5kZQpWKiBWZXJpZmljYXRpb246IGR6dUBkZW54LmRlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHVjaGFyICprZXlfbWF0Y2ggKHVjaGFyICprYmRfZGF0YSkKewoJdWNoYXIgbWFnaWNbc2l6ZW9mIChrYmRfbWFnaWNfcHJlZml4KSArIDFdOwoJdWNoYXIgKnN1ZmZpeDsKCXVjaGFyICprYmRfbWFnaWNfa2V5czsKCgkvKgoJICogVGhlIGZvbGxvd2luZyBzdHJpbmcgZGVmaW5lcyB0aGUgY2hhcmFjdGVycyB0aGF0IGNhbiBwZSBhcHBlbmRlZAoJICogdG8gImtleV9tYWdpYyIgdG8gZm9ybSB0aGUgbmFtZXMgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQKCSAqIGhvbGQgIm1hZ2ljIiBrZXkgY29kZXMsIGkuIGUuIHN1Y2gga2V5IGNvZGVzIHRoYXQgY2FuIGNhdXNlCgkgKiBwcmUtYm9vdCBhY3Rpb25zLiBJZiB0aGUgc3RyaW5nIGlzIGVtcHR5ICgiIiksIHRoZW4gb25seQoJICogImtleV9tYWdpYyIgaXMgY2hlY2tlZCAob2xkIGJlaGF2aW91cik7IHRoZSBzdHJpbmcgIjEyNSIgY2F1c2VzCgkgKiBjaGVja3MgZm9yICJrZXlfbWFnaWMxIiwgImtleV9tYWdpYzIiIGFuZCAia2V5X21hZ2ljNSIsIGV0Yy4KCSAqLwoJaWYgKChrYmRfbWFnaWNfa2V5cyA9IGdldGVudiAoIm1hZ2ljX2tleXMiKSkgPT0gTlVMTCkKCQlrYmRfbWFnaWNfa2V5cyA9ICIiOwoKCS8qIGxvb3Agb3ZlciBhbGwgbWFnaWMga2V5czsKCSAqIHVzZSAnXDAnIHN1ZmZpeCBpbiBjYXNlIG9mIGVtcHR5IHN0cmluZwoJICovCglmb3IgKHN1ZmZpeD1rYmRfbWFnaWNfa2V5czsgKnN1ZmZpeCB8fCBzdWZmaXg9PWtiZF9tYWdpY19rZXlzOyArK3N1ZmZpeCkgewoJCXNwcmludGYgKG1hZ2ljLCAiJXMlYyIsIGtiZF9tYWdpY19wcmVmaXgsICpzdWZmaXgpOwojaWYgMAoJCXByaW50ZiAoIiMjIyBDaGVjayBtYWdpYyBcIiVzXCJcbiIsIG1hZ2ljKTsKI2VuZGlmCgkJaWYgKGNvbXBhcmVfbWFnaWMoa2JkX2RhdGEsIGdldGVudihtYWdpYykpID09IDApIHsKCQkJdWNoYXIgY21kX25hbWVbc2l6ZW9mIChrYmRfY29tbWFuZF9wcmVmaXgpICsgMV07CgkJCWNoYXIgKmNtZDsKCgkJCXNwcmludGYgKGNtZF9uYW1lLCAiJXMlYyIsIGtiZF9jb21tYW5kX3ByZWZpeCwgKnN1ZmZpeCk7CgoJCQljbWQgPSBnZXRlbnYgKGNtZF9uYW1lKTsKI2lmIDAKCQkJcHJpbnRmICgiIyMjIFNldCBQUkVCT09UIHRvICQoJXMpOiBcIiVzXCJcbiIsCgkJCQkJY21kX25hbWUsIGNtZCA/IGNtZCA6ICI8PE5VTEw+PiIpOwojZW5kaWYKCQkJKmtiZF9kYXRhID0gKnN1ZmZpeDsKCQkJcmV0dXJuIChjbWQpOwoJCX0KCX0KI2lmIDAKCXByaW50ZiAoIiMjIyBEZWxldGUgUFJFQk9PVFxuIik7CiNlbmRpZgoJKmtiZF9kYXRhID0gJ1wwJzsKCXJldHVybiAoTlVMTCk7Cn0KI2VuZGlmIC8qIENPTkZJR19QUkVCT09UICovCgovKi0tLS0tLS0tLS0tLS0tLUJvYXJkIFNwZWNpYWwgQ29tbWFuZHM6IFBJQyByZWFkL3dyaXRlIC0tLS0tLS0tLS0tLS0tLSovCgojaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQlNQKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRiogRnVuY3Rpb246ICAgICBpbnQgZG9fcGljIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywKRiogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYywgY2hhciAqYXJndltdKSBQKkEqWioKICoKUCogUGFyYW1ldGVyczogICBjbWRfdGJsX3QgKmNtZHRwClAqICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byBvdXIgY29tbWFuZCB0YWJsZSBlbnRyeQpQKiAgICAgICAgICAgICAgIGludCBmbGFnClAqICAgICAgICAgICAgICAgIC0gSWYgdGhlIENNRF9GTEFHX1JFUEVBVCBiaXQgaXMgc2V0LCB0aGVuIHRoaXMgY2FsbCBpcwpQKiAgICAgICAgICAgICAgICAgIGEgcmVwZXRpdGlvbgpQKiAgICAgICAgICAgICAgIGludCBhcmdjClAqICAgICAgICAgICAgICAgIC0gQXJndW1lbnQgY291bnQKUCogICAgICAgICAgICAgICBjaGFyICphcmd2W10KUCogICAgICAgICAgICAgICAgLSBBcnJheSBvZiB0aGUgYWN0dWFsIGFyZ3VtZW50cwpQKgpQKiBSZXR1cm52YWx1ZTogIGludApQKiAgICAgICAgICAgICAgICAtIDAgIFRoZSBjb21tYW5kIHdhcyBoYW5kbGVkIHN1Y2Nlc3NmdWxseQpQKiAgICAgICAgICAgICAgICAgIDEgIEFuIGVycm9yIG9jY3VycmVkCiAqCloqIEludGVudGlvbjogICAgSW1wbGVtZW50IHRoZSAicGljIFtyZWFkfHdyaXRlXSIgY29tbWFuZHMuCloqICAgICAgICAgICAgICAgVGhlIHJlYWQgc3ViY29tbWFuZCB0YWtlcyBvbmUgYXJndW1lbnQsIHRoZSByZWdpc3RlciwKWiogICAgICAgICAgICAgICB3aGVyZWFzIHRoZSB3cml0ZSBjb21tYW5kIHRha2VzIHR3bywgdGhlIHJlZ2lzdGVyIGFuZApaKiAgICAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUuCiAqCkQqIERlc2lnbjogICAgICAgd2RAZGVueC5kZQpDKiBDb2Rpbmc6ICAgICAgIHdkQGRlbnguZGUKViogVmVyaWZpY2F0aW9uOiBkenVAZGVueC5kZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCBkb19waWMgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQp7Cgl1Y2hhciByZWcsIHZhbDsKCglzd2l0Y2ggKGFyZ2MpIHsKCWNhc2UgMzoJCQkJCS8qIFBJQyByZWFkIHJlZyAqLwoJCWlmIChzdHJjbXAgKGFyZ3ZbMV0sICJyZWFkIikgIT0gMCkKCQkJYnJlYWs7CgoJCXJlZyA9IHNpbXBsZV9zdHJ0b3VsIChhcmd2WzJdLCBOVUxMLCAxNik7CgoJCXByaW50ZiAoIlBJQyByZWFkOiByZWcgJTAyeDogJTAyeFxuXG4iLCByZWcsIHBpY19yZWFkIChyZWcpKTsKCgkJcmV0dXJuIDA7CgljYXNlIDQ6CQkJCQkvKiBQSUMgd3JpdGUgcmVnIHZhbCAqLwoJCWlmIChzdHJjbXAgKGFyZ3ZbMV0sICJ3cml0ZSIpICE9IDApCgkJCWJyZWFrOwoKCQlyZWcgPSBzaW1wbGVfc3RydG91bCAoYXJndlsyXSwgTlVMTCwgMTYpOwoJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsIChhcmd2WzNdLCBOVUxMLCAxNik7CgoJCXByaW50ZiAoIlBJQyB3cml0ZTogcmVnICUwMnggdmFsIDB4JTAyeDogJTAyeCA9PiAiLAoJCQkJcmVnLCB2YWwsIHBpY19yZWFkIChyZWcpKTsKCQlwaWNfd3JpdGUgKHJlZywgdmFsKTsKCQlwcmludGYgKCIlMDJ4XG5cbiIsIHBpY19yZWFkIChyZWcpKTsKCQlyZXR1cm4gMDsKCWRlZmF1bHQ6CgkJYnJlYWs7Cgl9CglwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOwoJcmV0dXJuIDE7Cn0KY21kX3RibF90IFVfQk9PVF9DTUQocGljKSA9IE1LX0NNRF9FTlRSWSgKCSJwaWMiLAk0LAkxLAlkb19waWMsCgkicGljICAgICAtIHJlYWQgYW5kIHdyaXRlIFBJQyByZWdpc3RlcnNcbiIsCgkicmVhZCAgcmVnICAgICAgLSByZWFkIFBJQyByZWdpc3RlciBgcmVnJ1xuIgoJInBpYyB3cml0ZSByZWcgdmFsICAtIHdyaXRlIHZhbHVlIGB2YWwnIHRvIFBJQyByZWdpc3RlciBgcmVnJ1xuIgopOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkYqIEZ1bmN0aW9uOiAgICAgaW50IGRvX2tiZCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsCkYqICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgUCpBKloqCiAqClAqIFBhcmFtZXRlcnM6ICAgY21kX3RibF90ICpjbWR0cApQKiAgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gb3VyIGNvbW1hbmQgdGFibGUgZW50cnkKUCogICAgICAgICAgICAgICBpbnQgZmxhZwpQKiAgICAgICAgICAgICAgICAtIElmIHRoZSBDTURfRkxBR19SRVBFQVQgYml0IGlzIHNldCwgdGhlbiB0aGlzIGNhbGwgaXMKUCogICAgICAgICAgICAgICAgICBhIHJlcGV0aXRpb24KUCogICAgICAgICAgICAgICBpbnQgYXJnYwpQKiAgICAgICAgICAgICAgICAtIEFyZ3VtZW50IGNvdW50ClAqICAgICAgICAgICAgICAgY2hhciAqYXJndltdClAqICAgICAgICAgICAgICAgIC0gQXJyYXkgb2YgdGhlIGFjdHVhbCBhcmd1bWVudHMKUCoKUCogUmV0dXJudmFsdWU6ICBpbnQKUCogICAgICAgICAgICAgICAgLSAwIGlzIGFsd2F5cyByZXR1cm5lZC4KICoKWiogSW50ZW50aW9uOiAgICBJbXBsZW1lbnQgdGhlICJrYmQiIGNvbW1hbmQuCloqICAgICAgICAgICAgICAgVGhlIGtleWJvYXJkIHN0YXR1cyBpcyByZWFkLiAgVGhlIHJlc3VsdCBpcyBwcmludGVkIG9uCloqICAgICAgICAgICAgICAgdGhlIGNvbnNvbGUgYW5kIHdyaXR0ZW4gaW50byB0aGUgImtleWJkIiBlbnZpcm9ubWVudApaKiAgICAgICAgICAgICAgIHZhcmlhYmxlLgogKgpEKiBEZXNpZ246ICAgICAgIHdkQGRlbnguZGUKQyogQ29kaW5nOiAgICAgICB3ZEBkZW54LmRlClYqIFZlcmlmaWNhdGlvbjogZHp1QGRlbnguZGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgZG9fa2JkIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewoJdWNoYXIga2JkX2RhdGFbS0VZQkRfREFUQUxFTl07Cgl1Y2hhciBrZXliZF9lbnZbMiAqIEtFWUJEX0RBVEFMRU4gKyAxXTsKCXVjaGFyIHZhbDsKCWludCBpOwoKI2lmIDAgLyogRG9uZSBpbiBrYmRfaW5pdCAqLwoJaTJjX2luaXQgKENGR19JMkNfU1BFRUQsIENGR19JMkNfU0xBVkUpOwojZW5kaWYKCgkvKiBSZWFkIGtleXMgKi8KCXZhbCA9IEtFWUJEX0NNRF9SRUFEX0tFWVM7CglpMmNfd3JpdGUgKGtiZF9hZGRyLCAwLCAwLCAmdmFsLCAxKTsKCWkyY19yZWFkIChrYmRfYWRkciwgMCwgMCwga2JkX2RhdGEsIEtFWUJEX0RBVEFMRU4pOwoKCXB1dHMgKCJLZXlzOiIpOwoJZm9yIChpID0gMDsgaSA8IEtFWUJEX0RBVEFMRU47ICsraSkgewoJCXNwcmludGYgKGtleWJkX2VudiArIGkgKyBpLCAiJTAyWCIsIGtiZF9kYXRhW2ldKTsKCQlwcmludGYgKCIgJTAyeCIsIGtiZF9kYXRhW2ldKTsKCX0KCXB1dGMgKCdcbicpOwoJc2V0ZW52ICgia2V5YmQiLCBrZXliZF9lbnYpOwoJcmV0dXJuIDA7Cn0KCmNtZF90YmxfdCBVX0JPT1RfQ01EKGtkYikgPSBNS19DTURfRU5UUlkoCgkia2JkIiwJMSwJMSwJZG9fa2JkLAoJImtiZCAgICAgLSByZWFkIGtleWJvYXJkIHN0YXR1c1xuIiwKCU5VTEwKKTsKCi8qIFJlYWQgYW5kIHNldCBMU0Igc3dpdGNoICovCiNkZWZpbmUgQ0ZHX1BDX1RYRDFfRU5BCQkweDAwMDgJCS8qIFBDLjEyICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRiogRnVuY3Rpb246ICAgICBpbnQgZG9fbHNiIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywKRiogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYywgY2hhciAqYXJndltdKSBQKkEqWioKICoKUCogUGFyYW1ldGVyczogICBjbWRfdGJsX3QgKmNtZHRwClAqICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byBvdXIgY29tbWFuZCB0YWJsZSBlbnRyeQpQKiAgICAgICAgICAgICAgIGludCBmbGFnClAqICAgICAgICAgICAgICAgIC0gSWYgdGhlIENNRF9GTEFHX1JFUEVBVCBiaXQgaXMgc2V0LCB0aGVuIHRoaXMgY2FsbCBpcwpQKiAgICAgICAgICAgICAgICAgIGEgcmVwZXRpdGlvbgpQKiAgICAgICAgICAgICAgIGludCBhcmdjClAqICAgICAgICAgICAgICAgIC0gQXJndW1lbnQgY291bnQKUCogICAgICAgICAgICAgICBjaGFyICphcmd2W10KUCogICAgICAgICAgICAgICAgLSBBcnJheSBvZiB0aGUgYWN0dWFsIGFyZ3VtZW50cwpQKgpQKiBSZXR1cm52YWx1ZTogIGludApQKiAgICAgICAgICAgICAgICAtIDAgIFRoZSBjb21tYW5kIHdhcyBoYW5kbGVkIHN1Y2Nlc3NmdWxseQpQKiAgICAgICAgICAgICAgICAgIDEgIEFuIGVycm9yIG9jY3VycmVkCiAqCloqIEludGVudGlvbjogICAgSW1wbGVtZW50IHRoZSAibHNiIFtvbnxvZmZdIiBjb21tYW5kcy4KWiogICAgICAgICAgICAgICBUaGUgbHNiIGlzIHN3aXRjaGVkIGFjY29yZGluZyB0byB0aGUgZmlyc3QgcGFyYW1ldGVyIGJ5CloqICAgICAgICAgICAgICAgYnkgc2lnbmFsaW5nIHRoZSBQSUMgSS9PIGV4cGFuZGVyLgpaKiAgICAgICAgICAgICAgIENhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cywgdGhlIGN1cnJlbnQgc2V0dGluZyBpcwpaKiAgICAgICAgICAgICAgIHByaW50ZWQuCiAqCkQqIERlc2lnbjogICAgICAgd2RAZGVueC5kZQpDKiBDb2Rpbmc6ICAgICAgIHdkQGRlbnguZGUKViogVmVyaWZpY2F0aW9uOiBkenVAZGVueC5kZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCBkb19sc2IgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQp7Cgl1Y2hhciB2YWw7CglpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CgoJc3dpdGNoIChhcmdjKSB7CgljYXNlIDE6CQkJCQkvKiBsc2IgLSBwcmludCBzZXR0aW5nICovCgkJdmFsID0gcGljX3JlYWQgKDB4NjApOwoJCXByaW50ZiAoIkxTQiBpcyBvJXNcbiIsICh2YWwgJiAweDIwKSA/ICJuIiA6ICJmZiIpOwoJCXJldHVybiAwOwoJY2FzZSAyOgkJCQkJLyogbHNiIG9uIG9yIGxzYiBvZmYgLSBzZXQgc3dpdGNoICovCgkJdmFsID0gcGljX3JlYWQgKDB4NjApOwoKCQlpZiAoc3RyY21wIChhcmd2WzFdLCAib24iKSA9PSAwKSB7CgkJCXZhbCB8PSAweDIwOwoJCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjcGFyICY9IH4oQ0ZHX1BDX1RYRDFfRU5BKTsKCQkJaW1tci0+aW1faW9wb3J0LmlvcF9wY2RhdCB8PSBDRkdfUENfVFhEMV9FTkE7CgkJCWltbXItPmltX2lvcG9ydC5pb3BfcGNkaXIgfD0gQ0ZHX1BDX1RYRDFfRU5BOwoJCX0gZWxzZSBpZiAoc3RyY21wIChhcmd2WzFdLCAib2ZmIikgPT0gMCkgewoJCQl2YWwgJj0gfjB4MjA7CgkJCWltbXItPmltX2lvcG9ydC5pb3BfcGNwYXIgJj0gfihDRkdfUENfVFhEMV9FTkEpOwoJCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjZGF0ICY9IH4oQ0ZHX1BDX1RYRDFfRU5BKTsKCQkJaW1tci0+aW1faW9wb3J0LmlvcF9wY2RpciB8PSBDRkdfUENfVFhEMV9FTkE7CgkJfSBlbHNlIHsKCQkJYnJlYWs7CgkJfQoJCXBpY193cml0ZSAoMHg2MCwgdmFsKTsKCQlyZXR1cm4gMDsKCWRlZmF1bHQ6CgkJYnJlYWs7Cgl9CglwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOwoJcmV0dXJuIDE7Cn0KCmNtZF90YmxfdCBVX0JPT1RfQ01EKGxzYikgPSBNS19DTURfRU5UUlkoCgkibHNiIiwJMiwJMSwJZG9fbHNiLAoJImxzYiAgICAgLSBjaGVjayBhbmQgc2V0IExTQiBzd2l0Y2hcbiIsCgkib24gIC0gc3dpdGNoIExTQiBvblxuIgoJImxzYiBvZmYgLSBzd2l0Y2ggTFNCIG9mZlxuIgoJImxzYiAgICAgLSBwcmludCBjdXJyZW50IHNldHRpbmdcbiIKKTsKCiNlbmRpZiAvKiBDRkdfQ01EX0JTUCAqLwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVdGlsaXRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRiogRnVuY3Rpb246ICAgICB1Y2hhciBwaWNfcmVhZCAodWNoYXIgcmVnKSBQKkEqWioKICoKUCogUGFyYW1ldGVyczogICB1Y2hhciByZWcKUCogICAgICAgICAgICAgICAgLSBSZWdpc3RlciB0byByZWFkClAqClAqIFJldHVybnZhbHVlOiAgdWNoYXIKUCogICAgICAgICAgICAgICAgLSBWYWx1ZSByZWFkIGZyb20gcmVnaXN0ZXIKICoKWiogSW50ZW50aW9uOiAgICBSZWFkIGEgcmVnaXN0ZXIgZnJvbSB0aGUgUElDIEkvTyBleHBhbmRlci4KICoKRCogRGVzaWduOiAgICAgICB3ZEBkZW54LmRlCkMqIENvZGluZzogICAgICAgd2RAZGVueC5kZQpWKiBWZXJpZmljYXRpb246IGR6dUBkZW54LmRlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdWNoYXIgcGljX3JlYWQgKHVjaGFyIHJlZykKewoJcmV0dXJuIChpMmNfcmVnX3JlYWQgKENGR19JMkNfUElDSU9fQUREUiwgcmVnKSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpGKiBGdW5jdGlvbjogICAgIHZvaWQgcGljX3dyaXRlICh1Y2hhciByZWcsIHVjaGFyIHZhbCkgUCpBKloqCiAqClAqIFBhcmFtZXRlcnM6ICAgdWNoYXIgcmVnClAqICAgICAgICAgICAgICAgIC0gUmVnaXN0ZXIgdG8gcmVhZApQKiAgICAgICAgICAgICAgIHVjaGFyIHZhbApQKiAgICAgICAgICAgICAgICAtIFZhbHVlIHRvIHdyaXRlClAqClAqIFJldHVybnZhbHVlOiAgbm9uZQogKgpaKiBJbnRlbnRpb246ICAgIFdyaXRlIHRvIGEgcmVnaXN0ZXIgb24gdGhlIFBJQyBJL08gZXhwYW5kZXIuCiAqCkQqIERlc2lnbjogICAgICAgd2RAZGVueC5kZQpDKiBDb2Rpbmc6ICAgICAgIHdkQGRlbnguZGUKViogVmVyaWZpY2F0aW9uOiBkenVAZGVueC5kZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgcGljX3dyaXRlICh1Y2hhciByZWcsIHVjaGFyIHZhbCkKewoJaTJjX3JlZ193cml0ZSAoQ0ZHX0kyQ19QSUNJT19BRERSLCByZWcsIHZhbCk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCb2FyZCBDb250cm9sIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkYqIEZ1bmN0aW9uOiAgICAgdm9pZCBib2FyZF9wb3dlcm9mZiAodm9pZCkgUCpBKloqCiAqClAqIFBhcmFtZXRlcnM6ICAgbm9uZQpQKgpQKiBSZXR1cm52YWx1ZTogIG5vbmUKICoKWiogSW50ZW50aW9uOiAgICBUdXJuIG9mZiB0aGUgYmF0dGVyeSBwb3dlciBhbmQgbG9vcCBlbmRsZXNzLCBzbyB0aGlzCloqICAgICAgICAgICAgICAgc2hvdWxkIGJldHRlciBiZSB0aGUgbGFzdCBmdW5jdGlvbiB5b3UgY2FsbC4uLgogKgpEKiBEZXNpZ246ICAgICAgIHdkQGRlbnguZGUKQyogQ29kaW5nOiAgICAgICB3ZEBkZW54LmRlClYqIFZlcmlmaWNhdGlvbjogZHp1QGRlbnguZGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIGJvYXJkX3Bvd2Vyb2ZmICh2b2lkKQp7CiAgICAvKiBUdXJuIGJhdHRlcnkgb2ZmICovCiAgICAoKHZvbGF0aWxlIGltbWFwX3QgKilDRkdfSU1NUiktPmltX2lvcG9ydC5pb3BfcGNkYXQgJj0gfigxIDw8ICgzMSAtIDEzKSk7CgogICAgd2hpbGUgKDEpOwp9CgojaWZkZWYgQ09ORklHX01PREVNX1NVUFBPUlQKc3RhdGljIGludCBrZXlfcHJlc3NlZCh2b2lkKQp7Cgl1Y2hhciBrYmRfZGF0YVtLRVlCRF9EQVRBTEVOXTsKCXVjaGFyIHZhbDsKCgkvKiBSZWFkIGtleXMgKi8KCXZhbCA9IEtFWUJEX0NNRF9SRUFEX0tFWVM7CglpMmNfd3JpdGUgKGtiZF9hZGRyLCAwLCAwLCAmdmFsLCAxKTsKCWkyY19yZWFkIChrYmRfYWRkciwgMCwgMCwga2JkX2RhdGEsIEtFWUJEX0RBVEFMRU4pOwoKCXJldHVybiAoY29tcGFyZV9tYWdpYyhrYmRfZGF0YSwgQ09ORklHX01PREVNX0tFWV9NQUdJQykgPT0gMCk7Cn0KI2VuZGlmCS8qIENPTkZJR19NT0RFTV9TVVBQT1JUICovCg==