Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIGZzY2suYyAtIGEgZmlsZSBzeXN0ZW0gY29uc2lzdGVuY3kgY2hlY2tlciBmb3IgTGludXguCiAqCiAqIChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzLiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQKICogYXMgcGVyIHRoZSBHTlUgY29weWxlZnQuCiAqLwoKLyoKICogMDkuMTEuOTEgIC0gIG1hZGUgdGhlIGZpcnN0IHJ1ZGltZXRhcnkgZnVuY3Rpb25zCiAqCiAqIDEwLjExLjkxICAtICB1cGRhdGVkLCBkb2VzIGNoZWNraW5nLCBubyByZXBhaXJzIHlldC4KICoJCVNlbnQgb3V0IHRvIHRoZSBtYWlsaW5nLWxpc3QgZm9yIHRlc3RpbmcuCiAqCiAqIDE0LjExLjkxICAtCVRlc3Rpbmcgc2VlbXMgdG8gaGF2ZSBnb25lIHdlbGwuIEFkZGVkIHNvbWUKICoJCWNvcnJlY3Rpb24tY29kZSwgYW5kIGNoYW5nZWQgc29tZSBmdW5jdGlvbnMuCiAqCiAqIDE1LjExLjkxICAtICBNb3JlIGNvcnJlY3Rpb24gY29kZS4gSG9wZWZ1bGx5IGl0IG5vdGljZXMgbW9zdAogKgkJY2FzZXMgbm93LCBhbmQgdHJpZXMgdG8gZG8gc29tZXRoaW5nIGFib3V0IHRoZW0uCiAqCiAqIDE2LjExLjkxICAtICBNb3JlIGNvcnJlY3Rpb25zICh0aGFua3MgdG8gTWlrYSBKYWxhdmEpLiBNb3N0CiAqCQl0aGluZ3Mgc2VlbSB0byB3b3JrIG5vdy4gWWVhaCwgc3VyZS4KICoKICoKICogMTkuMDQuOTIgIC0JSGFkIHRvIHN0YXJ0IG92ZXIgYWdhaW4gZnJvbSB0aGlzIG9sZCB2ZXJzaW9uLCBhcyBhCiAqCQlrZXJuZWwgYnVnIGF0ZSBteSBlbmhhbmNlZCBmc2NrIGluIGZlYnJ1YXJ5LgogKgogKiAyOC4wMi45MyAgLQlhZGRlZCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgZGlyZWN0b3J5IGVudHJ5IHNpemVzLi4KICoKICogU2F0IE1hciAgNiAxODo1OTo0MiAxOTkzLCBmYWl0aEBjcy51bmMuZWR1OiBPdXRwdXQgbmFtZWxlbiB3aXRoCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXItYmxvY2sgaW5mb3JtYXRpb24KICoKICogU2F0IE9jdCAgOSAxMToxNzoxMSAxOTkzLCBmYWl0aEBjcy51bmMuZWR1OiBtYWtlIGV4aXQgc3RhdHVzIGNvbmZvcm0KICogICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGF0IHJlcXVpcmVkIGJ5IGZzdXRpbAogKgogKiBNb24gSmFuICAzIDExOjA2OjUyIDE5OTQgLSBEci4gV2V0dHN0ZWluIChncmVnJXdpbmQudXVjcEBwbGFpbnMubm9kYWsuZWR1KQogKgkJCSAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGZpbGUgc3lzdGVtIHZhbGlkIGZsYWcuICBBbHNvCiAqCQkJICAgICAgYWRkZWQgcHJvZ3JhbV92ZXJzaW9uIHZhcmlhYmxlIGFuZCBvdXRwdXQgb2YKICoJCQkgICAgICBwcm9ncmFtIG5hbWUgYW5kIHZlcnNpb24gbnVtYmVyIHdoZW4gcHJvZ3JhbQogKgkJCSAgICAgIGlzIGV4ZWN1dGVkLgogKgogKiAzMC4xMC45NCAtIGFkZGVkIHN1cHBvcnQgZm9yIHYyIGZpbGVzeXN0ZW0KICogICAgICAgICAgICAoQW5kcmVhcyBTY2h3YWIsIHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZSkKICoKICogMTAuMTIuOTQgIC0gIGFkZGVkIHRlc3QgdG8gcHJldmVudCBjaGVja2luZyBvZiBtb3VudGVkIGZzIGFkYXB0ZWQKICogICAgICAgICAgICAgIGZyb20gVGhlb2RvcmUgVHMnbydzICh0eXRzb0BhdGhlbmEubWl0LmVkdSkgZTJmc2NrCiAqICAgICAgICAgICAgICBwcm9ncmFtLiAgKERhbmllbCBRdWlubGFuLCBxdWlubGFuQHlnZ2RyYXNpbC5jb20pCiAqCiAqIDAxLjA3Ljk2ICAtIEZpeGVkIHRoZSB2MiBmcyBzdHVmZiB0byB1c2UgdGhlIHJpZ2h0ICNkZWZpbmVzIGFuZCBzdWNoCiAqCSAgICAgICBmb3IgbW9kZXJuIGxpYmNzIChqYW5sQG1hdGgudWlvLm5vLCBOaWNvbGFpIExhbmdmZWxkdCkKICoKICogMDIuMDcuOTYgIC0gQWRkZWQgQyBiaXQgZmlkZGxpbmcgcm91dGluZXMgZnJvbSBybWtAZWNzLnNvdG9uLmFjLnVrIAogKiAgICAgICAgICAgICAoUnVzc2VsbCBLaW5nKS4gIEhlIG1hZGUgdGhlbSBmb3IgQVJNLiAgSXQgd291bGQgc2VlbQogKgkgICAgICAgdGhhdCB0aGUgQVJNIGlzIHBvd2VyZnVsIGVub3VnaCB0byBkbyB0aGlzIGluIEMgd2hlcmVhcwogKiAgICAgICAgICAgICBpMzg2IGFuZCBtNjRrIG11c3QgdXNlIGFzc2VtYmx5IHRvIGdldCBpdCBmYXN0ID46LSkKICoJICAgICAgIFRoaXMgc2hvdWxkIG1ha2UgbWluaXggZnNjayBzeXN0ZW1pbmRlcGVuZGVudC4KICoJICAgICAgIChqYW5sQG1hdGgudWlvLm5vLCBOaWNvbGFpIExhbmdmZWxkdCkKICoKICogMDQuMTEuOTYgIC0gQWRkZWQgbWlub3IgZml4ZXMgZnJvbSBBbmRyZWFzIFNjaHdhYiB0byBhdm9pZCBjb21waWxlcgogKiAgICAgICAgICAgICB3YXJuaW5ncy4gIEFkZGVkIG1jNjhrIGJpdG9wcyBmcm9tIAogKgkgICAgICAgSm9lcmcgRG9yY2hhaW4gPGRvcmNoYWluQG1waS1zYi5tcGcuZGU+LgogKgogKiAwNi4xMS45NiAgLSBBZGRlZCB2MiBjb2RlIHN1Ym1pdHRlZCBieSBKb2VyZyBEb3JjaGFpbiwgYnV0IHdyaXR0ZW4gYnkKICogICAgICAgICAgICAgQW5kcmVhcyBTY2h3YWIuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqCiAqIEkndmUgaGFkIG5vIHRpbWUgdG8gYWRkIGNvbW1lbnRzIC0gaG9wZWZ1bGx5IHRoZSBmdW5jdGlvbiBuYW1lcwogKiBhcmUgY29tbWVudHMgZW5vdWdoLiBBcyB3aXRoIGFsbCBmaWxlIHN5c3RlbSBjaGVja2VycywgdGhpcyBhc3N1bWVzCiAqIHRoZSBmaWxlIHN5c3RlbSBpcyBxdWllc2NlbnQgLSBkb24ndCB1c2UgaXQgb24gYSBtb3VudGVkIGRldmljZQogKiB1bmxlc3MgeW91IGNhbiBiZSBzdXJlIG5vYm9keSBpcyB3cml0aW5nIHRvIGl0IChhbmQgcmVtZW1iZXIgdGhhdCB0aGUKICoga2VybmVsIGNhbiB3cml0ZSB0byBpdCB3aGVuIGl0IHNlYXJjaGVzIGZvciBmaWxlcykuCiAqCiAqIFVzdWFnZTogZnNjayBbLWxhcnZzbV0gZGV2aWNlCiAqCS1sIGZvciBhIGxpc3Rpbmcgb2YgYWxsIHRoZSBmaWxlbmFtZXMKICoJLWEgZm9yIGF1dG9tYXRpYyByZXBhaXJzIChub3QgaW1wbGVtZW50ZWQpCiAqCS1yIGZvciByZXBhaXJzIChpbnRlcmFjdGl2ZSkgKG5vdCBpbXBsZW1lbnRlZCkKICoJLXYgZm9yIHZlcmJvc2UgKHRlbGxzIGhvdyBtYW55IGZpbGVzKQogKgktcyBmb3Igc3VwZXItYmxvY2sgaW5mbwogKgktbSBmb3IgbWluaXgtbGlrZSAibW9kZSBub3QgY2xlYXJlZCIgd2FybmluZ3MKICoJLWYgZm9yY2UgZmlsZXN5c3RlbSBjaGVjayBldmVuIGlmIGZpbGVzeXN0ZW0gbWFya2VkIGFzIHZhbGlkCiAqCiAqIFRoZSBkZXZpY2UgbWF5IGJlIGEgYmxvY2sgZGV2aWNlIG9yIGEgaW1hZ2Ugb2Ygb25lLCBidXQgdGhpcyBpc24ndAogKiBlbmZvcmNlZCAoYnV0IGl0J3Mgbm90IG11Y2ggZnVuIG9uIGEgY2hhcmFjdGVyIGRldmljZSA6LSkuIAogKi8KCiNpbmNsdWRlICJpbnRlcm5hbC5oIgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHRlcm1pb3MuaD4KI2luY2x1ZGUgPG1udGVudC5oPgojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CgogCiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdTg7CnR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdTE2Owp0eXBlZGVmIHVuc2lnbmVkIGludCB1MzI7CgoKI2RlZmluZSBNSU5JWF9ST09UX0lOTyAxCiNkZWZpbmUgTUlOSVhfTElOS19NQVgJMjUwCiNkZWZpbmUgTUlOSVgyX0xJTktfTUFYCTY1NTMwCgojZGVmaW5lIE1JTklYX0lfTUFQX1NMT1RTCTgKI2RlZmluZSBNSU5JWF9aX01BUF9TTE9UUwk2NAojZGVmaW5lIE1JTklYX1NVUEVSX01BR0lDCTB4MTM3RgkJLyogb3JpZ2luYWwgbWluaXggZnMgKi8KI2RlZmluZSBNSU5JWF9TVVBFUl9NQUdJQzIJMHgxMzhGCQkvKiBtaW5peCBmcywgMzAgY2hhciBuYW1lcyAqLwojZGVmaW5lIE1JTklYMl9TVVBFUl9NQUdJQwkweDI0NjgJCS8qIG1pbml4IFYyIGZzICovCiNkZWZpbmUgTUlOSVgyX1NVUEVSX01BR0lDMgkweDI0NzgJCS8qIG1pbml4IFYyIGZzLCAzMCBjaGFyIG5hbWVzICovCiNkZWZpbmUgTUlOSVhfVkFMSURfRlMJCTB4MDAwMQkJLyogQ2xlYW4gZnMuICovCiNkZWZpbmUgTUlOSVhfRVJST1JfRlMJCTB4MDAwMgkJLyogZnMgaGFzIGVycm9ycy4gKi8KCiNkZWZpbmUgTUlOSVhfSU5PREVTX1BFUl9CTE9DSyAoKEJMT0NLX1NJWkUpLyhzaXplb2YgKHN0cnVjdCBtaW5peF9pbm9kZSkpKQojZGVmaW5lIE1JTklYMl9JTk9ERVNfUEVSX0JMT0NLICgoQkxPQ0tfU0laRSkvKHNpemVvZiAoc3RydWN0IG1pbml4Ml9pbm9kZSkpKQoKI2RlZmluZSBNSU5JWF9WMQkJMHgwMDAxCQkvKiBvcmlnaW5hbCBtaW5peCBmcyAqLwojZGVmaW5lIE1JTklYX1YyCQkweDAwMDIJCS8qIG1pbml4IFYyIGZzICovCgojZGVmaW5lIElOT0RFX1ZFUlNJT04oaW5vZGUpCWlub2RlLT5pX3NiLT51Lm1pbml4X3NiLnNfdmVyc2lvbgoKLyoKICogVGhpcyBpcyB0aGUgb3JpZ2luYWwgbWluaXggaW5vZGUgbGF5b3V0IG9uIGRpc2suCiAqIE5vdGUgdGhlIDgtYml0IGdpZCBhbmQgYXRpbWUgYW5kIGN0aW1lLgogKi8Kc3RydWN0IG1pbml4X2lub2RlIHsKCXUxNiBpX21vZGU7Cgl1MTYgaV91aWQ7Cgl1MzIgaV9zaXplOwoJdTMyIGlfdGltZTsKCXU4ICBpX2dpZDsKCXU4ICBpX25saW5rczsKCXUxNiBpX3pvbmVbOV07Cn07CgovKgogKiBUaGUgbmV3IG1pbml4IGlub2RlIGhhcyBhbGwgdGhlIHRpbWUgZW50cmllcywgYXMgd2VsbCBhcwogKiBsb25nIGJsb2NrIG51bWJlcnMgYW5kIGEgdGhpcmQgaW5kaXJlY3QgYmxvY2sgKDcrMSsxKzEKICogaW5zdGVhZCBvZiA3KzErMSkuIEFsc28sIHNvbWUgcHJldmlvdXNseSA4LWJpdCB2YWx1ZXMgYXJlCiAqIG5vdyAxNi1iaXQuIFRoZSBpbm9kZSBpcyBub3cgNjQgYnl0ZXMgaW5zdGVhZCBvZiAzMi4KICovCnN0cnVjdCBtaW5peDJfaW5vZGUgewoJdTE2IGlfbW9kZTsKCXUxNiBpX25saW5rczsKCXUxNiBpX3VpZDsKCXUxNiBpX2dpZDsKCXUzMiBpX3NpemU7Cgl1MzIgaV9hdGltZTsKCXUzMiBpX210aW1lOwoJdTMyIGlfY3RpbWU7Cgl1MzIgaV96b25lWzEwXTsKfTsKCi8qCiAqIG1pbml4IHN1cGVyLWJsb2NrIGRhdGEgb24gZGlzawogKi8Kc3RydWN0IG1pbml4X3N1cGVyX2Jsb2NrIHsKCXUxNiBzX25pbm9kZXM7Cgl1MTYgc19uem9uZXM7Cgl1MTYgc19pbWFwX2Jsb2NrczsKCXUxNiBzX3ptYXBfYmxvY2tzOwoJdTE2IHNfZmlyc3RkYXRhem9uZTsKCXUxNiBzX2xvZ196b25lX3NpemU7Cgl1MzIgc19tYXhfc2l6ZTsKCXUxNiBzX21hZ2ljOwoJdTE2IHNfc3RhdGU7Cgl1MzIgc196b25lczsKfTsKCnN0cnVjdCBtaW5peF9kaXJfZW50cnkgewoJdTE2IGlub2RlOwoJY2hhciBuYW1lWzBdOwp9OwoKI2RlZmluZSBCTE9DS19TSVpFX0JJVFMgMTAKI2RlZmluZSBCTE9DS19TSVpFICgxPDxCTE9DS19TSVpFX0JJVFMpCgojZGVmaW5lIE5BTUVfTUFYICAgICAgICAgMjU1ICAgLyogIyBjaGFycyBpbiBhIGZpbGUgbmFtZSAqLwoKI2RlZmluZSBNSU5JWF9JTk9ERVNfUEVSX0JMT0NLICgoQkxPQ0tfU0laRSkvKHNpemVvZiAoc3RydWN0IG1pbml4X2lub2RlKSkpCgojZGVmaW5lIE1JTklYX1ZBTElEX0ZTICAgICAgICAgICAgICAgMHgwMDAxICAgICAgICAgIC8qIENsZWFuIGZzLiAqLwojZGVmaW5lIE1JTklYX0VSUk9SX0ZTICAgICAgICAgICAgICAgMHgwMDAyICAgICAgICAgIC8qIGZzIGhhcyBlcnJvcnMuICovCgojZGVmaW5lIE1JTklYX1NVUEVSX01BR0lDICAgIDB4MTM3RiAgICAgICAgICAvKiBvcmlnaW5hbCBtaW5peCBmcyAqLwojZGVmaW5lIE1JTklYX1NVUEVSX01BR0lDMiAgIDB4MTM4RiAgICAgICAgICAvKiBtaW5peCBmcywgMzAgY2hhciBuYW1lcyAqLwoKI2lmbmRlZiBCTEtHRVRTSVpFCiNkZWZpbmUgQkxLR0VUU0laRSBfSU8oMHgxMiw5NikgICAgLyogcmV0dXJuIGRldmljZSBzaXplICovCiNlbmRpZgoKI2lmbmRlZiBfX2xpbnV4X18KI2RlZmluZSB2b2xhdGlsZQojZW5kaWYKCiNkZWZpbmUgUk9PVF9JTk8gMQoKI2RlZmluZSBVUFBFUihzaXplLG4pICgoc2l6ZSsoKG4pLTEpKS8obikpCiNkZWZpbmUgSU5PREVfU0laRSAoc2l6ZW9mKHN0cnVjdCBtaW5peF9pbm9kZSkpCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgojZGVmaW5lIElOT0RFX1NJWkUyIChzaXplb2Yoc3RydWN0IG1pbml4Ml9pbm9kZSkpCiNkZWZpbmUgSU5PREVfQkxPQ0tTIFVQUEVSKElOT0RFUywgKHZlcnNpb24yID8gTUlOSVgyX0lOT0RFU19QRVJfQkxPQ0sgXAoJCQkJICAgIDogTUlOSVhfSU5PREVTX1BFUl9CTE9DSykpCiNlbHNlCiNkZWZpbmUgSU5PREVfQkxPQ0tTIFVQUEVSKElOT0RFUywgKE1JTklYX0lOT0RFU19QRVJfQkxPQ0spKQojZW5kaWYKI2RlZmluZSBJTk9ERV9CVUZGRVJfU0laRSAoSU5PREVfQkxPQ0tTICogQkxPQ0tfU0laRSkKCiNkZWZpbmUgQklUU19QRVJfQkxPQ0sgKEJMT0NLX1NJWkU8PDMpCgpzdGF0aWMgY2hhciAqcHJvZ3JhbV92ZXJzaW9uID0gIjEuMiAtIDExLzExLzk2IjsKc3RhdGljIGNoYXIgKmRldmljZV9uYW1lID0gTlVMTDsKc3RhdGljIGludCBJTjsKc3RhdGljIGludCByZXBhaXIgPSAwLCBhdXRvbWF0aWMgPSAwLCB2ZXJib3NlID0gMCwgbGlzdCA9IDAsIHNob3cgPQoJMCwgd2Fybl9tb2RlID0gMCwgZm9yY2UgPSAwOwpzdGF0aWMgaW50IGRpcmVjdG9yeSA9IDAsIHJlZ3VsYXIgPSAwLCBibG9ja2RldiA9IDAsIGNoYXJkZXYgPSAwLCBsaW5rcyA9CgkwLCBzeW1saW5rcyA9IDAsIHRvdGFsID0gMDsKCnN0YXRpYyBpbnQgY2hhbmdlZCA9IDA7CQkJLyogZmxhZ3MgaWYgdGhlIGZpbGVzeXN0ZW0gaGFzIGJlZW4gY2hhbmdlZCAqLwpzdGF0aWMgaW50IGVycm9yc191bmNvcnJlY3RlZCA9IDA7CS8qIGZsYWcgaWYgc29tZSBlcnJvciB3YXMgbm90IGNvcnJlY3RlZCAqLwpzdGF0aWMgaW50IGRpcnNpemUgPSAxNjsKc3RhdGljIGludCBuYW1lbGVuID0gMTQ7CnN0YXRpYyBpbnQgdmVyc2lvbjIgPSAwOwpzdGF0aWMgc3RydWN0IHRlcm1pb3MgdGVybWlvczsKc3RhdGljIGludCB0ZXJtaW9zX3NldCA9IDA7CgovKiBGaWxlLW5hbWUgZGF0YSAqLwojZGVmaW5lIE1BWF9ERVBUSCAzMgpzdGF0aWMgaW50IG5hbWVfZGVwdGggPSAwOwovLyBzdGF0aWMgY2hhciBuYW1lX2xpc3RbTUFYX0RFUFRIXVtCVUZTSVogKyAxXTsKc3RhdGljIGNoYXIgKipuYW1lX2xpc3QgPSBOVUxMOwoKc3RhdGljIGNoYXIgKmlub2RlX2J1ZmZlciA9IE5VTEw7CgojZGVmaW5lIElub2RlICgoKHN0cnVjdCBtaW5peF9pbm9kZSAqKSBpbm9kZV9idWZmZXIpLTEpCiNkZWZpbmUgSW5vZGUyICgoKHN0cnVjdCBtaW5peDJfaW5vZGUgKikgaW5vZGVfYnVmZmVyKS0xKQpzdGF0aWMgY2hhciBzdXBlcl9ibG9ja19idWZmZXJbQkxPQ0tfU0laRV07CgojZGVmaW5lIFN1cGVyICgqKHN0cnVjdCBtaW5peF9zdXBlcl9ibG9jayAqKXN1cGVyX2Jsb2NrX2J1ZmZlcikKI2RlZmluZSBJTk9ERVMgKCh1bnNpZ25lZCBsb25nKVN1cGVyLnNfbmlub2RlcykKI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCiNkZWZpbmUgWk9ORVMgKCh1bnNpZ25lZCBsb25nKSh2ZXJzaW9uMiA/IFN1cGVyLnNfem9uZXMgOiBTdXBlci5zX256b25lcykpCiNlbHNlCiNkZWZpbmUgWk9ORVMgKCh1bnNpZ25lZCBsb25nKShTdXBlci5zX256b25lcykpCiNlbmRpZgojZGVmaW5lIElNQVBTICgodW5zaWduZWQgbG9uZylTdXBlci5zX2ltYXBfYmxvY2tzKQojZGVmaW5lIFpNQVBTICgodW5zaWduZWQgbG9uZylTdXBlci5zX3ptYXBfYmxvY2tzKQojZGVmaW5lIEZJUlNUWk9ORSAoKHVuc2lnbmVkIGxvbmcpU3VwZXIuc19maXJzdGRhdGF6b25lKQojZGVmaW5lIFpPTkVTSVpFICgodW5zaWduZWQgbG9uZylTdXBlci5zX2xvZ196b25lX3NpemUpCiNkZWZpbmUgTUFYU0laRSAoKHVuc2lnbmVkIGxvbmcpU3VwZXIuc19tYXhfc2l6ZSkKI2RlZmluZSBNQUdJQyAoU3VwZXIuc19tYWdpYykKI2RlZmluZSBOT1JNX0ZJUlNUWk9ORSAoMitJTUFQUytaTUFQUytJTk9ERV9CTE9DS1MpCgpzdGF0aWMgY2hhciAqaW5vZGVfbWFwOwpzdGF0aWMgY2hhciAqem9uZV9tYXA7CgpzdGF0aWMgdW5zaWduZWQgY2hhciAqaW5vZGVfY291bnQgPSBOVUxMOwpzdGF0aWMgdW5zaWduZWQgY2hhciAqem9uZV9jb3VudCA9IE5VTEw7CgpzdGF0aWMgdm9pZCByZWN1cnNpdmVfY2hlY2sodW5zaWduZWQgaW50IGlubyk7CiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCByZWN1cnNpdmVfY2hlY2syKHVuc2lnbmVkIGludCBpbm8pOwojZW5kaWYKCiNkZWZpbmUgaW5vZGVfaW5fdXNlKHgpIChpc3NldChpbm9kZV9tYXAsKHgpKSkKI2RlZmluZSB6b25lX2luX3VzZSh4KSAoaXNzZXQoem9uZV9tYXAsKHgpLUZJUlNUWk9ORSsxKSkKCiNkZWZpbmUgbWFya19pbm9kZSh4KSAoc2V0Yml0KGlub2RlX21hcCwoeCkpLGNoYW5nZWQ9MSkKI2RlZmluZSB1bm1hcmtfaW5vZGUoeCkgKGNscmJpdChpbm9kZV9tYXAsKHgpKSxjaGFuZ2VkPTEpCgojZGVmaW5lIG1hcmtfem9uZSh4KSAoc2V0Yml0KHpvbmVfbWFwLCh4KS1GSVJTVFpPTkUrMSksY2hhbmdlZD0xKQojZGVmaW5lIHVubWFya196b25lKHgpIChjbHJiaXQoem9uZV9tYXAsKHgpLUZJUlNUWk9ORSsxKSxjaGFuZ2VkPTEpCgpzdGF0aWMgdm9pZCBsZWF2ZShpbnQpIF9fYXR0cmlidXRlX18gKChub3JldHVybikpOwpzdGF0aWMgdm9pZCBsZWF2ZShpbnQgc3RhdHVzKQp7CglpZiAodGVybWlvc19zZXQpCgkJdGNzZXRhdHRyKDAsIFRDU0FOT1csICZ0ZXJtaW9zKTsKCWV4aXQoc3RhdHVzKTsKfQoKc3RhdGljIHZvaWQgc2hvd191c2FnZSh2b2lkKQp7Cgl1c2FnZShmc2NrX21pbml4X3VzYWdlKTsKfQoKc3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKnN0cikKewoJZXJyb3JNc2coIiVzXG4iLCBzdHIpOwoJbGVhdmUoOCk7Cn0KCi8qCiAqIFRoaXMgc2ltcGx5IGdvZXMgdGhyb3VnaCB0aGUgZmlsZS1uYW1lIGRhdGEgYW5kIHByaW50cyBvdXQgdGhlCiAqIGN1cnJlbnQgZmlsZS4KICovCnN0YXRpYyB2b2lkIHByaW50X2N1cnJlbnRfbmFtZSh2b2lkKQp7CglpbnQgaSA9IDA7CgoJd2hpbGUgKGkgPCBuYW1lX2RlcHRoKQoJCXByaW50ZigiLyUuKnMiLCBuYW1lbGVuLCBuYW1lX2xpc3RbaSsrXSk7CglpZiAoaSA9PSAwKQoJCXByaW50ZigiLyIpOwp9CgpzdGF0aWMgaW50IGFzayhjb25zdCBjaGFyICpzdHJpbmcsIGludCBkZWYpCnsKCWludCBjOwoKCWlmICghcmVwYWlyKSB7CgkJcHJpbnRmKCJcbiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJcmV0dXJuIDA7Cgl9CglpZiAoYXV0b21hdGljKSB7CgkJcHJpbnRmKCJcbiIpOwoJCWlmICghZGVmKQoJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCXJldHVybiBkZWY7Cgl9CglwcmludGYoZGVmID8gIiVzICh5L24pPyAiIDogIiVzIChuL3kpPyAiLCBzdHJpbmcpOwoJZm9yICg7OykgewoJCWZmbHVzaChzdGRvdXQpOwoJCWlmICgoYyA9IGdldGNoYXIoKSkgPT0gRU9GKSB7CgkJCWlmICghZGVmKQoJCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQkJcmV0dXJuIGRlZjsKCQl9CgkJYyA9IHRvdXBwZXIoYyk7CgkJaWYgKGMgPT0gJ1knKSB7CgkJCWRlZiA9IDE7CgkJCWJyZWFrOwoJCX0gZWxzZSBpZiAoYyA9PSAnTicpIHsKCQkJZGVmID0gMDsKCQkJYnJlYWs7CgkJfSBlbHNlIGlmIChjID09ICcgJyB8fCBjID09ICdcbicpCgkJCWJyZWFrOwoJfQoJaWYgKGRlZikKCQlwcmludGYoInlcbiIpOwoJZWxzZSB7CgkJcHJpbnRmKCJuXG4iKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJcmV0dXJuIGRlZjsKfQoKLyoKICogTWFrZSBjZXJ0YWluIHRoYXQgd2UgYXJlbid0IGNoZWNraW5nIGEgZmlsZXN5c3RlbSB0aGF0IGlzIG9uIGEKICogbW91bnRlZCBwYXJ0aXRpb24uICBDb2RlIGFkYXB0ZWQgZnJvbSBlMmZzY2ssIENvcHlyaWdodCAoQykgMTk5MywKICogMTk5NCBUaGVvZG9yZSBUcydvLiAgQWxzbyBsaWNlbnNlZCB1bmRlciBHUEwuCiAqLwpzdGF0aWMgdm9pZCBjaGVja19tb3VudCh2b2lkKQp7CglGSUxFICpmOwoJc3RydWN0IG1udGVudCAqbW50OwoJaW50IGNvbnQ7CglpbnQgZmQ7CgoJaWYgKChmID0gc2V0bW50ZW50KE1PVU5URUQsICJyIikpID09IE5VTEwpCgkJcmV0dXJuOwoJd2hpbGUgKChtbnQgPSBnZXRtbnRlbnQoZikpICE9IE5VTEwpCgkJaWYgKHN0cmNtcChkZXZpY2VfbmFtZSwgbW50LT5tbnRfZnNuYW1lKSA9PSAwKQoJCQlicmVhazsKCWVuZG1udGVudChmKTsKCWlmICghbW50KQoJCXJldHVybjsKCgkvKgoJICogSWYgdGhlIHJvb3QgaXMgbW91bnRlZCByZWFkLW9ubHksIHRoZW4gL2V0Yy9tdGFiIGlzCgkgKiBwcm9iYWJseSBub3QgY29ycmVjdDsgc28gd2Ugd29uJ3QgaXNzdWUgYSB3YXJuaW5nIGJhc2VkIG9uCgkgKiBpdC4KCSAqLwoJZmQgPSBvcGVuKE1PVU5URUQsIE9fUkRXUik7CglpZiAoZmQgPCAwICYmIGVycm5vID09IEVST0ZTKQoJCXJldHVybjsKCWVsc2UKCQljbG9zZShmZCk7CgoJcHJpbnRmKCIlcyBpcyBtb3VudGVkLgkgIiwgZGV2aWNlX25hbWUpOwoJaWYgKGlzYXR0eSgwKSAmJiBpc2F0dHkoMSkpCgkJY29udCA9IGFzaygiRG8geW91IHJlYWxseSB3YW50IHRvIGNvbnRpbnVlIiwgMCk7CgllbHNlCgkJY29udCA9IDA7CglpZiAoIWNvbnQpIHsKCQlwcmludGYoImNoZWNrIGFib3J0ZWQuXG4iKTsKCQlleGl0KDApOwoJfQoJcmV0dXJuOwp9CgovKgogKiBjaGVja196b25lX25yIGNoZWNrcyB0byBzZWUgdGhhdCAqbnIgaXMgYSB2YWxpZCB6b25lIG5yLiBJZiBpdAogKiBpc24ndCwgaXQgd2lsbCBwb3NzaWJseSBiZSByZXBhaXJlZC4gQ2hlY2tfem9uZV9uciBzZXRzICpjb3JyZWN0ZWQKICogaWYgYW4gZXJyb3Igd2FzIGNvcnJlY3RlZCwgYW5kIHJldHVybnMgdGhlIHpvbmUgKDAgZm9yIG5vIHpvbmUKICogb3IgYSBiYWQgem9uZS1udW1iZXIpLgogKi8Kc3RhdGljIGludCBjaGVja196b25lX25yKHVuc2lnbmVkIHNob3J0ICpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCWlmICghKm5yKQoJCXJldHVybiAwOwoJaWYgKCpuciA8IEZJUlNUWk9ORSkKCQlwcmludGYoIlpvbmUgbnIgPCBGSVJTVFpPTkUgaW4gZmlsZSBgIik7CgllbHNlIGlmICgqbnIgPj0gWk9ORVMpCgkJcHJpbnRmKCJab25lIG5yID49IFpPTkVTIGluIGZpbGUgYCIpOwoJZWxzZQoJCXJldHVybiAqbnI7CglwcmludF9jdXJyZW50X25hbWUoKTsKCXByaW50ZigiJy4iKTsKCWlmIChhc2soIlJlbW92ZSBibG9jayIsIDEpKSB7CgkJKm5yID0gMDsKCQkqY29ycmVjdGVkID0gMTsKCX0KCXJldHVybiAwOwp9CgojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKc3RhdGljIGludCBjaGVja196b25lX25yMih1bnNpZ25lZCBpbnQgKm5yLCBpbnQgKmNvcnJlY3RlZCkKewoJaWYgKCEqbnIpCgkJcmV0dXJuIDA7CglpZiAoKm5yIDwgRklSU1RaT05FKQoJCXByaW50ZigiWm9uZSBuciA8IEZJUlNUWk9ORSBpbiBmaWxlIGAiKTsKCWVsc2UgaWYgKCpuciA+PSBaT05FUykKCQlwcmludGYoIlpvbmUgbnIgPj0gWk9ORVMgaW4gZmlsZSBgIik7CgllbHNlCgkJcmV0dXJuICpucjsKCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJcHJpbnRmKCInLiIpOwoJaWYgKGFzaygiUmVtb3ZlIGJsb2NrIiwgMSkpIHsKCQkqbnIgPSAwOwoJCSpjb3JyZWN0ZWQgPSAxOwoJfQoJcmV0dXJuIDA7Cn0KI2VuZGlmCgovKgogKiByZWFkLWJsb2NrIHJlYWRzIGJsb2NrIG5yIGludG8gdGhlIGJ1ZmZlciBhdCBhZGRyLgogKi8Kc3RhdGljIHZvaWQgcmVhZF9ibG9jayh1bnNpZ25lZCBpbnQgbnIsIGNoYXIgKmFkZHIpCnsKCWlmICghbnIpIHsKCQltZW1zZXQoYWRkciwgMCwgQkxPQ0tfU0laRSk7CgkJcmV0dXJuOwoJfQoJaWYgKEJMT0NLX1NJWkUgKiBuciAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSAqIG5yLCBTRUVLX1NFVCkpIHsKCQlwcmludGYoIlJlYWQgZXJyb3I6IHVuYWJsZSB0byBzZWVrIHRvIGJsb2NrIGluIGZpbGUgJyIpOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiJ1xuIik7CgkJbWVtc2V0KGFkZHIsIDAsIEJMT0NLX1NJWkUpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9IGVsc2UgaWYgKEJMT0NLX1NJWkUgIT0gcmVhZChJTiwgYWRkciwgQkxPQ0tfU0laRSkpIHsKCQlwcmludGYoIlJlYWQgZXJyb3I6IGJhZCBibG9jayBpbiBmaWxlICciKTsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIidcbiIpOwoJCW1lbXNldChhZGRyLCAwLCBCTE9DS19TSVpFKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQp9CgovKgogKiB3cml0ZV9ibG9jayB3cml0ZXMgYmxvY2sgbnIgdG8gZGlzay4KICovCnN0YXRpYyB2b2lkIHdyaXRlX2Jsb2NrKHVuc2lnbmVkIGludCBuciwgY2hhciAqYWRkcikKewoJaWYgKCFucikKCQlyZXR1cm47CglpZiAobnIgPCBGSVJTVFpPTkUgfHwgbnIgPj0gWk9ORVMpIHsKCQlwcmludGYoIkludGVybmFsIGVycm9yOiB0cnlpbmcgdG8gd3JpdGUgYmFkIGJsb2NrXG4iCgkJCSAgICJXcml0ZSByZXF1ZXN0IGlnbm9yZWRcbiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJcmV0dXJuOwoJfQoJaWYgKEJMT0NLX1NJWkUgKiBuciAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSAqIG5yLCBTRUVLX1NFVCkpCgkJZGllKCJzZWVrIGZhaWxlZCBpbiB3cml0ZV9ibG9jayIpOwoJaWYgKEJMT0NLX1NJWkUgIT0gd3JpdGUoSU4sIGFkZHIsIEJMT0NLX1NJWkUpKSB7CgkJcHJpbnRmKCJXcml0ZSBlcnJvcjogYmFkIGJsb2NrIGluIGZpbGUgJyIpOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiJ1xuIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KfQoKLyoKICogbWFwLWJsb2NrIGNhbGN1bGF0ZXMgdGhlIGFic29sdXRlIGJsb2NrIG5yIG9mIGEgYmxvY2sgaW4gYSBmaWxlLgogKiBJdCBzZXRzICdjaGFuZ2VkJyBpZiB0aGUgaW5vZGUgaGFzIG5lZWRlZCBjaGFuZ2luZywgYW5kIHJlLXdyaXRlcwogKiBhbnkgaW5kaXJlY3QgYmxvY2tzIHdpdGggZXJyb3JzLgogKi8Kc3RhdGljIGludCBtYXBfYmxvY2soc3RydWN0IG1pbml4X2lub2RlICppbm9kZSwgdW5zaWduZWQgaW50IGJsa25yKQp7Cgl1bnNpZ25lZCBzaG9ydCBpbmRbQkxPQ0tfU0laRSA+PiAxXTsKCXVuc2lnbmVkIHNob3J0IGRpbmRbQkxPQ0tfU0laRSA+PiAxXTsKCWludCBibGtfY2hnLCBibG9jaywgcmVzdWx0OwoKCWlmIChibGtuciA8IDcpCgkJcmV0dXJuIGNoZWNrX3pvbmVfbnIoaW5vZGUtPmlfem9uZSArIGJsa25yLCAmY2hhbmdlZCk7CglibGtuciAtPSA3OwoJaWYgKGJsa25yIDwgNTEyKSB7CgkJYmxvY2sgPSBjaGVja196b25lX25yKGlub2RlLT5pX3pvbmUgKyA3LCAmY2hhbmdlZCk7CgkJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCQlibGtfY2hnID0gMDsKCQlyZXN1bHQgPSBjaGVja196b25lX25yKGJsa25yICsgaW5kLCAmYmxrX2NoZyk7CgkJaWYgKGJsa19jaGcpCgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCXJldHVybiByZXN1bHQ7Cgl9CglibGtuciAtPSA1MTI7CglibG9jayA9IGNoZWNrX3pvbmVfbnIoaW5vZGUtPmlfem9uZSArIDgsICZjaGFuZ2VkKTsKCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJYmxrX2NoZyA9IDA7CglyZXN1bHQgPSBjaGVja196b25lX25yKGRpbmQgKyAoYmxrbnIgLyA1MTIpLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CglibG9jayA9IHJlc3VsdDsKCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIoaW5kICsgKGJsa25yICUgNTEyKSwgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CglyZXR1cm4gcmVzdWx0Owp9CgojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKc3RhdGljIGludCBtYXBfYmxvY2syKHN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBpbnQgYmxrbnIpCnsKCXVuc2lnbmVkIGludCBpbmRbQkxPQ0tfU0laRSA+PiAyXTsKCXVuc2lnbmVkIGludCBkaW5kW0JMT0NLX1NJWkUgPj4gMl07Cgl1bnNpZ25lZCBpbnQgdGluZFtCTE9DS19TSVpFID4+IDJdOwoJaW50IGJsa19jaGcsIGJsb2NrLCByZXN1bHQ7CgoJaWYgKGJsa25yIDwgNykKCQlyZXR1cm4gY2hlY2tfem9uZV9ucjIoaW5vZGUtPmlfem9uZSArIGJsa25yLCAmY2hhbmdlZCk7CglibGtuciAtPSA3OwoJaWYgKGJsa25yIDwgMjU2KSB7CgkJYmxvY2sgPSBjaGVja196b25lX25yMihpbm9kZS0+aV96b25lICsgNywgJmNoYW5nZWQpOwoJCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CgkJYmxrX2NoZyA9IDA7CgkJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIoYmxrbnIgKyBpbmQsICZibGtfY2hnKTsKCQlpZiAoYmxrX2NoZykKCQkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CgkJcmV0dXJuIHJlc3VsdDsKCX0KCWJsa25yIC09IDI1NjsKCWlmIChibGtuciA+PSAyNTYgKiAyNTYpIHsKCQlibG9jayA9IGNoZWNrX3pvbmVfbnIyKGlub2RlLT5pX3pvbmUgKyA4LCAmY2hhbmdlZCk7CgkJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CgkJYmxrX2NoZyA9IDA7CgkJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIoZGluZCArIGJsa25yIC8gMjU2LCAmYmxrX2NoZyk7CgkJaWYgKGJsa19jaGcpCgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBkaW5kKTsKCQlibG9jayA9IHJlc3VsdDsKCQlyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCWJsa19jaGcgPSAwOwoJCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGluZCArIGJsa25yICUgMjU2LCAmYmxrX2NoZyk7CgkJaWYgKGJsa19jaGcpCgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCXJldHVybiByZXN1bHQ7Cgl9CglibGtuciAtPSAyNTYgKiAyNTY7CglibG9jayA9IGNoZWNrX3pvbmVfbnIyKGlub2RlLT5pX3pvbmUgKyA5LCAmY2hhbmdlZCk7CglyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSB0aW5kKTsKCWJsa19jaGcgPSAwOwoJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIodGluZCArIGJsa25yIC8gKDI1NiAqIDI1NiksICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSB0aW5kKTsKCWJsb2NrID0gcmVzdWx0OwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGRpbmQgKyAoYmxrbnIgLyAyNTYpICUgMjU2LCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CglibG9jayA9IHJlc3VsdDsKCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGluZCArIGJsa25yICUgMjU2LCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCXJldHVybiByZXN1bHQ7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCB3cml0ZV9zdXBlcl9ibG9jayh2b2lkKQp7CgkvKgoJICogU2V0IHRoZSBzdGF0ZSBvZiB0aGUgZmlsZXN5c3RlbSBiYXNlZCBvbiB3aGV0aGVyIG9yIG5vdCB0aGVyZQoJICogYXJlIHVuY29ycmVjdGVkIGVycm9ycy4gIFRoZSBmaWxlc3lzdGVtIHZhbGlkIGZsYWcgaXMKCSAqIHVuY29uZGl0aW9uYWxseSBzZXQgaWYgd2UgZ2V0IHRoaXMgZmFyLgoJICovCglTdXBlci5zX3N0YXRlIHw9IE1JTklYX1ZBTElEX0ZTOwoJaWYgKGVycm9yc191bmNvcnJlY3RlZCkKCQlTdXBlci5zX3N0YXRlIHw9IE1JTklYX0VSUk9SX0ZTOwoJZWxzZQoJCVN1cGVyLnNfc3RhdGUgJj0gfk1JTklYX0VSUk9SX0ZTOwoKCWlmIChCTE9DS19TSVpFICE9IGxzZWVrKElOLCBCTE9DS19TSVpFLCBTRUVLX1NFVCkpCgkJZGllKCJzZWVrIGZhaWxlZCBpbiB3cml0ZV9zdXBlcl9ibG9jayIpOwoJaWYgKEJMT0NLX1NJWkUgIT0gd3JpdGUoSU4sIHN1cGVyX2Jsb2NrX2J1ZmZlciwgQkxPQ0tfU0laRSkpCgkJZGllKCJ1bmFibGUgdG8gd3JpdGUgc3VwZXItYmxvY2siKTsKCglyZXR1cm47Cn0KCnN0YXRpYyB2b2lkIHdyaXRlX3RhYmxlcyh2b2lkKQp7Cgl3cml0ZV9zdXBlcl9ibG9jaygpOwoKCWlmIChJTUFQUyAqIEJMT0NLX1NJWkUgIT0gd3JpdGUoSU4sIGlub2RlX21hcCwgSU1BUFMgKiBCTE9DS19TSVpFKSkKCQlkaWUoIlVuYWJsZSB0byB3cml0ZSBpbm9kZSBtYXAiKTsKCWlmIChaTUFQUyAqIEJMT0NLX1NJWkUgIT0gd3JpdGUoSU4sIHpvbmVfbWFwLCBaTUFQUyAqIEJMT0NLX1NJWkUpKQoJCWRpZSgiVW5hYmxlIHRvIHdyaXRlIHpvbmUgbWFwIik7CglpZiAoSU5PREVfQlVGRkVSX1NJWkUgIT0gd3JpdGUoSU4sIGlub2RlX2J1ZmZlciwgSU5PREVfQlVGRkVSX1NJWkUpKQoJCWRpZSgiVW5hYmxlIHRvIHdyaXRlIGlub2RlcyIpOwp9CgpzdGF0aWMgdm9pZCBnZXRfZGlyc2l6ZSh2b2lkKQp7CglpbnQgYmxvY2s7CgljaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBzaXplOwoKI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCglpZiAodmVyc2lvbjIpCgkJYmxvY2sgPSBJbm9kZTJbUk9PVF9JTk9dLmlfem9uZVswXTsKCWVsc2UKI2VuZGlmCgkJYmxvY2sgPSBJbm9kZVtST09UX0lOT10uaV96b25lWzBdOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCWZvciAoc2l6ZSA9IDE2OyBzaXplIDwgQkxPQ0tfU0laRTsgc2l6ZSA8PD0gMSkgewoJCWlmIChzdHJjbXAoYmxrICsgc2l6ZSArIDIsICIuLiIpID09IDApIHsKCQkJZGlyc2l6ZSA9IHNpemU7CgkJCW5hbWVsZW4gPSBzaXplIC0gMjsKCQkJcmV0dXJuOwoJCX0KCX0KCS8qIHVzZSBkZWZhdWx0cyAqLwp9CgpzdGF0aWMgdm9pZCByZWFkX3N1cGVyYmxvY2sodm9pZCkKewoJaWYgKEJMT0NLX1NJWkUgIT0gbHNlZWsoSU4sIEJMT0NLX1NJWkUsIFNFRUtfU0VUKSkKCQlkaWUoInNlZWsgZmFpbGVkIik7CglpZiAoQkxPQ0tfU0laRSAhPSByZWFkKElOLCBzdXBlcl9ibG9ja19idWZmZXIsIEJMT0NLX1NJWkUpKQoJCWRpZSgidW5hYmxlIHRvIHJlYWQgc3VwZXIgYmxvY2siKTsKCWlmIChNQUdJQyA9PSBNSU5JWF9TVVBFUl9NQUdJQykgewoJCW5hbWVsZW4gPSAxNDsKCQlkaXJzaXplID0gMTY7CgkJdmVyc2lvbjIgPSAwOwoJfSBlbHNlIGlmIChNQUdJQyA9PSBNSU5JWF9TVVBFUl9NQUdJQzIpIHsKCQluYW1lbGVuID0gMzA7CgkJZGlyc2l6ZSA9IDMyOwoJCXZlcnNpb24yID0gMDsKI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCgl9IGVsc2UgaWYgKE1BR0lDID09IE1JTklYMl9TVVBFUl9NQUdJQykgewoJCW5hbWVsZW4gPSAxNDsKCQlkaXJzaXplID0gMTY7CgkJdmVyc2lvbjIgPSAxOwoJfSBlbHNlIGlmIChNQUdJQyA9PSBNSU5JWDJfU1VQRVJfTUFHSUMyKSB7CgkJbmFtZWxlbiA9IDMwOwoJCWRpcnNpemUgPSAzMjsKCQl2ZXJzaW9uMiA9IDE7CiNlbmRpZgoJfSBlbHNlCgkJZGllKCJiYWQgbWFnaWMgbnVtYmVyIGluIHN1cGVyLWJsb2NrIik7CglpZiAoWk9ORVNJWkUgIT0gMCB8fCBCTE9DS19TSVpFICE9IDEwMjQpCgkJZGllKCJPbmx5IDFrIGJsb2Nrcy96b25lcyBzdXBwb3J0ZWQiKTsKCWlmIChJTUFQUyAqIEJMT0NLX1NJWkUgKiA4IDwgSU5PREVTICsgMSkKCQlkaWUoImJhZCBzX2ltYXBfYmxvY2tzIGZpZWxkIGluIHN1cGVyLWJsb2NrIik7CglpZiAoWk1BUFMgKiBCTE9DS19TSVpFICogOCA8IFpPTkVTIC0gRklSU1RaT05FICsgMSkKCQlkaWUoImJhZCBzX3ptYXBfYmxvY2tzIGZpZWxkIGluIHN1cGVyLWJsb2NrIik7Cn0KCnN0YXRpYyB2b2lkIHJlYWRfdGFibGVzKHZvaWQpCnsKCWlub2RlX21hcCA9IHhtYWxsb2MoSU1BUFMgKiBCTE9DS19TSVpFKTsKCXpvbmVfbWFwID0geG1hbGxvYyhaTUFQUyAqIEJMT0NLX1NJWkUpOwoJbWVtc2V0KGlub2RlX21hcCwgMCwgc2l6ZW9mKGlub2RlX21hcCkpOwoJbWVtc2V0KHpvbmVfbWFwLCAwLCBzaXplb2Yoem9uZV9tYXApKTsKCWlub2RlX2J1ZmZlciA9IHhtYWxsb2MoSU5PREVfQlVGRkVSX1NJWkUpOwoJaW5vZGVfY291bnQgPSB4bWFsbG9jKElOT0RFUyArIDEpOwoJem9uZV9jb3VudCA9IHhtYWxsb2MoWk9ORVMpOwoJaWYgKElNQVBTICogQkxPQ0tfU0laRSAhPSByZWFkKElOLCBpbm9kZV9tYXAsIElNQVBTICogQkxPQ0tfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gcmVhZCBpbm9kZSBtYXAiKTsKCWlmIChaTUFQUyAqIEJMT0NLX1NJWkUgIT0gcmVhZChJTiwgem9uZV9tYXAsIFpNQVBTICogQkxPQ0tfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gcmVhZCB6b25lIG1hcCIpOwoJaWYgKElOT0RFX0JVRkZFUl9TSVpFICE9IHJlYWQoSU4sIGlub2RlX2J1ZmZlciwgSU5PREVfQlVGRkVSX1NJWkUpKQoJCWRpZSgiVW5hYmxlIHRvIHJlYWQgaW5vZGVzIik7CglpZiAoTk9STV9GSVJTVFpPTkUgIT0gRklSU1RaT05FKSB7CgkJcHJpbnRmKCJXYXJuaW5nOiBGaXJzdHpvbmUgIT0gTm9ybV9maXJzdHpvbmVcbiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9CglnZXRfZGlyc2l6ZSgpOwoJaWYgKHNob3cpIHsKCQlwcmludGYoIiVsZCBpbm9kZXNcbiIsIElOT0RFUyk7CgkJcHJpbnRmKCIlbGQgYmxvY2tzXG4iLCBaT05FUyk7CgkJcHJpbnRmKCJGaXJzdGRhdGF6b25lPSVsZCAoJWxkKVxuIiwgRklSU1RaT05FLCBOT1JNX0ZJUlNUWk9ORSk7CgkJcHJpbnRmKCJab25lc2l6ZT0lZFxuIiwgQkxPQ0tfU0laRSA8PCBaT05FU0laRSk7CgkJcHJpbnRmKCJNYXhzaXplPSVsZFxuIiwgTUFYU0laRSk7CgkJcHJpbnRmKCJGaWxlc3lzdGVtIHN0YXRlPSVkXG4iLCBTdXBlci5zX3N0YXRlKTsKCQlwcmludGYoIm5hbWVsZW49JWRcblxuIiwgbmFtZWxlbik7Cgl9Cn0KCnN0cnVjdCBtaW5peF9pbm9kZSAqZ2V0X2lub2RlKHVuc2lnbmVkIGludCBucikKewoJc3RydWN0IG1pbml4X2lub2RlICppbm9kZTsKCglpZiAoIW5yIHx8IG5yID4gSU5PREVTKQoJCXJldHVybiBOVUxMOwoJdG90YWwrKzsKCWlub2RlID0gSW5vZGUgKyBucjsKCWlmICghaW5vZGVfY291bnRbbnJdKSB7CgkJaWYgKCFpbm9kZV9pbl91c2UobnIpKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgbWFya2VkIG5vdCB1c2VkLCBidXQgdXNlZCBmb3IgZmlsZSAnIiwgbnIpOwoJCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQkJcHJpbnRmKCInXG4iKTsKCQkJaWYgKHJlcGFpcikgewoJCQkJaWYgKGFzaygiTWFyayBpbiB1c2UiLCAxKSkKCQkJCQltYXJrX2lub2RlKG5yKTsKCQkJfSBlbHNlIHsKCQkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJCX0KCQl9CgkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJCWRpcmVjdG9yeSsrOwoJCWVsc2UgaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCgkJCXJlZ3VsYXIrKzsKCQllbHNlIGlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpKQoJCQljaGFyZGV2Kys7CgkJZWxzZSBpZiAoU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKCQkJYmxvY2tkZXYrKzsKCQllbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQoJCQlzeW1saW5rcysrOwoJCWVsc2UgaWYgKFNfSVNTT0NLKGlub2RlLT5pX21vZGUpKTsKCQllbHNlIGlmIChTX0lTRklGTyhpbm9kZS0+aV9tb2RlKSk7CgkJZWxzZSB7CgkJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCQlwcmludGYoIiBoYXMgbW9kZSAlMDVvXG4iLCBpbm9kZS0+aV9tb2RlKTsKCQl9CgoJfSBlbHNlCgkJbGlua3MrKzsKCWlmICghKytpbm9kZV9jb3VudFtucl0pIHsKCQlwcmludGYoIldhcm5pbmc6IGlub2RlIGNvdW50IHRvbyBiaWcuXG4iKTsKCQlpbm9kZV9jb3VudFtucl0tLTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJcmV0dXJuIGlub2RlOwp9CgojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKc3RydWN0IG1pbml4Ml9pbm9kZSAqZ2V0X2lub2RlMih1bnNpZ25lZCBpbnQgbnIpCnsKCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlOwoKCWlmICghbnIgfHwgbnIgPiBJTk9ERVMpCgkJcmV0dXJuIE5VTEw7Cgl0b3RhbCsrOwoJaW5vZGUgPSBJbm9kZTIgKyBucjsKCWlmICghaW5vZGVfY291bnRbbnJdKSB7CgkJaWYgKCFpbm9kZV9pbl91c2UobnIpKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgbWFya2VkIG5vdCB1c2VkLCBidXQgdXNlZCBmb3IgZmlsZSAnIiwgbnIpOwoJCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQkJcHJpbnRmKCInXG4iKTsKCQkJaWYgKHJlcGFpcikgewoJCQkJaWYgKGFzaygiTWFyayBpbiB1c2UiLCAxKSkKCQkJCQltYXJrX2lub2RlKG5yKTsKCQkJCWVsc2UKCQkJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCQl9CgkJfQoJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCQlkaXJlY3RvcnkrKzsKCQllbHNlIGlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQoJCQlyZWd1bGFyKys7CgkJZWxzZSBpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSkKCQkJY2hhcmRldisrOwoJCWVsc2UgaWYgKFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCgkJCWJsb2NrZGV2Kys7CgkJZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKCQkJc3ltbGlua3MrKzsKCQllbHNlIGlmIChTX0lTU09DSyhpbm9kZS0+aV9tb2RlKSk7CgkJZWxzZSBpZiAoU19JU0ZJRk8oaW5vZGUtPmlfbW9kZSkpOwoJCWVsc2UgewoJCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQkJcHJpbnRmKCIgaGFzIG1vZGUgJTA1b1xuIiwgaW5vZGUtPmlfbW9kZSk7CgkJfQoJfSBlbHNlCgkJbGlua3MrKzsKCWlmICghKytpbm9kZV9jb3VudFtucl0pIHsKCQlwcmludGYoIldhcm5pbmc6IGlub2RlIGNvdW50IHRvbyBiaWcuXG4iKTsKCQlpbm9kZV9jb3VudFtucl0tLTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJcmV0dXJuIGlub2RlOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgY2hlY2tfcm9vdCh2b2lkKQp7CglzdHJ1Y3QgbWluaXhfaW5vZGUgKmlub2RlID0gSW5vZGUgKyBST09UX0lOTzsKCglpZiAoIWlub2RlIHx8ICFTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCWRpZSgicm9vdCBpbm9kZSBpc24ndCBhIGRpcmVjdG9yeSIpOwp9CgojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgY2hlY2tfcm9vdDIodm9pZCkKewoJc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGUgPSBJbm9kZTIgKyBST09UX0lOTzsKCglpZiAoIWlub2RlIHx8ICFTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCWRpZSgicm9vdCBpbm9kZSBpc24ndCBhIGRpcmVjdG9yeSIpOwp9CiNlbmRpZgoKc3RhdGljIGludCBhZGRfem9uZSh1bnNpZ25lZCBzaG9ydCAqem5yLCBpbnQgKmNvcnJlY3RlZCkKewoJaW50IHJlc3VsdDsKCWludCBibG9jazsKCglyZXN1bHQgPSAwOwoJYmxvY2sgPSBjaGVja196b25lX25yKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuIDA7CglpZiAoem9uZV9jb3VudFtibG9ja10pIHsKCQlwcmludGYoIkJsb2NrIGhhcyBiZWVuIHVzZWQgYmVmb3JlLiBOb3cgaW4gZmlsZSBgIik7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCInLiIpOwoJCWlmIChhc2soIkNsZWFyIiwgMSkpIHsKCQkJKnpuciA9IDA7CgkJCWJsb2NrID0gMDsKCQkJKmNvcnJlY3RlZCA9IDE7CgkJfQoJfQoJaWYgKCFibG9jaykKCQlyZXR1cm4gMDsKCWlmICghem9uZV9pbl91c2UoYmxvY2spKSB7CgkJcHJpbnRmKCJCbG9jayAlZCBpbiBmaWxlIGAiLCBibG9jayk7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCInIGlzIG1hcmtlZCBub3QgaW4gdXNlLiIpOwoJCWlmIChhc2soIkNvcnJlY3QiLCAxKSkKCQkJbWFya196b25lKGJsb2NrKTsKCX0KCWlmICghKyt6b25lX2NvdW50W2Jsb2NrXSkKCQl6b25lX2NvdW50W2Jsb2NrXS0tOwoJcmV0dXJuIGJsb2NrOwp9CgojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKc3RhdGljIGludCBhZGRfem9uZTIodW5zaWduZWQgaW50ICp6bnIsIGludCAqY29ycmVjdGVkKQp7CglpbnQgcmVzdWx0OwoJaW50IGJsb2NrOwoKCXJlc3VsdCA9IDA7CglibG9jayA9IGNoZWNrX3pvbmVfbnIyKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuIDA7CglpZiAoem9uZV9jb3VudFtibG9ja10pIHsKCQlwcmludGYoIkJsb2NrIGhhcyBiZWVuIHVzZWQgYmVmb3JlLiBOb3cgaW4gZmlsZSBgIik7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCInLiIpOwoJCWlmIChhc2soIkNsZWFyIiwgMSkpIHsKCQkJKnpuciA9IDA7CgkJCWJsb2NrID0gMDsKCQkJKmNvcnJlY3RlZCA9IDE7CgkJfQoJfQoJaWYgKCFibG9jaykKCQlyZXR1cm4gMDsKCWlmICghem9uZV9pbl91c2UoYmxvY2spKSB7CgkJcHJpbnRmKCJCbG9jayAlZCBpbiBmaWxlIGAiLCBibG9jayk7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCInIGlzIG1hcmtlZCBub3QgaW4gdXNlLiIpOwoJCWlmIChhc2soIkNvcnJlY3QiLCAxKSkKCQkJbWFya196b25lKGJsb2NrKTsKCX0KCWlmICghKyt6b25lX2NvdW50W2Jsb2NrXSkKCQl6b25lX2NvdW50W2Jsb2NrXS0tOwoJcmV0dXJuIGJsb2NrOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgYWRkX3pvbmVfaW5kKHVuc2lnbmVkIHNob3J0ICp6bnIsIGludCAqY29ycmVjdGVkKQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglpbnQgaSwgY2hnX2JsayA9IDA7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBhZGRfem9uZSh6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybjsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7Cglmb3IgKGkgPSAwOyBpIDwgKEJMT0NLX1NJWkUgPj4gMSk7IGkrKykKCQlhZGRfem9uZShpICsgKHVuc2lnbmVkIHNob3J0ICopIGJsaywgJmNoZ19ibGspOwoJaWYgKGNoZ19ibGspCgkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7Cn0KCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBhZGRfem9uZV9pbmQyKHVuc2lnbmVkIGludCAqem5yLCBpbnQgKmNvcnJlY3RlZCkKewoJc3RhdGljIGNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJaW50IGksIGNoZ19ibGsgPSAwOwoJaW50IGJsb2NrOwoKCWJsb2NrID0gYWRkX3pvbmUyKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCWZvciAoaSA9IDA7IGkgPCBCTE9DS19TSVpFID4+IDI7IGkrKykKCQlhZGRfem9uZTIoaSArICh1bnNpZ25lZCBpbnQgKikgYmxrLCAmY2hnX2Jsayk7CglpZiAoY2hnX2JsaykKCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGFkZF96b25lX2RpbmQodW5zaWduZWQgc2hvcnQgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBpLCBibGtfY2hnID0gMDsKCWludCBibG9jazsKCglibG9jayA9IGFkZF96b25lKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCWZvciAoaSA9IDA7IGkgPCAoQkxPQ0tfU0laRSA+PiAxKTsgaSsrKQoJCWFkZF96b25lX2luZChpICsgKHVuc2lnbmVkIHNob3J0ICopIGJsaywgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7Cn0KCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBhZGRfem9uZV9kaW5kMih1bnNpZ25lZCBpbnQgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBpLCBibGtfY2hnID0gMDsKCWludCBibG9jazsKCglibG9jayA9IGFkZF96b25lMih6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybjsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7Cglmb3IgKGkgPSAwOyBpIDwgQkxPQ0tfU0laRSA+PiAyOyBpKyspCgkJYWRkX3pvbmVfaW5kMihpICsgKHVuc2lnbmVkIGludCAqKSBibGssICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwp9CgpzdGF0aWMgdm9pZCBhZGRfem9uZV90aW5kMih1bnNpZ25lZCBpbnQgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBpLCBibGtfY2hnID0gMDsKCWludCBibG9jazsKCglibG9jayA9IGFkZF96b25lMih6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybjsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7Cglmb3IgKGkgPSAwOyBpIDwgQkxPQ0tfU0laRSA+PiAyOyBpKyspCgkJYWRkX3pvbmVfZGluZDIoaSArICh1bnNpZ25lZCBpbnQgKikgYmxrLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGNoZWNrX3pvbmVzKHVuc2lnbmVkIGludCBpKQp7CglzdHJ1Y3QgbWluaXhfaW5vZGUgKmlub2RlOwoKCWlmICghaSB8fCBpID4gSU5PREVTKQoJCXJldHVybjsKCWlmIChpbm9kZV9jb3VudFtpXSA+IDEpCQkvKiBoYXZlIHdlIGNvdW50ZWQgdGhpcyBmaWxlIGFscmVhZHk/ICovCgkJcmV0dXJuOwoJaW5vZGUgPSBJbm9kZSArIGk7CglpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYKCQkhU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgcmV0dXJuOwoJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKCQlhZGRfem9uZShpICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfaW5kKDcgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CglhZGRfem9uZV9kaW5kKDggKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7Cn0KCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBjaGVja196b25lczIodW5zaWduZWQgaW50IGkpCnsKCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlOwoKCWlmICghaSB8fCBpID4gSU5PREVTKQoJCXJldHVybjsKCWlmIChpbm9kZV9jb3VudFtpXSA+IDEpCQkvKiBoYXZlIHdlIGNvdW50ZWQgdGhpcyBmaWxlIGFscmVhZHk/ICovCgkJcmV0dXJuOwoJaW5vZGUgPSBJbm9kZTIgKyBpOwoJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpICYmICFTX0lTUkVHKGlub2RlLT5pX21vZGUpCgkJJiYgIVNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCgkJcmV0dXJuOwoJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKCQlhZGRfem9uZTIoaSArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKCWFkZF96b25lX2luZDIoNyArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKCWFkZF96b25lX2RpbmQyKDggKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CglhZGRfem9uZV90aW5kMig5ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgY2hlY2tfZmlsZShzdHJ1Y3QgbWluaXhfaW5vZGUgKmRpciwgdW5zaWduZWQgaW50IG9mZnNldCkKewoJc3RhdGljIGNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJc3RydWN0IG1pbml4X2lub2RlICppbm9kZTsKCWludCBpbm87CgljaGFyICpuYW1lOwoJaW50IGJsb2NrOwoKCWJsb2NrID0gbWFwX2Jsb2NrKGRpciwgb2Zmc2V0IC8gQkxPQ0tfU0laRSk7CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJbmFtZSA9IGJsayArIChvZmZzZXQgJSBCTE9DS19TSVpFKSArIDI7Cglpbm8gPSAqKHVuc2lnbmVkIHNob3J0ICopIChuYW1lIC0gMik7CglpZiAoaW5vID4gSU5PREVTKSB7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCIgY29udGFpbnMgYSBiYWQgaW5vZGUgbnVtYmVyIGZvciBmaWxlICciKTsKCQlwcmludGYoIiUuKnMnLiIsIG5hbWVsZW4sIG5hbWUpOwoJCWlmIChhc2soIiBSZW1vdmUiLCAxKSkgewoJCQkqKHVuc2lnbmVkIHNob3J0ICopIChuYW1lIC0gMikgPSAwOwoJCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKCQl9CgkJaW5vID0gMDsKCX0KCWlmIChuYW1lX2RlcHRoIDwgTUFYX0RFUFRIKQoJCXN0cm5jcHkobmFtZV9saXN0W25hbWVfZGVwdGhdLCBuYW1lLCBuYW1lbGVuKTsKCW5hbWVfZGVwdGgrKzsKCWlub2RlID0gZ2V0X2lub2RlKGlubyk7CgluYW1lX2RlcHRoLS07CglpZiAoIW9mZnNldCkgewoJCWlmICghaW5vZGUgfHwgc3RyY21wKCIuIiwgbmFtZSkpIHsKCQkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJCXByaW50ZigiOiBiYWQgZGlyZWN0b3J5OiAnLicgaXNuJ3QgZmlyc3RcbiIpOwoJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCX0gZWxzZQoJCQlyZXR1cm47Cgl9CglpZiAob2Zmc2V0ID09IGRpcnNpemUpIHsKCQlpZiAoIWlub2RlIHx8IHN0cmNtcCgiLi4iLCBuYW1lKSkgewoJCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQkJcHJpbnRmKCI6IGJhZCBkaXJlY3Rvcnk6ICcuLicgaXNuJ3Qgc2Vjb25kXG4iKTsKCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQl9IGVsc2UKCQkJcmV0dXJuOwoJfQoJaWYgKCFpbm9kZSkKCQlyZXR1cm47CglpZiAobmFtZV9kZXB0aCA8IE1BWF9ERVBUSCkKCQlzdHJuY3B5KG5hbWVfbGlzdFtuYW1lX2RlcHRoXSwgbmFtZSwgbmFtZWxlbik7CgluYW1lX2RlcHRoKys7CglpZiAobGlzdCkgewoJCWlmICh2ZXJib3NlKQoJCQlwcmludGYoIiU2ZCAlMDdvICUzZCAiLCBpbm8sIGlub2RlLT5pX21vZGUsIGlub2RlLT5pX25saW5rcyk7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJCXByaW50ZigiOlxuIik7CgkJZWxzZQoJCQlwcmludGYoIlxuIik7Cgl9CgljaGVja196b25lcyhpbm8pOwoJaWYgKGlub2RlICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJcmVjdXJzaXZlX2NoZWNrKGlubyk7CgluYW1lX2RlcHRoLS07CglyZXR1cm47Cn0KCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBjaGVja19maWxlMihzdHJ1Y3QgbWluaXgyX2lub2RlICpkaXIsIHVuc2lnbmVkIGludCBvZmZzZXQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlOwoJaW50IGlubzsKCWNoYXIgKm5hbWU7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBtYXBfYmxvY2syKGRpciwgb2Zmc2V0IC8gQkxPQ0tfU0laRSk7CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJbmFtZSA9IGJsayArIChvZmZzZXQgJSBCTE9DS19TSVpFKSArIDI7Cglpbm8gPSAqKHVuc2lnbmVkIHNob3J0ICopIChuYW1lIC0gMik7CglpZiAoaW5vID4gSU5PREVTKSB7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCIgY29udGFpbnMgYSBiYWQgaW5vZGUgbnVtYmVyIGZvciBmaWxlICciKTsKCQlwcmludGYoIiUuKnMnLiIsIG5hbWVsZW4sIG5hbWUpOwoJCWlmIChhc2soIiBSZW1vdmUiLCAxKSkgewoJCQkqKHVuc2lnbmVkIHNob3J0ICopIChuYW1lIC0gMikgPSAwOwoJCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKCQl9CgkJaW5vID0gMDsKCX0KCWlmIChuYW1lX2RlcHRoIDwgTUFYX0RFUFRIKQoJCXN0cm5jcHkobmFtZV9saXN0W25hbWVfZGVwdGhdLCBuYW1lLCBuYW1lbGVuKTsKCW5hbWVfZGVwdGgrKzsKCWlub2RlID0gZ2V0X2lub2RlMihpbm8pOwoJbmFtZV9kZXB0aC0tOwoJaWYgKCFvZmZzZXQpIHsKCQlpZiAoIWlub2RlIHx8IHN0cmNtcCgiLiIsIG5hbWUpKSB7CgkJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCQlwcmludGYoIjogYmFkIGRpcmVjdG9yeTogJy4nIGlzbid0IGZpcnN0XG4iKTsKCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQl9IGVsc2UKCQkJcmV0dXJuOwoJfQoJaWYgKG9mZnNldCA9PSBkaXJzaXplKSB7CgkJaWYgKCFpbm9kZSB8fCBzdHJjbXAoIi4uIiwgbmFtZSkpIHsKCQkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJCXByaW50ZigiOiBiYWQgZGlyZWN0b3J5OiAnLi4nIGlzbid0IHNlY29uZFxuIik7CgkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJfSBlbHNlCgkJCXJldHVybjsKCX0KCWlmICghaW5vZGUpCgkJcmV0dXJuOwoJbmFtZV9kZXB0aCsrOwoJaWYgKGxpc3QpIHsKCQlpZiAodmVyYm9zZSkKCQkJcHJpbnRmKCIlNmQgJTA3byAlM2QgIiwgaW5vLCBpbm9kZS0+aV9tb2RlLCBpbm9kZS0+aV9ubGlua3MpOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCQlwcmludGYoIjpcbiIpOwoJCWVsc2UKCQkJcHJpbnRmKCJcbiIpOwoJfQoJY2hlY2tfem9uZXMyKGlubyk7CglpZiAoaW5vZGUgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQlyZWN1cnNpdmVfY2hlY2syKGlubyk7CgluYW1lX2RlcHRoLS07CglyZXR1cm47Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCByZWN1cnNpdmVfY2hlY2sodW5zaWduZWQgaW50IGlubykKewoJc3RydWN0IG1pbml4X2lub2RlICpkaXI7Cgl1bnNpZ25lZCBpbnQgb2Zmc2V0OwoKCWRpciA9IElub2RlICsgaW5vOwoJaWYgKCFTX0lTRElSKGRpci0+aV9tb2RlKSkKCQlkaWUoImludGVybmFsIGVycm9yIik7CglpZiAoZGlyLT5pX3NpemUgPCAyICogZGlyc2l6ZSkgewoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiOiBiYWQgZGlyZWN0b3J5OiBzaXplPDMyIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZGlyLT5pX3NpemU7IG9mZnNldCArPSBkaXJzaXplKQoJCWNoZWNrX2ZpbGUoZGlyLCBvZmZzZXQpOwp9CgojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgcmVjdXJzaXZlX2NoZWNrMih1bnNpZ25lZCBpbnQgaW5vKQp7CglzdHJ1Y3QgbWluaXgyX2lub2RlICpkaXI7Cgl1bnNpZ25lZCBpbnQgb2Zmc2V0OwoKCWRpciA9IElub2RlMiArIGlubzsKCWlmICghU19JU0RJUihkaXItPmlfbW9kZSkpCgkJZGllKCJpbnRlcm5hbCBlcnJvciIpOwoJaWYgKGRpci0+aV9zaXplIDwgMiAqIGRpcnNpemUpIHsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIjogYmFkIGRpcmVjdG9yeTogc2l6ZSA8IDMyIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZGlyLT5pX3NpemU7IG9mZnNldCArPSBkaXJzaXplKQoJCWNoZWNrX2ZpbGUyKGRpciwgb2Zmc2V0KTsKfQojZW5kaWYKCnN0YXRpYyBpbnQgYmFkX3pvbmUoaW50IGkpCnsKCWNoYXIgYnVmZmVyWzEwMjRdOwoKCWlmIChCTE9DS19TSVpFICogaSAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSAqIGksIFNFRUtfU0VUKSkKCQlkaWUoInNlZWsgZmFpbGVkIGluIGJhZF96b25lIik7CglyZXR1cm4gKEJMT0NLX1NJWkUgIT0gcmVhZChJTiwgYnVmZmVyLCBCTE9DS19TSVpFKSk7Cn0KCnN0YXRpYyB2b2lkIGNoZWNrX2NvdW50cyh2b2lkKQp7CglpbnQgaTsKCglmb3IgKGkgPSAxOyBpIDw9IElOT0RFUzsgaSsrKSB7CgkJaWYgKCFpbm9kZV9pbl91c2UoaSkgJiYgSW5vZGVbaV0uaV9tb2RlICYmIHdhcm5fbW9kZSkgewoJCQlwcmludGYoIklub2RlICVkIG1vZGUgbm90IGNsZWFyZWQuIiwgaSk7CgkJCWlmIChhc2soIkNsZWFyIiwgMSkpIHsKCQkJCUlub2RlW2ldLmlfbW9kZSA9IDA7CgkJCQljaGFuZ2VkID0gMTsKCQkJfQoJCX0KCQlpZiAoIWlub2RlX2NvdW50W2ldKSB7CgkJCWlmICghaW5vZGVfaW5fdXNlKGkpKQoJCQkJY29udGludWU7CgkJCXByaW50ZigiSW5vZGUgJWQgbm90IHVzZWQsIG1hcmtlZCB1c2VkIGluIHRoZSBiaXRtYXAuIiwgaSk7CgkJCWlmIChhc2soIkNsZWFyIiwgMSkpCgkJCQl1bm1hcmtfaW5vZGUoaSk7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoIWlub2RlX2luX3VzZShpKSkgewoJCQlwcmludGYoIklub2RlICVkIHVzZWQsIG1hcmtlZCB1bnVzZWQgaW4gdGhlIGJpdG1hcC4iLCBpKTsKCQkJaWYgKGFzaygiU2V0IiwgMSkpCgkJCQltYXJrX2lub2RlKGkpOwoJCX0KCQlpZiAoSW5vZGVbaV0uaV9ubGlua3MgIT0gaW5vZGVfY291bnRbaV0pIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCAobW9kZSA9ICUwN28pLCBpX25saW5rcz0lZCwgY291bnRlZD0lZC4iLAoJCQkJICAgaSwgSW5vZGVbaV0uaV9tb2RlLCBJbm9kZVtpXS5pX25saW5rcywgaW5vZGVfY291bnRbaV0pOwoJCQlpZiAoYXNrKCJTZXQgaV9ubGlua3MgdG8gY291bnQiLCAxKSkgewoJCQkJSW5vZGVbaV0uaV9ubGlua3MgPSBpbm9kZV9jb3VudFtpXTsKCQkJCWNoYW5nZWQgPSAxOwoJCQl9CgkJfQoJfQoJZm9yIChpID0gRklSU1RaT05FOyBpIDwgWk9ORVM7IGkrKykgewoJCWlmICh6b25lX2luX3VzZShpKSA9PSB6b25lX2NvdW50W2ldKQoJCQljb250aW51ZTsKCQlpZiAoIXpvbmVfY291bnRbaV0pIHsKCQkJaWYgKGJhZF96b25lKGkpKQoJCQkJY29udGludWU7CgkJCXByaW50ZigiWm9uZSAlZDogbWFya2VkIGluIHVzZSwgbm8gZmlsZSB1c2VzIGl0LiIsIGkpOwoJCQlpZiAoYXNrKCJVbm1hcmsiLCAxKSkKCQkJCXVubWFya196b25lKGkpOwoJCQljb250aW51ZTsKCQl9CgkJcHJpbnRmKCJab25lICVkOiAlc2luIHVzZSwgY291bnRlZD0lZFxuIiwKCQkJICAgaSwgem9uZV9pbl91c2UoaSkgPyAiIiA6ICJub3QgIiwgem9uZV9jb3VudFtpXSk7Cgl9Cn0KCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBjaGVja19jb3VudHMyKHZvaWQpCnsKCWludCBpOwoKCWZvciAoaSA9IDE7IGkgPD0gSU5PREVTOyBpKyspIHsKCQlpZiAoIWlub2RlX2luX3VzZShpKSAmJiBJbm9kZTJbaV0uaV9tb2RlICYmIHdhcm5fbW9kZSkgewoJCQlwcmludGYoIklub2RlICVkIG1vZGUgbm90IGNsZWFyZWQuIiwgaSk7CgkJCWlmIChhc2soIkNsZWFyIiwgMSkpIHsKCQkJCUlub2RlMltpXS5pX21vZGUgPSAwOwoJCQkJY2hhbmdlZCA9IDE7CgkJCX0KCQl9CgkJaWYgKCFpbm9kZV9jb3VudFtpXSkgewoJCQlpZiAoIWlub2RlX2luX3VzZShpKSkKCQkJCWNvbnRpbnVlOwoJCQlwcmludGYoIklub2RlICVkIG5vdCB1c2VkLCBtYXJrZWQgdXNlZCBpbiB0aGUgYml0bWFwLiIsIGkpOwoJCQlpZiAoYXNrKCJDbGVhciIsIDEpKQoJCQkJdW5tYXJrX2lub2RlKGkpOwoJCQljb250aW51ZTsKCQl9CgkJaWYgKCFpbm9kZV9pbl91c2UoaSkpIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCB1c2VkLCBtYXJrZWQgdW51c2VkIGluIHRoZSBiaXRtYXAuIiwgaSk7CgkJCWlmIChhc2soIlNldCIsIDEpKQoJCQkJbWFya19pbm9kZShpKTsKCQl9CgkJaWYgKElub2RlMltpXS5pX25saW5rcyAhPSBpbm9kZV9jb3VudFtpXSkgewoJCQlwcmludGYoIklub2RlICVkIChtb2RlID0gJTA3byksIGlfbmxpbmtzPSVkLCBjb3VudGVkPSVkLiIsCgkJCQkgICBpLCBJbm9kZTJbaV0uaV9tb2RlLCBJbm9kZTJbaV0uaV9ubGlua3MsCgkJCQkgICBpbm9kZV9jb3VudFtpXSk7CgkJCWlmIChhc2soIlNldCBpX25saW5rcyB0byBjb3VudCIsIDEpKSB7CgkJCQlJbm9kZTJbaV0uaV9ubGlua3MgPSBpbm9kZV9jb3VudFtpXTsKCQkJCWNoYW5nZWQgPSAxOwoJCQl9CgkJfQoJfQoJZm9yIChpID0gRklSU1RaT05FOyBpIDwgWk9ORVM7IGkrKykgewoJCWlmICh6b25lX2luX3VzZShpKSA9PSB6b25lX2NvdW50W2ldKQoJCQljb250aW51ZTsKCQlpZiAoIXpvbmVfY291bnRbaV0pIHsKCQkJaWYgKGJhZF96b25lKGkpKQoJCQkJY29udGludWU7CgkJCXByaW50ZigiWm9uZSAlZDogbWFya2VkIGluIHVzZSwgbm8gZmlsZSB1c2VzIGl0LiIsIGkpOwoJCQlpZiAoYXNrKCJVbm1hcmsiLCAxKSkKCQkJCXVubWFya196b25lKGkpOwoJCQljb250aW51ZTsKCQl9CgkJcHJpbnRmKCJab25lICVkOiAlc2luIHVzZSwgY291bnRlZD0lZFxuIiwKCQkJICAgaSwgem9uZV9pbl91c2UoaSkgPyAiIiA6ICJub3QgIiwgem9uZV9jb3VudFtpXSk7Cgl9Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBjaGVjayh2b2lkKQp7CgltZW1zZXQoaW5vZGVfY291bnQsIDAsIChJTk9ERVMgKyAxKSAqIHNpemVvZigqaW5vZGVfY291bnQpKTsKCW1lbXNldCh6b25lX2NvdW50LCAwLCBaT05FUyAqIHNpemVvZigqem9uZV9jb3VudCkpOwoJY2hlY2tfem9uZXMoUk9PVF9JTk8pOwoJcmVjdXJzaXZlX2NoZWNrKFJPT1RfSU5PKTsKCWNoZWNrX2NvdW50cygpOwp9CgojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgY2hlY2syKHZvaWQpCnsKCW1lbXNldChpbm9kZV9jb3VudCwgMCwgKElOT0RFUyArIDEpICogc2l6ZW9mKCppbm9kZV9jb3VudCkpOwoJbWVtc2V0KHpvbmVfY291bnQsIDAsIFpPTkVTICogc2l6ZW9mKCp6b25lX2NvdW50KSk7CgljaGVja196b25lczIoUk9PVF9JTk8pOwoJcmVjdXJzaXZlX2NoZWNrMihST09UX0lOTyk7CgljaGVja19jb3VudHMyKCk7Cn0KI2VuZGlmCgovKiBXZWQgRmViICA5IDE1OjE3OjA2IE1TVCAyMDAwICovCi8qIGR5bmFtaWNhbGx5IGFsbG9jYXRlIG5hbWVfbGlzdCAoaW5zdGVhZCBvZiBtYWtpbmcgaXQgc3RhdGljKSAqLwpzdGF0aWMgdm9pZCBhbGxvY19uYW1lX2xpc3Qodm9pZCkKewoJaW50IGk7CgoJbmFtZV9saXN0ID0geG1hbGxvYyhzaXplb2YoY2hhciAqKSAqIE1BWF9ERVBUSCk7Cglmb3IgKGkgPSAwOyBpIDwgTUFYX0RFUFRIOyBpKyspCgkJbmFtZV9saXN0W2ldID0geG1hbGxvYyhzaXplb2YoY2hhcikgKiBCVUZTSVogKyAxKTsKfQoKI2lmZGVmIEJCX0ZFQVRVUkVfQ0xFQU5fVVAKLyogZXhlY3V0ZSB0aGlzIGF0ZXhpdCgpIHRvIGRlYWxsb2NhdGUgbmFtZV9saXN0W10gKi8KLyogcGlwdGlnZ2VyIHdhcyBoZXJlICovCnN0YXRpYyB2b2lkIGZyZWVfbmFtZV9saXN0KHZvaWQpCnsKCWludCBpOwoKCWlmIChuYW1lX2xpc3QpIHsgCgkJZm9yIChpID0gMDsgaSA8IE1BWF9ERVBUSDsgaSsrKSB7CgkJCWlmIChuYW1lX2xpc3RbaV0pIHsKCQkJCWZyZWUobmFtZV9saXN0W2ldKTsKCQkJfQoJCX0KCQlmcmVlKG5hbWVfbGlzdCk7Cgl9Cn0KI2VuZGlmCgpleHRlcm4gaW50IGZzY2tfbWluaXhfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKCXN0cnVjdCB0ZXJtaW9zIHRtcDsKCWludCBjb3VudDsKCWludCByZXRjb2RlID0gMDsKCglhbGxvY19uYW1lX2xpc3QoKTsKI2lmZGVmIEJCX0ZFQVRVUkVfQ0xFQU5fVVAKCS8qIERvbid0IGJvdGhlciB0byBmcmVlIG1lbW9yeS4gIEV4aXQgZG9lcwoJICogdGhhdCBhdXRvbWFnaWNhbGx5LCBzbyB3ZSBjYW4gc2F2ZSBhIGZldyBieXRlcyAqLwoJYXRleGl0KGZyZWVfbmFtZV9saXN0KTsKI2VuZGlmCgoJaWYgKElOT0RFX1NJWkUgKiBNSU5JWF9JTk9ERVNfUEVSX0JMT0NLICE9IEJMT0NLX1NJWkUpCgkJZGllKCJiYWQgaW5vZGUgc2l6ZSIpOwojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKCWlmIChJTk9ERV9TSVpFMiAqIE1JTklYMl9JTk9ERVNfUEVSX0JMT0NLICE9IEJMT0NLX1NJWkUpCgkJZGllKCJiYWQgdjIgaW5vZGUgc2l6ZSIpOwojZW5kaWYKCXdoaWxlIChhcmdjLS0gPiAxKSB7CgkJYXJndisrOwoJCWlmIChhcmd2WzBdWzBdICE9ICctJykgewoJCQlpZiAoZGV2aWNlX25hbWUpCgkJCQlzaG93X3VzYWdlKCk7CgkJCWVsc2UKCQkJCWRldmljZV9uYW1lID0gYXJndlswXTsKCQl9IGVsc2UKCQkJd2hpbGUgKCorK2FyZ3ZbMF0pCgkJCQlzd2l0Y2ggKGFyZ3ZbMF1bMF0pIHsKCQkJCWNhc2UgJ2wnOgoJCQkJCWxpc3QgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnYSc6CgkJCQkJYXV0b21hdGljID0gMTsKCQkJCQlyZXBhaXIgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAncic6CgkJCQkJYXV0b21hdGljID0gMDsKCQkJCQlyZXBhaXIgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAndic6CgkJCQkJdmVyYm9zZSA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdzJzoKCQkJCQlzaG93ID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ20nOgoJCQkJCXdhcm5fbW9kZSA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdmJzoKCQkJCQlmb3JjZSA9IDE7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCXNob3dfdXNhZ2UoKTsKCQkJCX0KCX0KCWlmICghZGV2aWNlX25hbWUpCgkJc2hvd191c2FnZSgpOwoJY2hlY2tfbW91bnQoKTsJCQkJLyogdHJ5aW5nIHRvIGNoZWNrIGEgbW91bnRlZCBmaWxlc3lzdGVtPyAqLwoJaWYgKHJlcGFpciAmJiAhYXV0b21hdGljKSB7CgkJaWYgKCFpc2F0dHkoMCkgfHwgIWlzYXR0eSgxKSkKCQkJZGllKCJuZWVkIHRlcm1pbmFsIGZvciBpbnRlcmFjdGl2ZSByZXBhaXJzIik7Cgl9CglJTiA9IG9wZW4oZGV2aWNlX25hbWUsIHJlcGFpciA/IE9fUkRXUiA6IE9fUkRPTkxZKTsKCWlmIChJTiA8IDApCgkJZGllKCJ1bmFibGUgdG8gb3BlbiAnJXMnIik7Cglmb3IgKGNvdW50ID0gMDsgY291bnQgPCAzOyBjb3VudCsrKQoJCXN5bmMoKTsKCXJlYWRfc3VwZXJibG9jaygpOwoKCS8qCgkgKiBEZXRlcm1pbmUgd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIGNvbnRpbnVlIHdpdGggdGhlIGNoZWNraW5nLgoJICogVGhpcyBpcyBiYXNlZCBvbiB0aGUgc3RhdHVzIG9mIHRoZSBmaWxlc3lzdGVtIHZhbGlkIGFuZCBlcnJvcgoJICogZmxhZ3MgYW5kIHdoZXRoZXIgb3Igbm90IHRoZSAtZiBzd2l0Y2ggd2FzIHNwZWNpZmllZCBvbiB0aGUgCgkgKiBjb21tYW5kIGxpbmUuCgkgKi8KCXByaW50ZigiJXMsICVzXG4iLCBhcHBsZXRfbmFtZSwgcHJvZ3JhbV92ZXJzaW9uKTsKCWlmICghKFN1cGVyLnNfc3RhdGUgJiBNSU5JWF9FUlJPUl9GUykgJiYKCQkoU3VwZXIuc19zdGF0ZSAmIE1JTklYX1ZBTElEX0ZTKSAmJiAhZm9yY2UpIHsKCQlpZiAocmVwYWlyKQoJCQlwcmludGYoIiVzIGlzIGNsZWFuLCBubyBjaGVjay5cbiIsIGRldmljZV9uYW1lKTsKCQlyZXR1cm4gcmV0Y29kZTsKCX0gZWxzZSBpZiAoZm9yY2UpCgkJcHJpbnRmKCJGb3JjaW5nIGZpbGVzeXN0ZW0gY2hlY2sgb24gJXMuXG4iLCBkZXZpY2VfbmFtZSk7CgllbHNlIGlmIChyZXBhaXIpCgkJcHJpbnRmKCJGaWxlc3lzdGVtIG9uICVzIGlzIGRpcnR5LCBuZWVkcyBjaGVja2luZy5cbiIsCgkJCSAgIGRldmljZV9uYW1lKTsKCglyZWFkX3RhYmxlcygpOwoKCWlmIChyZXBhaXIgJiYgIWF1dG9tYXRpYykgewoJCXRjZ2V0YXR0cigwLCAmdGVybWlvcyk7CgkJdG1wID0gdGVybWlvczsKCQl0bXAuY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8pOwoJCXRjc2V0YXR0cigwLCBUQ1NBTk9XLCAmdG1wKTsKCQl0ZXJtaW9zX3NldCA9IDE7Cgl9CiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgoJaWYgKHZlcnNpb24yKSB7CgkJY2hlY2tfcm9vdDIoKTsKCQljaGVjazIoKTsKCX0gZWxzZQojZW5kaWYKCXsKCQljaGVja19yb290KCk7CgkJY2hlY2soKTsKCX0KCWlmICh2ZXJib3NlKSB7CgkJaW50IGksIGZyZWU7CgoJCWZvciAoaSA9IDEsIGZyZWUgPSAwOyBpIDw9IElOT0RFUzsgaSsrKQoJCQlpZiAoIWlub2RlX2luX3VzZShpKSkKCQkJCWZyZWUrKzsKCQlwcmludGYoIlxuJTZsZCBpbm9kZXMgdXNlZCAoJWxkJSUpXG4iLCAoSU5PREVTIC0gZnJlZSksCgkJCSAgIDEwMCAqIChJTk9ERVMgLSBmcmVlKSAvIElOT0RFUyk7CgkJZm9yIChpID0gRklSU1RaT05FLCBmcmVlID0gMDsgaSA8IFpPTkVTOyBpKyspCgkJCWlmICghem9uZV9pbl91c2UoaSkpCgkJCQlmcmVlKys7CgkJcHJpbnRmKCIlNmxkIHpvbmVzIHVzZWQgKCVsZCUlKVxuIiwgKFpPTkVTIC0gZnJlZSksCgkJCSAgIDEwMCAqIChaT05FUyAtIGZyZWUpIC8gWk9ORVMpOwoJCXByaW50ZigiXG4lNmQgcmVndWxhciBmaWxlc1xuIgoJCQkgICAiJTZkIGRpcmVjdG9yaWVzXG4iCgkJCSAgICIlNmQgY2hhcmFjdGVyIGRldmljZSBmaWxlc1xuIgoJCQkgICAiJTZkIGJsb2NrIGRldmljZSBmaWxlc1xuIgoJCQkgICAiJTZkIGxpbmtzXG4iCgkJCSAgICIlNmQgc3ltYm9saWMgbGlua3NcbiIKCQkJICAgIi0tLS0tLVxuIgoJCQkgICAiJTZkIGZpbGVzXG4iLAoJCQkgICByZWd1bGFyLCBkaXJlY3RvcnksIGNoYXJkZXYsIGJsb2NrZGV2LAoJCQkgICBsaW5rcyAtIDIgKiBkaXJlY3RvcnkgKyAxLCBzeW1saW5rcywKCQkJICAgdG90YWwgLSAyICogZGlyZWN0b3J5ICsgMSk7Cgl9CglpZiAoY2hhbmdlZCkgewoJCXdyaXRlX3RhYmxlcygpOwoJCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgoJCQkgICAiRklMRSBTWVNURU0gSEFTIEJFRU4gQ0hBTkdFRFxuIgoJCQkgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CgkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzsgY291bnQrKykKCQkJc3luYygpOwoJfSBlbHNlIGlmIChyZXBhaXIpCgkJd3JpdGVfc3VwZXJfYmxvY2soKTsKCglpZiAocmVwYWlyICYmICFhdXRvbWF0aWMpCgkJdGNzZXRhdHRyKDAsIFRDU0FOT1csICZ0ZXJtaW9zKTsKCglpZiAoY2hhbmdlZCkKCQlyZXRjb2RlICs9IDM7CglpZiAoZXJyb3JzX3VuY29ycmVjdGVkKQoJCXJldGNvZGUgKz0gNDsKCXJldHVybiByZXRjb2RlOwp9Cg==