Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIGZzY2suYyAtIGEgZmlsZSBzeXN0ZW0gY29uc2lzdGVuY3kgY2hlY2tlciBmb3IgTGludXguCiAqCiAqIChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzLiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQKICogYXMgcGVyIHRoZSBHTlUgY29weWxlZnQuCiAqLwoKLyoKICogMDkuMTEuOTEgIC0gIG1hZGUgdGhlIGZpcnN0IHJ1ZGltZXRhcnkgZnVuY3Rpb25zCiAqCiAqIDEwLjExLjkxICAtICB1cGRhdGVkLCBkb2VzIGNoZWNraW5nLCBubyByZXBhaXJzIHlldC4KICoJCVNlbnQgb3V0IHRvIHRoZSBtYWlsaW5nLWxpc3QgZm9yIHRlc3RpbmcuCiAqCiAqIDE0LjExLjkxICAtCVRlc3Rpbmcgc2VlbXMgdG8gaGF2ZSBnb25lIHdlbGwuIEFkZGVkIHNvbWUKICoJCWNvcnJlY3Rpb24tY29kZSwgYW5kIGNoYW5nZWQgc29tZSBmdW5jdGlvbnMuCiAqCiAqIDE1LjExLjkxICAtICBNb3JlIGNvcnJlY3Rpb24gY29kZS4gSG9wZWZ1bGx5IGl0IG5vdGljZXMgbW9zdAogKgkJY2FzZXMgbm93LCBhbmQgdHJpZXMgdG8gZG8gc29tZXRoaW5nIGFib3V0IHRoZW0uCiAqCiAqIDE2LjExLjkxICAtICBNb3JlIGNvcnJlY3Rpb25zICh0aGFua3MgdG8gTWlrYSBKYWxhdmEpLiBNb3N0CiAqCQl0aGluZ3Mgc2VlbSB0byB3b3JrIG5vdy4gWWVhaCwgc3VyZS4KICoKICoKICogMTkuMDQuOTIgIC0JSGFkIHRvIHN0YXJ0IG92ZXIgYWdhaW4gZnJvbSB0aGlzIG9sZCB2ZXJzaW9uLCBhcyBhCiAqCQlrZXJuZWwgYnVnIGF0ZSBteSBlbmhhbmNlZCBmc2NrIGluIGZlYnJ1YXJ5LgogKgogKiAyOC4wMi45MyAgLQlhZGRlZCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgZGlyZWN0b3J5IGVudHJ5IHNpemVzLi4KICoKICogU2F0IE1hciAgNiAxODo1OTo0MiAxOTkzLCBmYWl0aEBjcy51bmMuZWR1OiBPdXRwdXQgbmFtZWxlbiB3aXRoCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXItYmxvY2sgaW5mb3JtYXRpb24KICoKICogU2F0IE9jdCAgOSAxMToxNzoxMSAxOTkzLCBmYWl0aEBjcy51bmMuZWR1OiBtYWtlIGV4aXQgc3RhdHVzIGNvbmZvcm0KICogICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGF0IHJlcXVpcmVkIGJ5IGZzdXRpbAogKgogKiBNb24gSmFuICAzIDExOjA2OjUyIDE5OTQgLSBEci4gV2V0dHN0ZWluIChncmVnJXdpbmQudXVjcEBwbGFpbnMubm9kYWsuZWR1KQogKgkJCSAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGZpbGUgc3lzdGVtIHZhbGlkIGZsYWcuICBBbHNvCiAqCQkJICAgICAgYWRkZWQgcHJvZ3JhbV92ZXJzaW9uIHZhcmlhYmxlIGFuZCBvdXRwdXQgb2YKICoJCQkgICAgICBwcm9ncmFtIG5hbWUgYW5kIHZlcnNpb24gbnVtYmVyIHdoZW4gcHJvZ3JhbQogKgkJCSAgICAgIGlzIGV4ZWN1dGVkLgogKgogKiAzMC4xMC45NCAtIGFkZGVkIHN1cHBvcnQgZm9yIHYyIGZpbGVzeXN0ZW0KICogICAgICAgICAgICAoQW5kcmVhcyBTY2h3YWIsIHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZSkKICoKICogMTAuMTIuOTQgIC0gIGFkZGVkIHRlc3QgdG8gcHJldmVudCBjaGVja2luZyBvZiBtb3VudGVkIGZzIGFkYXB0ZWQKICogICAgICAgICAgICAgIGZyb20gVGhlb2RvcmUgVHMnbydzICh0eXRzb0BhdGhlbmEubWl0LmVkdSkgZTJmc2NrCiAqICAgICAgICAgICAgICBwcm9ncmFtLiAgKERhbmllbCBRdWlubGFuLCBxdWlubGFuQHlnZ2RyYXNpbC5jb20pCiAqCiAqIDAxLjA3Ljk2ICAtIEZpeGVkIHRoZSB2MiBmcyBzdHVmZiB0byB1c2UgdGhlIHJpZ2h0ICNkZWZpbmVzIGFuZCBzdWNoCiAqCSAgICAgICBmb3IgbW9kZXJuIGxpYmNzIChqYW5sQG1hdGgudWlvLm5vLCBOaWNvbGFpIExhbmdmZWxkdCkKICoKICogMDIuMDcuOTYgIC0gQWRkZWQgQyBiaXQgZmlkZGxpbmcgcm91dGluZXMgZnJvbSBybWtAZWNzLnNvdG9uLmFjLnVrIAogKiAgICAgICAgICAgICAoUnVzc2VsbCBLaW5nKS4gIEhlIG1hZGUgdGhlbSBmb3IgQVJNLiAgSXQgd291bGQgc2VlbQogKgkgICAgICAgdGhhdCB0aGUgQVJNIGlzIHBvd2VyZnVsIGVub3VnaCB0byBkbyB0aGlzIGluIEMgd2hlcmVhcwogKiAgICAgICAgICAgICBpMzg2IGFuZCBtNjRrIG11c3QgdXNlIGFzc2VtYmx5IHRvIGdldCBpdCBmYXN0ID46LSkKICoJICAgICAgIFRoaXMgc2hvdWxkIG1ha2UgbWluaXggZnNjayBzeXN0ZW1pbmRlcGVuZGVudC4KICoJICAgICAgIChqYW5sQG1hdGgudWlvLm5vLCBOaWNvbGFpIExhbmdmZWxkdCkKICoKICogMDQuMTEuOTYgIC0gQWRkZWQgbWlub3IgZml4ZXMgZnJvbSBBbmRyZWFzIFNjaHdhYiB0byBhdm9pZCBjb21waWxlcgogKiAgICAgICAgICAgICB3YXJuaW5ncy4gIEFkZGVkIG1jNjhrIGJpdG9wcyBmcm9tIAogKgkgICAgICAgSm9lcmcgRG9yY2hhaW4gPGRvcmNoYWluQG1waS1zYi5tcGcuZGU+LgogKgogKiAwNi4xMS45NiAgLSBBZGRlZCB2MiBjb2RlIHN1Ym1pdHRlZCBieSBKb2VyZyBEb3JjaGFpbiwgYnV0IHdyaXR0ZW4gYnkKICogICAgICAgICAgICAgQW5kcmVhcyBTY2h3YWIuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqCiAqIEkndmUgaGFkIG5vIHRpbWUgdG8gYWRkIGNvbW1lbnRzIC0gaG9wZWZ1bGx5IHRoZSBmdW5jdGlvbiBuYW1lcwogKiBhcmUgY29tbWVudHMgZW5vdWdoLiBBcyB3aXRoIGFsbCBmaWxlIHN5c3RlbSBjaGVja2VycywgdGhpcyBhc3N1bWVzCiAqIHRoZSBmaWxlIHN5c3RlbSBpcyBxdWllc2NlbnQgLSBkb24ndCB1c2UgaXQgb24gYSBtb3VudGVkIGRldmljZQogKiB1bmxlc3MgeW91IGNhbiBiZSBzdXJlIG5vYm9keSBpcyB3cml0aW5nIHRvIGl0IChhbmQgcmVtZW1iZXIgdGhhdCB0aGUKICoga2VybmVsIGNhbiB3cml0ZSB0byBpdCB3aGVuIGl0IHNlYXJjaGVzIGZvciBmaWxlcykuCiAqCiAqIFVzdWFnZTogZnNjayBbLWxhcnZzbV0gZGV2aWNlCiAqCS1sIGZvciBhIGxpc3Rpbmcgb2YgYWxsIHRoZSBmaWxlbmFtZXMKICoJLWEgZm9yIGF1dG9tYXRpYyByZXBhaXJzIChub3QgaW1wbGVtZW50ZWQpCiAqCS1yIGZvciByZXBhaXJzIChpbnRlcmFjdGl2ZSkgKG5vdCBpbXBsZW1lbnRlZCkKICoJLXYgZm9yIHZlcmJvc2UgKHRlbGxzIGhvdyBtYW55IGZpbGVzKQogKgktcyBmb3Igc3VwZXItYmxvY2sgaW5mbwogKgktbSBmb3IgbWluaXgtbGlrZSAibW9kZSBub3QgY2xlYXJlZCIgd2FybmluZ3MKICoJLWYgZm9yY2UgZmlsZXN5c3RlbSBjaGVjayBldmVuIGlmIGZpbGVzeXN0ZW0gbWFya2VkIGFzIHZhbGlkCiAqCiAqIFRoZSBkZXZpY2UgbWF5IGJlIGEgYmxvY2sgZGV2aWNlIG9yIGEgaW1hZ2Ugb2Ygb25lLCBidXQgdGhpcyBpc24ndAogKiBlbmZvcmNlZCAoYnV0IGl0J3Mgbm90IG11Y2ggZnVuIG9uIGEgY2hhcmFjdGVyIGRldmljZSA6LSkuIAogKi8KCiNpbmNsdWRlICJidXN5Ym94LmgiCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8dGVybWlvcy5oPgojaW5jbHVkZSA8bW50ZW50Lmg+CiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KCiAKIHR5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1MTY7CnR5cGVkZWYgdW5zaWduZWQgaW50IHUzMjsKCgojZGVmaW5lIE1JTklYX1JPT1RfSU5PIDEKI2RlZmluZSBNSU5JWF9MSU5LX01BWAkyNTAKI2RlZmluZSBNSU5JWDJfTElOS19NQVgJNjU1MzAKCiNkZWZpbmUgTUlOSVhfSV9NQVBfU0xPVFMJOAojZGVmaW5lIE1JTklYX1pfTUFQX1NMT1RTCTY0CiNkZWZpbmUgTUlOSVhfU1VQRVJfTUFHSUMJMHgxMzdGCQkvKiBvcmlnaW5hbCBtaW5peCBmcyAqLwojZGVmaW5lIE1JTklYX1NVUEVSX01BR0lDMgkweDEzOEYJCS8qIG1pbml4IGZzLCAzMCBjaGFyIG5hbWVzICovCiNkZWZpbmUgTUlOSVgyX1NVUEVSX01BR0lDCTB4MjQ2OAkJLyogbWluaXggVjIgZnMgKi8KI2RlZmluZSBNSU5JWDJfU1VQRVJfTUFHSUMyCTB4MjQ3OAkJLyogbWluaXggVjIgZnMsIDMwIGNoYXIgbmFtZXMgKi8KI2RlZmluZSBNSU5JWF9WQUxJRF9GUwkJMHgwMDAxCQkvKiBDbGVhbiBmcy4gKi8KI2RlZmluZSBNSU5JWF9FUlJPUl9GUwkJMHgwMDAyCQkvKiBmcyBoYXMgZXJyb3JzLiAqLwoKI2RlZmluZSBNSU5JWF9JTk9ERVNfUEVSX0JMT0NLICgoQkxPQ0tfU0laRSkvKHNpemVvZiAoc3RydWN0IG1pbml4X2lub2RlKSkpCiNkZWZpbmUgTUlOSVgyX0lOT0RFU19QRVJfQkxPQ0sgKChCTE9DS19TSVpFKS8oc2l6ZW9mIChzdHJ1Y3QgbWluaXgyX2lub2RlKSkpCgojZGVmaW5lIE1JTklYX1YxCQkweDAwMDEJCS8qIG9yaWdpbmFsIG1pbml4IGZzICovCiNkZWZpbmUgTUlOSVhfVjIJCTB4MDAwMgkJLyogbWluaXggVjIgZnMgKi8KCiNkZWZpbmUgSU5PREVfVkVSU0lPTihpbm9kZSkJaW5vZGUtPmlfc2ItPnUubWluaXhfc2Iuc192ZXJzaW9uCgovKgogKiBUaGlzIGlzIHRoZSBvcmlnaW5hbCBtaW5peCBpbm9kZSBsYXlvdXQgb24gZGlzay4KICogTm90ZSB0aGUgOC1iaXQgZ2lkIGFuZCBhdGltZSBhbmQgY3RpbWUuCiAqLwpzdHJ1Y3QgbWluaXhfaW5vZGUgewoJdTE2IGlfbW9kZTsKCXUxNiBpX3VpZDsKCXUzMiBpX3NpemU7Cgl1MzIgaV90aW1lOwoJdTggIGlfZ2lkOwoJdTggIGlfbmxpbmtzOwoJdTE2IGlfem9uZVs5XTsKfTsKCi8qCiAqIFRoZSBuZXcgbWluaXggaW5vZGUgaGFzIGFsbCB0aGUgdGltZSBlbnRyaWVzLCBhcyB3ZWxsIGFzCiAqIGxvbmcgYmxvY2sgbnVtYmVycyBhbmQgYSB0aGlyZCBpbmRpcmVjdCBibG9jayAoNysxKzErMQogKiBpbnN0ZWFkIG9mIDcrMSsxKS4gQWxzbywgc29tZSBwcmV2aW91c2x5IDgtYml0IHZhbHVlcyBhcmUKICogbm93IDE2LWJpdC4gVGhlIGlub2RlIGlzIG5vdyA2NCBieXRlcyBpbnN0ZWFkIG9mIDMyLgogKi8Kc3RydWN0IG1pbml4Ml9pbm9kZSB7Cgl1MTYgaV9tb2RlOwoJdTE2IGlfbmxpbmtzOwoJdTE2IGlfdWlkOwoJdTE2IGlfZ2lkOwoJdTMyIGlfc2l6ZTsKCXUzMiBpX2F0aW1lOwoJdTMyIGlfbXRpbWU7Cgl1MzIgaV9jdGltZTsKCXUzMiBpX3pvbmVbMTBdOwp9OwoKLyoKICogbWluaXggc3VwZXItYmxvY2sgZGF0YSBvbiBkaXNrCiAqLwpzdHJ1Y3QgbWluaXhfc3VwZXJfYmxvY2sgewoJdTE2IHNfbmlub2RlczsKCXUxNiBzX256b25lczsKCXUxNiBzX2ltYXBfYmxvY2tzOwoJdTE2IHNfem1hcF9ibG9ja3M7Cgl1MTYgc19maXJzdGRhdGF6b25lOwoJdTE2IHNfbG9nX3pvbmVfc2l6ZTsKCXUzMiBzX21heF9zaXplOwoJdTE2IHNfbWFnaWM7Cgl1MTYgc19zdGF0ZTsKCXUzMiBzX3pvbmVzOwp9OwoKc3RydWN0IG1pbml4X2Rpcl9lbnRyeSB7Cgl1MTYgaW5vZGU7CgljaGFyIG5hbWVbMF07Cn07CgojZGVmaW5lIEJMT0NLX1NJWkVfQklUUyAxMAojZGVmaW5lIEJMT0NLX1NJWkUgKDE8PEJMT0NLX1NJWkVfQklUUykKCiNkZWZpbmUgTkFNRV9NQVggICAgICAgICAyNTUgICAvKiAjIGNoYXJzIGluIGEgZmlsZSBuYW1lICovCgojZGVmaW5lIE1JTklYX0lOT0RFU19QRVJfQkxPQ0sgKChCTE9DS19TSVpFKS8oc2l6ZW9mIChzdHJ1Y3QgbWluaXhfaW5vZGUpKSkKCiNkZWZpbmUgTUlOSVhfVkFMSURfRlMgICAgICAgICAgICAgICAweDAwMDEgICAgICAgICAgLyogQ2xlYW4gZnMuICovCiNkZWZpbmUgTUlOSVhfRVJST1JfRlMgICAgICAgICAgICAgICAweDAwMDIgICAgICAgICAgLyogZnMgaGFzIGVycm9ycy4gKi8KCiNkZWZpbmUgTUlOSVhfU1VQRVJfTUFHSUMgICAgMHgxMzdGICAgICAgICAgIC8qIG9yaWdpbmFsIG1pbml4IGZzICovCiNkZWZpbmUgTUlOSVhfU1VQRVJfTUFHSUMyICAgMHgxMzhGICAgICAgICAgIC8qIG1pbml4IGZzLCAzMCBjaGFyIG5hbWVzICovCgojaWZuZGVmIEJMS0dFVFNJWkUKI2RlZmluZSBCTEtHRVRTSVpFIF9JTygweDEyLDk2KSAgICAvKiByZXR1cm4gZGV2aWNlIHNpemUgKi8KI2VuZGlmCgojaWZuZGVmIF9fbGludXhfXwojZGVmaW5lIHZvbGF0aWxlCiNlbmRpZgoKI2RlZmluZSBST09UX0lOTyAxCgojZGVmaW5lIFVQUEVSKHNpemUsbikgKChzaXplKygobiktMSkpLyhuKSkKI2RlZmluZSBJTk9ERV9TSVpFIChzaXplb2Yoc3RydWN0IG1pbml4X2lub2RlKSkKI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCiNkZWZpbmUgSU5PREVfU0laRTIgKHNpemVvZihzdHJ1Y3QgbWluaXgyX2lub2RlKSkKI2RlZmluZSBJTk9ERV9CTE9DS1MgVVBQRVIoSU5PREVTLCAodmVyc2lvbjIgPyBNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyBcCgkJCQkgICAgOiBNSU5JWF9JTk9ERVNfUEVSX0JMT0NLKSkKI2Vsc2UKI2RlZmluZSBJTk9ERV9CTE9DS1MgVVBQRVIoSU5PREVTLCAoTUlOSVhfSU5PREVTX1BFUl9CTE9DSykpCiNlbmRpZgojZGVmaW5lIElOT0RFX0JVRkZFUl9TSVpFIChJTk9ERV9CTE9DS1MgKiBCTE9DS19TSVpFKQoKI2RlZmluZSBCSVRTX1BFUl9CTE9DSyAoQkxPQ0tfU0laRTw8MykKCnN0YXRpYyBjaGFyICpwcm9ncmFtX3ZlcnNpb24gPSAiMS4yIC0gMTEvMTEvOTYiOwpzdGF0aWMgY2hhciAqZGV2aWNlX25hbWUgPSBOVUxMOwpzdGF0aWMgaW50IElOOwpzdGF0aWMgaW50IHJlcGFpciA9IDAsIGF1dG9tYXRpYyA9IDAsIHZlcmJvc2UgPSAwLCBsaXN0ID0gMCwgc2hvdyA9CgkwLCB3YXJuX21vZGUgPSAwLCBmb3JjZSA9IDA7CnN0YXRpYyBpbnQgZGlyZWN0b3J5ID0gMCwgcmVndWxhciA9IDAsIGJsb2NrZGV2ID0gMCwgY2hhcmRldiA9IDAsIGxpbmtzID0KCTAsIHN5bWxpbmtzID0gMCwgdG90YWwgPSAwOwoKc3RhdGljIGludCBjaGFuZ2VkID0gMDsJCQkvKiBmbGFncyBpZiB0aGUgZmlsZXN5c3RlbSBoYXMgYmVlbiBjaGFuZ2VkICovCnN0YXRpYyBpbnQgZXJyb3JzX3VuY29ycmVjdGVkID0gMDsJLyogZmxhZyBpZiBzb21lIGVycm9yIHdhcyBub3QgY29ycmVjdGVkICovCnN0YXRpYyBpbnQgZGlyc2l6ZSA9IDE2OwpzdGF0aWMgaW50IG5hbWVsZW4gPSAxNDsKc3RhdGljIGludCB2ZXJzaW9uMiA9IDA7CnN0YXRpYyBzdHJ1Y3QgdGVybWlvcyB0ZXJtaW9zOwpzdGF0aWMgaW50IHRlcm1pb3Nfc2V0ID0gMDsKCi8qIEZpbGUtbmFtZSBkYXRhICovCiNkZWZpbmUgTUFYX0RFUFRIIDMyCnN0YXRpYyBpbnQgbmFtZV9kZXB0aCA9IDA7Ci8vIHN0YXRpYyBjaGFyIG5hbWVfbGlzdFtNQVhfREVQVEhdW0JVRlNJWiArIDFdOwpzdGF0aWMgY2hhciAqKm5hbWVfbGlzdCA9IE5VTEw7CgpzdGF0aWMgY2hhciAqaW5vZGVfYnVmZmVyID0gTlVMTDsKCiNkZWZpbmUgSW5vZGUgKCgoc3RydWN0IG1pbml4X2lub2RlICopIGlub2RlX2J1ZmZlciktMSkKI2RlZmluZSBJbm9kZTIgKCgoc3RydWN0IG1pbml4Ml9pbm9kZSAqKSBpbm9kZV9idWZmZXIpLTEpCnN0YXRpYyBjaGFyIHN1cGVyX2Jsb2NrX2J1ZmZlcltCTE9DS19TSVpFXTsKCiNkZWZpbmUgU3VwZXIgKCooc3RydWN0IG1pbml4X3N1cGVyX2Jsb2NrICopc3VwZXJfYmxvY2tfYnVmZmVyKQojZGVmaW5lIElOT0RFUyAoKHVuc2lnbmVkIGxvbmcpU3VwZXIuc19uaW5vZGVzKQojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKI2RlZmluZSBaT05FUyAoKHVuc2lnbmVkIGxvbmcpKHZlcnNpb24yID8gU3VwZXIuc196b25lcyA6IFN1cGVyLnNfbnpvbmVzKSkKI2Vsc2UKI2RlZmluZSBaT05FUyAoKHVuc2lnbmVkIGxvbmcpKFN1cGVyLnNfbnpvbmVzKSkKI2VuZGlmCiNkZWZpbmUgSU1BUFMgKCh1bnNpZ25lZCBsb25nKVN1cGVyLnNfaW1hcF9ibG9ja3MpCiNkZWZpbmUgWk1BUFMgKCh1bnNpZ25lZCBsb25nKVN1cGVyLnNfem1hcF9ibG9ja3MpCiNkZWZpbmUgRklSU1RaT05FICgodW5zaWduZWQgbG9uZylTdXBlci5zX2ZpcnN0ZGF0YXpvbmUpCiNkZWZpbmUgWk9ORVNJWkUgKCh1bnNpZ25lZCBsb25nKVN1cGVyLnNfbG9nX3pvbmVfc2l6ZSkKI2RlZmluZSBNQVhTSVpFICgodW5zaWduZWQgbG9uZylTdXBlci5zX21heF9zaXplKQojZGVmaW5lIE1BR0lDIChTdXBlci5zX21hZ2ljKQojZGVmaW5lIE5PUk1fRklSU1RaT05FICgyK0lNQVBTK1pNQVBTK0lOT0RFX0JMT0NLUykKCnN0YXRpYyBjaGFyICppbm9kZV9tYXA7CnN0YXRpYyBjaGFyICp6b25lX21hcDsKCnN0YXRpYyB1bnNpZ25lZCBjaGFyICppbm9kZV9jb3VudCA9IE5VTEw7CnN0YXRpYyB1bnNpZ25lZCBjaGFyICp6b25lX2NvdW50ID0gTlVMTDsKCnN0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjayh1bnNpZ25lZCBpbnQgaW5vKTsKI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjazIodW5zaWduZWQgaW50IGlubyk7CiNlbmRpZgoKc3RhdGljIGlubGluZSBpbnQgYml0KGNoYXIgKiBhLHVuc2lnbmVkIGludCBpKQp7CgkgIHJldHVybiAoYVtpID4+IDNdICYgKDE8PChpICYgNykpKSAhPSAwOwp9CiNkZWZpbmUgaW5vZGVfaW5fdXNlKHgpIChiaXQoaW5vZGVfbWFwLCh4KSkpCiNkZWZpbmUgem9uZV9pbl91c2UoeCkgKGJpdCh6b25lX21hcCwoeCktRklSU1RaT05FKzEpKQoKI2RlZmluZSBtYXJrX2lub2RlKHgpIChzZXRiaXQoaW5vZGVfbWFwLCh4KSksY2hhbmdlZD0xKQojZGVmaW5lIHVubWFya19pbm9kZSh4KSAoY2xyYml0KGlub2RlX21hcCwoeCkpLGNoYW5nZWQ9MSkKCiNkZWZpbmUgbWFya196b25lKHgpIChzZXRiaXQoem9uZV9tYXAsKHgpLUZJUlNUWk9ORSsxKSxjaGFuZ2VkPTEpCiNkZWZpbmUgdW5tYXJrX3pvbmUoeCkgKGNscmJpdCh6b25lX21hcCwoeCktRklSU1RaT05FKzEpLGNoYW5nZWQ9MSkKCnN0YXRpYyB2b2lkIGxlYXZlKGludCkgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSk7CnN0YXRpYyB2b2lkIGxlYXZlKGludCBzdGF0dXMpCnsKCWlmICh0ZXJtaW9zX3NldCkKCQl0Y3NldGF0dHIoMCwgVENTQU5PVywgJnRlcm1pb3MpOwoJZXhpdChzdGF0dXMpOwp9CgpzdGF0aWMgdm9pZCBzaG93X3VzYWdlKHZvaWQpCnsKCXVzYWdlKGZzY2tfbWluaXhfdXNhZ2UpOwp9CgpzdGF0aWMgdm9pZCBkaWUoY29uc3QgY2hhciAqc3RyKQp7CgllcnJvck1zZygiJXNcbiIsIHN0cik7CglsZWF2ZSg4KTsKfQoKLyoKICogVGhpcyBzaW1wbHkgZ29lcyB0aHJvdWdoIHRoZSBmaWxlLW5hbWUgZGF0YSBhbmQgcHJpbnRzIG91dCB0aGUKICogY3VycmVudCBmaWxlLgogKi8Kc3RhdGljIHZvaWQgcHJpbnRfY3VycmVudF9uYW1lKHZvaWQpCnsKCWludCBpID0gMDsKCgl3aGlsZSAoaSA8IG5hbWVfZGVwdGgpCgkJcHJpbnRmKCIvJS4qcyIsIG5hbWVsZW4sIG5hbWVfbGlzdFtpKytdKTsKCWlmIChpID09IDApCgkJcHJpbnRmKCIvIik7Cn0KCnN0YXRpYyBpbnQgYXNrKGNvbnN0IGNoYXIgKnN0cmluZywgaW50IGRlZikKewoJaW50IGM7CgoJaWYgKCFyZXBhaXIpIHsKCQlwcmludGYoIlxuIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQlyZXR1cm4gMDsKCX0KCWlmIChhdXRvbWF0aWMpIHsKCQlwcmludGYoIlxuIik7CgkJaWYgKCFkZWYpCgkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJcmV0dXJuIGRlZjsKCX0KCXByaW50ZihkZWYgPyAiJXMgKHkvbik/ICIgOiAiJXMgKG4veSk/ICIsIHN0cmluZyk7Cglmb3IgKDs7KSB7CgkJZmZsdXNoKHN0ZG91dCk7CgkJaWYgKChjID0gZ2V0Y2hhcigpKSA9PSBFT0YpIHsKCQkJaWYgKCFkZWYpCgkJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCQlyZXR1cm4gZGVmOwoJCX0KCQljID0gdG91cHBlcihjKTsKCQlpZiAoYyA9PSAnWScpIHsKCQkJZGVmID0gMTsKCQkJYnJlYWs7CgkJfSBlbHNlIGlmIChjID09ICdOJykgewoJCQlkZWYgPSAwOwoJCQlicmVhazsKCQl9IGVsc2UgaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1xuJykKCQkJYnJlYWs7Cgl9CglpZiAoZGVmKQoJCXByaW50ZigieVxuIik7CgllbHNlIHsKCQlwcmludGYoIm5cbiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9CglyZXR1cm4gZGVmOwp9CgovKgogKiBNYWtlIGNlcnRhaW4gdGhhdCB3ZSBhcmVuJ3QgY2hlY2tpbmcgYSBmaWxlc3lzdGVtIHRoYXQgaXMgb24gYQogKiBtb3VudGVkIHBhcnRpdGlvbi4gIENvZGUgYWRhcHRlZCBmcm9tIGUyZnNjaywgQ29weXJpZ2h0IChDKSAxOTkzLAogKiAxOTk0IFRoZW9kb3JlIFRzJ28uICBBbHNvIGxpY2Vuc2VkIHVuZGVyIEdQTC4KICovCnN0YXRpYyB2b2lkIGNoZWNrX21vdW50KHZvaWQpCnsKCUZJTEUgKmY7CglzdHJ1Y3QgbW50ZW50ICptbnQ7CglpbnQgY29udDsKCWludCBmZDsKCglpZiAoKGYgPSBzZXRtbnRlbnQoTU9VTlRFRCwgInIiKSkgPT0gTlVMTCkKCQlyZXR1cm47Cgl3aGlsZSAoKG1udCA9IGdldG1udGVudChmKSkgIT0gTlVMTCkKCQlpZiAoc3RyY21wKGRldmljZV9uYW1lLCBtbnQtPm1udF9mc25hbWUpID09IDApCgkJCWJyZWFrOwoJZW5kbW50ZW50KGYpOwoJaWYgKCFtbnQpCgkJcmV0dXJuOwoKCS8qCgkgKiBJZiB0aGUgcm9vdCBpcyBtb3VudGVkIHJlYWQtb25seSwgdGhlbiAvZXRjL210YWIgaXMKCSAqIHByb2JhYmx5IG5vdCBjb3JyZWN0OyBzbyB3ZSB3b24ndCBpc3N1ZSBhIHdhcm5pbmcgYmFzZWQgb24KCSAqIGl0LgoJICovCglmZCA9IG9wZW4oTU9VTlRFRCwgT19SRFdSKTsKCWlmIChmZCA8IDAgJiYgZXJybm8gPT0gRVJPRlMpCgkJcmV0dXJuOwoJZWxzZQoJCWNsb3NlKGZkKTsKCglwcmludGYoIiVzIGlzIG1vdW50ZWQuCSAiLCBkZXZpY2VfbmFtZSk7CglpZiAoaXNhdHR5KDApICYmIGlzYXR0eSgxKSkKCQljb250ID0gYXNrKCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gY29udGludWUiLCAwKTsKCWVsc2UKCQljb250ID0gMDsKCWlmICghY29udCkgewoJCXByaW50ZigiY2hlY2sgYWJvcnRlZC5cbiIpOwoJCWV4aXQoMCk7Cgl9CglyZXR1cm47Cn0KCi8qCiAqIGNoZWNrX3pvbmVfbnIgY2hlY2tzIHRvIHNlZSB0aGF0ICpuciBpcyBhIHZhbGlkIHpvbmUgbnIuIElmIGl0CiAqIGlzbid0LCBpdCB3aWxsIHBvc3NpYmx5IGJlIHJlcGFpcmVkLiBDaGVja196b25lX25yIHNldHMgKmNvcnJlY3RlZAogKiBpZiBhbiBlcnJvciB3YXMgY29ycmVjdGVkLCBhbmQgcmV0dXJucyB0aGUgem9uZSAoMCBmb3Igbm8gem9uZQogKiBvciBhIGJhZCB6b25lLW51bWJlcikuCiAqLwpzdGF0aWMgaW50IGNoZWNrX3pvbmVfbnIodW5zaWduZWQgc2hvcnQgKm5yLCBpbnQgKmNvcnJlY3RlZCkKewoJaWYgKCEqbnIpCgkJcmV0dXJuIDA7CglpZiAoKm5yIDwgRklSU1RaT05FKQoJCXByaW50ZigiWm9uZSBuciA8IEZJUlNUWk9ORSBpbiBmaWxlIGAiKTsKCWVsc2UgaWYgKCpuciA+PSBaT05FUykKCQlwcmludGYoIlpvbmUgbnIgPj0gWk9ORVMgaW4gZmlsZSBgIik7CgllbHNlCgkJcmV0dXJuICpucjsKCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJcHJpbnRmKCInLiIpOwoJaWYgKGFzaygiUmVtb3ZlIGJsb2NrIiwgMSkpIHsKCQkqbnIgPSAwOwoJCSpjb3JyZWN0ZWQgPSAxOwoJfQoJcmV0dXJuIDA7Cn0KCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdGF0aWMgaW50IGNoZWNrX3pvbmVfbnIyKHVuc2lnbmVkIGludCAqbnIsIGludCAqY29ycmVjdGVkKQp7CglpZiAoISpucikKCQlyZXR1cm4gMDsKCWlmICgqbnIgPCBGSVJTVFpPTkUpCgkJcHJpbnRmKCJab25lIG5yIDwgRklSU1RaT05FIGluIGZpbGUgYCIpOwoJZWxzZSBpZiAoKm5yID49IFpPTkVTKQoJCXByaW50ZigiWm9uZSBuciA+PSBaT05FUyBpbiBmaWxlIGAiKTsKCWVsc2UKCQlyZXR1cm4gKm5yOwoJcHJpbnRfY3VycmVudF9uYW1lKCk7CglwcmludGYoIicuIik7CglpZiAoYXNrKCJSZW1vdmUgYmxvY2siLCAxKSkgewoJCSpuciA9IDA7CgkJKmNvcnJlY3RlZCA9IDE7Cgl9CglyZXR1cm4gMDsKfQojZW5kaWYKCi8qCiAqIHJlYWQtYmxvY2sgcmVhZHMgYmxvY2sgbnIgaW50byB0aGUgYnVmZmVyIGF0IGFkZHIuCiAqLwpzdGF0aWMgdm9pZCByZWFkX2Jsb2NrKHVuc2lnbmVkIGludCBuciwgY2hhciAqYWRkcikKewoJaWYgKCFucikgewoJCW1lbXNldChhZGRyLCAwLCBCTE9DS19TSVpFKTsKCQlyZXR1cm47Cgl9CglpZiAoQkxPQ0tfU0laRSAqIG5yICE9IGxzZWVrKElOLCBCTE9DS19TSVpFICogbnIsIFNFRUtfU0VUKSkgewoJCXByaW50ZigiUmVhZCBlcnJvcjogdW5hYmxlIHRvIHNlZWsgdG8gYmxvY2sgaW4gZmlsZSAnIik7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCInXG4iKTsKCQltZW1zZXQoYWRkciwgMCwgQkxPQ0tfU0laRSk7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0gZWxzZSBpZiAoQkxPQ0tfU0laRSAhPSByZWFkKElOLCBhZGRyLCBCTE9DS19TSVpFKSkgewoJCXByaW50ZigiUmVhZCBlcnJvcjogYmFkIGJsb2NrIGluIGZpbGUgJyIpOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiJ1xuIik7CgkJbWVtc2V0KGFkZHIsIDAsIEJMT0NLX1NJWkUpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9Cn0KCi8qCiAqIHdyaXRlX2Jsb2NrIHdyaXRlcyBibG9jayBuciB0byBkaXNrLgogKi8Kc3RhdGljIHZvaWQgd3JpdGVfYmxvY2sodW5zaWduZWQgaW50IG5yLCBjaGFyICphZGRyKQp7CglpZiAoIW5yKQoJCXJldHVybjsKCWlmIChuciA8IEZJUlNUWk9ORSB8fCBuciA+PSBaT05FUykgewoJCXByaW50ZigiSW50ZXJuYWwgZXJyb3I6IHRyeWluZyB0byB3cml0ZSBiYWQgYmxvY2tcbiIKCQkJICAgIldyaXRlIHJlcXVlc3QgaWdub3JlZFxuIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQlyZXR1cm47Cgl9CglpZiAoQkxPQ0tfU0laRSAqIG5yICE9IGxzZWVrKElOLCBCTE9DS19TSVpFICogbnIsIFNFRUtfU0VUKSkKCQlkaWUoInNlZWsgZmFpbGVkIGluIHdyaXRlX2Jsb2NrIik7CglpZiAoQkxPQ0tfU0laRSAhPSB3cml0ZShJTiwgYWRkciwgQkxPQ0tfU0laRSkpIHsKCQlwcmludGYoIldyaXRlIGVycm9yOiBiYWQgYmxvY2sgaW4gZmlsZSAnIik7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCInXG4iKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQp9CgovKgogKiBtYXAtYmxvY2sgY2FsY3VsYXRlcyB0aGUgYWJzb2x1dGUgYmxvY2sgbnIgb2YgYSBibG9jayBpbiBhIGZpbGUuCiAqIEl0IHNldHMgJ2NoYW5nZWQnIGlmIHRoZSBpbm9kZSBoYXMgbmVlZGVkIGNoYW5naW5nLCBhbmQgcmUtd3JpdGVzCiAqIGFueSBpbmRpcmVjdCBibG9ja3Mgd2l0aCBlcnJvcnMuCiAqLwpzdGF0aWMgaW50IG1hcF9ibG9jayhzdHJ1Y3QgbWluaXhfaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBpbnQgYmxrbnIpCnsKCXVuc2lnbmVkIHNob3J0IGluZFtCTE9DS19TSVpFID4+IDFdOwoJdW5zaWduZWQgc2hvcnQgZGluZFtCTE9DS19TSVpFID4+IDFdOwoJaW50IGJsa19jaGcsIGJsb2NrLCByZXN1bHQ7CgoJaWYgKGJsa25yIDwgNykKCQlyZXR1cm4gY2hlY2tfem9uZV9ucihpbm9kZS0+aV96b25lICsgYmxrbnIsICZjaGFuZ2VkKTsKCWJsa25yIC09IDc7CglpZiAoYmxrbnIgPCA1MTIpIHsKCQlibG9jayA9IGNoZWNrX3pvbmVfbnIoaW5vZGUtPmlfem9uZSArIDcsICZjaGFuZ2VkKTsKCQlyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCWJsa19jaGcgPSAwOwoJCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIoYmxrbnIgKyBpbmQsICZibGtfY2hnKTsKCQlpZiAoYmxrX2NoZykKCQkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CgkJcmV0dXJuIHJlc3VsdDsKCX0KCWJsa25yIC09IDUxMjsKCWJsb2NrID0gY2hlY2tfem9uZV9ucihpbm9kZS0+aV96b25lICsgOCwgJmNoYW5nZWQpOwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIoZGluZCArIChibGtuciAvIDUxMiksICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBkaW5kKTsKCWJsb2NrID0gcmVzdWx0OwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCWJsa19jaGcgPSAwOwoJcmVzdWx0ID0gY2hlY2tfem9uZV9ucihpbmQgKyAoYmxrbnIgJSA1MTIpLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCXJldHVybiByZXN1bHQ7Cn0KCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdGF0aWMgaW50IG1hcF9ibG9jazIoc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGludCBibGtucikKewoJdW5zaWduZWQgaW50IGluZFtCTE9DS19TSVpFID4+IDJdOwoJdW5zaWduZWQgaW50IGRpbmRbQkxPQ0tfU0laRSA+PiAyXTsKCXVuc2lnbmVkIGludCB0aW5kW0JMT0NLX1NJWkUgPj4gMl07CglpbnQgYmxrX2NoZywgYmxvY2ssIHJlc3VsdDsKCglpZiAoYmxrbnIgPCA3KQoJCXJldHVybiBjaGVja196b25lX25yMihpbm9kZS0+aV96b25lICsgYmxrbnIsICZjaGFuZ2VkKTsKCWJsa25yIC09IDc7CglpZiAoYmxrbnIgPCAyNTYpIHsKCQlibG9jayA9IGNoZWNrX3pvbmVfbnIyKGlub2RlLT5pX3pvbmUgKyA3LCAmY2hhbmdlZCk7CgkJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCQlibGtfY2hnID0gMDsKCQlyZXN1bHQgPSBjaGVja196b25lX25yMihibGtuciArIGluZCwgJmJsa19jaGcpOwoJCWlmIChibGtfY2hnKQoJCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCQlyZXR1cm4gcmVzdWx0OwoJfQoJYmxrbnIgLT0gMjU2OwoJaWYgKGJsa25yID49IDI1NiAqIDI1NikgewoJCWJsb2NrID0gY2hlY2tfem9uZV9ucjIoaW5vZGUtPmlfem9uZSArIDgsICZjaGFuZ2VkKTsKCQlyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBkaW5kKTsKCQlibGtfY2hnID0gMDsKCQlyZXN1bHQgPSBjaGVja196b25lX25yMihkaW5kICsgYmxrbnIgLyAyNTYsICZibGtfY2hnKTsKCQlpZiAoYmxrX2NoZykKCQkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJCWJsb2NrID0gcmVzdWx0OwoJCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CgkJYmxrX2NoZyA9IDA7CgkJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIoaW5kICsgYmxrbnIgJSAyNTYsICZibGtfY2hnKTsKCQlpZiAoYmxrX2NoZykKCQkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CgkJcmV0dXJuIHJlc3VsdDsKCX0KCWJsa25yIC09IDI1NiAqIDI1NjsKCWJsb2NrID0gY2hlY2tfem9uZV9ucjIoaW5vZGUtPmlfem9uZSArIDksICZjaGFuZ2VkKTsKCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIHRpbmQpOwoJYmxrX2NoZyA9IDA7CglyZXN1bHQgPSBjaGVja196b25lX25yMih0aW5kICsgYmxrbnIgLyAoMjU2ICogMjU2KSwgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIHRpbmQpOwoJYmxvY2sgPSByZXN1bHQ7CglyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBkaW5kKTsKCWJsa19jaGcgPSAwOwoJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIoZGluZCArIChibGtuciAvIDI1NikgJSAyNTYsICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBkaW5kKTsKCWJsb2NrID0gcmVzdWx0OwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCWJsa19jaGcgPSAwOwoJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIoaW5kICsgYmxrbnIgJSAyNTYsICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJcmV0dXJuIHJlc3VsdDsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIHdyaXRlX3N1cGVyX2Jsb2NrKHZvaWQpCnsKCS8qCgkgKiBTZXQgdGhlIHN0YXRlIG9mIHRoZSBmaWxlc3lzdGVtIGJhc2VkIG9uIHdoZXRoZXIgb3Igbm90IHRoZXJlCgkgKiBhcmUgdW5jb3JyZWN0ZWQgZXJyb3JzLiAgVGhlIGZpbGVzeXN0ZW0gdmFsaWQgZmxhZyBpcwoJICogdW5jb25kaXRpb25hbGx5IHNldCBpZiB3ZSBnZXQgdGhpcyBmYXIuCgkgKi8KCVN1cGVyLnNfc3RhdGUgfD0gTUlOSVhfVkFMSURfRlM7CglpZiAoZXJyb3JzX3VuY29ycmVjdGVkKQoJCVN1cGVyLnNfc3RhdGUgfD0gTUlOSVhfRVJST1JfRlM7CgllbHNlCgkJU3VwZXIuc19zdGF0ZSAmPSB+TUlOSVhfRVJST1JfRlM7CgoJaWYgKEJMT0NLX1NJWkUgIT0gbHNlZWsoSU4sIEJMT0NLX1NJWkUsIFNFRUtfU0VUKSkKCQlkaWUoInNlZWsgZmFpbGVkIGluIHdyaXRlX3N1cGVyX2Jsb2NrIik7CglpZiAoQkxPQ0tfU0laRSAhPSB3cml0ZShJTiwgc3VwZXJfYmxvY2tfYnVmZmVyLCBCTE9DS19TSVpFKSkKCQlkaWUoInVuYWJsZSB0byB3cml0ZSBzdXBlci1ibG9jayIpOwoKCXJldHVybjsKfQoKc3RhdGljIHZvaWQgd3JpdGVfdGFibGVzKHZvaWQpCnsKCXdyaXRlX3N1cGVyX2Jsb2NrKCk7CgoJaWYgKElNQVBTICogQkxPQ0tfU0laRSAhPSB3cml0ZShJTiwgaW5vZGVfbWFwLCBJTUFQUyAqIEJMT0NLX1NJWkUpKQoJCWRpZSgiVW5hYmxlIHRvIHdyaXRlIGlub2RlIG1hcCIpOwoJaWYgKFpNQVBTICogQkxPQ0tfU0laRSAhPSB3cml0ZShJTiwgem9uZV9tYXAsIFpNQVBTICogQkxPQ0tfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gd3JpdGUgem9uZSBtYXAiKTsKCWlmIChJTk9ERV9CVUZGRVJfU0laRSAhPSB3cml0ZShJTiwgaW5vZGVfYnVmZmVyLCBJTk9ERV9CVUZGRVJfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gd3JpdGUgaW5vZGVzIik7Cn0KCnN0YXRpYyB2b2lkIGdldF9kaXJzaXplKHZvaWQpCnsKCWludCBibG9jazsKCWNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJaW50IHNpemU7CgojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKCWlmICh2ZXJzaW9uMikKCQlibG9jayA9IElub2RlMltST09UX0lOT10uaV96b25lWzBdOwoJZWxzZQojZW5kaWYKCQlibG9jayA9IElub2RlW1JPT1RfSU5PXS5pX3pvbmVbMF07CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChzaXplID0gMTY7IHNpemUgPCBCTE9DS19TSVpFOyBzaXplIDw8PSAxKSB7CgkJaWYgKHN0cmNtcChibGsgKyBzaXplICsgMiwgIi4uIikgPT0gMCkgewoJCQlkaXJzaXplID0gc2l6ZTsKCQkJbmFtZWxlbiA9IHNpemUgLSAyOwoJCQlyZXR1cm47CgkJfQoJfQoJLyogdXNlIGRlZmF1bHRzICovCn0KCnN0YXRpYyB2b2lkIHJlYWRfc3VwZXJibG9jayh2b2lkKQp7CglpZiAoQkxPQ0tfU0laRSAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSwgU0VFS19TRVQpKQoJCWRpZSgic2VlayBmYWlsZWQiKTsKCWlmIChCTE9DS19TSVpFICE9IHJlYWQoSU4sIHN1cGVyX2Jsb2NrX2J1ZmZlciwgQkxPQ0tfU0laRSkpCgkJZGllKCJ1bmFibGUgdG8gcmVhZCBzdXBlciBibG9jayIpOwoJaWYgKE1BR0lDID09IE1JTklYX1NVUEVSX01BR0lDKSB7CgkJbmFtZWxlbiA9IDE0OwoJCWRpcnNpemUgPSAxNjsKCQl2ZXJzaW9uMiA9IDA7Cgl9IGVsc2UgaWYgKE1BR0lDID09IE1JTklYX1NVUEVSX01BR0lDMikgewoJCW5hbWVsZW4gPSAzMDsKCQlkaXJzaXplID0gMzI7CgkJdmVyc2lvbjIgPSAwOwojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKCX0gZWxzZSBpZiAoTUFHSUMgPT0gTUlOSVgyX1NVUEVSX01BR0lDKSB7CgkJbmFtZWxlbiA9IDE0OwoJCWRpcnNpemUgPSAxNjsKCQl2ZXJzaW9uMiA9IDE7Cgl9IGVsc2UgaWYgKE1BR0lDID09IE1JTklYMl9TVVBFUl9NQUdJQzIpIHsKCQluYW1lbGVuID0gMzA7CgkJZGlyc2l6ZSA9IDMyOwoJCXZlcnNpb24yID0gMTsKI2VuZGlmCgl9IGVsc2UKCQlkaWUoImJhZCBtYWdpYyBudW1iZXIgaW4gc3VwZXItYmxvY2siKTsKCWlmIChaT05FU0laRSAhPSAwIHx8IEJMT0NLX1NJWkUgIT0gMTAyNCkKCQlkaWUoIk9ubHkgMWsgYmxvY2tzL3pvbmVzIHN1cHBvcnRlZCIpOwoJaWYgKElNQVBTICogQkxPQ0tfU0laRSAqIDggPCBJTk9ERVMgKyAxKQoJCWRpZSgiYmFkIHNfaW1hcF9ibG9ja3MgZmllbGQgaW4gc3VwZXItYmxvY2siKTsKCWlmIChaTUFQUyAqIEJMT0NLX1NJWkUgKiA4IDwgWk9ORVMgLSBGSVJTVFpPTkUgKyAxKQoJCWRpZSgiYmFkIHNfem1hcF9ibG9ja3MgZmllbGQgaW4gc3VwZXItYmxvY2siKTsKfQoKc3RhdGljIHZvaWQgcmVhZF90YWJsZXModm9pZCkKewoJaW5vZGVfbWFwID0geG1hbGxvYyhJTUFQUyAqIEJMT0NLX1NJWkUpOwoJem9uZV9tYXAgPSB4bWFsbG9jKFpNQVBTICogQkxPQ0tfU0laRSk7CgltZW1zZXQoaW5vZGVfbWFwLCAwLCBzaXplb2YoaW5vZGVfbWFwKSk7CgltZW1zZXQoem9uZV9tYXAsIDAsIHNpemVvZih6b25lX21hcCkpOwoJaW5vZGVfYnVmZmVyID0geG1hbGxvYyhJTk9ERV9CVUZGRVJfU0laRSk7Cglpbm9kZV9jb3VudCA9IHhtYWxsb2MoSU5PREVTICsgMSk7Cgl6b25lX2NvdW50ID0geG1hbGxvYyhaT05FUyk7CglpZiAoSU1BUFMgKiBCTE9DS19TSVpFICE9IHJlYWQoSU4sIGlub2RlX21hcCwgSU1BUFMgKiBCTE9DS19TSVpFKSkKCQlkaWUoIlVuYWJsZSB0byByZWFkIGlub2RlIG1hcCIpOwoJaWYgKFpNQVBTICogQkxPQ0tfU0laRSAhPSByZWFkKElOLCB6b25lX21hcCwgWk1BUFMgKiBCTE9DS19TSVpFKSkKCQlkaWUoIlVuYWJsZSB0byByZWFkIHpvbmUgbWFwIik7CglpZiAoSU5PREVfQlVGRkVSX1NJWkUgIT0gcmVhZChJTiwgaW5vZGVfYnVmZmVyLCBJTk9ERV9CVUZGRVJfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gcmVhZCBpbm9kZXMiKTsKCWlmIChOT1JNX0ZJUlNUWk9ORSAhPSBGSVJTVFpPTkUpIHsKCQlwcmludGYoIldhcm5pbmc6IEZpcnN0em9uZSAhPSBOb3JtX2ZpcnN0em9uZVxuIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCWdldF9kaXJzaXplKCk7CglpZiAoc2hvdykgewoJCXByaW50ZigiJWxkIGlub2Rlc1xuIiwgSU5PREVTKTsKCQlwcmludGYoIiVsZCBibG9ja3NcbiIsIFpPTkVTKTsKCQlwcmludGYoIkZpcnN0ZGF0YXpvbmU9JWxkICglbGQpXG4iLCBGSVJTVFpPTkUsIE5PUk1fRklSU1RaT05FKTsKCQlwcmludGYoIlpvbmVzaXplPSVkXG4iLCBCTE9DS19TSVpFIDw8IFpPTkVTSVpFKTsKCQlwcmludGYoIk1heHNpemU9JWxkXG4iLCBNQVhTSVpFKTsKCQlwcmludGYoIkZpbGVzeXN0ZW0gc3RhdGU9JWRcbiIsIFN1cGVyLnNfc3RhdGUpOwoJCXByaW50ZigibmFtZWxlbj0lZFxuXG4iLCBuYW1lbGVuKTsKCX0KfQoKc3RydWN0IG1pbml4X2lub2RlICpnZXRfaW5vZGUodW5zaWduZWQgaW50IG5yKQp7CglzdHJ1Y3QgbWluaXhfaW5vZGUgKmlub2RlOwoKCWlmICghbnIgfHwgbnIgPiBJTk9ERVMpCgkJcmV0dXJuIE5VTEw7Cgl0b3RhbCsrOwoJaW5vZGUgPSBJbm9kZSArIG5yOwoJaWYgKCFpbm9kZV9jb3VudFtucl0pIHsKCQlpZiAoIWlub2RlX2luX3VzZShucikpIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCBtYXJrZWQgbm90IHVzZWQsIGJ1dCB1c2VkIGZvciBmaWxlICciLCBucik7CgkJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCQlwcmludGYoIidcbiIpOwoJCQlpZiAocmVwYWlyKSB7CgkJCQlpZiAoYXNrKCJNYXJrIGluIHVzZSIsIDEpKQoJCQkJCW1hcmtfaW5vZGUobnIpOwoJCQl9IGVsc2UgewoJCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQkJfQoJCX0KCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQkJZGlyZWN0b3J5Kys7CgkJZWxzZSBpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKCQkJcmVndWxhcisrOwoJCWVsc2UgaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkpCgkJCWNoYXJkZXYrKzsKCQllbHNlIGlmIChTX0lTQkxLKGlub2RlLT5pX21vZGUpKQoJCQlibG9ja2RldisrOwoJCWVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCgkJCXN5bWxpbmtzKys7CgkJZWxzZSBpZiAoU19JU1NPQ0soaW5vZGUtPmlfbW9kZSkpOwoJCWVsc2UgaWYgKFNfSVNGSUZPKGlub2RlLT5pX21vZGUpKTsKCQllbHNlIHsKCQkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJCXByaW50ZigiIGhhcyBtb2RlICUwNW9cbiIsIGlub2RlLT5pX21vZGUpOwoJCX0KCgl9IGVsc2UKCQlsaW5rcysrOwoJaWYgKCErK2lub2RlX2NvdW50W25yXSkgewoJCXByaW50ZigiV2FybmluZzogaW5vZGUgY291bnQgdG9vIGJpZy5cbiIpOwoJCWlub2RlX2NvdW50W25yXS0tOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9CglyZXR1cm4gaW5vZGU7Cn0KCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdHJ1Y3QgbWluaXgyX2lub2RlICpnZXRfaW5vZGUyKHVuc2lnbmVkIGludCBucikKewoJc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGU7CgoJaWYgKCFuciB8fCBuciA+IElOT0RFUykKCQlyZXR1cm4gTlVMTDsKCXRvdGFsKys7Cglpbm9kZSA9IElub2RlMiArIG5yOwoJaWYgKCFpbm9kZV9jb3VudFtucl0pIHsKCQlpZiAoIWlub2RlX2luX3VzZShucikpIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCBtYXJrZWQgbm90IHVzZWQsIGJ1dCB1c2VkIGZvciBmaWxlICciLCBucik7CgkJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCQlwcmludGYoIidcbiIpOwoJCQlpZiAocmVwYWlyKSB7CgkJCQlpZiAoYXNrKCJNYXJrIGluIHVzZSIsIDEpKQoJCQkJCW1hcmtfaW5vZGUobnIpOwoJCQkJZWxzZQoJCQkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJCX0KCQl9CgkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJCWRpcmVjdG9yeSsrOwoJCWVsc2UgaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCgkJCXJlZ3VsYXIrKzsKCQllbHNlIGlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpKQoJCQljaGFyZGV2Kys7CgkJZWxzZSBpZiAoU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKCQkJYmxvY2tkZXYrKzsKCQllbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQoJCQlzeW1saW5rcysrOwoJCWVsc2UgaWYgKFNfSVNTT0NLKGlub2RlLT5pX21vZGUpKTsKCQllbHNlIGlmIChTX0lTRklGTyhpbm9kZS0+aV9tb2RlKSk7CgkJZWxzZSB7CgkJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCQlwcmludGYoIiBoYXMgbW9kZSAlMDVvXG4iLCBpbm9kZS0+aV9tb2RlKTsKCQl9Cgl9IGVsc2UKCQlsaW5rcysrOwoJaWYgKCErK2lub2RlX2NvdW50W25yXSkgewoJCXByaW50ZigiV2FybmluZzogaW5vZGUgY291bnQgdG9vIGJpZy5cbiIpOwoJCWlub2RlX2NvdW50W25yXS0tOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9CglyZXR1cm4gaW5vZGU7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBjaGVja19yb290KHZvaWQpCnsKCXN0cnVjdCBtaW5peF9pbm9kZSAqaW5vZGUgPSBJbm9kZSArIFJPT1RfSU5POwoKCWlmICghaW5vZGUgfHwgIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJZGllKCJyb290IGlub2RlIGlzbid0IGEgZGlyZWN0b3J5Iik7Cn0KCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBjaGVja19yb290Mih2b2lkKQp7CglzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZSA9IElub2RlMiArIFJPT1RfSU5POwoKCWlmICghaW5vZGUgfHwgIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJZGllKCJyb290IGlub2RlIGlzbid0IGEgZGlyZWN0b3J5Iik7Cn0KI2VuZGlmCgpzdGF0aWMgaW50IGFkZF96b25lKHVuc2lnbmVkIHNob3J0ICp6bnIsIGludCAqY29ycmVjdGVkKQp7CglpbnQgcmVzdWx0OwoJaW50IGJsb2NrOwoKCXJlc3VsdCA9IDA7CglibG9jayA9IGNoZWNrX3pvbmVfbnIoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm4gMDsKCWlmICh6b25lX2NvdW50W2Jsb2NrXSkgewoJCXByaW50ZigiQmxvY2sgaGFzIGJlZW4gdXNlZCBiZWZvcmUuIE5vdyBpbiBmaWxlIGAiKTsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIicuIik7CgkJaWYgKGFzaygiQ2xlYXIiLCAxKSkgewoJCQkqem5yID0gMDsKCQkJYmxvY2sgPSAwOwoJCQkqY29ycmVjdGVkID0gMTsKCQl9Cgl9CglpZiAoIWJsb2NrKQoJCXJldHVybiAwOwoJaWYgKCF6b25lX2luX3VzZShibG9jaykpIHsKCQlwcmludGYoIkJsb2NrICVkIGluIGZpbGUgYCIsIGJsb2NrKTsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIicgaXMgbWFya2VkIG5vdCBpbiB1c2UuIik7CgkJaWYgKGFzaygiQ29ycmVjdCIsIDEpKQoJCQltYXJrX3pvbmUoYmxvY2spOwoJfQoJaWYgKCErK3pvbmVfY291bnRbYmxvY2tdKQoJCXpvbmVfY291bnRbYmxvY2tdLS07CglyZXR1cm4gYmxvY2s7Cn0KCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdGF0aWMgaW50IGFkZF96b25lMih1bnNpZ25lZCBpbnQgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCWludCByZXN1bHQ7CglpbnQgYmxvY2s7CgoJcmVzdWx0ID0gMDsKCWJsb2NrID0gY2hlY2tfem9uZV9ucjIoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm4gMDsKCWlmICh6b25lX2NvdW50W2Jsb2NrXSkgewoJCXByaW50ZigiQmxvY2sgaGFzIGJlZW4gdXNlZCBiZWZvcmUuIE5vdyBpbiBmaWxlIGAiKTsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIicuIik7CgkJaWYgKGFzaygiQ2xlYXIiLCAxKSkgewoJCQkqem5yID0gMDsKCQkJYmxvY2sgPSAwOwoJCQkqY29ycmVjdGVkID0gMTsKCQl9Cgl9CglpZiAoIWJsb2NrKQoJCXJldHVybiAwOwoJaWYgKCF6b25lX2luX3VzZShibG9jaykpIHsKCQlwcmludGYoIkJsb2NrICVkIGluIGZpbGUgYCIsIGJsb2NrKTsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIicgaXMgbWFya2VkIG5vdCBpbiB1c2UuIik7CgkJaWYgKGFzaygiQ29ycmVjdCIsIDEpKQoJCQltYXJrX3pvbmUoYmxvY2spOwoJfQoJaWYgKCErK3pvbmVfY291bnRbYmxvY2tdKQoJCXpvbmVfY291bnRbYmxvY2tdLS07CglyZXR1cm4gYmxvY2s7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBhZGRfem9uZV9pbmQodW5zaWduZWQgc2hvcnQgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBpLCBjaGdfYmxrID0gMDsKCWludCBibG9jazsKCglibG9jayA9IGFkZF96b25lKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCWZvciAoaSA9IDA7IGkgPCAoQkxPQ0tfU0laRSA+PiAxKTsgaSsrKQoJCWFkZF96b25lKGkgKyAodW5zaWduZWQgc2hvcnQgKikgYmxrLCAmY2hnX2Jsayk7CglpZiAoY2hnX2JsaykKCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKfQoKI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGFkZF96b25lX2luZDIodW5zaWduZWQgaW50ICp6bnIsIGludCAqY29ycmVjdGVkKQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglpbnQgaSwgY2hnX2JsayA9IDA7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBhZGRfem9uZTIoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChpID0gMDsgaSA8IEJMT0NLX1NJWkUgPj4gMjsgaSsrKQoJCWFkZF96b25lMihpICsgKHVuc2lnbmVkIGludCAqKSBibGssICZjaGdfYmxrKTsKCWlmIChjaGdfYmxrKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgYWRkX3pvbmVfZGluZCh1bnNpZ25lZCBzaG9ydCAqem5yLCBpbnQgKmNvcnJlY3RlZCkKewoJc3RhdGljIGNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJaW50IGksIGJsa19jaGcgPSAwOwoJaW50IGJsb2NrOwoKCWJsb2NrID0gYWRkX3pvbmUoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChpID0gMDsgaSA8IChCTE9DS19TSVpFID4+IDEpOyBpKyspCgkJYWRkX3pvbmVfaW5kKGkgKyAodW5zaWduZWQgc2hvcnQgKikgYmxrLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKfQoKI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGFkZF96b25lX2RpbmQyKHVuc2lnbmVkIGludCAqem5yLCBpbnQgKmNvcnJlY3RlZCkKewoJc3RhdGljIGNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJaW50IGksIGJsa19jaGcgPSAwOwoJaW50IGJsb2NrOwoKCWJsb2NrID0gYWRkX3pvbmUyKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCWZvciAoaSA9IDA7IGkgPCBCTE9DS19TSVpFID4+IDI7IGkrKykKCQlhZGRfem9uZV9pbmQyKGkgKyAodW5zaWduZWQgaW50ICopIGJsaywgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7Cn0KCnN0YXRpYyB2b2lkIGFkZF96b25lX3RpbmQyKHVuc2lnbmVkIGludCAqem5yLCBpbnQgKmNvcnJlY3RlZCkKewoJc3RhdGljIGNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJaW50IGksIGJsa19jaGcgPSAwOwoJaW50IGJsb2NrOwoKCWJsb2NrID0gYWRkX3pvbmUyKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCWZvciAoaSA9IDA7IGkgPCBCTE9DS19TSVpFID4+IDI7IGkrKykKCQlhZGRfem9uZV9kaW5kMihpICsgKHVuc2lnbmVkIGludCAqKSBibGssICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgY2hlY2tfem9uZXModW5zaWduZWQgaW50IGkpCnsKCXN0cnVjdCBtaW5peF9pbm9kZSAqaW5vZGU7CgoJaWYgKCFpIHx8IGkgPiBJTk9ERVMpCgkJcmV0dXJuOwoJaWYgKGlub2RlX2NvdW50W2ldID4gMSkJCS8qIGhhdmUgd2UgY291bnRlZCB0aGlzIGZpbGUgYWxyZWFkeT8gKi8KCQlyZXR1cm47Cglpbm9kZSA9IElub2RlICsgaTsKCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiAhU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJgoJCSFTX0lTTE5LKGlub2RlLT5pX21vZGUpKSByZXR1cm47Cglmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQoJCWFkZF96b25lKGkgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CglhZGRfem9uZV9pbmQoNyArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKCWFkZF96b25lX2RpbmQoOCArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKfQoKI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGNoZWNrX3pvbmVzMih1bnNpZ25lZCBpbnQgaSkKewoJc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGU7CgoJaWYgKCFpIHx8IGkgPiBJTk9ERVMpCgkJcmV0dXJuOwoJaWYgKGlub2RlX2NvdW50W2ldID4gMSkJCS8qIGhhdmUgd2UgY291bnRlZCB0aGlzIGZpbGUgYWxyZWFkeT8gKi8KCQlyZXR1cm47Cglpbm9kZSA9IElub2RlMiArIGk7CglpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkKCQkmJiAhU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKCQlyZXR1cm47Cglmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQoJCWFkZF96b25lMihpICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfaW5kMig3ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfZGluZDIoOCArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKCWFkZF96b25lX3RpbmQyKDkgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBjaGVja19maWxlKHN0cnVjdCBtaW5peF9pbm9kZSAqZGlyLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglzdHJ1Y3QgbWluaXhfaW5vZGUgKmlub2RlOwoJaW50IGlubzsKCWNoYXIgKm5hbWU7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBtYXBfYmxvY2soZGlyLCBvZmZzZXQgLyBCTE9DS19TSVpFKTsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7CgluYW1lID0gYmxrICsgKG9mZnNldCAlIEJMT0NLX1NJWkUpICsgMjsKCWlubyA9ICoodW5zaWduZWQgc2hvcnQgKikgKG5hbWUgLSAyKTsKCWlmIChpbm8gPiBJTk9ERVMpIHsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIiBjb250YWlucyBhIGJhZCBpbm9kZSBudW1iZXIgZm9yIGZpbGUgJyIpOwoJCXByaW50ZigiJS4qcycuIiwgbmFtZWxlbiwgbmFtZSk7CgkJaWYgKGFzaygiIFJlbW92ZSIsIDEpKSB7CgkJCSoodW5zaWduZWQgc2hvcnQgKikgKG5hbWUgLSAyKSA9IDA7CgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwoJCX0KCQlpbm8gPSAwOwoJfQoJaWYgKG5hbWVfZGVwdGggPCBNQVhfREVQVEgpCgkJc3RybmNweShuYW1lX2xpc3RbbmFtZV9kZXB0aF0sIG5hbWUsIG5hbWVsZW4pOwoJbmFtZV9kZXB0aCsrOwoJaW5vZGUgPSBnZXRfaW5vZGUoaW5vKTsKCW5hbWVfZGVwdGgtLTsKCWlmICghb2Zmc2V0KSB7CgkJaWYgKCFpbm9kZSB8fCBzdHJjbXAoIi4iLCBuYW1lKSkgewoJCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQkJcHJpbnRmKCI6IGJhZCBkaXJlY3Rvcnk6ICcuJyBpc24ndCBmaXJzdFxuIik7CgkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJfSBlbHNlCgkJCXJldHVybjsKCX0KCWlmIChvZmZzZXQgPT0gZGlyc2l6ZSkgewoJCWlmICghaW5vZGUgfHwgc3RyY21wKCIuLiIsIG5hbWUpKSB7CgkJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCQlwcmludGYoIjogYmFkIGRpcmVjdG9yeTogJy4uJyBpc24ndCBzZWNvbmRcbiIpOwoJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCX0gZWxzZQoJCQlyZXR1cm47Cgl9CglpZiAoIWlub2RlKQoJCXJldHVybjsKCWlmIChuYW1lX2RlcHRoIDwgTUFYX0RFUFRIKQoJCXN0cm5jcHkobmFtZV9saXN0W25hbWVfZGVwdGhdLCBuYW1lLCBuYW1lbGVuKTsKCW5hbWVfZGVwdGgrKzsKCWlmIChsaXN0KSB7CgkJaWYgKHZlcmJvc2UpCgkJCXByaW50ZigiJTZkICUwN28gJTNkICIsIGlubywgaW5vZGUtPmlfbW9kZSwgaW5vZGUtPmlfbmxpbmtzKTsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQkJcHJpbnRmKCI6XG4iKTsKCQllbHNlCgkJCXByaW50ZigiXG4iKTsKCX0KCWNoZWNrX3pvbmVzKGlubyk7CglpZiAoaW5vZGUgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQlyZWN1cnNpdmVfY2hlY2soaW5vKTsKCW5hbWVfZGVwdGgtLTsKCXJldHVybjsKfQoKI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGNoZWNrX2ZpbGUyKHN0cnVjdCBtaW5peDJfaW5vZGUgKmRpciwgdW5zaWduZWQgaW50IG9mZnNldCkKewoJc3RhdGljIGNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGU7CglpbnQgaW5vOwoJY2hhciAqbmFtZTsKCWludCBibG9jazsKCglibG9jayA9IG1hcF9ibG9jazIoZGlyLCBvZmZzZXQgLyBCTE9DS19TSVpFKTsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7CgluYW1lID0gYmxrICsgKG9mZnNldCAlIEJMT0NLX1NJWkUpICsgMjsKCWlubyA9ICoodW5zaWduZWQgc2hvcnQgKikgKG5hbWUgLSAyKTsKCWlmIChpbm8gPiBJTk9ERVMpIHsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIiBjb250YWlucyBhIGJhZCBpbm9kZSBudW1iZXIgZm9yIGZpbGUgJyIpOwoJCXByaW50ZigiJS4qcycuIiwgbmFtZWxlbiwgbmFtZSk7CgkJaWYgKGFzaygiIFJlbW92ZSIsIDEpKSB7CgkJCSoodW5zaWduZWQgc2hvcnQgKikgKG5hbWUgLSAyKSA9IDA7CgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwoJCX0KCQlpbm8gPSAwOwoJfQoJaWYgKG5hbWVfZGVwdGggPCBNQVhfREVQVEgpCgkJc3RybmNweShuYW1lX2xpc3RbbmFtZV9kZXB0aF0sIG5hbWUsIG5hbWVsZW4pOwoJbmFtZV9kZXB0aCsrOwoJaW5vZGUgPSBnZXRfaW5vZGUyKGlubyk7CgluYW1lX2RlcHRoLS07CglpZiAoIW9mZnNldCkgewoJCWlmICghaW5vZGUgfHwgc3RyY21wKCIuIiwgbmFtZSkpIHsKCQkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJCXByaW50ZigiOiBiYWQgZGlyZWN0b3J5OiAnLicgaXNuJ3QgZmlyc3RcbiIpOwoJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCX0gZWxzZQoJCQlyZXR1cm47Cgl9CglpZiAob2Zmc2V0ID09IGRpcnNpemUpIHsKCQlpZiAoIWlub2RlIHx8IHN0cmNtcCgiLi4iLCBuYW1lKSkgewoJCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQkJcHJpbnRmKCI6IGJhZCBkaXJlY3Rvcnk6ICcuLicgaXNuJ3Qgc2Vjb25kXG4iKTsKCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQl9IGVsc2UKCQkJcmV0dXJuOwoJfQoJaWYgKCFpbm9kZSkKCQlyZXR1cm47CgluYW1lX2RlcHRoKys7CglpZiAobGlzdCkgewoJCWlmICh2ZXJib3NlKQoJCQlwcmludGYoIiU2ZCAlMDdvICUzZCAiLCBpbm8sIGlub2RlLT5pX21vZGUsIGlub2RlLT5pX25saW5rcyk7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJCXByaW50ZigiOlxuIik7CgkJZWxzZQoJCQlwcmludGYoIlxuIik7Cgl9CgljaGVja196b25lczIoaW5vKTsKCWlmIChpbm9kZSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCXJlY3Vyc2l2ZV9jaGVjazIoaW5vKTsKCW5hbWVfZGVwdGgtLTsKCXJldHVybjsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjayh1bnNpZ25lZCBpbnQgaW5vKQp7CglzdHJ1Y3QgbWluaXhfaW5vZGUgKmRpcjsKCXVuc2lnbmVkIGludCBvZmZzZXQ7CgoJZGlyID0gSW5vZGUgKyBpbm87CglpZiAoIVNfSVNESVIoZGlyLT5pX21vZGUpKQoJCWRpZSgiaW50ZXJuYWwgZXJyb3IiKTsKCWlmIChkaXItPmlfc2l6ZSA8IDIgKiBkaXJzaXplKSB7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCI6IGJhZCBkaXJlY3Rvcnk6IHNpemU8MzIiKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBkaXItPmlfc2l6ZTsgb2Zmc2V0ICs9IGRpcnNpemUpCgkJY2hlY2tfZmlsZShkaXIsIG9mZnNldCk7Cn0KCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCByZWN1cnNpdmVfY2hlY2syKHVuc2lnbmVkIGludCBpbm8pCnsKCXN0cnVjdCBtaW5peDJfaW5vZGUgKmRpcjsKCXVuc2lnbmVkIGludCBvZmZzZXQ7CgoJZGlyID0gSW5vZGUyICsgaW5vOwoJaWYgKCFTX0lTRElSKGRpci0+aV9tb2RlKSkKCQlkaWUoImludGVybmFsIGVycm9yIik7CglpZiAoZGlyLT5pX3NpemUgPCAyICogZGlyc2l6ZSkgewoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiOiBiYWQgZGlyZWN0b3J5OiBzaXplIDwgMzIiKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBkaXItPmlfc2l6ZTsgb2Zmc2V0ICs9IGRpcnNpemUpCgkJY2hlY2tfZmlsZTIoZGlyLCBvZmZzZXQpOwp9CiNlbmRpZgoKc3RhdGljIGludCBiYWRfem9uZShpbnQgaSkKewoJY2hhciBidWZmZXJbMTAyNF07CgoJaWYgKEJMT0NLX1NJWkUgKiBpICE9IGxzZWVrKElOLCBCTE9DS19TSVpFICogaSwgU0VFS19TRVQpKQoJCWRpZSgic2VlayBmYWlsZWQgaW4gYmFkX3pvbmUiKTsKCXJldHVybiAoQkxPQ0tfU0laRSAhPSByZWFkKElOLCBidWZmZXIsIEJMT0NLX1NJWkUpKTsKfQoKc3RhdGljIHZvaWQgY2hlY2tfY291bnRzKHZvaWQpCnsKCWludCBpOwoKCWZvciAoaSA9IDE7IGkgPD0gSU5PREVTOyBpKyspIHsKCQlpZiAoIWlub2RlX2luX3VzZShpKSAmJiBJbm9kZVtpXS5pX21vZGUgJiYgd2Fybl9tb2RlKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgbW9kZSBub3QgY2xlYXJlZC4iLCBpKTsKCQkJaWYgKGFzaygiQ2xlYXIiLCAxKSkgewoJCQkJSW5vZGVbaV0uaV9tb2RlID0gMDsKCQkJCWNoYW5nZWQgPSAxOwoJCQl9CgkJfQoJCWlmICghaW5vZGVfY291bnRbaV0pIHsKCQkJaWYgKCFpbm9kZV9pbl91c2UoaSkpCgkJCQljb250aW51ZTsKCQkJcHJpbnRmKCJJbm9kZSAlZCBub3QgdXNlZCwgbWFya2VkIHVzZWQgaW4gdGhlIGJpdG1hcC4iLCBpKTsKCQkJaWYgKGFzaygiQ2xlYXIiLCAxKSkKCQkJCXVubWFya19pbm9kZShpKTsKCQkJY29udGludWU7CgkJfQoJCWlmICghaW5vZGVfaW5fdXNlKGkpKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgdXNlZCwgbWFya2VkIHVudXNlZCBpbiB0aGUgYml0bWFwLiIsIGkpOwoJCQlpZiAoYXNrKCJTZXQiLCAxKSkKCQkJCW1hcmtfaW5vZGUoaSk7CgkJfQoJCWlmIChJbm9kZVtpXS5pX25saW5rcyAhPSBpbm9kZV9jb3VudFtpXSkgewoJCQlwcmludGYoIklub2RlICVkIChtb2RlID0gJTA3byksIGlfbmxpbmtzPSVkLCBjb3VudGVkPSVkLiIsCgkJCQkgICBpLCBJbm9kZVtpXS5pX21vZGUsIElub2RlW2ldLmlfbmxpbmtzLCBpbm9kZV9jb3VudFtpXSk7CgkJCWlmIChhc2soIlNldCBpX25saW5rcyB0byBjb3VudCIsIDEpKSB7CgkJCQlJbm9kZVtpXS5pX25saW5rcyA9IGlub2RlX2NvdW50W2ldOwoJCQkJY2hhbmdlZCA9IDE7CgkJCX0KCQl9Cgl9Cglmb3IgKGkgPSBGSVJTVFpPTkU7IGkgPCBaT05FUzsgaSsrKSB7CgkJaWYgKHpvbmVfaW5fdXNlKGkpID09IHpvbmVfY291bnRbaV0pCgkJCWNvbnRpbnVlOwoJCWlmICghem9uZV9jb3VudFtpXSkgewoJCQlpZiAoYmFkX3pvbmUoaSkpCgkJCQljb250aW51ZTsKCQkJcHJpbnRmKCJab25lICVkOiBtYXJrZWQgaW4gdXNlLCBubyBmaWxlIHVzZXMgaXQuIiwgaSk7CgkJCWlmIChhc2soIlVubWFyayIsIDEpKQoJCQkJdW5tYXJrX3pvbmUoaSk7CgkJCWNvbnRpbnVlOwoJCX0KCQlwcmludGYoIlpvbmUgJWQ6ICVzaW4gdXNlLCBjb3VudGVkPSVkXG4iLAoJCQkgICBpLCB6b25lX2luX3VzZShpKSA/ICIiIDogIm5vdCAiLCB6b25lX2NvdW50W2ldKTsKCX0KfQoKI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGNoZWNrX2NvdW50czIodm9pZCkKewoJaW50IGk7CgoJZm9yIChpID0gMTsgaSA8PSBJTk9ERVM7IGkrKykgewoJCWlmICghaW5vZGVfaW5fdXNlKGkpICYmIElub2RlMltpXS5pX21vZGUgJiYgd2Fybl9tb2RlKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgbW9kZSBub3QgY2xlYXJlZC4iLCBpKTsKCQkJaWYgKGFzaygiQ2xlYXIiLCAxKSkgewoJCQkJSW5vZGUyW2ldLmlfbW9kZSA9IDA7CgkJCQljaGFuZ2VkID0gMTsKCQkJfQoJCX0KCQlpZiAoIWlub2RlX2NvdW50W2ldKSB7CgkJCWlmICghaW5vZGVfaW5fdXNlKGkpKQoJCQkJY29udGludWU7CgkJCXByaW50ZigiSW5vZGUgJWQgbm90IHVzZWQsIG1hcmtlZCB1c2VkIGluIHRoZSBiaXRtYXAuIiwgaSk7CgkJCWlmIChhc2soIkNsZWFyIiwgMSkpCgkJCQl1bm1hcmtfaW5vZGUoaSk7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoIWlub2RlX2luX3VzZShpKSkgewoJCQlwcmludGYoIklub2RlICVkIHVzZWQsIG1hcmtlZCB1bnVzZWQgaW4gdGhlIGJpdG1hcC4iLCBpKTsKCQkJaWYgKGFzaygiU2V0IiwgMSkpCgkJCQltYXJrX2lub2RlKGkpOwoJCX0KCQlpZiAoSW5vZGUyW2ldLmlfbmxpbmtzICE9IGlub2RlX2NvdW50W2ldKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgKG1vZGUgPSAlMDdvKSwgaV9ubGlua3M9JWQsIGNvdW50ZWQ9JWQuIiwKCQkJCSAgIGksIElub2RlMltpXS5pX21vZGUsIElub2RlMltpXS5pX25saW5rcywKCQkJCSAgIGlub2RlX2NvdW50W2ldKTsKCQkJaWYgKGFzaygiU2V0IGlfbmxpbmtzIHRvIGNvdW50IiwgMSkpIHsKCQkJCUlub2RlMltpXS5pX25saW5rcyA9IGlub2RlX2NvdW50W2ldOwoJCQkJY2hhbmdlZCA9IDE7CgkJCX0KCQl9Cgl9Cglmb3IgKGkgPSBGSVJTVFpPTkU7IGkgPCBaT05FUzsgaSsrKSB7CgkJaWYgKHpvbmVfaW5fdXNlKGkpID09IHpvbmVfY291bnRbaV0pCgkJCWNvbnRpbnVlOwoJCWlmICghem9uZV9jb3VudFtpXSkgewoJCQlpZiAoYmFkX3pvbmUoaSkpCgkJCQljb250aW51ZTsKCQkJcHJpbnRmKCJab25lICVkOiBtYXJrZWQgaW4gdXNlLCBubyBmaWxlIHVzZXMgaXQuIiwgaSk7CgkJCWlmIChhc2soIlVubWFyayIsIDEpKQoJCQkJdW5tYXJrX3pvbmUoaSk7CgkJCWNvbnRpbnVlOwoJCX0KCQlwcmludGYoIlpvbmUgJWQ6ICVzaW4gdXNlLCBjb3VudGVkPSVkXG4iLAoJCQkgICBpLCB6b25lX2luX3VzZShpKSA/ICIiIDogIm5vdCAiLCB6b25lX2NvdW50W2ldKTsKCX0KfQojZW5kaWYKCnN0YXRpYyB2b2lkIGNoZWNrKHZvaWQpCnsKCW1lbXNldChpbm9kZV9jb3VudCwgMCwgKElOT0RFUyArIDEpICogc2l6ZW9mKCppbm9kZV9jb3VudCkpOwoJbWVtc2V0KHpvbmVfY291bnQsIDAsIFpPTkVTICogc2l6ZW9mKCp6b25lX2NvdW50KSk7CgljaGVja196b25lcyhST09UX0lOTyk7CglyZWN1cnNpdmVfY2hlY2soUk9PVF9JTk8pOwoJY2hlY2tfY291bnRzKCk7Cn0KCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBjaGVjazIodm9pZCkKewoJbWVtc2V0KGlub2RlX2NvdW50LCAwLCAoSU5PREVTICsgMSkgKiBzaXplb2YoKmlub2RlX2NvdW50KSk7CgltZW1zZXQoem9uZV9jb3VudCwgMCwgWk9ORVMgKiBzaXplb2YoKnpvbmVfY291bnQpKTsKCWNoZWNrX3pvbmVzMihST09UX0lOTyk7CglyZWN1cnNpdmVfY2hlY2syKFJPT1RfSU5PKTsKCWNoZWNrX2NvdW50czIoKTsKfQojZW5kaWYKCi8qIFdlZCBGZWIgIDkgMTU6MTc6MDYgTVNUIDIwMDAgKi8KLyogZHluYW1pY2FsbHkgYWxsb2NhdGUgbmFtZV9saXN0IChpbnN0ZWFkIG9mIG1ha2luZyBpdCBzdGF0aWMpICovCnN0YXRpYyB2b2lkIGFsbG9jX25hbWVfbGlzdCh2b2lkKQp7CglpbnQgaTsKCgluYW1lX2xpc3QgPSB4bWFsbG9jKHNpemVvZihjaGFyICopICogTUFYX0RFUFRIKTsKCWZvciAoaSA9IDA7IGkgPCBNQVhfREVQVEg7IGkrKykKCQluYW1lX2xpc3RbaV0gPSB4bWFsbG9jKHNpemVvZihjaGFyKSAqIEJVRlNJWiArIDEpOwp9CgojaWZkZWYgQkJfRkVBVFVSRV9DTEVBTl9VUAovKiBleGVjdXRlIHRoaXMgYXRleGl0KCkgdG8gZGVhbGxvY2F0ZSBuYW1lX2xpc3RbXSAqLwovKiBwaXB0aWdnZXIgd2FzIGhlcmUgKi8Kc3RhdGljIHZvaWQgZnJlZV9uYW1lX2xpc3Qodm9pZCkKewoJaW50IGk7CgoJaWYgKG5hbWVfbGlzdCkgeyAKCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0RFUFRIOyBpKyspIHsKCQkJaWYgKG5hbWVfbGlzdFtpXSkgewoJCQkJZnJlZShuYW1lX2xpc3RbaV0pOwoJCQl9CgkJfQoJCWZyZWUobmFtZV9saXN0KTsKCX0KfQojZW5kaWYKCmV4dGVybiBpbnQgZnNja19taW5peF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewoJc3RydWN0IHRlcm1pb3MgdG1wOwoJaW50IGNvdW50OwoJaW50IHJldGNvZGUgPSAwOwoKCWFsbG9jX25hbWVfbGlzdCgpOwojaWZkZWYgQkJfRkVBVFVSRV9DTEVBTl9VUAoJLyogRG9uJ3QgYm90aGVyIHRvIGZyZWUgbWVtb3J5LiAgRXhpdCBkb2VzCgkgKiB0aGF0IGF1dG9tYWdpY2FsbHksIHNvIHdlIGNhbiBzYXZlIGEgZmV3IGJ5dGVzICovCglhdGV4aXQoZnJlZV9uYW1lX2xpc3QpOwojZW5kaWYKCglpZiAoSU5PREVfU0laRSAqIE1JTklYX0lOT0RFU19QRVJfQkxPQ0sgIT0gQkxPQ0tfU0laRSkKCQlkaWUoImJhZCBpbm9kZSBzaXplIik7CiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgoJaWYgKElOT0RFX1NJWkUyICogTUlOSVgyX0lOT0RFU19QRVJfQkxPQ0sgIT0gQkxPQ0tfU0laRSkKCQlkaWUoImJhZCB2MiBpbm9kZSBzaXplIik7CiNlbmRpZgoJd2hpbGUgKGFyZ2MtLSA+IDEpIHsKCQlhcmd2Kys7CgkJaWYgKGFyZ3ZbMF1bMF0gIT0gJy0nKSB7CgkJCWlmIChkZXZpY2VfbmFtZSkKCQkJCXNob3dfdXNhZ2UoKTsKCQkJZWxzZQoJCQkJZGV2aWNlX25hbWUgPSBhcmd2WzBdOwoJCX0gZWxzZQoJCQl3aGlsZSAoKisrYXJndlswXSkKCQkJCXN3aXRjaCAoYXJndlswXVswXSkgewoJCQkJY2FzZSAnbCc6CgkJCQkJbGlzdCA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdhJzoKCQkJCQlhdXRvbWF0aWMgPSAxOwoJCQkJCXJlcGFpciA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdyJzoKCQkJCQlhdXRvbWF0aWMgPSAwOwoJCQkJCXJlcGFpciA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICd2JzoKCQkJCQl2ZXJib3NlID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3MnOgoJCQkJCXNob3cgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnbSc6CgkJCQkJd2Fybl9tb2RlID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ2YnOgoJCQkJCWZvcmNlID0gMTsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJc2hvd191c2FnZSgpOwoJCQkJfQoJfQoJaWYgKCFkZXZpY2VfbmFtZSkKCQlzaG93X3VzYWdlKCk7CgljaGVja19tb3VudCgpOwkJCQkvKiB0cnlpbmcgdG8gY2hlY2sgYSBtb3VudGVkIGZpbGVzeXN0ZW0/ICovCglpZiAocmVwYWlyICYmICFhdXRvbWF0aWMpIHsKCQlpZiAoIWlzYXR0eSgwKSB8fCAhaXNhdHR5KDEpKQoJCQlkaWUoIm5lZWQgdGVybWluYWwgZm9yIGludGVyYWN0aXZlIHJlcGFpcnMiKTsKCX0KCUlOID0gb3BlbihkZXZpY2VfbmFtZSwgcmVwYWlyID8gT19SRFdSIDogT19SRE9OTFkpOwoJaWYgKElOIDwgMCkKCQlkaWUoInVuYWJsZSB0byBvcGVuICclcyciKTsKCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDM7IGNvdW50KyspCgkJc3luYygpOwoJcmVhZF9zdXBlcmJsb2NrKCk7CgoJLyoKCSAqIERldGVybWluZSB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgY29udGludWUgd2l0aCB0aGUgY2hlY2tpbmcuCgkgKiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBzdGF0dXMgb2YgdGhlIGZpbGVzeXN0ZW0gdmFsaWQgYW5kIGVycm9yCgkgKiBmbGFncyBhbmQgd2hldGhlciBvciBub3QgdGhlIC1mIHN3aXRjaCB3YXMgc3BlY2lmaWVkIG9uIHRoZSAKCSAqIGNvbW1hbmQgbGluZS4KCSAqLwoJcHJpbnRmKCIlcywgJXNcbiIsIGFwcGxldF9uYW1lLCBwcm9ncmFtX3ZlcnNpb24pOwoJaWYgKCEoU3VwZXIuc19zdGF0ZSAmIE1JTklYX0VSUk9SX0ZTKSAmJgoJCShTdXBlci5zX3N0YXRlICYgTUlOSVhfVkFMSURfRlMpICYmICFmb3JjZSkgewoJCWlmIChyZXBhaXIpCgkJCXByaW50ZigiJXMgaXMgY2xlYW4sIG5vIGNoZWNrLlxuIiwgZGV2aWNlX25hbWUpOwoJCXJldHVybiByZXRjb2RlOwoJfSBlbHNlIGlmIChmb3JjZSkKCQlwcmludGYoIkZvcmNpbmcgZmlsZXN5c3RlbSBjaGVjayBvbiAlcy5cbiIsIGRldmljZV9uYW1lKTsKCWVsc2UgaWYgKHJlcGFpcikKCQlwcmludGYoIkZpbGVzeXN0ZW0gb24gJXMgaXMgZGlydHksIG5lZWRzIGNoZWNraW5nLlxuIiwKCQkJICAgZGV2aWNlX25hbWUpOwoKCXJlYWRfdGFibGVzKCk7CgoJaWYgKHJlcGFpciAmJiAhYXV0b21hdGljKSB7CgkJdGNnZXRhdHRyKDAsICZ0ZXJtaW9zKTsKCQl0bXAgPSB0ZXJtaW9zOwoJCXRtcC5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyk7CgkJdGNzZXRhdHRyKDAsIFRDU0FOT1csICZ0bXApOwoJCXRlcm1pb3Nfc2V0ID0gMTsKCX0KI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCglpZiAodmVyc2lvbjIpIHsKCQljaGVja19yb290MigpOwoJCWNoZWNrMigpOwoJfSBlbHNlCiNlbmRpZgoJewoJCWNoZWNrX3Jvb3QoKTsKCQljaGVjaygpOwoJfQoJaWYgKHZlcmJvc2UpIHsKCQlpbnQgaSwgZnJlZTsKCgkJZm9yIChpID0gMSwgZnJlZSA9IDA7IGkgPD0gSU5PREVTOyBpKyspCgkJCWlmICghaW5vZGVfaW5fdXNlKGkpKQoJCQkJZnJlZSsrOwoJCXByaW50ZigiXG4lNmxkIGlub2RlcyB1c2VkICglbGQlJSlcbiIsIChJTk9ERVMgLSBmcmVlKSwKCQkJICAgMTAwICogKElOT0RFUyAtIGZyZWUpIC8gSU5PREVTKTsKCQlmb3IgKGkgPSBGSVJTVFpPTkUsIGZyZWUgPSAwOyBpIDwgWk9ORVM7IGkrKykKCQkJaWYgKCF6b25lX2luX3VzZShpKSkKCQkJCWZyZWUrKzsKCQlwcmludGYoIiU2bGQgem9uZXMgdXNlZCAoJWxkJSUpXG4iLCAoWk9ORVMgLSBmcmVlKSwKCQkJICAgMTAwICogKFpPTkVTIC0gZnJlZSkgLyBaT05FUyk7CgkJcHJpbnRmKCJcbiU2ZCByZWd1bGFyIGZpbGVzXG4iCgkJCSAgICIlNmQgZGlyZWN0b3JpZXNcbiIKCQkJICAgIiU2ZCBjaGFyYWN0ZXIgZGV2aWNlIGZpbGVzXG4iCgkJCSAgICIlNmQgYmxvY2sgZGV2aWNlIGZpbGVzXG4iCgkJCSAgICIlNmQgbGlua3NcbiIKCQkJICAgIiU2ZCBzeW1ib2xpYyBsaW5rc1xuIgoJCQkgICAiLS0tLS0tXG4iCgkJCSAgICIlNmQgZmlsZXNcbiIsCgkJCSAgIHJlZ3VsYXIsIGRpcmVjdG9yeSwgY2hhcmRldiwgYmxvY2tkZXYsCgkJCSAgIGxpbmtzIC0gMiAqIGRpcmVjdG9yeSArIDEsIHN5bWxpbmtzLAoJCQkgICB0b3RhbCAtIDIgKiBkaXJlY3RvcnkgKyAxKTsKCX0KCWlmIChjaGFuZ2VkKSB7CgkJd3JpdGVfdGFibGVzKCk7CgkJcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCgkJCSAgICJGSUxFIFNZU1RFTSBIQVMgQkVFTiBDSEFOR0VEXG4iCgkJCSAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAzOyBjb3VudCsrKQoJCQlzeW5jKCk7Cgl9IGVsc2UgaWYgKHJlcGFpcikKCQl3cml0ZV9zdXBlcl9ibG9jaygpOwoKCWlmIChyZXBhaXIgJiYgIWF1dG9tYXRpYykKCQl0Y3NldGF0dHIoMCwgVENTQU5PVywgJnRlcm1pb3MpOwoKCWlmIChjaGFuZ2VkKQoJCXJldGNvZGUgKz0gMzsKCWlmIChlcnJvcnNfdW5jb3JyZWN0ZWQpCgkJcmV0Y29kZSArPSA0OwoJcmV0dXJuIHJldGNvZGU7Cn0K