LyoKICogTW90aW9uIEV5ZSB2aWRlbzRsaW51eCBkcml2ZXIgZm9yIFNvbnkgVmFpbyBQaWN0dXJlQm9vawogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBTdGVsaWFuIFBvcCA8c3RlbGlhbkBwb3BpZXMubmV0PgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBBbGP0dmUgPHd3dy5hbGNvdmUuY29tPgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDAgQW5kcmV3IFRyaWRnZWxsIDx0cmlkZ2VAdmFsaW51eC5jb20+CiAqCiAqIEVhcmxpZXIgd29yayBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIFBhdWwgYFJ1c3R5JyBSdXNzZWxsIGFuZCBQYXVsIE1hY2tlcnJhcy4KICoKICogU29tZSBwYXJ0cyBib3Jyb3dlZCBmcm9tIHZhcmlvdXMgdmlkZW80bGludXggZHJpdmVycywgZXNwZWNpYWxseQogKiBidHR2LWRyaXZlci5jIGFuZCB6b3Jhbi5jLCBzZWUgb3JpZ2luYWwgZmlsZXMgZm9yIGNyZWRpdHMuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KCiNpZm5kZWYgX01FWUVfSF8KI2RlZmluZSBfTUVZRV9IXwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIFByaXZhdGUgQVBJIGZvciBoYW5kbGluZyBtanBlZyBjYXB0dXJlIC8gcGxheWJhY2suICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0cnVjdCBtZXllX3BhcmFtcyB7Cgl1bnNpZ25lZCBjaGFyIHN1YnNhbXBsZTsKCXVuc2lnbmVkIGNoYXIgcXVhbGl0eTsKCXVuc2lnbmVkIGNoYXIgc2hhcnBuZXNzOwoJdW5zaWduZWQgY2hhciBhZ2M7Cgl1bnNpZ25lZCBjaGFyIHBpY3R1cmU7Cgl1bnNpZ25lZCBjaGFyIGZyYW1lcmF0ZTsKfTsKCi8qIHF1ZXJ5IHRoZSBleHRlbmRlZCBwYXJhbWV0ZXJzICovCiNkZWZpbmUgTUVZRUlPQ19HX1BBUkFNUwlfSU9SICgndicsIEJBU0VfVklESU9DUFJJVkFURSswLCBzdHJ1Y3QgbWV5ZV9wYXJhbXMpCi8qIHNldCB0aGUgZXh0ZW5kZWQgcGFyYW1ldGVycyAqLwojZGVmaW5lIE1FWUVJT0NfU19QQVJBTVMJX0lPVyAoJ3YnLCBCQVNFX1ZJRElPQ1BSSVZBVEUrMSwgc3RydWN0IG1leWVfcGFyYW1zKQovKiBxdWV1ZSBhIGJ1ZmZlciBmb3IgbWpwZWcgY2FwdHVyZSAqLwojZGVmaW5lIE1FWUVJT0NfUUJVRl9DQVBUCV9JT1cgKCd2JywgQkFTRV9WSURJT0NQUklWQVRFKzIsIGludCkKLyogc3luYyBhIHByZXZpb3VzbHkgcXVldWVkIG1qcGVnIGJ1ZmZlciAqLwojZGVmaW5lIE1FWUVJT0NfU1lOQwkJX0lPV1IoJ3YnLCBCQVNFX1ZJRElPQ1BSSVZBVEUrMywgaW50KQovKiBnZXQgYSBzdGlsbCB1bmNvbXByZXNzZWQgc25hcHNob3QgKi8KI2RlZmluZSBNRVlFSU9DX1NUSUxMQ0FQVAlfSU8gICgndicsIEJBU0VfVklESU9DUFJJVkFURSs0KQovKiBnZXQgYSBqcGVnIGNvbXByZXNzZWQgc25hcHNob3QgKi8KI2RlZmluZSBNRVlFSU9DX1NUSUxMSkNBUFQJX0lPUiAoJ3YnLCBCQVNFX1ZJRElPQ1BSSVZBVEUrNSwgaW50KQoKLyogVjRMMiBwcml2YXRlIGNvbnRyb2xzICovCiNkZWZpbmUgVjRMMl9DSURfQUdDCQlWNEwyX0NJRF9QUklWQVRFX0JBU0UKI2RlZmluZSBWNEwyX0NJRF9TSEFSUE5FU1MJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDEpCiNkZWZpbmUgVjRMMl9DSURfUElDVFVSRQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMikKI2RlZmluZSBWNEwyX0NJRF9KUEVHUVVBTAkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMykKI2RlZmluZSBWNEwyX0NJRF9GUkFNRVJBVEUJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDQpCgojZW5kaWYK