Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIGZzY2suYyAtIGEgZmlsZSBzeXN0ZW0gY29uc2lzdGVuY3kgY2hlY2tlciBmb3IgTGludXguCiAqCiAqIChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzLiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQKICogYXMgcGVyIHRoZSBHTlUgY29weWxlZnQuCiAqLwoKLyoKICogMDkuMTEuOTEgIC0gIG1hZGUgdGhlIGZpcnN0IHJ1ZGltZXRhcnkgZnVuY3Rpb25zCiAqCiAqIDEwLjExLjkxICAtICB1cGRhdGVkLCBkb2VzIGNoZWNraW5nLCBubyByZXBhaXJzIHlldC4KICoJCVNlbnQgb3V0IHRvIHRoZSBtYWlsaW5nLWxpc3QgZm9yIHRlc3RpbmcuCiAqCiAqIDE0LjExLjkxICAtCVRlc3Rpbmcgc2VlbXMgdG8gaGF2ZSBnb25lIHdlbGwuIEFkZGVkIHNvbWUKICoJCWNvcnJlY3Rpb24tY29kZSwgYW5kIGNoYW5nZWQgc29tZSBmdW5jdGlvbnMuCiAqCiAqIDE1LjExLjkxICAtICBNb3JlIGNvcnJlY3Rpb24gY29kZS4gSG9wZWZ1bGx5IGl0IG5vdGljZXMgbW9zdAogKgkJY2FzZXMgbm93LCBhbmQgdHJpZXMgdG8gZG8gc29tZXRoaW5nIGFib3V0IHRoZW0uCiAqCiAqIDE2LjExLjkxICAtICBNb3JlIGNvcnJlY3Rpb25zICh0aGFua3MgdG8gTWlrYSBKYWxhdmEpLiBNb3N0CiAqCQl0aGluZ3Mgc2VlbSB0byB3b3JrIG5vdy4gWWVhaCwgc3VyZS4KICoKICoKICogMTkuMDQuOTIgIC0JSGFkIHRvIHN0YXJ0IG92ZXIgYWdhaW4gZnJvbSB0aGlzIG9sZCB2ZXJzaW9uLCBhcyBhCiAqCQlrZXJuZWwgYnVnIGF0ZSBteSBlbmhhbmNlZCBmc2NrIGluIGZlYnJ1YXJ5LgogKgogKiAyOC4wMi45MyAgLQlhZGRlZCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgZGlyZWN0b3J5IGVudHJ5IHNpemVzLi4KICoKICogU2F0IE1hciAgNiAxODo1OTo0MiAxOTkzLCBmYWl0aEBjcy51bmMuZWR1OiBPdXRwdXQgbmFtZWxlbiB3aXRoCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXItYmxvY2sgaW5mb3JtYXRpb24KICoKICogU2F0IE9jdCAgOSAxMToxNzoxMSAxOTkzLCBmYWl0aEBjcy51bmMuZWR1OiBtYWtlIGV4aXQgc3RhdHVzIGNvbmZvcm0KICogICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGF0IHJlcXVpcmVkIGJ5IGZzdXRpbAogKgogKiBNb24gSmFuICAzIDExOjA2OjUyIDE5OTQgLSBEci4gV2V0dHN0ZWluIChncmVnJXdpbmQudXVjcEBwbGFpbnMubm9kYWsuZWR1KQogKgkJCSAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGZpbGUgc3lzdGVtIHZhbGlkIGZsYWcuICBBbHNvCiAqCQkJICAgICAgYWRkZWQgcHJvZ3JhbV92ZXJzaW9uIHZhcmlhYmxlIGFuZCBvdXRwdXQgb2YKICoJCQkgICAgICBwcm9ncmFtIG5hbWUgYW5kIHZlcnNpb24gbnVtYmVyIHdoZW4gcHJvZ3JhbQogKgkJCSAgICAgIGlzIGV4ZWN1dGVkLgogKgogKiAzMC4xMC45NCAtIGFkZGVkIHN1cHBvcnQgZm9yIHYyIGZpbGVzeXN0ZW0KICogICAgICAgICAgICAoQW5kcmVhcyBTY2h3YWIsIHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZSkKICoKICogMTAuMTIuOTQgIC0gIGFkZGVkIHRlc3QgdG8gcHJldmVudCBjaGVja2luZyBvZiBtb3VudGVkIGZzIGFkYXB0ZWQKICogICAgICAgICAgICAgIGZyb20gVGhlb2RvcmUgVHMnbydzICh0eXRzb0BhdGhlbmEubWl0LmVkdSkgZTJmc2NrCiAqICAgICAgICAgICAgICBwcm9ncmFtLiAgKERhbmllbCBRdWlubGFuLCBxdWlubGFuQHlnZ2RyYXNpbC5jb20pCiAqCiAqIDAxLjA3Ljk2ICAtIEZpeGVkIHRoZSB2MiBmcyBzdHVmZiB0byB1c2UgdGhlIHJpZ2h0ICNkZWZpbmVzIGFuZCBzdWNoCiAqCSAgICAgICBmb3IgbW9kZXJuIGxpYmNzIChqYW5sQG1hdGgudWlvLm5vLCBOaWNvbGFpIExhbmdmZWxkdCkKICoKICogMDIuMDcuOTYgIC0gQWRkZWQgQyBiaXQgZmlkZGxpbmcgcm91dGluZXMgZnJvbSBybWtAZWNzLnNvdG9uLmFjLnVrIAogKiAgICAgICAgICAgICAoUnVzc2VsbCBLaW5nKS4gIEhlIG1hZGUgdGhlbSBmb3IgQVJNLiAgSXQgd291bGQgc2VlbQogKgkgICAgICAgdGhhdCB0aGUgQVJNIGlzIHBvd2VyZnVsIGVub3VnaCB0byBkbyB0aGlzIGluIEMgd2hlcmVhcwogKiAgICAgICAgICAgICBpMzg2IGFuZCBtNjRrIG11c3QgdXNlIGFzc2VtYmx5IHRvIGdldCBpdCBmYXN0ID46LSkKICoJICAgICAgIFRoaXMgc2hvdWxkIG1ha2UgbWluaXggZnNjayBzeXN0ZW1pbmRlcGVuZGVudC4KICoJICAgICAgIChqYW5sQG1hdGgudWlvLm5vLCBOaWNvbGFpIExhbmdmZWxkdCkKICoKICogMDQuMTEuOTYgIC0gQWRkZWQgbWlub3IgZml4ZXMgZnJvbSBBbmRyZWFzIFNjaHdhYiB0byBhdm9pZCBjb21waWxlcgogKiAgICAgICAgICAgICB3YXJuaW5ncy4gIEFkZGVkIG1jNjhrIGJpdG9wcyBmcm9tIAogKgkgICAgICAgSm9lcmcgRG9yY2hhaW4gPGRvcmNoYWluQG1waS1zYi5tcGcuZGU+LgogKgogKiAwNi4xMS45NiAgLSBBZGRlZCB2MiBjb2RlIHN1Ym1pdHRlZCBieSBKb2VyZyBEb3JjaGFpbiwgYnV0IHdyaXR0ZW4gYnkKICogICAgICAgICAgICAgQW5kcmVhcyBTY2h3YWIuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqCiAqIEkndmUgaGFkIG5vIHRpbWUgdG8gYWRkIGNvbW1lbnRzIC0gaG9wZWZ1bGx5IHRoZSBmdW5jdGlvbiBuYW1lcwogKiBhcmUgY29tbWVudHMgZW5vdWdoLiBBcyB3aXRoIGFsbCBmaWxlIHN5c3RlbSBjaGVja2VycywgdGhpcyBhc3N1bWVzCiAqIHRoZSBmaWxlIHN5c3RlbSBpcyBxdWllc2NlbnQgLSBkb24ndCB1c2UgaXQgb24gYSBtb3VudGVkIGRldmljZQogKiB1bmxlc3MgeW91IGNhbiBiZSBzdXJlIG5vYm9keSBpcyB3cml0aW5nIHRvIGl0IChhbmQgcmVtZW1iZXIgdGhhdCB0aGUKICoga2VybmVsIGNhbiB3cml0ZSB0byBpdCB3aGVuIGl0IHNlYXJjaGVzIGZvciBmaWxlcykuCiAqCiAqIFVzdWFnZTogZnNjayBbLWxhcnZzbV0gZGV2aWNlCiAqCS1sIGZvciBhIGxpc3Rpbmcgb2YgYWxsIHRoZSBmaWxlbmFtZXMKICoJLWEgZm9yIGF1dG9tYXRpYyByZXBhaXJzIChub3QgaW1wbGVtZW50ZWQpCiAqCS1yIGZvciByZXBhaXJzIChpbnRlcmFjdGl2ZSkgKG5vdCBpbXBsZW1lbnRlZCkKICoJLXYgZm9yIHZlcmJvc2UgKHRlbGxzIGhvdyBtYW55IGZpbGVzKQogKgktcyBmb3Igc3VwZXItYmxvY2sgaW5mbwogKgktbSBmb3IgbWluaXgtbGlrZSAibW9kZSBub3QgY2xlYXJlZCIgd2FybmluZ3MKICoJLWYgZm9yY2UgZmlsZXN5c3RlbSBjaGVjayBldmVuIGlmIGZpbGVzeXN0ZW0gbWFya2VkIGFzIHZhbGlkCiAqCiAqIFRoZSBkZXZpY2UgbWF5IGJlIGEgYmxvY2sgZGV2aWNlIG9yIGEgaW1hZ2Ugb2Ygb25lLCBidXQgdGhpcyBpc24ndAogKiBlbmZvcmNlZCAoYnV0IGl0J3Mgbm90IG11Y2ggZnVuIG9uIGEgY2hhcmFjdGVyIGRldmljZSA6LSkuIAogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8dGVybWlvcy5oPgojaW5jbHVkZSA8bW50ZW50Lmg+CiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2luY2x1ZGUgImJ1c3lib3guaCIKCnN0YXRpYyBjb25zdCBpbnQgTUlOSVhfUk9PVF9JTk8gPSAxOwpzdGF0aWMgY29uc3QgaW50IE1JTklYX0xJTktfTUFYID0gMjUwOwpzdGF0aWMgY29uc3QgaW50IE1JTklYMl9MSU5LX01BWCA9IDY1NTMwOwoKc3RhdGljIGNvbnN0IGludCBNSU5JWF9JX01BUF9TTE9UUyA9IDg7CnN0YXRpYyBjb25zdCBpbnQgTUlOSVhfWl9NQVBfU0xPVFMgPSA2NDsKc3RhdGljIGNvbnN0IGludCBNSU5JWF9TVVBFUl9NQUdJQyA9IDB4MTM3RjsJCS8qIG9yaWdpbmFsIG1pbml4IGZzICovCnN0YXRpYyBjb25zdCBpbnQgTUlOSVhfU1VQRVJfTUFHSUMyID0gMHgxMzhGOwkJLyogbWluaXggZnMsIDMwIGNoYXIgbmFtZXMgKi8Kc3RhdGljIGNvbnN0IGludCBNSU5JWDJfU1VQRVJfTUFHSUMgPSAweDI0Njg7CQkvKiBtaW5peCBWMiBmcyAqLwpzdGF0aWMgY29uc3QgaW50IE1JTklYMl9TVVBFUl9NQUdJQzIgPSAweDI0Nzg7CQkvKiBtaW5peCBWMiBmcywgMzAgY2hhciBuYW1lcyAqLwpzdGF0aWMgY29uc3QgaW50IE1JTklYX1ZBTElEX0ZTID0gMHgwMDAxOwkJLyogQ2xlYW4gZnMuICovCnN0YXRpYyBjb25zdCBpbnQgTUlOSVhfRVJST1JfRlMgPSAweDAwMDI7CQkvKiBmcyBoYXMgZXJyb3JzLiAqLwoKI2RlZmluZSBNSU5JWF9JTk9ERVNfUEVSX0JMT0NLICgoQkxPQ0tfU0laRSkvKHNpemVvZiAoc3RydWN0IG1pbml4X2lub2RlKSkpCiNkZWZpbmUgTUlOSVgyX0lOT0RFU19QRVJfQkxPQ0sgKChCTE9DS19TSVpFKS8oc2l6ZW9mIChzdHJ1Y3QgbWluaXgyX2lub2RlKSkpCgpzdGF0aWMgY29uc3QgaW50IE1JTklYX1YxID0gMHgwMDAxOwkJLyogb3JpZ2luYWwgbWluaXggZnMgKi8Kc3RhdGljIGNvbnN0IGludCBNSU5JWF9WMiA9IDB4MDAwMjsJCS8qIG1pbml4IFYyIGZzICovCgojZGVmaW5lIElOT0RFX1ZFUlNJT04oaW5vZGUpCWlub2RlLT5pX3NiLT51Lm1pbml4X3NiLnNfdmVyc2lvbgoKLyoKICogVGhpcyBpcyB0aGUgb3JpZ2luYWwgbWluaXggaW5vZGUgbGF5b3V0IG9uIGRpc2suCiAqIE5vdGUgdGhlIDgtYml0IGdpZCBhbmQgYXRpbWUgYW5kIGN0aW1lLgogKi8Kc3RydWN0IG1pbml4X2lub2RlIHsKCXVfaW50MTZfdCBpX21vZGU7Cgl1X2ludDE2X3QgaV91aWQ7Cgl1X2ludDMyX3QgaV9zaXplOwoJdV9pbnQzMl90IGlfdGltZTsKCXVfaW50OF90ICBpX2dpZDsKCXVfaW50OF90ICBpX25saW5rczsKCXVfaW50MTZfdCBpX3pvbmVbOV07Cn07CgovKgogKiBUaGUgbmV3IG1pbml4IGlub2RlIGhhcyBhbGwgdGhlIHRpbWUgZW50cmllcywgYXMgd2VsbCBhcwogKiBsb25nIGJsb2NrIG51bWJlcnMgYW5kIGEgdGhpcmQgaW5kaXJlY3QgYmxvY2sgKDcrMSsxKzEKICogaW5zdGVhZCBvZiA3KzErMSkuIEFsc28sIHNvbWUgcHJldmlvdXNseSA4LWJpdCB2YWx1ZXMgYXJlCiAqIG5vdyAxNi1iaXQuIFRoZSBpbm9kZSBpcyBub3cgNjQgYnl0ZXMgaW5zdGVhZCBvZiAzMi4KICovCnN0cnVjdCBtaW5peDJfaW5vZGUgewoJdV9pbnQxNl90IGlfbW9kZTsKCXVfaW50MTZfdCBpX25saW5rczsKCXVfaW50MTZfdCBpX3VpZDsKCXVfaW50MTZfdCBpX2dpZDsKCXVfaW50MzJfdCBpX3NpemU7Cgl1X2ludDMyX3QgaV9hdGltZTsKCXVfaW50MzJfdCBpX210aW1lOwoJdV9pbnQzMl90IGlfY3RpbWU7Cgl1X2ludDMyX3QgaV96b25lWzEwXTsKfTsKCi8qCiAqIG1pbml4IHN1cGVyLWJsb2NrIGRhdGEgb24gZGlzawogKi8Kc3RydWN0IG1pbml4X3N1cGVyX2Jsb2NrIHsKCXVfaW50MTZfdCBzX25pbm9kZXM7Cgl1X2ludDE2X3Qgc19uem9uZXM7Cgl1X2ludDE2X3Qgc19pbWFwX2Jsb2NrczsKCXVfaW50MTZfdCBzX3ptYXBfYmxvY2tzOwoJdV9pbnQxNl90IHNfZmlyc3RkYXRhem9uZTsKCXVfaW50MTZfdCBzX2xvZ196b25lX3NpemU7Cgl1X2ludDMyX3Qgc19tYXhfc2l6ZTsKCXVfaW50MTZfdCBzX21hZ2ljOwoJdV9pbnQxNl90IHNfc3RhdGU7Cgl1X2ludDMyX3Qgc196b25lczsKfTsKCnN0cnVjdCBtaW5peF9kaXJfZW50cnkgewoJdV9pbnQxNl90IGlub2RlOwoJY2hhciBuYW1lWzBdOwp9OwoKI2RlZmluZSBCTE9DS19TSVpFX0JJVFMgMTAKI2RlZmluZSBCTE9DS19TSVpFICgxPDxCTE9DS19TSVpFX0JJVFMpCgojZGVmaW5lIE5BTUVfTUFYICAgICAgICAgMjU1ICAgLyogIyBjaGFycyBpbiBhIGZpbGUgbmFtZSAqLwoKI2RlZmluZSBNSU5JWF9JTk9ERVNfUEVSX0JMT0NLICgoQkxPQ0tfU0laRSkvKHNpemVvZiAoc3RydWN0IG1pbml4X2lub2RlKSkpCgojaWZuZGVmIEJMS0dFVFNJWkUKI2RlZmluZSBCTEtHRVRTSVpFIF9JTygweDEyLDk2KSAgICAvKiByZXR1cm4gZGV2aWNlIHNpemUgKi8KI2VuZGlmCgojaWZuZGVmIF9fbGludXhfXwojZGVmaW5lIHZvbGF0aWxlCiNlbmRpZgoKc3RhdGljIGNvbnN0IGludCBST09UX0lOTyA9IDE7CgojZGVmaW5lIFVQUEVSKHNpemUsbikgKChzaXplKygobiktMSkpLyhuKSkKI2RlZmluZSBJTk9ERV9TSVpFIChzaXplb2Yoc3RydWN0IG1pbml4X2lub2RlKSkKI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCiNkZWZpbmUgSU5PREVfU0laRTIgKHNpemVvZihzdHJ1Y3QgbWluaXgyX2lub2RlKSkKI2RlZmluZSBJTk9ERV9CTE9DS1MgVVBQRVIoSU5PREVTLCAodmVyc2lvbjIgPyBNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyBcCgkJCQkgICAgOiBNSU5JWF9JTk9ERVNfUEVSX0JMT0NLKSkKI2Vsc2UKI2RlZmluZSBJTk9ERV9CTE9DS1MgVVBQRVIoSU5PREVTLCAoTUlOSVhfSU5PREVTX1BFUl9CTE9DSykpCiNlbmRpZgojZGVmaW5lIElOT0RFX0JVRkZFUl9TSVpFIChJTk9ERV9CTE9DS1MgKiBCTE9DS19TSVpFKQoKI2RlZmluZSBCSVRTX1BFUl9CTE9DSyAoQkxPQ0tfU0laRTw8MykKCnN0YXRpYyBjaGFyICpwcm9ncmFtX3ZlcnNpb24gPSAiMS4yIC0gMTEvMTEvOTYiOwpzdGF0aWMgY2hhciAqZGV2aWNlX25hbWUgPSBOVUxMOwpzdGF0aWMgaW50IElOOwpzdGF0aWMgaW50IHJlcGFpciA9IDAsIGF1dG9tYXRpYyA9IDAsIHZlcmJvc2UgPSAwLCBsaXN0ID0gMCwgc2hvdyA9CgkwLCB3YXJuX21vZGUgPSAwLCBmb3JjZSA9IDA7CnN0YXRpYyBpbnQgZGlyZWN0b3J5ID0gMCwgcmVndWxhciA9IDAsIGJsb2NrZGV2ID0gMCwgY2hhcmRldiA9IDAsIGxpbmtzID0KCTAsIHN5bWxpbmtzID0gMCwgdG90YWwgPSAwOwoKc3RhdGljIGludCBjaGFuZ2VkID0gMDsJCQkvKiBmbGFncyBpZiB0aGUgZmlsZXN5c3RlbSBoYXMgYmVlbiBjaGFuZ2VkICovCnN0YXRpYyBpbnQgZXJyb3JzX3VuY29ycmVjdGVkID0gMDsJLyogZmxhZyBpZiBzb21lIGVycm9yIHdhcyBub3QgY29ycmVjdGVkICovCnN0YXRpYyBpbnQgZGlyc2l6ZSA9IDE2OwpzdGF0aWMgaW50IG5hbWVsZW4gPSAxNDsKc3RhdGljIGludCB2ZXJzaW9uMiA9IDA7CnN0YXRpYyBzdHJ1Y3QgdGVybWlvcyB0ZXJtaW9zOwpzdGF0aWMgaW50IHRlcm1pb3Nfc2V0ID0gMDsKCi8qIEZpbGUtbmFtZSBkYXRhICovCnN0YXRpYyBjb25zdCBpbnQgTUFYX0RFUFRIID0gMzI7CnN0YXRpYyBpbnQgbmFtZV9kZXB0aCA9IDA7Ci8vIHN0YXRpYyBjaGFyIG5hbWVfbGlzdFtNQVhfREVQVEhdW0JVRlNJWiArIDFdOwpzdGF0aWMgY2hhciAqKm5hbWVfbGlzdCA9IE5VTEw7CgpzdGF0aWMgY2hhciAqaW5vZGVfYnVmZmVyID0gTlVMTDsKCiNkZWZpbmUgSW5vZGUgKCgoc3RydWN0IG1pbml4X2lub2RlICopIGlub2RlX2J1ZmZlciktMSkKI2RlZmluZSBJbm9kZTIgKCgoc3RydWN0IG1pbml4Ml9pbm9kZSAqKSBpbm9kZV9idWZmZXIpLTEpCnN0YXRpYyBjaGFyIHN1cGVyX2Jsb2NrX2J1ZmZlcltCTE9DS19TSVpFXTsKCiNkZWZpbmUgU3VwZXIgKCooc3RydWN0IG1pbml4X3N1cGVyX2Jsb2NrICopc3VwZXJfYmxvY2tfYnVmZmVyKQojZGVmaW5lIElOT0RFUyAoKHVuc2lnbmVkIGxvbmcpU3VwZXIuc19uaW5vZGVzKQojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKI2RlZmluZSBaT05FUyAoKHVuc2lnbmVkIGxvbmcpKHZlcnNpb24yID8gU3VwZXIuc196b25lcyA6IFN1cGVyLnNfbnpvbmVzKSkKI2Vsc2UKI2RlZmluZSBaT05FUyAoKHVuc2lnbmVkIGxvbmcpKFN1cGVyLnNfbnpvbmVzKSkKI2VuZGlmCiNkZWZpbmUgSU1BUFMgKCh1bnNpZ25lZCBsb25nKVN1cGVyLnNfaW1hcF9ibG9ja3MpCiNkZWZpbmUgWk1BUFMgKCh1bnNpZ25lZCBsb25nKVN1cGVyLnNfem1hcF9ibG9ja3MpCiNkZWZpbmUgRklSU1RaT05FICgodW5zaWduZWQgbG9uZylTdXBlci5zX2ZpcnN0ZGF0YXpvbmUpCiNkZWZpbmUgWk9ORVNJWkUgKCh1bnNpZ25lZCBsb25nKVN1cGVyLnNfbG9nX3pvbmVfc2l6ZSkKI2RlZmluZSBNQVhTSVpFICgodW5zaWduZWQgbG9uZylTdXBlci5zX21heF9zaXplKQojZGVmaW5lIE1BR0lDIChTdXBlci5zX21hZ2ljKQojZGVmaW5lIE5PUk1fRklSU1RaT05FICgyK0lNQVBTK1pNQVBTK0lOT0RFX0JMT0NLUykKCnN0YXRpYyBjaGFyICppbm9kZV9tYXA7CnN0YXRpYyBjaGFyICp6b25lX21hcDsKCnN0YXRpYyB1bnNpZ25lZCBjaGFyICppbm9kZV9jb3VudCA9IE5VTEw7CnN0YXRpYyB1bnNpZ25lZCBjaGFyICp6b25lX2NvdW50ID0gTlVMTDsKCnN0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjayh1bnNpZ25lZCBpbnQgaW5vKTsKI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjazIodW5zaWduZWQgaW50IGlubyk7CiNlbmRpZgoKc3RhdGljIGlubGluZSBpbnQgYml0KGNoYXIgKiBhLHVuc2lnbmVkIGludCBpKQp7CgkgIHJldHVybiAoYVtpID4+IDNdICYgKDE8PChpICYgNykpKSAhPSAwOwp9CiNkZWZpbmUgaW5vZGVfaW5fdXNlKHgpIChiaXQoaW5vZGVfbWFwLCh4KSkpCiNkZWZpbmUgem9uZV9pbl91c2UoeCkgKGJpdCh6b25lX21hcCwoeCktRklSU1RaT05FKzEpKQoKI2RlZmluZSBtYXJrX2lub2RlKHgpIChzZXRiaXQoaW5vZGVfbWFwLCh4KSksY2hhbmdlZD0xKQojZGVmaW5lIHVubWFya19pbm9kZSh4KSAoY2xyYml0KGlub2RlX21hcCwoeCkpLGNoYW5nZWQ9MSkKCiNkZWZpbmUgbWFya196b25lKHgpIChzZXRiaXQoem9uZV9tYXAsKHgpLUZJUlNUWk9ORSsxKSxjaGFuZ2VkPTEpCiNkZWZpbmUgdW5tYXJrX3pvbmUoeCkgKGNscmJpdCh6b25lX21hcCwoeCktRklSU1RaT05FKzEpLGNoYW5nZWQ9MSkKCnN0YXRpYyB2b2lkIGxlYXZlKGludCkgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSk7CnN0YXRpYyB2b2lkIGxlYXZlKGludCBzdGF0dXMpCnsKCWlmICh0ZXJtaW9zX3NldCkKCQl0Y3NldGF0dHIoMCwgVENTQU5PVywgJnRlcm1pb3MpOwoJZXhpdChzdGF0dXMpOwp9CgpzdGF0aWMgdm9pZCBkaWUoY29uc3QgY2hhciAqc3RyKQp7CgllcnJvcl9tc2coIiVzIiwgc3RyKTsKCWxlYXZlKDgpOwp9CgovKgogKiBUaGlzIHNpbXBseSBnb2VzIHRocm91Z2ggdGhlIGZpbGUtbmFtZSBkYXRhIGFuZCBwcmludHMgb3V0IHRoZQogKiBjdXJyZW50IGZpbGUuCiAqLwpzdGF0aWMgdm9pZCBwcmludF9jdXJyZW50X25hbWUodm9pZCkKewoJaW50IGkgPSAwOwoKCXdoaWxlIChpIDwgbmFtZV9kZXB0aCkKCQlwcmludGYoIi8lLipzIiwgbmFtZWxlbiwgbmFtZV9saXN0W2krK10pOwoJaWYgKGkgPT0gMCkKCQlwcmludGYoIi8iKTsKfQoKc3RhdGljIGludCBhc2soY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgZGVmKQp7CglpbnQgYzsKCglpZiAoIXJlcGFpcikgewoJCXByaW50ZigiXG4iKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCXJldHVybiAwOwoJfQoJaWYgKGF1dG9tYXRpYykgewoJCXByaW50ZigiXG4iKTsKCQlpZiAoIWRlZikKCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQlyZXR1cm4gZGVmOwoJfQoJcHJpbnRmKGRlZiA/ICIlcyAoeS9uKT8gIiA6ICIlcyAobi95KT8gIiwgc3RyaW5nKTsKCWZvciAoOzspIHsKCQlmZmx1c2goc3Rkb3V0KTsKCQlpZiAoKGMgPSBnZXRjaGFyKCkpID09IEVPRikgewoJCQlpZiAoIWRlZikKCQkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJCXJldHVybiBkZWY7CgkJfQoJCWMgPSB0b3VwcGVyKGMpOwoJCWlmIChjID09ICdZJykgewoJCQlkZWYgPSAxOwoJCQlicmVhazsKCQl9IGVsc2UgaWYgKGMgPT0gJ04nKSB7CgkJCWRlZiA9IDA7CgkJCWJyZWFrOwoJCX0gZWxzZSBpZiAoYyA9PSAnICcgfHwgYyA9PSAnXG4nKQoJCQlicmVhazsKCX0KCWlmIChkZWYpCgkJcHJpbnRmKCJ5XG4iKTsKCWVsc2UgewoJCXByaW50ZigiblxuIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCXJldHVybiBkZWY7Cn0KCi8qCiAqIE1ha2UgY2VydGFpbiB0aGF0IHdlIGFyZW4ndCBjaGVja2luZyBhIGZpbGVzeXN0ZW0gdGhhdCBpcyBvbiBhCiAqIG1vdW50ZWQgcGFydGl0aW9uLiAgQ29kZSBhZGFwdGVkIGZyb20gZTJmc2NrLCBDb3B5cmlnaHQgKEMpIDE5OTMsCiAqIDE5OTQgVGhlb2RvcmUgVHMnby4gIEFsc28gbGljZW5zZWQgdW5kZXIgR1BMLgogKi8Kc3RhdGljIHZvaWQgY2hlY2tfbW91bnQodm9pZCkKewoJRklMRSAqZjsKCXN0cnVjdCBtbnRlbnQgKm1udDsKCWludCBjb250OwoJaW50IGZkOwoKCWlmICgoZiA9IHNldG1udGVudChNT1VOVEVELCAiciIpKSA9PSBOVUxMKQoJCXJldHVybjsKCXdoaWxlICgobW50ID0gZ2V0bW50ZW50KGYpKSAhPSBOVUxMKQoJCWlmIChzdHJjbXAoZGV2aWNlX25hbWUsIG1udC0+bW50X2ZzbmFtZSkgPT0gMCkKCQkJYnJlYWs7CgllbmRtbnRlbnQoZik7CglpZiAoIW1udCkKCQlyZXR1cm47CgoJLyoKCSAqIElmIHRoZSByb290IGlzIG1vdW50ZWQgcmVhZC1vbmx5LCB0aGVuIC9ldGMvbXRhYiBpcwoJICogcHJvYmFibHkgbm90IGNvcnJlY3Q7IHNvIHdlIHdvbid0IGlzc3VlIGEgd2FybmluZyBiYXNlZCBvbgoJICogaXQuCgkgKi8KCWZkID0gb3BlbihNT1VOVEVELCBPX1JEV1IpOwoJaWYgKGZkIDwgMCAmJiBlcnJubyA9PSBFUk9GUykKCQlyZXR1cm47CgllbHNlCgkJY2xvc2UoZmQpOwoKCXByaW50ZigiJXMgaXMgbW91bnRlZC4JICIsIGRldmljZV9uYW1lKTsKCWlmIChpc2F0dHkoMCkgJiYgaXNhdHR5KDEpKQoJCWNvbnQgPSBhc2soIkRvIHlvdSByZWFsbHkgd2FudCB0byBjb250aW51ZSIsIDApOwoJZWxzZQoJCWNvbnQgPSAwOwoJaWYgKCFjb250KSB7CgkJcHJpbnRmKCJjaGVjayBhYm9ydGVkLlxuIik7CgkJZXhpdCgwKTsKCX0KCXJldHVybjsKfQoKLyoKICogY2hlY2tfem9uZV9uciBjaGVja3MgdG8gc2VlIHRoYXQgKm5yIGlzIGEgdmFsaWQgem9uZSBuci4gSWYgaXQKICogaXNuJ3QsIGl0IHdpbGwgcG9zc2libHkgYmUgcmVwYWlyZWQuIENoZWNrX3pvbmVfbnIgc2V0cyAqY29ycmVjdGVkCiAqIGlmIGFuIGVycm9yIHdhcyBjb3JyZWN0ZWQsIGFuZCByZXR1cm5zIHRoZSB6b25lICgwIGZvciBubyB6b25lCiAqIG9yIGEgYmFkIHpvbmUtbnVtYmVyKS4KICovCnN0YXRpYyBpbnQgY2hlY2tfem9uZV9ucih1bnNpZ25lZCBzaG9ydCAqbnIsIGludCAqY29ycmVjdGVkKQp7CglpZiAoISpucikKCQlyZXR1cm4gMDsKCWlmICgqbnIgPCBGSVJTVFpPTkUpCgkJcHJpbnRmKCJab25lIG5yIDwgRklSU1RaT05FIGluIGZpbGUgYCIpOwoJZWxzZSBpZiAoKm5yID49IFpPTkVTKQoJCXByaW50ZigiWm9uZSBuciA+PSBaT05FUyBpbiBmaWxlIGAiKTsKCWVsc2UKCQlyZXR1cm4gKm5yOwoJcHJpbnRfY3VycmVudF9uYW1lKCk7CglwcmludGYoIicuIik7CglpZiAoYXNrKCJSZW1vdmUgYmxvY2siLCAxKSkgewoJCSpuciA9IDA7CgkJKmNvcnJlY3RlZCA9IDE7Cgl9CglyZXR1cm4gMDsKfQoKI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyBpbnQgY2hlY2tfem9uZV9ucjIodW5zaWduZWQgaW50ICpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCWlmICghKm5yKQoJCXJldHVybiAwOwoJaWYgKCpuciA8IEZJUlNUWk9ORSkKCQlwcmludGYoIlpvbmUgbnIgPCBGSVJTVFpPTkUgaW4gZmlsZSBgIik7CgllbHNlIGlmICgqbnIgPj0gWk9ORVMpCgkJcHJpbnRmKCJab25lIG5yID49IFpPTkVTIGluIGZpbGUgYCIpOwoJZWxzZQoJCXJldHVybiAqbnI7CglwcmludF9jdXJyZW50X25hbWUoKTsKCXByaW50ZigiJy4iKTsKCWlmIChhc2soIlJlbW92ZSBibG9jayIsIDEpKSB7CgkJKm5yID0gMDsKCQkqY29ycmVjdGVkID0gMTsKCX0KCXJldHVybiAwOwp9CiNlbmRpZgoKLyoKICogcmVhZC1ibG9jayByZWFkcyBibG9jayBuciBpbnRvIHRoZSBidWZmZXIgYXQgYWRkci4KICovCnN0YXRpYyB2b2lkIHJlYWRfYmxvY2sodW5zaWduZWQgaW50IG5yLCBjaGFyICphZGRyKQp7CglpZiAoIW5yKSB7CgkJbWVtc2V0KGFkZHIsIDAsIEJMT0NLX1NJWkUpOwoJCXJldHVybjsKCX0KCWlmIChCTE9DS19TSVpFICogbnIgIT0gbHNlZWsoSU4sIEJMT0NLX1NJWkUgKiBuciwgU0VFS19TRVQpKSB7CgkJcHJpbnRmKCJSZWFkIGVycm9yOiB1bmFibGUgdG8gc2VlayB0byBibG9jayBpbiBmaWxlICciKTsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIidcbiIpOwoJCW1lbXNldChhZGRyLCAwLCBCTE9DS19TSVpFKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfSBlbHNlIGlmIChCTE9DS19TSVpFICE9IHJlYWQoSU4sIGFkZHIsIEJMT0NLX1NJWkUpKSB7CgkJcHJpbnRmKCJSZWFkIGVycm9yOiBiYWQgYmxvY2sgaW4gZmlsZSAnIik7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCInXG4iKTsKCQltZW1zZXQoYWRkciwgMCwgQkxPQ0tfU0laRSk7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KfQoKLyoKICogd3JpdGVfYmxvY2sgd3JpdGVzIGJsb2NrIG5yIHRvIGRpc2suCiAqLwpzdGF0aWMgdm9pZCB3cml0ZV9ibG9jayh1bnNpZ25lZCBpbnQgbnIsIGNoYXIgKmFkZHIpCnsKCWlmICghbnIpCgkJcmV0dXJuOwoJaWYgKG5yIDwgRklSU1RaT05FIHx8IG5yID49IFpPTkVTKSB7CgkJcHJpbnRmKCJJbnRlcm5hbCBlcnJvcjogdHJ5aW5nIHRvIHdyaXRlIGJhZCBibG9ja1xuIgoJCQkgICAiV3JpdGUgcmVxdWVzdCBpZ25vcmVkXG4iKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCXJldHVybjsKCX0KCWlmIChCTE9DS19TSVpFICogbnIgIT0gbHNlZWsoSU4sIEJMT0NLX1NJWkUgKiBuciwgU0VFS19TRVQpKQoJCWRpZSgic2VlayBmYWlsZWQgaW4gd3JpdGVfYmxvY2siKTsKCWlmIChCTE9DS19TSVpFICE9IHdyaXRlKElOLCBhZGRyLCBCTE9DS19TSVpFKSkgewoJCXByaW50ZigiV3JpdGUgZXJyb3I6IGJhZCBibG9jayBpbiBmaWxlICciKTsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIidcbiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9Cn0KCi8qCiAqIG1hcC1ibG9jayBjYWxjdWxhdGVzIHRoZSBhYnNvbHV0ZSBibG9jayBuciBvZiBhIGJsb2NrIGluIGEgZmlsZS4KICogSXQgc2V0cyAnY2hhbmdlZCcgaWYgdGhlIGlub2RlIGhhcyBuZWVkZWQgY2hhbmdpbmcsIGFuZCByZS13cml0ZXMKICogYW55IGluZGlyZWN0IGJsb2NrcyB3aXRoIGVycm9ycy4KICovCnN0YXRpYyBpbnQgbWFwX2Jsb2NrKHN0cnVjdCBtaW5peF9pbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGludCBibGtucikKewoJdW5zaWduZWQgc2hvcnQgaW5kW0JMT0NLX1NJWkUgPj4gMV07Cgl1bnNpZ25lZCBzaG9ydCBkaW5kW0JMT0NLX1NJWkUgPj4gMV07CglpbnQgYmxrX2NoZywgYmxvY2ssIHJlc3VsdDsKCglpZiAoYmxrbnIgPCA3KQoJCXJldHVybiBjaGVja196b25lX25yKGlub2RlLT5pX3pvbmUgKyBibGtuciwgJmNoYW5nZWQpOwoJYmxrbnIgLT0gNzsKCWlmIChibGtuciA8IDUxMikgewoJCWJsb2NrID0gY2hlY2tfem9uZV9ucihpbm9kZS0+aV96b25lICsgNywgJmNoYW5nZWQpOwoJCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CgkJYmxrX2NoZyA9IDA7CgkJcmVzdWx0ID0gY2hlY2tfem9uZV9ucihibGtuciArIGluZCwgJmJsa19jaGcpOwoJCWlmIChibGtfY2hnKQoJCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCQlyZXR1cm4gcmVzdWx0OwoJfQoJYmxrbnIgLT0gNTEyOwoJYmxvY2sgPSBjaGVja196b25lX25yKGlub2RlLT5pX3pvbmUgKyA4LCAmY2hhbmdlZCk7CglyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBkaW5kKTsKCWJsa19jaGcgPSAwOwoJcmVzdWx0ID0gY2hlY2tfem9uZV9ucihkaW5kICsgKGJsa25yIC8gNTEyKSwgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJYmxvY2sgPSByZXN1bHQ7CglyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJYmxrX2NoZyA9IDA7CglyZXN1bHQgPSBjaGVja196b25lX25yKGluZCArIChibGtuciAlIDUxMiksICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJcmV0dXJuIHJlc3VsdDsKfQoKI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyBpbnQgbWFwX2Jsb2NrMihzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZSwgdW5zaWduZWQgaW50IGJsa25yKQp7Cgl1bnNpZ25lZCBpbnQgaW5kW0JMT0NLX1NJWkUgPj4gMl07Cgl1bnNpZ25lZCBpbnQgZGluZFtCTE9DS19TSVpFID4+IDJdOwoJdW5zaWduZWQgaW50IHRpbmRbQkxPQ0tfU0laRSA+PiAyXTsKCWludCBibGtfY2hnLCBibG9jaywgcmVzdWx0OwoKCWlmIChibGtuciA8IDcpCgkJcmV0dXJuIGNoZWNrX3pvbmVfbnIyKGlub2RlLT5pX3pvbmUgKyBibGtuciwgJmNoYW5nZWQpOwoJYmxrbnIgLT0gNzsKCWlmIChibGtuciA8IDI1NikgewoJCWJsb2NrID0gY2hlY2tfem9uZV9ucjIoaW5vZGUtPmlfem9uZSArIDcsICZjaGFuZ2VkKTsKCQlyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCWJsa19jaGcgPSAwOwoJCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGJsa25yICsgaW5kLCAmYmxrX2NoZyk7CgkJaWYgKGJsa19jaGcpCgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCXJldHVybiByZXN1bHQ7Cgl9CglibGtuciAtPSAyNTY7CglpZiAoYmxrbnIgPj0gMjU2ICogMjU2KSB7CgkJYmxvY2sgPSBjaGVja196b25lX25yMihpbm9kZS0+aV96b25lICsgOCwgJmNoYW5nZWQpOwoJCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJCWJsa19jaGcgPSAwOwoJCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGRpbmQgKyBibGtuciAvIDI1NiwgJmJsa19jaGcpOwoJCWlmIChibGtfY2hnKQoJCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CgkJYmxvY2sgPSByZXN1bHQ7CgkJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCQlibGtfY2hnID0gMDsKCQlyZXN1bHQgPSBjaGVja196b25lX25yMihpbmQgKyBibGtuciAlIDI1NiwgJmJsa19jaGcpOwoJCWlmIChibGtfY2hnKQoJCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCQlyZXR1cm4gcmVzdWx0OwoJfQoJYmxrbnIgLT0gMjU2ICogMjU2OwoJYmxvY2sgPSBjaGVja196b25lX25yMihpbm9kZS0+aV96b25lICsgOSwgJmNoYW5nZWQpOwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgdGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKHRpbmQgKyBibGtuciAvICgyNTYgKiAyNTYpLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgdGluZCk7CglibG9jayA9IHJlc3VsdDsKCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJYmxrX2NoZyA9IDA7CglyZXN1bHQgPSBjaGVja196b25lX25yMihkaW5kICsgKGJsa25yIC8gMjU2KSAlIDI1NiwgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJYmxvY2sgPSByZXN1bHQ7CglyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJYmxrX2NoZyA9IDA7CglyZXN1bHQgPSBjaGVja196b25lX25yMihpbmQgKyBibGtuciAlIDI1NiwgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CglyZXR1cm4gcmVzdWx0Owp9CiNlbmRpZgoKc3RhdGljIHZvaWQgd3JpdGVfc3VwZXJfYmxvY2sodm9pZCkKewoJLyoKCSAqIFNldCB0aGUgc3RhdGUgb2YgdGhlIGZpbGVzeXN0ZW0gYmFzZWQgb24gd2hldGhlciBvciBub3QgdGhlcmUKCSAqIGFyZSB1bmNvcnJlY3RlZCBlcnJvcnMuICBUaGUgZmlsZXN5c3RlbSB2YWxpZCBmbGFnIGlzCgkgKiB1bmNvbmRpdGlvbmFsbHkgc2V0IGlmIHdlIGdldCB0aGlzIGZhci4KCSAqLwoJU3VwZXIuc19zdGF0ZSB8PSBNSU5JWF9WQUxJRF9GUzsKCWlmIChlcnJvcnNfdW5jb3JyZWN0ZWQpCgkJU3VwZXIuc19zdGF0ZSB8PSBNSU5JWF9FUlJPUl9GUzsKCWVsc2UKCQlTdXBlci5zX3N0YXRlICY9IH5NSU5JWF9FUlJPUl9GUzsKCglpZiAoQkxPQ0tfU0laRSAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSwgU0VFS19TRVQpKQoJCWRpZSgic2VlayBmYWlsZWQgaW4gd3JpdGVfc3VwZXJfYmxvY2siKTsKCWlmIChCTE9DS19TSVpFICE9IHdyaXRlKElOLCBzdXBlcl9ibG9ja19idWZmZXIsIEJMT0NLX1NJWkUpKQoJCWRpZSgidW5hYmxlIHRvIHdyaXRlIHN1cGVyLWJsb2NrIik7CgoJcmV0dXJuOwp9CgpzdGF0aWMgdm9pZCB3cml0ZV90YWJsZXModm9pZCkKewoJd3JpdGVfc3VwZXJfYmxvY2soKTsKCglpZiAoSU1BUFMgKiBCTE9DS19TSVpFICE9IHdyaXRlKElOLCBpbm9kZV9tYXAsIElNQVBTICogQkxPQ0tfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gd3JpdGUgaW5vZGUgbWFwIik7CglpZiAoWk1BUFMgKiBCTE9DS19TSVpFICE9IHdyaXRlKElOLCB6b25lX21hcCwgWk1BUFMgKiBCTE9DS19TSVpFKSkKCQlkaWUoIlVuYWJsZSB0byB3cml0ZSB6b25lIG1hcCIpOwoJaWYgKElOT0RFX0JVRkZFUl9TSVpFICE9IHdyaXRlKElOLCBpbm9kZV9idWZmZXIsIElOT0RFX0JVRkZFUl9TSVpFKSkKCQlkaWUoIlVuYWJsZSB0byB3cml0ZSBpbm9kZXMiKTsKfQoKc3RhdGljIHZvaWQgZ2V0X2RpcnNpemUodm9pZCkKewoJaW50IGJsb2NrOwoJY2hhciBibGtbQkxPQ0tfU0laRV07CglpbnQgc2l6ZTsKCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgoJaWYgKHZlcnNpb24yKQoJCWJsb2NrID0gSW5vZGUyW1JPT1RfSU5PXS5pX3pvbmVbMF07CgllbHNlCiNlbmRpZgoJCWJsb2NrID0gSW5vZGVbUk9PVF9JTk9dLmlfem9uZVswXTsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7Cglmb3IgKHNpemUgPSAxNjsgc2l6ZSA8IEJMT0NLX1NJWkU7IHNpemUgPDw9IDEpIHsKCQlpZiAoc3RyY21wKGJsayArIHNpemUgKyAyLCAiLi4iKSA9PSAwKSB7CgkJCWRpcnNpemUgPSBzaXplOwoJCQluYW1lbGVuID0gc2l6ZSAtIDI7CgkJCXJldHVybjsKCQl9Cgl9CgkvKiB1c2UgZGVmYXVsdHMgKi8KfQoKc3RhdGljIHZvaWQgcmVhZF9zdXBlcmJsb2NrKHZvaWQpCnsKCWlmIChCTE9DS19TSVpFICE9IGxzZWVrKElOLCBCTE9DS19TSVpFLCBTRUVLX1NFVCkpCgkJZGllKCJzZWVrIGZhaWxlZCIpOwoJaWYgKEJMT0NLX1NJWkUgIT0gcmVhZChJTiwgc3VwZXJfYmxvY2tfYnVmZmVyLCBCTE9DS19TSVpFKSkKCQlkaWUoInVuYWJsZSB0byByZWFkIHN1cGVyIGJsb2NrIik7CglpZiAoTUFHSUMgPT0gTUlOSVhfU1VQRVJfTUFHSUMpIHsKCQluYW1lbGVuID0gMTQ7CgkJZGlyc2l6ZSA9IDE2OwoJCXZlcnNpb24yID0gMDsKCX0gZWxzZSBpZiAoTUFHSUMgPT0gTUlOSVhfU1VQRVJfTUFHSUMyKSB7CgkJbmFtZWxlbiA9IDMwOwoJCWRpcnNpemUgPSAzMjsKCQl2ZXJzaW9uMiA9IDA7CiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgoJfSBlbHNlIGlmIChNQUdJQyA9PSBNSU5JWDJfU1VQRVJfTUFHSUMpIHsKCQluYW1lbGVuID0gMTQ7CgkJZGlyc2l6ZSA9IDE2OwoJCXZlcnNpb24yID0gMTsKCX0gZWxzZSBpZiAoTUFHSUMgPT0gTUlOSVgyX1NVUEVSX01BR0lDMikgewoJCW5hbWVsZW4gPSAzMDsKCQlkaXJzaXplID0gMzI7CgkJdmVyc2lvbjIgPSAxOwojZW5kaWYKCX0gZWxzZQoJCWRpZSgiYmFkIG1hZ2ljIG51bWJlciBpbiBzdXBlci1ibG9jayIpOwoJaWYgKFpPTkVTSVpFICE9IDAgfHwgQkxPQ0tfU0laRSAhPSAxMDI0KQoJCWRpZSgiT25seSAxayBibG9ja3Mvem9uZXMgc3VwcG9ydGVkIik7CglpZiAoSU1BUFMgKiBCTE9DS19TSVpFICogOCA8IElOT0RFUyArIDEpCgkJZGllKCJiYWQgc19pbWFwX2Jsb2NrcyBmaWVsZCBpbiBzdXBlci1ibG9jayIpOwoJaWYgKFpNQVBTICogQkxPQ0tfU0laRSAqIDggPCBaT05FUyAtIEZJUlNUWk9ORSArIDEpCgkJZGllKCJiYWQgc196bWFwX2Jsb2NrcyBmaWVsZCBpbiBzdXBlci1ibG9jayIpOwp9CgpzdGF0aWMgdm9pZCByZWFkX3RhYmxlcyh2b2lkKQp7Cglpbm9kZV9tYXAgPSB4bWFsbG9jKElNQVBTICogQkxPQ0tfU0laRSk7Cgl6b25lX21hcCA9IHhtYWxsb2MoWk1BUFMgKiBCTE9DS19TSVpFKTsKCW1lbXNldChpbm9kZV9tYXAsIDAsIHNpemVvZihpbm9kZV9tYXApKTsKCW1lbXNldCh6b25lX21hcCwgMCwgc2l6ZW9mKHpvbmVfbWFwKSk7Cglpbm9kZV9idWZmZXIgPSB4bWFsbG9jKElOT0RFX0JVRkZFUl9TSVpFKTsKCWlub2RlX2NvdW50ID0geG1hbGxvYyhJTk9ERVMgKyAxKTsKCXpvbmVfY291bnQgPSB4bWFsbG9jKFpPTkVTKTsKCWlmIChJTUFQUyAqIEJMT0NLX1NJWkUgIT0gcmVhZChJTiwgaW5vZGVfbWFwLCBJTUFQUyAqIEJMT0NLX1NJWkUpKQoJCWRpZSgiVW5hYmxlIHRvIHJlYWQgaW5vZGUgbWFwIik7CglpZiAoWk1BUFMgKiBCTE9DS19TSVpFICE9IHJlYWQoSU4sIHpvbmVfbWFwLCBaTUFQUyAqIEJMT0NLX1NJWkUpKQoJCWRpZSgiVW5hYmxlIHRvIHJlYWQgem9uZSBtYXAiKTsKCWlmIChJTk9ERV9CVUZGRVJfU0laRSAhPSByZWFkKElOLCBpbm9kZV9idWZmZXIsIElOT0RFX0JVRkZFUl9TSVpFKSkKCQlkaWUoIlVuYWJsZSB0byByZWFkIGlub2RlcyIpOwoJaWYgKE5PUk1fRklSU1RaT05FICE9IEZJUlNUWk9ORSkgewoJCXByaW50ZigiV2FybmluZzogRmlyc3R6b25lICE9IE5vcm1fZmlyc3R6b25lXG4iKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJZ2V0X2RpcnNpemUoKTsKCWlmIChzaG93KSB7CgkJcHJpbnRmKCIlbGQgaW5vZGVzXG4iLCBJTk9ERVMpOwoJCXByaW50ZigiJWxkIGJsb2Nrc1xuIiwgWk9ORVMpOwoJCXByaW50ZigiRmlyc3RkYXRhem9uZT0lbGQgKCVsZClcbiIsIEZJUlNUWk9ORSwgTk9STV9GSVJTVFpPTkUpOwoJCXByaW50ZigiWm9uZXNpemU9JWRcbiIsIEJMT0NLX1NJWkUgPDwgWk9ORVNJWkUpOwoJCXByaW50ZigiTWF4c2l6ZT0lbGRcbiIsIE1BWFNJWkUpOwoJCXByaW50ZigiRmlsZXN5c3RlbSBzdGF0ZT0lZFxuIiwgU3VwZXIuc19zdGF0ZSk7CgkJcHJpbnRmKCJuYW1lbGVuPSVkXG5cbiIsIG5hbWVsZW4pOwoJfQp9CgpzdGF0aWMgc3RydWN0IG1pbml4X2lub2RlICpnZXRfaW5vZGUodW5zaWduZWQgaW50IG5yKQp7CglzdHJ1Y3QgbWluaXhfaW5vZGUgKmlub2RlOwoKCWlmICghbnIgfHwgbnIgPiBJTk9ERVMpCgkJcmV0dXJuIE5VTEw7Cgl0b3RhbCsrOwoJaW5vZGUgPSBJbm9kZSArIG5yOwoJaWYgKCFpbm9kZV9jb3VudFtucl0pIHsKCQlpZiAoIWlub2RlX2luX3VzZShucikpIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCBtYXJrZWQgbm90IHVzZWQsIGJ1dCB1c2VkIGZvciBmaWxlICciLCBucik7CgkJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCQlwcmludGYoIidcbiIpOwoJCQlpZiAocmVwYWlyKSB7CgkJCQlpZiAoYXNrKCJNYXJrIGluIHVzZSIsIDEpKQoJCQkJCW1hcmtfaW5vZGUobnIpOwoJCQl9IGVsc2UgewoJCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQkJfQoJCX0KCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQkJZGlyZWN0b3J5Kys7CgkJZWxzZSBpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKCQkJcmVndWxhcisrOwoJCWVsc2UgaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkpCgkJCWNoYXJkZXYrKzsKCQllbHNlIGlmIChTX0lTQkxLKGlub2RlLT5pX21vZGUpKQoJCQlibG9ja2RldisrOwoJCWVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCgkJCXN5bWxpbmtzKys7CgkJZWxzZSBpZiAoU19JU1NPQ0soaW5vZGUtPmlfbW9kZSkpOwoJCWVsc2UgaWYgKFNfSVNGSUZPKGlub2RlLT5pX21vZGUpKTsKCQllbHNlIHsKCQkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJCXByaW50ZigiIGhhcyBtb2RlICUwNW9cbiIsIGlub2RlLT5pX21vZGUpOwoJCX0KCgl9IGVsc2UKCQlsaW5rcysrOwoJaWYgKCErK2lub2RlX2NvdW50W25yXSkgewoJCXByaW50ZigiV2FybmluZzogaW5vZGUgY291bnQgdG9vIGJpZy5cbiIpOwoJCWlub2RlX2NvdW50W25yXS0tOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9CglyZXR1cm4gaW5vZGU7Cn0KCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdGF0aWMgc3RydWN0IG1pbml4Ml9pbm9kZSAqZ2V0X2lub2RlMih1bnNpZ25lZCBpbnQgbnIpCnsKCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlOwoKCWlmICghbnIgfHwgbnIgPiBJTk9ERVMpCgkJcmV0dXJuIE5VTEw7Cgl0b3RhbCsrOwoJaW5vZGUgPSBJbm9kZTIgKyBucjsKCWlmICghaW5vZGVfY291bnRbbnJdKSB7CgkJaWYgKCFpbm9kZV9pbl91c2UobnIpKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgbWFya2VkIG5vdCB1c2VkLCBidXQgdXNlZCBmb3IgZmlsZSAnIiwgbnIpOwoJCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQkJcHJpbnRmKCInXG4iKTsKCQkJaWYgKHJlcGFpcikgewoJCQkJaWYgKGFzaygiTWFyayBpbiB1c2UiLCAxKSkKCQkJCQltYXJrX2lub2RlKG5yKTsKCQkJCWVsc2UKCQkJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCQl9CgkJfQoJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCQlkaXJlY3RvcnkrKzsKCQllbHNlIGlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQoJCQlyZWd1bGFyKys7CgkJZWxzZSBpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSkKCQkJY2hhcmRldisrOwoJCWVsc2UgaWYgKFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCgkJCWJsb2NrZGV2Kys7CgkJZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKCQkJc3ltbGlua3MrKzsKCQllbHNlIGlmIChTX0lTU09DSyhpbm9kZS0+aV9tb2RlKSk7CgkJZWxzZSBpZiAoU19JU0ZJRk8oaW5vZGUtPmlfbW9kZSkpOwoJCWVsc2UgewoJCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQkJcHJpbnRmKCIgaGFzIG1vZGUgJTA1b1xuIiwgaW5vZGUtPmlfbW9kZSk7CgkJfQoJfSBlbHNlCgkJbGlua3MrKzsKCWlmICghKytpbm9kZV9jb3VudFtucl0pIHsKCQlwcmludGYoIldhcm5pbmc6IGlub2RlIGNvdW50IHRvbyBiaWcuXG4iKTsKCQlpbm9kZV9jb3VudFtucl0tLTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJcmV0dXJuIGlub2RlOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgY2hlY2tfcm9vdCh2b2lkKQp7CglzdHJ1Y3QgbWluaXhfaW5vZGUgKmlub2RlID0gSW5vZGUgKyBST09UX0lOTzsKCglpZiAoIWlub2RlIHx8ICFTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCWRpZSgicm9vdCBpbm9kZSBpc24ndCBhIGRpcmVjdG9yeSIpOwp9CgojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgY2hlY2tfcm9vdDIodm9pZCkKewoJc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGUgPSBJbm9kZTIgKyBST09UX0lOTzsKCglpZiAoIWlub2RlIHx8ICFTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCWRpZSgicm9vdCBpbm9kZSBpc24ndCBhIGRpcmVjdG9yeSIpOwp9CiNlbmRpZgoKc3RhdGljIGludCBhZGRfem9uZSh1bnNpZ25lZCBzaG9ydCAqem5yLCBpbnQgKmNvcnJlY3RlZCkKewoJaW50IHJlc3VsdDsKCWludCBibG9jazsKCglyZXN1bHQgPSAwOwoJYmxvY2sgPSBjaGVja196b25lX25yKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuIDA7CglpZiAoem9uZV9jb3VudFtibG9ja10pIHsKCQlwcmludGYoIkJsb2NrIGhhcyBiZWVuIHVzZWQgYmVmb3JlLiBOb3cgaW4gZmlsZSBgIik7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCInLiIpOwoJCWlmIChhc2soIkNsZWFyIiwgMSkpIHsKCQkJKnpuciA9IDA7CgkJCWJsb2NrID0gMDsKCQkJKmNvcnJlY3RlZCA9IDE7CgkJfQoJfQoJaWYgKCFibG9jaykKCQlyZXR1cm4gMDsKCWlmICghem9uZV9pbl91c2UoYmxvY2spKSB7CgkJcHJpbnRmKCJCbG9jayAlZCBpbiBmaWxlIGAiLCBibG9jayk7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCInIGlzIG1hcmtlZCBub3QgaW4gdXNlLiIpOwoJCWlmIChhc2soIkNvcnJlY3QiLCAxKSkKCQkJbWFya196b25lKGJsb2NrKTsKCX0KCWlmICghKyt6b25lX2NvdW50W2Jsb2NrXSkKCQl6b25lX2NvdW50W2Jsb2NrXS0tOwoJcmV0dXJuIGJsb2NrOwp9CgojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKc3RhdGljIGludCBhZGRfem9uZTIodW5zaWduZWQgaW50ICp6bnIsIGludCAqY29ycmVjdGVkKQp7CglpbnQgcmVzdWx0OwoJaW50IGJsb2NrOwoKCXJlc3VsdCA9IDA7CglibG9jayA9IGNoZWNrX3pvbmVfbnIyKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuIDA7CglpZiAoem9uZV9jb3VudFtibG9ja10pIHsKCQlwcmludGYoIkJsb2NrIGhhcyBiZWVuIHVzZWQgYmVmb3JlLiBOb3cgaW4gZmlsZSBgIik7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCInLiIpOwoJCWlmIChhc2soIkNsZWFyIiwgMSkpIHsKCQkJKnpuciA9IDA7CgkJCWJsb2NrID0gMDsKCQkJKmNvcnJlY3RlZCA9IDE7CgkJfQoJfQoJaWYgKCFibG9jaykKCQlyZXR1cm4gMDsKCWlmICghem9uZV9pbl91c2UoYmxvY2spKSB7CgkJcHJpbnRmKCJCbG9jayAlZCBpbiBmaWxlIGAiLCBibG9jayk7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCInIGlzIG1hcmtlZCBub3QgaW4gdXNlLiIpOwoJCWlmIChhc2soIkNvcnJlY3QiLCAxKSkKCQkJbWFya196b25lKGJsb2NrKTsKCX0KCWlmICghKyt6b25lX2NvdW50W2Jsb2NrXSkKCQl6b25lX2NvdW50W2Jsb2NrXS0tOwoJcmV0dXJuIGJsb2NrOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgYWRkX3pvbmVfaW5kKHVuc2lnbmVkIHNob3J0ICp6bnIsIGludCAqY29ycmVjdGVkKQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglpbnQgaSwgY2hnX2JsayA9IDA7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBhZGRfem9uZSh6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybjsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7Cglmb3IgKGkgPSAwOyBpIDwgKEJMT0NLX1NJWkUgPj4gMSk7IGkrKykKCQlhZGRfem9uZShpICsgKHVuc2lnbmVkIHNob3J0ICopIGJsaywgJmNoZ19ibGspOwoJaWYgKGNoZ19ibGspCgkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7Cn0KCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBhZGRfem9uZV9pbmQyKHVuc2lnbmVkIGludCAqem5yLCBpbnQgKmNvcnJlY3RlZCkKewoJc3RhdGljIGNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJaW50IGksIGNoZ19ibGsgPSAwOwoJaW50IGJsb2NrOwoKCWJsb2NrID0gYWRkX3pvbmUyKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCWZvciAoaSA9IDA7IGkgPCBCTE9DS19TSVpFID4+IDI7IGkrKykKCQlhZGRfem9uZTIoaSArICh1bnNpZ25lZCBpbnQgKikgYmxrLCAmY2hnX2Jsayk7CglpZiAoY2hnX2JsaykKCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGFkZF96b25lX2RpbmQodW5zaWduZWQgc2hvcnQgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBpLCBibGtfY2hnID0gMDsKCWludCBibG9jazsKCglibG9jayA9IGFkZF96b25lKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCWZvciAoaSA9IDA7IGkgPCAoQkxPQ0tfU0laRSA+PiAxKTsgaSsrKQoJCWFkZF96b25lX2luZChpICsgKHVuc2lnbmVkIHNob3J0ICopIGJsaywgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7Cn0KCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBhZGRfem9uZV9kaW5kMih1bnNpZ25lZCBpbnQgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBpLCBibGtfY2hnID0gMDsKCWludCBibG9jazsKCglibG9jayA9IGFkZF96b25lMih6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybjsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7Cglmb3IgKGkgPSAwOyBpIDwgQkxPQ0tfU0laRSA+PiAyOyBpKyspCgkJYWRkX3pvbmVfaW5kMihpICsgKHVuc2lnbmVkIGludCAqKSBibGssICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwp9CgpzdGF0aWMgdm9pZCBhZGRfem9uZV90aW5kMih1bnNpZ25lZCBpbnQgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBpLCBibGtfY2hnID0gMDsKCWludCBibG9jazsKCglibG9jayA9IGFkZF96b25lMih6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybjsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7Cglmb3IgKGkgPSAwOyBpIDwgQkxPQ0tfU0laRSA+PiAyOyBpKyspCgkJYWRkX3pvbmVfZGluZDIoaSArICh1bnNpZ25lZCBpbnQgKikgYmxrLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGNoZWNrX3pvbmVzKHVuc2lnbmVkIGludCBpKQp7CglzdHJ1Y3QgbWluaXhfaW5vZGUgKmlub2RlOwoKCWlmICghaSB8fCBpID4gSU5PREVTKQoJCXJldHVybjsKCWlmIChpbm9kZV9jb3VudFtpXSA+IDEpCQkvKiBoYXZlIHdlIGNvdW50ZWQgdGhpcyBmaWxlIGFscmVhZHk/ICovCgkJcmV0dXJuOwoJaW5vZGUgPSBJbm9kZSArIGk7CglpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYKCQkhU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgcmV0dXJuOwoJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKCQlhZGRfem9uZShpICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfaW5kKDcgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CglhZGRfem9uZV9kaW5kKDggKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7Cn0KCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBjaGVja196b25lczIodW5zaWduZWQgaW50IGkpCnsKCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlOwoKCWlmICghaSB8fCBpID4gSU5PREVTKQoJCXJldHVybjsKCWlmIChpbm9kZV9jb3VudFtpXSA+IDEpCQkvKiBoYXZlIHdlIGNvdW50ZWQgdGhpcyBmaWxlIGFscmVhZHk/ICovCgkJcmV0dXJuOwoJaW5vZGUgPSBJbm9kZTIgKyBpOwoJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpICYmICFTX0lTUkVHKGlub2RlLT5pX21vZGUpCgkJJiYgIVNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCgkJcmV0dXJuOwoJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKCQlhZGRfem9uZTIoaSArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKCWFkZF96b25lX2luZDIoNyArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKCWFkZF96b25lX2RpbmQyKDggKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CglhZGRfem9uZV90aW5kMig5ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgY2hlY2tfZmlsZShzdHJ1Y3QgbWluaXhfaW5vZGUgKmRpciwgdW5zaWduZWQgaW50IG9mZnNldCkKewoJc3RhdGljIGNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJc3RydWN0IG1pbml4X2lub2RlICppbm9kZTsKCWludCBpbm87CgljaGFyICpuYW1lOwoJaW50IGJsb2NrOwoKCWJsb2NrID0gbWFwX2Jsb2NrKGRpciwgb2Zmc2V0IC8gQkxPQ0tfU0laRSk7CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJbmFtZSA9IGJsayArIChvZmZzZXQgJSBCTE9DS19TSVpFKSArIDI7Cglpbm8gPSAqKHVuc2lnbmVkIHNob3J0ICopIChuYW1lIC0gMik7CglpZiAoaW5vID4gSU5PREVTKSB7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCIgY29udGFpbnMgYSBiYWQgaW5vZGUgbnVtYmVyIGZvciBmaWxlICciKTsKCQlwcmludGYoIiUuKnMnLiIsIG5hbWVsZW4sIG5hbWUpOwoJCWlmIChhc2soIiBSZW1vdmUiLCAxKSkgewoJCQkqKHVuc2lnbmVkIHNob3J0ICopIChuYW1lIC0gMikgPSAwOwoJCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKCQl9CgkJaW5vID0gMDsKCX0KCWlmIChuYW1lX2RlcHRoIDwgTUFYX0RFUFRIKQoJCXN0cm5jcHkobmFtZV9saXN0W25hbWVfZGVwdGhdLCBuYW1lLCBuYW1lbGVuKTsKCW5hbWVfZGVwdGgrKzsKCWlub2RlID0gZ2V0X2lub2RlKGlubyk7CgluYW1lX2RlcHRoLS07CglpZiAoIW9mZnNldCkgewoJCWlmICghaW5vZGUgfHwgc3RyY21wKCIuIiwgbmFtZSkpIHsKCQkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJCXByaW50ZigiOiBiYWQgZGlyZWN0b3J5OiAnLicgaXNuJ3QgZmlyc3RcbiIpOwoJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCX0gZWxzZQoJCQlyZXR1cm47Cgl9CglpZiAob2Zmc2V0ID09IGRpcnNpemUpIHsKCQlpZiAoIWlub2RlIHx8IHN0cmNtcCgiLi4iLCBuYW1lKSkgewoJCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQkJcHJpbnRmKCI6IGJhZCBkaXJlY3Rvcnk6ICcuLicgaXNuJ3Qgc2Vjb25kXG4iKTsKCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQl9IGVsc2UKCQkJcmV0dXJuOwoJfQoJaWYgKCFpbm9kZSkKCQlyZXR1cm47CglpZiAobmFtZV9kZXB0aCA8IE1BWF9ERVBUSCkKCQlzdHJuY3B5KG5hbWVfbGlzdFtuYW1lX2RlcHRoXSwgbmFtZSwgbmFtZWxlbik7CgluYW1lX2RlcHRoKys7CglpZiAobGlzdCkgewoJCWlmICh2ZXJib3NlKQoJCQlwcmludGYoIiU2ZCAlMDdvICUzZCAiLCBpbm8sIGlub2RlLT5pX21vZGUsIGlub2RlLT5pX25saW5rcyk7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJCXByaW50ZigiOlxuIik7CgkJZWxzZQoJCQlwcmludGYoIlxuIik7Cgl9CgljaGVja196b25lcyhpbm8pOwoJaWYgKGlub2RlICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJcmVjdXJzaXZlX2NoZWNrKGlubyk7CgluYW1lX2RlcHRoLS07CglyZXR1cm47Cn0KCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBjaGVja19maWxlMihzdHJ1Y3QgbWluaXgyX2lub2RlICpkaXIsIHVuc2lnbmVkIGludCBvZmZzZXQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlOwoJaW50IGlubzsKCWNoYXIgKm5hbWU7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBtYXBfYmxvY2syKGRpciwgb2Zmc2V0IC8gQkxPQ0tfU0laRSk7CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJbmFtZSA9IGJsayArIChvZmZzZXQgJSBCTE9DS19TSVpFKSArIDI7Cglpbm8gPSAqKHVuc2lnbmVkIHNob3J0ICopIChuYW1lIC0gMik7CglpZiAoaW5vID4gSU5PREVTKSB7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCIgY29udGFpbnMgYSBiYWQgaW5vZGUgbnVtYmVyIGZvciBmaWxlICciKTsKCQlwcmludGYoIiUuKnMnLiIsIG5hbWVsZW4sIG5hbWUpOwoJCWlmIChhc2soIiBSZW1vdmUiLCAxKSkgewoJCQkqKHVuc2lnbmVkIHNob3J0ICopIChuYW1lIC0gMikgPSAwOwoJCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKCQl9CgkJaW5vID0gMDsKCX0KCWlmIChuYW1lX2RlcHRoIDwgTUFYX0RFUFRIKQoJCXN0cm5jcHkobmFtZV9saXN0W25hbWVfZGVwdGhdLCBuYW1lLCBuYW1lbGVuKTsKCW5hbWVfZGVwdGgrKzsKCWlub2RlID0gZ2V0X2lub2RlMihpbm8pOwoJbmFtZV9kZXB0aC0tOwoJaWYgKCFvZmZzZXQpIHsKCQlpZiAoIWlub2RlIHx8IHN0cmNtcCgiLiIsIG5hbWUpKSB7CgkJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCQlwcmludGYoIjogYmFkIGRpcmVjdG9yeTogJy4nIGlzbid0IGZpcnN0XG4iKTsKCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQl9IGVsc2UKCQkJcmV0dXJuOwoJfQoJaWYgKG9mZnNldCA9PSBkaXJzaXplKSB7CgkJaWYgKCFpbm9kZSB8fCBzdHJjbXAoIi4uIiwgbmFtZSkpIHsKCQkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJCXByaW50ZigiOiBiYWQgZGlyZWN0b3J5OiAnLi4nIGlzbid0IHNlY29uZFxuIik7CgkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJfSBlbHNlCgkJCXJldHVybjsKCX0KCWlmICghaW5vZGUpCgkJcmV0dXJuOwoJbmFtZV9kZXB0aCsrOwoJaWYgKGxpc3QpIHsKCQlpZiAodmVyYm9zZSkKCQkJcHJpbnRmKCIlNmQgJTA3byAlM2QgIiwgaW5vLCBpbm9kZS0+aV9tb2RlLCBpbm9kZS0+aV9ubGlua3MpOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCQlwcmludGYoIjpcbiIpOwoJCWVsc2UKCQkJcHJpbnRmKCJcbiIpOwoJfQoJY2hlY2tfem9uZXMyKGlubyk7CglpZiAoaW5vZGUgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQlyZWN1cnNpdmVfY2hlY2syKGlubyk7CgluYW1lX2RlcHRoLS07CglyZXR1cm47Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCByZWN1cnNpdmVfY2hlY2sodW5zaWduZWQgaW50IGlubykKewoJc3RydWN0IG1pbml4X2lub2RlICpkaXI7Cgl1bnNpZ25lZCBpbnQgb2Zmc2V0OwoKCWRpciA9IElub2RlICsgaW5vOwoJaWYgKCFTX0lTRElSKGRpci0+aV9tb2RlKSkKCQlkaWUoImludGVybmFsIGVycm9yIik7CglpZiAoZGlyLT5pX3NpemUgPCAyICogZGlyc2l6ZSkgewoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiOiBiYWQgZGlyZWN0b3J5OiBzaXplPDMyIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZGlyLT5pX3NpemU7IG9mZnNldCArPSBkaXJzaXplKQoJCWNoZWNrX2ZpbGUoZGlyLCBvZmZzZXQpOwp9CgojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgcmVjdXJzaXZlX2NoZWNrMih1bnNpZ25lZCBpbnQgaW5vKQp7CglzdHJ1Y3QgbWluaXgyX2lub2RlICpkaXI7Cgl1bnNpZ25lZCBpbnQgb2Zmc2V0OwoKCWRpciA9IElub2RlMiArIGlubzsKCWlmICghU19JU0RJUihkaXItPmlfbW9kZSkpCgkJZGllKCJpbnRlcm5hbCBlcnJvciIpOwoJaWYgKGRpci0+aV9zaXplIDwgMiAqIGRpcnNpemUpIHsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIjogYmFkIGRpcmVjdG9yeTogc2l6ZSA8IDMyIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZGlyLT5pX3NpemU7IG9mZnNldCArPSBkaXJzaXplKQoJCWNoZWNrX2ZpbGUyKGRpciwgb2Zmc2V0KTsKfQojZW5kaWYKCnN0YXRpYyBpbnQgYmFkX3pvbmUoaW50IGkpCnsKCWNoYXIgYnVmZmVyWzEwMjRdOwoKCWlmIChCTE9DS19TSVpFICogaSAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSAqIGksIFNFRUtfU0VUKSkKCQlkaWUoInNlZWsgZmFpbGVkIGluIGJhZF96b25lIik7CglyZXR1cm4gKEJMT0NLX1NJWkUgIT0gcmVhZChJTiwgYnVmZmVyLCBCTE9DS19TSVpFKSk7Cn0KCnN0YXRpYyB2b2lkIGNoZWNrX2NvdW50cyh2b2lkKQp7CglpbnQgaTsKCglmb3IgKGkgPSAxOyBpIDw9IElOT0RFUzsgaSsrKSB7CgkJaWYgKCFpbm9kZV9pbl91c2UoaSkgJiYgSW5vZGVbaV0uaV9tb2RlICYmIHdhcm5fbW9kZSkgewoJCQlwcmludGYoIklub2RlICVkIG1vZGUgbm90IGNsZWFyZWQuIiwgaSk7CgkJCWlmIChhc2soIkNsZWFyIiwgMSkpIHsKCQkJCUlub2RlW2ldLmlfbW9kZSA9IDA7CgkJCQljaGFuZ2VkID0gMTsKCQkJfQoJCX0KCQlpZiAoIWlub2RlX2NvdW50W2ldKSB7CgkJCWlmICghaW5vZGVfaW5fdXNlKGkpKQoJCQkJY29udGludWU7CgkJCXByaW50ZigiSW5vZGUgJWQgbm90IHVzZWQsIG1hcmtlZCB1c2VkIGluIHRoZSBiaXRtYXAuIiwgaSk7CgkJCWlmIChhc2soIkNsZWFyIiwgMSkpCgkJCQl1bm1hcmtfaW5vZGUoaSk7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoIWlub2RlX2luX3VzZShpKSkgewoJCQlwcmludGYoIklub2RlICVkIHVzZWQsIG1hcmtlZCB1bnVzZWQgaW4gdGhlIGJpdG1hcC4iLCBpKTsKCQkJaWYgKGFzaygiU2V0IiwgMSkpCgkJCQltYXJrX2lub2RlKGkpOwoJCX0KCQlpZiAoSW5vZGVbaV0uaV9ubGlua3MgIT0gaW5vZGVfY291bnRbaV0pIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCAobW9kZSA9ICUwN28pLCBpX25saW5rcz0lZCwgY291bnRlZD0lZC4iLAoJCQkJICAgaSwgSW5vZGVbaV0uaV9tb2RlLCBJbm9kZVtpXS5pX25saW5rcywgaW5vZGVfY291bnRbaV0pOwoJCQlpZiAoYXNrKCJTZXQgaV9ubGlua3MgdG8gY291bnQiLCAxKSkgewoJCQkJSW5vZGVbaV0uaV9ubGlua3MgPSBpbm9kZV9jb3VudFtpXTsKCQkJCWNoYW5nZWQgPSAxOwoJCQl9CgkJfQoJfQoJZm9yIChpID0gRklSU1RaT05FOyBpIDwgWk9ORVM7IGkrKykgewoJCWlmICh6b25lX2luX3VzZShpKSA9PSB6b25lX2NvdW50W2ldKQoJCQljb250aW51ZTsKCQlpZiAoIXpvbmVfY291bnRbaV0pIHsKCQkJaWYgKGJhZF96b25lKGkpKQoJCQkJY29udGludWU7CgkJCXByaW50ZigiWm9uZSAlZDogbWFya2VkIGluIHVzZSwgbm8gZmlsZSB1c2VzIGl0LiIsIGkpOwoJCQlpZiAoYXNrKCJVbm1hcmsiLCAxKSkKCQkJCXVubWFya196b25lKGkpOwoJCQljb250aW51ZTsKCQl9CgkJcHJpbnRmKCJab25lICVkOiAlc2luIHVzZSwgY291bnRlZD0lZFxuIiwKCQkJICAgaSwgem9uZV9pbl91c2UoaSkgPyAiIiA6ICJub3QgIiwgem9uZV9jb3VudFtpXSk7Cgl9Cn0KCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBjaGVja19jb3VudHMyKHZvaWQpCnsKCWludCBpOwoKCWZvciAoaSA9IDE7IGkgPD0gSU5PREVTOyBpKyspIHsKCQlpZiAoIWlub2RlX2luX3VzZShpKSAmJiBJbm9kZTJbaV0uaV9tb2RlICYmIHdhcm5fbW9kZSkgewoJCQlwcmludGYoIklub2RlICVkIG1vZGUgbm90IGNsZWFyZWQuIiwgaSk7CgkJCWlmIChhc2soIkNsZWFyIiwgMSkpIHsKCQkJCUlub2RlMltpXS5pX21vZGUgPSAwOwoJCQkJY2hhbmdlZCA9IDE7CgkJCX0KCQl9CgkJaWYgKCFpbm9kZV9jb3VudFtpXSkgewoJCQlpZiAoIWlub2RlX2luX3VzZShpKSkKCQkJCWNvbnRpbnVlOwoJCQlwcmludGYoIklub2RlICVkIG5vdCB1c2VkLCBtYXJrZWQgdXNlZCBpbiB0aGUgYml0bWFwLiIsIGkpOwoJCQlpZiAoYXNrKCJDbGVhciIsIDEpKQoJCQkJdW5tYXJrX2lub2RlKGkpOwoJCQljb250aW51ZTsKCQl9CgkJaWYgKCFpbm9kZV9pbl91c2UoaSkpIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCB1c2VkLCBtYXJrZWQgdW51c2VkIGluIHRoZSBiaXRtYXAuIiwgaSk7CgkJCWlmIChhc2soIlNldCIsIDEpKQoJCQkJbWFya19pbm9kZShpKTsKCQl9CgkJaWYgKElub2RlMltpXS5pX25saW5rcyAhPSBpbm9kZV9jb3VudFtpXSkgewoJCQlwcmludGYoIklub2RlICVkIChtb2RlID0gJTA3byksIGlfbmxpbmtzPSVkLCBjb3VudGVkPSVkLiIsCgkJCQkgICBpLCBJbm9kZTJbaV0uaV9tb2RlLCBJbm9kZTJbaV0uaV9ubGlua3MsCgkJCQkgICBpbm9kZV9jb3VudFtpXSk7CgkJCWlmIChhc2soIlNldCBpX25saW5rcyB0byBjb3VudCIsIDEpKSB7CgkJCQlJbm9kZTJbaV0uaV9ubGlua3MgPSBpbm9kZV9jb3VudFtpXTsKCQkJCWNoYW5nZWQgPSAxOwoJCQl9CgkJfQoJfQoJZm9yIChpID0gRklSU1RaT05FOyBpIDwgWk9ORVM7IGkrKykgewoJCWlmICh6b25lX2luX3VzZShpKSA9PSB6b25lX2NvdW50W2ldKQoJCQljb250aW51ZTsKCQlpZiAoIXpvbmVfY291bnRbaV0pIHsKCQkJaWYgKGJhZF96b25lKGkpKQoJCQkJY29udGludWU7CgkJCXByaW50ZigiWm9uZSAlZDogbWFya2VkIGluIHVzZSwgbm8gZmlsZSB1c2VzIGl0LiIsIGkpOwoJCQlpZiAoYXNrKCJVbm1hcmsiLCAxKSkKCQkJCXVubWFya196b25lKGkpOwoJCQljb250aW51ZTsKCQl9CgkJcHJpbnRmKCJab25lICVkOiAlc2luIHVzZSwgY291bnRlZD0lZFxuIiwKCQkJICAgaSwgem9uZV9pbl91c2UoaSkgPyAiIiA6ICJub3QgIiwgem9uZV9jb3VudFtpXSk7Cgl9Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBjaGVjayh2b2lkKQp7CgltZW1zZXQoaW5vZGVfY291bnQsIDAsIChJTk9ERVMgKyAxKSAqIHNpemVvZigqaW5vZGVfY291bnQpKTsKCW1lbXNldCh6b25lX2NvdW50LCAwLCBaT05FUyAqIHNpemVvZigqem9uZV9jb3VudCkpOwoJY2hlY2tfem9uZXMoUk9PVF9JTk8pOwoJcmVjdXJzaXZlX2NoZWNrKFJPT1RfSU5PKTsKCWNoZWNrX2NvdW50cygpOwp9CgojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgY2hlY2syKHZvaWQpCnsKCW1lbXNldChpbm9kZV9jb3VudCwgMCwgKElOT0RFUyArIDEpICogc2l6ZW9mKCppbm9kZV9jb3VudCkpOwoJbWVtc2V0KHpvbmVfY291bnQsIDAsIFpPTkVTICogc2l6ZW9mKCp6b25lX2NvdW50KSk7CgljaGVja196b25lczIoUk9PVF9JTk8pOwoJcmVjdXJzaXZlX2NoZWNrMihST09UX0lOTyk7CgljaGVja19jb3VudHMyKCk7Cn0KI2VuZGlmCgovKiBXZWQgRmViICA5IDE1OjE3OjA2IE1TVCAyMDAwICovCi8qIGR5bmFtaWNhbGx5IGFsbG9jYXRlIG5hbWVfbGlzdCAoaW5zdGVhZCBvZiBtYWtpbmcgaXQgc3RhdGljKSAqLwpzdGF0aWMgdm9pZCBhbGxvY19uYW1lX2xpc3Qodm9pZCkKewoJaW50IGk7CgoJbmFtZV9saXN0ID0geG1hbGxvYyhzaXplb2YoY2hhciAqKSAqIE1BWF9ERVBUSCk7Cglmb3IgKGkgPSAwOyBpIDwgTUFYX0RFUFRIOyBpKyspCgkJbmFtZV9saXN0W2ldID0geG1hbGxvYyhzaXplb2YoY2hhcikgKiBCVUZTSVogKyAxKTsKfQoKI2lmZGVmIEJCX0ZFQVRVUkVfQ0xFQU5fVVAKLyogZXhlY3V0ZSB0aGlzIGF0ZXhpdCgpIHRvIGRlYWxsb2NhdGUgbmFtZV9saXN0W10gKi8KLyogcGlwdGlnZ2VyIHdhcyBoZXJlICovCnN0YXRpYyB2b2lkIGZyZWVfbmFtZV9saXN0KHZvaWQpCnsKCWludCBpOwoKCWlmIChuYW1lX2xpc3QpIHsgCgkJZm9yIChpID0gMDsgaSA8IE1BWF9ERVBUSDsgaSsrKSB7CgkJCWlmIChuYW1lX2xpc3RbaV0pIHsKCQkJCWZyZWUobmFtZV9saXN0W2ldKTsKCQkJfQoJCX0KCQlmcmVlKG5hbWVfbGlzdCk7Cgl9Cn0KI2VuZGlmCgpleHRlcm4gaW50IGZzY2tfbWluaXhfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKCXN0cnVjdCB0ZXJtaW9zIHRtcDsKCWludCBjb3VudDsKCWludCByZXRjb2RlID0gMDsKCglhbGxvY19uYW1lX2xpc3QoKTsKI2lmZGVmIEJCX0ZFQVRVUkVfQ0xFQU5fVVAKCS8qIERvbid0IGJvdGhlciB0byBmcmVlIG1lbW9yeS4gIEV4aXQgZG9lcwoJICogdGhhdCBhdXRvbWFnaWNhbGx5LCBzbyB3ZSBjYW4gc2F2ZSBhIGZldyBieXRlcyAqLwoJYXRleGl0KGZyZWVfbmFtZV9saXN0KTsKI2VuZGlmCgoJaWYgKElOT0RFX1NJWkUgKiBNSU5JWF9JTk9ERVNfUEVSX0JMT0NLICE9IEJMT0NLX1NJWkUpCgkJZGllKCJiYWQgaW5vZGUgc2l6ZSIpOwojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKCWlmIChJTk9ERV9TSVpFMiAqIE1JTklYMl9JTk9ERVNfUEVSX0JMT0NLICE9IEJMT0NLX1NJWkUpCgkJZGllKCJiYWQgdjIgaW5vZGUgc2l6ZSIpOwojZW5kaWYKCXdoaWxlIChhcmdjLS0gPiAxKSB7CgkJYXJndisrOwoJCWlmIChhcmd2WzBdWzBdICE9ICctJykgewoJCQlpZiAoZGV2aWNlX25hbWUpCgkJCQlzaG93X3VzYWdlKCk7CgkJCWVsc2UKCQkJCWRldmljZV9uYW1lID0gYXJndlswXTsKCQl9IGVsc2UKCQkJd2hpbGUgKCorK2FyZ3ZbMF0pCgkJCQlzd2l0Y2ggKGFyZ3ZbMF1bMF0pIHsKCQkJCWNhc2UgJ2wnOgoJCQkJCWxpc3QgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnYSc6CgkJCQkJYXV0b21hdGljID0gMTsKCQkJCQlyZXBhaXIgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAncic6CgkJCQkJYXV0b21hdGljID0gMDsKCQkJCQlyZXBhaXIgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAndic6CgkJCQkJdmVyYm9zZSA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdzJzoKCQkJCQlzaG93ID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ20nOgoJCQkJCXdhcm5fbW9kZSA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdmJzoKCQkJCQlmb3JjZSA9IDE7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCXNob3dfdXNhZ2UoKTsKCQkJCX0KCX0KCWlmICghZGV2aWNlX25hbWUpCgkJc2hvd191c2FnZSgpOwoJY2hlY2tfbW91bnQoKTsJCQkJLyogdHJ5aW5nIHRvIGNoZWNrIGEgbW91bnRlZCBmaWxlc3lzdGVtPyAqLwoJaWYgKHJlcGFpciAmJiAhYXV0b21hdGljKSB7CgkJaWYgKCFpc2F0dHkoMCkgfHwgIWlzYXR0eSgxKSkKCQkJZGllKCJuZWVkIHRlcm1pbmFsIGZvciBpbnRlcmFjdGl2ZSByZXBhaXJzIik7Cgl9CglJTiA9IG9wZW4oZGV2aWNlX25hbWUsIHJlcGFpciA/IE9fUkRXUiA6IE9fUkRPTkxZKTsKCWlmIChJTiA8IDApewoJCWZwcmludGYoc3RkZXJyLCJ1bmFibGUgdG8gb3BlbiBkZXZpY2UgJyVzJy5cbiIsZGV2aWNlX25hbWUpOwoJCWxlYXZlKDgpOwoJfQoJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzsgY291bnQrKykKCQlzeW5jKCk7CglyZWFkX3N1cGVyYmxvY2soKTsKCgkvKgoJICogRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBjb250aW51ZSB3aXRoIHRoZSBjaGVja2luZy4KCSAqIFRoaXMgaXMgYmFzZWQgb24gdGhlIHN0YXR1cyBvZiB0aGUgZmlsZXN5c3RlbSB2YWxpZCBhbmQgZXJyb3IKCSAqIGZsYWdzIGFuZCB3aGV0aGVyIG9yIG5vdCB0aGUgLWYgc3dpdGNoIHdhcyBzcGVjaWZpZWQgb24gdGhlIAoJICogY29tbWFuZCBsaW5lLgoJICovCglwcmludGYoIiVzLCAlc1xuIiwgYXBwbGV0X25hbWUsIHByb2dyYW1fdmVyc2lvbik7CglpZiAoIShTdXBlci5zX3N0YXRlICYgTUlOSVhfRVJST1JfRlMpICYmCgkJKFN1cGVyLnNfc3RhdGUgJiBNSU5JWF9WQUxJRF9GUykgJiYgIWZvcmNlKSB7CgkJaWYgKHJlcGFpcikKCQkJcHJpbnRmKCIlcyBpcyBjbGVhbiwgbm8gY2hlY2suXG4iLCBkZXZpY2VfbmFtZSk7CgkJcmV0dXJuIHJldGNvZGU7Cgl9IGVsc2UgaWYgKGZvcmNlKQoJCXByaW50ZigiRm9yY2luZyBmaWxlc3lzdGVtIGNoZWNrIG9uICVzLlxuIiwgZGV2aWNlX25hbWUpOwoJZWxzZSBpZiAocmVwYWlyKQoJCXByaW50ZigiRmlsZXN5c3RlbSBvbiAlcyBpcyBkaXJ0eSwgbmVlZHMgY2hlY2tpbmcuXG4iLAoJCQkgICBkZXZpY2VfbmFtZSk7CgoJcmVhZF90YWJsZXMoKTsKCglpZiAocmVwYWlyICYmICFhdXRvbWF0aWMpIHsKCQl0Y2dldGF0dHIoMCwgJnRlcm1pb3MpOwoJCXRtcCA9IHRlcm1pb3M7CgkJdG1wLmNfbGZsYWcgJj0gfihJQ0FOT04gfCBFQ0hPKTsKCQl0Y3NldGF0dHIoMCwgVENTQU5PVywgJnRtcCk7CgkJdGVybWlvc19zZXQgPSAxOwoJfQojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKCWlmICh2ZXJzaW9uMikgewoJCWNoZWNrX3Jvb3QyKCk7CgkJY2hlY2syKCk7Cgl9IGVsc2UKI2VuZGlmCgl7CgkJY2hlY2tfcm9vdCgpOwoJCWNoZWNrKCk7Cgl9CglpZiAodmVyYm9zZSkgewoJCWludCBpLCBmcmVlX2NudDsKCgkJZm9yIChpID0gMSwgZnJlZV9jbnQgPSAwOyBpIDw9IElOT0RFUzsgaSsrKQoJCQlpZiAoIWlub2RlX2luX3VzZShpKSkKCQkJCWZyZWVfY250Kys7CgkJcHJpbnRmKCJcbiU2bGQgaW5vZGVzIHVzZWQgKCVsZCUlKVxuIiwgKElOT0RFUyAtIGZyZWVfY250KSwKCQkJICAgMTAwICogKElOT0RFUyAtIGZyZWVfY250KSAvIElOT0RFUyk7CgkJZm9yIChpID0gRklSU1RaT05FLCBmcmVlX2NudCA9IDA7IGkgPCBaT05FUzsgaSsrKQoJCQlpZiAoIXpvbmVfaW5fdXNlKGkpKQoJCQkJZnJlZV9jbnQrKzsKCQlwcmludGYoIiU2bGQgem9uZXMgdXNlZCAoJWxkJSUpXG4iLCAoWk9ORVMgLSBmcmVlX2NudCksCgkJCSAgIDEwMCAqIChaT05FUyAtIGZyZWVfY250KSAvIFpPTkVTKTsKCQlwcmludGYoIlxuJTZkIHJlZ3VsYXIgZmlsZXNcbiIKCQkJICAgIiU2ZCBkaXJlY3Rvcmllc1xuIgoJCQkgICAiJTZkIGNoYXJhY3RlciBkZXZpY2UgZmlsZXNcbiIKCQkJICAgIiU2ZCBibG9jayBkZXZpY2UgZmlsZXNcbiIKCQkJICAgIiU2ZCBsaW5rc1xuIgoJCQkgICAiJTZkIHN5bWJvbGljIGxpbmtzXG4iCgkJCSAgICItLS0tLS1cbiIKCQkJICAgIiU2ZCBmaWxlc1xuIiwKCQkJICAgcmVndWxhciwgZGlyZWN0b3J5LCBjaGFyZGV2LCBibG9ja2RldiwKCQkJICAgbGlua3MgLSAyICogZGlyZWN0b3J5ICsgMSwgc3ltbGlua3MsCgkJCSAgIHRvdGFsIC0gMiAqIGRpcmVjdG9yeSArIDEpOwoJfQoJaWYgKGNoYW5nZWQpIHsKCQl3cml0ZV90YWJsZXMoKTsKCQlwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKCQkJICAgIkZJTEUgU1lTVEVNIEhBUyBCRUVOIENIQU5HRURcbiIKCQkJICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwoJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDM7IGNvdW50KyspCgkJCXN5bmMoKTsKCX0gZWxzZSBpZiAocmVwYWlyKQoJCXdyaXRlX3N1cGVyX2Jsb2NrKCk7CgoJaWYgKHJlcGFpciAmJiAhYXV0b21hdGljKQoJCXRjc2V0YXR0cigwLCBUQ1NBTk9XLCAmdGVybWlvcyk7CgoJaWYgKGNoYW5nZWQpCgkJcmV0Y29kZSArPSAzOwoJaWYgKGVycm9yc191bmNvcnJlY3RlZCkKCQlyZXRjb2RlICs9IDQ7CglyZXR1cm4gcmV0Y29kZTsKfQo=